Browse Source

優化頁面

jeter20131220 3 years ago
parent
commit
78ea090d41
91 changed files with 7940 additions and 444 deletions
  1. 124 99
      goto.js
  2. BIN
      img/BANNER1.webp
  3. BIN
      img/banner2.jpg
  4. BIN
      img/mobile-banner1.jpg
  5. BIN
      img/sec03/22webp.webp
  6. BIN
      img/sec03/33webp.webp
  7. BIN
      img/sec03/44webp.webp
  8. BIN
      img/sec03/55webp.webp
  9. BIN
      img/sec03/sec03top1.gif
  10. BIN
      img/sec03/sec04-top-11.jpg
  11. BIN
      img/sec03/sec04-top-12webp.webp
  12. BIN
      img/sec03/sec04-top-13webp.webp
  13. BIN
      img/sec03/sec04-top-14webp.webp
  14. 213 94
      index.html
  15. 12 0
      node_modules/.package-lock.json
  16. 24 0
      node_modules/jquery-touchswipe/LICENSE
  17. 81 0
      node_modules/jquery-touchswipe/README.md
  18. 8 0
      node_modules/jquery-touchswipe/bower.json
  19. 49 0
      node_modules/jquery-touchswipe/demos/Any_finger_swipe.html
  20. 48 0
      node_modules/jquery-touchswipe/demos/Basic_swipe.html
  21. 95 0
      node_modules/jquery-touchswipe/demos/Enable_and_destroy.html
  22. 82 0
      node_modules/jquery-touchswipe/demos/Excluded_children.html
  23. 61 0
      node_modules/jquery-touchswipe/demos/Finger_swipe.html
  24. 128 0
      node_modules/jquery-touchswipe/demos/Handlers_and_events.html
  25. 61 0
      node_modules/jquery-touchswipe/demos/Hold.html
  26. 148 0
      node_modules/jquery-touchswipe/demos/Image_gallery_example.html
  27. 90 0
      node_modules/jquery-touchswipe/demos/Options.html
  28. 109 0
      node_modules/jquery-touchswipe/demos/Page_scrolling.html
  29. 50 0
      node_modules/jquery-touchswipe/demos/Page_zoom.html
  30. 57 0
      node_modules/jquery-touchswipe/demos/Pinch.html
  31. 81 0
      node_modules/jquery-touchswipe/demos/Pinch_and_Swipe.html
  32. 51 0
      node_modules/jquery-touchswipe/demos/Pinch_status.html
  33. 51 0
      node_modules/jquery-touchswipe/demos/Single_swipe.html
  34. 57 0
      node_modules/jquery-touchswipe/demos/Stop_propegation.html
  35. 82 0
      node_modules/jquery-touchswipe/demos/Swipe_status.html
  36. 114 0
      node_modules/jquery-touchswipe/demos/Tap_vs_swipe.html
  37. 109 0
      node_modules/jquery-touchswipe/demos/Thresholds.html
  38. 158 0
      node_modules/jquery-touchswipe/demos/Trigger_handlers.html
  39. 110 0
      node_modules/jquery-touchswipe/demos/css/main.css
  40. 74 0
      node_modules/jquery-touchswipe/demos/index.html
  41. 223 0
      node_modules/jquery-touchswipe/demos/js/jquery.ui.ipad.js
  42. 240 0
      node_modules/jquery-touchswipe/demos/js/main.js
  43. 22 0
      node_modules/jquery-touchswipe/demos/tutorials.json
  44. 25 0
      node_modules/jquery-touchswipe/docs/$.fn.html
  45. 25 0
      node_modules/jquery-touchswipe/docs/$.fn.swipe.defaults.html
  46. 25 0
      node_modules/jquery-touchswipe/docs/$.fn.swipe.directions.html
  47. 25 0
      node_modules/jquery-touchswipe/docs/$.fn.swipe.fingers.html
  48. 25 0
      node_modules/jquery-touchswipe/docs/$.fn.swipe.html
  49. 25 0
      node_modules/jquery-touchswipe/docs/$.fn.swipe.pageScroll.html
  50. 25 0
      node_modules/jquery-touchswipe/docs/$.fn.swipe.phases.html
  51. 25 0
      node_modules/jquery-touchswipe/docs/$.html
  52. 110 0
      node_modules/jquery-touchswipe/docs/css/main.css
  53. 25 0
      node_modules/jquery-touchswipe/docs/index.html
  54. 25 0
      node_modules/jquery-touchswipe/docs/jquery.touchSwipe.js.html
  55. 223 0
      node_modules/jquery-touchswipe/docs/js/jquery.ui.ipad.js
  56. 85 0
      node_modules/jquery-touchswipe/docs/js/main.js
  57. 25 0
      node_modules/jquery-touchswipe/docs/scripts/linenumber.js
  58. 202 0
      node_modules/jquery-touchswipe/docs/scripts/prettify/Apache-License-2.0.txt
  59. 2 0
      node_modules/jquery-touchswipe/docs/scripts/prettify/lang-css.js
  60. 28 0
      node_modules/jquery-touchswipe/docs/scripts/prettify/prettify.js
  61. 625 0
      node_modules/jquery-touchswipe/docs/styles/jsdoc.css
  62. 79 0
      node_modules/jquery-touchswipe/docs/styles/prettify.css
  63. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Any_finger_swipe.html
  64. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Basic_swipe.html
  65. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Enable_and_destroy.html
  66. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Excluded_children.html
  67. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Finger_swipe.html
  68. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Handlers_and_events.html
  69. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Hold.html
  70. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Image_gallery_example.html
  71. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Options.html
  72. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Page_scrolling.html
  73. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Page_zoom.html
  74. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Pinch.html
  75. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Pinch_and_Swipe.html
  76. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Pinch_status.html
  77. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Single_swipe.html
  78. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Stop_propegation.html
  79. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Swipe_status.html
  80. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Tap_vs_swipe.html
  81. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Thresholds.html
  82. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-Trigger_handlers.html
  83. 25 0
      node_modules/jquery-touchswipe/docs/tutorial-index_.html
  84. 2112 0
      node_modules/jquery-touchswipe/jquery.touchSwipe.js
  85. 13 0
      node_modules/jquery-touchswipe/jquery.touchSwipe.min.js
  86. 47 0
      node_modules/jquery-touchswipe/package.json
  87. 24 0
      package-lock.json
  88. 5 0
      package.json
  89. 323 70
      style.css
  90. 0 0
      style.css.map
  91. 450 181
      style.scss

+ 124 - 99
goto.js

@@ -1,36 +1,39 @@
 // sec03排名table輪播
 $('#sec03-slider').slick({
-    arrows: false,
-    slidesToShow: 1,
-    slidesToScroll: 1,
-    infinite:true,
+  arrows: false,
+  slidesToShow: 1,
+  slidesToScroll: 1,
+  infinite: true,
 });
 
-$('#sec03-slider-next').click(function(){
-$('#sec03-slider').slick('slickNext')
+$('#sec03-slider-next').click(function () {
+  $('#sec03-slider').slick('slickNext')
 });
 
 // sec05 熱門作品 手機輪播
 $('#sec05-moblie-slider').slick({
-    arrows: false,
-    slidesToShow: 1,
-    slidesToScroll: 1,
-    infinite:true,
-   
+  arrows: false,
+  slidesToShow: 1,
+  slidesToScroll: 1,
+  infinite: true,
+ 
 
 });
-$('#sec05-slider-next').click(function(){
+
+
+$('#sec05-slider-next').click(function () {
   $('#sec05-moblie-slider').slick('slickNext')
-  });
+});
+
+
 
- 
 
 // sec05桌機輪播
 $('#sec05-destop-slider').slick({
-    arrows: true,
-    slidesToShow: 3,
-    slidesToScroll: 3,
-    infinite:true,
+  arrows: true,
+  slidesToShow: 3,
+  slidesToScroll: 3,
+  infinite: true,
 
 });
 // sec06桌機輪波
@@ -41,41 +44,41 @@ $('#sec05-destop-slider').slick({
 //     infinite:true,
 // });
 
-$(function(){
-    $('#sec06-container').slick({
-        arrows: false,
-        slidesToShow: 4,
-        slidesToScroll: 3,
-        infinite:true,
-         responsive: [
-           {
-               breakpoint: 600, // RWD在1024寬度時切換顯示數量
-               settings: {
-                   slidesToShow: 1, //一次顯示3個
-                   slidesToScroll: 1,//切換下一頁時移動3個
-              }
-          },{
-               breakpoint: 600,// RWD在600寬度時切換顯示數量
-               settings: {
-                   slidesToShow: 1,//一次顯示2個
-                   slidesToScroll: 1,//切換下一頁時移動2個
-              }
-          },
-         ]
-    });
- })
+$(function () {
+  $('#sec06-container').slick({
+    arrows: false,
+    slidesToShow: 4,
+    slidesToScroll: 3,
+    infinite: true,
+    responsive: [
+      {
+        breakpoint: 600, // RWD在1024寬度時切換顯示數量
+        settings: {
+          slidesToShow: 1, //一次顯示3個
+          slidesToScroll: 1,//切換下一頁時移動3個
+        }
+      }, {
+        breakpoint: 600,// RWD在600寬度時切換顯示數量
+        settings: {
+          slidesToShow: 1,//一次顯示2個
+          slidesToScroll: 1,//切換下一頁時移動2個
+        }
+      },
+    ]
+  });
+})
 
 // sec04  洞察報告 手機輪播 
 $('#sec04-moblie-container').slick({
-    arrows: false,
-    slidesToShow: 1,
-    slidesToScroll: 1,
-    infinite:false,
-    // centerMode: true,
+  arrows: false,
+  slidesToShow: 1,
+  slidesToScroll: 1,
+  infinite: false,
+  // centerMode: true,
 });
-$('#sec04-slider-next').click(function(){
+$('#sec04-slider-next').click(function () {
   $('#sec04-moblie-container').slick('slickNext')
-  });
+});
 
 // 手機板menu彈跳視窗
 $("#menu-box2").hide();
@@ -89,57 +92,57 @@ $(".link").click(function () {
 });
 
 $("#menu-btn1").click(function () {
-    $("#menu-box").fadeIn();
-    $("#menu-box2").fadeIn();
-  
-  });
-  
-  $(".close").click(function () {
-    $("#menu-box").fadeOut();
-    $("#menu-box2").fadeOut();
-  
-  });
+  $("#menu-box").fadeIn();
+  $("#menu-box2").fadeIn();
+
+});
+
+$(".close").click(function () {
+  $("#menu-box").fadeOut();
+  $("#menu-box2").fadeOut();
+
+});
 
 $("*").each(function (index, element) {
-    // 此元素被點選後執行
-    $(this).click(function (e) {
-      // 取得被點選元素的屬性:data-gt-target
-      var target = $(this).attr("data-gt-target");
-      var duration = $(this).attr("data-gt-duration");
-      var offset = $(this).attr("data-gt-offset");
-  
-      // JS 語法:判斷式
-      // if (條件) {程式區塊}
-      // 當條件成立,會執行程式區塊
-  
-      // 如果 目標有資料 才會執行 { } 內的程式
-      // 避免出現 undefine (未定義 - 不存在的資料)
-      if (target) {
-        //console.log("目標:" + target);
-        //console.log("時間:" + duration);
-        //console.log("位移:" + offset);
-  
-        // 上方位置 = 目標區塊.位移().上方位置
-        var top = $(target).offset().top;
-        //console.log("要前往元素的上方位置:" + top);
-  
-        // 網頁元素.停止().動畫({ 上方捲動:指定元素 - 位移},持續時間)
-        // parseInt() 將文字轉為數字
-  
-        $("html").stop().animate({
-          scrollTop: top - offset
-        }, parseInt(duration));
-      }
-    });
-  });
-  
-  // 避免動畫與使用者滾輪衝突
-  // html 在滾動滾輪時 停止 html 所有效果
-  $("html").on("mousewheel", function () {
-    $("html").stop();
+  // 此元素被點選後執行
+  $(this).click(function (e) {
+    // 取得被點選元素的屬性:data-gt-target
+    var target = $(this).attr("data-gt-target");
+    var duration = $(this).attr("data-gt-duration");
+    var offset = $(this).attr("data-gt-offset");
+
+    // JS 語法:判斷式
+    // if (條件) {程式區塊}
+    // 當條件成立,會執行程式區塊
+
+    // 如果 目標有資料 才會執行 { } 內的程式
+    // 避免出現 undefine (未定義 - 不存在的資料)
+    if (target) {
+      //console.log("目標:" + target);
+      //console.log("時間:" + duration);
+      //console.log("位移:" + offset);
+
+      // 上方位置 = 目標區塊.位移().上方位置
+      var top = $(target).offset().top;
+      //console.log("要前往元素的上方位置:" + top);
+
+      // 網頁元素.停止().動畫({ 上方捲動:指定元素 - 位移},持續時間)
+      // parseInt() 將文字轉為數字
+
+      $("html").stop().animate({
+        scrollTop: top - offset
+      }, parseInt(duration));
+    }
   });
+});
 
-  $(".sec03-table-title").addClass("contant-toggle");
+// 避免動畫與使用者滾輪衝突
+// html 在滾動滾輪時 停止 html 所有效果
+$("html").on("mousewheel", function () {
+  $("html").stop();
+});
+
+$(".sec03-table-title").addClass("contant-toggle");
 
 $("#sec03-slider").on('beforeChange', function (event, slick, currentSlide, nextSlide) {
   console.log('beforeChangeEvent: currenSlide=' + currentSlide + ', nextSlide= ' + nextSlide);
@@ -148,7 +151,7 @@ $("#sec03-slider").on('beforeChange', function (event, slick, currentSlide, next
     $(".sec03-table-title2").addClass("contant-toggle");
   }
 
-   else if (nextSlide == 0) {
+  else if (nextSlide == 0) {
     $(".sec03-table-title2").removeClass("contant-toggle");
     $(".sec03-table-title").addClass("contant-toggle");
   }
@@ -189,7 +192,7 @@ $(".contact-form-destop").submit(function (e) {
 
       success: function (data) {
         console.log('送出成功: ' + data);
-        alert("送出成功");
+        alert("訂閱成功");
         // if (data == 0) {
         //   alert("送出成功");
         // } else if (data == 1) {
@@ -251,7 +254,7 @@ $(".contact-form-mobile").submit(function (e) {
 
       success: function (data) {
         console.log('送出成功: ' + data);
-        alert("送出成功");
+        alert("訂閱成功");
         // if (data == 0) {
         //   alert("送出成功");
         // } else if (data == 1) {
@@ -276,4 +279,26 @@ $(".contact-form-mobile").submit(function (e) {
       }
     });
   return false;
-});
+});
+$(function() {
+
+$("#sec05-moblie").swipe( { fingers:'all', swipeLeft:swipe1, swipeRight:swipe2} );
+function swipe1(event, direction, distance, duration, fingerCount) {
+  $('#sec05-moblie-slider').slick('slickNext')//向左滑動你要執行的動作 
+}
+function swipe2(event, direction, distance, duration, fingerCount) {
+  $('#sec05-moblie-slider').slick('slickPrev') //向右滑動你要執行的動作
+}
+});
+
+$(function() {
+
+  $(".sec05-button").swipe( { fingers:'all', swipeLeft:swipe1, swipeRight:swipe2} );
+  function swipe1(event, direction, distance, duration, fingerCount) {
+    $('#sec05-moblie-slider').slick('slickNext')//向左滑動你要執行的動作 
+  }
+  function swipe2(event, direction, distance, duration, fingerCount) {
+    $('#sec05-moblie-slider').slick('slickPrev') //向右滑動你要執行的動作
+  }
+  });
+

BIN
img/BANNER1.webp


BIN
img/banner2.jpg


BIN
img/mobile-banner1.jpg


BIN
img/sec03/22webp.webp


BIN
img/sec03/33webp.webp


BIN
img/sec03/44webp.webp


BIN
img/sec03/55webp.webp


BIN
img/sec03/sec03top1.gif


BIN
img/sec03/sec04-top-11.jpg


BIN
img/sec03/sec04-top-12webp.webp


BIN
img/sec03/sec04-top-13webp.webp


BIN
img/sec03/sec04-top-14webp.webp


+ 213 - 94
index.html

@@ -20,8 +20,8 @@
 <body id="top">
 
     <!-- 主選單 -->
-    <section id="Navigation" class="container-fluid">
-        <div id="nav" class="row">
+    <section id="Navigation" class="container-fluid" style="padding:0;margin:0">
+        <div id="nav" class="row" style="padding:0;margin:0">
             <div id="logo" class=" col-md-2 col-lg-2">
                 <a href=""> <img src="./img/LOGO.png" alt=""></a>
             </div>
@@ -67,19 +67,17 @@
         <div id="banner-container">
             <div class="youtube ">
                 <div class="row">
-                    <div id="youtube-text" class="col-12 order-2 col-lg-4 order-lg-1 ">
-                        <h1 style="text-align: left;">依照選舉結果變化的數位收藏品(NFT)?</h1>
+                    <div id="youtube-text" class="col-12 order-2 col-lg-5 order-lg-1 ">
+                        <h1 class="youtube-text-title1">依照選舉結果變化的</h1>
+                        <h1 class="youtube-text-title2">數位收藏品(NFT)?</h1>
                         <hr>
-                        <p>去年10月美國邁阿密藝術收藏家羅德里格斯福瑞爾(Pablo Rodriguez-Fraile)以近 6 萬 7000 美元(約新台幣 187萬元)代價,買下數位藝術家 Beeple
-                            的一件影片作品。</p>
+                        <p>去年10月美國邁阿密藝術收藏家羅德里格斯福瑞爾(Pablo Rodriguez-Fraile)以近 6,7000 USD(約新台幣 187萬元)代價,買下數位藝術家
+                            Beeple的一件影片作品。</p>
+                        <div class="youtube-text-hr" style="border-top:1px dashed #cccccc;height: 1px;overflow:hidden">
+                        </div>
                         <p>兩幅畫正在美國總統拜登與川普在選舉前進行拍賣,川普的選舉結果決定了畫家這幅畫的最終呈現。</p>
-                        <a target="https://www.abmedia.io/dynamic-nft-to-change-via-election-result
-                      https://twitter.com/i/status/1322273227977203713
-                      " href="https://www.abmedia.io/dynamic-nft-to-change-via-election-result
-                      https://twitter.com/i/status/1322273227977203713
-                      "><button class="learn-more">LearnMore</button> </a>
                     </div>
-                    <div class="col-12  order-1 col-lg-8 order-lg-2 ">
+                    <div class="col-12  order-1 col-lg-7 order-lg-2 ">
                         <style>
                             .embed-container {
                                 position: relative;
@@ -106,20 +104,24 @@
 
             </div>
 
-            <h1>歡迎訂閱掌握最新活動資訊</h1>
+
             <!-- 電腦版按鈕 -->
             <form class="contact-form-destop">
+                <h1>歡迎訂閱掌握最新活動資訊</h1>
                 <input type="email" name="email" id="email" placeholder="請在此輸入email"><input class="btn" type="submit"
                     value="立即訂閱">
             </form>
             <!-- 手機板按鈕 -->
             <form class="contact-form-mobile">
+                <div class="youtube-text-hr" style="border-top:1px dashed #cccccc;height: 1px;overflow:hidden"></div>
+                <h1>歡迎訂閱掌握最新活動資訊</h1>
                 <div style="text-align: center;">
                     <input type="email" name="email" id="email-moblie" placeholder="請在此輸入email"><input id="email-arrow"
                         type="submit" value="">
                 </div>
 
             </form>
+
         </div>
     </section>
 
@@ -307,13 +309,19 @@
                             <tr>
                                 <th scope="row">1</th>
                                 <td>
-                                    <img src="./img/sec03/top1webp.webp" alt="">
+                                    <a href="https://www.instagram.com/p/CO0otBGjnFm/"><img
+                                            src="./img/sec03/sec03top1.gif" alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:Simon Denny</h1>
+                                            <a href="https://www.instagram.com/iammaskarade/">
+                                                <h1><span style="font-weight: 900;">作者:</span>iammaskarade</h1>
+                                            </a>
                                         </div>
                                         <div>
-                                            <p>作品名稱:Backdated NFT/Ethereum Stamp</p>
+                                            <a href="https://www.instagram.com/p/CO0otBGjnFm/">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>Backdated NFT/Ethereum
+                                                    Stamp</p>
+                                            </a>
                                         </div>
                                     </div>
                                 </td>
@@ -322,13 +330,21 @@
                             <tr>
                                 <th scope="row">2</th>
                                 <td>
-                                    <img src="./img/sec03/top2webp.webp" alt="">
+                                    <a
+                                        href="https://opensea.io/assets/0xd92e44ac213b9ebda0178e1523cc0ce177b7fa96/100010115"><img
+                                            src="./img/sec03/top2webp.webp" alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:beeple</h1>
+                                            <a href="https://opensea.io/beeple">
+                                                <h1><span style="font-weight: 900;">作者:</span>beeple</h1>
+                                            </a>
                                         </div>
                                         <div>
-                                            <p>作品名稱:BULL RUN #115/271</p>
+                                            <a
+                                                href="https://opensea.io/assets/0xd92e44ac213b9ebda0178e1523cc0ce177b7fa96/100010115">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>The Eternal Cloudsitter
+                                                </p>BULL RUN #115/271</p>
+                                            </a>
                                         </div>
                                     </div>
                                 </td>
@@ -337,29 +353,42 @@
                             <tr>
                                 <th scope="row">3</th>
                                 <td>
-                                    <img src="./img/sec03/top3webp.webp" alt="">
+                                    <img src="./img/sec03/top4webp.webp" alt="">
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:楊夏蕙</h1>
+                                            <a href="https://opensea.io/SasGlas">
+                                                <h1><span style="font-weight: 900;">作者:</span>SasGlas</h1>
+                                            </a>
                                         </div>
                                         <div>
-                                            <p>作品名稱:The Eternal Cloudsitter</p>
+                                            <a href="">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>The Eternal Cloudsitter
+                                                </p>
+                                            </a>
                                         </div>
                                     </div>
                                 </td>
 
-
                             </tr>
+
                             <tr>
                                 <th scope="row">4</th>
                                 <td>
-                                    <img src="./img/sec03/top4webp.webp" alt="">
+                                    <img src="./img/sec03/top5webp.webp" alt="">
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:SasGlas</h1>
+                                            <a href="https://opensea.io/nifty-gateway-omnibus">
+                                                <h1><span style="font-weight: 900;">作者:</span>nifty-gateway-omnibus</h1>
+                                            </a>
+
                                         </div>
                                         <div>
-                                            <p>作品名稱:The Eternal Cloudsitter</p>
+                                            <a
+                                                href="https://opensea.io/assets/0xce5e90533d9dbc30eac8a3610a681fc7aaa23193/43100040225">
+                                                <p> <span style="font-weight: 900;">作品名稱:</span>Seven Nation Army Remix
+                                                </p>
+                                            </a>
+                                            <p> 004 #225/333(MUSIC)</p>
                                         </div>
                                     </div>
                                 </td>
@@ -368,17 +397,20 @@
                             <tr>
                                 <th scope="row">5</th>
                                 <td>
-                                    <img src="./img/sec03/top5webp.webp" alt="">
+                                    <img src="./img/sec03/top3webp.webp" alt="">
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:nifty-gateway-omnibus</h1>
+                                            <h1><span style="font-weight: 900;">作者:</span>楊夏蕙</h1>
                                         </div>
                                         <div>
-                                            <p>作品名稱:Seven Nation Army Remix 004 #225/333</p>
+                                            <a href="https://www.youtube.com/watch?v=uZtX_3TRdiE">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>1970Marlboro</p>
+                                            </a>
                                         </div>
                                     </div>
                                 </td>
 
+
                             </tr>
                         </tbody>
                     </table>
@@ -387,13 +419,16 @@
 
                     <table class="table ">
                         <tbody>
+
                             <tr>
                                 <th scope="row">1</th>
                                 <td>
-                                    <img src="./img/sec03/11webp.webp" alt="">
+                                    <a href="https://twitter.com/beeple"><img src="./img/sec03/sec04-top-11.jpg"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>pplpleasr</h1>
+                                            <a href="https://twitter.com/beeple"></a>
+                                            <h1>beeple</h1>
                                         </div>
                                         <div>
 
@@ -405,10 +440,13 @@
                             <tr>
                                 <th scope="row">2</th>
                                 <td>
-                                    <img src="./img/sec03/22webp.webp" alt="">
+                                    <a href="https://twitter.com/A_Giant_Swan/photo"> <img
+                                            src="./img/sec03/sec04-top-12webp.webp" alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>Gabe Weis</h1>
+                                            <a href="https://twitter.com/A_Giant_Swan/photo">
+                                                <h1>GIANT SWAN</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -416,14 +454,18 @@
                                     </div>
                                 </td>
 
+
                             </tr>
                             <tr>
                                 <th scope="row">3</th>
                                 <td>
-                                    <img src="./img/sec03/33webp.webp" alt="">
+                                    <a href="https://www.thehashmasks.com/"><img src="./img/sec03/sec04-top-13webp.webp"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>馬修 </h1>
+                                            <a href="https://www.thehashmasks.com/">
+                                                <h1>HASHMASKS</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -431,15 +473,17 @@
                                     </div>
                                 </td>
 
-
                             </tr>
                             <tr>
                                 <th scope="row">4</th>
                                 <td>
-                                    <img src="./img/sec03/44webp.webp" alt="">
+                                    <a href="https://twitter.com/fewocious"><img src="./img/sec03/sec04-top-14webp.webp"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>麥羨雲</h1>
+                                            <a href="https://twitter.com/fewocious">
+                                                <h1>FEWoCIOUS</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -451,10 +495,13 @@
                             <tr>
                                 <th scope="row">5</th>
                                 <td>
-                                    <img src="./img/sec03/55webp.webp" alt="">
+                                    <a href="https://twitter.com/pplpleasr1?lang=fr"> <img src="./img/sec03/11webp.webp"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>林淵源</h1>
+                                            <a href="https://twitter.com/pplpleasr1?lang=fr">
+                                                <h1>pplpleasr</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -483,21 +530,27 @@
             <img id="sec03-slider-next" style="position: absolute;" class="arrow-table" src="./img/arrow-table.png"
                 alt="">
             <div id="sec03-slider" class="row">
-                <div id="sec03-slider1" class="col-6" style="box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);">
+                <div id="sec03-slider1" class="col-12" style="box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);">
 
                     <table class="table">
+
                         <tbody>
                             <tr>
                                 <th scope="row">1</th>
                                 <td>
-                                    <img src="./img/sec03/top1webp.webp" alt="">
-                                    <div class="sec03-table-text" style="display: inline-block;">
+                                    <a href="https://www.instagram.com/p/CO0otBGjnFm/"><img
+                                            src="./img/sec03/sec03top1.gif" alt=""></a>
+                                    <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:Simon Denny</h1>
+                                            <a href="https://www.instagram.com/iammaskarade/">
+                                                <h1><span style="font-weight: 900;">作者:</span>iammaskarade</h1>
+                                            </a>
                                         </div>
                                         <div>
-                                            <p>作品名稱:</p>
-                                            <p>Backdated NFT/Ethereum Stamp</p>
+                                            <a href="https://www.instagram.com/p/CO0otBGjnFm/">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>Backdated NFT/Ethereum
+                                                    Stamp</p>
+                                            </a>
                                         </div>
                                     </div>
                                 </td>
@@ -506,14 +559,19 @@
                             <tr>
                                 <th scope="row">2</th>
                                 <td>
-                                    <img src="./img/sec03/top2webp.webp" alt="">
-                                    <div class="sec03-table-text" style="display: inline-block;">
+                                    <a
+                                        href="https://opensea.io/assets/0xd92e44ac213b9ebda0178e1523cc0ce177b7fa96/100010115"><img
+                                            src="./img/sec03/top2webp.webp" alt=""></a>
+                                    <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:beeple</h1>
+                                            <a href="https://opensea.io/beeple">
+                                                <h1><span style="font-weight: 900;">作者:</span>beeple</h1>
+                                            </a>
                                         </div>
                                         <div>
-                                            <p>作品名稱:</p>
-                                            <p>BULL RUN #115/271</p>
+                                            <a
+                                                href="https://opensea.io/assets/0xd92e44ac213b9ebda0178e1523cc0ce177b7fa96/100010115"></a>
+                                            <p><span style="font-weight: 900;">作品名稱:</span>BULL RUN #115/271</p>
                                         </div>
                                     </div>
                                 </td>
@@ -522,31 +580,41 @@
                             <tr>
                                 <th scope="row">3</th>
                                 <td>
-                                    <img src="./img/sec03/top3webp.webp" alt="">
-                                    <div class="sec03-table-text" style="display: inline-block;">
+                                    <img src="./img/sec03/top4webp.webp" alt="">
+                                    <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:楊夏蕙</h1>
+                                            <a href="https://opensea.io/SasGlas">
+                                                <h1><span style="font-weight: 900;">作者:</span>SasGlas</h1>
+                                            </a>
                                         </div>
                                         <div>
-                                            <p>作品名稱:</p>
-                                            <p>The Eternal Cloudsitter</p>
+                                            <a href="">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>The Eternal Cloudsitter
+                                                </p>
+                                            </a>
                                         </div>
                                     </div>
                                 </td>
 
-
                             </tr>
+
                             <tr>
                                 <th scope="row">4</th>
                                 <td>
-                                    <img src="./img/sec03/top4webp.webp" alt="">
-                                    <div class="sec03-table-text" style="display: inline-block;">
+                                    <img src="./img/sec03/top5webp.webp" alt="">
+                                    <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:SasGlas</h1>
+                                            <a href="https://opensea.io/nifty-gateway-omnibus">
+                                                <h1><span style="font-weight: 900;">作者:</span>nifty-gateway-omnibus</h1>
+                                            </a>
                                         </div>
                                         <div>
-                                            <p>作品名稱:</p>
-                                            <p>The Eternal Cloudsitter</p>
+                                            <a
+                                                href="https://opensea.io/assets/0xce5e90533d9dbc30eac8a3610a681fc7aaa23193/43100040225">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>Seven Nation Army Remix
+                                                </p>
+                                            </a>
+                                            <p>004 #225/333(MUSIC)</p>
                                         </div>
                                     </div>
                                 </td>
@@ -555,19 +623,20 @@
                             <tr>
                                 <th scope="row">5</th>
                                 <td>
-                                    <img src="./img/sec03/top5webp.webp" alt="">
-                                    <div class="sec03-table-text" style="display: inline-block">
+                                    <img src="./img/sec03/top3webp.webp" alt="">
+                                    <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>作者:nifty-gateway-omnibus</h1>
+                                            <h1><span style="font-weight: 900;">作者:</span>楊夏蕙</h1>
                                         </div>
                                         <div>
-                                            <p>作品名稱:</p>
-                                            <p>Seven Nation Army Remix</p>
-                                            <p> 004#225/333</p>
+                                            <a href="https://www.youtube.com/watch?v=uZtX_3TRdiE">
+                                                <p><span style="font-weight: 900;">作品名稱:</span>1970Marlboro</p>
+                                            </a>
                                         </div>
                                     </div>
                                 </td>
 
+
                             </tr>
                         </tbody>
                     </table>
@@ -575,13 +644,17 @@
                 <div id="sec03-slider2" class="col-6" style=" box-shadow: 5px 0 10px -5px rgba(0, 0, 0, 0.3);">
                     <table class="table ">
                         <tbody>
+
                             <tr>
                                 <th scope="row">1</th>
                                 <td>
-                                    <img src="./img/sec03/11webp.webp" alt="">
+                                    <a href="https://twitter.com/beeple"><img src="./img/sec03/sec04-top-11.jpg"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>pplpleasr</h1>
+                                            <a href="https://twitter.com/beeple">
+                                                <h1>beeple</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -593,10 +666,13 @@
                             <tr>
                                 <th scope="row">2</th>
                                 <td>
-                                    <img src="./img/sec03/22webp.webp" alt="">
+                                    <a href="https://twitter.com/A_Giant_Swan/photo"> <img
+                                            src="./img/sec03/sec04-top-12webp.webp" alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>Gabe Weis</h1>
+                                            <a href="https://twitter.com/A_Giant_Swan/photo">
+                                                <h1>GIANT SWAN</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -604,14 +680,18 @@
                                     </div>
                                 </td>
 
+
                             </tr>
                             <tr>
                                 <th scope="row">3</th>
                                 <td>
-                                    <img src="./img/sec03/33webp.webp" alt="">
+                                    <a href="https://www.thehashmasks.com/"><img src="./img/sec03/sec04-top-13webp.webp"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>馬修 </h1>
+                                            <a href="https://www.thehashmasks.com/">
+                                                <h1>HASHMASKS</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -619,15 +699,17 @@
                                     </div>
                                 </td>
 
-
                             </tr>
                             <tr>
                                 <th scope="row">4</th>
                                 <td>
-                                    <img src="./img/sec03/44webp.webp" alt="">
+                                    <a href="https://twitter.com/fewocious"><img src="./img/sec03/sec04-top-14webp.webp"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>麥羨雲</h1>
+                                            <a href="https://twitter.com/fewocious">
+                                                <h1>FEWoCIOUS</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -639,10 +721,13 @@
                             <tr>
                                 <th scope="row">5</th>
                                 <td>
-                                    <img src="./img/sec03/55webp.webp" alt="">
+                                    <a href="https://twitter.com/pplpleasr1?lang=fr"> <img src="./img/sec03/11webp.webp"
+                                            alt=""></a>
                                     <div class="sec03-table-text" style="display: inline-block ;">
                                         <div>
-                                            <h1>林淵源</h1>
+                                            <a href="https://twitter.com/pplpleasr1?lang=fr">
+                                                <h1>pplpleasr</h1>
+                                            </a>
                                         </div>
                                         <div>
 
@@ -661,8 +746,10 @@
     <!-- 洞察報告-電腦版 -->
     <section id="sec04">
         <div class="container-fluid">
-            <h1>洞察報告</h1>
-            <hr class="line">
+            <div class="sec04-title">
+                <h1>洞察報告</h1>
+                <hr class="line">
+            </div>
             <div id="sec04-container" class="row row-cols-1 row-cols-md-4 g-4">
                 <div class="col">
                     <div class="card">
@@ -2014,8 +2101,6 @@
     <section id="sec05-moblie">
         <div id="sec05-moblie-container" class="container-fluid" style="margin: 0; padding: 0">
             <h1>熱門作品</h1>
-            <img id="sec05-slider-next" style="position: absolute;" class="arrow-table" src="./img/arrow-table.png"
-                alt="">
             <!-- <div id="tag">
                 <a href=""><button>Art</button></a>
                 <a href=""><button>Collectible</button></a>
@@ -2025,7 +2110,7 @@
             </div> -->
             <div id="sec05-moblie-slider" class="container-fluid " style="margin: 0; padding: 0;">
 
-                <div class="sec05-moblie-box" >
+                <div class="sec05-moblie-box">
                     <div class="card">
                         <blockquote class="instagram-media"
                             data-instgrm-permalink="https://www.instagram.com/p/CNNSzxPAeeh/?utm_source=ig_embed&amp;utm_campaign=loading"
@@ -3218,13 +3303,36 @@
                 </div>
 
             </div>
+
+        </div>
+        <div class="sec05-button">
+
+            <div class="mouse_scroll">
+                <div class="testright">
+                    <span class="m_scroll_arrows unu "></span>
+                    <span class="m_scroll_arrows doi "></span>
+                    <span class="m_scroll_arrows trei "></span>
+
+                </div>
+                <div class="mouse">
+                    <div class="wheel"></div>
+                </div>
+                <div class="testleft">
+                    <span class="m_scroll_arrows unu"></span>
+                    <span class="m_scroll_arrows doi"></span>
+                    <span class="m_scroll_arrows trei"></span>
+                </div>
+            </div>
         </div>
     </section>
     <!-- NFT資訊 -->
     <section id="sec06">
         <div class="container-fluid">
-            <h1>NFT資訊</h1>
-            <hr>
+            <div class="sec06-title">
+                <h1>NFT資訊</h1>
+                <hr>
+            </div>
+
             <div id="sec06-container" class="row">
                 <div class="col">
                     <div class="card">
@@ -3234,12 +3342,15 @@
                             <h5 class="card-title">誰要買這個啦!推特執行長賣推文「加密熱潮」新標的,NFT是什麼?</h5>
                             <p class="card-text">如果果你還沒聽過NFT,應該也快聽說了。NFT正在攻佔網路,並被認為是區塊鏈技術 (blockchain technology)
                                 的最佳應用實例。</p>
+                            <div>
 
-                            <a target="https://www.facebook.com/nftboard/posts/105110191814016"
-                                href="https://www.facebook.com/nftboard/posts/105110191814016"><button
-                                    class="learn-more">LearnMore</button></a>
+                                <a target="https://www.facebook.com/nftboard/posts/105110191814016"
+                                    href="https://www.facebook.com/nftboard/posts/105110191814016"><button
+                                        class="learn-more">LearnMore</button></a>
+                            </div>
                         </div>
                     </div>
+
                 </div>
                 <div class="col">
                     <div class="card">
@@ -3250,10 +3361,12 @@
                             <p class="card-text">目前,門票偽造和大量囤票是一個亟需解決的大問題。NFT
                                 在分佈式賬本上保存的記錄具有不可更改性,使得票據可以在區塊鏈上進行獨立驗證和認證,避免了作弊方法。</p>
 
+                            <div>
+                                <a target="https://www.facebook.com/nftboard/posts/115143380810697"
+                                    href="https://www.facebook.com/nftboard/posts/115143380810697"><button
+                                        class="learn-more">LearnMore</button></a>
+                            </div>
 
-                            <a target="https://www.facebook.com/nftboard/posts/115143380810697"
-                                href="https://www.facebook.com/nftboard/posts/115143380810697"><button
-                                    class="learn-more">LearnMore</button></a>
                         </div>
                     </div>
                 </div>
@@ -3435,7 +3548,11 @@
 
 
 
-    
+
+
+
+
+
     <script src="https://cdn.jsdelivr.net/npm/@popperjs/core@2.9.2/dist/umd/popper.min.js"
         integrity="sha384-IQsoLXl5PILFhosVNubq5LC7Qb9DXgDA9i+tQ8Zj3iwWAwPtgFTxbJ8NT4GN1R8p"
         crossorigin="anonymous"></script>
@@ -3443,9 +3560,11 @@
         integrity="sha384-Atwg2Pkwv9vp0ygtn1JAojH0nYbwNJLPhwyoVbhoPwBhjQPR5VtM2+xf0Uwh9KtT"
         crossorigin="anonymous"></script>
     <script src="https://ajax.googleapis.com/ajax/libs/jquery/3.6.0/jquery.min.js"></script>
+
     <script type="text/javascript" src="//cdn.jsdelivr.net/npm/slick-carousel@1.8.1/slick/slick.min.js"></script>
     <script src="./goto.js"></script>
-
+    <script src="./node_modules/jquery-touchswipe/jquery.touchSwipe.min.js"></script>
+    <script src="./node_modules/jquery-touchswipe/jquery.touchSwipe.js"></script>
     <script>
         $(document).ready(function () {
             function get_data(limit = 5) {

+ 12 - 0
node_modules/.package-lock.json

@@ -0,0 +1,12 @@
+{
+  "name": "NFTBoard",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "node_modules/jquery-touchswipe": {
+      "version": "1.6.19",
+      "resolved": "https://registry.npmjs.org/jquery-touchswipe/-/jquery-touchswipe-1.6.19.tgz",
+      "integrity": "sha512-b0BGje9reNRU3u6ksAK9QqnX7yBRgLNe/wYG7DOfyDlhBlYjayIT8bSOHmcuvptIDW/ubM9CTW/mnZf9Rohuow=="
+    }
+  }
+}

+ 24 - 0
node_modules/jquery-touchswipe/LICENSE

@@ -0,0 +1,24 @@
+Copyright (c) 2010-2015 Matt Bryson
+
+Dual licensed under the MIT or GPL Version 2 licenses.
+
+Permission is hereby granted, free of charge, to any person
+obtaining a copy of this software and associated documentation
+files (the "Software"), to deal in the Software without
+restriction, including without limitation the rights to use,
+copy, modify, merge, publish, distribute, sublicense, and/or sell
+copies of the Software, and to permit persons to whom the
+Software is furnished to do so, subject to the following
+conditions:
+
+The above copyright notice and this permission notice shall be
+included in all copies or substantial portions of the Software.
+
+THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
+OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
+NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT
+HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY,
+WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
+FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
+OTHER DEALINGS IN THE SOFTWARE.

+ 81 - 0
node_modules/jquery-touchswipe/README.md

@@ -0,0 +1,81 @@
+# TouchSwipe 1.6
+A jQuery plugin to be used on touch devices such as iPad, iPhone, Android etc.
+
+Detects single and multiple finger swipes, pinches and falls back to mouse 'drags' on the desktop.
+
+Time and distance thresholds can be set to distinguish between swipe gesture and slow drag.
+
+Allows exclusion of child elements (interactive elements) as well allowing page scrolling or page zooming depending on configuration.
+
+* Detects swipes in 4 directions, "up", "down", "left" and "right"
+* Detects pinches "in" and "out"
+* Supports single finger or double finger touch events
+* Supports click events both on the touchSwipe object and its child objects
+* Definable threshold / maxTimeThreshold to determin when a gesture is actually a swipe
+* Events triggered for swipe "start","move","end" and "cancel"
+* End event can be triggered either on touch release, or as soon as threshold is met
+* Allows swiping and page scrolling
+* Disables user input elements (Button, form, text etc) from triggering swipes
+
+## Demos, examples and docs
+
+[http://labs.rampinteractive.co.uk/touchSwipe](http://labs.rampinteractive.co.uk/touchSwipe)  
+[http://labs.rampinteractive.co.uk/touchSwipe/docs](http://labs.rampinteractive.co.uk/touchSwipe/docs)
+
+
+## Installation  
+### NPM
+````bash
+npm install jquery-touchswipe --save
+````
+### Bower
+````bash
+bower install jquery-touchswipe --save
+````
+### Manual
+Include the minified file in your project.
+````html
+<script type="text/javascript" src="js/jquery.touchSwipe.min.js"></script>
+````
+
+## Usage
+````javascript
+$(function() {
+  $("#test").swipe( {
+    //Generic swipe handler for all directions
+    swipe:function(event, direction, distance, duration, fingerCount, fingerData) {
+      $(this).text("You swiped " + direction );  
+    }
+  });
+
+  //Set some options later
+  $("#test").swipe( {fingers:2} );
+});
+````
+
+For full demos, code examples and documentation, see below.
+
+
+## Development
+Install dependencies
+````bash
+npm install
+````
+
+To minify
+````bash
+npm run minify
+````
+
+To build docs
+````bash
+npm run docs
+````
+
+To do both
+````bash
+npm run build
+ ````
+
+### For port to XUI see:
+https://github.com/cowgp/xui-touchSwipe

+ 8 - 0
node_modules/jquery-touchswipe/bower.json

@@ -0,0 +1,8 @@
+{
+  "name": "jquery-touchswipe",
+  "main": "./jquery.touchSwipe.js",
+  "repository": {
+    "type": "git",
+    "url": "git://github.com/mattbryson/TouchSwipe-Jquery-Plugin.git"
+  }
+}

+ 49 - 0
node_modules/jquery-touchswipe/demos/Any_finger_swipe.html

@@ -0,0 +1,49 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					$("#test").swipe( {
+					  swipe:function(event, direction, distance, duration, fingerCount, fingerData) {
+					  	$("#test").text("You swiped " + direction + " with " + fingerCount + " fingers");
+					  },
+					  threshold:0,
+					  fingers:'all'
+					});
+				});
+			</script>
+			
+			
+			<span class='title'></span>
+			<h4>Events: <span class='events'><code>swipe</code></span></h4>
+			<h4>properties: <span class='properties'><code>fingers</code></span></h4>
+			<p>By setting the number of <code>fingers</code> to 'all', any number of fingers will trigger the swipe.</p>
+			
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint" data-src='code_1'></pre>
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">Swipe me with different combinations of fingers</div>
+			
+			<span class='navigation'></span>
+
+		</div>
+   </body>
+</html>

+ 48 - 0
node_modules/jquery-touchswipe/demos/Basic_swipe.html

@@ -0,0 +1,48 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					//Enable swiping...
+					$("#test").swipe( {
+						//Generic swipe handler for all directions
+						swipe:function(event, direction, distance, duration, fingerCount, fingerData) {
+							$(this).text("You swiped " + direction );	
+						},
+						//Default is 75px, set to 0 for demo so any distance triggers swipe
+					   threshold:0
+					});
+				});
+			</script>
+			
+			<span class='title'></span>
+		  	<h4>events: <span class='events'><code>swipe</code>,<code>swipeLeft</code>, <code>swipeRight</code>, <code>swipeUp</code>, <code>swipeDown</code></span></h4>
+			<p>By using the <code>swipe</code> handler, you can detect all 4 directions, or use the individual methods <code>swipeLeft</code>, <code>swipeRight</code>, <code>swipeUp</code>, <code>swipeDown</code></p>
+		   	
+		   	<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+		   	<pre class="prettyprint" data-src='code_1'></pre>
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">Swipe me</div>
+			
+			<span class='navigation'></span>
+		</div>		
+   </body>
+</html>

+ 95 - 0
node_modules/jquery-touchswipe/demos/Enable_and_destroy.html

@@ -0,0 +1,95 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				
+				//Assign handlers to the simple direction handlers.
+				var swipeOptions=
+				{
+					swipe:swipe,
+					threshold:0
+				}
+				
+				$(function()
+				{	
+					$("#disable").click(function(){
+						if($("#test").swipe("disable"))
+							$("#test").text("Swipe me and nothing happens");
+					});
+					
+					$("#enable").click(function(){
+						if($("#test").swipe("enable"))
+							$("#test").text("Now I can be Swiped again");
+					});
+				
+					$("#destroy").click(function(){
+						if($("#test").swipe("destroy"))
+							$("#test").text("I am no longer a touch swipe element");
+					});
+				
+					$("#init").click(function(){
+						if( $("#test").swipe( swipeOptions ) )
+						{
+							$("#test").data('count', 0);
+							$("#test").text("I am now a touch swipe element");
+						}
+					});
+					
+					$("#test").swipe( swipeOptions );
+					$("#test2").swipe( swipeOptions );
+					
+				});
+			
+				//Swipe handlers.
+				//The only arg passed is the original touch event object	
+				function swipe(event, direction)
+				{
+					var count = this.data('count') ? this.data('count') + 1 : 1;
+					this.data('count', count);
+					this.text("You swiped " + direction + ". You swiped " + count + " times");
+				}
+			</script>
+			
+			<span class='title'></span>
+			<h4>methods: <span class="methods"><code>enable</code>, <code>disable</code>, <code>destroy</code></span></h4>
+			<p>By using the <code>enable</code>,  <code>disable</code> and <code>destroy</code> methods, you can temporarily disable interaction with a swipe element, or completely destroy it, which requires re instantiation.</br>
+			</p>
+			
+			<span class='navigation'></span>
+			
+			</br>
+			
+			<div class="btn-group">
+				<button class='btn' id="disable">disable</button>
+				<button class='btn' id="enable">enable</button>
+				<button class='btn'id="destroy">destroy</button>
+				<button class='btn' id="init">init</button>
+			</div>
+			
+			<div id="test" class="box">Swipe me</div>
+			
+			<br/><br/>
+			
+			<div id="test2" class="box">Swipe me - Im not affected by the above...</div>
+			
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 82 - 0
node_modules/jquery-touchswipe/demos/Excluded_children.html

@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+       <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+
+			<script id='code_1'>
+				$(function() {
+					var swipeCount1=0;
+					var swipeCount2=0;
+
+					$("#test").swipe( {
+						swipe:function() {
+							swipeCount1++;
+							$("#textText1").html("You swiped " + swipeCount1 + " times");
+						}
+						//By default any element with a class .noSwipe is not swipeable
+					});
+
+					//Enable swiping...
+					$("#test2").swipe( {
+						swipe:function() {
+							swipeCount2++;
+							$("#textText2").html("You swiped " + swipeCount2 + " times");
+						},
+						//By default the value of $.fn.swipe.defaults.excludedElements is ".noSwipe"
+						//To replace or clear the list, re set the excludedElements array.
+						//To append to it, do the following (dont forget the proceeding comma) ...
+						excludedElements:$.fn.swipe.defaults.excludedElements+", #some_other_div"
+					});
+				});
+			</script>
+
+			<span class='title'></span>
+			<h4>property: <span class='properties'><code>excludedElements</code></span></h4>
+			<p>If you want to exclude certain child elements from triggering swipes, you can simply add a <code>.noSwipe</code> class to the element.  Then the element and any of its children will no longer trigger the swipe.
+			<p>Also, a jQuery selector is used to exclude input elements as well as the <code>.noSwipe</code> elements.
+			So either add a <code>.noSwipe</code> class the element, or set your own selector in the excludedElements property. Setting your own selector will remove the .noSwipe selector.
+			</p>
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>
+
+			<span class='navigation'></span>
+
+			<div id="test" class="box">
+
+				<div id="textText1">Swipe me, the child elements will not trigger swipes by default</div><br/>
+        <small></smal><a href="http://www.google.com" target="new" >I open a new tab if clicked, but im swipeable</a></small>
+				<form>
+					<input type="text" value="I am clickable and swipeable" />
+					<input type="button" value="I am clickable and swipeable" />
+					<textarea>I am clickable and swipeable</textarea>
+				</form>
+
+				<div id="another_div" class="box noSwipe" style="width:400px;height:100px;background:#000"><h3>Im am NOT swipeable because my class is .noSwipe</h3></div>
+
+			</div>
+
+
+			<div id="test2" class="box">
+				<div id="textText2">Swipe me, the child elements will not trigger swipes as they have been explicitly excluded</div><br/>
+				<div id="some_other_div" class="box" style="width:400px;height:100px;background:#000"><h3>Im am NOT swipeable because my im added to the excludedElements array</h3></div>
+			</div>
+
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 61 - 0
node_modules/jquery-touchswipe/demos/Finger_swipe.html

@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {
+					$("#test, #test_2").swipe( {
+						swipeStatus:function(event, phase, direction, distance, duration, fingers, fingerData) {
+
+						if(phase==$.fn.swipe.phases.PHASE_START) {
+							$(this).text("moving...");
+						} 
+
+						if(phase==$.fn.swipe.phases.PHASE_CANCEL) {
+							$(this).text("swipe cancelled (due to finger count) "  );
+						}   
+					  },
+					  swipe:function(event, direction, distance, duration, fingerCount, fingerData) {
+					  	$(this).text("You swiped " + direction + " with " + fingerCount + " fingers");
+					  },
+					  threshold:0,
+					  fingers:2
+					});
+
+                    $("#test_2").swipe({ fingers:3 } );
+				});
+			</script>
+			
+			
+			<span class='title'></span>
+			<h4>property:  <span class='properties'><code>fingers</code></span></h4>
+			<p>By setting the number of <code>fingers</code> to 2, you can detect ONLY 2 finger swipes, likewise for 3 fingers.</p>
+			
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src="code_1"></pre>
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">Swipe me with 2 fingers</div>
+
+            <div id="test_2" class="box">Swipe me with 3 fingers</div>
+			
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 128 - 0
node_modules/jquery-touchswipe/demos/Handlers_and_events.html

@@ -0,0 +1,128 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+        <!-- use the jquery.ui.ipad.js plugin to translate touch events to mouse events -->
+		<script type="text/javascript" src="js/jquery.ui.ipad.js"></script>
+
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+
+			<script id='code_1'>
+				$(function() {
+					$("#register_btn").click(function() {
+                        if($(this).text() == "Register Events") {
+			                registerEvents();
+                        } else {
+			                deRegisterEvents();
+			            }
+			        });
+
+					// Create the swipe object, and assign the callbacks
+					$("#test").swipe( {
+						tap:function(event, target) {
+                            log("tap from callback");
+						},
+						hold:function(event, target) {
+                            log("hold from callback");
+						},
+						swipe:function(event, direction, distance, duration, fingerCount, fingerData, currentDirection) {
+							log("swipe from callback");
+						},
+						swipeLeft:function(event, distance, duration, fingerCount, fingerData, currentDirection) {
+							log("swipeLeft from callback");
+						},
+						swipeRight:function(event, distance, duration, fingerCount, fingerData, currentDirection) {
+							log("swipeRight from callback");
+						},
+						swipeUp:function(event, distance, duration, fingerCount, fingerData, currentDirection) {
+							log("swipeUp from callback");
+						},
+						swipeDown:function(event, distance, duration, fingerCount, fingerData, currentDirection) {
+							log("swipeDown from callback");
+						},
+						swipeStatus:function(event, phase, direction, distance, duration, fingers, fingerData, currentDirection) {
+    						log("swipeStatus from callback");
+						},
+						pinchIn:function(event, direction, distance, duration, fingerCount, pinchZoom, fingerData) {
+							log("pinchIn from callback");
+						},
+						pinchOut:function(event, direction, distance, duration, fingerCount, pinchZoom, fingerData) {
+                            log("pinchOut from callback");
+						},
+						pinchStatus:function(event, phase, direction, distance , duration , fingerCount, pinchZoom, fingerData) {
+                            log("pinchStatus from callback");
+						},
+
+                        fingers:$.fn.swipe.fingers.ALL
+					});
+
+					//Now assign the event handlers as well
+					var events = ['tap','hold', 'swipe','swipeLeft','swipeRight','swipeUp','swipeDown','swipeStatus','pinch','pinchIn','pinchOut','pinchStatus'];
+
+					function registerEvents() {
+					    for(var i in events) {
+					        $("#test").on( events[i], logEvent);
+					    }
+					     $("#register_btn").text("Remove Events").removeClass('btn-success').addClass('btn-danger');
+					}
+
+					function deRegisterEvents() {
+					    for(var i in events) {
+					        $("#test").off( events[i], logEvent);
+					    }
+					     $("#register_btn").text("Register Events").removeClass('btn-danger').addClass('btn-success');
+					}
+
+					function logEvent(event) {
+					    log("<b>" + event.type + " from event handler</b>");
+					}
+
+					function log(msg) {
+					    $("#test").html( msg + "<br />" + $("#test").html() );
+					}
+
+					registerEvents();
+				});
+			</script>
+
+			<script>
+			    $(function() {
+
+    			});
+			</script>
+
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>tap</code> <code>hold</code> <code>swipe</code> <code>swipeLeft</code> <code>swipeRight</code> <code>swipeUp</code> <code>swipeDown</code> <code>swipeStatus</code> <code>pinch</code> <code>pinchIn</code> <code>pinchOut</code> <code>pinchStatus</code></span> </h4>
+			<b>See the <a href="../docs/%24.fn.swipe.html#event:click"><u>docs</u></a> for more on each event</b>
+			<p>You can either assign callback methods as part of the options object, or you can assign
+			event handlers using the jQuery <code>on</code>/<code>off</code> event registration.</p>
+
+			<p>The example below logs both from the callback and the event handlers. The Remove Events button will remove the
+			event bindings, and then only the callbacks will be logged. Event logs are bold, callbacks are normal.</p>
+
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>
+			<span class='navigation'></span>
+
+			<br/>
+			<button class='btn btn-danger' id="register_btn"></button>
+			<div id="test" class="box" style="font-size:10px;"></div>
+
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 61 - 0
node_modules/jquery-touchswipe/demos/Hold.html

@@ -0,0 +1,61 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <!-- use the jquery.ui.ipad.js plugin to translate touch events to mouse events -->
+		<script type="text/javascript" src="js/jquery.ui.ipad.js"></script>
+		
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {	
+					//Enable swiping...
+					$("#test").swipe( {
+						hold:function(event, target) {
+							
+							$("#textText").html("You held the tap until the longTapthreshold was reached" );
+						},
+						
+						threshold:50
+					});
+					
+					
+				});
+			</script>
+			
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>tap</code>, <code>hold</code></span></h4>
+			<h4>properties:  <span class='properties'><code>longTapThreshold</code></span></h4>
+			<p>You can also detect if the user holds their finger down until the longTapthreshold is met<br/>
+				The <code>hold</code> handler is passed the original event object and the target that was clicked.
+				<br/></p>
+				<p class="muted">If you use the jquery.ui.ipad.js plugin (http://code.google.com/p/jquery-ui-for-ipad-and-iphone/) you can then also pickup
+				standard jQuery mouse events on children of the touchSwipe object.</p>
+				
+				
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">
+				<div id="textText">Hold me :)</div><br/>
+			</div>
+			
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 148 - 0
node_modules/jquery-touchswipe/demos/Image_gallery_example.html

@@ -0,0 +1,148 @@
+<!DOCTYPE HTML>
+<html lang="en">
+<head>
+    <meta charset="utf-8">
+    <meta name="viewport"
+          content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+    <meta http-equiv="x-ua-compatible" content="IE=9">
+    <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+    <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet"/>
+    <link href="css/main.css" type="text/css" rel="stylesheet"/>
+
+    <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+    <script type="text/javascript"
+            src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+    <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+    <script type="text/javascript" src="js/main.js"></script>
+
+    <title>touchSwipe</title>
+
+    <style>
+        #content {
+            height: 340px;
+            width: 500px;
+            overflow: hidden;
+            position: relative;
+            border: 1px solid black;
+        }
+
+        #imgs {
+            float: left;
+            display: inline;
+            padding: 0;
+            margin: 0;
+            width: 1510px;
+
+            transition-property: transform;
+            transition-duration: 0.5s;
+            transition-timing-function: ease-out;
+
+            /*apply a transform to kick in the hardware acceleration.  Without this, the first
+            time we add the transform you get odd rendering of the divs (half missing) */
+            transform: translate(0, 0);
+        }
+
+        #imgs img {
+            padding: 0;
+            margin: 0;
+            width: 500px;
+            height: 340px;
+
+            /*apply a transform to kick in the hardware acceleration.  Without this, the first
+            time we add the transform you get odd rendering of the divs (half missing) */
+            transform: translate(0, 0);
+        }
+    </style>
+
+    <script id='code_1'>
+        var IMG_WIDTH = 500;
+        var currentImg = 0;
+        var maxImages = 3;
+        var speed = 500;
+
+        var imgs;
+
+        var swipeOptions = {
+            triggerOnTouchEnd: true,
+            swipeStatus: swipeStatus,
+            allowPageScroll: "vertical",
+            threshold: 75
+        };
+
+        $(function () {
+            imgs = $("#imgs");
+            imgs.swipe(swipeOptions);
+        });
+
+
+        /**
+         * Catch each phase of the swipe.
+         * move : we drag the div
+         * cancel : we animate back to where we were
+         * end : we animate to the next image
+         */
+        function swipeStatus(event, phase, direction, distance) {
+            //If we are moving before swipe, and we are going L or R in X mode, or U or D in Y mode then drag.
+            if (phase == "move" && (direction == "left" || direction == "right")) {
+                var duration = 0;
+
+                if (direction == "left") {
+                    scrollImages((IMG_WIDTH * currentImg) + distance, duration);
+                } else if (direction == "right") {
+                    scrollImages((IMG_WIDTH * currentImg) - distance, duration);
+                }
+
+            } else if (phase == "cancel") {
+                scrollImages(IMG_WIDTH * currentImg, speed);
+            } else if (phase == "end") {
+                if (direction == "right") {
+                    previousImage();
+                } else if (direction == "left") {
+                    nextImage();
+                }
+            }
+        }
+
+        function previousImage() {
+            currentImg = Math.max(currentImg - 1, 0);
+            scrollImages(IMG_WIDTH * currentImg, speed);
+        }
+
+        function nextImage() {
+            currentImg = Math.min(currentImg + 1, maxImages - 1);
+            scrollImages(IMG_WIDTH * currentImg, speed);
+        }
+
+        /**
+         * Manually update the position of the imgs on drag
+         */
+        function scrollImages(distance, duration) {
+            imgs.css("transition-duration", (duration / 1000).toFixed(1) + "s");
+
+            //inverse the number we set in the css
+            var value = (distance < 0 ? "" : "-") + Math.abs(distance).toString();
+            imgs.css("transform", "translate(" + value + "px,0)");
+        }
+    </script>
+</head>
+<body>
+<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;"
+                                             src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png"
+                                             alt="Fork me on GitHub"></a>
+
+<div class="container">
+    <p>Below is a very simple image gallery to demonstrate how to implement touchSwipe.<br/><br/>
+        Swipe the images below left and right. Swipe up and down will scroll the page. Uses HTML5
+        CSS to animate.</p>
+    <br/>
+
+    <div id="content">
+        <div id="imgs">
+            <img src="https://lh4.googleusercontent.com/_D9-nzLCi9qU/TNQ2hYNqQEI/AAAAAAAADtI/TcqCdc6N26A/s500/twick_pool_stairs~.jpg"/>
+            <img src="https://lh6.googleusercontent.com/_D9-nzLCi9qU/TNQ2gdP8JYI/AAAAAAAADtI/NU2WBbaXpgU/s500/twick_pool_stairsAndChanginRoom~.jpg"/>
+            <img src="https://lh4.googleusercontent.com/_D9-nzLCi9qU/TNQ2UWpqLgI/AAAAAAAADtI/-OG4z6RxHwA/s500/twick_pool_hall~.jpg"/>
+        </div>
+    </div>
+</div>
+</body>
+</html>

+ 90 - 0
node_modules/jquery-touchswipe/demos/Options.html

@@ -0,0 +1,90 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+
+			<script id='code_1'>
+				$(function() {
+
+                    //Re set any options with a new options hash
+					$("#setMultiple").click(function(){
+                        $("#test").swipe({threshold:0, fingers:2});
+
+                        alert( "Options are now \n"  + JSON.stringify( $("#test").swipe("option") ) );
+                    });
+
+                    //Get the options hash
+                    $("#getAll").click(function(){
+                        alert( JSON.stringify( $("#test").swipe("option") ) );
+                    });
+
+                    //Legacy set options with the 'option' method
+                    $("#setThreshold").change(function(){
+                        $("#test").swipe("option", "threshold", $(this).val() );
+                    });
+
+                    $("#getThreshold").click(function(){
+                        alert( $("#test").swipe("option", "threshold") );
+                    });
+
+                    $("#test").swipe( {
+                        threshold:200,
+                        swipe:function(event, direction, distance, duration, fingerCount){
+                            this.text("You swiped " + distance + "px");
+                        }
+                    });
+                });
+			</script>
+
+			<span class='title'></span>
+			<h4>methods: <span class='methods'><code>option</code>, <code>swipe</code></span></h4>
+			<p>From 1.6.11 onwards you can simply re call <code>swipe</code> and pass a new options hash to update an existing instance</p>
+            <p>You can also use the legacy <code>option</code> method to can change any of the init option properties at run time.</br>
+
+			<b>see the <a href="../docs/%24.fn.swipe.defaults.html"><u>docs</u></a> for more info.
+
+			</p>
+
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>
+			<span class='navigation'></span>
+
+			</br>
+
+
+				Threshold: <select class='btn' id="setThreshold" style="width:70px;">
+				    <option>20</option>
+				    <option>50</option>
+				    <option>100</option>
+				    <option>200</option>
+				    <option>500</option>
+				    <option>1000</option>
+				</select>
+                <button class='btn' id="getThreshold">Get Threshold</button>
+                <button class='btn' id="getAll">Get All</button>
+                <button class='btn' id="setMultiple">Set threshold to 0 and fingers to 3</button>
+
+
+			<div id="test" class="box">Swipe me</div>
+
+			<br/><br/>
+
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 109 - 0
node_modules/jquery-touchswipe/demos/Page_scrolling.html

@@ -0,0 +1,109 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+
+			<script id='code_1'>
+				$(function() {
+					$("#test1").swipe( { fingers:'all', swipeLeft:swipe1, swipeRight:swipe1, allowPageScroll:"auto"} );
+					$("#test2").swipe( { swipeLeft:swipe1, allowPageScroll:"none"} );
+					$("#test3").swipe( { swipeLeft:swipe2, swipeRight:swipe2} );
+					$("#test4").swipe( { swipeStatus:swipe2, allowPageScroll:"vertical"} );
+					$("#test5").swipe( { swipeStatus:swipe2, allowPageScroll:"horizontal" } );
+					$("#test6").swipe( { pinchStatus:pinch, allowPageScroll:"vertical" } );
+
+					//Swipe handlers.
+					function swipe1(event, direction, distance, duration, fingerCount) {
+						$(this).text( "You have swiped " + direction +' with ' + fingerCount +' fingers' );
+					}
+
+					function swipe2(event, phase, direction, distance) {
+						$(this).text( phase +" you have swiped " + distance + "px in direction:" + direction );
+					}
+
+					function pinch(event, phase, direction, distance) {
+						$(this).text( phase +" you have pinched " + distance + "px in direction:" + direction );
+					}
+				});
+			</script>
+
+
+
+			<span class='title'></span>
+			<h4>property: <span class='properties'><code>allowPageScroll</code></span></h4>
+			<p>You can set how page scrolling is handled by the browser when the user is interacting with a touchSwipe object.
+				<br/>There are 4 possible settings for the <code>allowPageScroll</code> option. These can be strings, or use the plugin constants in </code>$.fn.swipe.pageScroll</code>
+					<ul>
+						<li><code>auto</code> or <code>$.fn.swipe.pageScroll.AUTO</code> <br/>scrolling will only occur if a user swipes in a direction for which you have NOT defined a swipe handler. E.g If only <i>swipeLeft</i> is defined, then a RIGHT, UP or DOWN swipe would cause the page to scroll.</li>
+						<li><code>none</code> or <code>$.fn.swipe.pageScroll.NONE</code> <br/>scrolling will never occur.</li>
+						<li><code>horizontal</code> or <code>$.fn.swipe.pageScroll.HORIZONTAL</code> <br/>horizontal swipes will cause the page to scroll.</li>
+						<li><code>vertical</code> or <code>$.fn.swipe.pageScroll.VERTICAL</code> <br/>vertical swipes will cause the page to scroll.</li>
+					</ul>
+
+				<br>
+					NOTE: if the general <code>swipe</code> or <code>swipeStatus</code> handlers are specificed, then <code>allowPageScroll</code> will be dissabled by default, as they detect swipes in all directions.
+					To use scrolling AND the <code>swipe</code> handler, set <code>allowPageScroll</code> to the direction you want the user to be able to scroll.
+			</p>
+
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src="code_1"></pre>
+			<span class='navigation'></span>
+
+			<br><br>
+			<b>allowPageScroll = "auto" or $.fn.swipe.pageScroll.AUTO</b>
+			<br><b>Swipe Left or Right </b>The swipe will trigger but the page will NOT scroll.
+			<br><b>Swipe Up or Down </b>The page will scroll as there is no up or down swipe handler.<br>
+			<div class="box" id="test1">Swipe me</div>
+
+			<br><br>
+			<b>allowPageScroll = "none" or $.fn.swipe.pageScroll.NONE</b>
+			<br><b>Swipe Left </b>The swipe will trigger but the page will NOT scroll.
+			<br><b>Swipe right, Up or Down </b>No swipe handler is defined, so nothihng happens and the page will NOT scroll.<br>
+			<div class="box" id="test2">Swipe me</div>
+
+			<br><br>
+			<b>allowPageScroll = "horizontal" or $.fn.swipe.pageScroll.HORIZONTAL</b>
+			<br>Swipe left and right are triggered<br>
+			<div class="box" id="test3">Swipe me</div>
+
+			<br><br>
+			<b>allowPageScroll = "vertical" or $.fn.swipe.pageScroll.VERTICAL</b>
+			<br/>
+			<b>With the general <code>swipe</code> or <code>swipeStatus</code> handlers</b>
+			<br>These enable all 4 directions, but here we have set <code>allowPageScroll</code> to "vertical" so the user can scroll up and down, and swipe left and right with the general <code>swipe</code> handler.<br>
+			<br>Note how the vertical swipe is hit and miss. As soon as the page starts scrolling, the user is no longer swiping across the object.
+			<div class="box" id="test4" >Swipe me</div>
+
+			<br><br>
+			<b>allowPageScroll = "horizontal" or $.fn.swipe.pageScroll.HORIZONTAL</b>
+			<br/>
+			<b>Horizontal, but WITH the general <code>swipe</code> or <code>swipeStatus</code> handlers</b>
+			<br>These enable all 4 directions, but here we have set <code>allowPageScroll</code> to "horizontal" so the user can scroll up and down, and swipe left and right with the general <code>swipe</code> handler.<br>
+			<div class="box" id="test5" >Swipe me</div>
+
+			<br><br>
+			<b>Pinch and allowPageScroll = "vertical" or $.fn.swipe.pageScroll.VERTICAL</b>
+			<br/>
+			<b>Vertical, but WITH  <code>pinch</code> handlers</b>
+			<div class="box" id="test6" >Pinch me</div>
+
+			<span class='navigation'></span>
+
+		</div>
+   </body>
+</html>

+ 50 - 0
node_modules/jquery-touchswipe/demos/Page_zoom.html

@@ -0,0 +1,50 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+    	<!-- 
+    		NOTE viewport is set so user can scale 
+    		-->
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					$("#test").swipe( {
+						swipeLeft:function(event, direction, distance, duration, fingerCount) {
+							$(this).text("You swiped " + direction );
+						},
+						fingers:1,	
+						threshold:0	
+					});
+				});
+			</script>
+			
+			<span class='title'></span>
+			<h4>property: <span class='properties'><code>fingers</code></span></h4>
+			<p>If just one <code>finger</code> is set for swipes, at the meta tag enables user-scaling, then page zooms will bubble up and trigger.</p>
+			<pre class="prettyprint lang-html">&lt;meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/&gt;</pre>	
+	
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src="code_1"></pre>	
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">I only swipe left, but you can pinch zoom me as I only capture 1 finger</div>
+			
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 57 - 0
node_modules/jquery-touchswipe/demos/Pinch.html

@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <!-- 
+    		NOTE viewport is set so user can scale 
+    		-->
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					$("#test").swipe( {
+						pinchIn:function(event, direction, distance, duration, fingerCount, pinchZoom)
+						{
+							$(this).text("You pinched " +direction + " by " + distance +"px, zoom scale is "+pinchZoom);
+						},
+						pinchOut:function(event, direction, distance, duration, fingerCount, pinchZoom)
+						{
+							$(this).text("You pinched " +direction + " by " + distance +"px, zoom scale is "+pinchZoom);
+						},
+						pinchStatus:function(event, phase, direction, distance , duration , fingerCount, pinchZoom) {
+							$(this).html("Pinch zoom scale "+pinchZoom+"  <br/>Distance pinched "+distance+" <br/>Direction " + direction);
+						},
+						fingers:2,	
+						pinchThreshold:0	
+					});
+				});
+			</script>
+			
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>pinchIn</code>, <code>pinchOut</code></span></h4>
+			<p>You can also trigger pinch events, <code>pinchIn</code> will trigger when a user has completed a pinch in event, and <code>pinchOut</code> will trigger when a user has pinched out.</p>
+			
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>	
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">Pinch me</div>
+			
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 81 - 0
node_modules/jquery-touchswipe/demos/Pinch_and_Swipe.html

@@ -0,0 +1,81 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <!-- 
+    		NOTE viewport is set so user can scale 
+    		-->
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					$("#test").swipe( {
+						swipeStatus:function(event, phase, direction, distance , duration , fingerCount) {
+						   $(this).find('#swipe_text').text("swiped " + distance + ' px');
+						   if(phase === $.fn.swipe.phases.PHASE_END || phase === $.fn.swipe.phases.PHASE_CANCEL) {
+							   //The handlers below fire after the status, 
+							   // so we can change the text here, and it will be replaced if the handlers below fire
+							   $(this).find('#swipe_text').text("No swipe was made");
+						   }
+						},
+
+						pinchStatus:function(event, phase, direction, distance , duration , fingerCount, pinchZoom) {
+							$(this).find('#pinch_text').text("pinched " + distance + " px ");
+							if(phase === $.fn.swipe.phases.PHASE_END || phase === $.fn.swipe.phases.PHASE_CANCEL) {
+							   //The handlers below fire after the status, 
+							   // so we can change the text here, and it will be replaced if the handlers below fire
+							   $(this).find('#pinch_text').text("No pinch was made");
+						   }
+						},
+
+						swipe:function(event, direction, distance, duration, fingerCount) {
+							 $(this).find('#swipe_text').text("You swiped " + direction + " with " + fingerCount + " fingers");
+						},
+
+						pinchIn:function(event, direction, distance, duration, fingerCount, pinchZoom) {
+							$(this).find('#pinch_text').text("You pinched " +direction + " by " + distance +"px, zoom scale is "+pinchZoom); 
+						},
+
+						pinchOut:function(event, direction, distance, duration, fingerCount, pinchZoom) {
+							$(this).find('#pinch_text').text("You pinched " +direction + " by " + distance +"px, zoom scale is "+pinchZoom);
+						},
+
+						fingers:$.fn.swipe.fingers.ALL	
+					});
+				});
+			</script>
+			
+			
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>pinchStatus</code>, <code>swipeStatus</code></span><h4>
+			<h4>properties: <span class='properties'><code>pinchThreshold</code></span></h4>
+			<p>You can combine both <code>pinch</code> and <code>swipe</code> events. As the user can simultaneously pinch and swipe, both events are tirggered at the same time.<br/> 
+			  The <code>pinchThreshold</code> property sets how far the user must pinch before it is considered a pinch. The default is 20px.  This is useful when trying to elimate slight pinch movement when the user is actually swiping.
+			</p>
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>	
+				<span class='navigation'></span>
+			
+				<div id="test" class="box">
+					 <div id='swipe_text'>Pinch me</div>
+					 <div id='pinch_text'></div>
+				</div>
+			
+				<span class='navigation'></span>
+			</div>
+	   </body>
+	</html>

+ 51 - 0
node_modules/jquery-touchswipe/demos/Pinch_status.html

@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <!--
+    		NOTE viewport is set so user can scale
+    		-->
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, user-scalable=yes"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+
+			<script id='code_1'>
+				$(function() {
+					$("#test").swipe( {
+						pinchStatus:function(event, phase, direction, distance , duration , fingerCount, pinchZoom, fingerData) {
+							$(this).html("Pinch zoom " + pinchZoom + "  <br/>Distance pinched " + distance +" <br/>Direction " + direction);
+						},
+						fingers:2,
+						threshold:0	,
+						preventDefaultEvents:false
+					});
+				});
+			</script>
+
+
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>pinchStatus</code></span></h4>
+			<p>You can also get the current status of a <code>pinch</code>, which can be used in place of the other pinch methods. The <code>pinchStatus</code> reports <code>phase</code>, <code>direction</code>, <code>distance</code>, <code>duration</code>, <code>fingerCount</code> and <code>pinchZoom</code>.</p>
+
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint" data-src='code_1'></pre>
+			<span class='navigation'></span>
+
+			<div id="test" class="box">Pinch me</div>
+
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 51 - 0
node_modules/jquery-touchswipe/demos/Single_swipe.html

@@ -0,0 +1,51 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					//Keep track of how many swipes
+					var count=0;
+
+					//Enable swiping...
+					$("#test").swipe( {
+						//Single swipe handler for left swipes
+						swipeLeft:function(event, direction, distance, duration, fingerCount) {
+							$(this).text("You swiped " + direction + " " + ++count + " times " );	
+						},
+						//Default is 75px, set to 0 for demo so any distance triggers swipe
+						threshold:0
+					});
+				});
+			</script>
+			
+			
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>swipeLeft</code>, <code>swipeRight</code>, <code>swipeUp</code>, <code>swipeDown</code>, <code>swipe</code></span></h4>
+			<p>By using just one handler <code>swipeLeft</code> you can detect ONLY left swipes. There are handlers for each direction, as well as the generic <code>swipe</code> handler.</p>
+			
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>
+			<span class='navigation'></span>
+			<div id="test" class="box">I only swipe left</div>
+	
+			<span class='navigation'></span>
+		</div>		
+   </body>
+</html>

+ 57 - 0
node_modules/jquery-touchswipe/demos/Stop_propegation.html

@@ -0,0 +1,57 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					//Enable swiping...
+					$("#test").swipe( {
+						swipeStatus:function(event, phase, direction, distance, fingerCount) {
+							var str = "";
+
+							switch (phase) {
+								case "start" : str="Started"; break;
+								case "move" : str="You have moved " + distance +" pixels, past 200 and the handler will fire"; break;
+								case "end" : str="Handler fired, you swiped " + direction; break;
+								case "cancel" : str="cancel handler fired"; break;
+							}
+							
+							$(this).text(str);
+
+							//This will cancel the current swipe and immediately re run this handler with a cancel event
+							return false;
+						}
+					});
+				});
+			</script>
+	
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>swipeStatus</code></span></h4>
+			<p>In your event handlers, you can return a value of false if you want to manually cancel the swipe. This will trigger the 'cancel' event.</p>
+			
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src="code_1"></pre>
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">Swipe will start, but then cancel as the event handler returns false</div>
+			
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 82 - 0
node_modules/jquery-touchswipe/demos/Swipe_status.html

@@ -0,0 +1,82 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+
+			<script id='code_1'>
+				$(function() {
+					//Enable swiping...
+					$("#test").swipe( {
+						swipeStatus:function(event, phase, direction, distance, duration, fingers, fingerData, currentDirection)
+						{
+							var str = "<h4>Swipe Phase : " + phase + "<br/>";
+              str += "Current direction: " + currentDirection + "<br/>";
+							str += "Direction from inital touch: " + direction + "<br/>";
+							str += "Distance from inital touch: " + distance + "<br/>";
+							str += "Duration of swipe: " + duration + "<br/>";
+							str += "Fingers used: " + fingers + "<br/></h4>";
+
+							//Here we can check the:
+							//phase : 'start', 'move', 'end', 'cancel'
+							//direction : 'left', 'right', 'up', 'down'
+							//distance : Distance finger is from initial touch point in px
+							//duration : Length of swipe in MS
+							//fingerCount : the number of fingers used
+
+							if (phase!="cancel" && phase!="end") {
+								if (duration<5000)
+									str +="Under maxTimeThreshold.<h3>Swipe handler will be triggered if you release at this point.</h3>"
+								else
+									str +="Over maxTimeThreshold. <h3>Swipe handler will be canceled if you release at this point.</h3>"
+
+								if (distance<200)
+									str +="Not yet reached threshold.  <h3>Swipe will be canceled if you release at this point.</h3>"
+								else
+									str +="Threshold reached <h3>Swipe handler will be triggered if you release at this point.</h3>"
+							}
+
+							if (phase=="cancel")
+								str +="<br/>Handler not triggered. <br/> One or both of the thresholds was not met "
+							if (phase=="end")
+								str +="<br/>Handler was triggered."
+
+							$("#test").html(str);
+						},
+						threshold:200,
+						maxTimeThreshold:5000,
+						fingers:'all'
+					});
+				});
+			</script>
+
+			<span class='title'></span>
+			<h4>event:  <span class='events'><code>swipeStatus</code></span></h4>
+			<p>You can also get the current status of the swipe, which can be used in place of all other methods. The status reports <code>phase</code>, <code>direction</code>, <code>distance</code>, <code>duration</code>, <code>fingerCount</code>, <code>fingerData</code> and <code>currentDirection</code>
+			Below has a 200px threshold and a 5 second time limit
+			</p>
+
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src="code_1"></pre>
+			<span class='navigation'></span>
+
+			<div id="test" class="box">Swipe me</div>
+
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 114 - 0
node_modules/jquery-touchswipe/demos/Tap_vs_swipe.html

@@ -0,0 +1,114 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+        <!-- use the jquery.ui.ipad.js plugin to translate touch events to mouse events -->
+		<script type="text/javascript" src="js/jquery.ui.ipad.js"></script>
+
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+
+			<script id='code_1'>
+				$(function() {
+					var tapCount=0;
+					var doubleTapCount=0;
+					var longTapCount=0;
+					var swipeCount=0;
+					var blackCount=0;
+
+					//Enable swiping...
+					$("#test").swipe( {
+
+          	tap:function(event, target) {
+							tapCount++;
+							msg(target);
+						},
+
+						doubleTap:function(event, target) {
+							doubleTapCount++;
+							msg(target);
+              return true;
+						},
+						longTap:function(event, target) {
+							longTapCount++;
+							msg(target);
+						},
+
+            swipe:function() {
+							swipeCount++;
+							$("#textText").html("You swiped " + swipeCount + " times");
+						},
+
+            excludedElements:"",
+						threshold:50
+          });
+
+          $("#test_btn").click(function() {
+            window.open("http://www.google.com");
+          });
+
+					//Assign a click handler to a child of the touchSwipe object
+					//This will require the jquery.ui.ipad.js to be picked up correctly.
+					$("#another_div").click( function(){
+						blackCount++;
+						$("#another_div").html("<h3 id='div text'>jQuery click handler fired on the black div : you clicked the black div "+
+						blackCount + " times</h3>");
+					});
+
+					function msg(target) {
+					    $("#textText").html("You tapped " + tapCount +", double tapped " +  doubleTapCount + " and long tapped " +  longTapCount + " times on " +  $(target).attr("id"));
+					}
+				});
+			</script>
+
+			<span class='title'></span>
+			<h4>events:  <span class='events'><code>tap</code>, <code>doubleTap</code>, <code>longTap</code>, <code>swipe</code></span></h4>
+			<h4>properties: <span class='properties'><code>longTapThreshold</code>, <code>doubleTapThreshold</code></span></h4>
+			<p>You can also detect if the user simply taps and does not swipe with the <code>tap</code> handler<br/><br/>
+				The <code>tap</code>, <code>doubleTap</code> and <code>longTap</code> handler are passed the original event object and the target that was clicked.
+				<br/><br/>
+				<b>See also the <a href="Hold.html"><code>hold</code></a> event for when a long tap reaches the <code>longTapThreshold</code></b>
+				<br/>
+				</p>
+				<p class="muted">If you use the jquery.ui.ipad.js plugin (http://code.google.com/p/jquery-ui-for-ipad-and-iphone/) you can then also pickup
+				standard jQuery mouse events on children of the touchSwipe object.</p>
+
+				<p>You can set the delay between taps which defines a double tap, and the length of a long tap with the <code>doubleTapThreshold</code> and <code>longTapThreshold</code> properties.</p>
+
+				<p>Note: If you assign both tap and double tap, you tap events will be delayed by the length of <code>doubleTapThreshold</code> as it waits to see if its a double before trigger the event</p>
+
+				<p class="muted"><code>tap</code> replaces the old <code>click</code> handler for naming consistency. Since the introduction of event
+				triggering as well as callbacks, the plugin cannot trigger a <code>click</code> event as it clashes with the jQ click event,
+				so both the event and callback are called <code>tap</code>. For backwards compatibility, the <code>click</code> callback will still work
+				but there is no click event. You must use the <code>tap</code> event when binding with <code>on</code> or <code>bind</code></p>
+
+
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src='code_1'></pre>
+			<span class='navigation'></span>
+
+			<div id="test" class="box">
+        <div id="textText">Swipe, Tap, Double Tap or Long Tap me</div><br/>
+        <small><a href="http://google.com" target="new">Open Google</a></small>
+        <button id="test_btn">Open Google From a button</button>
+        <div id="a_div" class="box" style="width:150px;height:50px;background:#666"><h3 id='a_div_text'>Im just a child div</h3></div>
+				<div id="another_div" class="box" style="width:200px;height:100px;background:#000"><h3>Im a child div with my own jQuery click handler</h3></div>
+			</div>
+
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 109 - 0
node_modules/jquery-touchswipe/demos/Thresholds.html

@@ -0,0 +1,109 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					$("#test").swipe( {
+						swipe:function(event, direction) {
+							$(this).text("You swiped " + direction);
+						},
+						swipeStatus:function(event, phase) {
+							if (phase=="cancel") {
+								$(this).text("You didnt swipe far enough ");
+							}
+						},
+						threshold:200
+					 });
+				});
+			</script>
+				
+			<script id='code_2'>		
+				$(function() {				
+					$("#test2").swipe( {
+						swipe:function(event, direction) {
+							$(this).text("You swiped " + direction );
+						},
+						swipeStatus:function(event, phase) {
+							if (phase=="cancel") {
+								$("#test2").text("Your swipe was too slow ");
+							}
+						},
+						maxTimeThreshold:1000,
+						threshold:null,
+						triggerOnTouchEnd:false
+					});
+				});
+			</script>
+			
+			
+			<script id='code_3'>		
+				$(function() {				
+					$("#test3").swipe( {
+						swipe:function(event, direction) {
+							$(this).text("You swiped " + direction );
+						},
+						swipeStatus:function(event, phase, direction, distance, duration, fingers) {
+							
+							$("#test3").text(" Your have swiped " + distance + " px so far");
+							
+							if(distance>200) {
+							    $("#test3").text(" Now swipe back 10px and release to cancel.. distance = " + distance + "px");
+							}
+							
+							if (phase=="cancel") {
+								$("#test3").text(" You cancelled the swipe");
+							}
+						},
+						threshold:200,
+						cancelThreshold:10
+						
+					});
+				});
+			</script>
+			
+			<span class='title'></span>
+			<h4>property: <span class='properties'><code>threshold</code></span></h4>
+			<p>By setting the <code>threshold</code> you can set how far the user must swipe before it is considered a swipe. <br/>Swipe at least 200px</p>
+			
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src="code_1"></pre>
+			<span class='navigation'></span>
+			
+			<div id="test" class="box">Swipe me for at least 200 px</div>
+			
+			<h4>property: <span class='properties'><code>cancelThreshold</code></span><h4>
+			<p>By setting the <code>cancelThreshold</code> you can set the minimum distance in px that the user needs to swipe back to cancel the current swipe, even if they have passed the main <code>threshold</code></p>
+			
+
+			<pre class="prettyprint lang-js" data-src="code_3"></pre>			
+			<div id="test3" class='box'>Swipe me for at least 200 px, then back 10px to cancel</div>
+			
+			<h4>property: <span class='properties'><code>maxTimeThreshold</code></span><h4>
+			<p>By setting the <code>maxTimeThreshold</code> you can set the maximum time the user has to complete the swipe. A swipe LONGER than this is cancelled. This can be useful for ignoring long slow swipes. <br/>Swipe in under 500ms</p>
+			
+
+			<pre class="prettyprint lang-js" data-src="code_2"></pre>			
+			<div id="test2" class='box'>Swipe me within 1000 ms</div>
+			
+
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 158 - 0
node_modules/jquery-touchswipe/demos/Trigger_handlers.html

@@ -0,0 +1,158 @@
+<!DOCTYPE HTML>
+<html>
+    <head>  
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+        <meta http-equiv="x-ua-compatible" content="IE=9">
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+        
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+        
+        <title>touchSwipe</title>
+    </head>
+    <body>
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			
+			<script id='code_1'>
+				$(function() {			
+					//Enable swiping...
+					$("#test").swipe( {
+						swipeStatus:function(event, phase, direction, distance)
+						{
+							var str = "";
+
+							if (phase=="move")
+								str="You have moved " + distance +" pixels, past 200 and the handler will fire";
+
+							if (phase=="end")
+								str="Handler fired, you swiped " + direction;
+
+							$(this).text(str);
+						},
+						triggerOnTouchEnd:false,
+						threshold:200
+					});
+				});
+			</script>
+			
+			<script id='code_2'>
+				$(function() {			
+					$("#test2").swipe( {
+						swipeStatus:function(event, phase, direction, distance, duration)
+						{
+							var str = "";
+
+							if (phase=="move")
+								str="You have moved for " + duration +" ms, If you go over 5000 the swipe will cancel";
+
+							if (phase=="cancel")
+								str="You took to long and the swipe was canceled";
+
+							if (phase=="end")
+								str="Handler fired, you swiped " + direction;
+
+							$(this).text(str);
+						},
+						triggerOnTouchEnd:false,
+						maxTimeThreshold:5000,
+						threshold:null
+					});
+				});
+			</script>
+			
+			<script id='code_3'>
+				$(function() {			
+					$("#test3").swipe( {
+						swipeStatus:function(event, phase, direction, distance, duration)
+						{
+							var str = "";
+
+							if (phase=="move")
+								str="You have moved " + distance +" px, If you leave the swipe object, the swipe will end";
+
+							if (phase=="end")
+								str="The swipe has ended"
+
+							$(this).text(str);
+						},
+						triggerOnTouchLeave:true,
+						threshold:null
+					});
+				});
+			</script>
+			
+			<script id='code_4'>
+				$(function() {			
+					$("#test4").swipe( {
+						swipeStatus:function(event, phase, direction, distance, duration)
+						{
+							var str = "";
+
+							if (phase=="move") {
+								str="You have moved " + distance +" pixels, past 200 and the handler will fire <br/>";
+								str+="You have moved for " + duration +" ms, If you go over 5000 the swipe will cancel <br/>";
+								str+="If you leave the swipe object, and have made the distance, the swipe will end <br/>";
+								str+="If you leave the swipe object, and have NOT made the distance, the swipe will cancel ";
+							}
+							
+							if (phase=="end") {
+								str="Handler fired, you met the thresholds:<br/>";
+								str+=distance+"px (over 500px required) <br/>";								
+								str+=duration+"ms (under 5000ms required) <br/>";	
+							}
+
+							if (phase=="cancel") {
+								str="You didn't meet the thresholds, cancel was fired:<br/>";
+								str+=distance+"px (over 500px required) <br/>";								
+								str+=duration+"ms (under 5000ms required) <br/>";	
+							}
+							
+							$(this).html(str);
+
+							
+						},
+						triggerOnTouchEnd:false,
+						triggerOnTouchLeave:true,
+						maxTimeThreshold:5000,
+						threshold:500
+					});
+				});
+			</script>
+	
+			<span class='title'></span>
+			<h4>properties: <span class='properties'><code>triggerOnTouchEnd</code>, <code>triggerOnTouchLeave</code></span></h4>
+			<p>With <code>triggerOnTouchEnd</code> you can trigger the <code>swipe</code> end handler either when the user releases (default) or when the user has swiped the distance / time of the thresholds (but is still swiping).</p>
+			<p>With <code>triggerOnTouchLeave</code> you can end the event if the user swipes off the element</p>
+			
+			
+			<p>Swipe below, and the swipeEnd handler will trigger when you have swiped 200 px.</p>
+			
+			<button class='btn btn-small btn-info example_btn'>Jump to Example</button>
+			<pre class="prettyprint lang-js" data-src="code_1"></pre>		
+			<script>getNavigation();</script>
+			<div id="test" class="box">Swipe over 200px and the swipe event will fire</div>
+			
+			<pre class="prettyprint lang-js" data-src="code_2"></pre>
+			<span class='navigation'></span>
+					
+			<div id="test2" class="box">Swipe in under 5000ms and the swipe event will fire</div>
+			
+			<pre class="prettyprint lang-js" data-src="code_3"></pre>
+			<span class='navigation'></span>
+			
+			<div id="test3" class="box">Swipe out of this box and the swipe event will end</div>
+			
+			<pre class="prettyprint lang-js" data-src="code_4"></pre>
+			<span class='navigation'></span>
+			
+			<div id="test4" class="box">Time, distance and trigger on END and trigger on Leave set..</div>
+			
+			<span class='navigation'></span>
+		</div>
+   </body>
+</html>

+ 110 - 0
node_modules/jquery-touchswipe/demos/css/main.css

@@ -0,0 +1,110 @@
+.pagination
+{
+	width:100%;
+	margin-top:20px;
+	margin-bottom:20px;
+}
+
+.clear
+{
+	clear:both;
+}
+
+.pagination a
+{
+	font-size: 12px;
+	line-height: 18px;
+}
+
+.container
+{
+	max-width:768px;
+	margin-bottom:20px;
+}
+
+.box
+{
+	margin-top:20px;
+	margin-bottom:20px;
+	max-width:768px;
+	height:300px;
+	
+	padding: 10px;
+	background-color: #EEE;
+	-webkit-border-radius: 6px;
+	-moz-border-radius: 6px;
+	border-radius: 6px;
+	
+	text-align:center;
+	font-weight: 300;
+	font-size: 20px;
+	line-height: 36px;
+	
+	overflow:hidden;
+}
+
+body
+{
+	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+	font-size: 13px;
+	line-height: 18px;
+	color: #333;
+}
+
+h1
+{
+	margin-top:36px;
+	margin-bottom:5px;
+}
+
+h2
+{
+	font-size: 30px;
+	line-height: 36px;
+	font-weight: 300;
+	margin-bottom:0px;
+
+}
+
+h3
+{
+	margin-top:0px;
+	font-size: 18px;
+	line-height: 24px;
+	font-weight: 300;
+	color:#999;
+}
+
+h4
+{
+	margin-top:0px;
+	font-size: 12px;
+	line-height: 24px;
+	font-weight: 300;
+	color:#333;
+}
+
+a
+{
+	text-decoration:none;
+	color:#333;	
+}
+
+p {
+	margin-top:10px;
+}
+
+.prettyprint {
+	font-size:10px;
+}
+
+.example_btn {
+	margin-bottom:10px;
+}
+
+.properties code,
+.methods code,
+.events code {
+	cursor: pointer;
+	text-decoration: underline;
+}

+ 74 - 0
node_modules/jquery-touchswipe/demos/index.html

@@ -0,0 +1,74 @@
+<!DOCTYPE HTML>
+<html>
+    <head>
+        <meta name="viewport" content="width=device-width, initial-scale=1.0, minimum-scale=1.0, maximum-scale=1.0, user-scalable=no"/>
+
+        <link href="http://netdna.bootstrapcdn.com/twitter-bootstrap/2.2.2/css/bootstrap-combined.min.css" rel="stylesheet">
+        <link href="http://twitter.github.com/bootstrap/assets/js/google-code-prettify/prettify.css" rel="stylesheet" />
+        <link href="css/main.css" type="text/css" rel="stylesheet" />
+
+        <script type="text/javascript" src="https://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
+        <script type="text/javascript" src="https://google-code-prettify.googlecode.com/svn/loader/run_prettify.js"></script>
+        <script type="text/javascript" src="../jquery.touchSwipe.js"></script>
+        <script type="text/javascript" src="js/main.js"></script>
+
+        <title>touchSwipe</title>
+
+		<script type="text/javascript">
+			//Google analyitics
+			 var _gaq = _gaq || [];
+			  _gaq.push(['_setAccount', 'UA-19862780-3']);
+			  _gaq.push(['_trackPageview']);
+
+			  (function() {
+				var ga = document.createElement('script'); ga.type = 'text/javascript'; ga.async = true;
+				ga.src = ('https:' == document.location.protocol ? 'https://ssl' : 'http://www') + '.google-analytics.com/ga.js';
+				var s = document.getElementsByTagName('script')[0]; s.parentNode.insertBefore(ga, s);
+			  })();
+
+		</script>
+
+	</head>
+	<body>
+
+		<a href="https://github.com/mattbryson"><img style="position: absolute; top: 0; right: 0; border: 0;" src="https://s3.amazonaws.com/github/ribbons/forkme_right_white_ffffff.png" alt="Fork me on GitHub"></a>
+		<div class="container">
+			<div class="page-header">
+			  <h1>TouchSwipe <small>a jQuery plugin for touch devices</small></h1>
+			  <br/>
+			  <iframe src="http://www.facebook.com/plugins/like.php?href=http%3A%2F%2Flabs.skinkers.com%2FtouchSwipe%2F&amp;layout=standard&amp;show_faces=true&amp;width=450&amp;action=like&amp;font&amp;colorscheme=light&amp;height=80" scrolling="no" frameborder="0" style="border:none; overflow:hidden; width:450px; height:80px;" allowTransparency="true"></iframe>
+				<p>TouchSwipe is a jquery plugin to be used with jQuery on touch input devices such as iPad, iPhone etc.</p>
+			</div>
+
+			<h1>Features</h1>
+			<ul>
+				<li>Detects swipes in 4 directions, "up", "down", "left" and "right"</li>
+				<li>Detects pinches "in" and "out"</li>
+				<li>Supports single finger or double finger touch events</li>
+				<li>Supports click events both on the touchSwipe object and its child objects</li>
+				<li>Definable threshold / maxTimeThreshold to determin when a gesture is actually a swipe</li>
+				<li>Events triggered for swipe "start","move","end" and "cancel"</li>
+				<li>End event can be triggered either on touch release, or as soon as threshold is met</li>
+				<li>Allows swiping and page scrolling</li>
+				<li>Disables user input elements (Button, form, text etc) from triggering swipes</li>
+
+			</ul>
+
+			<h1>Docs</h1>
+			<ul>
+				<li><a href='../docs' target='docs'>Plugin Documentation</a></li>
+			</ul>
+
+			<h1>Options</h1>
+			<ul>
+				<li>See the defaults page in the documentation:  			<a href='../docs/%24.fn.swipe.defaults.html' target='docs'>$.fn.swipe.defaults</a></li>
+			</ul>
+
+			<h1>Demos</h1>
+			<span class='navigation_list'></span>
+
+
+		</div>
+		<hr/>
+	</body>
+</html>

+ 223 - 0
node_modules/jquery-touchswipe/demos/js/jquery.ui.ipad.js

@@ -0,0 +1,223 @@
+/**
+* jQuery.UI.iPad plugin
+* Copyright (c) 2010 Stephen von Takach
+* licensed under MIT.
+* Date: 27/8/2010
+*
+* Project Home: 
+* http://code.google.com/p/jquery-ui-for-ipad-and-iphone/
+*/
+
+
+$(function() {
+	//
+	// Extend jQuery feature detection
+	//
+	$.extend($.support, {
+		touch: typeof Touch == "object"
+	});
+	
+	//
+	// Hook up touch events
+	//
+	if ($.support.touch) {
+		document.addEventListener("touchstart", iPadTouchHandler, false);
+		document.addEventListener("touchmove", iPadTouchHandler, false);
+		document.addEventListener("touchend", iPadTouchHandler, false);
+		document.addEventListener("touchcancel", iPadTouchHandler, false);
+	}
+});
+
+
+var lastTap = null;			// Holds last tapped element (so we can compare for double tap)
+var tapValid = false;			// Are we still in the .6 second window where a double tap can occur
+var tapTimeout = null;			// The timeout reference
+
+function cancelTap() {
+	tapValid = false;
+}
+
+
+var rightClickPending = false;	// Is a right click still feasible
+var rightClickEvent = null;		// the original event
+var holdTimeout = null;			// timeout reference
+var cancelMouseUp = false;		// prevents a click from occuring as we want the context menu
+
+
+function cancelHold() {
+	if (rightClickPending) {
+		window.clearTimeout(holdTimeout);
+		rightClickPending = false;
+		rightClickEvent = null;
+	}
+}
+
+function startHold(event) {
+	if (rightClickPending)
+		return;
+
+	rightClickPending = true; // We could be performing a right click
+	rightClickEvent = (event.changedTouches)[0];
+	holdTimeout = window.setTimeout("doRightClick();", 800);
+}
+
+
+function doRightClick() {
+	rightClickPending = false;
+
+	//
+	// We need to mouse up (as we were down)
+	//
+	var first = rightClickEvent,
+		simulatedEvent = document.createEvent("MouseEvent");
+	simulatedEvent.initMouseEvent("mouseup", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+			false, false, false, false, 0, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+	//
+	// emulate a right click
+	//
+	simulatedEvent = document.createEvent("MouseEvent");
+	simulatedEvent.initMouseEvent("mousedown", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+			false, false, false, false, 2, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+	//
+	// Show a context menu
+	//
+	simulatedEvent = document.createEvent("MouseEvent");
+	simulatedEvent.initMouseEvent("contextmenu", true, true, window, 1, first.screenX + 50, first.screenY + 5, first.clientX + 50, first.clientY + 5,
+                                  false, false, false, false, 2, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+
+	//
+	// Note:: I don't mouse up the right click here however feel free to add if required
+	//
+
+
+	cancelMouseUp = true;
+	rightClickEvent = null; // Release memory
+}
+
+
+//
+// mouse over event then mouse down
+//
+function iPadTouchStart(event) {
+	var touches = event.changedTouches,
+		first = touches[0],
+		type = "mouseover",
+		simulatedEvent = document.createEvent("MouseEvent");
+	//
+	// Mouse over first - I have live events attached on mouse over
+	//
+	simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, 0, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+	type = "mousedown";
+	simulatedEvent = document.createEvent("MouseEvent");
+
+	simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, 0, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+
+	if (!tapValid) {
+		lastTap = first.target;
+		tapValid = true;
+		tapTimeout = window.setTimeout("cancelTap();", 600);
+		startHold(event);
+	}
+	else {
+		window.clearTimeout(tapTimeout);
+
+		//
+		// If a double tap is still a possibility and the elements are the same
+		//	Then perform a double click
+		//
+		if (first.target == lastTap) {
+			lastTap = null;
+			tapValid = false;
+
+			type = "click";
+			simulatedEvent = document.createEvent("MouseEvent");
+
+			simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                         	false, false, false, false, 0/*left*/, null);
+			first.target.dispatchEvent(simulatedEvent);
+
+			type = "dblclick";
+			simulatedEvent = document.createEvent("MouseEvent");
+
+			simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                         	false, false, false, false, 0/*left*/, null);
+			first.target.dispatchEvent(simulatedEvent);
+		}
+		else {
+			lastTap = first.target;
+			tapValid = true;
+			tapTimeout = window.setTimeout("cancelTap();", 600);
+			startHold(event);
+		}
+	}
+}
+
+function iPadTouchHandler(event) {
+	var type = "",
+		button = 0; /*left*/
+
+	if (event.touches.length > 1)
+		return;
+
+	switch (event.type) {
+		case "touchstart":
+			if ($(event.changedTouches[0].target).is("select")) {
+				return;
+			}
+			iPadTouchStart(event); /*We need to trigger two events here to support one touch drag and drop*/
+			event.preventDefault();
+			return false;
+			break;
+
+		case "touchmove":
+			cancelHold();
+			type = "mousemove";
+			event.preventDefault();
+			break;
+
+		case "touchend":
+			if (cancelMouseUp) {
+				cancelMouseUp = false;
+				event.preventDefault();
+				return false;
+			}
+			cancelHold();
+			type = "mouseup";
+			break;
+
+		default:
+			return;
+	}
+
+	var touches = event.changedTouches,
+		first = touches[0],
+		simulatedEvent = document.createEvent("MouseEvent");
+
+	simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, button, null);
+
+	first.target.dispatchEvent(simulatedEvent);
+
+	if (type == "mouseup" && tapValid && first.target == lastTap) {	// This actually emulates the ipads default behaviour (which we prevented)
+		simulatedEvent = document.createEvent("MouseEvent");		// This check avoids click being emulated on a double tap
+
+		simulatedEvent.initMouseEvent("click", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, button, null);
+
+		first.target.dispatchEvent(simulatedEvent);
+	}
+}
+
+

+ 240 - 0
node_modules/jquery-touchswipe/demos/js/main.js

@@ -0,0 +1,240 @@
+String.prototype.trim = function() {
+    return this.replace(/^\s+|\s+$/g,"");
+}
+String.prototype.trimLeft = function() {
+    return this.replace(/^\s+/,"");
+}
+String.prototype.trimRight = function() {
+    return this.replace(/\s+$/,"");
+}
+
+
+//Demos file list (in order of presentation)
+//THe page name is formed from the file name.
+var fileList = [
+	'Basic_swipe.html',
+	'Single_swipe.html',
+	'Any_finger_swipe.html',
+	'Finger_swipe.html',
+	'Swipe_status.html',
+	'Pinch.html',
+	'Pinch_status.html',
+	'Pinch_and_Swipe.html',
+	'Trigger_handlers.html',
+	'Stop_propagation.html',
+	'Handlers_and_events.html',
+	'Tap_vs_swipe.html',
+	'Hold.html',
+	'Excluded_children.html',
+	'Page_zoom.html',
+	'Thresholds.html',
+	'Enable_and_destroy.html',
+	'Page_scrolling.html',
+	'Options.html',
+	'Image_gallery_example.html'
+];
+
+
+/**
+ * Builds the demo page
+ */
+function init() {
+	buildTitle();
+	buildCodeExample();
+	buildNavigation();
+}
+
+/**
+ * Creates the navigation components
+ */
+function buildNavigation() {
+	$('.navigation').each(function( index ) {
+		$(this).html( getNavigation() );
+	});
+
+	$('.navigation_menu').each(function( index ) {
+		$(this).html( getNavigationMenu() );
+	})
+
+	$('.navigation_list').each(function( index ) {
+		$(this).html( getNavigationList() );
+	})
+
+
+	$('#menu').change( function() {
+		location.href=$(this).val();
+	});
+
+	$('#menu li').click( function() {
+		location.href=$(this).val();
+	});
+
+	$('.example_btn').click( function() {
+		$(document).scrollTop( $("#test").offset().top );
+	});
+
+	$('.events code').click( function() {
+		location.href = '../docs/%24.fn.swipe.html#event:' + $(this).text();
+	});
+
+	$('.properties code').click( function() {
+		location.href = '../docs/%24.fn.swipe.defaults.html#' + $(this).text();
+	});
+
+	$('.methods code').click( function() {
+		location.href = '../docs/%24.fn.swipe.html#' + $(this).text();
+	});
+}
+
+/**
+ * Builds the title element
+ */
+function buildTitle() {
+	$('.title').each(function( index ) {
+		$(this).html( getTitle() );
+	})
+}
+
+/**
+ * Copies the <script> tag contents, and populates the demo pretty print div to display the
+ * code example.
+ */
+function buildCodeExample() {
+
+	$('.prettyprint').each(function( index ) {
+
+  		//$(this).text( $("#"+$(this).attr('data-src')).html() );
+
+  		var src = $("#"+$(this).attr('data-src')).html();
+  		if(src) {
+			var lines = src.split("\n");
+			var trimedLines=[];
+			var trimIndex=null;
+			for (var i=0; i<lines.length; i++) {
+				var line = lines[i];
+				if(trimIndex===null) {
+					var trimmed = line.trimLeft();
+					if(line.length>0) {
+						trimIndex = line.length - trimmed.length;
+					}
+				}
+
+				if(line.length>0) {
+					//Tabs to spaces
+					line = line.replace(/\t/g, '  '); //not using $nbsp; as we want to display HTML tags, so we set the text value, not html
+					trimedLines.push( line.substr(trimIndex) );
+				}
+
+			};
+
+			var html = trimedLines.join("\n");
+
+
+			 $(this).text( html );
+		}
+
+  	});
+
+
+  	//prettyPrint();
+}
+
+/**
+ * Returns the current file being viewed.
+ */
+function getCurrentFile() {
+	var url = window.location.pathname;
+    var file = url.substring(url.lastIndexOf('/')+1);
+
+    return file;
+}
+
+/**
+ * Returns the current page name
+ */
+function getPageName( file ) {
+
+    if(!file)
+    	file=getCurrentFile();
+
+    var fileTokens = file.split("_");
+    var fileName = fileTokens.join(" ");
+    var nameTokens = fileName.split(".");
+    nameTokens.pop();
+
+    var name = nameTokens.join(" ");
+
+    return name;
+}
+
+
+
+/**
+ * Writes out the page title template
+ */
+function getTitle() {
+	var html =  "<h2><a href=\"http://labs.rampinteractive.co.uk/touchSwipe/\">TouchSwipe</a> Demo</h2>";
+        html += "<h3>to be viewed on touch based devices</h3>";
+        html += "<h1>"+getPageName()+"<span class='navigation_menu pull-right'></span></h1>";
+
+    return html;
+}
+
+/**
+ * Returns HTML mark up for the pagination buttons
+ */
+function getNavigation() {
+	var index = fileList.indexOf( getCurrentFile() );
+	var html ="<div class='pagination'>";
+
+	if(index>0) {
+		html += "<a class='pull-left btn' href='"+fileList[index-1]+"'><< "+getPageName(fileList[index-1])+"</a>";
+	}
+
+	if(index<fileList.length-1) {
+		html += "<a class='pull-right btn' href='"+fileList[index+1]+"'>"+getPageName(fileList[index+1])+" >></a>";
+	}
+
+	html += "</div><div class='clear'></div>"
+	return html;
+}
+
+/**
+ * Returns HTML mark up for the drop down menu
+ */
+function getNavigationMenu() {
+
+	var html = "<select id='menu' class='pull_right'>";
+
+	for(var i=0; i<fileList.length; i++) {
+		var selected="";
+		if(fileList[i] == getCurrentFile()) {
+			selected=' selected ';
+		}
+		html+="<option value='"+fileList[i]+"'"+selected+">"+getPageName(fileList[i])+"</option>";
+	}
+
+	html += "</select>";
+
+	return html;
+}
+
+/**
+ * Returns HTML mark up for the list menu
+ */
+function getNavigationList() {
+
+	var html = "<ul>";
+
+	for(var i=0; i<fileList.length; i++) {
+		html+="<li><a href='"+fileList[i]+"'>"+getPageName(fileList[i])+"</a></li>";
+	}
+
+	html += "</ul>";
+
+	return html;
+}
+
+$(function() {
+	init();
+});

+ 22 - 0
node_modules/jquery-touchswipe/demos/tutorials.json

@@ -0,0 +1,22 @@
+{
+  "Basic_swipe" : {"title":"Basic swipe"},
+  "Single_swipe" : {"title":"Single swipe"},
+  "Any_finger_swipe" : {"title":"Any finger swipe"},
+  "Finger_swipe" : {"title":"Finger swipe"},
+  "Swipe_status" : {"title":"Swipe status"},
+  "Pinch" : {"title":"Pinch"},
+  "Pinch_status" : {"title":"Pinch status"},
+  "Pinch_and_Swipe" : {"title":"Pinch and Swipe"},
+  "Trigger_handlers" : {"title":"Trigger handlers"},
+  "Stop_propagation" : {"title":"Stop propagation"},
+  "Handlers_and_events" : {"title":"Handlers and events"},
+  "Tap_vs_swipe" : {"title":"Tap vs swipe"},
+  "Hold" : {"title":"Hold"},
+  "Excluded_children" : {"title":"Excluded children"},
+  "Page_zoom" : {"title":"Page zoom"},
+  "Thresholds" : {"title":"Thresholds"},
+  "Enable_and_destroy" : {"title":"Enable and destroy"},
+  "Page_scrolling" : {"title":"Page scrolling"},
+  "Options" : {"title":"Options"},
+  "Image_gallery_example" : {"title":"Image gallery example"}
+}

File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.fn.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.fn.swipe.defaults.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.fn.swipe.directions.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.fn.swipe.fingers.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.fn.swipe.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.fn.swipe.pageScroll.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.fn.swipe.phases.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/$.html


+ 110 - 0
node_modules/jquery-touchswipe/docs/css/main.css

@@ -0,0 +1,110 @@
+.pagination
+{
+	width:100%;
+	margin-top:20px;
+	margin-bottom:20px;
+}
+
+.clear
+{
+	clear:both;
+}
+
+.pagination a
+{
+	font-size: 12px;
+	line-height: 18px;
+}
+
+.container
+{
+	max-width:768px;
+	margin-bottom:20px;
+}
+
+.box
+{
+	margin-top:20px;
+	margin-bottom:20px;
+	max-width:768px;
+	height:300px;
+	
+	padding: 10px;
+	background-color: #EEE;
+	-webkit-border-radius: 6px;
+	-moz-border-radius: 6px;
+	border-radius: 6px;
+	
+	text-align:center;
+	font-weight: 300;
+	font-size: 20px;
+	line-height: 36px;
+	
+	overflow:hidden;
+}
+
+body
+{
+	font-family: "Helvetica Neue", Helvetica, Arial, sans-serif;
+	font-size: 13px;
+	line-height: 18px;
+	color: #333;
+}
+
+h1
+{
+	margin-top:36px;
+	margin-bottom:5px;
+}
+
+h2
+{
+	font-size: 30px;
+	line-height: 36px;
+	font-weight: 300;
+	margin-bottom:0px;
+
+}
+
+h3
+{
+	margin-top:0px;
+	font-size: 18px;
+	line-height: 24px;
+	font-weight: 300;
+	color:#999;
+}
+
+h4
+{
+	margin-top:0px;
+	font-size: 12px;
+	line-height: 24px;
+	font-weight: 300;
+	color:#333;
+}
+
+a
+{
+	text-decoration:none;
+	color:#333;	
+}
+
+p {
+	margin-top:10px;
+}
+
+.prettyprint {
+	font-size:10px;
+}
+
+.example_btn {
+	margin-bottom:10px;
+}
+
+.properties code,
+.methods code,
+.events code {
+	cursor: pointer;
+	text-decoration: underline;
+}

File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/index.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/jquery.touchSwipe.js.html


+ 223 - 0
node_modules/jquery-touchswipe/docs/js/jquery.ui.ipad.js

@@ -0,0 +1,223 @@
+/**
+* jQuery.UI.iPad plugin
+* Copyright (c) 2010 Stephen von Takach
+* licensed under MIT.
+* Date: 27/8/2010
+*
+* Project Home: 
+* http://code.google.com/p/jquery-ui-for-ipad-and-iphone/
+*/
+
+
+$(function() {
+	//
+	// Extend jQuery feature detection
+	//
+	$.extend($.support, {
+		touch: typeof Touch == "object"
+	});
+	
+	//
+	// Hook up touch events
+	//
+	if ($.support.touch) {
+		document.addEventListener("touchstart", iPadTouchHandler, false);
+		document.addEventListener("touchmove", iPadTouchHandler, false);
+		document.addEventListener("touchend", iPadTouchHandler, false);
+		document.addEventListener("touchcancel", iPadTouchHandler, false);
+	}
+});
+
+
+var lastTap = null;			// Holds last tapped element (so we can compare for double tap)
+var tapValid = false;			// Are we still in the .6 second window where a double tap can occur
+var tapTimeout = null;			// The timeout reference
+
+function cancelTap() {
+	tapValid = false;
+}
+
+
+var rightClickPending = false;	// Is a right click still feasible
+var rightClickEvent = null;		// the original event
+var holdTimeout = null;			// timeout reference
+var cancelMouseUp = false;		// prevents a click from occuring as we want the context menu
+
+
+function cancelHold() {
+	if (rightClickPending) {
+		window.clearTimeout(holdTimeout);
+		rightClickPending = false;
+		rightClickEvent = null;
+	}
+}
+
+function startHold(event) {
+	if (rightClickPending)
+		return;
+
+	rightClickPending = true; // We could be performing a right click
+	rightClickEvent = (event.changedTouches)[0];
+	holdTimeout = window.setTimeout("doRightClick();", 800);
+}
+
+
+function doRightClick() {
+	rightClickPending = false;
+
+	//
+	// We need to mouse up (as we were down)
+	//
+	var first = rightClickEvent,
+		simulatedEvent = document.createEvent("MouseEvent");
+	simulatedEvent.initMouseEvent("mouseup", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+			false, false, false, false, 0, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+	//
+	// emulate a right click
+	//
+	simulatedEvent = document.createEvent("MouseEvent");
+	simulatedEvent.initMouseEvent("mousedown", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+			false, false, false, false, 2, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+	//
+	// Show a context menu
+	//
+	simulatedEvent = document.createEvent("MouseEvent");
+	simulatedEvent.initMouseEvent("contextmenu", true, true, window, 1, first.screenX + 50, first.screenY + 5, first.clientX + 50, first.clientY + 5,
+                                  false, false, false, false, 2, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+
+	//
+	// Note:: I don't mouse up the right click here however feel free to add if required
+	//
+
+
+	cancelMouseUp = true;
+	rightClickEvent = null; // Release memory
+}
+
+
+//
+// mouse over event then mouse down
+//
+function iPadTouchStart(event) {
+	var touches = event.changedTouches,
+		first = touches[0],
+		type = "mouseover",
+		simulatedEvent = document.createEvent("MouseEvent");
+	//
+	// Mouse over first - I have live events attached on mouse over
+	//
+	simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, 0, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+	type = "mousedown";
+	simulatedEvent = document.createEvent("MouseEvent");
+
+	simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, 0, null);
+	first.target.dispatchEvent(simulatedEvent);
+
+
+	if (!tapValid) {
+		lastTap = first.target;
+		tapValid = true;
+		tapTimeout = window.setTimeout("cancelTap();", 600);
+		startHold(event);
+	}
+	else {
+		window.clearTimeout(tapTimeout);
+
+		//
+		// If a double tap is still a possibility and the elements are the same
+		//	Then perform a double click
+		//
+		if (first.target == lastTap) {
+			lastTap = null;
+			tapValid = false;
+
+			type = "click";
+			simulatedEvent = document.createEvent("MouseEvent");
+
+			simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                         	false, false, false, false, 0/*left*/, null);
+			first.target.dispatchEvent(simulatedEvent);
+
+			type = "dblclick";
+			simulatedEvent = document.createEvent("MouseEvent");
+
+			simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                         	false, false, false, false, 0/*left*/, null);
+			first.target.dispatchEvent(simulatedEvent);
+		}
+		else {
+			lastTap = first.target;
+			tapValid = true;
+			tapTimeout = window.setTimeout("cancelTap();", 600);
+			startHold(event);
+		}
+	}
+}
+
+function iPadTouchHandler(event) {
+	var type = "",
+		button = 0; /*left*/
+
+	if (event.touches.length > 1)
+		return;
+
+	switch (event.type) {
+		case "touchstart":
+			if ($(event.changedTouches[0].target).is("select")) {
+				return;
+			}
+			iPadTouchStart(event); /*We need to trigger two events here to support one touch drag and drop*/
+			event.preventDefault();
+			return false;
+			break;
+
+		case "touchmove":
+			cancelHold();
+			type = "mousemove";
+			event.preventDefault();
+			break;
+
+		case "touchend":
+			if (cancelMouseUp) {
+				cancelMouseUp = false;
+				event.preventDefault();
+				return false;
+			}
+			cancelHold();
+			type = "mouseup";
+			break;
+
+		default:
+			return;
+	}
+
+	var touches = event.changedTouches,
+		first = touches[0],
+		simulatedEvent = document.createEvent("MouseEvent");
+
+	simulatedEvent.initMouseEvent(type, true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, button, null);
+
+	first.target.dispatchEvent(simulatedEvent);
+
+	if (type == "mouseup" && tapValid && first.target == lastTap) {	// This actually emulates the ipads default behaviour (which we prevented)
+		simulatedEvent = document.createEvent("MouseEvent");		// This check avoids click being emulated on a double tap
+
+		simulatedEvent.initMouseEvent("click", true, true, window, 1, first.screenX, first.screenY, first.clientX, first.clientY,
+                            false, false, false, false, button, null);
+
+		first.target.dispatchEvent(simulatedEvent);
+	}
+}
+
+

+ 85 - 0
node_modules/jquery-touchswipe/docs/js/main.js

@@ -0,0 +1,85 @@
+
+
+/**
+ * Builds the demo page
+ */
+function init() {
+	buildCodeExample();
+	buildNavigation();
+}
+
+/**
+ * Creates the navigation components
+ */
+function buildNavigation() {
+
+
+	$('.example_btn').click( function() {
+		$(document).scrollTop( $("#test").offset().top );
+	});
+
+	$('.events code').click( function() {
+		location.href = '../docs/%24.fn.swipe.html#event:' + $(this).text();
+	});
+
+	$('.properties code').click( function() {
+		location.href = '../docs/%24.fn.swipe.defaults.html#' + $(this).text();
+	});
+
+	$('.methods code').click( function() {
+		location.href = '../docs/%24.fn.swipe.html#' + $(this).text();
+	});
+}
+
+
+
+/**
+ * Copies the <script> tag contents, and populates the demo pretty print div to display the
+ * code example.
+ */
+function buildCodeExample() {
+
+	$('.prettyprint').each(function( index ) {
+
+  		//$(this).text( $("#"+$(this).attr('data-src')).html() );
+
+  		var src = $("#"+$(this).attr('data-src')).html();
+  		if(src) {
+			var lines = src.split("\n");
+			var trimedLines=[];
+			var trimIndex=null;
+			for (var i=0; i<lines.length; i++) {
+				var line = lines[i];
+				if(trimIndex===null) {
+					var trimmed = line.trimLeft();
+					if(line.length>0) {
+						trimIndex = line.length - trimmed.length;
+					}
+				}
+
+				if(line.length>0) {
+					//Tabs to spaces
+					line = line.replace(/\t/g, '  '); //not using $nbsp; as we want to display HTML tags, so we set the text value, not html
+					trimedLines.push( line.substr(trimIndex) );
+				}
+
+			};
+
+			var html = trimedLines.join("\n");
+
+
+			 $(this).text( html );
+		}
+
+  	});
+
+
+  	//prettyPrint();
+}
+
+
+
+
+$(function() {
+	init();
+});

+ 25 - 0
node_modules/jquery-touchswipe/docs/scripts/linenumber.js

@@ -0,0 +1,25 @@
+/*global document */
+(function() {
+    var source = document.getElementsByClassName('prettyprint source linenums');
+    var i = 0;
+    var lineNumber = 0;
+    var lineId;
+    var lines;
+    var totalLines;
+    var anchorHash;
+
+    if (source && source[0]) {
+        anchorHash = document.location.hash.substring(1);
+        lines = source[0].getElementsByTagName('li');
+        totalLines = lines.length;
+
+        for (; i < totalLines; i++) {
+            lineNumber++;
+            lineId = 'line' + lineNumber;
+            lines[i].id = lineId;
+            if (lineId === anchorHash) {
+                lines[i].className += ' selected';
+            }
+        }
+    }
+})();

+ 202 - 0
node_modules/jquery-touchswipe/docs/scripts/prettify/Apache-License-2.0.txt

@@ -0,0 +1,202 @@
+
+                                 Apache License
+                           Version 2.0, January 2004
+                        http://www.apache.org/licenses/
+
+   TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
+
+   1. Definitions.
+
+      "License" shall mean the terms and conditions for use, reproduction,
+      and distribution as defined by Sections 1 through 9 of this document.
+
+      "Licensor" shall mean the copyright owner or entity authorized by
+      the copyright owner that is granting the License.
+
+      "Legal Entity" shall mean the union of the acting entity and all
+      other entities that control, are controlled by, or are under common
+      control with that entity. For the purposes of this definition,
+      "control" means (i) the power, direct or indirect, to cause the
+      direction or management of such entity, whether by contract or
+      otherwise, or (ii) ownership of fifty percent (50%) or more of the
+      outstanding shares, or (iii) beneficial ownership of such entity.
+
+      "You" (or "Your") shall mean an individual or Legal Entity
+      exercising permissions granted by this License.
+
+      "Source" form shall mean the preferred form for making modifications,
+      including but not limited to software source code, documentation
+      source, and configuration files.
+
+      "Object" form shall mean any form resulting from mechanical
+      transformation or translation of a Source form, including but
+      not limited to compiled object code, generated documentation,
+      and conversions to other media types.
+
+      "Work" shall mean the work of authorship, whether in Source or
+      Object form, made available under the License, as indicated by a
+      copyright notice that is included in or attached to the work
+      (an example is provided in the Appendix below).
+
+      "Derivative Works" shall mean any work, whether in Source or Object
+      form, that is based on (or derived from) the Work and for which the
+      editorial revisions, annotations, elaborations, or other modifications
+      represent, as a whole, an original work of authorship. For the purposes
+      of this License, Derivative Works shall not include works that remain
+      separable from, or merely link (or bind by name) to the interfaces of,
+      the Work and Derivative Works thereof.
+
+      "Contribution" shall mean any work of authorship, including
+      the original version of the Work and any modifications or additions
+      to that Work or Derivative Works thereof, that is intentionally
+      submitted to Licensor for inclusion in the Work by the copyright owner
+      or by an individual or Legal Entity authorized to submit on behalf of
+      the copyright owner. For the purposes of this definition, "submitted"
+      means any form of electronic, verbal, or written communication sent
+      to the Licensor or its representatives, including but not limited to
+      communication on electronic mailing lists, source code control systems,
+      and issue tracking systems that are managed by, or on behalf of, the
+      Licensor for the purpose of discussing and improving the Work, but
+      excluding communication that is conspicuously marked or otherwise
+      designated in writing by the copyright owner as "Not a Contribution."
+
+      "Contributor" shall mean Licensor and any individual or Legal Entity
+      on behalf of whom a Contribution has been received by Licensor and
+      subsequently incorporated within the Work.
+
+   2. Grant of Copyright License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      copyright license to reproduce, prepare Derivative Works of,
+      publicly display, publicly perform, sublicense, and distribute the
+      Work and such Derivative Works in Source or Object form.
+
+   3. Grant of Patent License. Subject to the terms and conditions of
+      this License, each Contributor hereby grants to You a perpetual,
+      worldwide, non-exclusive, no-charge, royalty-free, irrevocable
+      (except as stated in this section) patent license to make, have made,
+      use, offer to sell, sell, import, and otherwise transfer the Work,
+      where such license applies only to those patent claims licensable
+      by such Contributor that are necessarily infringed by their
+      Contribution(s) alone or by combination of their Contribution(s)
+      with the Work to which such Contribution(s) was submitted. If You
+      institute patent litigation against any entity (including a
+      cross-claim or counterclaim in a lawsuit) alleging that the Work
+      or a Contribution incorporated within the Work constitutes direct
+      or contributory patent infringement, then any patent licenses
+      granted to You under this License for that Work shall terminate
+      as of the date such litigation is filed.
+
+   4. Redistribution. You may reproduce and distribute copies of the
+      Work or Derivative Works thereof in any medium, with or without
+      modifications, and in Source or Object form, provided that You
+      meet the following conditions:
+
+      (a) You must give any other recipients of the Work or
+          Derivative Works a copy of this License; and
+
+      (b) You must cause any modified files to carry prominent notices
+          stating that You changed the files; and
+
+      (c) You must retain, in the Source form of any Derivative Works
+          that You distribute, all copyright, patent, trademark, and
+          attribution notices from the Source form of the Work,
+          excluding those notices that do not pertain to any part of
+          the Derivative Works; and
+
+      (d) If the Work includes a "NOTICE" text file as part of its
+          distribution, then any Derivative Works that You distribute must
+          include a readable copy of the attribution notices contained
+          within such NOTICE file, excluding those notices that do not
+          pertain to any part of the Derivative Works, in at least one
+          of the following places: within a NOTICE text file distributed
+          as part of the Derivative Works; within the Source form or
+          documentation, if provided along with the Derivative Works; or,
+          within a display generated by the Derivative Works, if and
+          wherever such third-party notices normally appear. The contents
+          of the NOTICE file are for informational purposes only and
+          do not modify the License. You may add Your own attribution
+          notices within Derivative Works that You distribute, alongside
+          or as an addendum to the NOTICE text from the Work, provided
+          that such additional attribution notices cannot be construed
+          as modifying the License.
+
+      You may add Your own copyright statement to Your modifications and
+      may provide additional or different license terms and conditions
+      for use, reproduction, or distribution of Your modifications, or
+      for any such Derivative Works as a whole, provided Your use,
+      reproduction, and distribution of the Work otherwise complies with
+      the conditions stated in this License.
+
+   5. Submission of Contributions. Unless You explicitly state otherwise,
+      any Contribution intentionally submitted for inclusion in the Work
+      by You to the Licensor shall be under the terms and conditions of
+      this License, without any additional terms or conditions.
+      Notwithstanding the above, nothing herein shall supersede or modify
+      the terms of any separate license agreement you may have executed
+      with Licensor regarding such Contributions.
+
+   6. Trademarks. This License does not grant permission to use the trade
+      names, trademarks, service marks, or product names of the Licensor,
+      except as required for reasonable and customary use in describing the
+      origin of the Work and reproducing the content of the NOTICE file.
+
+   7. Disclaimer of Warranty. Unless required by applicable law or
+      agreed to in writing, Licensor provides the Work (and each
+      Contributor provides its Contributions) on an "AS IS" BASIS,
+      WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
+      implied, including, without limitation, any warranties or conditions
+      of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
+      PARTICULAR PURPOSE. You are solely responsible for determining the
+      appropriateness of using or redistributing the Work and assume any
+      risks associated with Your exercise of permissions under this License.
+
+   8. Limitation of Liability. In no event and under no legal theory,
+      whether in tort (including negligence), contract, or otherwise,
+      unless required by applicable law (such as deliberate and grossly
+      negligent acts) or agreed to in writing, shall any Contributor be
+      liable to You for damages, including any direct, indirect, special,
+      incidental, or consequential damages of any character arising as a
+      result of this License or out of the use or inability to use the
+      Work (including but not limited to damages for loss of goodwill,
+      work stoppage, computer failure or malfunction, or any and all
+      other commercial damages or losses), even if such Contributor
+      has been advised of the possibility of such damages.
+
+   9. Accepting Warranty or Additional Liability. While redistributing
+      the Work or Derivative Works thereof, You may choose to offer,
+      and charge a fee for, acceptance of support, warranty, indemnity,
+      or other liability obligations and/or rights consistent with this
+      License. However, in accepting such obligations, You may act only
+      on Your own behalf and on Your sole responsibility, not on behalf
+      of any other Contributor, and only if You agree to indemnify,
+      defend, and hold each Contributor harmless for any liability
+      incurred by, or claims asserted against, such Contributor by reason
+      of your accepting any such warranty or additional liability.
+
+   END OF TERMS AND CONDITIONS
+
+   APPENDIX: How to apply the Apache License to your work.
+
+      To apply the Apache License to your work, attach the following
+      boilerplate notice, with the fields enclosed by brackets "[]"
+      replaced with your own identifying information. (Don't include
+      the brackets!)  The text should be enclosed in the appropriate
+      comment syntax for the file format. We also recommend that a
+      file or class name and description of purpose be included on the
+      same "printed page" as the copyright notice for easier
+      identification within third-party archives.
+
+   Copyright [yyyy] [name of copyright owner]
+
+   Licensed under the Apache License, Version 2.0 (the "License");
+   you may not use this file except in compliance with the License.
+   You may obtain a copy of the License at
+
+       http://www.apache.org/licenses/LICENSE-2.0
+
+   Unless required by applicable law or agreed to in writing, software
+   distributed under the License is distributed on an "AS IS" BASIS,
+   WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+   See the License for the specific language governing permissions and
+   limitations under the License.

+ 2 - 0
node_modules/jquery-touchswipe/docs/scripts/prettify/lang-css.js

@@ -0,0 +1,2 @@
+PR.registerLangHandler(PR.createSimpleLexer([["pln",/^[\t\n\f\r ]+/,null," \t\r\n"]],[["str",/^"(?:[^\n\f\r"\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*"/,null],["str",/^'(?:[^\n\f\r'\\]|\\(?:\r\n?|\n|\f)|\\[\S\s])*'/,null],["lang-css-str",/^url\(([^"')]*)\)/i],["kwd",/^(?:url|rgb|!important|@import|@page|@media|@charset|inherit)(?=[^\w-]|$)/i,null],["lang-css-kw",/^(-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*)\s*:/i],["com",/^\/\*[^*]*\*+(?:[^*/][^*]*\*+)*\//],["com",
+/^(?:<\!--|--\>)/],["lit",/^(?:\d+|\d*\.\d+)(?:%|[a-z]+)?/i],["lit",/^#[\da-f]{3,6}/i],["pln",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i],["pun",/^[^\s\w"']+/]]),["css"]);PR.registerLangHandler(PR.createSimpleLexer([],[["kwd",/^-?(?:[_a-z]|\\[\da-f]+ ?)(?:[\w-]|\\\\[\da-f]+ ?)*/i]]),["css-kw"]);PR.registerLangHandler(PR.createSimpleLexer([],[["str",/^[^"')]+/]]),["css-str"]);

+ 28 - 0
node_modules/jquery-touchswipe/docs/scripts/prettify/prettify.js

@@ -0,0 +1,28 @@
+var q=null;window.PR_SHOULD_USE_CONTINUATION=!0;
+(function(){function L(a){function m(a){var f=a.charCodeAt(0);if(f!==92)return f;var b=a.charAt(1);return(f=r[b])?f:"0"<=b&&b<="7"?parseInt(a.substring(1),8):b==="u"||b==="x"?parseInt(a.substring(2),16):a.charCodeAt(1)}function e(a){if(a<32)return(a<16?"\\x0":"\\x")+a.toString(16);a=String.fromCharCode(a);if(a==="\\"||a==="-"||a==="["||a==="]")a="\\"+a;return a}function h(a){for(var f=a.substring(1,a.length-1).match(/\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\[0-3][0-7]{0,2}|\\[0-7]{1,2}|\\[\S\s]|[^\\]/g),a=
+[],b=[],o=f[0]==="^",c=o?1:0,i=f.length;c<i;++c){var j=f[c];if(/\\[bdsw]/i.test(j))a.push(j);else{var j=m(j),d;c+2<i&&"-"===f[c+1]?(d=m(f[c+2]),c+=2):d=j;b.push([j,d]);d<65||j>122||(d<65||j>90||b.push([Math.max(65,j)|32,Math.min(d,90)|32]),d<97||j>122||b.push([Math.max(97,j)&-33,Math.min(d,122)&-33]))}}b.sort(function(a,f){return a[0]-f[0]||f[1]-a[1]});f=[];j=[NaN,NaN];for(c=0;c<b.length;++c)i=b[c],i[0]<=j[1]+1?j[1]=Math.max(j[1],i[1]):f.push(j=i);b=["["];o&&b.push("^");b.push.apply(b,a);for(c=0;c<
+f.length;++c)i=f[c],b.push(e(i[0])),i[1]>i[0]&&(i[1]+1>i[0]&&b.push("-"),b.push(e(i[1])));b.push("]");return b.join("")}function y(a){for(var f=a.source.match(/\[(?:[^\\\]]|\\[\S\s])*]|\\u[\dA-Fa-f]{4}|\\x[\dA-Fa-f]{2}|\\\d+|\\[^\dux]|\(\?[!:=]|[()^]|[^()[\\^]+/g),b=f.length,d=[],c=0,i=0;c<b;++c){var j=f[c];j==="("?++i:"\\"===j.charAt(0)&&(j=+j.substring(1))&&j<=i&&(d[j]=-1)}for(c=1;c<d.length;++c)-1===d[c]&&(d[c]=++t);for(i=c=0;c<b;++c)j=f[c],j==="("?(++i,d[i]===void 0&&(f[c]="(?:")):"\\"===j.charAt(0)&&
+(j=+j.substring(1))&&j<=i&&(f[c]="\\"+d[i]);for(i=c=0;c<b;++c)"^"===f[c]&&"^"!==f[c+1]&&(f[c]="");if(a.ignoreCase&&s)for(c=0;c<b;++c)j=f[c],a=j.charAt(0),j.length>=2&&a==="["?f[c]=h(j):a!=="\\"&&(f[c]=j.replace(/[A-Za-z]/g,function(a){a=a.charCodeAt(0);return"["+String.fromCharCode(a&-33,a|32)+"]"}));return f.join("")}for(var t=0,s=!1,l=!1,p=0,d=a.length;p<d;++p){var g=a[p];if(g.ignoreCase)l=!0;else if(/[a-z]/i.test(g.source.replace(/\\u[\da-f]{4}|\\x[\da-f]{2}|\\[^UXux]/gi,""))){s=!0;l=!1;break}}for(var r=
+{b:8,t:9,n:10,v:11,f:12,r:13},n=[],p=0,d=a.length;p<d;++p){g=a[p];if(g.global||g.multiline)throw Error(""+g);n.push("(?:"+y(g)+")")}return RegExp(n.join("|"),l?"gi":"g")}function M(a){function m(a){switch(a.nodeType){case 1:if(e.test(a.className))break;for(var g=a.firstChild;g;g=g.nextSibling)m(g);g=a.nodeName;if("BR"===g||"LI"===g)h[s]="\n",t[s<<1]=y++,t[s++<<1|1]=a;break;case 3:case 4:g=a.nodeValue,g.length&&(g=p?g.replace(/\r\n?/g,"\n"):g.replace(/[\t\n\r ]+/g," "),h[s]=g,t[s<<1]=y,y+=g.length,
+t[s++<<1|1]=a)}}var e=/(?:^|\s)nocode(?:\s|$)/,h=[],y=0,t=[],s=0,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=document.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);m(a);return{a:h.join("").replace(/\n$/,""),c:t}}function B(a,m,e,h){m&&(a={a:m,d:a},e(a),h.push.apply(h,a.e))}function x(a,m){function e(a){for(var l=a.d,p=[l,"pln"],d=0,g=a.a.match(y)||[],r={},n=0,z=g.length;n<z;++n){var f=g[n],b=r[f],o=void 0,c;if(typeof b===
+"string")c=!1;else{var i=h[f.charAt(0)];if(i)o=f.match(i[1]),b=i[0];else{for(c=0;c<t;++c)if(i=m[c],o=f.match(i[1])){b=i[0];break}o||(b="pln")}if((c=b.length>=5&&"lang-"===b.substring(0,5))&&!(o&&typeof o[1]==="string"))c=!1,b="src";c||(r[f]=b)}i=d;d+=f.length;if(c){c=o[1];var j=f.indexOf(c),k=j+c.length;o[2]&&(k=f.length-o[2].length,j=k-c.length);b=b.substring(5);B(l+i,f.substring(0,j),e,p);B(l+i+j,c,C(b,c),p);B(l+i+k,f.substring(k),e,p)}else p.push(l+i,b)}a.e=p}var h={},y;(function(){for(var e=a.concat(m),
+l=[],p={},d=0,g=e.length;d<g;++d){var r=e[d],n=r[3];if(n)for(var k=n.length;--k>=0;)h[n.charAt(k)]=r;r=r[1];n=""+r;p.hasOwnProperty(n)||(l.push(r),p[n]=q)}l.push(/[\S\s]/);y=L(l)})();var t=m.length;return e}function u(a){var m=[],e=[];a.tripleQuotedStrings?m.push(["str",/^(?:'''(?:[^'\\]|\\[\S\s]|''?(?=[^']))*(?:'''|$)|"""(?:[^"\\]|\\[\S\s]|""?(?=[^"]))*(?:"""|$)|'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$))/,q,"'\""]):a.multiLineStrings?m.push(["str",/^(?:'(?:[^'\\]|\\[\S\s])*(?:'|$)|"(?:[^"\\]|\\[\S\s])*(?:"|$)|`(?:[^\\`]|\\[\S\s])*(?:`|$))/,
+q,"'\"`"]):m.push(["str",/^(?:'(?:[^\n\r'\\]|\\.)*(?:'|$)|"(?:[^\n\r"\\]|\\.)*(?:"|$))/,q,"\"'"]);a.verbatimStrings&&e.push(["str",/^@"(?:[^"]|"")*(?:"|$)/,q]);var h=a.hashComments;h&&(a.cStyleComments?(h>1?m.push(["com",/^#(?:##(?:[^#]|#(?!##))*(?:###|$)|.*)/,q,"#"]):m.push(["com",/^#(?:(?:define|elif|else|endif|error|ifdef|include|ifndef|line|pragma|undef|warning)\b|[^\n\r]*)/,q,"#"]),e.push(["str",/^<(?:(?:(?:\.\.\/)*|\/?)(?:[\w-]+(?:\/[\w-]+)+)?[\w-]+\.h|[a-z]\w*)>/,q])):m.push(["com",/^#[^\n\r]*/,
+q,"#"]));a.cStyleComments&&(e.push(["com",/^\/\/[^\n\r]*/,q]),e.push(["com",/^\/\*[\S\s]*?(?:\*\/|$)/,q]));a.regexLiterals&&e.push(["lang-regex",/^(?:^^\.?|[!+-]|!=|!==|#|%|%=|&|&&|&&=|&=|\(|\*|\*=|\+=|,|-=|->|\/|\/=|:|::|;|<|<<|<<=|<=|=|==|===|>|>=|>>|>>=|>>>|>>>=|[?@[^]|\^=|\^\^|\^\^=|{|\||\|=|\|\||\|\|=|~|break|case|continue|delete|do|else|finally|instanceof|return|throw|try|typeof)\s*(\/(?=[^*/])(?:[^/[\\]|\\[\S\s]|\[(?:[^\\\]]|\\[\S\s])*(?:]|$))+\/)/]);(h=a.types)&&e.push(["typ",h]);a=(""+a.keywords).replace(/^ | $/g,
+"");a.length&&e.push(["kwd",RegExp("^(?:"+a.replace(/[\s,]+/g,"|")+")\\b"),q]);m.push(["pln",/^\s+/,q," \r\n\t\xa0"]);e.push(["lit",/^@[$_a-z][\w$@]*/i,q],["typ",/^(?:[@_]?[A-Z]+[a-z][\w$@]*|\w+_t\b)/,q],["pln",/^[$_a-z][\w$@]*/i,q],["lit",/^(?:0x[\da-f]+|(?:\d(?:_\d+)*\d*(?:\.\d*)?|\.\d\+)(?:e[+-]?\d+)?)[a-z]*/i,q,"0123456789"],["pln",/^\\[\S\s]?/,q],["pun",/^.[^\s\w"-$'./@\\`]*/,q]);return x(m,e)}function D(a,m){function e(a){switch(a.nodeType){case 1:if(k.test(a.className))break;if("BR"===a.nodeName)h(a),
+a.parentNode&&a.parentNode.removeChild(a);else for(a=a.firstChild;a;a=a.nextSibling)e(a);break;case 3:case 4:if(p){var b=a.nodeValue,d=b.match(t);if(d){var c=b.substring(0,d.index);a.nodeValue=c;(b=b.substring(d.index+d[0].length))&&a.parentNode.insertBefore(s.createTextNode(b),a.nextSibling);h(a);c||a.parentNode.removeChild(a)}}}}function h(a){function b(a,d){var e=d?a.cloneNode(!1):a,f=a.parentNode;if(f){var f=b(f,1),g=a.nextSibling;f.appendChild(e);for(var h=g;h;h=g)g=h.nextSibling,f.appendChild(h)}return e}
+for(;!a.nextSibling;)if(a=a.parentNode,!a)return;for(var a=b(a.nextSibling,0),e;(e=a.parentNode)&&e.nodeType===1;)a=e;d.push(a)}var k=/(?:^|\s)nocode(?:\s|$)/,t=/\r\n?|\n/,s=a.ownerDocument,l;a.currentStyle?l=a.currentStyle.whiteSpace:window.getComputedStyle&&(l=s.defaultView.getComputedStyle(a,q).getPropertyValue("white-space"));var p=l&&"pre"===l.substring(0,3);for(l=s.createElement("LI");a.firstChild;)l.appendChild(a.firstChild);for(var d=[l],g=0;g<d.length;++g)e(d[g]);m===(m|0)&&d[0].setAttribute("value",
+m);var r=s.createElement("OL");r.className="linenums";for(var n=Math.max(0,m-1|0)||0,g=0,z=d.length;g<z;++g)l=d[g],l.className="L"+(g+n)%10,l.firstChild||l.appendChild(s.createTextNode("\xa0")),r.appendChild(l);a.appendChild(r)}function k(a,m){for(var e=m.length;--e>=0;){var h=m[e];A.hasOwnProperty(h)?window.console&&console.warn("cannot override language handler %s",h):A[h]=a}}function C(a,m){if(!a||!A.hasOwnProperty(a))a=/^\s*</.test(m)?"default-markup":"default-code";return A[a]}function E(a){var m=
+a.g;try{var e=M(a.h),h=e.a;a.a=h;a.c=e.c;a.d=0;C(m,h)(a);var k=/\bMSIE\b/.test(navigator.userAgent),m=/\n/g,t=a.a,s=t.length,e=0,l=a.c,p=l.length,h=0,d=a.e,g=d.length,a=0;d[g]=s;var r,n;for(n=r=0;n<g;)d[n]!==d[n+2]?(d[r++]=d[n++],d[r++]=d[n++]):n+=2;g=r;for(n=r=0;n<g;){for(var z=d[n],f=d[n+1],b=n+2;b+2<=g&&d[b+1]===f;)b+=2;d[r++]=z;d[r++]=f;n=b}for(d.length=r;h<p;){var o=l[h+2]||s,c=d[a+2]||s,b=Math.min(o,c),i=l[h+1],j;if(i.nodeType!==1&&(j=t.substring(e,b))){k&&(j=j.replace(m,"\r"));i.nodeValue=
+j;var u=i.ownerDocument,v=u.createElement("SPAN");v.className=d[a+1];var x=i.parentNode;x.replaceChild(v,i);v.appendChild(i);e<o&&(l[h+1]=i=u.createTextNode(t.substring(b,o)),x.insertBefore(i,v.nextSibling))}e=b;e>=o&&(h+=2);e>=c&&(a+=2)}}catch(w){"console"in window&&console.log(w&&w.stack?w.stack:w)}}var v=["break,continue,do,else,for,if,return,while"],w=[[v,"auto,case,char,const,default,double,enum,extern,float,goto,int,long,register,short,signed,sizeof,static,struct,switch,typedef,union,unsigned,void,volatile"],
+"catch,class,delete,false,import,new,operator,private,protected,public,this,throw,true,try,typeof"],F=[w,"alignof,align_union,asm,axiom,bool,concept,concept_map,const_cast,constexpr,decltype,dynamic_cast,explicit,export,friend,inline,late_check,mutable,namespace,nullptr,reinterpret_cast,static_assert,static_cast,template,typeid,typename,using,virtual,where"],G=[w,"abstract,boolean,byte,extends,final,finally,implements,import,instanceof,null,native,package,strictfp,super,synchronized,throws,transient"],
+H=[G,"as,base,by,checked,decimal,delegate,descending,dynamic,event,fixed,foreach,from,group,implicit,in,interface,internal,into,is,lock,object,out,override,orderby,params,partial,readonly,ref,sbyte,sealed,stackalloc,string,select,uint,ulong,unchecked,unsafe,ushort,var"],w=[w,"debugger,eval,export,function,get,null,set,undefined,var,with,Infinity,NaN"],I=[v,"and,as,assert,class,def,del,elif,except,exec,finally,from,global,import,in,is,lambda,nonlocal,not,or,pass,print,raise,try,with,yield,False,True,None"],
+J=[v,"alias,and,begin,case,class,def,defined,elsif,end,ensure,false,in,module,next,nil,not,or,redo,rescue,retry,self,super,then,true,undef,unless,until,when,yield,BEGIN,END"],v=[v,"case,done,elif,esac,eval,fi,function,in,local,set,then,until"],K=/^(DIR|FILE|vector|(de|priority_)?queue|list|stack|(const_)?iterator|(multi)?(set|map)|bitset|u?(int|float)\d*)/,N=/\S/,O=u({keywords:[F,H,w,"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END"+
+I,J,v],hashComments:!0,cStyleComments:!0,multiLineStrings:!0,regexLiterals:!0}),A={};k(O,["default-code"]);k(x([],[["pln",/^[^<?]+/],["dec",/^<!\w[^>]*(?:>|$)/],["com",/^<\!--[\S\s]*?(?:--\>|$)/],["lang-",/^<\?([\S\s]+?)(?:\?>|$)/],["lang-",/^<%([\S\s]+?)(?:%>|$)/],["pun",/^(?:<[%?]|[%?]>)/],["lang-",/^<xmp\b[^>]*>([\S\s]+?)<\/xmp\b[^>]*>/i],["lang-js",/^<script\b[^>]*>([\S\s]*?)(<\/script\b[^>]*>)/i],["lang-css",/^<style\b[^>]*>([\S\s]*?)(<\/style\b[^>]*>)/i],["lang-in.tag",/^(<\/?[a-z][^<>]*>)/i]]),
+["default-markup","htm","html","mxml","xhtml","xml","xsl"]);k(x([["pln",/^\s+/,q," \t\r\n"],["atv",/^(?:"[^"]*"?|'[^']*'?)/,q,"\"'"]],[["tag",/^^<\/?[a-z](?:[\w-.:]*\w)?|\/?>$/i],["atn",/^(?!style[\s=]|on)[a-z](?:[\w:-]*\w)?/i],["lang-uq.val",/^=\s*([^\s"'>]*(?:[^\s"'/>]|\/(?=\s)))/],["pun",/^[/<->]+/],["lang-js",/^on\w+\s*=\s*"([^"]+)"/i],["lang-js",/^on\w+\s*=\s*'([^']+)'/i],["lang-js",/^on\w+\s*=\s*([^\s"'>]+)/i],["lang-css",/^style\s*=\s*"([^"]+)"/i],["lang-css",/^style\s*=\s*'([^']+)'/i],["lang-css",
+/^style\s*=\s*([^\s"'>]+)/i]]),["in.tag"]);k(x([],[["atv",/^[\S\s]+/]]),["uq.val"]);k(u({keywords:F,hashComments:!0,cStyleComments:!0,types:K}),["c","cc","cpp","cxx","cyc","m"]);k(u({keywords:"null,true,false"}),["json"]);k(u({keywords:H,hashComments:!0,cStyleComments:!0,verbatimStrings:!0,types:K}),["cs"]);k(u({keywords:G,cStyleComments:!0}),["java"]);k(u({keywords:v,hashComments:!0,multiLineStrings:!0}),["bsh","csh","sh"]);k(u({keywords:I,hashComments:!0,multiLineStrings:!0,tripleQuotedStrings:!0}),
+["cv","py"]);k(u({keywords:"caller,delete,die,do,dump,elsif,eval,exit,foreach,for,goto,if,import,last,local,my,next,no,our,print,package,redo,require,sub,undef,unless,until,use,wantarray,while,BEGIN,END",hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["perl","pl","pm"]);k(u({keywords:J,hashComments:!0,multiLineStrings:!0,regexLiterals:!0}),["rb"]);k(u({keywords:w,cStyleComments:!0,regexLiterals:!0}),["js"]);k(u({keywords:"all,and,by,catch,class,else,extends,false,finally,for,if,in,is,isnt,loop,new,no,not,null,of,off,on,or,return,super,then,true,try,unless,until,when,while,yes",
+hashComments:3,cStyleComments:!0,multilineStrings:!0,tripleQuotedStrings:!0,regexLiterals:!0}),["coffee"]);k(x([],[["str",/^[\S\s]+/]]),["regex"]);window.prettyPrintOne=function(a,m,e){var h=document.createElement("PRE");h.innerHTML=a;e&&D(h,e);E({g:m,i:e,h:h});return h.innerHTML};window.prettyPrint=function(a){function m(){for(var e=window.PR_SHOULD_USE_CONTINUATION?l.now()+250:Infinity;p<h.length&&l.now()<e;p++){var n=h[p],k=n.className;if(k.indexOf("prettyprint")>=0){var k=k.match(g),f,b;if(b=
+!k){b=n;for(var o=void 0,c=b.firstChild;c;c=c.nextSibling)var i=c.nodeType,o=i===1?o?b:c:i===3?N.test(c.nodeValue)?b:o:o;b=(f=o===b?void 0:o)&&"CODE"===f.tagName}b&&(k=f.className.match(g));k&&(k=k[1]);b=!1;for(o=n.parentNode;o;o=o.parentNode)if((o.tagName==="pre"||o.tagName==="code"||o.tagName==="xmp")&&o.className&&o.className.indexOf("prettyprint")>=0){b=!0;break}b||((b=(b=n.className.match(/\blinenums\b(?::(\d+))?/))?b[1]&&b[1].length?+b[1]:!0:!1)&&D(n,b),d={g:k,h:n,i:b},E(d))}}p<h.length?setTimeout(m,
+250):a&&a()}for(var e=[document.getElementsByTagName("pre"),document.getElementsByTagName("code"),document.getElementsByTagName("xmp")],h=[],k=0;k<e.length;++k)for(var t=0,s=e[k].length;t<s;++t)h.push(e[k][t]);var e=q,l=Date;l.now||(l={now:function(){return+new Date}});var p=0,d,g=/\blang(?:uage)?-([\w.]+)(?!\S)/;m()};window.PR={createSimpleLexer:x,registerLangHandler:k,sourceDecorator:u,PR_ATTRIB_NAME:"atn",PR_ATTRIB_VALUE:"atv",PR_COMMENT:"com",PR_DECLARATION:"dec",PR_KEYWORD:"kwd",PR_LITERAL:"lit",
+PR_NOCODE:"nocode",PR_PLAIN:"pln",PR_PUNCTUATION:"pun",PR_SOURCE:"src",PR_STRING:"str",PR_TAG:"tag",PR_TYPE:"typ"}})();

+ 625 - 0
node_modules/jquery-touchswipe/docs/styles/jsdoc.css

@@ -0,0 +1,625 @@
+@import url(https://fonts.googleapis.com/css?family=Montserrat:400,700);
+
+* {
+  box-sizing: border-box
+}
+
+html, body {
+  height: 100%;
+  width: 100%;
+}
+
+body {
+  color: #4d4e53;
+  background-color: white;
+  margin: 0 auto;
+  padding: 0 20px;
+  font-family: 'Helvetica Neue', Helvetica, sans-serif;
+  font-size: 16px;
+  line-height: 160%;
+}
+
+a,
+a:active {
+  color: #606;
+  text-decoration: none;
+}
+
+a:hover {
+  text-decoration: none;
+}
+
+article a {
+  border-bottom: 1px solid #ddd;
+}
+
+article a:hover, article a:active {
+  border-bottom-color: #222;
+}
+
+p, ul, ol, blockquote {
+  margin-bottom: 1em;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  font-family: 'Montserrat', sans-serif;
+}
+
+h1, h2, h3, h4, h5, h6 {
+  color: #000;
+  font-weight: 400;
+  margin: 0;
+}
+
+h1 {
+  font-weight: 300;
+  font-size: 48px;
+  margin: 1em 0 .5em;
+}
+
+h1.page-title {
+  font-size: 48px;
+  margin: 1em 30px;
+}
+
+h2 {
+  font-size: 24px;
+  margin: 1.5em 0 .3em;
+}
+
+h3 {
+  font-size: 24px;
+  margin: 1.2em 0 .3em;
+}
+
+h4 {
+  font-size: 18px;
+  margin: 1em 0 .2em;
+  color: #4d4e53;
+}
+
+h4.name {
+  color: #fff;
+  background: #6d426d;
+  box-shadow: 0 .25em .5em #d3d3d3;
+  border-top: 1px solid #d3d3d3;
+  border-bottom: 1px solid #d3d3d3;
+  margin: 1.5em 0 0.5em;
+  padding: .75em 0 .75em 10px;
+}
+
+h5, .container-overview .subsection-title {
+  font-size: 120%;
+  letter-spacing: -0.01em;
+  margin: 8px 0 3px 0;
+}
+
+h6 {
+  font-size: 100%;
+  letter-spacing: -0.01em;
+  margin: 6px 0 3px 0;
+  font-style: italic;
+}
+
+tt, code, kbd, samp {
+  font-family: Consolas, Monaco, 'Andale Mono', monospace;
+  background: #f4f4f4;
+  padding: 1px 5px;
+}
+
+.class-description {
+  font-size: 130%;
+  line-height: 140%;
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+.class-description:empty {
+  margin: 0
+}
+
+#main {
+  float: right;
+  min-width: 360px;
+  width: calc(100% - 240px);
+}
+
+header {
+  display: block
+}
+
+section {
+  display: block;
+  background-color: #fff;
+  padding: 0 0 0 30px;
+}
+
+.variation {
+  display: none
+}
+
+.signature-attributes {
+  font-size: 60%;
+  color: #eee;
+  font-style: italic;
+  font-weight: lighter;
+}
+
+nav {
+  float: left;
+  display: block;
+  width: 250px;
+  background: #fff;
+  overflow: auto;
+  position: fixed;
+  height: 100%;
+}
+
+nav h3 {
+  margin-top: 12px;
+  font-size: 13px;
+  text-transform: uppercase;
+  letter-spacing: 1px;
+  font-weight: 700;
+  line-height: 24px;
+  margin: 15px 0 10px;
+  padding: 0;
+  color: #000;
+}
+
+nav ul {
+  font-family: 'Lucida Grande', 'Lucida Sans Unicode', arial, sans-serif;
+  font-size: 100%;
+  line-height: 17px;
+  padding: 0;
+  margin: 0;
+  list-style-type: none;
+}
+
+nav ul a,
+nav ul a:active {
+  font-family: 'Montserrat', sans-serif;
+  line-height: 18px;
+  padding: 0;
+  display: block;
+  font-size: 12px;
+}
+
+nav a:hover,
+nav a:active {
+  color: #606;
+}
+
+nav > ul {
+  padding: 0 10px;
+}
+
+nav > ul > li > a {
+  color: #606;
+}
+
+nav ul ul {
+  margin-bottom: 10px
+}
+
+nav ul ul a {
+  color: hsl(207, 1%, 60%);
+  border-left: 1px solid hsl(207, 10%, 86%);
+}
+
+nav ul ul a,
+nav ul ul a:active {
+  padding-left: 20px
+}
+
+nav h2 {
+   font-size: 12px;
+   margin: 0;
+   padding: 0;
+}
+
+nav > h2 > a {
+   display: block;
+   margin: 10px 0 -10px;
+   color: #606 !important;
+}
+
+footer {
+  color: hsl(0, 0%, 28%);
+  margin-left: 250px;
+  display: block;
+  padding: 15px;
+  font-style: italic;
+  font-size: 90%;
+}
+
+.ancestors {
+  color: #999
+}
+
+.ancestors a {
+   color: #999 !important;
+}
+
+.clear {
+  clear: both
+}
+
+.important {
+  font-weight: bold;
+  color: #950B02;
+}
+
+.yes-def {
+  text-indent: -1000px
+}
+
+.type-signature {
+  color: #CA79CA
+}
+
+.type-signature:last-child {
+  color: #eee;
+}
+
+.name, .signature {
+  font-family: Consolas, Monaco, 'Andale Mono', monospace
+}
+
+.signature {
+    color: #fc83ff;
+}
+
+.details {
+  margin-top: 6px;
+  border-left: 2px solid #DDD;
+  line-height: 20px;
+  font-size: 14px;
+}
+
+.details dt {
+   width: 120px;
+   float: left;
+   padding-left: 10px;
+}
+
+.details dd {
+   margin-left: 70px;
+   margin-top: 6px;
+   margin-bottom: 6px;
+}
+
+.details ul {
+   margin: 0
+}
+
+.details ul {
+   list-style-type: none
+}
+
+.details pre.prettyprint {
+   margin: 0
+}
+
+.details .object-value {
+   padding-top: 0
+}
+
+.description {
+  margin-bottom: 1em;
+  margin-top: 1em;
+}
+
+.code-caption {
+  font-style: italic;
+  font-size: 107%;
+  margin: 0;
+}
+
+.prettyprint {
+  font-size: 14px;
+  overflow: auto;
+}
+
+.prettyprint.source {
+  width: inherit;
+  line-height: 18px;
+  display: block;
+  background-color: #0d152a;
+  color: #aeaeae;
+}
+
+.prettyprint code {
+  line-height: 18px;
+  display: block;
+  background-color: #0d152a;
+  color: #4D4E53;
+}
+
+.prettyprint > code {
+  padding: 15px;
+}
+
+.prettyprint .linenums code {
+  padding: 0 15px
+}
+
+.prettyprint .linenums li:first-of-type code {
+  padding-top: 15px
+}
+
+.prettyprint code span.line {
+  display: inline-block
+}
+
+.prettyprint.linenums {
+  padding-left: 70px;
+  -webkit-user-select: none;
+  -moz-user-select: none;
+  -ms-user-select: none;
+  user-select: none;
+}
+
+.prettyprint.linenums ol {
+   padding-left: 0
+}
+
+.prettyprint.linenums li {
+   border-left: 3px #34446B solid;
+}
+
+.prettyprint.linenums li.selected, .prettyprint.linenums li.selected * {
+   background-color: #34446B;
+}
+
+.prettyprint.linenums li * {
+   -webkit-user-select: text;
+   -moz-user-select: text;
+   -ms-user-select: text;
+   user-select: text;
+}
+
+.params, .props {
+  border-spacing: 0;
+  border: 1px solid #ddd;
+  border-collapse: collapse;
+  border-radius: 3px;
+  box-shadow: 0 1px 3px rgba(0,0,0,0.1);
+  width: 100%;
+  font-size: 14px;
+  margin: 1em 0;
+}
+
+.params .type {
+  white-space: nowrap;
+}
+
+.params code {
+  white-space: pre;
+}
+
+.params td, .params .name, .props .name, .name code {
+   color: #4D4E53;
+   font-family: Consolas, Monaco, 'Andale Mono', monospace;
+   font-size: 100%;
+}
+
+.params td, .params th, .props td, .props th {
+   margin: 0px;
+   text-align: left;
+   vertical-align: top;
+   padding: 10px;
+   display: table-cell;
+}
+
+.params td {
+   border-top: 1px solid #eee
+}
+
+.params thead tr, .props thead tr {
+   background-color: #fff;
+   font-weight: bold;
+}
+
+.params .params thead tr, .props .props thead tr {
+   background-color: #fff;
+   font-weight: bold;
+}
+
+.params td.description > p:first-child, .props td.description > p:first-child {
+   margin-top: 0;
+   padding-top: 0;
+}
+
+.params td.description > p:last-child, .props td.description > p:last-child {
+   margin-bottom: 0;
+   padding-bottom: 0;
+}
+
+span.param-type, .params td .param-type, .param-type dd {
+   color: #606;
+  font-family: Consolas, Monaco, 'Andale Mono', monospace
+}
+
+.param-type dt, .param-type dd {
+  display: inline-block
+}
+
+.param-type {
+  margin: 14px 0;
+}
+
+.disabled {
+  color: #454545
+}
+
+/* navicon button */
+.navicon-button {
+  display: none;
+  position: relative;
+  padding: 2.0625rem 1.5rem;
+  transition: 0.25s;
+  cursor: pointer;
+  -webkit-user-select: none;
+     -moz-user-select: none;
+      -ms-user-select: none;
+          user-select: none;
+  opacity: .8;
+}
+.navicon-button .navicon:before, .navicon-button .navicon:after {
+  transition: 0.25s;
+}
+.navicon-button:hover {
+  transition: 0.5s;
+  opacity: 1;
+}
+.navicon-button:hover .navicon:before, .navicon-button:hover .navicon:after {
+  transition: 0.25s;
+}
+.navicon-button:hover .navicon:before {
+  top: .825rem;
+}
+.navicon-button:hover .navicon:after {
+  top: -.825rem;
+}
+
+/* navicon */
+.navicon {
+  position: relative;
+  width: 2.5em;
+  height: .3125rem;
+  background: #000;
+  transition: 0.3s;
+  border-radius: 2.5rem;
+}
+.navicon:before, .navicon:after {
+  display: block;
+  content: "";
+  height: .3125rem;
+  width: 2.5rem;
+  background: #000;
+  position: absolute;
+  z-index: -1;
+  transition: 0.3s 0.25s;
+  border-radius: 1rem;
+}
+.navicon:before {
+  top: .625rem;
+}
+.navicon:after {
+  top: -.625rem;
+}
+
+/* open */
+.nav-trigger:checked + label:not(.steps) .navicon:before,
+.nav-trigger:checked + label:not(.steps) .navicon:after {
+  top: 0 !important;
+}
+
+.nav-trigger:checked + label .navicon:before,
+.nav-trigger:checked + label .navicon:after {
+  transition: 0.5s;
+}
+
+/* Minus */
+.nav-trigger:checked + label {
+  -webkit-transform: scale(0.75);
+          transform: scale(0.75);
+}
+
+/* × and + */
+.nav-trigger:checked + label.plus .navicon,
+.nav-trigger:checked + label.x .navicon {
+  background: transparent;
+}
+
+.nav-trigger:checked + label.plus .navicon:before,
+.nav-trigger:checked + label.x .navicon:before {
+  -webkit-transform: rotate(-45deg);
+          transform: rotate(-45deg);
+  background: #FFF;
+}
+
+.nav-trigger:checked + label.plus .navicon:after,
+.nav-trigger:checked + label.x .navicon:after {
+  -webkit-transform: rotate(45deg);
+          transform: rotate(45deg);
+  background: #FFF;
+}
+
+.nav-trigger:checked + label.plus {
+  -webkit-transform: scale(0.75) rotate(45deg);
+          transform: scale(0.75) rotate(45deg);
+}
+
+.nav-trigger:checked ~ nav {
+  left: 0 !important;
+}
+
+.nav-trigger:checked ~ .overlay {
+  display: block;
+}
+
+.nav-trigger {
+  position: fixed;
+  top: 0;
+  clip: rect(0, 0, 0, 0);
+}
+
+.overlay {
+  display: none;
+  position: fixed;
+  top: 0;
+  bottom: 0;
+  left: 0;
+  right: 0;
+  width: 100%;
+  height: 100%;
+  background: hsla(0, 0%, 0%, 0.5);
+  z-index: 1;
+}
+
+@media only screen and (min-width: 320px) and (max-width: 680px) {
+  body {
+    overflow-x: hidden;
+  }
+
+  nav {
+    background: #FFF;
+    width: 250px;
+    height: 100%;
+    position: fixed;
+    top: 0;
+    right: 0;
+    bottom: 0;
+    left: -250px;
+    z-index: 3;
+    padding: 0 10px;
+    transition: left 0.2s;
+  }
+
+  .navicon-button {
+    display: inline-block;
+    position: fixed;
+    top: 1.5em;
+    right: 0;
+    z-index: 2;
+  }
+
+  #main {
+    width: 100%;
+    min-width: 360px;
+  }
+
+  #main h1.page-title {
+    margin: 1em 0;
+  }
+
+  #main section {
+    padding: 0;
+  }
+
+  footer {
+    margin-left: 0;
+  }
+}

+ 79 - 0
node_modules/jquery-touchswipe/docs/styles/prettify.css

@@ -0,0 +1,79 @@
+.pln {
+  color: #ddd;
+}
+
+/* string content */
+.str {
+  color: #61ce3c;
+}
+
+/* a keyword */
+.kwd {
+  color: #fbde2d;
+}
+
+/* a comment */
+.com {
+  color: #aeaeae;
+}
+
+/* a type name */
+.typ {
+  color: #8da6ce;
+}
+
+/* a literal value */
+.lit {
+  color: #fbde2d;
+}
+
+/* punctuation */
+.pun {
+  color: #ddd;
+}
+
+/* lisp open bracket */
+.opn {
+  color: #000000;
+}
+
+/* lisp close bracket */
+.clo {
+  color: #000000;
+}
+
+/* a markup tag name */
+.tag {
+  color: #8da6ce;
+}
+
+/* a markup attribute name */
+.atn {
+  color: #fbde2d;
+}
+
+/* a markup attribute value */
+.atv {
+  color: #ddd;
+}
+
+/* a declaration */
+.dec {
+  color: #EF5050;
+}
+
+/* a variable name */
+.var {
+  color: #c82829;
+}
+
+/* a function name */
+.fun {
+  color: #4271ae;
+}
+
+/* Specify class=linenums on a pre to get line numbering */
+ol.linenums {
+  margin-top: 0;
+  margin-bottom: 0;
+}

File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Any_finger_swipe.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Basic_swipe.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Enable_and_destroy.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Excluded_children.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Finger_swipe.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Handlers_and_events.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Hold.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Image_gallery_example.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Options.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Page_scrolling.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Page_zoom.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Pinch.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Pinch_and_Swipe.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Pinch_status.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Single_swipe.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Stop_propegation.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Swipe_status.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Tap_vs_swipe.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Thresholds.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-Trigger_handlers.html


File diff suppressed because it is too large
+ 25 - 0
node_modules/jquery-touchswipe/docs/tutorial-index_.html


+ 2112 - 0
node_modules/jquery-touchswipe/jquery.touchSwipe.js

@@ -0,0 +1,2112 @@
+/*!
+ * @fileOverview TouchSwipe - jQuery Plugin
+ * @version 1.6.18
+ *
+ * @author Matt Bryson http://www.github.com/mattbryson
+ * @see https://github.com/mattbryson/TouchSwipe-Jquery-Plugin
+ * @see http://labs.rampinteractive.co.uk/touchSwipe/
+ * @see http://plugins.jquery.com/project/touchSwipe
+ * @license
+ * Copyright (c) 2010-2015 Matt Bryson
+ * Dual licensed under the MIT or GPL Version 2 licenses.
+ *
+ */
+
+/*
+ *
+ * Changelog
+ * $Date: 2010-12-12 (Wed, 12 Dec 2010) $
+ * $version: 1.0.0
+ * $version: 1.0.1 - removed multibyte comments
+ *
+ * $Date: 2011-21-02 (Mon, 21 Feb 2011) $
+ * $version: 1.1.0 	- added allowPageScroll property to allow swiping and scrolling of page
+ *					- changed handler signatures so one handler can be used for multiple events
+ * $Date: 2011-23-02 (Wed, 23 Feb 2011) $
+ * $version: 1.2.0 	- added click handler. This is fired if the user simply clicks and does not swipe. The event object and click target are passed to handler.
+ *					- If you use the http://code.google.com/p/jquery-ui-for-ipad-and-iphone/ plugin, you can also assign jQuery mouse events to children of a touchSwipe object.
+ * $version: 1.2.1 	- removed console log!
+ *
+ * $version: 1.2.2 	- Fixed bug where scope was not preserved in callback methods.
+ *
+ * $Date: 2011-28-04 (Thurs, 28 April 2011) $
+ * $version: 1.2.4 	- Changed licence terms to be MIT or GPL inline with jQuery. Added check for support of touch events to stop non compatible browsers erroring.
+ *
+ * $Date: 2011-27-09 (Tues, 27 September 2011) $
+ * $version: 1.2.5 	- Added support for testing swipes with mouse on desktop browser (thanks to https://github.com/joelhy)
+ *
+ * $Date: 2012-14-05 (Mon, 14 May 2012) $
+ * $version: 1.2.6 	- Added timeThreshold between start and end touch, so user can ignore slow swipes (thanks to Mark Chase). Default is null, all swipes are detected
+ *
+ * $Date: 2012-05-06 (Tues, 05 June 2012) $
+ * $version: 1.2.7 	- Changed time threshold to have null default for backwards compatibility. Added duration param passed back in events, and refactored how time is handled.
+ *
+ * $Date: 2012-05-06 (Tues, 05 June 2012) $
+ * $version: 1.2.8 	- Added the possibility to return a value like null or false in the trigger callback. In that way we can control when the touch start/move should take effect or not (simply by returning in some cases return null; or return false;) This effects the ontouchstart/ontouchmove event.
+ *
+ * $Date: 2012-06-06 (Wed, 06 June 2012) $
+ * $version: 1.3.0 	- Refactored whole plugin to allow for methods to be executed, as well as exposed defaults for user override. Added 'enable', 'disable', and 'destroy' methods
+ *
+ * $Date: 2012-05-06 (Fri, 05 June 2012) $
+ * $version: 1.3.1 	- Bug fixes  - bind() with false as last argument is no longer supported in jQuery 1.6, also, if you just click, the duration is now returned correctly.
+ *
+ * $Date: 2012-29-07 (Sun, 29 July 2012) $
+ * $version: 1.3.2	- Added fallbackToMouseEvents option to NOT capture mouse events on non touch devices.
+ * 			- Added "all" fingers value to the fingers property, so any combination of fingers triggers the swipe, allowing event handlers to check the finger count
+ *
+ * $Date: 2012-09-08 (Thurs, 9 Aug 2012) $
+ * $version: 1.3.3	- Code tidy prep for min version
+ *
+ * $Date: 2012-04-10 (wed, 4 Oct 2012) $
+ * $version: 1.4.0	- Added pinch support, pinchIn and pinchOut
+ *
+ * $Date: 2012-11-10 (Thurs, 11 Oct 2012) $
+ * $version: 1.5.0	- Added excludedElements, a jquery selector that specifies child elements that do NOT trigger swipes. By default, this is .noSwipe
+ *
+ * $Date: 2012-22-10 (Mon, 22 Oct 2012) $
+ * $version: 1.5.1	- Fixed bug with jQuery 1.8 and trailing comma in excludedElements
+ *					- Fixed bug with IE and eventPreventDefault()
+ * $Date: 2013-01-12 (Fri, 12 Jan 2013) $
+ * $version: 1.6.0	- Fixed bugs with pinching, mainly when both pinch and swipe enabled, as well as adding time threshold for multifinger gestures, so releasing one finger beofre the other doesnt trigger as single finger gesture.
+ *					- made the demo site all static local HTML pages so they can be run locally by a developer
+ *					- added jsDoc comments and added documentation for the plugin
+ *					- code tidy
+ *					- added triggerOnTouchLeave property that will end the event when the user swipes off the element.
+ * $Date: 2013-03-23 (Sat, 23 Mar 2013) $
+ * $version: 1.6.1	- Added support for ie8 touch events
+ * $version: 1.6.2	- Added support for events binding with on / off / bind in jQ for all callback names.
+ *                   - Deprecated the 'click' handler in favour of tap.
+ *                   - added cancelThreshold property
+ *                   - added option method to update init options at runtime
+ * $version 1.6.3    - added doubletap, longtap events and longTapThreshold, doubleTapThreshold property
+ *
+ * $Date: 2013-04-04 (Thurs, 04 April 2013) $
+ * $version 1.6.4    - Fixed bug with cancelThreshold introduced in 1.6.3, where swipe status no longer fired start event, and stopped once swiping back.
+ *
+ * $Date: 2013-08-24 (Sat, 24 Aug 2013) $
+ * $version 1.6.5    - Merged a few pull requests fixing various bugs, added AMD support.
+ *
+ * $Date: 2014-06-04 (Wed, 04 June 2014) $
+ * $version 1.6.6 	- Merge of pull requests.
+ *    				- IE10 touch support
+ *    				- Only prevent default event handling on valid swipe
+ *    				- Separate license/changelog comment
+ *    				- Detect if the swipe is valid at the end of the touch event.
+ *    				- Pass fingerdata to event handlers.
+ *    				- Add 'hold' gesture
+ *    				- Be more tolerant about the tap distance
+ *    				- Typos and minor fixes
+ *
+ * $Date: 2015-22-01 (Thurs, 22 Jan 2015) $
+ * $version 1.6.7    - Added patch from https://github.com/mattbryson/TouchSwipe-Jquery-Plugin/issues/206 to fix memory leak
+ *
+ * $Date: 2015-2-2 (Mon, 2 Feb 2015) $
+ * $version 1.6.8    - Added preventDefaultEvents option to proxy events regardless.
+ *					- Fixed issue with swipe and pinch not triggering at the same time
+ *
+ * $Date: 2015-9-6 (Tues, 9 June 2015) $
+ * $version 1.6.9    - Added PR from jdalton/hybrid to fix pointer events
+ *					- Added scrolling demo
+ *					- Added version property to plugin
+ *
+ * $Date: 2015-1-10 (Wed, 1 October 2015) $
+ * $version 1.6.10    - Added PR from beatspace to fix tap events
+ * $version 1.6.11    - Added PRs from indri-indri ( Doc tidyup), kkirsche ( Bower tidy up ), UziTech (preventDefaultEvents fixes )
+ *					 - Allowed setting multiple options via .swipe("options", options_hash) and more simply .swipe(options_hash) or exisitng instances
+ * $version 1.6.12    - Fixed bug with multi finger releases above 2 not triggering events
+ *
+ * $Date: 2015-12-18 (Fri, 18 December 2015) $
+ * $version 1.6.13    - Added PRs
+ *                    - Fixed #267 allowPageScroll not working correctly
+ * $version 1.6.14    - Fixed #220 / #248 doubletap not firing with swipes, #223 commonJS compatible
+ * $version 1.6.15    - More bug fixes
+ *
+ * $Date: 2016-04-29 (Fri, 29 April 2016) $
+ * $version 1.6.16    - Swipes with 0 distance now allow default events to trigger.  So tapping any form elements or A tags will allow default interaction, but swiping will trigger a swipe.
+ *                       Removed the a, input, select etc from the excluded Children list as the 0 distance tap solves that issue.
+ * $Date: 2016-05-19  (Fri, 29 April 2016) $
+ * $version 1.6.17     - Fixed context issue when calling instance methods via $("selector").swipe("method");
+ * $version 1.6.18     - now honors fallbackToMouseEvents=false for MS Pointer events when a Mouse is used.
+ * 
+ * $Date: 2018-09-17  (Mon, 17 September 2018) $
+ * $version 1.6.19     - replaced jQuery bind with on, replaced deprecated `navigator.pointerEvents` with `window.PointerEvents`
+
+ */
+
+/**
+ * See (http://jquery.com/).
+ * @name $
+ * @class
+ * See the jQuery Library  (http://jquery.com/) for full details.  This just
+ * documents the function and classes that are added to jQuery by this plug-in.
+ */
+
+/**
+ * See (http://jquery.com/)
+ * @name fn
+ * @class
+ * See the jQuery Library  (http://jquery.com/) for full details.  This just
+ * documents the function and classes that are added to jQuery by this plug-in.
+ * @memberOf $
+ */
+
+
+(function(factory) {
+  if (typeof define === 'function' && define.amd && define.amd.jQuery) {
+    // AMD. Register as anonymous module.
+    define(['jquery'], factory);
+  } else if (typeof module !== 'undefined' && module.exports) {
+    // CommonJS Module
+    factory(require("jquery"));
+  } else {
+    // Browser globals.
+    factory(jQuery);
+  }
+}(function($) {
+  "use strict";
+
+  //Constants
+  var VERSION = "1.6.18",
+    LEFT = "left",
+    RIGHT = "right",
+    UP = "up",
+    DOWN = "down",
+    IN = "in",
+    OUT = "out",
+
+    NONE = "none",
+    AUTO = "auto",
+
+    SWIPE = "swipe",
+    PINCH = "pinch",
+    TAP = "tap",
+    DOUBLE_TAP = "doubletap",
+    LONG_TAP = "longtap",
+    HOLD = "hold",
+
+    HORIZONTAL = "horizontal",
+    VERTICAL = "vertical",
+
+    ALL_FINGERS = "all",
+
+    DOUBLE_TAP_THRESHOLD = 10,
+
+    PHASE_START = "start",
+    PHASE_MOVE = "move",
+    PHASE_END = "end",
+    PHASE_CANCEL = "cancel",
+
+    SUPPORTS_TOUCH = 'ontouchstart' in window,
+
+    SUPPORTS_POINTER_IE10 = window.navigator.msPointerEnabled && !window.PointerEvent && !SUPPORTS_TOUCH,
+
+    SUPPORTS_POINTER = (window.PointerEvent || window.navigator.msPointerEnabled) && !SUPPORTS_TOUCH,
+
+    PLUGIN_NS = 'TouchSwipe';
+
+
+
+  /**
+  * The default configuration, and available options to configure touch swipe with.
+  * You can set the default values by updating any of the properties prior to instantiation.
+  * @name $.fn.swipe.defaults
+  * @namespace
+  * @property {int} [fingers=1] The number of fingers to detect in a swipe. Any swipes that do not meet this requirement will NOT trigger swipe handlers.
+  * @property {int} [threshold=75] The number of pixels that the user must move their finger by before it is considered a swipe.
+  * @property {int} [cancelThreshold=null] The number of pixels that the user must move their finger back from the original swipe direction to cancel the gesture.
+  * @property {int} [pinchThreshold=20] The number of pixels that the user must pinch their finger by before it is considered a pinch.
+  * @property {int} [maxTimeThreshold=null] Time, in milliseconds, between touchStart and touchEnd must NOT exceed in order to be considered a swipe.
+  * @property {int} [fingerReleaseThreshold=250] Time in milliseconds between releasing multiple fingers.  If 2 fingers are down, and are released one after the other, if they are within this threshold, it counts as a simultaneous release.
+  * @property {int} [longTapThreshold=500] Time in milliseconds between tap and release for a long tap
+  * @property {int} [doubleTapThreshold=200] Time in milliseconds between 2 taps to count as a double tap
+  * @property {function} [swipe=null] A handler to catch all swipes. See {@link $.fn.swipe#event:swipe}
+  * @property {function} [swipeLeft=null] A handler that is triggered for "left" swipes. See {@link $.fn.swipe#event:swipeLeft}
+  * @property {function} [swipeRight=null] A handler that is triggered for "right" swipes. See {@link $.fn.swipe#event:swipeRight}
+  * @property {function} [swipeUp=null] A handler that is triggered for "up" swipes. See {@link $.fn.swipe#event:swipeUp}
+  * @property {function} [swipeDown=null] A handler that is triggered for "down" swipes. See {@link $.fn.swipe#event:swipeDown}
+  * @property {function} [swipeStatus=null] A handler triggered for every phase of the swipe. See {@link $.fn.swipe#event:swipeStatus}
+  * @property {function} [pinchIn=null] A handler triggered for pinch in events. See {@link $.fn.swipe#event:pinchIn}
+  * @property {function} [pinchOut=null] A handler triggered for pinch out events. See {@link $.fn.swipe#event:pinchOut}
+  * @property {function} [pinchStatus=null] A handler triggered for every phase of a pinch. See {@link $.fn.swipe#event:pinchStatus}
+  * @property {function} [tap=null] A handler triggered when a user just taps on the item, rather than swipes it. If they do not move, tap is triggered, if they do move, it is not.
+  * @property {function} [doubleTap=null] A handler triggered when a user double taps on the item. The delay between taps can be set with the doubleTapThreshold property. See {@link $.fn.swipe.defaults#doubleTapThreshold}
+  * @property {function} [longTap=null] A handler triggered when a user long taps on the item. The delay between start and end can be set with the longTapThreshold property. See {@link $.fn.swipe.defaults#longTapThreshold}
+  * @property (function) [hold=null] A handler triggered when a user reaches longTapThreshold on the item. See {@link $.fn.swipe.defaults#longTapThreshold}
+  * @property {boolean} [triggerOnTouchEnd=true] If true, the swipe events are triggered when the touch end event is received (user releases finger).  If false, it will be triggered on reaching the threshold, and then cancel the touch event automatically.
+  * @property {boolean} [triggerOnTouchLeave=false] If true, then when the user leaves the swipe object, the swipe will end and trigger appropriate handlers.
+  * @property {string|undefined} [allowPageScroll='auto'] How the browser handles page scrolls when the user is swiping on a touchSwipe object. See {@link $.fn.swipe.pageScroll}.  <br/><br/>
+                    <code>"auto"</code> : all undefined swipes will cause the page to scroll in that direction. <br/>
+                    <code>"none"</code> : the page will not scroll when user swipes. <br/>
+                    <code>"horizontal"</code> : will force page to scroll on horizontal swipes. <br/>
+                    <code>"vertical"</code> : will force page to scroll on vertical swipes. <br/>
+  * @property {boolean} [fallbackToMouseEvents=true] If true mouse events are used when run on a non touch device, false will stop swipes being triggered by mouse events on non touch devices.
+  * @property {string} [excludedElements=".noSwipe"] A jquery selector that specifies child elements that do NOT trigger swipes. By default this excludes elements with the class .noSwipe .
+  * @property {boolean} [preventDefaultEvents=true] by default default events are cancelled, so the page doesn't move.  You can disable this so both native events fire as well as your handlers.
+
+  */
+  var defaults = {
+    fingers: 1,
+    threshold: 75,
+    cancelThreshold: null,
+    pinchThreshold: 20,
+    maxTimeThreshold: null,
+    fingerReleaseThreshold: 250,
+    longTapThreshold: 500,
+    doubleTapThreshold: 200,
+    swipe: null,
+    swipeLeft: null,
+    swipeRight: null,
+    swipeUp: null,
+    swipeDown: null,
+    swipeStatus: null,
+    pinchIn: null,
+    pinchOut: null,
+    pinchStatus: null,
+    click: null, //Deprecated since 1.6.2
+    tap: null,
+    doubleTap: null,
+    longTap: null,
+    hold: null,
+    triggerOnTouchEnd: true,
+    triggerOnTouchLeave: false,
+    allowPageScroll: "auto",
+    fallbackToMouseEvents: true,
+    excludedElements: ".noSwipe",
+    preventDefaultEvents: true
+  };
+
+
+
+  /**
+   * Applies TouchSwipe behaviour to one or more jQuery objects.
+   * The TouchSwipe plugin can be instantiated via this method, or methods within
+   * TouchSwipe can be executed via this method as per jQuery plugin architecture.
+   * An existing plugin can have its options changed simply by re calling .swipe(options)
+   * @see TouchSwipe
+   * @class
+   * @param {Mixed} method If the current DOMNode is a TouchSwipe object, and <code>method</code> is a TouchSwipe method, then
+   * the <code>method</code> is executed, and any following arguments are passed to the TouchSwipe method.
+   * If <code>method</code> is an object, then the TouchSwipe class is instantiated on the current DOMNode, passing the
+   * configuration properties defined in the object. See TouchSwipe
+   *
+   */
+  $.fn.swipe = function(method) {
+    var $this = $(this),
+      plugin = $this.data(PLUGIN_NS);
+
+    //Check if we are already instantiated and trying to execute a method
+    if (plugin && typeof method === 'string') {
+      if (plugin[method]) {
+        return plugin[method].apply(plugin, Array.prototype.slice.call(arguments, 1));
+      } else {
+        $.error('Method ' + method + ' does not exist on jQuery.swipe');
+      }
+    }
+
+    //Else update existing plugin with new options hash
+    else if (plugin && typeof method === 'object') {
+      plugin['option'].apply(plugin, arguments);
+    }
+
+    //Else not instantiated and trying to pass init object (or nothing)
+    else if (!plugin && (typeof method === 'object' || !method)) {
+      return init.apply(this, arguments);
+    }
+
+    return $this;
+  };
+
+  /**
+   * The version of the plugin
+   * @readonly
+   */
+  $.fn.swipe.version = VERSION;
+
+
+
+  //Expose our defaults so a user could override the plugin defaults
+  $.fn.swipe.defaults = defaults;
+
+  /**
+   * The phases that a touch event goes through.  The <code>phase</code> is passed to the event handlers.
+   * These properties are read only, attempting to change them will not alter the values passed to the event handlers.
+   * @namespace
+   * @readonly
+   * @property {string} PHASE_START Constant indicating the start phase of the touch event. Value is <code>"start"</code>.
+   * @property {string} PHASE_MOVE Constant indicating the move phase of the touch event. Value is <code>"move"</code>.
+   * @property {string} PHASE_END Constant indicating the end phase of the touch event. Value is <code>"end"</code>.
+   * @property {string} PHASE_CANCEL Constant indicating the cancel phase of the touch event. Value is <code>"cancel"</code>.
+   */
+  $.fn.swipe.phases = {
+    PHASE_START: PHASE_START,
+    PHASE_MOVE: PHASE_MOVE,
+    PHASE_END: PHASE_END,
+    PHASE_CANCEL: PHASE_CANCEL
+  };
+
+  /**
+   * The direction constants that are passed to the event handlers.
+   * These properties are read only, attempting to change them will not alter the values passed to the event handlers.
+   * @namespace
+   * @readonly
+   * @property {string} LEFT Constant indicating the left direction. Value is <code>"left"</code>.
+   * @property {string} RIGHT Constant indicating the right direction. Value is <code>"right"</code>.
+   * @property {string} UP Constant indicating the up direction. Value is <code>"up"</code>.
+   * @property {string} DOWN Constant indicating the down direction. Value is <code>"cancel"</code>.
+   * @property {string} IN Constant indicating the in direction. Value is <code>"in"</code>.
+   * @property {string} OUT Constant indicating the out direction. Value is <code>"out"</code>.
+   */
+  $.fn.swipe.directions = {
+    LEFT: LEFT,
+    RIGHT: RIGHT,
+    UP: UP,
+    DOWN: DOWN,
+    IN: IN,
+    OUT: OUT
+  };
+
+  /**
+   * The page scroll constants that can be used to set the value of <code>allowPageScroll</code> option
+   * These properties are read only
+   * @namespace
+   * @readonly
+   * @see $.fn.swipe.defaults#allowPageScroll
+   * @property {string} NONE Constant indicating no page scrolling is allowed. Value is <code>"none"</code>.
+   * @property {string} HORIZONTAL Constant indicating horizontal page scrolling is allowed. Value is <code>"horizontal"</code>.
+   * @property {string} VERTICAL Constant indicating vertical page scrolling is allowed. Value is <code>"vertical"</code>.
+   * @property {string} AUTO Constant indicating either horizontal or vertical will be allowed, depending on the swipe handlers registered. Value is <code>"auto"</code>.
+   */
+  $.fn.swipe.pageScroll = {
+    NONE: NONE,
+    HORIZONTAL: HORIZONTAL,
+    VERTICAL: VERTICAL,
+    AUTO: AUTO
+  };
+
+  /**
+   * Constants representing the number of fingers used in a swipe.  These are used to set both the value of <code>fingers</code> in the
+   * options object, as well as the value of the <code>fingers</code> event property.
+   * These properties are read only, attempting to change them will not alter the values passed to the event handlers.
+   * @namespace
+   * @readonly
+   * @see $.fn.swipe.defaults#fingers
+   * @property {string} ONE Constant indicating 1 finger is to be detected / was detected. Value is <code>1</code>.
+   * @property {string} TWO Constant indicating 2 fingers are to be detected / were detected. Value is <code>2</code>.
+   * @property {string} THREE Constant indicating 3 finger are to be detected / were detected. Value is <code>3</code>.
+   * @property {string} FOUR Constant indicating 4 finger are to be detected / were detected. Not all devices support this. Value is <code>4</code>.
+   * @property {string} FIVE Constant indicating 5 finger are to be detected / were detected. Not all devices support this. Value is <code>5</code>.
+   * @property {string} ALL Constant indicating any combination of finger are to be detected.  Value is <code>"all"</code>.
+   */
+  $.fn.swipe.fingers = {
+    ONE: 1,
+    TWO: 2,
+    THREE: 3,
+    FOUR: 4,
+    FIVE: 5,
+    ALL: ALL_FINGERS
+  };
+
+  /**
+   * Initialise the plugin for each DOM element matched
+   * This creates a new instance of the main TouchSwipe class for each DOM element, and then
+   * saves a reference to that instance in the elements data property.
+   * @internal
+   */
+  function init(options) {
+    //Prep and extend the options
+    if (options && (options.allowPageScroll === undefined && (options.swipe !== undefined || options.swipeStatus !== undefined))) {
+      options.allowPageScroll = NONE;
+    }
+
+    //Check for deprecated options
+    //Ensure that any old click handlers are assigned to the new tap, unless we have a tap
+    if (options.click !== undefined && options.tap === undefined) {
+      options.tap = options.click;
+    }
+
+    if (!options) {
+      options = {};
+    }
+
+    //pass empty object so we dont modify the defaults
+    options = $.extend({}, $.fn.swipe.defaults, options);
+
+    //For each element instantiate the plugin
+    return this.each(function() {
+      var $this = $(this);
+
+      //Check we havent already initialised the plugin
+      var plugin = $this.data(PLUGIN_NS);
+
+      if (!plugin) {
+        plugin = new TouchSwipe(this, options);
+        $this.data(PLUGIN_NS, plugin);
+      }
+    });
+  }
+
+  /**
+   * Main TouchSwipe Plugin Class.
+   * Do not use this to construct your TouchSwipe object, use the jQuery plugin method $.fn.swipe(); {@link $.fn.swipe}
+   * @private
+   * @name TouchSwipe
+   * @param {DOMNode} element The HTML DOM object to apply to plugin to
+   * @param {Object} options The options to configure the plugin with.  @link {$.fn.swipe.defaults}
+   * @see $.fh.swipe.defaults
+   * @see $.fh.swipe
+   * @class
+   */
+  function TouchSwipe(element, options) {
+
+    //take a local/instacne level copy of the options - should make it this.options really...
+    var options = $.extend({}, options);
+
+    var useTouchEvents = (SUPPORTS_TOUCH || SUPPORTS_POINTER || !options.fallbackToMouseEvents),
+      START_EV = useTouchEvents ? (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerDown' : 'pointerdown') : 'touchstart') : 'mousedown',
+      MOVE_EV = useTouchEvents ? (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerMove' : 'pointermove') : 'touchmove') : 'mousemove',
+      END_EV = useTouchEvents ? (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerUp' : 'pointerup') : 'touchend') : 'mouseup',
+      LEAVE_EV = useTouchEvents ? (SUPPORTS_POINTER ? 'mouseleave' : null) : 'mouseleave', //we manually detect leave on touch devices, so null event here
+      CANCEL_EV = (SUPPORTS_POINTER ? (SUPPORTS_POINTER_IE10 ? 'MSPointerCancel' : 'pointercancel') : 'touchcancel');
+
+
+
+    //touch properties
+    var distance = 0,
+      direction = null,
+      currentDirection = null,
+      duration = 0,
+      startTouchesDistance = 0,
+      endTouchesDistance = 0,
+      pinchZoom = 1,
+      pinchDistance = 0,
+      pinchDirection = 0,
+      maximumsMap = null;
+
+
+
+    //jQuery wrapped element for this instance
+    var $element = $(element);
+
+    //Current phase of th touch cycle
+    var phase = "start";
+
+    // the current number of fingers being used.
+    var fingerCount = 0;
+
+    //track mouse points / delta
+    var fingerData = {};
+
+    //track times
+    var startTime = 0,
+      endTime = 0,
+      previousTouchEndTime = 0,
+      fingerCountAtRelease = 0,
+      doubleTapStartTime = 0;
+
+    //Timeouts
+    var singleTapTimeout = null,
+      holdTimeout = null;
+
+    // Add gestures to all swipable areas if supported
+    try {
+      $element.on(START_EV, touchStart);
+      $element.on(CANCEL_EV, touchCancel);
+    } catch (e) {
+      $.error('events not supported ' + START_EV + ',' + CANCEL_EV + ' on jQuery.swipe');
+    }
+
+    //
+    //Public methods
+    //
+
+    /**
+     * re-enables the swipe plugin with the previous configuration
+     * @function
+     * @name $.fn.swipe#enable
+     * @return {DOMNode} The Dom element that was registered with TouchSwipe
+     * @example $("#element").swipe("enable");
+     */
+    this.enable = function() {
+      //Incase we are already enabled, clean up...
+      this.disable();
+      $element.on(START_EV, touchStart);
+      $element.on(CANCEL_EV, touchCancel);
+      return $element;
+    };
+
+    /**
+     * disables the swipe plugin
+     * @function
+     * @name $.fn.swipe#disable
+     * @return {DOMNode} The Dom element that is now registered with TouchSwipe
+     * @example $("#element").swipe("disable");
+     */
+    this.disable = function() {
+      removeListeners();
+      return $element;
+    };
+
+    /**
+     * Destroy the swipe plugin completely. To use any swipe methods, you must re initialise the plugin.
+     * @function
+     * @name $.fn.swipe#destroy
+     * @example $("#element").swipe("destroy");
+     */
+    this.destroy = function() {
+      removeListeners();
+      $element.data(PLUGIN_NS, null);
+      $element = null;
+    };
+
+
+    /**
+     * Allows run time updating of the swipe configuration options.
+     * @function
+     * @name $.fn.swipe#option
+     * @param {String} property The option property to get or set, or a has of multiple options to set
+     * @param {Object} [value] The value to set the property to
+     * @return {Object} If only a property name is passed, then that property value is returned. If nothing is passed the current options hash is returned.
+     * @example $("#element").swipe("option", "threshold"); // return the threshold
+     * @example $("#element").swipe("option", "threshold", 100); // set the threshold after init
+     * @example $("#element").swipe("option", {threshold:100, fingers:3} ); // set multiple properties after init
+     * @example $("#element").swipe({threshold:100, fingers:3} ); // set multiple properties after init - the "option" method is optional!
+     * @example $("#element").swipe("option"); // Return the current options hash
+     * @see $.fn.swipe.defaults
+     *
+     */
+    this.option = function(property, value) {
+
+      if (typeof property === 'object') {
+        options = $.extend(options, property);
+      } else if (options[property] !== undefined) {
+        if (value === undefined) {
+          return options[property];
+        } else {
+          options[property] = value;
+        }
+      } else if (!property) {
+        return options;
+      } else {
+        $.error('Option ' + property + ' does not exist on jQuery.swipe.options');
+      }
+
+      return null;
+    }
+
+
+
+    //
+    // Private methods
+    //
+
+    //
+    // EVENTS
+    //
+    /**
+     * Event handler for a touch start event.
+     * Stops the default click event from triggering and stores where we touched
+     * @inner
+     * @param {object} jqEvent The normalised jQuery event object.
+     */
+    function touchStart(jqEvent) {
+
+      //If we already in a touch event (a finger already in use) then ignore subsequent ones..
+      if (getTouchInProgress()) {
+        return;
+      }
+
+      //Check if this element matches any in the excluded elements selectors,  or its parent is excluded, if so, DON'T swipe
+      if ($(jqEvent.target).closest(options.excludedElements, $element).length > 0) {
+        return;
+      }
+
+      //As we use Jquery bind for events, we need to target the original event object
+      //If these events are being programmatically triggered, we don't have an original event object, so use the Jq one.
+      var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent;
+
+
+      //If we have a pointer event, whoes type is 'mouse' and we have said NO mouse events, then dont do anything.
+      if(event.pointerType && event.pointerType=="mouse" && options.fallbackToMouseEvents==false) {
+        return;
+      };
+
+      var ret,
+        touches = event.touches,
+        evt = touches ? touches[0] : event;
+
+      phase = PHASE_START;
+
+      //If we support touches, get the finger count
+      if (touches) {
+        // get the total number of fingers touching the screen
+        fingerCount = touches.length;
+      }
+      //Else this is the desktop, so stop the browser from dragging content
+      else if (options.preventDefaultEvents !== false) {
+        jqEvent.preventDefault(); //call this on jq event so we are cross browser
+      }
+
+      //clear vars..
+      distance = 0;
+      direction = null;
+      currentDirection=null;
+      pinchDirection = null;
+      duration = 0;
+      startTouchesDistance = 0;
+      endTouchesDistance = 0;
+      pinchZoom = 1;
+      pinchDistance = 0;
+      maximumsMap = createMaximumsData();
+      cancelMultiFingerRelease();
+
+      //Create the default finger data
+      createFingerData(0, evt);
+
+      // check the number of fingers is what we are looking for, or we are capturing pinches
+      if (!touches || (fingerCount === options.fingers || options.fingers === ALL_FINGERS) || hasPinches()) {
+        // get the coordinates of the touch
+        startTime = getTimeStamp();
+
+        if (fingerCount == 2) {
+          //Keep track of the initial pinch distance, so we can calculate the diff later
+          //Store second finger data as start
+          createFingerData(1, touches[1]);
+          startTouchesDistance = endTouchesDistance = calculateTouchesDistance(fingerData[0].start, fingerData[1].start);
+        }
+
+        if (options.swipeStatus || options.pinchStatus) {
+          ret = triggerHandler(event, phase);
+        }
+      } else {
+        //A touch with more or less than the fingers we are looking for, so cancel
+        ret = false;
+      }
+
+      //If we have a return value from the users handler, then return and cancel
+      if (ret === false) {
+        phase = PHASE_CANCEL;
+        triggerHandler(event, phase);
+        return ret;
+      } else {
+        if (options.hold) {
+          holdTimeout = setTimeout($.proxy(function() {
+            //Trigger the event
+            $element.trigger('hold', [event.target]);
+            //Fire the callback
+            if (options.hold) {
+              ret = options.hold.call($element, event, event.target);
+            }
+          }, this), options.longTapThreshold);
+        }
+
+        setTouchInProgress(true);
+      }
+
+      return null;
+    };
+
+
+
+    /**
+     * Event handler for a touch move event.
+     * If we change fingers during move, then cancel the event
+     * @inner
+     * @param {object} jqEvent The normalised jQuery event object.
+     */
+    function touchMove(jqEvent) {
+
+      //As we use Jquery bind for events, we need to target the original event object
+      //If these events are being programmatically triggered, we don't have an original event object, so use the Jq one.
+      var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent;
+
+      //If we are ending, cancelling, or within the threshold of 2 fingers being released, don't track anything..
+      if (phase === PHASE_END || phase === PHASE_CANCEL || inMultiFingerRelease())
+        return;
+
+      var ret,
+        touches = event.touches,
+        evt = touches ? touches[0] : event;
+
+
+      //Update the  finger data
+      var currentFinger = updateFingerData(evt);
+      endTime = getTimeStamp();
+
+      if (touches) {
+        fingerCount = touches.length;
+      }
+
+      if (options.hold) {
+        clearTimeout(holdTimeout);
+      }
+
+      phase = PHASE_MOVE;
+
+      //If we have 2 fingers get Touches distance as well
+      if (fingerCount == 2) {
+
+        //Keep track of the initial pinch distance, so we can calculate the diff later
+        //We do this here as well as the start event, in case they start with 1 finger, and the press 2 fingers
+        if (startTouchesDistance == 0) {
+          //Create second finger if this is the first time...
+          createFingerData(1, touches[1]);
+
+          startTouchesDistance = endTouchesDistance = calculateTouchesDistance(fingerData[0].start, fingerData[1].start);
+        } else {
+          //Else just update the second finger
+          updateFingerData(touches[1]);
+
+          endTouchesDistance = calculateTouchesDistance(fingerData[0].end, fingerData[1].end);
+          pinchDirection = calculatePinchDirection(fingerData[0].end, fingerData[1].end);
+        }
+
+        pinchZoom = calculatePinchZoom(startTouchesDistance, endTouchesDistance);
+        pinchDistance = Math.abs(startTouchesDistance - endTouchesDistance);
+      }
+
+      if ((fingerCount === options.fingers || options.fingers === ALL_FINGERS) || !touches || hasPinches()) {
+
+        //The overall direction of the swipe. From start to now.
+        direction = calculateDirection(currentFinger.start, currentFinger.end);
+
+        //The immediate direction of the swipe, direction between the last movement and this one.
+        currentDirection = calculateDirection(currentFinger.last, currentFinger.end);
+
+        //Check if we need to prevent default event (page scroll / pinch zoom) or not
+        validateDefaultEvent(jqEvent, currentDirection);
+
+        //Distance and duration are all off the main finger
+        distance = calculateDistance(currentFinger.start, currentFinger.end);
+        duration = calculateDuration();
+
+        //Cache the maximum distance we made in this direction
+        setMaxDistance(direction, distance);
+
+        //Trigger status handler
+        ret = triggerHandler(event, phase);
+
+
+        //If we trigger end events when threshold are met, or trigger events when touch leaves element
+        if (!options.triggerOnTouchEnd || options.triggerOnTouchLeave) {
+
+          var inBounds = true;
+
+          //If checking if we leave the element, run the bounds check (we can use touchleave as its not supported on webkit)
+          if (options.triggerOnTouchLeave) {
+            var bounds = getbounds(this);
+            inBounds = isInBounds(currentFinger.end, bounds);
+          }
+
+          //Trigger end handles as we swipe if thresholds met or if we have left the element if the user has asked to check these..
+          if (!options.triggerOnTouchEnd && inBounds) {
+            phase = getNextPhase(PHASE_MOVE);
+          }
+          //We end if out of bounds here, so set current phase to END, and check if its modified
+          else if (options.triggerOnTouchLeave && !inBounds) {
+            phase = getNextPhase(PHASE_END);
+          }
+
+          if (phase == PHASE_CANCEL || phase == PHASE_END) {
+            triggerHandler(event, phase);
+          }
+        }
+      } else {
+        phase = PHASE_CANCEL;
+        triggerHandler(event, phase);
+      }
+
+      if (ret === false) {
+        phase = PHASE_CANCEL;
+        triggerHandler(event, phase);
+      }
+    }
+
+
+
+
+    /**
+     * Event handler for a touch end event.
+     * Calculate the direction and trigger events
+     * @inner
+     * @param {object} jqEvent The normalised jQuery event object.
+     */
+    function touchEnd(jqEvent) {
+      //As we use Jquery bind for events, we need to target the original event object
+      //If these events are being programmatically triggered, we don't have an original event object, so use the Jq one.
+      var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent,
+        touches = event.touches;
+
+      //If we are still in a touch with the device wait a fraction and see if the other finger comes up
+      //if it does within the threshold, then we treat it as a multi release, not a single release and end the touch / swipe
+      if (touches) {
+        if (touches.length && !inMultiFingerRelease()) {
+          startMultiFingerRelease(event);
+          return true;
+        } else if (touches.length && inMultiFingerRelease()) {
+          return true;
+        }
+      }
+
+      //If a previous finger has been released, check how long ago, if within the threshold, then assume it was a multifinger release.
+      //This is used to allow 2 fingers to release fractionally after each other, whilst maintaining the event as containing 2 fingers, not 1
+      if (inMultiFingerRelease()) {
+        fingerCount = fingerCountAtRelease;
+      }
+
+      //Set end of swipe
+      endTime = getTimeStamp();
+
+      //Get duration incase move was never fired
+      duration = calculateDuration();
+
+      //If we trigger handlers at end of swipe OR, we trigger during, but they didnt trigger and we are still in the move phase
+      if (didSwipeBackToCancel() || !validateSwipeDistance()) {
+        phase = PHASE_CANCEL;
+        triggerHandler(event, phase);
+      } else if (options.triggerOnTouchEnd || (options.triggerOnTouchEnd === false && phase === PHASE_MOVE)) {
+        //call this on jq event so we are cross browser
+        if (options.preventDefaultEvents !== false && jqEvent.cancelable !== false) {
+          jqEvent.preventDefault();
+        }
+        phase = PHASE_END;
+        triggerHandler(event, phase);
+      }
+      //Special cases - A tap should always fire on touch end regardless,
+      //So here we manually trigger the tap end handler by itself
+      //We dont run trigger handler as it will re-trigger events that may have fired already
+      else if (!options.triggerOnTouchEnd && hasTap()) {
+        //Trigger the pinch events...
+        phase = PHASE_END;
+        triggerHandlerForGesture(event, phase, TAP);
+      } else if (phase === PHASE_MOVE) {
+        phase = PHASE_CANCEL;
+        triggerHandler(event, phase);
+      }
+
+      setTouchInProgress(false);
+
+      return null;
+    }
+
+
+
+    /**
+     * Event handler for a touch cancel event.
+     * Clears current vars
+     * @inner
+     */
+    function touchCancel() {
+      // reset the variables back to default values
+      fingerCount = 0;
+      endTime = 0;
+      startTime = 0;
+      startTouchesDistance = 0;
+      endTouchesDistance = 0;
+      pinchZoom = 1;
+
+      //If we were in progress of tracking a possible multi touch end, then re set it.
+      cancelMultiFingerRelease();
+
+      setTouchInProgress(false);
+    }
+
+
+    /**
+     * Event handler for a touch leave event.
+     * This is only triggered on desktops, in touch we work this out manually
+     * as the touchleave event is not supported in webkit
+     * @inner
+     */
+    function touchLeave(jqEvent) {
+      //If these events are being programmatically triggered, we don't have an original event object, so use the Jq one.
+      var event = jqEvent.originalEvent ? jqEvent.originalEvent : jqEvent;
+
+      //If we have the trigger on leave property set....
+      if (options.triggerOnTouchLeave) {
+        phase = getNextPhase(PHASE_END);
+        triggerHandler(event, phase);
+      }
+    }
+
+    /**
+     * Removes all listeners that were associated with the plugin
+     * @inner
+     */
+    function removeListeners() {
+      $element.off(START_EV, touchStart);
+      $element.off(CANCEL_EV, touchCancel);
+      $element.off(MOVE_EV, touchMove);
+      $element.off(END_EV, touchEnd);
+
+      //we only have leave events on desktop, we manually calculate leave on touch as its not supported in webkit
+      if (LEAVE_EV) {
+        $element.off(LEAVE_EV, touchLeave);
+      }
+
+      setTouchInProgress(false);
+    }
+
+
+    /**
+     * Checks if the time and distance thresholds have been met, and if so then the appropriate handlers are fired.
+     */
+    function getNextPhase(currentPhase) {
+
+      var nextPhase = currentPhase;
+
+      // Ensure we have valid swipe (under time and over distance  and check if we are out of bound...)
+      var validTime = validateSwipeTime();
+      var validDistance = validateSwipeDistance();
+      var didCancel = didSwipeBackToCancel();
+
+      //If we have exceeded our time, then cancel
+      if (!validTime || didCancel) {
+        nextPhase = PHASE_CANCEL;
+      }
+      //Else if we are moving, and have reached distance then end
+      else if (validDistance && currentPhase == PHASE_MOVE && (!options.triggerOnTouchEnd || options.triggerOnTouchLeave)) {
+        nextPhase = PHASE_END;
+      }
+      //Else if we have ended by leaving and didn't reach distance, then cancel
+      else if (!validDistance && currentPhase == PHASE_END && options.triggerOnTouchLeave) {
+        nextPhase = PHASE_CANCEL;
+      }
+
+      return nextPhase;
+    }
+
+
+    /**
+     * Trigger the relevant event handler
+     * The handlers are passed the original event, the element that was swiped, and in the case of the catch all handler, the direction that was swiped, "left", "right", "up", or "down"
+     * @param {object} event the original event object
+     * @param {string} phase the phase of the swipe (start, end cancel etc) {@link $.fn.swipe.phases}
+     * @inner
+     */
+    function triggerHandler(event, phase) {
+
+
+
+      var ret,
+        touches = event.touches;
+
+      // SWIPE GESTURES
+      if (didSwipe() || hasSwipes()) {
+          ret = triggerHandlerForGesture(event, phase, SWIPE);
+      }
+
+      // PINCH GESTURES (if the above didn't cancel)
+      if ((didPinch() || hasPinches()) && ret !== false) {
+          ret = triggerHandlerForGesture(event, phase, PINCH);
+      }
+
+      // CLICK / TAP (if the above didn't cancel)
+      if (didDoubleTap() && ret !== false) {
+        //Trigger the tap events...
+        ret = triggerHandlerForGesture(event, phase, DOUBLE_TAP);
+      }
+
+      // CLICK / TAP (if the above didn't cancel)
+      else if (didLongTap() && ret !== false) {
+        //Trigger the tap events...
+        ret = triggerHandlerForGesture(event, phase, LONG_TAP);
+      }
+
+      // CLICK / TAP (if the above didn't cancel)
+      else if (didTap() && ret !== false) {
+        //Trigger the tap event..
+        ret = triggerHandlerForGesture(event, phase, TAP);
+      }
+
+
+
+      // If we are cancelling the gesture, then manually trigger the reset handler
+      if (phase === PHASE_CANCEL) {
+
+        touchCancel(event);
+      }
+
+
+
+
+      // If we are ending the gesture, then manually trigger the reset handler IF all fingers are off
+      if (phase === PHASE_END) {
+        //If we support touch, then check that all fingers are off before we cancel
+        if (touches) {
+          if (!touches.length) {
+            touchCancel(event);
+          }
+        } else {
+          touchCancel(event);
+        }
+      }
+
+      return ret;
+    }
+
+
+
+    /**
+     * Trigger the relevant event handler
+     * The handlers are passed the original event, the element that was swiped, and in the case of the catch all handler, the direction that was swiped, "left", "right", "up", or "down"
+     * @param {object} event the original event object
+     * @param {string} phase the phase of the swipe (start, end cancel etc) {@link $.fn.swipe.phases}
+     * @param {string} gesture the gesture to trigger a handler for : PINCH or SWIPE {@link $.fn.swipe.gestures}
+     * @return Boolean False, to indicate that the event should stop propagation, or void.
+     * @inner
+     */
+    function triggerHandlerForGesture(event, phase, gesture) {
+
+      var ret;
+
+      //SWIPES....
+      if (gesture == SWIPE) {
+        //Trigger status every time..
+        $element.trigger('swipeStatus', [phase, direction || null, distance || 0, duration || 0, fingerCount, fingerData, currentDirection]);
+
+        if (options.swipeStatus) {
+          ret = options.swipeStatus.call($element, event, phase, direction || null, distance || 0, duration || 0, fingerCount, fingerData, currentDirection);
+          //If the status cancels, then dont run the subsequent event handlers..
+          if (ret === false) return false;
+        }
+
+        if (phase == PHASE_END && validateSwipe()) {
+
+          //Cancel any taps that were in progress...
+          clearTimeout(singleTapTimeout);
+          clearTimeout(holdTimeout);
+
+          $element.trigger('swipe', [direction, distance, duration, fingerCount, fingerData, currentDirection]);
+
+          if (options.swipe) {
+            ret = options.swipe.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection);
+            //If the status cancels, then dont run the subsequent event handlers..
+            if (ret === false) return false;
+          }
+
+          //trigger direction specific event handlers
+          switch (direction) {
+            case LEFT:
+              $element.trigger('swipeLeft', [direction, distance, duration, fingerCount, fingerData, currentDirection]);
+
+              if (options.swipeLeft) {
+                ret = options.swipeLeft.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection);
+              }
+              break;
+
+            case RIGHT:
+              $element.trigger('swipeRight', [direction, distance, duration, fingerCount, fingerData, currentDirection]);
+
+              if (options.swipeRight) {
+                ret = options.swipeRight.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection);
+              }
+              break;
+
+            case UP:
+              $element.trigger('swipeUp', [direction, distance, duration, fingerCount, fingerData, currentDirection]);
+
+              if (options.swipeUp) {
+                ret = options.swipeUp.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection);
+              }
+              break;
+
+            case DOWN:
+              $element.trigger('swipeDown', [direction, distance, duration, fingerCount, fingerData, currentDirection]);
+
+              if (options.swipeDown) {
+                ret = options.swipeDown.call($element, event, direction, distance, duration, fingerCount, fingerData, currentDirection);
+              }
+              break;
+          }
+        }
+      }
+
+
+      //PINCHES....
+      if (gesture == PINCH) {
+        $element.trigger('pinchStatus', [phase, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]);
+
+        if (options.pinchStatus) {
+          ret = options.pinchStatus.call($element, event, phase, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData);
+          //If the status cancels, then dont run the subsequent event handlers..
+          if (ret === false) return false;
+        }
+
+        if (phase == PHASE_END && validatePinch()) {
+
+          switch (pinchDirection) {
+            case IN:
+              $element.trigger('pinchIn', [pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]);
+
+              if (options.pinchIn) {
+                ret = options.pinchIn.call($element, event, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData);
+              }
+              break;
+
+            case OUT:
+              $element.trigger('pinchOut', [pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData]);
+
+              if (options.pinchOut) {
+                ret = options.pinchOut.call($element, event, pinchDirection || null, pinchDistance || 0, duration || 0, fingerCount, pinchZoom, fingerData);
+              }
+              break;
+          }
+        }
+      }
+
+      if (gesture == TAP) {
+        if (phase === PHASE_CANCEL || phase === PHASE_END) {
+
+          clearTimeout(singleTapTimeout);
+          clearTimeout(holdTimeout);
+
+          //If we are also looking for doubelTaps, wait incase this is one...
+          if (hasDoubleTap() && !inDoubleTap()) {
+            doubleTapStartTime = getTimeStamp();
+
+            //Now wait for the double tap timeout, and trigger this single tap
+            //if its not cancelled by a double tap
+            singleTapTimeout = setTimeout($.proxy(function() {
+              doubleTapStartTime = null;
+              $element.trigger('tap', [event.target]);
+
+              if (options.tap) {
+                ret = options.tap.call($element, event, event.target);
+              }
+            }, this), options.doubleTapThreshold);
+
+          } else {
+            doubleTapStartTime = null;
+            $element.trigger('tap', [event.target]);
+            if (options.tap) {
+              ret = options.tap.call($element, event, event.target);
+            }
+          }
+        }
+      } else if (gesture == DOUBLE_TAP) {
+        if (phase === PHASE_CANCEL || phase === PHASE_END) {
+          clearTimeout(singleTapTimeout);
+          clearTimeout(holdTimeout);
+          doubleTapStartTime = null;
+          $element.trigger('doubletap', [event.target]);
+
+          if (options.doubleTap) {
+            ret = options.doubleTap.call($element, event, event.target);
+          }
+        }
+      } else if (gesture == LONG_TAP) {
+        if (phase === PHASE_CANCEL || phase === PHASE_END) {
+          clearTimeout(singleTapTimeout);
+          doubleTapStartTime = null;
+
+          $element.trigger('longtap', [event.target]);
+          if (options.longTap) {
+            ret = options.longTap.call($element, event, event.target);
+          }
+        }
+      }
+
+      return ret;
+    }
+
+
+    //
+    // GESTURE VALIDATION
+    //
+
+    /**
+     * Checks the user has swipe far enough
+     * @return Boolean if <code>threshold</code> has been set, return true if the threshold was met, else false.
+     * If no threshold was set, then we return true.
+     * @inner
+     */
+    function validateSwipeDistance() {
+      var valid = true;
+      //If we made it past the min swipe distance..
+      if (options.threshold !== null) {
+        valid = distance >= options.threshold;
+      }
+
+      return valid;
+    }
+
+    /**
+     * Checks the user has swiped back to cancel.
+     * @return Boolean if <code>cancelThreshold</code> has been set, return true if the cancelThreshold was met, else false.
+     * If no cancelThreshold was set, then we return true.
+     * @inner
+     */
+    function didSwipeBackToCancel() {
+      var cancelled = false;
+      if (options.cancelThreshold !== null && direction !== null) {
+        cancelled = (getMaxDistance(direction) - distance) >= options.cancelThreshold;
+      }
+
+      return cancelled;
+    }
+
+    /**
+     * Checks the user has pinched far enough
+     * @return Boolean if <code>pinchThreshold</code> has been set, return true if the threshold was met, else false.
+     * If no threshold was set, then we return true.
+     * @inner
+     */
+    function validatePinchDistance() {
+      if (options.pinchThreshold !== null) {
+        return pinchDistance >= options.pinchThreshold;
+      }
+      return true;
+    }
+
+    /**
+     * Checks that the time taken to swipe meets the minimum / maximum requirements
+     * @return Boolean
+     * @inner
+     */
+    function validateSwipeTime() {
+      var result;
+      //If no time set, then return true
+      if (options.maxTimeThreshold) {
+        if (duration >= options.maxTimeThreshold) {
+          result = false;
+        } else {
+          result = true;
+        }
+      } else {
+        result = true;
+      }
+
+      return result;
+    }
+
+
+    /**
+     * Checks direction of the swipe and the value allowPageScroll to see if we should allow or prevent the default behaviour from occurring.
+     * This will essentially allow page scrolling or not when the user is swiping on a touchSwipe object.
+     * @param {object} jqEvent The normalised jQuery representation of the event object.
+     * @param {string} direction The direction of the event. See {@link $.fn.swipe.directions}
+     * @see $.fn.swipe.directions
+     * @inner
+     */
+    function validateDefaultEvent(jqEvent, direction) {
+
+      //If the option is set, allways allow the event to bubble up (let user handle weirdness)
+      if (options.preventDefaultEvents === false) {
+        return;
+      }
+
+      if (options.allowPageScroll === NONE) {
+        jqEvent.preventDefault();
+      } else {
+        var auto = options.allowPageScroll === AUTO;
+
+        switch (direction) {
+          case LEFT:
+            if ((options.swipeLeft && auto) || (!auto && options.allowPageScroll != HORIZONTAL)) {
+              jqEvent.preventDefault();
+            }
+            break;
+
+          case RIGHT:
+            if ((options.swipeRight && auto) || (!auto && options.allowPageScroll != HORIZONTAL)) {
+              jqEvent.preventDefault();
+            }
+            break;
+
+          case UP:
+            if ((options.swipeUp && auto) || (!auto && options.allowPageScroll != VERTICAL)) {
+              jqEvent.preventDefault();
+            }
+            break;
+
+          case DOWN:
+            if ((options.swipeDown && auto) || (!auto && options.allowPageScroll != VERTICAL)) {
+              jqEvent.preventDefault();
+            }
+            break;
+
+          case NONE:
+
+            break;
+        }
+      }
+    }
+
+
+    // PINCHES
+    /**
+     * Returns true of the current pinch meets the thresholds
+     * @return Boolean
+     * @inner
+     */
+    function validatePinch() {
+      var hasCorrectFingerCount = validateFingers();
+      var hasEndPoint = validateEndPoint();
+      var hasCorrectDistance = validatePinchDistance();
+      return hasCorrectFingerCount && hasEndPoint && hasCorrectDistance;
+
+    }
+
+    /**
+     * Returns true if any Pinch events have been registered
+     * @return Boolean
+     * @inner
+     */
+    function hasPinches() {
+      //Enure we dont return 0 or null for false values
+      return !!(options.pinchStatus || options.pinchIn || options.pinchOut);
+    }
+
+    /**
+     * Returns true if we are detecting pinches, and have one
+     * @return Boolean
+     * @inner
+     */
+    function didPinch() {
+      //Enure we dont return 0 or null for false values
+      return !!(validatePinch() && hasPinches());
+    }
+
+
+
+
+    // SWIPES
+    /**
+     * Returns true if the current swipe meets the thresholds
+     * @return Boolean
+     * @inner
+     */
+    function validateSwipe() {
+      //Check validity of swipe
+      var hasValidTime = validateSwipeTime();
+      var hasValidDistance = validateSwipeDistance();
+      var hasCorrectFingerCount = validateFingers();
+      var hasEndPoint = validateEndPoint();
+      var didCancel = didSwipeBackToCancel();
+
+      // if the user swiped more than the minimum length, perform the appropriate action
+      // hasValidDistance is null when no distance is set
+      var valid = !didCancel && hasEndPoint && hasCorrectFingerCount && hasValidDistance && hasValidTime;
+
+      return valid;
+    }
+
+    /**
+     * Returns true if any Swipe events have been registered
+     * @return Boolean
+     * @inner
+     */
+    function hasSwipes() {
+      //Enure we dont return 0 or null for false values
+      return !!(options.swipe || options.swipeStatus || options.swipeLeft || options.swipeRight || options.swipeUp || options.swipeDown);
+    }
+
+
+    /**
+     * Returns true if we are detecting swipes and have one
+     * @return Boolean
+     * @inner
+     */
+    function didSwipe() {
+      //Enure we dont return 0 or null for false values
+      return !!(validateSwipe() && hasSwipes());
+    }
+
+    /**
+     * Returns true if we have matched the number of fingers we are looking for
+     * @return Boolean
+     * @inner
+     */
+    function validateFingers() {
+      //The number of fingers we want were matched, or on desktop we ignore
+      return ((fingerCount === options.fingers || options.fingers === ALL_FINGERS) || !SUPPORTS_TOUCH);
+    }
+
+    /**
+     * Returns true if we have an end point for the swipe
+     * @return Boolean
+     * @inner
+     */
+    function validateEndPoint() {
+      //We have an end value for the finger
+      return fingerData[0].end.x !== 0;
+    }
+
+    // TAP / CLICK
+    /**
+     * Returns true if a click / tap events have been registered
+     * @return Boolean
+     * @inner
+     */
+    function hasTap() {
+      //Enure we dont return 0 or null for false values
+      return !!(options.tap);
+    }
+
+    /**
+     * Returns true if a double tap events have been registered
+     * @return Boolean
+     * @inner
+     */
+    function hasDoubleTap() {
+      //Enure we dont return 0 or null for false values
+      return !!(options.doubleTap);
+    }
+
+    /**
+     * Returns true if any long tap events have been registered
+     * @return Boolean
+     * @inner
+     */
+    function hasLongTap() {
+      //Enure we dont return 0 or null for false values
+      return !!(options.longTap);
+    }
+
+    /**
+     * Returns true if we could be in the process of a double tap (one tap has occurred, we are listening for double taps, and the threshold hasn't past.
+     * @return Boolean
+     * @inner
+     */
+    function validateDoubleTap() {
+      if (doubleTapStartTime == null) {
+        return false;
+      }
+      var now = getTimeStamp();
+      return (hasDoubleTap() && ((now - doubleTapStartTime) <= options.doubleTapThreshold));
+    }
+
+    /**
+     * Returns true if we could be in the process of a double tap (one tap has occurred, we are listening for double taps, and the threshold hasn't past.
+     * @return Boolean
+     * @inner
+     */
+    function inDoubleTap() {
+      return validateDoubleTap();
+    }
+
+
+    /**
+     * Returns true if we have a valid tap
+     * @return Boolean
+     * @inner
+     */
+    function validateTap() {
+      return ((fingerCount === 1 || !SUPPORTS_TOUCH) && (isNaN(distance) || distance < options.threshold));
+    }
+
+    /**
+     * Returns true if we have a valid long tap
+     * @return Boolean
+     * @inner
+     */
+    function validateLongTap() {
+      //slight threshold on moving finger
+      return ((duration > options.longTapThreshold) && (distance < DOUBLE_TAP_THRESHOLD));
+    }
+
+    /**
+     * Returns true if we are detecting taps and have one
+     * @return Boolean
+     * @inner
+     */
+    function didTap() {
+      //Enure we dont return 0 or null for false values
+      return !!(validateTap() && hasTap());
+    }
+
+
+    /**
+     * Returns true if we are detecting double taps and have one
+     * @return Boolean
+     * @inner
+     */
+    function didDoubleTap() {
+      //Enure we dont return 0 or null for false values
+      return !!(validateDoubleTap() && hasDoubleTap());
+    }
+
+    /**
+     * Returns true if we are detecting long taps and have one
+     * @return Boolean
+     * @inner
+     */
+    function didLongTap() {
+      //Enure we dont return 0 or null for false values
+      return !!(validateLongTap() && hasLongTap());
+    }
+
+
+
+
+    // MULTI FINGER TOUCH
+    /**
+     * Starts tracking the time between 2 finger releases, and keeps track of how many fingers we initially had up
+     * @inner
+     */
+    function startMultiFingerRelease(event) {
+      previousTouchEndTime = getTimeStamp();
+      fingerCountAtRelease = event.touches.length + 1;
+    }
+
+    /**
+     * Cancels the tracking of time between 2 finger releases, and resets counters
+     * @inner
+     */
+    function cancelMultiFingerRelease() {
+      previousTouchEndTime = 0;
+      fingerCountAtRelease = 0;
+    }
+
+    /**
+     * Checks if we are in the threshold between 2 fingers being released
+     * @return Boolean
+     * @inner
+     */
+    function inMultiFingerRelease() {
+
+      var withinThreshold = false;
+
+      if (previousTouchEndTime) {
+        var diff = getTimeStamp() - previousTouchEndTime
+        if (diff <= options.fingerReleaseThreshold) {
+          withinThreshold = true;
+        }
+      }
+
+      return withinThreshold;
+    }
+
+
+    /**
+     * gets a data flag to indicate that a touch is in progress
+     * @return Boolean
+     * @inner
+     */
+    function getTouchInProgress() {
+      //strict equality to ensure only true and false are returned
+      return !!($element.data(PLUGIN_NS + '_intouch') === true);
+    }
+
+    /**
+     * Sets a data flag to indicate that a touch is in progress
+     * @param {boolean} val The value to set the property to
+     * @inner
+     */
+    function setTouchInProgress(val) {
+
+      //If destroy is called in an event handler, we have no el, and we have already cleaned up, so return.
+      if(!$element) { return; }
+
+      //Add or remove event listeners depending on touch status
+      if (val === true) {
+        $element.on(MOVE_EV, touchMove);
+        $element.on(END_EV, touchEnd);
+
+        //we only have leave events on desktop, we manually calcuate leave on touch as its not supported in webkit
+        if (LEAVE_EV) {
+          $element.on(LEAVE_EV, touchLeave);
+        }
+      } else {
+
+        $element.off(MOVE_EV, touchMove, false);
+        $element.off(END_EV, touchEnd, false);
+
+        //we only have leave events on desktop, we manually calcuate leave on touch as its not supported in webkit
+        if (LEAVE_EV) {
+          $element.off(LEAVE_EV, touchLeave, false);
+        }
+      }
+
+
+      //strict equality to ensure only true and false can update the value
+      $element.data(PLUGIN_NS + '_intouch', val === true);
+    }
+
+
+    /**
+     * Creates the finger data for the touch/finger in the event object.
+     * @param {int} id The id to store the finger data under (usually the order the fingers were pressed)
+     * @param {object} evt The event object containing finger data
+     * @return finger data object
+     * @inner
+     */
+    function createFingerData(id, evt) {
+      var f = {
+        start: {
+          x: 0,
+          y: 0
+        },
+        last: {
+          x: 0,
+          y: 0
+        },
+        end: {
+          x: 0,
+          y: 0
+        }
+      };
+      f.start.x = f.last.x = f.end.x = evt.pageX || evt.clientX;
+      f.start.y = f.last.y = f.end.y = evt.pageY || evt.clientY;
+      fingerData[id] = f;
+      return f;
+    }
+
+    /**
+     * Updates the finger data for a particular event object
+     * @param {object} evt The event object containing the touch/finger data to upadte
+     * @return a finger data object.
+     * @inner
+     */
+    function updateFingerData(evt) {
+      var id = evt.identifier !== undefined ? evt.identifier : 0;
+      var f = getFingerData(id);
+
+      if (f === null) {
+        f = createFingerData(id, evt);
+      }
+
+      f.last.x = f.end.x;
+      f.last.y = f.end.y;
+
+      f.end.x = evt.pageX || evt.clientX;
+      f.end.y = evt.pageY || evt.clientY;
+
+      return f;
+    }
+
+    /**
+     * Returns a finger data object by its event ID.
+     * Each touch event has an identifier property, which is used
+     * to track repeat touches
+     * @param {int} id The unique id of the finger in the sequence of touch events.
+     * @return a finger data object.
+     * @inner
+     */
+    function getFingerData(id) {
+      return fingerData[id] || null;
+    }
+
+
+    /**
+     * Sets the maximum distance swiped in the given direction.
+     * If the new value is lower than the current value, the max value is not changed.
+     * @param {string}  direction The direction of the swipe
+     * @param {int}  distance The distance of the swipe
+     * @inner
+     */
+    function setMaxDistance(direction, distance) {
+      if(direction==NONE) return;
+      distance = Math.max(distance, getMaxDistance(direction));
+      maximumsMap[direction].distance = distance;
+    }
+
+    /**
+     * gets the maximum distance swiped in the given direction.
+     * @param {string}  direction The direction of the swipe
+     * @return int  The distance of the swipe
+     * @inner
+     */
+    function getMaxDistance(direction) {
+      if (maximumsMap[direction]) return maximumsMap[direction].distance;
+      return undefined;
+    }
+
+    /**
+     * Creats a map of directions to maximum swiped values.
+     * @return Object A dictionary of maximum values, indexed by direction.
+     * @inner
+     */
+    function createMaximumsData() {
+      var maxData = {};
+      maxData[LEFT] = createMaximumVO(LEFT);
+      maxData[RIGHT] = createMaximumVO(RIGHT);
+      maxData[UP] = createMaximumVO(UP);
+      maxData[DOWN] = createMaximumVO(DOWN);
+
+      return maxData;
+    }
+
+    /**
+     * Creates a map maximum swiped values for a given swipe direction
+     * @param {string} The direction that these values will be associated with
+     * @return Object Maximum values
+     * @inner
+     */
+    function createMaximumVO(dir) {
+      return {
+        direction: dir,
+        distance: 0
+      }
+    }
+
+
+    //
+    // MATHS / UTILS
+    //
+
+    /**
+     * Calculate the duration of the swipe
+     * @return int
+     * @inner
+     */
+    function calculateDuration() {
+      return endTime - startTime;
+    }
+
+    /**
+     * Calculate the distance between 2 touches (pinch)
+     * @param {point} startPoint A point object containing x and y co-ordinates
+     * @param {point} endPoint A point object containing x and y co-ordinates
+     * @return int;
+     * @inner
+     */
+    function calculateTouchesDistance(startPoint, endPoint) {
+      var diffX = Math.abs(startPoint.x - endPoint.x);
+      var diffY = Math.abs(startPoint.y - endPoint.y);
+
+      return Math.round(Math.sqrt(diffX * diffX + diffY * diffY));
+    }
+
+    /**
+     * Calculate the zoom factor between the start and end distances
+     * @param {int} startDistance Distance (between 2 fingers) the user started pinching at
+     * @param {int} endDistance Distance (between 2 fingers) the user ended pinching at
+     * @return float The zoom value from 0 to 1.
+     * @inner
+     */
+    function calculatePinchZoom(startDistance, endDistance) {
+      var percent = (endDistance / startDistance) * 1;
+      return percent.toFixed(2);
+    }
+
+
+    /**
+     * Returns the pinch direction, either IN or OUT for the given points
+     * @return string Either {@link $.fn.swipe.directions.IN} or {@link $.fn.swipe.directions.OUT}
+     * @see $.fn.swipe.directions
+     * @inner
+     */
+    function calculatePinchDirection() {
+      if (pinchZoom < 1) {
+        return OUT;
+      } else {
+        return IN;
+      }
+    }
+
+
+    /**
+     * Calculate the length / distance of the swipe
+     * @param {point} startPoint A point object containing x and y co-ordinates
+     * @param {point} endPoint A point object containing x and y co-ordinates
+     * @return int
+     * @inner
+     */
+    function calculateDistance(startPoint, endPoint) {
+      return Math.round(Math.sqrt(Math.pow(endPoint.x - startPoint.x, 2) + Math.pow(endPoint.y - startPoint.y, 2)));
+    }
+
+    /**
+     * Calculate the angle of the swipe
+     * @param {point} startPoint A point object containing x and y co-ordinates
+     * @param {point} endPoint A point object containing x and y co-ordinates
+     * @return int
+     * @inner
+     */
+    function calculateAngle(startPoint, endPoint) {
+      var x = startPoint.x - endPoint.x;
+      var y = endPoint.y - startPoint.y;
+      var r = Math.atan2(y, x); //radians
+      var angle = Math.round(r * 180 / Math.PI); //degrees
+
+      //ensure value is positive
+      if (angle < 0) {
+        angle = 360 - Math.abs(angle);
+      }
+
+      return angle;
+    }
+
+    /**
+     * Calculate the direction of the swipe
+     * This will also call calculateAngle to get the latest angle of swipe
+     * @param {point} startPoint A point object containing x and y co-ordinates
+     * @param {point} endPoint A point object containing x and y co-ordinates
+     * @return string Either {@link $.fn.swipe.directions.LEFT} / {@link $.fn.swipe.directions.RIGHT} / {@link $.fn.swipe.directions.DOWN} / {@link $.fn.swipe.directions.UP}
+     * @see $.fn.swipe.directions
+     * @inner
+     */
+    function calculateDirection(startPoint, endPoint) {
+
+      if( comparePoints(startPoint, endPoint) ) {
+        return NONE;
+      }
+
+      var angle = calculateAngle(startPoint, endPoint);
+
+      if ((angle <= 45) && (angle >= 0)) {
+        return LEFT;
+      } else if ((angle <= 360) && (angle >= 315)) {
+        return LEFT;
+      } else if ((angle >= 135) && (angle <= 225)) {
+        return RIGHT;
+      } else if ((angle > 45) && (angle < 135)) {
+        return DOWN;
+      } else {
+        return UP;
+      }
+    }
+
+
+    /**
+     * Returns a MS time stamp of the current time
+     * @return int
+     * @inner
+     */
+    function getTimeStamp() {
+      var now = new Date();
+      return now.getTime();
+    }
+
+
+
+    /**
+     * Returns a bounds object with left, right, top and bottom properties for the element specified.
+     * @param {DomNode} The DOM node to get the bounds for.
+     */
+    function getbounds(el) {
+      el = $(el);
+      var offset = el.offset();
+
+      var bounds = {
+        left: offset.left,
+        right: offset.left + el.outerWidth(),
+        top: offset.top,
+        bottom: offset.top + el.outerHeight()
+      }
+
+      return bounds;
+    }
+
+
+    /**
+     * Checks if the point object is in the bounds object.
+     * @param {object} point A point object.
+     * @param {int} point.x The x value of the point.
+     * @param {int} point.y The x value of the point.
+     * @param {object} bounds The bounds object to test
+     * @param {int} bounds.left The leftmost value
+     * @param {int} bounds.right The righttmost value
+     * @param {int} bounds.top The topmost value
+     * @param {int} bounds.bottom The bottommost value
+     */
+    function isInBounds(point, bounds) {
+      return (point.x > bounds.left && point.x < bounds.right && point.y > bounds.top && point.y < bounds.bottom);
+    };
+
+    /**
+     * Checks if the two points are equal
+     * @param {object} point A point object.
+     * @param {object} point B point object.
+     * @return true of the points match
+     */
+    function comparePoints(pointA, pointB) {
+      return (pointA.x == pointB.x && pointA.y == pointB.y);
+    }
+
+
+  }
+
+
+
+
+  /**
+   * A catch all handler that is triggered for all swipe directions.
+   * @name $.fn.swipe#swipe
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user swiped
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {object} fingerData The coordinates of fingers in event
+   * @param {string} currentDirection The current direction the user is swiping.
+   */
+
+
+
+
+  /**
+   * A handler that is triggered for "left" swipes.
+   * @name $.fn.swipe#swipeLeft
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user swiped
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {object} fingerData The coordinates of fingers in event
+   * @param {string} currentDirection The current direction the user is swiping.
+   */
+
+  /**
+   * A handler that is triggered for "right" swipes.
+   * @name $.fn.swipe#swipeRight
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user swiped
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {object} fingerData The coordinates of fingers in event
+   * @param {string} currentDirection The current direction the user is swiping.
+   */
+
+  /**
+   * A handler that is triggered for "up" swipes.
+   * @name $.fn.swipe#swipeUp
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user swiped
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {object} fingerData The coordinates of fingers in event
+   * @param {string} currentDirection The current direction the user is swiping.
+   */
+
+  /**
+   * A handler that is triggered for "down" swipes.
+   * @name $.fn.swipe#swipeDown
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user swiped in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user swiped
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {object} fingerData The coordinates of fingers in event
+   * @param {string} currentDirection The current direction the user is swiping.
+   */
+
+  /**
+   * A handler triggered for every phase of the swipe. This handler is constantly fired for the duration of the pinch.
+   * This is triggered regardless of swipe thresholds.
+   * @name $.fn.swipe#swipeStatus
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {string} phase The phase of the swipe event. See {@link $.fn.swipe.phases}
+   * @param {string} direction The direction the user swiped in. This is null if the user has yet to move. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user swiped. This is 0 if the user has yet to move.
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {object} fingerData The coordinates of fingers in event
+   * @param {string} currentDirection The current direction the user is swiping.
+   */
+
+  /**
+   * A handler triggered for pinch in events.
+   * @name $.fn.swipe#pinchIn
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user pinched in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user pinched
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {int} zoom The zoom/scale level the user pinched too, 0-1.
+   * @param {object} fingerData The coordinates of fingers in event
+   */
+
+  /**
+   * A handler triggered for pinch out events.
+   * @name $.fn.swipe#pinchOut
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user pinched in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user pinched
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {int} zoom The zoom/scale level the user pinched too, 0-1.
+   * @param {object} fingerData The coordinates of fingers in event
+   */
+
+  /**
+   * A handler triggered for all pinch events. This handler is constantly fired for the duration of the pinch. This is triggered regardless of thresholds.
+   * @name $.fn.swipe#pinchStatus
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {int} direction The direction the user pinched in. See {@link $.fn.swipe.directions}
+   * @param {int} distance The distance the user pinched
+   * @param {int} duration The duration of the swipe in milliseconds
+   * @param {int} fingerCount The number of fingers used. See {@link $.fn.swipe.fingers}
+   * @param {int} zoom The zoom/scale level the user pinched too, 0-1.
+   * @param {object} fingerData The coordinates of fingers in event
+   */
+
+  /**
+   * A click handler triggered when a user simply clicks, rather than swipes on an element.
+   * This is deprecated since version 1.6.2, any assignment to click will be assigned to the tap handler.
+   * You cannot use <code>on</code> to bind to this event as the default jQ <code>click</code> event will be triggered.
+   * Use the <code>tap</code> event instead.
+   * @name $.fn.swipe#click
+   * @event
+   * @deprecated since version 1.6.2, please use {@link $.fn.swipe#tap} instead
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {DomObject} target The element clicked on.
+   */
+
+  /**
+   * A click / tap handler triggered when a user simply clicks or taps, rather than swipes on an element.
+   * @name $.fn.swipe#tap
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {DomObject} target The element clicked on.
+   */
+
+  /**
+   * A double tap handler triggered when a user double clicks or taps on an element.
+   * You can set the time delay for a double tap with the {@link $.fn.swipe.defaults#doubleTapThreshold} property.
+   * Note: If you set both <code>doubleTap</code> and <code>tap</code> handlers, the <code>tap</code> event will be delayed by the <code>doubleTapThreshold</code>
+   * as the script needs to check if its a double tap.
+   * @name $.fn.swipe#doubleTap
+   * @see  $.fn.swipe.defaults#doubleTapThreshold
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {DomObject} target The element clicked on.
+   */
+
+  /**
+   * A long tap handler triggered once a tap has been release if the tap was longer than the longTapThreshold.
+   * You can set the time delay for a long tap with the {@link $.fn.swipe.defaults#longTapThreshold} property.
+   * @name $.fn.swipe#longTap
+   * @see  $.fn.swipe.defaults#longTapThreshold
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {DomObject} target The element clicked on.
+   */
+
+  /**
+   * A hold tap handler triggered as soon as the longTapThreshold is reached
+   * You can set the time delay for a long tap with the {@link $.fn.swipe.defaults#longTapThreshold} property.
+   * @name $.fn.swipe#hold
+   * @see  $.fn.swipe.defaults#longTapThreshold
+   * @event
+   * @default null
+   * @param {EventObject} event The original event object
+   * @param {DomObject} target The element clicked on.
+   */
+
+}));

File diff suppressed because it is too large
+ 13 - 0
node_modules/jquery-touchswipe/jquery.touchSwipe.min.js


+ 47 - 0
node_modules/jquery-touchswipe/package.json

@@ -0,0 +1,47 @@
+{
+  "name": "jquery-touchswipe",
+  "title": "Touch Swipe",
+  "description": "A jquery plugin to be used on touch devices such as iPad, iPhone, Android etc, to react to swipe gestures.",
+  "keywords": [
+    "touchSwipe",
+    "touch",
+    "swipe",
+    "gestures",
+    "tocuhevent",
+    "jquery"
+  ],
+  "main": "./jquery.touchSwipe.min.js",
+  "author": {
+    "name": "Matt Bryson"
+  },
+  "version": "1.6.19",
+  "repository": {
+    "type": "git",
+    "url": "https://github.com/mattbryson/TouchSwipe-Jquery-Plugin.git"
+  },
+  "bugs": {
+    "url": "https://github.com/mattbryson/TouchSwipe-Jquery-Plugin/issues"
+  },
+  "licenses": [
+    {
+      "type": "MIT",
+      "url": "https://raw.githubusercontent.com/mattbryson/TouchSwipe-Jquery-Plugin/master/LICENCE"
+    },
+    {
+      "type": "GPL V2",
+      "url": "https://raw.githubusercontent.com/mattbryson/TouchSwipe-Jquery-Plugin/master/LICENCE"
+    }
+  ],
+  "readmeFilename": "README.md",
+  "homepage": "http://labs.rampinteractive.co.uk/touchSwipe/demos/",
+  "devDependencies": {
+    "docdash": "^0.3.0",
+    "jsdoc": "^3.5.5",
+    "uglify-js": "^2.6.2"
+  },
+  "scripts": {
+    "docs": "jsdoc jquery.touchSwipe.js --readme README.md --destination ./docs --template node_modules/docdash --tutorials ./demos ",
+    "minify": "uglifyjs jquery.touchSwipe.js --output jquery.touchSwipe.min.js --compress  --comments",
+    "build": "npm run docs && npm run minify"
+  }
+}

+ 24 - 0
package-lock.json

@@ -0,0 +1,24 @@
+{
+  "name": "NFTBoard",
+  "lockfileVersion": 2,
+  "requires": true,
+  "packages": {
+    "": {
+      "dependencies": {
+        "jquery-touchswipe": "^1.6.19"
+      }
+    },
+    "node_modules/jquery-touchswipe": {
+      "version": "1.6.19",
+      "resolved": "https://registry.npmjs.org/jquery-touchswipe/-/jquery-touchswipe-1.6.19.tgz",
+      "integrity": "sha512-b0BGje9reNRU3u6ksAK9QqnX7yBRgLNe/wYG7DOfyDlhBlYjayIT8bSOHmcuvptIDW/ubM9CTW/mnZf9Rohuow=="
+    }
+  },
+  "dependencies": {
+    "jquery-touchswipe": {
+      "version": "1.6.19",
+      "resolved": "https://registry.npmjs.org/jquery-touchswipe/-/jquery-touchswipe-1.6.19.tgz",
+      "integrity": "sha512-b0BGje9reNRU3u6ksAK9QqnX7yBRgLNe/wYG7DOfyDlhBlYjayIT8bSOHmcuvptIDW/ubM9CTW/mnZf9Rohuow=="
+    }
+  }
+}

+ 5 - 0
package.json

@@ -0,0 +1,5 @@
+{
+  "dependencies": {
+    "jquery-touchswipe": "^1.6.19"
+  }
+}

+ 323 - 70
style.css

@@ -56,7 +56,7 @@ body .learn-more:hover {
 
 @media screen and (max-width: 767px) {
   #Navigation #logo {
-    padding-top: 0;
+    padding: 10px;
   }
 }
 
@@ -66,7 +66,7 @@ body .learn-more:hover {
 
 @media screen and (max-width: 767px) {
   #Navigation #logo img {
-    width: 150px;
+    width: 140px;
   }
 }
 
@@ -80,7 +80,7 @@ body .learn-more:hover {
   }
 }
 
-#Navigation a {
+#Navigation #link a {
   text-decoration: none;
   color: #fff;
   letter-spacing: 1px;
@@ -91,11 +91,11 @@ body .learn-more:hover {
   position: relative;
 }
 
-#Navigation a :hover {
+#Navigation #link a :hover {
   opacity: 0.8;
 }
 
-#Navigation a:after {
+#Navigation #link a:after {
   content: "";
   display: block;
   width: 80%;
@@ -109,13 +109,13 @@ body .learn-more:hover {
   opacity: 0;
 }
 
-#Navigation a:hover:after {
+#Navigation #link a:hover:after {
   width: 80%;
   opacity: 1;
 }
 
 @media screen and (max-width: 1024px) {
-  #Navigation a {
+  #Navigation #link a {
     padding: 5px;
     padding-top: 2vw;
   }
@@ -123,8 +123,8 @@ body .learn-more:hover {
 
 #Navigation #menu-btn1 {
   position: absolute;
-  right: 1vw;
-  top: 5vw;
+  right: 2vw;
+  top: 8vw;
   width: 15vw;
   z-index: 6;
 }
@@ -188,13 +188,15 @@ body .learn-more:hover {
 #banner {
   width: 100vw;
   display: inline-block;
-  background: linear-gradient(115deg, #313131 38%, transparent 30%, #707070 27%);
+  background: url(./img/banner2.jpg), linear-gradient(75deg, rgba(0, 0, 0, 0.52) 35%, transparent 30%);
+  background-position: center center;
+  background-size: cover;
   background-blend-mode: overlay;
 }
 
 @media screen and (max-width: 767px) {
   #banner {
-    background: linear-gradient(115deg, #414141 100%, transparent 30%, #707070 0%);
+    background: url(./img/mobile-banner1.jpg);
   }
 }
 
@@ -206,9 +208,8 @@ body .learn-more:hover {
 
 @media screen and (max-width: 767px) {
   #banner #banner-container {
-    width: 100vw;
-    margin: 0;
-    padding-bottom: 15vw;
+    width: 85vw;
+    padding-bottom: 10vw;
   }
 }
 
@@ -221,12 +222,51 @@ body .learn-more:hover {
 
 @media screen and (max-width: 767px) {
   #banner #banner-container .youtube {
-    padding-top: 30vw;
+    padding-top: 10vw;
+    margin: 0 auto;
+  }
+}
+
+#banner #banner-container .youtube #youtube-text h1 {
+  font-size: 40px;
+  text-align: left;
+}
+
+@media screen and (max-width: 767px) {
+  #banner #banner-container .youtube #youtube-text h1 {
+    font-size: 30px;
+    margin: 0;
+  }
+}
+
+#banner #banner-container .youtube #youtube-text .youtube-text-title1 {
+  width: 380px;
+}
+
+@media screen and (max-width: 767px) {
+  #banner #banner-container .youtube #youtube-text .youtube-text-title1 {
+    width: 80vw;
+  }
+}
+
+#banner #banner-container .youtube #youtube-text .youtube-text-title2 {
+  width: 350px;
+}
+
+@media screen and (max-width: 767px) {
+  #banner #banner-container .youtube #youtube-text .youtube-text-title2 {
+    width: 80vw;
   }
 }
 
-#banner #banner-container .youtube #youtube-text {
-  height: 500px;
+#banner #banner-container .youtube #youtube-text p {
+  width: 300px;
+}
+
+@media screen and (max-width: 767px) {
+  #banner #banner-container .youtube #youtube-text p {
+    width: 80vw;
+  }
 }
 
 #banner #banner-container .youtube hr {
@@ -239,7 +279,18 @@ body .learn-more:hover {
 
 @media screen and (max-width: 767px) {
   #banner #banner-container .youtube hr {
-    width: 30vw;
+    width: 80vw;
+  }
+}
+
+#banner #banner-container .youtube .youtube-text-hr {
+  width: 20vw;
+  padding: 10px;
+}
+
+@media screen and (max-width: 767px) {
+  #banner #banner-container .youtube .youtube-text-hr {
+    width: 80vw;
   }
 }
 
@@ -248,8 +299,7 @@ body .learn-more:hover {
 }
 
 #banner #banner-container .youtube h1 {
-  font-size: 35px;
-  padding-top: 0;
+  font-size: 30px;
 }
 
 @media screen and (max-width: 767px) {
@@ -266,59 +316,49 @@ body .learn-more:hover {
   }
 }
 
-#banner #banner-container h1 {
-  padding-top: 3vw;
+#banner #banner-container .contact-form-destop {
   text-align: center;
-  color: #fff;
 }
 
 @media screen and (max-width: 767px) {
-  #banner #banner-container h1 {
-    font-size: 20px;
-    padding: 15px;
+  #banner #banner-container .contact-form-destop {
+    display: none;
   }
 }
 
-#banner #banner-container #email {
-  width: 75%;
-  font-size: 16px;
-  margin: 10px 0px;
-  padding: 10px 15px;
-  border: none;
-  height: 50px;
+#banner #banner-container .contact-form-destop h1 {
+  padding: 5vw 0 1vw 0;
+  color: #fff;
 }
 
 @media screen and (max-width: 767px) {
-  #banner #banner-container #email {
-    display: none;
+  #banner #banner-container .contact-form-destop h1 {
+    font-size: 20px;
+    padding: 15px;
   }
 }
 
-#banner #banner-container #email-moblie {
-  margin: 10px auto;
-  width: 75%;
+#banner #banner-container .contact-form-destop #email {
+  width: 50%;
+  font-size: 16px;
+  margin: 15px 0;
   padding: 10px 15px;
   border: none;
   height: 50px;
-  background: url(./img/email.png) 5% 50% no-repeat scroll transparent;
-  background-size: 20px 15px;
-  background-color: #fff;
-  text-align: center;
-  color: #313131;
-  font-weight: 900;
+  border: 1px solid #313131;
 }
 
-@media screen and (min-width: 1025px) {
-  #banner #banner-container #email-moblie {
+@media screen and (max-width: 767px) {
+  #banner #banner-container .contact-form-destop #email {
     display: none;
   }
 }
 
-#banner #banner-container .btn {
+#banner #banner-container .contact-form-destop .btn {
   color: #fff;
   width: 25%;
   height: 50px;
-  margin: 10px 0px;
+  margin: 15px 0px;
   font-size: 16px;
   border-radius: 0%;
   border: none;
@@ -330,15 +370,48 @@ body .learn-more:hover {
 }
 
 @media screen and (max-width: 767px) {
-  #banner #banner-container .btn {
+  #banner #banner-container .contact-form-destop .btn {
     display: none;
   }
 }
 
-#banner #banner-container .btn:hover {
+#banner #banner-container .contact-form-destop .btn:hover {
   font-size: 17px;
 }
 
+@media screen and (min-width: 1025px) {
+  #banner #banner-container .contact-form-mobile {
+    display: none;
+  }
+}
+
+#banner #banner-container .contact-form-mobile h1 {
+  text-align: center;
+  padding: 10vw 0 1vw 0;
+  color: #fff;
+  font-size: 20px;
+}
+
+#banner #banner-container .contact-form-mobile #email-moblie {
+  margin: 10px auto;
+  width: 75%;
+  padding: 10px 15px;
+  border: none;
+  height: 50px;
+  background: url(./img/email.png) 5% 50% no-repeat scroll transparent;
+  background-size: 20px 15px;
+  background-color: #fff;
+  text-align: center;
+  color: #313131;
+  font-weight: 900;
+}
+
+@media screen and (min-width: 1025px) {
+  #banner #banner-container .contact-form-mobile #email-moblie {
+    display: none;
+  }
+}
+
 #banner #banner-container #email-arrow {
   width: 15%;
   background: url(./img/button-arrow.png) 55% 50% no-repeat scroll transparent;
@@ -512,11 +585,13 @@ body .learn-more:hover {
 }
 
 #sec02 #sec02-container #sec02-top-box .sec02-box1 img {
-  border-radius: 50%;
+  display: inline;
   width: 150px;
   height: 200px;
   -o-object-fit: cover;
      object-fit: cover;
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
 }
 
 #sec02 #sec02-container #sec02-top-box .sec02-box1 .sec02-top-text span {
@@ -559,9 +634,9 @@ body .learn-more:hover {
 }
 
 #sec02-moblie #sec02-container #sec02-top-box {
+  width: 100vw;
   position: absolute;
   top: 1px;
-  left: 20px;
 }
 
 @media screen and (max-width: 350px) {
@@ -575,8 +650,8 @@ body .learn-more:hover {
 }
 
 #sec02-moblie #sec02-container #sec02-top-box .sec02-box1 #top1 {
-  width: 120px;
-  height: 150px;
+  width: 100px;
+  height: 130px;
 }
 
 @media screen and (max-width: 350px) {
@@ -589,7 +664,6 @@ body .learn-more:hover {
 #sec02-moblie #sec02-container #sec02-top-box .sec02-box1 img {
   width: 80px;
   height: 120px;
-  border-radius: 50%;
 }
 
 @media screen and (max-width: 350px) {
@@ -642,6 +716,11 @@ body .learn-more:hover {
   padding: 15px;
 }
 
+#sec03 #sec03-table .table td a {
+  text-decoration: none;
+  color: #000;
+}
+
 #sec03 #sec03-table .table img {
   width: 50px;
 }
@@ -681,12 +760,13 @@ body .learn-more:hover {
   }
 }
 
-#sec03-moblie .sec03-table-title, #sec03-moblie .sec03-table-title2 {
+#sec03-moblie .sec03-table-title,
+#sec03-moblie .sec03-table-title2 {
   font-family: 微軟正黑體;
   font-weight: 900;
   font-size: 14px;
   display: inline-block;
-  color: #9B9B9B;
+  color: #9b9b9b;
 }
 
 #sec03-moblie .contant-toggle {
@@ -725,7 +805,7 @@ body .learn-more:hover {
 
 @media screen and (max-width: 350px) {
   #sec03-moblie #sec03-slider .table th {
-    font-size: 30px;
+    font-size: 25px;
   }
 }
 
@@ -733,7 +813,7 @@ body .learn-more:hover {
   display: table-cell;
   vertical-align: middle;
   padding: 15px;
-  padding: 10px;
+  padding: 10px 0;
 }
 
 @media screen and (max-width: 350px) {
@@ -742,6 +822,11 @@ body .learn-more:hover {
   }
 }
 
+#sec03-moblie #sec03-slider .table td a {
+  text-decoration: none;
+  color: #000;
+}
+
 #sec03-moblie #sec03-slider .table img {
   width: 50px;
 }
@@ -786,30 +871,34 @@ body .learn-more:hover {
   }
 }
 
-#sec04 h1 {
+#sec04 .sec04-title {
+  padding-bottom: 1vw;
+}
+
+#sec04 .sec04-title h1 {
   color: #fff;
   font-size: 45px;
   font-weight: 900;
-  padding: 5px 10px;
+  padding: 10px 10px;
 }
 
 @media screen and (max-width: 767px) {
-  #sec04 h1 {
+  #sec04 .sec04-title h1 {
     font-weight: 900;
     font-size: 32px;
   }
 }
 
-#sec04 hr {
+#sec04 .sec04-title hr {
   width: 12vw;
   height: 2px;
-  color: #fff;
+  color: #fff !important;
   margin: 10px;
   opacity: 1 !important;
 }
 
 @media screen and (max-width: 767px) {
-  #sec04 hr {
+  #sec04 .sec04-title hr {
     width: 30vw;
   }
 }
@@ -818,14 +907,21 @@ body .learn-more:hover {
   width: 45%;
 }
 
+#sec04 #sec04-container {
+  background: -webkit-gradient(linear, left top, left bottom, color-stop(15%, #414141), color-stop(0%, #eee));
+  background: linear-gradient(180deg, #414141 15%, #eee 0%);
+  padding: 20px;
+  padding-bottom: 50px;
+}
+
 #sec04 #sec04-container .card {
+  border: none;
   border-radius: 0%;
-  -webkit-box-shadow: 0 10px 1px rgba(155, 155, 155, 0.8);
-          box-shadow: 0 10px 1px rgba(155, 155, 155, 0.8);
+  -webkit-box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
+          box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
 }
 
 #sec04 #sec04-container .card img {
-  padding: 5px;
   height: 150px;
   -o-object-fit: cover;
      object-fit: cover;
@@ -977,7 +1073,7 @@ body .learn-more:hover {
 
 #sec05-moblie {
   padding-top: 5vw;
-  padding-bottom: 5vw;
+  padding-bottom: 10vw;
   overflow: hidden;
 }
 
@@ -1027,6 +1123,160 @@ body .learn-more:hover {
   border: none;
 }
 
+#sec05-moblie .sec05-button {
+  text-align: center;
+  margin-top: -50px;
+}
+
+#sec05-moblie .sec05-button .mouse_scroll {
+  display: inline-block;
+  margin: 0 auto;
+  width: 24px;
+  -webkit-transform: rotate(90deg);
+          transform: rotate(90deg);
+}
+
+#sec05-moblie .sec05-button .testright {
+  -webkit-transform: rotate(180deg);
+          transform: rotate(180deg);
+}
+
+#sec05-moblie .sec05-button .m_scroll_arrows {
+  display: block;
+  width: 5px;
+  height: 5px;
+  /* IE 9 */
+  -webkit-transform: rotate(45deg);
+  /* Chrome, Safari, Opera */
+  transform: rotate(45deg);
+  border-right: 2px solid #000;
+  border-bottom: 2px solid #000;
+  margin: 0 0 3px 4px;
+  width: 16px;
+  height: 16px;
+}
+
+#sec05-moblie .sec05-button .unu {
+  margin-top: 1px;
+}
+
+#sec05-moblie .sec05-button .unu,
+#sec05-moblie .sec05-button .doi,
+#sec05-moblie .sec05-button .trei {
+  -webkit-animation: mouse-scroll 1s infinite;
+  animation: mouse-scroll 1s infinite;
+}
+
+#sec05-moblie .sec05-button .unu {
+  -webkit-animation-delay: 0.1s;
+  -moz-animation-delay: 0.1s;
+  -webkit-animation-direction: alternate;
+  animation-direction: alternate;
+  -webkit-animation-delay: alternate;
+          animation-delay: alternate;
+}
+
+#sec05-moblie .sec05-button .doi {
+  -webkit-animation-delay: 0.2s;
+  -moz-animation-delay: 0.2s;
+  -webkit-animation-direction: alternate;
+  animation-delay: 0.2s;
+  animation-direction: alternate;
+  margin-top: -6px;
+}
+
+#sec05-moblie .sec05-button .trei {
+  -webkit-animation-delay: 0.3s;
+  -moz-animation-delay: 0.3s;
+  -webkit-animation-direction: alternate;
+  animation-delay: 0.3s;
+  animation-direction: alternate;
+  margin-top: -6px;
+}
+
+#sec05-moblie .sec05-button .mouse {
+  height: 42px;
+  width: 24px;
+  border-radius: 14px;
+  -webkit-transform: none;
+          transform: none;
+  border: 2px solid #000;
+  top: 170px;
+}
+
+#sec05-moblie .sec05-button .wheel {
+  height: 5px;
+  width: 2px;
+  display: block;
+  margin: 5px auto;
+  background: #000;
+  position: relative;
+  height: 4px;
+  width: 4px;
+  border: 2px solid #000;
+  border-radius: 8px;
+}
+
+#sec05-moblie .sec05-button .wheel {
+  -webkit-animation: mouse-wheel 0.6s linear infinite;
+  animation: mouse-wheel 0.8s linear infinite;
+}
+
+@-webkit-keyframes mouse-wheel {
+  0% {
+    opacity: 1;
+    -webkit-transform: translateY(0);
+    transform: translateY(0);
+  }
+  100% {
+    opacity: 0;
+    -webkit-transform: translateY(6px);
+    transform: translateY(6px);
+  }
+}
+
+@keyframes mouse-wheel {
+  0% {
+    top: 1px;
+  }
+  25% {
+    top: 5px;
+  }
+  50% {
+    top: 15px;
+  }
+  75% {
+    top: 5px;
+  }
+  100% {
+    top: 1px;
+  }
+}
+
+@-webkit-keyframes mouse-scroll {
+  0% {
+    opacity: 0;
+  }
+  50% {
+    opacity: 0.5;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+
+@keyframes mouse-scroll {
+  0% {
+    opacity: 0;
+  }
+  50% {
+    opacity: 0.5;
+  }
+  100% {
+    opacity: 1;
+  }
+}
+
 #sec06 {
   padding-top: 5vw;
   padding-bottom: 5vw;
@@ -1061,7 +1311,6 @@ body .learn-more:hover {
 }
 
 #sec06 #sec06-container .card {
-  height: 480px;
   margin: 10px;
   border-radius: 0%;
   -webkit-box-shadow: 0 10px 1px rgba(155, 155, 155, 0.8);
@@ -1083,6 +1332,10 @@ body .learn-more:hover {
   width: 120px;
 }
 
+#sec06 #sec06-container .learn-more {
+  width: 120px;
+}
+
 #sec07 {
   padding-top: 5vw;
   padding-bottom: 5vw;

File diff suppressed because it is too large
+ 0 - 0
style.css.map


+ 450 - 181
style.scss

@@ -29,15 +29,12 @@ body {
         background: #93000a;
         vertical-align: top;
         transition: 0.3s;
-        &:hover{
-            color:#93000a;
+        &:hover {
+            color: #93000a;
             background: #fff;
-            border:1px solid #93000a;
+            border: 1px solid #93000a;
         }
-
     }
-
-
 }
 // 主選單
 #Navigation {
@@ -49,13 +46,13 @@ body {
     #logo {
         padding-top: 1.3vw;
         @media screen and(max-width:$moblie) {
-            padding-top: 0;
+            padding: 10px;
         }
 
         img {
             width: 180px;
             @media screen and(max-width:$moblie) {
-                width: 150px;
+                width: 140px;
             }
         }
     }
@@ -64,44 +61,44 @@ body {
         @media screen and(max-width:$moblie) {
             display: none;
         }
-    }
-    a {
-        text-decoration: none;
-        color: #fff;
-        letter-spacing: 1px;
-        font-size: 0.9rem;
-        font-weight: 600;
-        cursor: pointer;
-        padding: 15px;
-        position: relative;
-        :hover {
-            opacity: 0.8;
-        }
-        &:after {
-            content: "";
-            display: block;
-            width: 80%;
-            height: 3px;
-            background-color: #fff;
-            position: absolute;
-            left: 12%;
-            bottom: 0;
-            transition: all 0.3s;
-            opacity: 0;
-        }
-        &:hover:after {
-            width: 80%;
-            opacity: 1;
-        }
-        @media screen and(max-width:$table) {
-            padding: 5px;
-            padding-top: 2vw;
+        a {
+            text-decoration: none;
+            color: #fff;
+            letter-spacing: 1px;
+            font-size: 0.9rem;
+            font-weight: 600;
+            cursor: pointer;
+            padding: 15px;
+            position: relative;
+            :hover {
+                opacity: 0.8;
+            }
+            &:after {
+                content: "";
+                display: block;
+                width: 80%;
+                height: 3px;
+                background-color: #fff;
+                position: absolute;
+                left: 12%;
+                bottom: 0;
+                transition: all 0.3s;
+                opacity: 0;
+            }
+            &:hover:after {
+                width: 80%;
+                opacity: 1;
+            }
+            @media screen and(max-width:$table) {
+                padding: 5px;
+                padding-top: 2vw;
+            }
         }
     }
     #menu-btn1 {
         position: absolute;
-        right: 1vw;
-        top: 5vw;
+        right: 2vw;
+        top: 8vw;
         width: 15vw;
         z-index: 6;
 
@@ -163,20 +160,21 @@ body {
 #banner {
     width: 100vw;
     display: inline-block;
-    background: linear-gradient(115deg, #313131 38%, transparent 30%, #707070 27%);
+    background: url(./img/banner2.jpg), linear-gradient(75deg, rgba(0, 0, 0, 0.52) 35%, transparent 30%);
+    background-position: center center;
+    background-size: cover;
     background-blend-mode: overlay;
     @media screen and(max-width:$moblie) {
-      
-        background: linear-gradient(115deg, #414141 100%, transparent 30%, #707070 0%);
+        background: url(./img/mobile-banner1.jpg);
     }
     #banner-container {
         width: 80vw;
         margin: 50px auto;
         padding-bottom: 5vw;
         @media screen and(max-width:$moblie) {
-            width: 100vw;
-            margin: 0;
-            padding-bottom: 15vw;
+            width: 85vw;
+
+            padding-bottom: 10vw;
         }
         .youtube {
             width: 80vw;
@@ -184,103 +182,148 @@ body {
             margin: 0 auto;
             color: #fff;
             @media screen and(max-width:$moblie) {
-                padding-top: 30vw;
+                padding-top: 10vw;
+                margin: 0 auto;
             }
-           
-            #youtube-text{
-                height: 500px;
+            #youtube-text {
+                h1 {
+                    font-size: 40px;
+                    text-align: left;
+                    @media screen and(max-width:$moblie) {
+                        font-size: 30px;
+                        margin: 0;
+                    }
+                }
+                .youtube-text-title1 {
+                    width: 380px;
+                    @media screen and(max-width:$moblie) {
+                        width: 80vw;
+                    }
+                }
+                .youtube-text-title2 {
+                    width: 350px;
+                    @media screen and(max-width:$moblie) {
+                        width: 80vw;
+                    }
+                }
+                p {
+                    width: 300px;
+                    @media screen and(max-width:$moblie) {
+                        width: 80vw;
+                    }
+                }
             }
+
             hr {
                 width: 12vw;
                 height: 2px;
                 color: #fff;
-                margin: 20px 0px; 
+                margin: 20px 0px;
                 opacity: 1 !important;
                 @media screen and(max-width:$moblie) {
-                    width: 30vw;
+                    width: 80vw;
+                }
+            }
+            .youtube-text-hr {
+                width: 20vw;
+                padding: 10px;
+                @media screen and(max-width:$moblie) {
+                    width: 80vw;
                 }
             }
-           
-            p{
+
+            p {
                 font-size: 18px;
             }
-            h1{
-                font-size: 35px;
-                padding-top: 0;
-               
+            h1 {
+                font-size: 30px;
+
                 @media screen and(max-width:$moblie) {
                     font-size: 25px;
                     padding: 15px 0px;
                 }
             }
-            .learn-more{
-
+            .learn-more {
                 @media screen and(max-width:$moblie) {
                     width: 100%;
                     margin: 10px 0px;
                 }
             }
         }
-
-        h1 {
-       
-            padding-top: 3vw;
+        .contact-form-destop {
             text-align: center;
-            color: #fff;
-            @media screen and(max-width:$moblie) {
-                font-size: 20px;
-                padding: 15px;
-            }
-        }
-        #email {
-            width: 75%;
-            font-size: 16px;
-            margin: 10px 0px;
-            padding: 10px 15px;
-            border: none;
-            height: 50px;
-
             @media screen and(max-width:$moblie) {
                 display: none;
             }
+            h1 {
+                padding: 5vw 0 1vw 0;
+                color: #fff;
+                @media screen and(max-width:$moblie) {
+                    font-size: 20px;
+                    padding: 15px;
+                }
+            }
+            #email {
+                width: 50%;
+                font-size: 16px;
+                margin: 15px 0;
+                padding: 10px 15px;
+                border: none;
+                height: 50px;
+                border: 1px solid #313131;
+                @media screen and(max-width:$moblie) {
+                    display: none;
+                }
+            }
+            .btn {
+                color: #fff;
+                width: 25%;
+                height: 50px;
+                margin: 15px 0px;
+                font-size: 16px;
+                border-radius: 0%;
+                border: none;
+                font-weight: 900;
+                background: #93000a;
+                vertical-align: top;
+                transition: 0.3s;
+                @media screen and(max-width:$moblie) {
+                    display: none;
+                }
+                &:hover {
+                    font-size: 17px;
+                }
+            }
         }
-        // 手機板訂閱email
-        #email-moblie {
-            margin: 10px auto;
-            width: 75%;
-            padding: 10px 15px;
-            border: none;
-            height: 50px;
-            background: url(./img/email.png) 5% 50% no-repeat scroll transparent;
-            background-size: 20px 15px;
-            background-color: #fff;
-            text-align: center;
-            color: #313131;
-            font-weight: 900;
+        .contact-form-mobile {
             @media screen and(min-width:$desktop) {
                 display: none;
             }
-        }
-        // 電腦版按鈕
-        .btn {
-            color: #fff;
-            width: 25%;
-            height: 50px;
-            margin: 10px 0px;
-            font-size: 16px;
-            border-radius: 0%;
-            border: none;
-            font-weight: 900;
-            background: #93000a;
-            vertical-align: top;
-            transition: 0.3s;
-            @media screen and(max-width:$moblie) {
-                display: none;
+            h1 {
+                text-align: center;
+                padding: 10vw 0 1vw 0;
+                color: #fff;
+                font-size: 20px;
             }
-            &:hover {
-                font-size: 17px;
+            // 手機板訂閱email
+            #email-moblie {
+                margin: 10px auto;
+                width: 75%;
+                padding: 10px 15px;
+                border: none;
+                height: 50px;
+                background: url(./img/email.png) 5% 50% no-repeat scroll transparent;
+                background-size: 20px 15px;
+                background-color: #fff;
+                text-align: center;
+                color: #313131;
+                font-weight: 900;
+                @media screen and(min-width:$desktop) {
+                    display: none;
+                }
             }
         }
+
         // 手機板按鈕
         #email-arrow {
             width: 15%;
@@ -410,14 +453,16 @@ body {
                 top: 10px;
                 left: 300px;
             }
+
             .sec02-box1 {
                 color: #000;
                 width: 13vw;
                 img {
-                    border-radius: 50%;
+                    display: inline;
                     width: 150px;
                     height: 200px;
                     object-fit: cover;
+                    box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
                 }
                 .sec02-top-text {
                     span {
@@ -445,7 +490,6 @@ body {
         .sec02-top1-box {
             img {
                 width: 80px;
-               
             }
             span {
                 font-size: 30px;
@@ -456,20 +500,21 @@ body {
         }
         #sec02-content {
             position: relative;
-        
         }
         #sec02-top-box {
+            width: 100vw;
             position: absolute;
             top: 1px;
-            left:20px;
+
             @media screen and(max-width:350px) {
-                left:10px;
+                left: 10px;
             }
             .sec02-box1 {
                 color: #000;
-                #top1{
-                    width: 120px;
-                    height: 150px;
+
+                #top1 {
+                    width: 100px;
+                    height: 130px;
                     @media screen and(max-width:350px) {
                         width: 100px;
                         height: 130px;
@@ -478,19 +523,15 @@ body {
                 img {
                     width: 80px;
                     height: 120px;
-                    border-radius: 50%;
                     @media screen and(max-width:350px) {
                         width: 70px;
                         height: 100px;
                     }
-                   
                 }
                 .sec02-top-text {
                     font-size: 12px;
                     text-align: left;
                     @media screen and(max-width:350px) {
-                        
-                        
                     }
 
                     span {
@@ -526,6 +567,10 @@ body {
             }
             td {
                 padding: 15px;
+                a {
+                    text-decoration: none;
+                    color: #000;
+                }
             }
 
             img {
@@ -561,22 +606,22 @@ body {
             bottom: 200px;
         }
     }
-    .sec03-table-title,.sec03-table-title2 {
+    .sec03-table-title,
+    .sec03-table-title2 {
         font-family: 微軟正黑體;
         font-weight: 900;
         font-size: 14px;
         display: inline-block;
-       
-        color:#9B9B9B;
+
+        color: #9b9b9b;
     }
-    .contant-toggle{
+    .contant-toggle {
         display: inline-block;
-        color:#000;
-      padding-bottom: 10px;
-      border-bottom: 2px solid #000;
-    
+        color: #000;
+        padding-bottom: 10px;
+        border-bottom: 2px solid #000;
     }
-    
+
     #sec03-slider {
         padding-top: 5vw;
         .slick-slide img {
@@ -585,6 +630,7 @@ body {
         #sec03-slider1,
         #sec03-slider2 {
             margin: 0 5px;
+
             @media screen and(max-width:350px) {
                 margin: 0 5px;
             }
@@ -597,17 +643,21 @@ body {
                 vertical-align: middle;
                 padding: 15px;
                 @media screen and(max-width:350px) {
-                    font-size: 30px;
+                    font-size: 25px;
                 }
             }
             td {
                 display: table-cell;
                 vertical-align: middle;
                 padding: 15px;
-                padding: 10px;
+                padding: 10px 0;
                 @media screen and(max-width:350px) {
                     padding: 0px;
                 }
+                a {
+                    text-decoration: none;
+                    color: #000;
+                }
             }
 
             img {
@@ -644,41 +694,47 @@ body {
     @media screen and(max-width:$moblie) {
         display: none;
     }
-    h1 {
-        color: #fff;
-        font-size: 45px;
-        font-weight: 900;
-        padding: 5px 10px;
-
-        @media screen and(max-width:$moblie) {
+    .sec04-title {
+        padding-bottom: 1vw;
+        h1 {
+            color: #fff;
+            font-size: 45px;
             font-weight: 900;
-            font-size: 32px;
+            padding: 10px 10px;
+
+            @media screen and(max-width:$moblie) {
+                font-weight: 900;
+                font-size: 32px;
+            }
         }
-    }
-    hr {
-        width: 12vw;
-        height: 2px;
-        color: #fff;
-        margin: 10px;
-        opacity: 1 !important;
-        @media screen and(max-width:$moblie) {
-            width: 30vw;
+        hr {
+            width: 12vw;
+            height: 2px;
+            color: #fff !important;
+            margin: 10px;
+            opacity: 1 !important;
+            @media screen and(max-width:$moblie) {
+                width: 30vw;
+            }
         }
     }
-    .learn-more{
+    .learn-more {
         width: 45%;
     }
     #sec04-container {
+        // box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
+        background: linear-gradient(180deg, #414141 15%, #eee 0%);
+        padding: 20px;
+        padding-bottom: 50px;
         .card {
-          
+            border: none;
             img {
-                padding: 5px;
                 height: 150px;
                 object-fit: cover;
             }
             border-radius: 0%;
-            box-shadow: 0 10px 1px rgba(155, 155, 155, 0.8);
-            .card-title{
+            box-shadow: 0 5px 10px rgba(0, 0, 0, 0.3);
+            .card-title {
                 font-weight: 900;
             }
         }
@@ -733,11 +789,11 @@ body {
                 }
                 border-radius: 0%;
                 box-shadow: 0 10px 1px rgba(155, 155, 155, 0.8);
-                .card-title{
+                .card-title {
                     font-weight: 900;
                 }
 
-                .learn-more{
+                .learn-more {
                     width: 120px;
                 }
             }
@@ -803,7 +859,7 @@ body {
 // sec05熱門作品-手機板
 #sec05-moblie {
     padding-top: 5vw;
-    padding-bottom: 5vw;
+    padding-bottom: 10vw;
     overflow: hidden;
     @media screen and(min-width:$desktop) {
         display: none;
@@ -826,23 +882,235 @@ body {
         font-weight: 900;
         padding: 15px;
     }
- 
-        #sec05-moblie-slider {
-           
 
-            .sec05-moblie-box {
-              padding: 20px;
-              margin: 30px;
-              @media screen and(max-width:400px) {
-              padding: 5px;
-               margin: 20px;
-            }
-                .card {
-                    border: none;
-                }
+    #sec05-moblie-slider {
+        .sec05-moblie-box {
+            padding: 20px;
+            margin: 30px;
+            @media screen and(max-width:400px) {
+                padding: 5px;
+                margin: 20px;
             }
+            .card {
+                border: none;
+            }
+        }
+    }
+    .sec05-button {
+        text-align: center;
+        margin-top: -50px;
+        .mouse_scroll {
+            display: inline-block;
+            margin: 0 auto;
+            width: 24px;
+
+            transform: rotate(90deg);
+        }
+        .testright {
+            transform: rotate(180deg);
+        }
+
+        .m_scroll_arrows {
+            display: block;
+            width: 5px;
+            height: 5px;
+            -ms-transform: rotate(45deg); /* IE 9 */
+            -webkit-transform: rotate(45deg); /* Chrome, Safari, Opera */
+            transform: rotate(45deg);
+
+            border-right: 2px solid #000;
+            border-bottom: 2px solid #000;
+            margin: 0 0 3px 4px;
+
+            width: 16px;
+            height: 16px;
+        }
+
+        .unu {
+            margin-top: 1px;
+        }
+
+        .unu,
+        .doi,
+        .trei {
+            -webkit-animation: mouse-scroll 1s infinite;
+            -moz-animation: mouse-scroll 1s infinite;
+            animation: mouse-scroll 1s infinite;
+        }
+
+        .unu {
+            -webkit-animation-delay: 0.1s;
+            -moz-animation-delay: 0.1s;
+            -webkit-animation-direction: alternate;
+
+            animation-direction: alternate;
+            animation-delay: alternate;
+        }
+
+        .doi {
+            -webkit-animation-delay: 0.2s;
+            -moz-animation-delay: 0.2s;
+            -webkit-animation-direction: alternate;
+
+            animation-delay: 0.2s;
+            animation-direction: alternate;
+
+            margin-top: -6px;
         }
-    
+
+        .trei {
+            -webkit-animation-delay: 0.3s;
+            -moz-animation-delay: 0.3s;
+            -webkit-animation-direction: alternate;
+
+            animation-delay: 0.3s;
+            animation-direction: alternate;
+
+            margin-top: -6px;
+        }
+
+        .mouse {
+            height: 42px;
+            width: 24px;
+            border-radius: 14px;
+            transform: none;
+            border: 2px solid #000;
+            top: 170px;
+        }
+
+        .wheel {
+            height: 5px;
+            width: 2px;
+            display: block;
+            margin: 5px auto;
+            background: #000;
+            position: relative;
+
+            height: 4px;
+            width: 4px;
+            border: 2px solid #000;
+            -webkit-border-radius: 8px;
+            border-radius: 8px;
+        }
+
+        .wheel {
+            -webkit-animation: mouse-wheel 0.6s linear infinite;
+            -moz-animation: mouse-wheel 0.6s linear infinite;
+            animation: mouse-wheel 0.8s linear infinite;
+        }
+
+        @-webkit-keyframes mouse-wheel {
+            0% {
+                opacity: 1;
+                -webkit-transform: translateY(0);
+                -ms-transform: translateY(0);
+                transform: translateY(0);
+            }
+
+            100% {
+                opacity: 0;
+                -webkit-transform: translateY(6px);
+                -ms-transform: translateY(6px);
+                transform: translateY(6px);
+            }
+        }
+        @-moz-keyframes mouse-wheel {
+            0% {
+                top: 1px;
+            }
+            25% {
+                top: 5px;
+            }
+            50% {
+                top: 10px;
+            }
+            75% {
+                top: 5px;
+            }
+            100% {
+                top: 1px;
+            }
+        }
+        @-o-keyframes mouse-wheel {
+            0% {
+                top: 1px;
+            }
+            25% {
+                top: 2px;
+            }
+            50% {
+                top: 3px;
+            }
+            75% {
+                top: 2px;
+            }
+            100% {
+                top: 1px;
+            }
+        }
+        @keyframes mouse-wheel {
+            0% {
+                top: 1px;
+            }
+            25% {
+                top: 5px;
+            }
+            50% {
+                top: 15px;
+            }
+            75% {
+                top: 5px;
+            }
+            100% {
+                top: 1px;
+            }
+        }
+
+        @-webkit-keyframes mouse-scroll {
+            0% {
+                opacity: 0;
+            }
+            50% {
+                opacity: 0.5;
+            }
+            100% {
+                opacity: 1;
+            }
+        }
+        @-moz-keyframes mouse-scroll {
+            0% {
+                opacity: 0;
+            }
+            50% {
+                opacity: 0.5;
+            }
+            100% {
+                opacity: 1;
+            }
+        }
+        @-o-keyframes mouse-scroll {
+            0% {
+                opacity: 0;
+            }
+            50% {
+                opacity: 0.5;
+            }
+            100% {
+                opacity: 1;
+            }
+        }
+        @keyframes mouse-scroll {
+            0% {
+                opacity: 0;
+            }
+            50% {
+                opacity: 0.5;
+            }
+            100% {
+                opacity: 1;
+            }
+        }
+    }
 }
 // sec06 NFT資訊
 #sec06 {
@@ -871,8 +1139,7 @@ body {
 
     #sec06-container {
         .card {
-            height: 480px;
-            margin:10px ;
+            margin: 10px;
             img {
                 padding: 5px;
                 height: 150px;
@@ -880,13 +1147,16 @@ body {
             }
             border-radius: 0%;
             box-shadow: 0 10px 1px rgba(155, 155, 155, 0.8);
-            .card-title{
+            .card-title {
                 font-weight: 900;
             }
-            .learn-more{
+            .learn-more {
                 width: 120px;
             }
         }
+        .learn-more {
+            width: 120px;
+        }
     }
 }
 // sec07 table 電腦版
@@ -1056,9 +1326,9 @@ body {
     }
     .text {
         padding-top: 3vw;
-        a{
-          text-decoration: none;
-            color:#fff;
+        a {
+            text-decoration: none;
+            color: #fff;
         }
         h2 {
             font-size: 20px;
@@ -1076,4 +1346,3 @@ body {
         }
     }
 }
-

Some files were not shown because too many files changed in this diff