aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
Diffstat (limited to 'Blocks/Flipboard')
-rw-r--r--Blocks/Flipboard/css/demo.css49
-rw-r--r--Blocks/Flipboard/css/fallback.css41
-rw-r--r--Blocks/Flipboard/css/style.css465
-rw-r--r--Blocks/Flipboard/images/1.gifbin0 -> 46290 bytes
-rw-r--r--Blocks/Flipboard/images/1.jpgbin0 -> 43878 bytes
-rw-r--r--Blocks/Flipboard/images/2.jpgbin0 -> 61573 bytes
-rw-r--r--Blocks/Flipboard/images/3.jpgbin0 -> 46384 bytes
-rw-r--r--Blocks/Flipboard/images/31.pngbin0 -> 244204 bytes
-rw-r--r--Blocks/Flipboard/images/32.pngbin0 -> 221622 bytes
-rw-r--r--Blocks/Flipboard/images/33.pngbin0 -> 149821 bytes
-rw-r--r--Blocks/Flipboard/images/34.pngbin0 -> 147398 bytes
-rw-r--r--Blocks/Flipboard/images/4.jpgbin0 -> 41492 bytes
-rw-r--r--Blocks/Flipboard/images/41.jpgbin0 -> 388665 bytes
-rw-r--r--Blocks/Flipboard/images/43.jpgbin0 -> 325424 bytes
-rw-r--r--Blocks/Flipboard/images/44.jpgbin0 -> 395792 bytes
-rw-r--r--Blocks/Flipboard/images/5.jpgbin0 -> 31082 bytes
-rw-r--r--Blocks/Flipboard/images/6.jpgbin0 -> 99676 bytes
-rw-r--r--Blocks/Flipboard/images/7.jpgbin0 -> 76749 bytes
-rw-r--r--Blocks/Flipboard/images/8.jpgbin0 -> 29856 bytes
-rw-r--r--Blocks/Flipboard/images/ImageAttribution.txt4
-rw-r--r--Blocks/Flipboard/images/beijing.pngbin0 -> 194195 bytes
-rw-r--r--Blocks/Flipboard/images/cover.jpgbin0 -> 85319 bytes
-rw-r--r--Blocks/Flipboard/images/cover1.jpgbin0 -> 29784 bytes
-rw-r--r--Blocks/Flipboard/images/fabric_plaid.pngbin0 -> 9897 bytes
-rw-r--r--Blocks/Flipboard/index.html316
-rw-r--r--Blocks/Flipboard/js/core.string.js240
-rw-r--r--Blocks/Flipboard/js/jquery.flips.js965
-rw-r--r--Blocks/Flipboard/js/jquery.history.js1
-rw-r--r--Blocks/Flipboard/js/jquery.tmpl.min.js1
-rw-r--r--Blocks/Flipboard/js/jquery.touchSwipe-1.2.5.js478
-rw-r--r--Blocks/Flipboard/js/modernizr.custom.08464.js4
31 files changed, 2564 insertions, 0 deletions
diff --git a/Blocks/Flipboard/css/demo.css b/Blocks/Flipboard/css/demo.css
new file mode 100644
index 0000000..2bf1e5b
--- /dev/null
+++ b/Blocks/Flipboard/css/demo.css
@@ -0,0 +1,49 @@
1/* @import url('normalize.css'); */
2/* General Demo Style */
3*{
4 -webkit-box-sizing: border-box;
5 -moz-box-sizing: border-box;
6 box-sizing: border-box;
7}
8body{
9 font-family: 'Open Sans Condensed','Arial Narrow', serif;
10 background: #ddd url(../images/fabric_plaid.png) repeat top left;
11 font-weight: 400;
12 font-size: 15px;
13 color: #333;
14 -webkit-font-smoothing: antialiased;
15 -moz-font-smoothing: antialiased;
16 font-smoothing: antialiased;
17 margin: 0;
18 overflow: hidden;
19}
20a{
21 color: #555;
22 text-decoration: none;
23}
24.clr{
25 clear: both;
26 padding: 0;
27 height: 0;
28 margin: 0;
29}
30.main-title{
31 position: absolute;
32 z-index: -1;
33 width: 50%;
34 padding: 20px 40px;
35 text-shadow: 1px 1px 1px rgba(255, 255, 255, 0.7);
36}
37.main-title h1{
38 font-size: 45px;
39 line-height: 52px;
40 font-weight: 300;
41 color: #777;
42}
43.main-title h1 strong{
44 font-weight: 700;
45}
46.main-title p{
47 font-size: 18px;
48 color: #F86738;
49} \ No newline at end of file
diff --git a/Blocks/Flipboard/css/fallback.css b/Blocks/Flipboard/css/fallback.css
new file mode 100644
index 0000000..6ceae5a
--- /dev/null
+++ b/Blocks/Flipboard/css/fallback.css
@@ -0,0 +1,41 @@
1.no-csstransforms3d body{
2 overflow: auto;
3}
4.no-csstransforms3d .f-page.f-cover,
5.no-csstransforms3d .f-page.f-cover-back{
6 display: none !important;
7}
8.no-csstransforms3d .f-title{
9 position: relative;
10}
11.no-csstransforms3d .main-title{
12 position: relative;
13 width: 100%;
14}
15.no-csstransforms3d .box{
16 width: auto;
17 float: none;
18 height: auto;
19 margin: 20px;
20 box-shadow: 1px 1px 3px rgba(0,0,0,0.2);
21 cursor: auto;
22}
23.no-csstransforms3d .box:after,
24.no-csstransforms3d .box-img-left:after,
25.no-csstransforms3d .box-img-right:after{
26 display: none;
27}
28.no-csstransforms3d .box .img-cont,
29.no-csstransforms3d .box-img-left .img-cont,
30.no-csstransforms3d .box-img-right .img-cont{
31 width: 300px;
32 height: 200px;
33 float: left;
34 margin: 10px 20px 20px 0;
35}
36.no-csstransforms3d .box-img-left p{
37 margin-left: 0px
38}
39.no-csstransforms3d .box-img-right p{
40 margin-right: 0px
41} \ No newline at end of file
diff --git a/Blocks/Flipboard/css/style.css b/Blocks/Flipboard/css/style.css
new file mode 100644
index 0000000..577dc52
--- /dev/null
+++ b/Blocks/Flipboard/css/style.css
@@ -0,0 +1,465 @@
1.container {
2 position: relative;
3 margin: 0 auto;
4 -webkit-perspective: 2200px;
5 -moz-perspective: 2200px;
6 perspective: 2200px;
7}
8.page {
9 width: 50%;
10 height: 100%;
11 position: absolute;
12 -webkit-transform-style: preserve-3d;
13 -moz-transform-style: preserve-3d;
14 -webkit-transform-origin: left center;
15 -moz-transform-origin: left center;
16 -webkit-touch-callout: none;
17 -webkit-user-select: none;
18 -khtml-user-select: none;
19 -moz-user-select: none;
20 -ms-user-select: none;
21 user-select: none;
22}
23.page > div {
24 display: block;
25 height: 100%;
26 width: 100%;
27 position: absolute;
28 background: #fff;
29 -webkit-transform-style: preserve-3d;
30 -moz-transform-style: preserve-3d;
31 -webkit-backface-visibility: hidden;
32 -moz-backface-visibility: hidden;
33}
34.page .back {
35 -webkit-transform: rotateY(-180deg);
36 -moz-transform: rotateY(-180deg);
37}
38.page .outer{
39 width: 100%;
40 height: 100%;
41 position: absolute;
42 top: 0px;
43 left: 0px;
44 overflow: hidden;
45 z-index: 999;
46}
47.page .content{
48 height: 100%;
49 position: absolute;
50 top: 0px;
51 left: 0px;
52}
53.overlay, .flipoverlay{
54 background-color: rgba(0, 0, 0, 0.6);
55 position: absolute;
56 top: 0px;
57 left: 0px;
58 width: 100%;
59 height: 100%;
60 opacity: 0;
61}
62.flipoverlay{
63 background-color: rgba(0, 0, 0, 0.2);
64}
65.page .content .inner{
66 padding: 50px 15px 10px;
67 height: 100%;
68}
69.page h1{
70 text-align: center;
71}
72.page.cover .front .content,
73.page.cover-back .back .content{
74 width: 100% !important;
75}
76.page.cover .front .content:after,
77.page.cover-back .back .content:after{
78 position: absolute;
79 top: 0px;
80 left: 0px;
81 width: 10px;
82 height: 100%;
83 content: '';
84 background: -webkit-linear-gradient(left, rgba(0,0,0,0.25) 0%,rgba(0,0,0,0.01) 16%,rgba(0,0,0,0) 17%,rgba(0,0,0,0) 44%,rgba(0,0,0,0.08) 60%,rgba(0,0,0,0.09) 61%,rgba(0,0,0,0.35) 100%);
85 opacity: 0.2;
86}
87.page.cover-back .back .content:after{
88 left: auto;
89 right: 0px;
90 background:-webkit-linear-gradient(left, rgba(0,0,0,0.53) 0%,rgba(0,0,0,0.1) 10%,rgba(0,0,0,1) 100%);
91}
92.page.cover .front .content .inner{
93 padding-top: 20px;
94}
95.page.cover .front .content{
96 background: #ddd url(../images/cover1.jpg) no-repeat center center;
97 background-size: cover;
98}
99.page.cover-back .back .content{
100 background: #B0D5FF;
101}
102.page.cover h1{
103 color: rgba(255,255,255,0.9);
104 text-align: right;
105 font-weight: 300;
106 font-size: 34px;
107 text-transform: uppercase;
108 margin: 0 0 0 60%;
109 line-height: 34px;
110 padding-bottom: 10px;
111 cursor: default;
112}
113.page.cover h1 span{
114 display: block;
115 font-weight: 300;
116 font-size: 15px;
117}
118.page.cover .f-cover-story{
119 color: rgba(255,255,255,0.9);
120 font-weight: 600;
121 font-size: 50px;
122 line-height: 46px;
123 position: absolute;
124 bottom: 60px;
125 left: 40px;
126 margin: 0;
127 text-transform: uppercase;
128 cursor: default;
129}
130a.f-ref{
131 line-height: 20px;
132 font-size: 16px;
133 position: absolute;
134 top: 252px;
135 font-weight: 300;
136 text-indent: 1px;
137}
138.page.cover .f-cover-story span{
139 display: block;
140 font-size: 26px;
141 line-height: 26px;
142}
143.page a,
144.page.cover .f-cover-story span{
145 color: #F86738;
146}
147.page a:hover{
148 color: #000;
149}
150.f-cover-flip{
151 background: #000;
152 color: #ddd;
153 position: absolute;
154 right: 0px;
155 padding: 5px 30px 5px 20px;
156 font-size: 30px;
157 text-transform: uppercase;
158 font-weight: 500;
159 top: 50%;
160 margin-top: -25px;
161 cursor: default;
162}
163.logo{
164 width: 180px;
165 height: 180px;
166 position: absolute;
167 top: 20px;
168 left: 30px;
169 line-height: 428px;
170 color: white;
171 font-size: 59px;
172 font-weight: bold;
173 text-indent: -3px;
174 cursor: default;
175}
176.logo:before{
177 position: absolute;
178 width: 49%;
179 height: 50%;
180 content: '';
181 top: 0px;
182 left: 0px;
183 background: rgba(255,255,255,0.4);
184 box-shadow: 0 95px 0px rgba(255,255,255,0.6);
185}
186.logo:after{
187 position: absolute;
188 width: 49%;
189 height: 50%;
190 content: '';
191 top: 0px;
192 right: 0px;
193 background: rgba(255,255,255,0.6);
194 box-shadow: 0 95px 0px rgba(255,255,255,0.4);
195}
196.f-title{
197 position: absolute;
198 top: 0px;
199 left: 0px;
200 height: 50px;
201 text-align:center;
202 width: 100%;
203}
204.f-title h2{
205 line-height: 50px;
206 margin: 0;
207 font-weight: 300;
208 font-size: 28px;
209 color: #aaa;
210 float: left;
211 width: 33%;
212}
213.f-title a{
214 width: 33%;
215 float: left;
216 text-align: right;
217 overflow: hidden;
218 height: 50px;
219 font-size: 12px;
220 line-height: 50px;
221 padding: 0px 15px;
222 color: #777;
223 font-style: italic;
224 font-family: "Calisto MT", "Bookman Old Style", Bookman, "Goudy Old Style", Garamond, "Hoefler Text", "Bitstream Charter", Georgia, serif;
225}
226.f-title a:first-child{
227 text-align: left;
228}
229.f-title a:hover{
230 color: #000;
231}
232.box{
233 border-top: 1px solid #f2f2f2;
234 float: left;
235 padding: 20px;
236 overflow: hidden;
237 position: relative;
238 background: #fff;
239 cursor: pointer;
240}
241.img-cont{
242 height: 40%;
243 width: 100%;
244 background-repeat: no-repeat;
245 background-position: top center;
246 background-size: cover;
247}
248.img-1{
249 background-image: url(../images/1.gif);
250}
251.img-2{
252 background-image: url(../images/beijing.png);
253 height: 60%;
254}
255.img-3{
256 background-image: url(../images/31.png);
257}
258.img-4{
259 background-image: url(../images/32.png);
260}
261.img-5{
262 background-image: url(../images/33.png);
263}
264.img-6{
265 background-image: url(../images/34.png);
266}
267.img-7{
268 background-image: url(../images/44.jpg);
269}
270.img-8{
271 background-image: url(../images/41.jpg);
272}
273.img-9{
274 background-image: url(../images/43.jpg);
275}
276.box h3{
277 padding: 10px 0px;
278 margin: 0;
279 font-size: 18px;
280}
281.box h3 span{
282 display: block;
283 font-size: 11px;
284 font-weight: 300;
285 text-transform: uppercase;
286 letter-spacing: 2px;
287 color: #74726f;
288}
289.box:after{
290 position: absolute;
291 background: -moz-linear-gradient(top, rgba(255,255,255,0) 0%, rgba(255,255,255,0.73) 22%, rgba(255,255,255,0.73) 23%, rgba(255,255,255,1) 91%);
292 background: -webkit-gradient(linear, left top, left bottom, color-stop(0%,rgba(255,255,255,0)), color-stop(22%,rgba(255,255,255,0.73)), color-stop(23%,rgba(255,255,255,0.73)), color-stop(91%,rgba(255,255,255,1)));
293 background: -webkit-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,0.73) 22%,rgba(255,255,255,0.73) 23%,rgba(255,255,255,1) 91%);
294 background: -o-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,0.73) 22%,rgba(255,255,255,0.73) 23%,rgba(255,255,255,1) 91%);
295 background: -ms-linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,0.73) 22%,rgba(255,255,255,0.73) 23%,rgba(255,255,255,1) 91%);
296 background: linear-gradient(top, rgba(255,255,255,0) 0%,rgba(255,255,255,0.73) 22%,rgba(255,255,255,0.73) 23%,rgba(255,255,255,1) 91%);
297 filter: progid:DXImageTransform.Microsoft.gradient( startColorstr='#00ffffff', endColorstr='#ffffff',GradientType=0 );
298 height: 50px;
299 bottom: 0px;
300 left: 0px;
301 right: 0px;
302 content: '';
303}
304.box p{
305 margin: 0;
306 padding: 0;
307 text-align: justify;
308 font-family: Georgia;
309 font-size: 13px;
310 line-height: 20px;
311 display: block;
312 position: relative;
313 padding-bottom: 30px;
314}
315.w-25{ width: 25%; }
316.w-30{ width: 30%; }
317.w-40{ width: 40%; }
318.w-50{ width: 50%; }
319.w-60{ width: 60%; }
320.w-70{ width: 70%; }
321.w-75{ width: 75%; }
322.w-100{ width: 100%; }
323
324.h-25{ height: 25%; }
325.h-30{ height: 30%; }
326.h-40{ height: 40%; }
327.h-50{ height: 50%; }
328.h-60{ height: 60%; }
329.h-70{ height: 70%; }
330.h-75{ height: 75%; }
331.h-100{ height: 100%; }
332
333.box-expanded.box-img-left .img-cont,
334.box-img-left .img-cont{
335 float: left;
336 width: 40%;
337 height: 100%;
338 margin-right: 2%;
339}
340.box-img-left:after{
341 left: 42%;
342}
343.box-img-left p{
344 margin-left: 42%;
345}
346.box-img-right .img-cont{
347 float: right;
348 width: 40%;
349 height: 100%;
350 margin-left: 2%;
351}
352.box-img-right:after{
353 right: 42%;
354}
355.box-img-right p{
356 margin-right: 42%;
357}
358.title-top h3{
359 padding-top: 0px;
360}
361.box-b-r{
362 border-right: 1px solid #f2f2f2;
363}
364.box-b-l{
365 border-left: 1px solid #f2f2f2;
366}
367.box-expanded{
368 border: none;
369 padding: 50px;
370}
371.box-expanded .img-cont{
372 box-shadow: 1px 1px 2px rgba(0,0,0,0.1);
373 float: left;
374 width: 50%;
375 height: 50%;
376 margin-right: 20px;
377 box-shadow: 1px 1px 2px rgba(0,0,0,0.1);
378}
379.box.box-expanded h3{
380 font-size: 50px;
381 line-height: 50px;
382 padding-top: 0px;
383}
384.box.box-expanded h3 span{
385 font-size: 14px;
386}
387.box.box-expanded p{
388 font-size: 20px;
389 line-height: 30px;
390}
391.box.box-expanded:after{
392 background: transparent;
393}
394.box-expanded .box-close{
395 position: absolute;
396 top: 0px;
397 right: 20px;
398 width: 80px;
399 height: 30px;
400 background: #000;
401 color: #fff;
402 font-weight: bold;
403 font-size: 16px;
404 text-align: center;
405 line-height: 30px;
406}
407@media screen and (max-width: 760px){
408 .f-title a {
409 height: 30px;
410 line-height: 14px;
411 margin-top: 10px;
412 }
413 .f-title h2{
414 font-size: 18px;
415 line-height: 18px;
416 margin-top: 5px;
417 }
418}
419@media screen and (max-width: 690px){
420 .page .box{
421 width: 100%;
422 height: 20%;
423 padding: 5px;
424 border: none;
425 border-top: 1px solid #ddd;
426 }
427 .page .box h3{
428 font-size: 16px;
429 }
430 .page .box h3 span,
431 .page .box .img-cont,
432 .page .box p,
433 .page .box:after{
434 display: none;
435 }
436 .box.box-expanded h3{
437 font-size: 26px;
438 line-height: 30px;
439 padding-top: 15px;
440 clear: both;
441 }
442 .box.box-expanded p{
443 font-size: 16px;
444 line-height: 22px;
445 }
446 .box-img-left p,
447 .box-img-right p{
448 margin: 0;
449 }
450 .box.box-expanded h3 span{
451 font-size: 12px;
452 }
453 body .box-expanded{
454 padding: 40px 20px 20px;
455 }
456 body .box-expanded .img-cont{
457 width: 100% !important;
458 height: 50% !important;
459 margin: 0;
460 }
461 .cover-elements{
462 display: none;
463 }
464
465} \ No newline at end of file
diff --git a/Blocks/Flipboard/images/1.gif b/Blocks/Flipboard/images/1.gif
new file mode 100644
index 0000000..391d383
--- /dev/null
+++ b/Blocks/Flipboard/images/1.gif
Binary files differ
diff --git a/Blocks/Flipboard/images/1.jpg b/Blocks/Flipboard/images/1.jpg
new file mode 100644
index 0000000..c8623c3
--- /dev/null
+++ b/Blocks/Flipboard/images/1.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/2.jpg b/Blocks/Flipboard/images/2.jpg
new file mode 100644
index 0000000..f463a7d
--- /dev/null
+++ b/Blocks/Flipboard/images/2.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/3.jpg b/Blocks/Flipboard/images/3.jpg
new file mode 100644
index 0000000..900e75a
--- /dev/null
+++ b/Blocks/Flipboard/images/3.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/31.png b/Blocks/Flipboard/images/31.png
new file mode 100644
index 0000000..d3eac5e
--- /dev/null
+++ b/Blocks/Flipboard/images/31.png
Binary files differ
diff --git a/Blocks/Flipboard/images/32.png b/Blocks/Flipboard/images/32.png
new file mode 100644
index 0000000..941876a
--- /dev/null
+++ b/Blocks/Flipboard/images/32.png
Binary files differ
diff --git a/Blocks/Flipboard/images/33.png b/Blocks/Flipboard/images/33.png
new file mode 100644
index 0000000..486fc92
--- /dev/null
+++ b/Blocks/Flipboard/images/33.png
Binary files differ
diff --git a/Blocks/Flipboard/images/34.png b/Blocks/Flipboard/images/34.png
new file mode 100644
index 0000000..53a3f82
--- /dev/null
+++ b/Blocks/Flipboard/images/34.png
Binary files differ
diff --git a/Blocks/Flipboard/images/4.jpg b/Blocks/Flipboard/images/4.jpg
new file mode 100644
index 0000000..a487d1f
--- /dev/null
+++ b/Blocks/Flipboard/images/4.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/41.jpg b/Blocks/Flipboard/images/41.jpg
new file mode 100644
index 0000000..c7f7d40
--- /dev/null
+++ b/Blocks/Flipboard/images/41.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/43.jpg b/Blocks/Flipboard/images/43.jpg
new file mode 100644
index 0000000..a37db8e
--- /dev/null
+++ b/Blocks/Flipboard/images/43.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/44.jpg b/Blocks/Flipboard/images/44.jpg
new file mode 100644
index 0000000..1289d2d
--- /dev/null
+++ b/Blocks/Flipboard/images/44.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/5.jpg b/Blocks/Flipboard/images/5.jpg
new file mode 100644
index 0000000..9033d04
--- /dev/null
+++ b/Blocks/Flipboard/images/5.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/6.jpg b/Blocks/Flipboard/images/6.jpg
new file mode 100644
index 0000000..45cbb34
--- /dev/null
+++ b/Blocks/Flipboard/images/6.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/7.jpg b/Blocks/Flipboard/images/7.jpg
new file mode 100644
index 0000000..1dfd8cb
--- /dev/null
+++ b/Blocks/Flipboard/images/7.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/8.jpg b/Blocks/Flipboard/images/8.jpg
new file mode 100644
index 0000000..a591327
--- /dev/null
+++ b/Blocks/Flipboard/images/8.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/ImageAttribution.txt b/Blocks/Flipboard/images/ImageAttribution.txt
new file mode 100644
index 0000000..962294f
--- /dev/null
+++ b/Blocks/Flipboard/images/ImageAttribution.txt
@@ -0,0 +1,4 @@
1Background Pattern from http://subtlepatterns.com/
2
3Photos by NASA HQ: http://www.flickr.com/photos/nasahqphoto/
4
diff --git a/Blocks/Flipboard/images/beijing.png b/Blocks/Flipboard/images/beijing.png
new file mode 100644
index 0000000..c90b15c
--- /dev/null
+++ b/Blocks/Flipboard/images/beijing.png
Binary files differ
diff --git a/Blocks/Flipboard/images/cover.jpg b/Blocks/Flipboard/images/cover.jpg
new file mode 100644
index 0000000..55565f8
--- /dev/null
+++ b/Blocks/Flipboard/images/cover.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/cover1.jpg b/Blocks/Flipboard/images/cover1.jpg
new file mode 100644
index 0000000..6e48737
--- /dev/null
+++ b/Blocks/Flipboard/images/cover1.jpg
Binary files differ
diff --git a/Blocks/Flipboard/images/fabric_plaid.png b/Blocks/Flipboard/images/fabric_plaid.png
new file mode 100644
index 0000000..7120bb4
--- /dev/null
+++ b/Blocks/Flipboard/images/fabric_plaid.png
Binary files differ
diff --git a/Blocks/Flipboard/index.html b/Blocks/Flipboard/index.html
new file mode 100644
index 0000000..b97d914
--- /dev/null
+++ b/Blocks/Flipboard/index.html
@@ -0,0 +1,316 @@
1<!DOCTYPE html>
2<html lang="en">
3 <head>
4 <meta charset="UTF-8" />
5 <meta http-equiv="X-UA-Compatible" content="IE=edge,chrome=1">
6 <title>说好的约定</title>
7 <meta name="viewport" content="width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0">
8 <meta name="description" content="Experimental Page Layout Inspired by Flipboard" />
9 <meta name="keywords" content="flip, pages, flipboard, layout, responsive, web, web design, grid, ipad, jquery, css3, 3d, perspective, transitions, transform" />
10 <meta name="author" content="Jinwei" />
11 <link href='http://fonts.googleapis.com/css?family=Open+Sans+Condensed:700,300,300italic' rel='stylesheet' type='text/css'>
12 <link rel="stylesheet" type="text/css" href="css/demo.css" />
13 <link rel="stylesheet" type="text/css" href="css/style.css" />
14 <script type="text/javascript" src="js/modernizr.custom.08464.js"></script>
15 <script id="pageTmpl" type="text/x-jquery-tmpl">
16 <div class="${theClass}" style="${theStyle}">
17 <div class="front">
18 <div class="outer">
19 <div class="content" style="${theContentStyleFront}">
20 <div class="inner">{{html theContentFront}}</div>
21 </div>
22 </div>
23 </div>
24 <div class="back">
25 <div class="outer">
26 <div class="content" style="${theContentStyleBack}">
27 <div class="inner">{{html theContentBack}}</div>
28 </div>
29 </div>
30 </div>
31 </div>
32 </script>
33 </head>
34 <body>
35
36 <header class="main-title">
37 <h1>说好的约定 </br><strong>TransSiberian</strong></h1>
38 <p>Swipe or drag to flip the pages, click to open items </p>
39 <p><strong>Best viewed in a Webkit browser (Safari, Chrome)</strong></p>
40 </header>
41
42 <div id="flip" class="container">
43
44 <div class="f-page f-cover">
45 <div class="cover-elements">
46 <div class="logo">
47 Start
48
49 </div>
50
51
52 </div>
53 <div class="f-cover-flip"></div>
54 </div>
55
56 <div class="f-page">
57 <div class="f-title">
58
59 <h2 align="center">从北京到莫斯科</h2>
60
61 </div>
62 <div class="box w-25 h-70">
63 <div class="img-cont img-1"></div>
64 <h3>A brief introduction <span>Published May 3, 2013</span></h3>
65 <p>记得最早是在人人网上看到了德铁的数据库里有从德国到北京的火车。具体是从德国到华沙,从华沙到莫斯科,从莫斯科到北京。后来好像就能经常看到莫斯科到北京的火车的消息了。也许是自己开始不经意地关注了。今天早上特意在维基百科上仔细地看了有关莫斯科到北京的这条线路的火车的信息,在豆瓣上看到了几篇坐过这趟火车的游者的笔记,下午又看了一部有关这趟世界上最长的铁路的电影,TransSiberian,(穿越西伯利亚),毫无疑问,我已经深深地征服了。很显然,我是一直以来都喜欢坐火车出行的。这趟6天5夜的旅行,如果能够成行,必然是生命中不可多得的一次大冒险。首先简要地介绍一下有关这趟火车的细节。从北京到莫斯科的火车线路一共有两趟。一趟是K3/4次列车,经二连浩特进入蒙古国然后进入俄罗斯境内,列车及乘务员全部由中国方面负责。另一趟是K29/30次列车,从北京出发,经满洲里进入俄罗斯境内,列车及乘务人员全部由俄罗斯方面负责。如果是我,我肯定会选择由中方担当营运的K3/4次,一来与乘务员的语言交流方便(这是最主要的),好像其他也没啥理由了。接下来也围绕这一次列车展开。票价方面,分为高包软卧,软卧,硬卧三个档次,分别是6021元,5501元,3737元(数据来自http://rw19.net/record/)。高包就是两人一个包厢,然后一些设施方面比较豪华,普通的软卧是4人一个包厢,硬卧也是4人包房。发车时间方面,每周一班,每周三北京站早上07:45发车,次周一14:19抵达莫斯科。途中主要的站点有大同、二连浩特、扎门乌德、乌兰巴托、伊尔库茨克、新西伯利亚等站。因为中国用的是国际标准轨,而蒙古国和俄罗斯用的是更宽的宽轨,所以在中国边境的二连浩特,列车将会被整列被吊起,更换铁轨。这毫无疑问是激动人心的一次体验。</p>
66 </div>
67 <div class="box w-50 h-70 box-b-l box-b-r">
68 <div class="img-cont img-2"></div>
69 <h3>(一)地图</span></h3>
70 <p>如果我们把目光从中国版图移向世界,那么这样一条铁路线会让你惊叹不已,从太平洋沿岸的符拉迪沃斯托克(海参崴)到乌拉尔山脉的车里雅宾斯克,乌拉尔山是欧洲和亚洲的分界线,车里雅宾斯克是2007年上合军演的所在地,这条线路就是横贯亚欧大陆的西伯利亚大铁路,俄罗斯西伯利亚-远东地区的交通大动脉。当从北京站始发的k3次国际列车出境二连浩特,经乌兰巴托进入俄罗斯境内后,从蒙古国延伸过来的铁轨便与西伯利亚大铁路汇合了,而汇合点距离传说中的贝加尔湖仅半天多的路程而已。
71K3次国际列车的票价是2700元,加上180元的蒙古国的过境签证,约2900元。我知道,经过努力我可能在网上找到3000-4000元的从北京到莫斯科的飞机票,飞机只需要7、8个小时即可到莫斯科,而火车需要六天五夜。然而,10月份正是俄罗斯的深秋季节,遥远的西伯利亚充满着无尽的想象,浩瀚的贝加尔湖,金黄的白桦林,坚韧豪放的俄罗斯农庄……时间和价格都不是我可以错过这条线路的理由,我义无反顾地选择了这条路线,从北京去莫斯科大学亚非学院交流学习。
72列车时刻表上,这条线路被标记为“北京-乌兰巴托-莫斯科”,但这条线路的主角既不是北京、乌兰巴托,也不是莫斯科,而是西伯利亚。
73列车从北京站出发,星期三早晨7点45分,经张家口南、大同、集宁南、晚上8点多到达中国的边境检查站二连浩特,在这里护照会被盖上出境章,旅客需要填写(旅客行李)物品(申)报(海)关单,同时还要更换铁轨,因为中国的铁轨与蒙古国、俄罗斯的铁轨宽窄不同。换轨在“国际换轮库”里进行,火车厢被一节一节地吊起,中国的铁轨撤掉,俄式的铁轨换上,整个过程旅客无须下车,也感觉不到任何震荡。因为换轨和边境检查,所以列车会在二连停3个小时左右。晚上11点多火车离开二连浩特进入蒙古国,随即停在蒙方的边境检查站上,进行蒙方入(过)境签证检查、物品报关等手续,第二天下午1点多达到乌兰巴托,晚上9点左右再次到达蒙古国边境,进行蒙方的出境检查。乌兰巴托时间和北京时间大概是相同的,所以无须调整手表。
74乌兰巴托时间晚上10点多出蒙古国进入俄罗斯,莫斯科时间比北京时间晚4个小时,所以莫斯科时间下午6点左右进入俄罗斯。列车在边境的纳乌什基(наушки)停车,进行俄方的入境签证检查,填写物品报关单、移民卡,这里的检查比较细致。至此,烦琐的边境检查终于结束了,列车奔驰在辽阔的西伯利亚土地上了。经贝加尔湖、伊尔库茨克、克拉斯诺雅尔斯克、新西伯利亚、奥姆斯克、秋明油田(大概在这附近,列车不再走西伯利亚大铁路,转而向西北的东欧平原进发),进入乌拉尔山区的叶卡捷林堡,现在的叶卡也叫做斯维尔德洛夫斯克,过了乌拉尔山,列车正式驶入欧洲,再经别尔米、基洛夫、古都弗拉基米尔,最后进入900万人口的莫斯科,时值莫斯科时间星期一下午2点多。
75这条线路共经过三个国家,纵贯蒙古国南北,经过俄罗斯至少14个行政单位(州、共和国、自治区、边疆区),经过蒙古高原、蒙俄边境的雅布洛诺夫山脉、世界上最深的内陆湖贝加尔湖、中西伯利亚高原的南部、西西伯利亚平原南部,翻过乌拉尔山区后进入东欧平原。列车出中国需要1天,过蒙古也需要1天,其余4天都在广袤的俄罗斯领土上奔驰。
76向东这条线路可以延伸至太平沿岸的海参崴,向西可以延伸至乌克兰、捷克、德国、巴黎等等,跟我同火车包厢的伙伴就是乘坐这条线路回比利时。
77</p>
78 </div>
79 <div class="box w-25 h-70">
80 <div class="img-cont img-3"></div>
81 <h3>(二)离别<span>Published May 3, 2012</span></h3>
82 <p>10月3号凌晨4点多,lan和几个好朋友一起送我去北京站。出租车上,我默默地流泪了,我忍不住我的眼泪,可能是因为我马上就要离开我最熟识的朋友了,大约八个月我们见不到面,也可能是因为胆怯,因为我马上就要步入一个高度不确定的环境中,而我从未经历过这种不确定性。
83出发前的两个星期内,我不停地与亲朋师友们告别。见过了pictures版的老友
84们、小柯、Q艳、小米夫妇和YQ,跟宿舍的哥们喝过,跟同班同学喝过,跟同高中的师兄、师姐、师妹们聚过,同门师友聚会为我饯行,dai爷又以俄餐送行,还去天津看过妹妹,见到了阿蒙和单姐,……临走时,班级的几个穷哥们撕扭着塞给我500块钱……所有这一切,我很感动,也很满足……离别,让生命和友情绽放,却又瞬间将其置于深远的时空下,煎熬着,飘散在空气中的味道叫伤感。
85就这样上火车了。安检很松,只需查看车票。
86我在11车厢第11铺,属于第3包厢,跟我同包厢的是一个比利时人,并且四人包厢里面只有我们两个旅客,看来,我不得不用我蹩脚的英语跟他交流了。lan和好朋友送我到包厢里,把行李放到床铺下面,我们在车厢外壁上的国徽前合影作别,几分钟后,列车缓缓启动……
87我身上带着1500元的美金、笔记本电脑和护照,所以,上了火车心里总是忐忑不安。dai爷曾经在1992年坐过这趟列车,他特别嘱咐我小心看管自己的财物,晚上睡觉的时候要把包厢门反锁好,必要时要用绳子把门锁再缠一遍。在百度网,我也试图搜索一些对这趟列车的介绍,结果搜索出来的消息大部分与90年代的抢劫、偷窃案件有关,也有案件发生在近几年。不过,这么多年过去了,车上的治安应该所有改善吧,我这样想,况且利用国际列车运输货物的高峰期早过去了,车上旅客所携带贵重财物已经很少了。
88愿上帝保佑我一路平安!
89</p>
90 </div>
91 <div class="box w-50 h-30 box-b-r title-top">
92 <h3>(三)启程<span>Published May 3, 2012</span></h3>
93 <p>出发前的晚上我只睡了一个小时,火车离站后,困意迅速来袭。跟比利时人简单打了招呼,我把包厢门反锁,把随身背的361度运动斜挎包放在枕边,倒在卧席上很快就睡着了。
94当我醒来时,发现比利时人也睡着了,他头戴耳机,眼带黑眼罩,身上的毛仿佛野草,杂乱而茂盛……此时列车好像正在经过山区,每隔一会儿就会出现一个隧道,我走出包厢向窗外看,丛山延绵,硕大的山谷扑面而来,我顿时失去了方向,竟不知道这是什么地方。自从去年11月份“京郊穿越黄草梁”一事闹得满城风雨后(此事参见《柏峪-黄草梁-七座楼-向阳村……穿行记》),近一年的时间内我没有“撒野”了,更是很少见到大山。我仔细寻找着路边的字迹,发现了“官厅”、“怀来”字样,才意识到这里是北京的怀柔区。我想起,北京城地处平原,北京小平原的西北方向就是燕山,此刻列车正在穿越燕山,向内蒙古高原方向驶去。
95我回到包厢继续补觉,昏睡中被叫醒,原来是列车乘务员送来免费的午餐券和晚餐券,餐券上有中文、英文和俄文三种语言。既然车上有免费餐券,那我的那些食物岂不白带了?隔壁包厢有女乘客高声说,“怎么还没出河北”,原来列车刚过河北沙城,我心想,旅程刚刚开始就如此心急,那以后的六天五夜她该如何度过呢?我出发时,朋友们也担心我该如何度过这漫长的六天五夜,师兄甚至给我copy了130多集的评书《隋唐演义》,让我在火车上解闷儿,可我毫不担心,我给远在南京的“jia先生”发短信说,六天里我会写日记、看俄罗斯国情方面的书、学俄语、吃东西、做俯卧撑锻炼身体、看风景拍照片……我会有很多事情做,只要不丢东西,我相信这将是一次很难忘的旅行。
96大约11点多,我背着361度运动包,拿着餐券去餐车吃免费午餐,比利时人还在睡觉。运动包里面装着笔记本电脑和证件,所以我决定包不离身。在餐车里,我点了炒花菜、炒蒜苗和一碗米饭,饮料4元一听,需要单独付费。对面来了一个年轻男子,大概27、28岁,个子与我相仿,他点了同样的菜,我主动与他搭话,算是礼貌性地打招呼,他则告诉我“免费餐券过了今天不再有”,原来这免费午餐是对旅客的“慰问餐”。他是北京人,家住宣武区,在莫斯科做生意,正属我的研究群体之列,所以我多问了他几句,他把货物装在包厢里。
9790年代,苏联解体后,俄罗斯的商品极其短缺,尤其是日用品,这为廉价的中国商品进入俄罗斯市场提供了机会,而国际列车就成为最早的商品运输工具。列车规定,旅客行李限重35公斤,但大概这个规定没人理会,或者早被旅客们疏通得名存实亡了,所以这些中国旅客们往往携带很多日用品上车,而列车所停靠的小站往往成为中国商品的集散地,通常尚未到莫斯科,车上的商品早已换成大把的卢布了。正因为车上的商人较多,钱财较多,所以抢劫、偷窃比较猖獗。dai爷讲,他当年坐这趟列车时,从莫斯科上来一个俄罗斯男人,带着两个俄罗斯姑娘,从莫斯科到北京,一直向旅客提供性服务;而这些中国商人也趾高气昂地嫖娼,还宣称为中国失去那么多北方领土报仇雪恨……啧啧……鱼龙混杂、藏污纳垢的东方快车!
98吃饭之际,对面的男子突然堆笑着向我提出要求:“帮个忙儿吧,帮我带几条烟在你房间里”。面对突如其来的要求,我没有任何心理准备。他开始谩骂俄方的女检查员,憎恨俄方的例行检查,我不知怎么拒绝他的要求,当然更不想接受,因为这可能会给我带来麻烦,我只好岔开话题。我非常不爽,凭什么让我帮他做这种事?我立即感觉到他脸上的笑容很猥琐,饭没有吃完,我就起身走了。走廊里,我突然记起,我曾经把包厢地址告诉过他,而餐桌上我也没有明确拒绝他的要求,想必他会找来,我该如何是好?
99免费晚餐我没有去吃,因为我不想再碰到这个商人。我在日记里写道:
100“我阅读翁杏法的小册子《到莫斯科去》,这本小册子是90年代写的,作者明确写道‘不要轻易向别人透露你的居住地址’,我想,我也没有想到,竟是一个中国人首先让我体会到了这个道理……其实,在国外,也许外国人比中国人更友善,中国人由于经济利益的原因往往更功利,更不友善,更坏。可以这样对比,同样互不熟识的情况下,中国人比外国人更愿意向对方提出令对方为难的要求,如果对方拒绝了,中国人也许比外国人更愿意谩骂、憎恨对方”。
101大概晚上8点30分,火车到达二连浩特,这是中国边境检查站,过了这里,我就
102身处异国了,我的手机也将没有信号,无法再跟爸妈、lan、同学联系了。我有些怅然。火车在这里要换轨,我用数码相机拍了换轨过程的小短片,打算回去给同学看。11点多,火车进入蒙古国,在蒙方的检查站停留了一段时间,火车重新启动后,我和比利时人方才入睡,因为今晚不再有检查。</p>
103 </div>
104 <div class="box w-50 h-30 title-top">
105 <h3>(四)蒙古 <span>Published May 3, 2012</span></h3>
106 <p>我在蒙古国大使馆办过境签证的时候,曾经遇到一个中国女人,她说“蒙古什么都没有”。也许她说得没错,透过车窗,我什么都看不到,只有无边无际的大地,比利时朋友不停地念叨着“Nothing, nothing, crazy country”!也许,盛夏季节,这里会是满山遍野的碧绿,但现在正值深秋,草已枯黄,也看不见灌木丛和树林,只有短草勉强包裹着大地。当大地上缺少高大植被的时候,大地所呈现给我们的是标准的“地势”,或平坦如砥,或高低起伏,线条凸凹感十分强烈,大地展现了他性感的一面!很罕见地,我看到一摊水,巴掌那么大,水边围着一群羊,我真担心一个钟头以后,这摊水会被饥渴的羊群喝干。偶尔会见到房屋,远远望去,八、九个房屋围坐在一起,仿佛正在召开部落会议,这里的房屋也像蒙古包,只是尖顶下面围着的是方形墙壁,房屋表面经常涂着墨绿色和铁红色,墨绿色的门窗,铁红色的山墙,别有一番味道。铁路沿线可以看到很多电线杆,但这些电线杆多为木制,并且大多是由两节木头连接而成,印象中,这些木头电线杆是我小时候家乡的景象,而现在家乡的电线杆早已更换成水泥混凝土的了,更加结实耐用。看着这些,我意识到蒙古国的生产能力大致处在什么水平了。蒙古国大使馆门前的那个中国女人告诉我,她给朋友办理签证,而她的朋友是去蒙古国做房屋装潢,想必蒙古国的房屋建设、装潢水平也不高。
107下午1点多(10月4日),列车进入乌兰巴托,我赶紧用小数码录像。乌兰巴托没有想象中那么明净美丽,这应该是蒙古国的“大都市”了,但是我没有看到林立的高楼,楼房多为6、7层,10到20层之间的楼房在乌兰巴托想必是少有的高层建筑了吧,大概更多的居民居住的是平房。蒙古全国也就200多万人口,乌兰巴托的人口能有100万吗?高层建筑大多出现在上海、香港、东京、纽约这样人口高度集中的城市,而乌兰巴托没必要致力于垂直开发空间,也许汽车较房屋的需求更强,在铁路一侧,我看到几个轿车聚集的地方,大概是停车场。
108列车在乌兰巴托站停一会儿,旅客可以下车走动,比利时朋友要去买Mongolian milk,我跟他下车去转转。车站不大,相当于中国中等城市的车站,乌兰巴托下点小雨,一个蒙古中年男子用中文向我兜售蒙古邮票,我没有理会,我们没有找到Mongolian milk,却看到了韩国和中国方便面,比利时朋友在一个小摊铺前驻足,售货大婶可以说俄语,比利时朋友用20元人民币买了一大根香肠和两袋大面包,兴高采烈地往回走,在餐车前,我为他和香肠、面包照相留念。1元人民币大概等于758蒙元,所以一个香肠、两袋面包卖20元人民币很赚,而比利时人也觉得20元人民币买了这么多食物不贵,皆大欢喜。一个国家的货币价格可以反映该国的生产能力,从蒙元的汇率上足见蒙古国的生产水平了。
10930分钟后,列车离开乌兰巴托,我的目光再次陷入苍茫大地。比起乌兰巴托,我更喜欢这辽阔无边的大地,正像久居北京的人喜欢去坝上草原放松心情一样,但习惯了荒芜人烟的大草原的蒙古人也许更喜欢乌兰巴托,在那里游牧的人们可以定居、群居。我在日记里写下:
110“蒙古国一定很贫穷,但这里拥有人烟稀少的土地,因此这里拥有别样的心情和别样性格的人。《乌兰巴托的夜》,是怎样的呢?天上有许多星星?还是地上有许多明亮的车灯?我希望是前者”。
111</p>
112 </div>
113 </div>
114
115 <div class="f-page">
116 <div class="f-title">
117
118 <h2>从北京到莫斯科</h2>
119 </div>
120 <div class="box w-70 h-50 box-b-r title-top box-img-left">
121 <div class="img-cont img-4"></div>
122 <h3>(五)纳乌什基(наушки)<span>Published May 3, 2012</span></h3>
123 <p>傍晚,列车出蒙古进入俄罗斯,在наушки站先后上来4个俄罗斯工作人员进行了3次检查,包括仔细的行李检查,但无需打开行李,检查签证时通常会把护照收走一段时间,待盖完入境章后重新还给旅客。中国、蒙古、俄罗斯三国检查签证的工作人员皆为女性。列车在наушки停车约5个小时,停车时厕所会关闭,可比利时朋友恰好这时想去厕所,所以十分苦恼,直说要找个瓶子撒尿,然后把瓶子扔出窗外,说完我们哈哈大笑。在这一站,我把手表调回了4个小时,开始使用莫斯科时间。
124不出所料,那个中国商人来找我了,我正躺在床上看书,他出现在门口大声说:“原来你在这里啊”,我瞟了他一眼,没有说话,继续看书,然后他走了。我以冷漠表示了拒绝,后来我们再次相遇的时候,他没有再跟我搭话,看来他还很知趣。有了这次经历,我告诫自己“有些事情不要给对方留任何希望”,很快这个经验再次应用上了。наушки站停车时,我听到有个中年男子在走廊里喊:“我得借个护照,要不得罚款了”,听到这个喊声,我下意识地去关包厢门,他恰好走到我们的包厢门口:“能借护照用一下吗”?这是个大约45岁左右的中国男子,我反问道:“护照怎么能借”?他马上回答“是海关让我来借的”,我随即把门关上,不再理他。我心想,为了逃避罚款居然编出“海关让他借护照”的瞎话儿,真是见鬼了。这个男子是第二个向我提出无理要求的中国人,我猜,他可能是长期寄居在列车上的商人,可能负责货物运输,因为他跟列车员有些熟。当我用两种方式拒绝了两个无理要求后,才有所安心。
125过了наушки站,以后的4天将不再有各种检查,真正开始享受西伯利亚之旅了!
126列车在此前的停车时间最长,前后共有4次证件、行李检查,每次检查都要停车几个小时,中间还有一次换轨,这就是通关手续所带来的麻烦。但欧洲就大不一样,欧洲一体化带来的一个重要影响就是简化了欧洲各国之间的通关手续,如果不是这样,乘火车从希腊走到荷兰不知要浪费多少时间和金钱在通关手续上。我的一个朋友大约4年前开始在巴黎读书,迄今已经到过好多欧洲国家,但她的护照上却只有法国签证,当她抱怨护照上签证太少的时候,殊不知签证丰富所意味着的繁琐手续。
127列车再次启动,我知道,明天早晨就能见到贝加尔湖了……噢,贝加尔湖,我心中的梦……今晚,我将带着神秘的贝加尔入梦,good night!
128</p>
129 </div>
130 <div class="box w-30 h-50">
131 <div class="img-cont img-5"></div>
132 <h3>(六)贝加尔<span>Published May 3, 2012</span></h3>
133 <p>一觉醒来,手表显示凌晨3点多,但是太阳却光彩夺目……我有些糊涂了,弄不清时间了。我赶紧起身,打开包厢门向窗外望去,天啊!Какой красивый пейзаж! 太漂亮了!当你的眼睛已经习惯了漫无边际的光秃草原,眼前却突然出现大片大片的金黄色白桦林时,你根本无法抑制那种兴奋与激动,到处都是白桦树,到处都是金黄色,一片连着一片,没有尽头,无边无际,那是一种来自心底的震撼!秋天在这里化身海洋,你向远处看吧,麦田是金色的,白桦林是金色的,阳光是金色的……你会感慨万千,为什么仅仅一线之隔,这边遍地白桦,而那边却只有光秃秃的草原,造物主分配植被的时候未免太苛刻了吧。
134我赶紧回到包厢记下自己的心情,又立刻跑回走廊,生怕错过什么。
135突然,包厢里的比利时朋友大叫一声“lake”!我转身又回到包厢,哇塞!I can’t believe my eyes! 车厢这边一片蔚蓝,像大海一样浩瀚,真大,真漂亮,真干净!这就是贝加尔湖吗?我丝毫没有心理准备,应该就是了,贝加尔湖,梦幻般的出场!I want stay here all my life!Как море!Like the sea ……我的语言系统完全混乱了,我完全找不到词来形容贝加尔湖,那是一种让嘴巴无能为力,让眼睛不知所措的感觉。这分明就是海!它有翻滚的波涛,拍打在岸边还激起雪白的浪花,那布满细沙的岸边不正是海滩吗?可它确实是湖泊,世界上最深、最富有的内陆湖,在地图上你可以看见它被陆地环保,轮廓清晰可见。贝加尔,这大概是海洋之母远嫁人间的一个女儿,她干净美丽得让人窒息,我真想跳下火车去触摸她,去感受她的湖水,她的波涛,她的一切,却又不忍心碰触,担心这样会惊到她,破坏她那原生态的美丽。
136湖岸边,生长着挺拔的白桦树,白桦林间散落着一座座俄式木屋,木屋旁时而走过几个俄罗斯大叔。比利时人猜那是俄罗斯人的度假别墅,在这里,任何一间破木板房都是别墅!贝加尔湖,真的是人间天堂,望不尽的山林,望不尽的湖水,湖水藏在山桦林后面,白桦林却怎么也挡不住贝加尔湖的面庞。上帝啊!多么神奇!多么伟大!
137我拿着相机尽情地拍摄着,远处忽然浮现出高低起伏的青白色,Snow mountain!我大叫了一声,比利时朋友赶紧凑过来。哇呜!这里居然看见了雪山!不可思议!这时我生平第一次见到雪山,居然在贝加尔,我居然在同一天见到了贝加尔湖和雪山!2007年10月5日!我弄不清楚了,雪山、白桦林、蔚蓝的湖水、浪花、天空、飞鸟、秋天、木屋、小河、山泉、铁路桥、俄罗斯大叔……噢,我眼花缭乱,铁路两侧,一切尽收眼底,却又怎么都看不过来,美丽是需要秩序的,可是我弄不清这么多的美丽究竟是如何组合起来的,这么多的美丽,它们之间到底是什么关系,我完全不能理解,浑然天成。我能确定的是,所有这些美丽都有一个共同的名义——贝加尔湖。能亲眼目睹这壮丽的景象,真是莫大的幸福!
138车停了,我得去看看……原来是一个叫Байкальск(贝加尔斯克)的小站,只停了半分钟,我还没来得及照相……远处的山,一层秋黄,一层墨绿,又一层枫红,整片山仿佛色带,墨绿中点缀着金黄,金黄中又泛起墨绿,而枫红镶嵌其中,啊,真是迷人,天生的油画,无需任何人工雕琢;更远处的山,灰灰的,白白的,灰的是树,白的是雪,也许是去年的积雪,也许是今年的新雪。山脚下,白桦林中,贝加尔湖畔,木屋点点,其中有一个小村庄就叫贝加尔斯克,多么幸福的村庄,多么幸运的村民。当年,海洋之母为贝加尔准备了丰厚的嫁妆出嫁远方,让这个女儿拥有336条注入河,占全世界总储量近1/5的淡水,还有极为丰富的煤炭、金属铝、森林资源,让这个海拔456m的高山少女闻名世界。噢!依傍着贝加尔湖,贝加尔斯克的村民一定生活得很富足。
139火车沿着贝加尔湖走了很久,我也忙个不停,一会儿从包厢跑到走廊,看铁路那边的白桦林和村庄,一会儿又从走廊跑回包厢,看铁路这边的蔚蓝湖泊。起初我还拍些照片,但很快就觉得不过瘾,全部改成录制短片了,可相机记忆卡的空间实在很小,两三个短片下来记忆卡就满了,这样我又得把视频倒到笔记本里面。恰好这个时候,我的相机和笔记本都快没电了,然后我又翻找充电器、转换插头,给相机充电十几分钟(列车上有低压电源,电流不稳定),又开始录短片……我想,我的亲朋师友们不会有太多机会亲眼目睹这些景象,我应该把视频带回去给他们看。
140外面似乎飘起了雪,我还不太确定,乘务员招呼我“小伙子,下雪了,赶快拍吧”。几天下来,乘务员们早已习惯了我拿着相加跑来跑去,拍来拍去。真的是下雪了!雪花纷纷扬扬,天空朦朦胧胧,只能看见近处的村庄,稍远一点的房屋在雪雾中若隐若现,真的像庄园,仿佛雪雾里隐藏着一个更大的城堡。而贝加尔湖边,也早已白茫茫一片,分不清哪里是天空,哪里是湖面,只是地平线上隐约一条粗线,线下的颜色多一点青蓝,应该是湖,线上的颜色多一些灰白,大概是天。雪越来越大,水天逐渐融为一体,贝加尔湖成为想象。
141看来列车又要经过一个站,地面的铁轨增加至四五条,天空的电线也便变成了网,路边七八个橘黄色的铁路工人站成一排,看着疾驰而过的国际列车。铁路线上停着暗红色的货运列车,有集装箱、汽油灌、起重机等等,又看见了绿色的客运列车,里面空荡荡的。地面上开始出现两三层的楼房,还横七竖八地停着很多轿车,这大概是个中转站,而贝加尔湖早已躲到车站后面。列车在这站未停,小站过后,水天一色的贝加尔湖又来到眼前。
142我的心逐渐平静下来,不再忙乱,我回到桌旁拿起笔和日记本,望着贝加尔湖开始临摹我的心情,贝加尔湖也逐渐化作一壶绿茶,让我慢慢品味……列车在贝加尔湖畔整整走了四、五个钟头,在地图上,这段路程大概相当于贝加尔湖周长的1/7。莫斯科时间上午8点多,列车经过了斯柳迪扬卡(Слюдянка),噢,美丽的贝加尔湖,Time to say goodbye,下次再见吧。下一次,我将环绕着你走上几天几夜,给你拍一套漂亮的写真集,你的夕阳,你的日升,你的暴雨,你的海浪,你的蔚蓝,你的所有美丽……再见!贝加尔……
143前方66公里处,伊尔库茨克(Иркутск)还在等待。
144</p>
145 </div>
146 <div class="box w-30 h-50 box-b-r title-top">
147 <h3>(七)YAHZEE<span>Published May 3, 2012</span></h3>
148 <p>哦,离开贝加尔湖了……
149当我为贝加尔湖兴奋不已的时候,比利时朋友却比较平静,后来他甚至睡了一会儿,只是我大喊“Snow mountain”的时候,他赶紧起来趴窗看,然后照了几张相,又去听他的mp3。列车临近伊尔库茨克的时候,比利时朋友邀请我跟他玩游戏,游戏的名字叫YAHZEE。这个游戏非常有趣,很适合长途旅行中消遣时光,我想把这个游戏带回中国跟朋友们玩,所以这里详述游戏规则,但在火车上,无论如何我都无法把游戏规则清楚地讲给隔壁的中国人听。游戏需要5个骰子,每个玩家每回有3次(3次为1回)掷骰机会,每次可以5骰全掷,也可以根据上次的结果选择其中几个骰子掷出,以求更满意的数字组合。3次过后,根据该回最终得到的数字组合计分,但计分的形式有很多种(见下表中的“解释”),玩家可以选择计分的形式,填入相应的计分表格中,每轮必须要填写表格,如因分数较低不想填写,可以划去概率较低的栏目(例如YAHZEE、BS等),14回过后,一局游戏结束,最后总积分多的玩家胜出。
150</p>
151 </div>
152 <div class="box w-70 h-50 title-top box-img-left">
153 <div class="img-cont img-6"></div>
154 <h3>(八)马克西姆<span>Published May 3, 2012</span></h3>
155 <p>YAHZEE这个游戏,是比利时人上车第一天教我玩的,起初我只能连续玩3局,因为我还不太熟悉规则,3局下来之后我的大脑已经转不动了,很需要休息。但每天都跟他玩一会儿,很快就轻车熟路了。玩过游戏,我跟这个比利时人已经很熟了,尽管我的英语不太好,说起话来磕磕绊绊,但是他仍然能理解我说的意思,他说起话来总是附带很多很夸张的动作,有时甚至尚未开口,动作已经结束,而我已经理解他的意思。他的笑声也很多,早晨起来一句“morning”,然后“呵呵呵”一声笑,笑得有些傻,但让我觉得很亲近,从这个“呵呵呵”开始,一整天笑声不断。我们这节火车厢,只有3个包厢里有旅客,隔壁是一男一女,再隔壁是个荷兰人,其他4、5个包厢都由乘务员使用,其中几个包厢被乘务员装满了中国食品,而所有这些包厢里面,就我们这个3号包厢笑声最多,通常是比利时人笑声在先,我的笑声在后。
156比利时人给我看他的各种签证,我才知道他叫马克西姆,他的护照上有好多签证,中国的、韩国的、蒙古的、澳大利亚的、新西兰的、俄罗斯的、日本的,还有好多看不懂的。他向我展示比利时护照的防伪技术,确实很棒,护照底页内涵一块电子芯片,马克西姆告诉我他的护照合人民币1000多,我告诉他我的护照只有200人民币,他很喜欢中国的签证,觉得长城背景很漂亮。马克西姆说,他已经在外面旅游两年多了,现在他没钱了,要回比利时工作了,还要参加他最好朋友的婚礼,会有一个很大的party,会有很多啤酒。常年在外,他对很多语言都有所了解,还给我展示了各种语言中数字的读法,但他不懂俄语,我就教他俄语的日常用语。他说了西班牙文、法文的绕口令给我听,我把中文的绕口令“四是四,十是十,十四是十四,四十是四十”说给他听,他听了很兴奋,跟我学了很多次,每次都对中文里面的四个声调叫苦不堪,他用相机录下我说中文绕口令的情景,要带回比利时给朋友们听。他还说了英文绕口令“any noise annoy an oyster, but a noisy noise annoy an oyster more”,我也跟着学了很多遍。离京前,师兄买了好多水果给我,我把这些水果分给马克西姆一些,而他把饼干、斯里兰卡红茶分给我,我们交换着食物,相处得很愉快。
157每到大站,马克西姆都想下去买点东西,在蒙古国想买Mongolian milk,结果买了面包和香肠。列车一进入俄罗斯,他就嚷着要买伏特加尝尝,但各车站只收卢布,所以他在列车上到处兑换卢布。在新西伯利亚(Новосибирск.莫斯科时间10月6日16:00左右),马克西姆终于买了一大瓶俄罗斯啤酒(биво),我们举杯畅饮,那一晚我们都喝醉了,所以说了更多话。我们聊起比利时的巧克力和奶酪,马克希姆很想念家乡的这些食品。他说起两年前在公司的经历,有一个bad boss避开法律解除了他和一些朋友的劳动合同,他很生气,然后就决定旅游。我们说起美国,他非常鄙夷,他问我信仰宗教吗,并愤慨地拿出美元,指责在钞票上印刷“in god we trust”太过分。我说我不信仰宗教,但我信nature,尤其我在外面旅游时,我说“maybe, every traveler must trust in nature”,他非常赞同,并举例说一只小船在大海上,大海随时可以杀了你,这就是大自然的力量。马克希姆喜欢中国、俄罗斯、欧洲,他最常用的是词是crazy,中国的人口crazy,俄罗斯的疆域crazy,埃及的金字塔crazy,他不喜欢美国,认为那是capitalism, just money。批评了美国对伊拉克的战争,并希望中国强大起来与之抗衡,关于社会主义,他认为苏联、中国、古巴有一个好的开端和想法,但后面的发展方向错了,出现了集权,我们都认为互联网会推动社会更加民主,因为人们拥有更多的信息来源,来辨别信息的真伪。马克希姆还批评了电视,认为人们总是坐在电视机前,只会被动地接受电视里的内容,而电视节目总是由政府控制的,所以他希望人们离开电视,出来旅游“眼见为实”。他还讲到2008年奥运会,认为那会是一个巨大的盛会,很多人会来到中国亲眼看到中国所发生的变化。我告诉他,奥运会也带来了中国房价的大幅上涨,我很担心之后的经济危机,但马克希姆认为中国经济增长会放慢速度,逐渐趋于平稳,他用英语和手势表达了这个意思。
158关于电影,我们谈了很多。他说他离开朋友去旅行时,把300多张电影送给了朋友,他的朋友非常happy。我们谈到电影《伯恩的身份》、《天使艾米丽》、《泰坦尼克》、《骇客帝国》、《指环王》、《美丽人生》……他还模仿了《美丽人生》里面的高个子男主角。我们都喜欢南斯拉夫电影《地下》,他告诉我《地下》的导演本身就是音乐制作人,他直叹服电影中的音乐crazy,我也有同感。他提到阿莫多瓦的《关于我妈妈的一切》、《不良教育》,不过我没有看过这两部片子,但我看过阿莫多瓦的《Talk to her》,可马克希姆没有看过。我们还说起南美电影《摩托日记》,于是说起切•格瓦拉,我告诉他几年前切•格瓦拉的传记在中国也很流行。不过马克希姆对俄罗斯电影、中国电影和伊朗电影了解不多,我告诉他前苏联导演梁赞诺夫的电影《办公室的故事》很有趣,中国电影他仅仅知道《少林寺》。我们还共同缅怀了逝去的伯格曼和安东尼奥尼,我说台湾的大导演杨德昌也是刚刚去世。他不喜欢美国商业电影,但也承认美国电影中有些精品……
159最后我有些醉了,马克西姆取笑我,但他也晕菜了,然后他连续睡了20个小时,而我却失眠了。4个小时候后我醒来,在卧席上我辗转反侧,回想着离开北京前的情形,想起爸爸妈妈,想起琳岚,想起妹妹,想起老师、同学和朋友……马克西姆也是个很好的朋友,我们之间似乎有很多相似之处,但他有西方人的爽朗,而我是内敛的东方人,马克西姆说“You can be open-minded”,他说得对,我需要“open-mind”,在莫斯科我更需要。
160</p>
161 </div>
162 </div>
163
164 <div class="f-page">
165 <div class="f-title">
166
167 <h2>从北京到莫斯科</h2>
168
169 </div>
170 <div class="box w-30 h-60 box-b-r title-top">
171 <h3>(九)城市<span>Published May 3, 2012</span></h3>
172 <p>马克西姆安静的时候,我经常翻看地图,查找我们正在经过的城市,熟悉俄罗斯的基本国情。
173俄罗斯幅员辽阔,东西跨度极大,如果全国都使用莫斯科时间,产生的时间差将会很大。莫斯科一般早晨8、9点钟亮天,人们通常到凌晨1、2点钟才睡觉,而贝加尔湖畔凌晨3点多太阳已经照屁股,更东边的太平洋沿岸海港城市海参崴,这里的日出时间肯定比贝加尔湖还要早。乘坐火车横穿西伯利亚可以真切地感受到这种时间变化。据说远东地区有自己的时间,如果这样,与莫斯科交流信息时不知会产生多少麻烦。
174俄罗斯的地势大体东高西低,最西边是东欧平原,向东依次是乌兰尔山、西西伯利亚平原、中西伯利亚高原和东西伯利亚山地。我们熟知的蒙古高原向北可以逐渐过渡到中西伯利亚高原,中国东北的大小兴安岭与俄罗斯的东西伯利亚山地也是一脉相承的。东高西低的地势造就了俄罗斯全国气温大体东低西高的特点,所以贝加尔湖正在下雪,西伯利亚这个时候也出现了零下2度的气温,铁路沿线经常看到积雪,但随着列车逐渐西行,积雪不再有,翻过乌拉尔山,东欧平原秋意盎然。
175K3国际列车实际上沿着俄罗斯的南部边缘行驶,而西西伯利亚平原和中西伯利亚高原的南部边缘属多山地带,植被以针叶林和白桦树为主,所以铁路沿线的白桦林和针叶林延绵不断,几乎未间断过,列车从森林深处驶来,进入城市,离开城市又迅速钻进广袤的森林。一路上,我除了赞叹俄罗斯壮美的自然风光,对俄罗斯丰富的自然资源也羡慕不已。也许是我的错觉,我感觉每隔几分钟、十几分钟都会有俄罗斯的货运列车疾驰而过,列车上装满石油、汽油、煤炭、木材、机械……可见这条铁路的繁忙,货运和客运调度之紧张。事实上,俄罗斯最发达的铁路网在乌拉尔山以西的欧洲部分,广袤的西伯利亚-远东地区只有西伯利亚大铁路和贝(贝加尔湖)阿(阿穆尔河,即黑龙江)铁路。这两条铁路在西伯利亚-远东地区的南部边缘构成一条狭长的运输带,而辽阔的北方几乎再没有什么铁路了,那里主要依靠公路运输、空运和短期的航运(俄罗斯北方河流结冰期较长),而这些运输方式都承担不了大宗的自然资源运输任务,所以西伯利亚-远东地区的自然资源会有相当一部分汇集到贝阿铁路和西伯利亚大铁路附近,再从这里输向东欧平原、中国、太平洋沿岸港口。
176俄罗斯共有88个行政单位,包括各种共和国、边疆区、州、自治州、直辖市、民族自治区,众多行政单位在地图上看起来十分凌乱。但有一点很明显,东欧平原、西伯利亚-远东地区南部的行政区划最为密集,每个行政区的面积也比较小,这实在是因为这些地区人口稠密;而气候寒冷、人口稀少的极地地区,那里的行政单位十分辽阔。行政区划永远都是一种管理人口的手段。国际列车经过的南部地区、东欧平原正是俄罗斯城市化最高的地区,所以铁路沿线的大城市大部分是俄罗斯的能源基地、工业基地、地区经济中心:
177伊尔库茨克(Иркутск,莫斯科时间10月5日11:00左右经过),位于伊尔库特河和安哥拉河交汇处,距贝加尔湖66公里,而贝加尔湖的淡水储量占全俄地表淡水总储量4/5;该市生产的采金船和金刚石开采设备直接供远东地区使用,而远东地区是俄罗斯最大的黄金储备区和金刚石生产区。
178克拉斯诺雅尔斯克(Красноярск,莫斯科时间10月6日凌晨4:00点左右经过),位于叶尼塞河畔,东西伯利亚地区最大的城市,而东西伯利亚地区的木材储量占全俄第一位,且多为优质木材。
179新西伯利亚(Новосибирск,莫斯科时间10月6日16:00左右经过),位于鄂毕河畔,是整个西伯利亚地区最大的城市,西西伯利亚地区的经济中心,而西西伯利亚地区的石油储量占俄罗斯60%以上,天然气储量近90%,俄罗斯最大的煤田库兹巴斯也在该区。
180秋明(Тюмень,莫斯科时间10月7日上午7:00左右经过),位于图拉河畔,属西西伯利亚经济区,附近地区的石油、天然气储量是美国阿拉斯加、德克萨斯、加利福尼亚三大油田的总和。该油田的开发,使俄罗斯赶超美国,成为世界上最大的石油生产国和出口国。
181叶卡捷林堡,现称斯维尔德洛夫斯克(Свердловск,莫斯科时间10月7日上午12:00左右经过),位于乌拉尔山区伊谢季河畔,乌拉尔经济区最大的城市。该区钢铁产量占俄罗斯2/3,原铜产量占俄罗斯90%,是俄罗斯第一大冶金基地。该区一半面积为针叶林覆盖。
182……
183当列车经过这些城市的时候,我总会首先想到这又是一个能源聚集地和工业中心,然后马上就可以看高耸的烟囱、巨大的吊车、粗壮的输油道,在车站又总会看到长长的货运列车,一派繁忙景象。我不禁为这个国家丰富的自然资源、扎实的重工业水平连连感叹,这样的国家,怎能不会重新崛起?又连连咂舌,如此幅员辽阔,俄罗斯还在向北极扩张……我还常常想,坐拥资源,俄罗斯的经济发展模式岂不应该很简单,找个油田、煤田、气田,或者林区,坐下来开采、深加工不就行了?能源依托型的发展模式在乌拉尔、西伯利亚-远东地区到处都可以复制。哪里像中国,不知道有多少城市在为发展模式发愁,谋求产业转型,寄希望于旅游业、服务业等等。中国所承受的各种压力决定了中国要在发展模式上“精耕细作”,而几十年内俄罗斯不需要这样,恐怕这既是它的优势,也是它的劣势。
184仅从铁路两侧看俄罗斯的城市是看不出什么明堂的,待到达莫斯科后,我会用更多的时间仔细观察。不过俄罗斯的很多城市都位于河畔,比如伊尔库茨克、克拉斯诺雅尔斯克、新西伯利亚、秋明、叶卡捷林堡城内都有河流穿过,此外,车里雅宾斯克坐落在米阿斯河畔,伏尔加格勒坐落在伏尔加河畔,奥姆斯克坐落在鄂木河畔,莫斯科城内有莫斯科河,圣彼得堡更是“北方威尼斯”……城市有河,就增添了许多灵气,人们的生活也会多几分浪漫和宁静。火车经过新西伯利亚的时候,我拍了长达20分钟的短片,正值暮色降临,天空布满深蓝色的云,只有太阳落山的地方泛出霞红,仿佛是上帝的眼睛窥视苍生,突然经过铁路桥,桥下流淌着一条明亮的河,倒映着天空的深蓝与绯红,岸边安静地泊着轮船,各种吊车高高耸起,远处似乎还有一座大桥,桥上灯火相连,俨然一串白色珍珠……那种感觉,真是静谧、安详、通透。然后我想起北京,未名湖只是一摊小水,墙外的护城河被水泥包裹着,经常看不见蓝天,苍穹是一片混沌,生活也浑浑噩噩,并貌似繁忙,哎……
185还是应该走出来。
186</p>
187 </div>
188 <div class="box w-70 h-60 box-img-left title-top">
189 <div class="img-cont img-7"></div>
190 <h3>(十)食物<span>Published May 3, 2012</span></h3>
191 <p>大概,列车进入蒙古后就会换上蒙古国的餐车,进入俄罗斯后就会换上俄方的餐车,所以从第二天开始列车上就不再提供免费食物。我自己带了很多食物,约10包方便面、方便馄炖和方便米饭各一包、两大袋切片面包、1大盒蛋黄派、两包饼干、6袋儿牛奶……lan给我买了两大盒德芙巧克力,师兄和好友又买了好多苹果、桔子、香蕉,还有一个大柚子。 列车上我和马克西姆交换着食物,吃得不亦乐乎。马克西姆吃东西静悄悄,我正在低头看书之际,他已经把一碗泡面报销了,而我毫未察觉,出于礼貌,我也静悄悄地吃东西,不再有吃面时的“呲溜呲溜”声音。
192我想,我还是会比较适应西餐的吃法儿,包括俄餐。因为在彼得堡餐厅吃面包和奶酪,我觉得很香,而lan觉得不好吃;在列车上,我吃面包夹香肠,我也觉得津津有味,马克西姆也这么吃。如果我能很快适应这种简单的食物,那么我在莫斯科的一日三餐,至少会有一餐很便宜。我觉得,要适应西餐,应该学着适应食物的原味儿,西餐中很多蔬菜是生吃的,肉类的烹调方法也比较简单,调料种类不多,因此这些食物保留原味的可能性更大。与之相比,中国食物的烹调手段过于丰富,煎、炒、炸、炝、煮、蒸、拌、焖等不胜枚举,还大量使用酱油、味精等人工调料,这固然会增加我们的食物多样性,但也使大部分食物丧失了原味,并且我们还经常把多种菜放在一起混合加工以充实味道,这更使我们难以分辨单种食物的原味。在城市里,人们现在不吃麻、辣就觉得不香、没味儿,这多少说明了城市人味觉系统的逐渐麻木。但凡美食家、大厨师,都要从分辨食物的原味开始,然后才会对混合味道进行评判。
193我觉得,我可能有逐渐喜爱原味食物的趋势。在学校食堂里,我最爱吃的饭菜组合是:米饭,醋熘白菜(或简单的煮白菜)和牛肉片;我最喜欢的牛奶是纯牛奶,咖啡也比较喜欢黑咖啡,各种饮料逐渐不喜欢了,转而喜欢白开水和绿茶。我相信,我的餐饮会逐渐趋于简单,大概我的爱好和性情在逐渐向这个方向变化。
194面包、酸黄瓜、牛肉、香肠、牛奶、鱼罐头、土豆、菜豆、奶酪……我对简单的俄餐生活充满了期待。
195</p>
196 </div>
197 <div class="box w-40 h-40 box-img-left box-b-r title-top">
198 <div class="img-cont img-8"></div>
199 <h3>(十一)期待<span>Published May 3, 2012</span></h3>
200 <p>莫斯科时间10月8日上午,还有几个小时列车就要抵达莫斯科了,六天五夜的旅程即将结束。火车厢内,人心惶惶,隔壁的中国人不断地询问时间,不断埋怨“时间过得真慢”,这些天来,他总来我们包厢“攫取”欢乐,对马克西姆充满好奇,经常要我帮他问马克西姆一些问题,比如“一年挣多少钱”,“怎么还不结婚”。起初马克西姆还经常邀请他一起玩YAHZEE游戏,到了后来,马克西姆朝我挤眉弄眼,要我把门关上,我们两个人悄悄玩YAHZEE。
201我和马克西姆也开始收拾行李。马克西姆把剩下的方便面都给了我,还给我了一些药片,他告诉我在野外没有干净水源时,只需舀起河水,放入这些药片就可以杀死水里的病菌。马克西姆给我推荐了旅行网站www.wikipedia.org,在这个网站上可以找到很多城市的免费旅馆、便宜餐厅以及其他方便旅行的信息,他就是利用这个网站开始全球旅行的,我们也交换了email,他邀请我去比利时玩,我答应他几年后肯定会在比利时找到他。 (wikipedia不就是维基百科么。。。怎么会有免费旅馆之类的信息。。。想不通——Jinwei注)
202我整理了我的东西,证件、笔记本、美元都在,箱子里的东西也都不少,但我的经验告诉我,下车的时候有可能会发生些事,但愿什么都不要发生,想到这里,我不由得增加了警觉。但愿有同学在车站接我,但如果同学不能准时到车站呢?幸好昨晚我在乘务员那里换了100卢布,如果在车站我见不到同学,那我就自己去找метро(地铁),然后到университет(大学)站下车,据说下车就是莫斯科大学。
203和马克西姆又说了些话,他说他们全家都是旅游爱好者,他有两个sister,祖母已经80多岁了,结果我听成他母亲80多岁,我们哈哈大笑,他父亲和他一样都是漫画迷。东西收拾完毕,我开始望着窗外的俄罗斯村庄,一座座小木屋从眼前掠过,屋顶很高很大,多是三角形,或者是匀称的五边形,想必屋顶就是阁楼,不知是储藏食物的,还是住着美丽的俄罗斯小女孩。几乎每家农户都有一个菜园,用整齐的木板围成栅栏,菜园里又会有一两个简陋矮屋,大概是仓房。人们并没有把居住区的桦树、松树都砍掉,“夷为平地”似乎不是俄罗斯居民的生活习惯,木屋总是散布在林间,远远望去,村庄常常藏在树林后面,挂满金黄的白桦林又总是让村庄露出一些马脚。不过我有些好奇,这些木屋该怎样取暖呢?又该怎样防火?我想起,初中学俄语的时候,课文里最常出现的描写居住环境的单词就是село(村庄),река(河),лес(森林),береза(白桦树),город(城市),деревня(农村)……正是这些词以及对这些词的想象形成了我对俄罗斯的想象,并逐渐沉淀、凝结为我的俄罗斯情结,这种情结不但没有因为六天来的旅行而消散,反而变得更深更切,我的想象也更加热烈,也许,这就是期待吧。
204我开始看见很多房屋和更茂密的白桦林……开始看见停在铁路上的货运列车和客运列车……开始看见修剪整齐的草坪……开始看见楼房……开始看见墙上涂抹的镰刀斧头……开始看见立交桥和路边广告牌……我感觉到车速变慢了……
205马克西姆拿出比利时国旗,手舞足蹈地唱起被他称为“shit”的比利时国歌。
206列车缓缓停下了,乘务员高声说“莫斯科到了”……莫斯科到了,我说不清自己的心情。
207马克西姆帮我提一个箱子下车,一个刚上车的中国胖子对乘务员说:“这是3000多卢布,在国内肯定能换1000多人民币”,乘务员说:“有什么需求再给我打电话”,然后胖子搬走了很多食品,那些食品就放在没有旅客的包厢里。
208莫斯科好像刚下过雨,站台上湿漉漉的,我跟马克西姆握手告别,see you in Belgium!然后马克西姆背起双肩包,消失在行色匆匆的人群中。
209我在站台上没有看到同学,有些失望,正打算拖着两个箱子自己走,忽见前方一个瘦高男子迎面走来,撑着伞,头略低,手里拿着一张硬纸,上面写着汉字“莫大”,我急忙迎上去。“Здравствуйте(你好)”!“你是北京来的”?“Да(是的)”!“是研究生吗”?“yeah,аспирант(研究生)”,“一路辛苦哩”……我的语言系统又乱了,而这个俄罗斯人的汉语讲得真地道!
210“我们坐地铁去莫大吧”!
211“太好了”!
212出火车站无需任何检查,这出乎我的意料。俄罗斯大个子告诉我,“前面不远处的高大建筑就是地铁”,我知道这肯定是комсомольская(共青团)站。
213我跟着大个子径直向传说中的莫斯科地铁走去。
214[email protected]
215莫斯科时间10月21日 (完)
216</p>
217 </div>
218 <div class="box w-30 h-40 box-b-r title-top">
219 <h3>(十二)Ich Lieb Dich Immer Noch So Sehr <span>Published May 3, 2012</span></h3>
220 <p>我仍然如此爱你
221你将自己锁进我心里
222悄悄地在我心里越走越深
223我失去对自己意志的控制
224只有你控制着我的感觉
225你将我们连在了一起
226许诺过永远不离开我
227你点燃了我的热情
228却让我独自燃烧
229我仍然如此爱你
230仍然如此深爱你
231你的眼神诱惑了我,让我们的灵魂彼此触摸
232我仍然如此爱你
233我泪流满面,心中空白,
234因为没有你,一切都没有意义
235
236围着你我狂奔十万英里
237我们所不能分担的痛楚让我双倍疼痛
238在每一条路上我寻找着你
239你将永在我心
240你是倾盆大雨
241我因你而哭泣
242
243我仍然如此爱你
244仍然如此深爱你
245你的眼神诱惑了我,让我们的灵魂彼此触摸
246我仍然如此爱你
247我泪流满面,心中空白,
248因为没有你,一切都没有意义
249你是一场暴雨
250我因你而哭泣
251我仍然如此爱你
252仍然如此深爱你
253你的眼神诱惑了我,让我们的灵魂彼此触摸
254
255我仍然如此爱你
256我泪流满面,心中空白
257因为没有你,一切都没有意义
258我的每个细胞
259都爱着你的每个细胞
260别人代替了我你会很难过吗</p>
261 </div>
262 <div class="box w-30 h-40 title-top">
263 <h3>L&R <span>Published May 3, 2012</span></h3>
264 <p>”I can’t see anything”</p>
265 <p> “No,you can.Just try” </p>
266 <p>“I ‘m so scared”</p>
267 <p> “I ‘m here” </p>
268 <p>“What if……”</p>
269 <p> “I won’t leave”</p>
270 <p> “Really?” </p>
271 <p>“I just said it”</p>
272 <p> “But……” </p>
273 <p>“But what?”</p>
274 <p> “Thank you.”</p>
275 </div>
276 </div>
277
278 <div class="f-page f-cover-back">
279 <div id="codrops-ad-wrapper">
280
281 </div>
282 </div>
283 </div>
284
285 <script type="text/javascript" src="http://ajax.googleapis.com/ajax/libs/jquery/1.7.2/jquery.min.js"></script>
286 <script type="text/javascript">
287
288 var $container = $( '#flip' ),
289 $pages = $container.children().hide();
290
291 Modernizr.load({
292 test: Modernizr.csstransforms3d && Modernizr.csstransitions,
293 yep : ['js/jquery.tmpl.min.js','js/jquery.history.js','js/core.string.js','js/jquery.touchSwipe-1.2.5.js','js/jquery.flips.js'],
294 nope: 'css/fallback.css',
295 callback : function( url, result, key ) {
296
297 if( url === 'css/fallback.css' ) {
298 $pages.show();
299 }
300 else if( url === 'js/jquery.flips.js' ) {
301 $container.flips();
302 }
303
304 }
305 });
306
307 </script>
308
309<!-- jinwei.me Baidu tongji analytics -->
310<script type="text/javascript">
311var _bdhmProtocol = (("https:" == document.location.protocol) ? " https://" : " http://");
312document.write(unescape("%3Cscript src='" + _bdhmProtocol + "hm.baidu.com/h.js%3F91918ac6d6854623883a2b546ebc00ac' type='text/javascript'%3E%3C/script%3E"));
313</script>
314
315</body>
316</html> \ No newline at end of file
diff --git a/Blocks/Flipboard/js/core.string.js b/Blocks/Flipboard/js/core.string.js
new file mode 100644
index 0000000..312a42e
--- /dev/null
+++ b/Blocks/Flipboard/js/core.string.js
@@ -0,0 +1,240 @@
1/**
2 * @depends nothing
3 * @name core.string
4 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
5 */
6
7/**
8 * Return a new string with any spaces trimmed the left and right of the string
9 * @version 1.0.0
10 * @date June 30, 2010
11 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
12 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
13 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
14 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
15 */
16String.prototype.trim = String.prototype.trim || function() {
17 // Trim off any whitespace from the front and back
18 return this.replace(/^\s+|\s+$/g, '');
19};
20
21/**
22 * Return a new string with the value stripped from the left and right of the string
23 * @version 1.1.1
24 * @date July 22, 2010
25 * @since 1.0.0, June 30, 2010
26 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
27 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
28 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
29 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
30 */
31String.prototype.strip = String.prototype.strip || function(value,regex){
32 // Strip a value from left and right, with optional regex support (defaults to false)
33 value = String(value);
34 var str = this;
35 if ( value.length ) {
36 if ( !(regex||false) ) {
37 // We must escape value as we do not want regex support
38 value = value.replace(/([\[\]\(\)\^\$\.\?\|\/\\])/g, '\\$1');
39 }
40 str = str.replace(eval('/^'+value+'+|'+value+'+$/g'), '');
41 }
42 return String(str);
43}
44
45/**
46 * Return a new string with the value stripped from the left of the string
47 * @version 1.1.1
48 * @date July 22, 2010
49 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
50 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
51 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
52 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
53 */
54String.prototype.stripLeft = String.prototype.stripLeft || function(value,regex){
55 // Strip a value from the left, with optional regex support (defaults to false)
56 value = String(value);
57 var str = this;
58 if ( value.length ) {
59 if ( !(regex||false) ) {
60 // We must escape value as we do not want regex support
61 value = value.replace(/([\[\]\(\)\^\$\.\?\|\/\\])/g, '\\$1');
62 }
63 str = str.replace(eval('/^'+value+'+/g'), '');
64 }
65 return String(str);
66}
67
68/**
69 * Return a new string with the value stripped from the right of the string
70 * @version 1.1.1
71 * @date July 22, 2010
72 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
73 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
74 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
75 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
76 */
77String.prototype.stripRight = String.prototype.stripRight || function(value,regex){
78 // Strip a value from the right, with optional regex support (defaults to false)
79 value = String(value);
80 var str = this;
81 if ( value.length ) {
82 if ( !(regex||false) ) {
83 // We must escape value as we do not want regex support
84 value = value.replace(/([\[\]\(\)\^\$\.\?\|\/\\])/g, '\\$1');
85 }
86 str = str.replace(eval('/'+value+'+$/g'), '');
87 }
88 return String(str);
89}
90
91/**
92 * Return a int of the string
93 * @version 1.0.0
94 * @date June 30, 2010
95 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
96 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
97 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
98 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
99 */
100String.prototype.toInt = String.prototype.toInt || function(){
101 // Convert to a Integer
102 return parseInt(this,10);
103};
104
105/**
106 * Return a new string of the old string wrapped with the start and end values
107 * @version 1.0.0
108 * @date June 30, 2010
109 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
110 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
111 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
112 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
113 */
114String.prototype.wrap = String.prototype.wrap || function(start,end){
115 // Wrap the string
116 return start+this+end;
117};
118
119/**
120 * Return a new string of a selection of the old string wrapped with the start and end values
121 * @version 1.0.0
122 * @date June 30, 2010
123 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
124 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
125 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
126 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
127 */
128String.prototype.wrapSelection = String.prototype.wrapSelection || function(start,end,a,z){
129 // Wrap the selection
130 if ( typeof a === 'undefined' || a === null ) a = this.length;
131 if ( typeof z === 'undefined' || z === null ) z = this.length;
132 return this.substring(0,a)+start+this.substring(a,z)+end+this.substring(z);
133};
134
135/**
136 * Return a new string of the slug of the old string
137 * @version 1.1.0
138 * @date July 16, 2010
139 * @since 1.0.0, June 30, 2010
140 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
141 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
142 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
143 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
144 */
145String.prototype.toSlug = String.prototype.toSlug || function(){
146 // Convert a string to a slug
147 return this.toLowerCase().replace(/[\s_]/g, '-').replace(/[^-a-z0-9]/g, '').replace(/--+/g, '-').replace(/^-+|-+$/g,'');
148}
149
150/**
151 * Return a new JSON object of the old string.
152 * Turns:
153 * file.js?a=1&amp;b.c=3.0&b.d=four&a_false_value=false&a_null_value=null
154 * Into:
155 * {"a":1,"b":{"c":3,"d":"four"},"a_false_value":false,"a_null_value":null}
156 * @version 1.1.0
157 * @date July 16, 2010
158 * @since 1.0.0, June 30, 2010
159 * @package jquery-sparkle {@link http://www.balupton/projects/jquery-sparkle}
160 * @author Benjamin "balupton" Lupton {@link http://www.balupton.com}
161 * @copyright (c) 2009-2010 Benjamin Arthur Lupton {@link http://www.balupton.com}
162 * @license GNU Affero General Public License version 3 {@link http://www.gnu.org/licenses/agpl-3.0.html}
163 */
164String.prototype.queryStringToJSON = String.prototype.queryStringToJSON || function ( )
165{ // Turns a params string or url into an array of params
166 // Prepare
167 var params = String(this);
168 // Remove url if need be
169 params = params.substring(params.indexOf('?')+1);
170 // params = params.substring(params.indexOf('#')+1);
171 // Change + to %20, the %20 is fixed up later with the decode
172 params = params.replace(/\+/g, '%20');
173 // Do we have JSON string
174 if ( params.substring(0,1) === '{' && params.substring(params.length-1) === '}' )
175 { // We have a JSON string
176 return eval(decodeURIComponent(params));
177 }
178 // We have a params string
179 params = params.split(/\&(amp\;)?/);
180 var json = {};
181 // We have params
182 for ( var i = 0, n = params.length; i < n; ++i )
183 {
184 // Adjust
185 var param = params[i] || null;
186 if ( param === null ) { continue; }
187 param = param.split('=');
188 if ( param === null ) { continue; }
189 // ^ We now have "var=blah" into ["var","blah"]
190
191 // Get
192 var key = param[0] || null;
193 if ( key === null ) { continue; }
194 if ( typeof param[1] === 'undefined' ) { continue; }
195 var value = param[1];
196 // ^ We now have the parts
197
198 // Fix
199 key = decodeURIComponent(key);
200 value = decodeURIComponent(value);
201 try {
202 // value can be converted
203 value = eval(value);
204 } catch ( e ) {
205 // value is a normal string
206 }
207
208 // Set
209 // window.console.log({'key':key,'value':value}, split);
210 var keys = key.split('.');
211 if ( keys.length === 1 )
212 { // Simple
213 json[key] = value;
214 }
215 else
216 { // Advanced (Recreating an object)
217 var path = '',
218 cmd = '';
219 // Ensure Path Exists
220 $.each(keys,function(ii,key){
221 path += '["'+key.replace(/"/g,'\\"')+'"]';
222 jsonCLOSUREGLOBAL = json; // we have made this a global as closure compiler struggles with evals
223 cmd = 'if ( typeof jsonCLOSUREGLOBAL'+path+' === "undefined" ) jsonCLOSUREGLOBAL'+path+' = {}';
224 eval(cmd);
225 json = jsonCLOSUREGLOBAL;
226 delete jsonCLOSUREGLOBAL;
227 });
228 // Apply Value
229 jsonCLOSUREGLOBAL = json; // we have made this a global as closure compiler struggles with evals
230 valueCLOSUREGLOBAL = value; // we have made this a global as closure compiler struggles with evals
231 cmd = 'jsonCLOSUREGLOBAL'+path+' = valueCLOSUREGLOBAL';
232 eval(cmd);
233 json = jsonCLOSUREGLOBAL;
234 delete jsonCLOSUREGLOBAL;
235 delete valueCLOSUREGLOBAL;
236 }
237 // ^ We now have the parts added to your JSON object
238 }
239 return json;
240}; \ No newline at end of file
diff --git a/Blocks/Flipboard/js/jquery.flips.js b/Blocks/Flipboard/js/jquery.flips.js
new file mode 100644
index 0000000..5c25d87
--- /dev/null
+++ b/Blocks/Flipboard/js/jquery.flips.js
@@ -0,0 +1,965 @@
1/**
2 * jquery.flips.js
3 *
4 * Copyright 2011, Pedro Botelho / Codrops
5 * Free to use under the MIT license.
6 *
7 * Date: Fri May 4 2012
8 */
9
10/**
11 * Note: This is highly experimental and just a proof-of-concept!
12 * There are some few "hacks", probably some bugs, and some functionality
13 * is incomplete... definitely not ready for a production environment.
14 *
15 *
16 * Tested and working on:
17 * - Google Chrome 18.0.1025.168
18 * - Apple Safari 5.1.5
19 * - Apple Safari 5.1 Mobile
20 *
21 */
22
23(function( window, undefined ) {
24
25 $.Flips = function( options, element ) {
26
27 this.$el = $( element );
28 this._init( options );
29
30 };
31
32 $.Flips.defaults = {
33 flipspeed : 900,
34 fliptimingfunction : 'linear',
35 current : 0
36 };
37
38 $.Flips.prototype = {
39 _init : function( options ) {
40
41 this.options = $.extend( true, {}, $.Flips.defaults, options );
42 this.$pages = this.$el.children( 'div.f-page' );
43 this.pagesCount = this.$pages.length;
44 this.History = window.History;
45 this.currentPage = this.options.current;
46 this._validateOpts();
47 this._getWinSize();
48 this._getState();
49 this._layout();
50 this._initTouchSwipe();
51 this._loadEvents();
52 this._goto();
53
54 },
55 _validateOpts : function() {
56
57 if( this.currentPage < 0 || this.currentPage > this.pagesCount ) {
58
59 this.currentPage = 0;
60
61 }
62
63 },
64 _getWinSize : function() {
65
66 var $win = $( window );
67
68 this.windowProp = {
69 width : $win.width(),
70 height : $win.height()
71 };
72
73 },
74 _goto : function() {
75
76 var page = ( this.state === undefined ) ? this.currentPage : this.state;
77
78 if( !this._isNumber( page ) || page < 0 || page > this.flipPagesCount ) {
79
80 page = 0;
81
82 }
83
84 this.currentPage = page;
85
86 },
87 _getState : function() {
88
89 this.state = this.History.getState().url.queryStringToJSON().page;
90
91 },
92 _isNumber : function( n ) {
93
94 return parseFloat( n ) == parseInt( n ) && !isNaN( n ) && isFinite( n );
95
96 },
97 _adjustLayout : function( page ) {
98
99 var _self = this;
100
101 this.$flipPages.each( function( i ) {
102
103 var $page = $(this);
104
105 if( i === page - 1 ) {
106
107 $page.css({
108 '-webkit-transform' : 'rotateY( -180deg )',
109 '-moz-transform' : 'rotateY( -180deg )',
110 'z-index' : _self.flipPagesCount - 1 + i
111 });
112
113 }
114 else if( i < page ) {
115
116 $page.css({
117 '-webkit-transform' : 'rotateY( -181deg )', // todo: fix this (should be -180deg)
118 '-moz-transform' : 'rotateY( -181deg )', // todo: fix this (should be -180deg)
119 'z-index' : _self.flipPagesCount - 1 + i
120 });
121
122 }
123 else {
124
125 $page.css({
126 '-webkit-transform' : 'rotateY( 0deg )',
127 '-moz-transform' : 'rotateY( 0deg )',
128 'z-index' : _self.flipPagesCount - 1 - i
129 });
130
131 }
132
133 } );
134
135 },
136 _saveState : function() {
137
138 // adds a new state to the history object and triggers the statechange event on the window
139 var page = this.currentPage;
140
141 if( this.History.getState().url.queryStringToJSON().page !== page ) {
142
143 this.History.pushState( null, null, '?page=' + page );
144
145 }
146
147 },
148 _layout : function() {
149
150 this._setLayoutSize();
151
152 for( var i = 0; i <= this.pagesCount - 2; ++i ) {
153
154 var $page = this.$pages.eq( i ),
155 pageData = {
156 theClass : 'page',
157 theContentFront : $page.html(),
158 theContentBack : ( i !== this.pagesCount ) ? this.$pages.eq( i + 1 ).html() : '',
159 theStyle : 'z-index: ' + ( this.pagesCount - i ) + ';left: ' + ( this.windowProp.width / 2 ) + 'px;',
160 theContentStyleFront : 'width:' + this.windowProp.width + 'px;',
161 theContentStyleBack : 'width:' + this.windowProp.width + 'px;'
162 };
163
164 if( i === 0 ) {
165
166 pageData.theClass += ' cover';
167
168 }
169 else {
170
171 pageData.theContentStyleFront += 'left:-' + ( this.windowProp.width / 2 ) + 'px';
172
173 if( i === this.pagesCount - 2 ) {
174
175 pageData.theClass += ' cover-back';
176
177 }
178
179 }
180
181 $( '#pageTmpl' ).tmpl( pageData ).appendTo( this.$el );
182
183 }
184
185 this.$pages.remove();
186 this.$flipPages = this.$el.children( 'div.page' );
187 this.flipPagesCount = this.$flipPages.length;
188
189 this._adjustLayout( ( this.state === undefined ) ? this.currentPage : this.state );
190
191 },
192 _setLayoutSize : function() {
193
194 this.$el.css( {
195 width : this.windowProp.width,
196 height : this.windowProp.height
197 } );
198
199 },
200 _initTouchSwipe : function() {
201
202 var _self = this;
203
204 this.$el.swipe( {
205 threshold : 0,
206 swipeStatus : function( event, phase, start, end, direction, distance ) {
207
208 var startX = start.x,
209 endX = end.x,
210 sym, angle,
211 oob = false,
212 noflip = false;
213
214 // check the "page direction" to flip:
215 // if the page flips from the right to the left (right side page)
216 // or from the left to the right (left side page).
217 // check only if not animating
218 if( !_self._isAnimating() ) {
219
220 ( startX < _self.windowProp.width / 2 ) ? _self.flipSide = 'l2r' : _self.flipSide = 'r2l';
221
222 }
223
224 if( direction === 'up' || direction === 'down' ) {
225
226 if( _self.angle === undefined || _self.angle === 0 ) {
227
228 _self._removeOverlays();
229 return false;
230
231 }
232 else {
233
234 ( _self.angle < 90 ) ? direction = 'right' : direction = 'left';
235
236 }
237
238 };
239
240 _self.flipDirection = direction;
241
242 // on the first & last page neighbors we don't flip
243 if( _self.currentPage === 0 && _self.flipSide === 'l2r' || _self.currentPage === _self.flipPagesCount && _self.flipSide === 'r2l' ) {
244
245 return false;
246
247 }
248
249 // save ending point (symetric point):
250 // if we touch / start dragging on, say [x=10], then
251 // we need to drag until [window's width - 10] in order to flip the page 100%.
252 // if the symetric point is too close we are giving some margin:
253 // if we would start dragging right next to [window's width / 2] then
254 // the symmetric point would be very close to the starting point. A very short swipe
255 // would be enough to flip the page..
256 sym = _self.windowProp.width - startX;
257
258 var symMargin = 0.9 * ( _self.windowProp.width / 2 );
259 if( Math.abs( startX - sym ) < symMargin ) {
260
261 ( _self.flipSide === 'r2l' ) ? sym -= symMargin / 2 : sym += symMargin / 2;
262
263 }
264
265 // some special cases:
266 // Page is on the right side,
267 // and we drag/swipe to the same direction
268 // ending on a point > than the starting point
269 // -----------------------
270 // | | |
271 // | | |
272 // | sym | s |
273 // | | e |
274 // | | |
275 // -----------------------
276 if( endX > startX && _self.flipSide === 'r2l' ) {
277
278 angle = 0;
279 oob = true;
280 noflip = true;
281
282 }
283 // Page is on the right side,
284 // and we drag/swipe to the opposite direction
285 // ending on a point < than the symmetric point
286 // -----------------------
287 // | | |
288 // | | |
289 // | sym | s |
290 // | e | |
291 // | | |
292 // -----------------------
293 else if( endX < sym && _self.flipSide === 'r2l' ) {
294
295 angle = 180;
296 oob = true;
297
298 }
299 // Page is on the left side,
300 // and we drag/swipe to the opposite direction
301 // ending on a point > than the symmetric point
302 // -----------------------
303 // | | |
304 // | | |
305 // | s | sym |
306 // | | e |
307 // | | |
308 // -----------------------
309 else if( endX > sym && _self.flipSide === 'l2r' ) {
310
311 angle = 0;
312 oob = true;
313
314 }
315 // Page is on the left side,
316 // and we drag/swipe to the same direction
317 // ending on a point < than the starting point
318 // -----------------------
319 // | | |
320 // | | |
321 // | s | sym |
322 // | e | |
323 // | | |
324 // -----------------------
325 else if( endX < startX && _self.flipSide === 'l2r' ) {
326
327 angle = 180;
328 oob = true;
329 noflip = true;
330
331 }
332 // we drag/swipe to a point between
333 // the starting point and symetric point
334 // -----------------------
335 // | | |
336 // | s | sym |
337 // | sym | s |
338 // | e| |
339 // | | |
340 // -----------------------
341 else {
342
343 var s, e, val;
344
345 ( _self.flipSide === 'r2l' ) ?
346 ( s = startX, e = sym, val = startX - distance ) :
347 ( s = sym, e = startX , val = startX + distance );
348
349 angle = _self._calcAngle( val, s, e );
350
351 if( ( direction === 'left' && _self.flipSide === 'l2r' ) || ( direction === 'right' && _self.flipSide === 'r2l' ) ) {
352
353 noflip = true;
354
355 }
356
357 }
358
359 switch( phase ) {
360
361 case 'start' :
362
363 if( _self._isAnimating() ) {
364
365 // the user can still grab a page while one is flipping (in this case not being able to move)
366 // and once the page is flipped the move/touchmove events are triggered..
367 _self.start = true;
368 return false;
369
370 }
371 else {
372
373 _self.start = false;
374
375 }
376
377 // check which page is clicked/touched
378 _self._setFlippingPage();
379
380 // check which page comes before & after the one we are clicking
381 _self.$beforePage = _self.$flippingPage.prev();
382 _self.$afterPage = _self.$flippingPage.next();
383
384 break;
385
386 case 'move' :
387
388 if( distance > 0 ) {
389
390 if( _self._isAnimating() || _self.start ) {
391
392 return false;
393
394 }
395
396 // adds overlays: shows shadows while flipping
397 if( !_self.hasOverlays ) {
398
399 _self._addOverlays();
400
401 }
402
403 // save last angle
404 _self.angle = angle;
405 // we will update the rotation value of the page while we move it
406 _self._turnPage( angle , true );
407
408 }
409 break;
410
411 case 'end' :
412
413 if( distance > 0 ) {
414
415 if( _self._isAnimating() || _self.start ) return false;
416
417 _self.isAnimating = true;
418
419 // keep track if the page was actually flipped or not
420 // the data flip will be used later on the transitionend event
421 ( noflip ) ? _self.$flippingPage.data( 'flip', false ) : _self.$flippingPage.data( 'flip', true );
422
423 // if out of bounds we will "manually" flip the page,
424 // meaning there will be no transition set
425 if( oob ) {
426
427 if( !noflip ) {
428
429 // the page gets flipped (user dragged from the starting point until the symmetric point)
430 // update current page
431 _self._updatePage();
432
433 }
434
435 _self._onEndFlip( _self.$flippingPage );
436
437 }
438 else {
439
440 // save last angle
441 _self.angle = angle;
442 // calculate the speed to flip the page:
443 // the speed will depend on the current angle.
444 _self._calculateSpeed();
445
446 switch( direction ) {
447
448 case 'left' :
449
450 _self._turnPage( 180 );
451
452 if( _self.flipSide === 'r2l' ) {
453
454 _self._updatePage();
455
456 }
457
458 break;
459
460 case 'right' :
461
462 _self._turnPage( 0 );
463
464 if( _self.flipSide === 'l2r' ) {
465
466 _self._updatePage();
467
468 }
469
470 break;
471
472 };
473
474 }
475
476 }
477
478 break;
479
480 };
481
482 }
483
484 } );
485
486 },
487 _setFlippingPage : function() {
488
489 var _self = this;
490
491 ( this.flipSide === 'l2r' ) ?
492 this.$flippingPage = this.$flipPages.eq( this.currentPage - 1 ) :
493 this.$flippingPage = this.$flipPages.eq( this.currentPage );
494
495 this.$flippingPage.on( 'webkitTransitionEnd.flips transitionend.flips OTransitionEnd.flips', function( event ) {
496
497 if( $( event.target ).hasClass( 'page' ) ) {
498
499 _self._onEndFlip( $(this) );
500
501 }
502
503 });
504
505 },
506 _updatePage : function() {
507
508 if( this.flipSide === 'r2l' ) {
509
510 ++this.currentPage;
511
512 }
513 else if( this.flipSide === 'l2r' ) {
514
515 --this.currentPage;
516
517 }
518
519 },
520 _isAnimating : function() {
521
522 if( this.isAnimating ) {
523
524 return true;
525
526 }
527
528 return false;
529
530 },
531 _loadEvents : function() {
532
533 var _self = this;
534
535 $( window ).on( 'resize.flips', function( event ) {
536
537 _self._getWinSize();
538 _self._setLayoutSize();
539
540 var $contentFront = _self.$flipPages.children( 'div.front' ).find( 'div.content' ),
541 $contentBack = _self.$flipPages.children( 'div.back' ).find( 'div.content' )
542
543 _self.$flipPages.css( 'left', _self.windowProp.width / 2 );
544
545 $contentFront.filter( function( i ) {
546 return i > 0;
547 }).css( {
548 width : _self.windowProp.width,
549 left : -_self.windowProp.width / 2
550 } );
551 $contentFront.eq( 0 ).css( 'width', _self.windowProp.width );
552
553 $contentBack.css( 'width', _self.windowProp.width );
554
555 } );
556
557 $( window ).on( 'statechange.flips', function( event ) {
558
559 _self._getState();
560 _self._goto();
561 if( !_self.isAnimating ) {
562
563 _self._adjustLayout( _self.currentPage );
564
565 }
566
567 } );
568
569 this.$flipPages.find( '.box' ).on( 'click.flips', function( event ) {
570
571 var $box = $(this),
572 $boxClose = $( '<span class="box-close">close</span>' ),
573 transitionProp = {
574 speed : 450,
575 timingfunction : 'linear'
576 },
577 $overlay = $( '<div class="overlay">close</div>' ).css( {
578 'z-index' : 9998,
579 '-webkit-transition' : 'opacity ' + transitionProp.speed + 'ms ' + transitionProp.timingfunction,
580 '-moz-transition' : 'opacity ' + transitionProp.speed + 'ms ' + transitionProp.timingfunction
581 } ).prependTo( $( 'body' ) ),
582 prop = {
583 width : $box.outerWidth(true),
584 height : $box.outerHeight(true),
585 left : $box.offset().left,
586 top : $box.offset().top
587 },
588 $placeholder = $box.clone().css( {
589 'position' : 'absolute',
590 'width' : prop.width,
591 'height' : prop.height,
592 'left' : prop.left,
593 'top' : prop.top,
594 'zIndex' : 9999,
595 'overflow-y' : 'auto',
596 '-webkit-transition': 'all ' + transitionProp.speed + 'ms ' + transitionProp.timingfunction,
597 '-moz-transition': 'all ' + transitionProp.speed + 'ms ' + transitionProp.timingfunction
598 } )
599 .insertAfter( $overlay )
600 .end()
601 .append( $boxClose.on( 'click.flips', function( event ) {
602
603 $overlay.css( 'opacity', 0 );
604
605 $placeholder.children().hide().end().removeClass( 'box-expanded' ).css( {
606 width : _self.windowProp.width,
607 height : _self.windowProp.height,
608 'overflow-y' : 'hidden'
609 } );
610
611 setTimeout( function() {
612 $placeholder.css( {
613 left : prop.left,
614 top : prop.top,
615 width : prop.width,
616 height : prop.height,
617 '-webkit-transition' : 'all ' + transitionProp.speed + 'ms ' + transitionProp.timingfunction,
618 '-moz-transition' : 'all ' + transitionProp.speed + 'ms ' + transitionProp.timingfunction
619 });
620 }, 0 );
621
622 }) )
623 .children()
624 .hide()
625 .end()
626 .on( 'webkitTransitionEnd.flips transitionend.flips OTransitionEnd.flips', function( event ) {
627
628 if( $( event.target ).hasClass( 'box-expanded' ) ) { // expanding
629
630 $(this).css( {
631 width : '100%',
632 height : '100%',
633 '-webkit-transition' : 'none',
634 '-moz-transition' : 'none'
635 } ).children().fadeIn();
636
637 }
638 else { // collapsing
639
640 $overlay.remove();
641 $(this).remove();
642
643 }
644
645 });
646
647 setTimeout( function() {
648
649 $overlay.css( {
650 opacity : 1
651 } );
652
653 $placeholder.addClass( 'box-expanded' ).css( {
654 left : 0,
655 top : 0,
656 width : _self.windowProp.width,
657 height : _self.windowProp.height
658 });
659
660 }, 0 );
661
662 } );
663
664 },
665 _onEndFlip : function( $page ) {
666
667 // if the page flips from left to right we will need to change the z-index of the flipped page
668 if( ( this.flipSide === 'l2r' && $page.data( 'flip' ) ) ||
669 ( this.flipSide === 'r2l' && !$page.data( 'flip' ) ) ) {
670
671 $page.css( 'z-index', this.pagesCount - 2 - $page.index() );
672
673 }
674
675 this.$flippingPage.css( {
676 '-webkit-transition' : 'none',
677 '-moz-transition' : 'none'
678 } );
679
680 // remove overlays
681 this._removeOverlays();
682 this._saveState();
683 this.isAnimating = false;
684
685 // hack (todo: issues with safari / z-indexes)
686 if( this.flipSide === 'r2l' || ( this.flipSide === 'l2r' && !$page.data( 'flip' ) ) ) {
687
688 this.$flippingPage.find('.back').css( '-webkit-transform', 'rotateY(-180deg)' );
689
690 }
691
692 },
693 // given the touch/drag start point (s), the end point (e) and a value in between (x)
694 // calculate the respective angle ( 0deg - 180deg )
695 _calcAngle : function( x, s, e ) {
696
697 return ( -180 / ( s - e ) ) * x + ( ( s * 180 ) / ( s - e ) );
698
699 },
700 // given the current angle and the default speed, calculate the respective speed to accomplish the flip
701 _calculateSpeed : function() {
702
703 ( this.flipDirection === 'right' ) ?
704 this.flipSpeed = ( this.options.flipspeed / 180 ) * this.angle :
705 this.flipSpeed = - ( this.options.flipspeed / 180 ) * this.angle + this.options.flipspeed;
706
707 },
708 _turnPage : function( angle, update ) {
709
710 // hack / todo: before page that was set to -181deg should have -180deg
711 this.$beforePage.css({
712 '-webkit-transform' : 'rotateY( -180deg )',
713 '-moz-transform' : 'rotateY( -180deg )'
714 });
715
716 // if not moving manually set a transition to flip the page
717 if( !update ) {
718
719 this.$flippingPage.css( {
720 '-webkit-transition' : '-webkit-transform ' + this.flipSpeed + 'ms ' + this.options.fliptimingfunction,
721 '-moz-transition' : '-moz-transform ' + this.flipSpeed + 'ms ' + this.options.fliptimingfunction
722 } );
723
724 }
725
726 // if page is a right side page, we need to set its z-index higher as soon the page starts to flip.
727 // this will make the page be on "top" of the left ones.
728 // note: if the flipping page is on the left side then we set the z-index after the flip is over.
729 // this is done on the _onEndFlip function.
730 var idx = ( this.flipSide === 'r2l' ) ? this.currentPage : this.currentPage - 1;
731 if( this.flipSide === 'r2l' ) {
732
733 this.$flippingPage.css( 'z-index', this.flipPagesCount - 1 + idx );
734
735 }
736
737 // hack (todo: issues with safari / z-indexes)
738 this.$flippingPage.find('.back').css( '-webkit-transform', 'rotateY(180deg)' );
739
740 // update the angle
741 this.$flippingPage.css( {
742 '-webkit-transform' : 'rotateY(-' + angle + 'deg)',
743 '-moz-transform' : 'rotateY(-' + angle + 'deg)'
744 } );
745
746 // show overlays
747 this._overlay( angle, update );
748
749 },
750 _addOverlays : function() {
751
752 var _self = this;
753
754 // remove current overlays
755 this._removeOverlays();
756
757 this.hasOverlays = true;
758
759 // overlays for the flipping page. One in the front, one in the back.
760
761 this.$frontoverlay = $( '<div class="flipoverlay"></div>' ).appendTo( this.$flippingPage.find( 'div.front > .outer' ) );
762 this.$backoverlay = $( '<div class="flipoverlay"></div>' ).appendTo( this.$flippingPage.find( 'div.back > .outer' ) )
763
764 // overlay for the page "under" the flipping page.
765 if( this.$afterPage ) {
766
767 this.$afterOverlay = $( '<div class="overlay"></div>' ).appendTo( this.$afterPage.find( 'div.front > .outer' ) );
768
769 }
770
771 // overlay for the page "before" the flipping page
772 if( this.$beforePage ) {
773
774 this.$beforeOverlay = $( '<div class="overlay"></div>' ).appendTo( this.$beforePage.find( 'div.back > .outer' ) );
775
776 }
777
778 },
779 _removeOverlays : function() {
780
781 // removes the 4 overlays
782 if( this.$frontoverlay )
783 this.$frontoverlay.remove();
784 if( this.$backoverlay )
785 this.$backoverlay.remove();
786 if( this.$afterOverlay )
787 this.$afterOverlay.remove();
788 if( this.$beforeOverlay )
789 this.$beforeOverlay.remove();
790
791 this.hasOverlays = false;
792
793 },
794 _overlay : function( angle, update ) {
795
796 // changes the opacity of each of the overlays.
797 if( update ) {
798
799 // if update is true, meaning we are manually flipping the page,
800 // we need to calculate the opacity that corresponds to the current angle
801 var afterOverlayOpacity = - ( 1 / 90 ) * angle + 1,
802 beforeOverlayOpacity = ( 1 / 90 ) * angle - 1;
803
804 if( this.$afterOverlay ) {
805
806 this.$afterOverlay.css( 'opacity', afterOverlayOpacity );
807
808 }
809 if( this.$beforeOverlay ) {
810
811 this.$beforeOverlay.css( 'opacity', beforeOverlayOpacity );
812
813 }
814
815 // the flipping page will have a fixed value.
816 // todo: add a gradient instead.
817 var flipOpacity = 0.1;
818 this.$frontoverlay.css( 'opacity', flipOpacity );
819 this.$backoverlay.css( 'opacity', flipOpacity );
820
821 }
822 else {
823
824 var _self = this;
825
826 // if we release the mouse / touchend then we will set a transition for the overlays.
827 // we will need to take in consideration the current angle, the speed (given the angle)
828 // and the delays for each overlay (the opacity of the overlay will only change
829 // when the flipping page is on the same side).
830 var afterspeed = this.flipSpeed,
831 beforespeed = this.flipSpeed,
832 margin = 60; // hack (todo: issues with safari / z-indexes)
833
834 if( this.$afterOverlay ) {
835
836 var afterdelay = 0;
837
838 if( this.flipDirection === 'right' ) {
839
840 if( this.angle > 90 ) {
841
842 afterdelay = Math.abs( this.flipSpeed - this.options.flipspeed / 2 - margin );
843 afterspeed = this.options.flipspeed / 2 - margin ;
844
845 }
846 else {
847
848 afterspeed -= margin;
849
850 }
851
852 }
853 else {
854
855 afterspeed = Math.abs( this.flipSpeed - this.options.flipspeed / 2 );
856
857 }
858
859 if( afterspeed <= 0 ) afterspeed = 1;
860
861 this.$afterOverlay.css( {
862 '-webkit-transition' : 'opacity ' + afterspeed + 'ms ' + this.options.fliptimingfunction + ' ' + afterdelay + 'ms',
863 '-moz-transition' : 'opacity ' + afterspeed + 'ms ' + this.options.fliptimingfunction + ' ' + afterdelay + 'ms',
864 'opacity' : ( this.flipDirection === 'left' ) ? 0 : 1
865 } ).on( 'webkitTransitionEnd.flips transitionend.flips OTransitionEnd.flips', function( event ) {
866 if( _self.$beforeOverlay ) _self.$beforeOverlay.off( 'webkitTransitionEnd.flips transitionend.flips OTransitionEnd.flips');
867 setTimeout( function() {
868 _self._adjustLayout(_self.currentPage);
869 }, _self.options.flipspeed / 2 - margin );
870 } );
871
872 }
873
874 if( this.$beforeOverlay ) {
875
876 var beforedelay = 0;
877
878 if( this.flipDirection === 'left' ) {
879
880 if( this.angle < 90 ) {
881
882 beforedelay = Math.abs( this.flipSpeed - this.options.flipspeed / 2 - margin ) ;
883 beforespeed = this.options.flipspeed / 2 - margin;
884
885 }
886 else {
887
888 beforespeed -= margin;
889
890 }
891
892 }
893 else {
894
895 beforespeed = Math.abs( this.flipSpeed - this.options.flipspeed / 2 );
896
897 }
898
899 if( beforespeed <= 0 ) beforespeed = 1;
900
901 this.$beforeOverlay.css( {
902 '-webkit-transition' : 'opacity ' + beforespeed + 'ms ' + this.options.fliptimingfunction + ' ' + beforedelay + 'ms',
903 '-moz-transition' : 'opacity ' + beforespeed + 'ms ' + this.options.fliptimingfunction + ' ' + beforedelay + 'ms',
904 'opacity' : ( this.flipDirection === 'left' ) ? 1 : 0
905 } ).on( 'webkitTransitionEnd.flips transitionend.flips OTransitionEnd.flips', function( event ) {
906 if( _self.$afterOverlay ) _self.$afterOverlay.off( 'webkitTransitionEnd.flips transitionend.flips OTransitionEnd.flips');
907 _self._adjustLayout(_self.currentPage);
908 } );
909
910 }
911
912 }
913
914 }
915 };
916
917 var logError = function( message ) {
918 if ( this.console ) {
919 console.error( message );
920 }
921 };
922
923 $.fn.flips = function( options ) {
924
925 if ( typeof options === 'string' ) {
926
927 var args = Array.prototype.slice.call( arguments, 1 );
928
929 this.each(function() {
930
931 var instance = $.data( this, 'flips' );
932
933 if ( !instance ) {
934 logError( "cannot call methods on flips prior to initialization; " +
935 "attempted to call method '" + options + "'" );
936 return;
937 }
938
939 if ( !$.isFunction( instance[options] ) || options.charAt(0) === "_" ) {
940 logError( "no such method '" + options + "' for flips instance" );
941 return;
942 }
943
944 instance[ options ].apply( instance, args );
945
946 });
947
948 }
949 else {
950
951 this.each(function() {
952
953 var instance = $.data( this, 'flips' );
954 if ( !instance ) {
955 $.data( this, 'flips', new $.Flips( options, this ) );
956 }
957 });
958
959 }
960
961 return this;
962
963 };
964
965})( window ); \ No newline at end of file
diff --git a/Blocks/Flipboard/js/jquery.history.js b/Blocks/Flipboard/js/jquery.history.js
new file mode 100644
index 0000000..8d4edcd
--- /dev/null
+++ b/Blocks/Flipboard/js/jquery.history.js
@@ -0,0 +1 @@
window.JSON||(window.JSON={}),function(){function f(a){return a<10?"0"+a:a}function quote(a){return escapable.lastIndex=0,escapable.test(a)?'"'+a.replace(escapable,function(a){var b=meta[a];return typeof b=="string"?b:"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)})+'"':'"'+a+'"'}function str(a,b){var c,d,e,f,g=gap,h,i=b[a];i&&typeof i=="object"&&typeof i.toJSON=="function"&&(i=i.toJSON(a)),typeof rep=="function"&&(i=rep.call(b,a,i));switch(typeof i){case"string":return quote(i);case"number":return isFinite(i)?String(i):"null";case"boolean":case"null":return String(i);case"object":if(!i)return"null";gap+=indent,h=[];if(Object.prototype.toString.apply(i)==="[object Array]"){f=i.length;for(c=0;c<f;c+=1)h[c]=str(c,i)||"null";return e=h.length===0?"[]":gap?"[\n"+gap+h.join(",\n"+gap)+"\n"+g+"]":"["+h.join(",")+"]",gap=g,e}if(rep&&typeof rep=="object"){f=rep.length;for(c=0;c<f;c+=1)d=rep[c],typeof d=="string"&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e))}else for(d in i)Object.hasOwnProperty.call(i,d)&&(e=str(d,i),e&&h.push(quote(d)+(gap?": ":":")+e));return e=h.length===0?"{}":gap?"{\n"+gap+h.join(",\n"+gap)+"\n"+g+"}":"{"+h.join(",")+"}",gap=g,e}}"use strict",typeof Date.prototype.toJSON!="function"&&(Date.prototype.toJSON=function(a){return isFinite(this.valueOf())?this.getUTCFullYear()+"-"+f(this.getUTCMonth()+1)+"-"+f(this.getUTCDate())+"T"+f(this.getUTCHours())+":"+f(this.getUTCMinutes())+":"+f(this.getUTCSeconds())+"Z":null},String.prototype.toJSON=Number.prototype.toJSON=Boolean.prototype.toJSON=function(a){return this.valueOf()});var JSON=window.JSON,cx=/[\u0000\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,escapable=/[\\\"\x00-\x1f\x7f-\x9f\u00ad\u0600-\u0604\u070f\u17b4\u17b5\u200c-\u200f\u2028-\u202f\u2060-\u206f\ufeff\ufff0-\uffff]/g,gap,indent,meta={"\b":"\\b","\t":"\\t","\n":"\\n","\f":"\\f","\r":"\\r",'"':'\\"',"\\":"\\\\"},rep;typeof JSON.stringify!="function"&&(JSON.stringify=function(a,b,c){var d;gap="",indent="";if(typeof c=="number")for(d=0;d<c;d+=1)indent+=" ";else typeof c=="string"&&(indent=c);rep=b;if(!b||typeof b=="function"||typeof b=="object"&&typeof b.length=="number")return str("",{"":a});throw new Error("JSON.stringify")}),typeof JSON.parse!="function"&&(JSON.parse=function(text,reviver){function walk(a,b){var c,d,e=a[b];if(e&&typeof e=="object")for(c in e)Object.hasOwnProperty.call(e,c)&&(d=walk(e,c),d!==undefined?e[c]=d:delete e[c]);return reviver.call(a,b,e)}var j;text=String(text),cx.lastIndex=0,cx.test(text)&&(text=text.replace(cx,function(a){return"\\u"+("0000"+a.charCodeAt(0).toString(16)).slice(-4)}));if(/^[\],:{}\s]*$/.test(text.replace(/\\(?:["\\\/bfnrt]|u[0-9a-fA-F]{4})/g,"@").replace(/"[^"\\\n\r]*"|true|false|null|-?\d+(?:\.\d*)?(?:[eE][+\-]?\d+)?/g,"]").replace(/(?:^|:|,)(?:\s*\[)+/g,"")))return j=eval("("+text+")"),typeof reviver=="function"?walk({"":j},""):j;throw new SyntaxError("JSON.parse")})}(),function(a,b){"use strict";var c=a.History=a.History||{},d=a.jQuery;if(typeof c.Adapter!="undefined")throw new Error("History.js Adapter has already been loaded...");c.Adapter={bind:function(a,b,c){d(a).bind(b,c)},trigger:function(a,b,c){d(a).trigger(b,c)},extractEventData:function(a,c,d){var e=c&&c.originalEvent&&c.originalEvent[a]||d&&d[a]||b;return e},onDomLoad:function(a){d(a)}},typeof c.init!="undefined"&&c.init()}(window),function(a,b){"use strict";var c=a.document,d=a.setTimeout||d,e=a.clearTimeout||e,f=a.setInterval||f,g=a.History=a.History||{};if(typeof g.initHtml4!="undefined")throw new Error("History.js HTML4 Support has already been loaded...");g.initHtml4=function(){if(typeof g.initHtml4.initialized!="undefined")return!1;g.initHtml4.initialized=!0,g.enabled=!0,g.savedHashes=[],g.isLastHash=function(a){var b=g.getHashByIndex(),c;return c=a===b,c},g.saveHash=function(a){return g.isLastHash(a)?!1:(g.savedHashes.push(a),!0)},g.getHashByIndex=function(a){var b=null;return typeof a=="undefined"?b=g.savedHashes[g.savedHashes.length-1]:a<0?b=g.savedHashes[g.savedHashes.length+a]:b=g.savedHashes[a],b},g.discardedHashes={},g.discardedStates={},g.discardState=function(a,b,c){var d=g.getHashByState(a),e;return e={discardedState:a,backState:c,forwardState:b},g.discardedStates[d]=e,!0},g.discardHash=function(a,b,c){var d={discardedHash:a,backState:c,forwardState:b};return g.discardedHashes[a]=d,!0},g.discardedState=function(a){var b=g.getHashByState(a),c;return c=g.discardedStates[b]||!1,c},g.discardedHash=function(a){var b=g.discardedHashes[a]||!1;return b},g.recycleState=function(a){var b=g.getHashByState(a);return g.discardedState(a)&&delete g.discardedStates[b],!0},g.emulated.hashChange&&(g.hashChangeInit=function(){g.checkerFunction=null;var b="",d,e,h,i;return g.isInternetExplorer()?(d="historyjs-iframe",e=c.createElement("iframe"),e.setAttribute("id",d),e.style.display="none",c.body.appendChild(e),e.contentWindow.document.open(),e.contentWindow.document.close(),h="",i=!1,g.checkerFunction=function(){if(i)return!1;i=!0;var c=g.getHash()||"",d=g.unescapeHash(e.contentWindow.document.location.hash)||"";return c!==b?(b=c,d!==c&&(h=d=c,e.contentWindow.document.open(),e.contentWindow.document.close(),e.contentWindow.document.location.hash=g.escapeHash(c)),g.Adapter.trigger(a,"hashchange")):d!==h&&(h=d,g.setHash(d,!1)),i=!1,!0}):g.checkerFunction=function(){var c=g.getHash();return c!==b&&(b=c,g.Adapter.trigger(a,"hashchange")),!0},g.intervalList.push(f(g.checkerFunction,g.options.hashChangeInterval)),!0},g.Adapter.onDomLoad(g.hashChangeInit)),g.emulated.pushState&&(g.onHashChange=function(b){var d=b&&b.newURL||c.location.href,e=g.getHashByUrl(d),f=null,h=null,i=null,j;return g.isLastHash(e)?(g.busy(!1),!1):(g.doubleCheckComplete(),g.saveHash(e),e&&g.isTraditionalAnchor(e)?(g.Adapter.trigger(a,"anchorchange"),g.busy(!1),!1):(f=g.extractState(g.getFullUrl(e||c.location.href,!1),!0),g.isLastSavedState(f)?(g.busy(!1),!1):(h=g.getHashByState(f),j=g.discardedState(f),j?(g.getHashByIndex(-2)===g.getHashByState(j.forwardState)?g.back(!1):g.forward(!1),!1):(g.pushState(f.data,f.title,f.url,!1),!0))))},g.Adapter.bind(a,"hashchange",g.onHashChange),g.pushState=function(b,d,e,f){if(g.getHashByUrl(e))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(f!==!1&&g.busy())return g.pushQueue({scope:g,callback:g.pushState,args:arguments,queue:f}),!1;g.busy(!0);var h=g.createStateObject(b,d,e),i=g.getHashByState(h),j=g.getState(!1),k=g.getHashByState(j),l=g.getHash();return g.storeState(h),g.expectedStateId=h.id,g.recycleState(h),g.setTitle(h),i===k?(g.busy(!1),!1):i!==l&&i!==g.getShortUrl(c.location.href)?(g.setHash(i,!1),!1):(g.saveState(h),g.Adapter.trigger(a,"statechange"),g.busy(!1),!0)},g.replaceState=function(a,b,c,d){if(g.getHashByUrl(c))throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(d!==!1&&g.busy())return g.pushQueue({scope:g,callback:g.replaceState,args:arguments,queue:d}),!1;g.busy(!0);var e=g.createStateObject(a,b,c),f=g.getState(!1),h=g.getStateByIndex(-2);return g.discardState(f,e,h),g.pushState(e.data,e.title,e.url,!1),!0}),g.emulated.pushState&&g.getHash()&&!g.emulated.hashChange&&g.Adapter.onDomLoad(function(){g.Adapter.trigger(a,"hashchange")})},typeof g.init!="undefined"&&g.init()}(window),function(a,b){"use strict";var c=a.console||b,d=a.document,e=a.navigator,f=a.sessionStorage||!1,g=a.setTimeout,h=a.clearTimeout,i=a.setInterval,j=a.clearInterval,k=a.JSON,l=a.alert,m=a.History=a.History||{},n=a.history;k.stringify=k.stringify||k.encode,k.parse=k.parse||k.decode;if(typeof m.init!="undefined")throw new Error("History.js Core has already been loaded...");m.init=function(){return typeof m.Adapter=="undefined"?!1:(typeof m.initCore!="undefined"&&m.initCore(),typeof m.initHtml4!="undefined"&&m.initHtml4(),!0)},m.initCore=function(){if(typeof m.initCore.initialized!="undefined")return!1;m.initCore.initialized=!0,m.options=m.options||{},m.options.hashChangeInterval=m.options.hashChangeInterval||100,m.options.safariPollInterval=m.options.safariPollInterval||500,m.options.doubleCheckInterval=m.options.doubleCheckInterval||500,m.options.storeInterval=m.options.storeInterval||1e3,m.options.busyDelay=m.options.busyDelay||250,m.options.debug=m.options.debug||!1,m.options.initialTitle=m.options.initialTitle||d.title,m.intervalList=[],m.clearAllIntervals=function(){var a,b=m.intervalList;if(typeof b!="undefined"&&b!==null){for(a=0;a<b.length;a++)j(b[a]);m.intervalList=null}},m.debug=function(){(m.options.debug||!1)&&m.log.apply(m,arguments)},m.log=function(){var a=typeof c!="undefined"&&typeof c.log!="undefined"&&typeof c.log.apply!="undefined",b=d.getElementById("log"),e,f,g,h,i;a?(h=Array.prototype.slice.call(arguments),e=h.shift(),typeof c.debug!="undefined"?c.debug.apply(c,[e,h]):c.log.apply(c,[e,h])):e="\n"+arguments[0]+"\n";for(f=1,g=arguments.length;f<g;++f){i=arguments[f];if(typeof i=="object"&&typeof k!="undefined")try{i=k.stringify(i)}catch(j){}e+="\n"+i+"\n"}return b?(b.value+=e+"\n-----\n",b.scrollTop=b.scrollHeight-b.clientHeight):a||l(e),!0},m.getInternetExplorerMajorVersion=function(){var a=m.getInternetExplorerMajorVersion.cached=typeof m.getInternetExplorerMajorVersion.cached!="undefined"?m.getInternetExplorerMajorVersion.cached:function(){var a=3,b=d.createElement("div"),c=b.getElementsByTagName("i");while((b.innerHTML="<!--[if gt IE "+ ++a+"]><i></i><![endif]-->")&&c[0]);return a>4?a:!1}();return a},m.isInternetExplorer=function(){var a=m.isInternetExplorer.cached=typeof m.isInternetExplorer.cached!="undefined"?m.isInternetExplorer.cached:Boolean(m.getInternetExplorerMajorVersion());return a},m.emulated={pushState:!Boolean(a.history&&a.history.pushState&&a.history.replaceState&&!/ Mobile\/([1-7][a-z]|(8([abcde]|f(1[0-8]))))/i.test(e.userAgent)&&!/AppleWebKit\/5([0-2]|3[0-2])/i.test(e.userAgent)),hashChange:Boolean(!("onhashchange"in a||"onhashchange"in d)||m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8)},m.enabled=!m.emulated.pushState,m.bugs={setHash:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),safariPoll:Boolean(!m.emulated.pushState&&e.vendor==="Apple Computer, Inc."&&/AppleWebKit\/5([0-2]|3[0-3])/.test(e.userAgent)),ieDoubleCheck:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<8),hashEscape:Boolean(m.isInternetExplorer()&&m.getInternetExplorerMajorVersion()<7)},m.isEmptyObject=function(a){for(var b in a)return!1;return!0},m.cloneObject=function(a){var b,c;return a?(b=k.stringify(a),c=k.parse(b)):c={},c},m.getRootUrl=function(){var a=d.location.protocol+"//"+(d.location.hostname||d.location.host);if(d.location.port||!1)a+=":"+d.location.port;return a+="/",a},m.getBaseHref=function(){var a=d.getElementsByTagName("base"),b=null,c="";return a.length===1&&(b=a[0],c=b.href.replace(/[^\/]+$/,"")),c=c.replace(/\/+$/,""),c&&(c+="/"),c},m.getBaseUrl=function(){var a=m.getBaseHref()||m.getBasePageUrl()||m.getRootUrl();return a},m.getPageUrl=function(){var a=m.getState(!1,!1),b=(a||{}).url||d.location.href,c;return c=b.replace(/\/+$/,"").replace(/[^\/]+$/,function(a,b,c){return/\./.test(a)?a:a+"/"}),c},m.getBasePageUrl=function(){var a=d.location.href.replace(/[#\?].*/,"").replace(/[^\/]+$/,function(a,b,c){return/[^\/]$/.test(a)?"":a}).replace(/\/+$/,"")+"/";return a},m.getFullUrl=function(a,b){var c=a,d=a.substring(0,1);return b=typeof b=="undefined"?!0:b,/[a-z]+\:\/\//.test(a)||(d==="/"?c=m.getRootUrl()+a.replace(/^\/+/,""):d==="#"?c=m.getPageUrl().replace(/#.*/,"")+a:d==="?"?c=m.getPageUrl().replace(/[\?#].*/,"")+a:b?c=m.getBaseUrl()+a.replace(/^(\.\/)+/,""):c=m.getBasePageUrl()+a.replace(/^(\.\/)+/,"")),c.replace(/\#$/,"")},m.getShortUrl=function(a){var b=a,c=m.getBaseUrl(),d=m.getRootUrl();return m.emulated.pushState&&(b=b.replace(c,"")),b=b.replace(d,"/"),m.isTraditionalAnchor(b)&&(b="./"+b),b=b.replace(/^(\.\/)+/g,"./").replace(/\#$/,""),b},m.store={},m.idToState=m.idToState||{},m.stateToId=m.stateToId||{},m.urlToId=m.urlToId||{},m.storedStates=m.storedStates||[],m.savedStates=m.savedStates||[],m.normalizeStore=function(){m.store.idToState=m.store.idToState||{},m.store.urlToId=m.store.urlToId||{},m.store.stateToId=m.store.stateToId||{}},m.getState=function(a,b){typeof a=="undefined"&&(a=!0),typeof b=="undefined"&&(b=!0);var c=m.getLastSavedState();return!c&&b&&(c=m.createStateObject()),a&&(c=m.cloneObject(c),c.url=c.cleanUrl||c.url),c},m.getIdByState=function(a){var b=m.extractId(a.url),c;if(!b){c=m.getStateString(a);if(typeof m.stateToId[c]!="undefined")b=m.stateToId[c];else if(typeof m.store.stateToId[c]!="undefined")b=m.store.stateToId[c];else{for(;;){b=(new Date).getTime()+String(Math.random()).replace(/\D/g,"");if(typeof m.idToState[b]=="undefined"&&typeof m.store.idToState[b]=="undefined")break}m.stateToId[c]=b,m.idToState[b]=a}}return b},m.normalizeState=function(a){var b,c;if(!a||typeof a!="object")a={};if(typeof a.normalized!="undefined")return a;if(!a.data||typeof a.data!="object")a.data={};b={},b.normalized=!0,b.title=a.title||"",b.url=m.getFullUrl(m.unescapeString(a.url||d.location.href)),b.hash=m.getShortUrl(b.url),b.data=m.cloneObject(a.data),b.id=m.getIdByState(b),b.cleanUrl=b.url.replace(/\??\&_suid.*/,""),b.url=b.cleanUrl,c=!m.isEmptyObject(b.data);if(b.title||c)b.hash=m.getShortUrl(b.url).replace(/\??\&_suid.*/,""),/\?/.test(b.hash)||(b.hash+="?"),b.hash+="&_suid="+b.id;return b.hashedUrl=m.getFullUrl(b.hash),(m.emulated.pushState||m.bugs.safariPoll)&&m.hasUrlDuplicate(b)&&(b.url=b.hashedUrl),b},m.createStateObject=function(a,b,c){var d={data:a,title:b,url:c};return d=m.normalizeState(d),d},m.getStateById=function(a){a=String(a);var c=m.idToState[a]||m.store.idToState[a]||b;return c},m.getStateString=function(a){var b,c,d;return b=m.normalizeState(a),c={data:b.data,title:a.title,url:a.url},d=k.stringify(c),d},m.getStateId=function(a){var b,c;return b=m.normalizeState(a),c=b.id,c},m.getHashByState=function(a){var b,c;return b=m.normalizeState(a),c=b.hash,c},m.extractId=function(a){var b,c,d;return c=/(.*)\&_suid=([0-9]+)$/.exec(a),d=c?c[1]||a:a,b=c?String(c[2]||""):"",b||!1},m.isTraditionalAnchor=function(a){var b=!/[\/\?\.]/.test(a);return b},m.extractState=function(a,b){var c=null,d,e;return b=b||!1,d=m.extractId(a),d&&(c=m.getStateById(d)),c||(e=m.getFullUrl(a),d=m.getIdByUrl(e)||!1,d&&(c=m.getStateById(d)),!c&&b&&!m.isTraditionalAnchor(a)&&(c=m.createStateObject(null,null,e))),c},m.getIdByUrl=function(a){var c=m.urlToId[a]||m.store.urlToId[a]||b;return c},m.getLastSavedState=function(){return m.savedStates[m.savedStates.length-1]||b},m.getLastStoredState=function(){return m.storedStates[m.storedStates.length-1]||b},m.hasUrlDuplicate=function(a){var b=!1,c;return c=m.extractState(a.url),b=c&&c.id!==a.id,b},m.storeState=function(a){return m.urlToId[a.url]=a.id,m.storedStates.push(m.cloneObject(a)),a},m.isLastSavedState=function(a){var b=!1,c,d,e;return m.savedStates.length&&(c=a.id,d=m.getLastSavedState(),e=d.id,b=c===e),b},m.saveState=function(a){return m.isLastSavedState(a)?!1:(m.savedStates.push(m.cloneObject(a)),!0)},m.getStateByIndex=function(a){var b=null;return typeof a=="undefined"?b=m.savedStates[m.savedStates.length-1]:a<0?b=m.savedStates[m.savedStates.length+a]:b=m.savedStates[a],b},m.getHash=function(){var a=m.unescapeHash(d.location.hash);return a},m.unescapeString=function(b){var c=b,d;for(;;){d=a.unescape(c);if(d===c)break;c=d}return c},m.unescapeHash=function(a){var b=m.normalizeHash(a);return b=m.unescapeString(b),b},m.normalizeHash=function(a){var b=a.replace(/[^#]*#/,"").replace(/#.*/,"");return b},m.setHash=function(a,b){var c,e,f;return b!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.setHash,args:arguments,queue:b}),!1):(c=m.escapeHash(a),m.busy(!0),e=m.extractState(a,!0),e&&!m.emulated.pushState?m.pushState(e.data,e.title,e.url,!1):d.location.hash!==c&&(m.bugs.setHash?(f=m.getPageUrl(),m.pushState(null,null,f+"#"+c,!1)):d.location.hash=c),m)},m.escapeHash=function(b){var c=m.normalizeHash(b);return c=a.escape(c),m.bugs.hashEscape||(c=c.replace(/\%21/g,"!").replace(/\%26/g,"&").replace(/\%3D/g,"=").replace(/\%3F/g,"?")),c},m.getHashByUrl=function(a){var b=String(a).replace(/([^#]*)#?([^#]*)#?(.*)/,"$2");return b=m.unescapeHash(b),b},m.setTitle=function(a){var b=a.title,c;b||(c=m.getStateByIndex(0),c&&c.url===a.url&&(b=c.title||m.options.initialTitle));try{d.getElementsByTagName("title")[0].innerHTML=b.replace("<","&lt;").replace(">","&gt;").replace(" & "," &amp; ")}catch(e){}return d.title=b,m},m.queues=[],m.busy=function(a){typeof a!="undefined"?m.busy.flag=a:typeof m.busy.flag=="undefined"&&(m.busy.flag=!1);if(!m.busy.flag){h(m.busy.timeout);var b=function(){var a,c,d;if(m.busy.flag)return;for(a=m.queues.length-1;a>=0;--a){c=m.queues[a];if(c.length===0)continue;d=c.shift(),m.fireQueueItem(d),m.busy.timeout=g(b,m.options.busyDelay)}};m.busy.timeout=g(b,m.options.busyDelay)}return m.busy.flag},m.busy.flag=!1,m.fireQueueItem=function(a){return a.callback.apply(a.scope||m,a.args||[])},m.pushQueue=function(a){return m.queues[a.queue||0]=m.queues[a.queue||0]||[],m.queues[a.queue||0].push(a),m},m.queue=function(a,b){return typeof a=="function"&&(a={callback:a}),typeof b!="undefined"&&(a.queue=b),m.busy()?m.pushQueue(a):m.fireQueueItem(a),m},m.clearQueue=function(){return m.busy.flag=!1,m.queues=[],m},m.stateChanged=!1,m.doubleChecker=!1,m.doubleCheckComplete=function(){return m.stateChanged=!0,m.doubleCheckClear(),m},m.doubleCheckClear=function(){return m.doubleChecker&&(h(m.doubleChecker),m.doubleChecker=!1),m},m.doubleCheck=function(a){return m.stateChanged=!1,m.doubleCheckClear(),m.bugs.ieDoubleCheck&&(m.doubleChecker=g(function(){return m.doubleCheckClear(),m.stateChanged||a(),!0},m.options.doubleCheckInterval)),m},m.safariStatePoll=function(){var b=m.extractState(d.location.href),c;if(!m.isLastSavedState(b))c=b;else return;return c||(c=m.createStateObject()),m.Adapter.trigger(a,"popstate"),m},m.back=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.back,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.back(!1)}),n.go(-1),!0)},m.forward=function(a){return a!==!1&&m.busy()?(m.pushQueue({scope:m,callback:m.forward,args:arguments,queue:a}),!1):(m.busy(!0),m.doubleCheck(function(){m.forward(!1)}),n.go(1),!0)},m.go=function(a,b){var c;if(a>0)for(c=1;c<=a;++c)m.forward(b);else{if(!(a<0))throw new Error("History.go: History.go requires a positive or negative integer passed.");for(c=-1;c>=a;--c)m.back(b)}return m};if(m.emulated.pushState){var o=function(){};m.pushState=m.pushState||o,m.replaceState=m.replaceState||o}else m.onPopState=function(b,c){var e=!1,f=!1,g,h;return m.doubleCheckComplete(),g=m.getHash(),g?(h=m.extractState(g||d.location.href,!0),h?m.replaceState(h.data,h.title,h.url,!1):(m.Adapter.trigger(a,"anchorchange"),m.busy(!1)),m.expectedStateId=!1,!1):(e=m.Adapter.extractEventData("state",b,c)||!1,e?f=m.getStateById(e):m.expectedStateId?f=m.getStateById(m.expectedStateId):f=m.extractState(d.location.href),f||(f=m.createStateObject(null,null,d.location.href)),m.expectedStateId=!1,m.isLastSavedState(f)?(m.busy(!1),!1):(m.storeState(f),m.saveState(f),m.setTitle(f),m.Adapter.trigger(a,"statechange"),m.busy(!1),!0))},m.Adapter.bind(a,"popstate",m.onPopState),m.pushState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.pushState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.pushState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0},m.replaceState=function(b,c,d,e){if(m.getHashByUrl(d)&&m.emulated.pushState)throw new Error("History.js does not support states with fragement-identifiers (hashes/anchors).");if(e!==!1&&m.busy())return m.pushQueue({scope:m,callback:m.replaceState,args:arguments,queue:e}),!1;m.busy(!0);var f=m.createStateObject(b,c,d);return m.isLastSavedState(f)?m.busy(!1):(m.storeState(f),m.expectedStateId=f.id,n.replaceState(f.id,f.title,f.url),m.Adapter.trigger(a,"popstate")),!0};if(f){try{m.store=k.parse(f.getItem("History.store"))||{}}catch(p){m.store={}}m.normalizeStore()}else m.store={},m.normalizeStore();m.Adapter.bind(a,"beforeunload",m.clearAllIntervals),m.Adapter.bind(a,"unload",m.clearAllIntervals),m.saveState(m.storeState(m.extractState(d.location.href,!0))),f&&(m.onUnload=function(){var a,b;try{a=k.parse(f.getItem("History.store"))||{}}catch(c){a={}}a.idToState=a.idToState||{},a.urlToId=a.urlToId||{},a.stateToId=a.stateToId||{};for(b in m.idToState){if(!m.idToState.hasOwnProperty(b))continue;a.idToState[b]=m.idToState[b]}for(b in m.urlToId){if(!m.urlToId.hasOwnProperty(b))continue;a.urlToId[b]=m.urlToId[b]}for(b in m.stateToId){if(!m.stateToId.hasOwnProperty(b))continue;a.stateToId[b]=m.stateToId[b]}m.store=a,m.normalizeStore(),f.setItem("History.store",k.stringify(a))},m.intervalList.push(i(m.onUnload,m.options.storeInterval)),m.Adapter.bind(a,"beforeunload",m.onUnload),m.Adapter.bind(a,"unload",m.onUnload));if(!m.emulated.pushState){m.bugs.safariPoll&&m.intervalList.push(i(m.safariStatePoll,m.options.safariPollInterval));if(e.vendor==="Apple Computer, Inc."||(e.appCodeName||"")==="Mozilla")m.Adapter.bind(a,"hashchange",function(){m.Adapter.trigger(a,"popstate")}),m.getHash()&&m.Adapter.onDomLoad(function(){m.Adapter.trigger(a,"hashchange")})}},m.init()}(window) \ No newline at end of file
diff --git a/Blocks/Flipboard/js/jquery.tmpl.min.js b/Blocks/Flipboard/js/jquery.tmpl.min.js
new file mode 100644
index 0000000..f08e81d
--- /dev/null
+++ b/Blocks/Flipboard/js/jquery.tmpl.min.js
@@ -0,0 +1 @@
(function(a){var r=a.fn.domManip,d="_tmplitem",q=/^[^<]*(<[\w\W]+>)[^>]*$|\{\{\! /,b={},f={},e,p={key:0,data:{}},h=0,c=0,l=[];function g(e,d,g,i){var c={data:i||(d?d.data:{}),_wrap:d?d._wrap:null,tmpl:null,parent:d||null,nodes:[],calls:u,nest:w,wrap:x,html:v,update:t};e&&a.extend(c,e,{nodes:[],parent:d});if(g){c.tmpl=g;c._ctnt=c._ctnt||c.tmpl(a,c);c.key=++h;(l.length?f:b)[h]=c}return c}a.each({appendTo:"append",prependTo:"prepend",insertBefore:"before",insertAfter:"after",replaceAll:"replaceWith"},function(f,d){a.fn[f]=function(n){var g=[],i=a(n),k,h,m,l,j=this.length===1&&this[0].parentNode;e=b||{};if(j&&j.nodeType===11&&j.childNodes.length===1&&i.length===1){i[d](this[0]);g=this}else{for(h=0,m=i.length;h<m;h++){c=h;k=(h>0?this.clone(true):this).get();a.fn[d].apply(a(i[h]),k);g=g.concat(k)}c=0;g=this.pushStack(g,f,i.selector)}l=e;e=null;a.tmpl.complete(l);return g}});a.fn.extend({tmpl:function(d,c,b){return a.tmpl(this[0],d,c,b)},tmplItem:function(){return a.tmplItem(this[0])},template:function(b){return a.template(b,this[0])},domManip:function(d,l,j){if(d[0]&&d[0].nodeType){var f=a.makeArray(arguments),g=d.length,i=0,h;while(i<g&&!(h=a.data(d[i++],"tmplItem")));if(g>1)f[0]=[a.makeArray(d)];if(h&&c)f[2]=function(b){a.tmpl.afterManip(this,b,j)};r.apply(this,f)}else r.apply(this,arguments);c=0;!e&&a.tmpl.complete(b);return this}});a.extend({tmpl:function(d,h,e,c){var j,k=!c;if(k){c=p;d=a.template[d]||a.template(null,d);f={}}else if(!d){d=c.tmpl;b[c.key]=c;c.nodes=[];c.wrapped&&n(c,c.wrapped);return a(i(c,null,c.tmpl(a,c)))}if(!d)return[];if(typeof h==="function")h=h.call(c||{});e&&e.wrapped&&n(e,e.wrapped);j=a.isArray(h)?a.map(h,function(a){return a?g(e,c,d,a):null}):[g(e,c,d,h)];return k?a(i(c,null,j)):j},tmplItem:function(b){var c;if(b instanceof a)b=b[0];while(b&&b.nodeType===1&&!(c=a.data(b,"tmplItem"))&&(b=b.parentNode));return c||p},template:function(c,b){if(b){if(typeof b==="string")b=o(b);else if(b instanceof a)b=b[0]||{};if(b.nodeType)b=a.data(b,"tmpl")||a.data(b,"tmpl",o(b.innerHTML));return typeof c==="string"?(a.template[c]=b):b}return c?typeof c!=="string"?a.template(null,c):a.template[c]||a.template(null,q.test(c)?c:a(c)):null},encode:function(a){return(""+a).split("<").join("&lt;").split(">").join("&gt;").split('"').join("&#34;").split("'").join("&#39;")}});a.extend(a.tmpl,{tag:{tmpl:{_default:{$2:"null"},open:"if($notnull_1){_=_.concat($item.nest($1,$2));}"},wrap:{_default:{$2:"null"},open:"$item.calls(_,$1,$2);_=[];",close:"call=$item.calls();_=call._.concat($item.wrap(call,_));"},each:{_default:{$2:"$index, $value"},open:"if($notnull_1){$.each($1a,function($2){with(this){",close:"}});}"},"if":{open:"if(($notnull_1) && $1a){",close:"}"},"else":{_default:{$1:"true"},open:"}else if(($notnull_1) && $1a){"},html:{open:"if($notnull_1){_.push($1a);}"},"=":{_default:{$1:"$data"},open:"if($notnull_1){_.push($.encode($1a));}"},"!":{open:""}},complete:function(){b={}},afterManip:function(f,b,d){var e=b.nodeType===11?a.makeArray(b.childNodes):b.nodeType===1?[b]:[];d.call(f,b);m(e);c++}});function i(e,g,f){var b,c=f?a.map(f,function(a){return typeof a==="string"?e.key?a.replace(/(<\w+)(?=[\s>])(?![^>]*_tmplitem)([^>]*)/g,"$1 "+d+'="'+e.key+'" $2'):a:i(a,e,a._ctnt)}):e;if(g)return c;c=c.join("");c.replace(/^\s*([^<\s][^<]*)?(<[\w\W]+>)([^>]*[^>\s])?\s*$/,function(f,c,e,d){b=a(e).get();m(b);if(c)b=j(c).concat(b);if(d)b=b.concat(j(d))});return b?b:j(c)}function j(c){var b=document.createElement("div");b.innerHTML=c;return a.makeArray(b.childNodes)}function o(b){return new Function("jQuery","$item","var $=jQuery,call,_=[],$data=$item.data;with($data){_.push('"+a.trim(b).replace(/([\\'])/g,"\\$1").replace(/[\r\t\n]/g," ").replace(/\$\{([^\}]*)\}/g,"{{= $1}}").replace(/\{\{(\/?)(\w+|.)(?:\(((?:[^\}]|\}(?!\}))*?)?\))?(?:\s+(.*?)?)?(\(((?:[^\}]|\}(?!\}))*?)\))?\s*\}\}/g,function(m,l,j,d,b,c,e){var i=a.tmpl.tag[j],h,f,g;if(!i)throw"Template command not found: "+j;h=i._default||[];if(c&&!/\w$/.test(b)){b+=c;c=""}if(b){b=k(b);e=e?","+k(e)+")":c?")":"";f=c?b.indexOf(".")>-1?b+c:"("+b+").call($item"+e:b;g=c?f:"(typeof("+b+")==='function'?("+b+").call($item):("+b+"))"}else g=f=h.$1||"null";d=k(d);return"');"+i[l?"close":"open"].split("$notnull_1").join(b?"typeof("+b+")!=='undefined' && ("+b+")!=null":"true").split("$1a").join(g).split("$1").join(f).split("$2").join(d?d.replace(/\s*([^\(]+)\s*(\((.*?)\))?/g,function(d,c,b,a){a=a?","+a+")":b?")":"";return a?"("+c+").call($item"+a:d}):h.$2||"")+"_.push('"})+"');}return _;")}function n(c,b){c._wrap=i(c,true,a.isArray(b)?b:[q.test(b)?b:a(b).html()]).join("")}function k(a){return a?a.replace(/\\'/g,"'").replace(/\\\\/g,"\\"):null}function s(b){var a=document.createElement("div");a.appendChild(b.cloneNode(true));return a.innerHTML}function m(o){var n="_"+c,k,j,l={},e,p,i;for(e=0,p=o.length;e<p;e++){if((k=o[e]).nodeType!==1)continue;j=k.getElementsByTagName("*");for(i=j.length-1;i>=0;i--)m(j[i]);m(k)}function m(j){var p,i=j,k,e,m;if(m=j.getAttribute(d)){while(i.parentNode&&(i=i.parentNode).nodeType===1&&!(p=i.getAttribute(d)));if(p!==m){i=i.parentNode?i.nodeType===11?0:i.getAttribute(d)||0:0;if(!(e=b[m])){e=f[m];e=g(e,b[i]||f[i],null,true);e.key=++h;b[h]=e}c&&o(m)}j.removeAttribute(d)}else if(c&&(e=a.data(j,"tmplItem"))){o(e.key);b[e.key]=e;i=a.data(j.parentNode,"tmplItem");i=i?i.key:0}if(e){k=e;while(k&&k.key!=i){k.nodes.push(j);k=k.parent}delete e._ctnt;delete e._wrap;a.data(j,"tmplItem",e)}function o(a){a=a+n;e=l[a]=l[a]||g(e,b[e.parent.key+n]||e.parent,null,true)}}}function u(a,d,c,b){if(!a)return l.pop();l.push({_:a,tmpl:d,item:this,data:c,options:b})}function w(d,c,b){return a.tmpl(a.template(d),c,b,this)}function x(b,d){var c=b.options||{};c.wrapped=d;return a.tmpl(a.template(b.tmpl),b.data,c,b.item)}function v(d,c){var b=this._wrap;return a.map(a(a.isArray(b)?b.join(""):b).filter(d||"*"),function(a){return c?a.innerText||a.textContent:a.outerHTML||s(a)})}function t(){var b=this.nodes;a.tmpl(null,null,null,this).insertBefore(b[0]);a(b).remove()}})(jQuery) \ No newline at end of file
diff --git a/Blocks/Flipboard/js/jquery.touchSwipe-1.2.5.js b/Blocks/Flipboard/js/jquery.touchSwipe-1.2.5.js
new file mode 100644
index 0000000..f007f55
--- /dev/null
+++ b/Blocks/Flipboard/js/jquery.touchSwipe-1.2.5.js
@@ -0,0 +1,478 @@
1/*
2 * touchSwipe - jQuery Plugin
3 * http://plugins.jquery.com/project/touchSwipe
4 * http://labs.skinkers.com/touchSwipe/
5 *
6 * Copyright (c) 2010 Matt Bryson (www.skinkers.com)
7 * Dual licensed under the MIT or GPL Version 2 licenses.
8 *
9 * $version: 1.2.5
10 *
11 * Changelog
12 * $Date: 2010-12-12 (Wed, 12 Dec 2010) $
13 * $version: 1.0.0
14 * $version: 1.0.1 - removed multibyte comments
15 *
16 * $Date: 2011-21-02 (Mon, 21 Feb 2011) $
17 * $version: 1.1.0 - added allowPageScroll property to allow swiping and scrolling of page
18 * - changed handler signatures so one handler can be used for multiple events
19 * $Date: 2011-23-02 (Wed, 23 Feb 2011) $
20 * $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.
21 * - 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.
22 * $version: 1.2.1 - removed console log!
23 *
24 * $version: 1.2.2 - Fixed bug where scope was not preserved in callback methods.
25 *
26 * $Date: 2011-28-04 (Thurs, 28 April 2011) $
27 * $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.
28 *
29 * $Date: 2011-27-09 (Tues, 27 September 2011) $
30 * $version: 1.2.5 - Added support for testing swipes with mouse on desktop browser (thanks to https://github.com/joelhy)
31
32 * A jQuery plugin to capture left, right, up and down swipes on touch devices.
33 * You can capture 2 finger or 1 finger swipes, set the threshold and define either a catch all handler, or individual direction handlers.
34 * Options:
35 * swipe Function A catch all handler that is triggered for all swipe directions. Handler is passed 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
36 * swipeLeft Function A handler that is triggered for "left" swipes. Handler is passed 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
37 * swipeRight Function A handler that is triggered for "right" swipes. Handler is passed 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
38 * swipeUp Function A handler that is triggered for "up" swipes. Handler is passed 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
39 * swipeDown Function A handler that is triggered for "down" swipes. Handler is passed 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
40 * swipeStatus Function A handler triggered for every phase of the swipe. Handler is passed 4 arguments: event : The original event object, phase:The current swipe face, either "start?, "move?, "end? or "cancel?. direction : The swipe direction, either "up?, "down?, "left " or "right?.distance : The distance of the swipe.
41 * click Function A handler triggered when a user just clicks on the item, rather than swipes it. If they do not move, click is triggered, if they do move, it is not.
42 *
43 * fingers int Default 1. The number of fingers to trigger the swipe, 1 or 2.
44 * threshold int Default 75. The number of pixels that the user must move their finger by before it is considered a swipe.
45 * triggerOnTouchEnd Boolean Default 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.
46 * allowPageScroll String Default "auto". How the browser handles page scrolls when the user is swiping on a touchSwipe object.
47 * "auto" : all undefined swipes will cause the page to scroll in that direction.
48 * "none" : the page will not scroll when user swipes.
49 * "horizontal" : will force page to scroll on horizontal swipes.
50 * "vertical" : will force page to scroll on vertical swipes.
51 *
52 * This jQuery plugin will only run on devices running Mobile Webkit based browsers (iOS 2.0+, android 2.2+)
53 */
54(function($)
55{
56
57
58
59 $.fn.swipe = function(options)
60 {
61 if (!this) return false;
62
63 // Default thresholds & swipe functions
64 var defaults = {
65
66 fingers : 1, // int - The number of fingers to trigger the swipe, 1 or 2. Default is 1.
67 threshold : 75, // int - The number of pixels that the user must move their finger by before it is considered a swipe. Default is 75.
68
69 swipe : null, // Function - A catch all handler that is triggered for all swipe directions. Accepts 2 arguments, the original event object and the direction of the swipe : "left", "right", "up", "down".
70 swipeLeft : null, // Function - A handler that is triggered for "left" swipes. Accepts 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
71 swipeRight : null, // Function - A handler that is triggered for "right" swipes. Accepts 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
72 swipeUp : null, // Function - A handler that is triggered for "up" swipes. Accepts 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
73 swipeDown : null, // Function - A handler that is triggered for "down" swipes. Accepts 3 arguments, the original event object, the direction of the swipe : "left", "right", "up", "down" and the distance of the swipe.
74 swipeStatus : null, // Function - A handler triggered for every phase of the swipe. Handler is passed 4 arguments: event : The original event object, phase:The current swipe face, either "start?, "move?, "end? or "cancel?. direction : The swipe direction, either "up?, "down?, "left " or "right?.distance : The distance of the swipe.
75 click : null, // Function - A handler triggered when a user just clicks on the item, rather than swipes it. If they do not move, click is triggered, if they do move, it is not.
76
77 triggerOnTouchEnd : true, // Boolean, 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.
78 allowPageScroll : "auto" /* How the browser handles page scrolls when the user is swiping on a touchSwipe object.
79 "auto" : all undefined swipes will cause the page to scroll in that direction.
80 "none" : the page will not scroll when user swipes.
81 "horizontal" : will force page to scroll on horizontal swipes.
82 "vertical" : will force page to scroll on vertical swipes.
83 */
84 };
85
86
87 //Constants
88 var LEFT = "left";
89 var RIGHT = "right";
90 var UP = "up";
91 var DOWN = "down";
92 var NONE = "none";
93 var HORIZONTAL = "horizontal";
94 var VERTICAL = "vertical";
95 var AUTO = "auto";
96
97 var PHASE_START="start";
98 var PHASE_MOVE="move";
99 var PHASE_END="end";
100 var PHASE_CANCEL="cancel";
101
102 var hasTouch = 'ontouchstart' in window,
103 START_EV = hasTouch ? 'touchstart' : 'mousedown',
104 MOVE_EV = hasTouch ? 'touchmove' : 'mousemove',
105 END_EV = hasTouch ? 'touchend' : 'mouseup',
106 CANCEL_EV = 'touchcancel';
107
108 var phase="start";
109
110 if (options.allowPageScroll==undefined && (options.swipe!=undefined || options.swipeStatus!=undefined))
111 options.allowPageScroll=NONE;
112
113 if (options)
114 $.extend(defaults, options);
115
116
117 /**
118 * Setup each object to detect swipe gestures
119 */
120 return this.each(function()
121 {
122 var that = this;
123 var $this = $(this);
124
125 var triggerElementID = null; // this variable is used to identity the triggering element
126 var fingerCount = 0; // the current number of fingers being used.
127
128 //track mouse points / delta
129 var start={x:0, y:0};
130 var end={x:0, y:0};
131 var delta={x:0, y:0};
132 // added by Codrops
133 var lastPositionX = 0;
134
135 /**
136 * Event handler for a touch start event.
137 * Stops the default click event from triggering and stores where we touched
138 */
139 function touchStart(event)
140 {
141 var evt = hasTouch ? event.touches[0] : event;
142
143 phase = PHASE_START;
144
145 if (hasTouch) {
146 // get the total number of fingers touching the screen
147 fingerCount = event.touches.length;
148 }
149
150 //clear vars..
151 distance=0;
152 direction=null;
153
154 // check the number of fingers is what we are looking for
155 if (fingerCount == defaults.fingers || !hasTouch)
156 {
157 // get the coordinates of the touch
158 start.x = end.x = evt.pageX;
159 start.y = end.y = evt.pageY;
160 // changed by Codrops
161 lastPositionX = end.x;
162
163 if (defaults.swipeStatus)
164 triggerHandler(event, phase, start, end);
165 }
166 else
167 {
168 //touch with more/less than the fingers we are looking for
169 touchCancel(event);
170 }
171
172 that.addEventListener(MOVE_EV, touchMove, false);
173 that.addEventListener(END_EV, touchEnd, false);
174
175 }
176
177 /**
178 * Event handler for a touch move event.
179 * If we change fingers during move, then cancel the event
180 */
181 function touchMove(event)
182 {
183 if (phase == PHASE_END || phase == PHASE_CANCEL)
184 return;
185
186 var evt = hasTouch ? event.touches[0] : event;
187
188 end.x = evt.pageX;
189 end.y = evt.pageY;
190
191 // changed by Codrops
192 direction = calculateDirection();
193 lastPositionX = end.x;
194
195 if (hasTouch) {
196 fingerCount = event.touches.length;
197 }
198
199 phase = PHASE_MOVE
200
201 //Check if we need to prevent default evnet (page scroll) or not
202 validateDefaultEvent(event, direction);
203
204 if ( fingerCount == defaults.fingers || !hasTouch)
205 {
206 distance = caluculateDistance();
207
208 if (defaults.swipeStatus)
209 triggerHandler(event, phase, start, end, direction, distance);
210
211 //If we trigger whilst dragging, not on touch end, then calculate now...
212 if (!defaults.triggerOnTouchEnd)
213 {
214 // if the user swiped more than the minimum length, perform the appropriate action
215 if ( distance >= defaults.threshold )
216 {
217 phase = PHASE_END;
218 triggerHandler(event, phase, start, end);
219 touchCancel(event); // reset the variables
220 }
221 }
222 }
223 else
224 {
225 phase = PHASE_CANCEL;
226 triggerHandler(event, phase, start, end);
227 touchCancel(event);
228 }
229 }
230
231 /**
232 * Event handler for a touch end event.
233 * Calculate the direction and trigger events
234 */
235 function touchEnd(event)
236 {
237 event.preventDefault();
238
239 distance = caluculateDistance();
240
241 //changed by codrops
242 //direction = caluculateDirection();
243
244 if (defaults.triggerOnTouchEnd)
245 {
246 phase = PHASE_END;
247 // check to see if more than one finger was used and that there is an ending coordinate
248 if ( (fingerCount == defaults.fingers || !hasTouch) && end.x != 0 )
249 {
250 // if the user swiped more than the minimum length, perform the appropriate action
251 if ( distance >= defaults.threshold )
252 {
253 triggerHandler(event, phase, start, end);
254 touchCancel(event); // reset the variables
255 }
256 else
257 {
258 phase = PHASE_CANCEL;
259 triggerHandler(event, phase, start, end);
260 touchCancel(event);
261 }
262 }
263 else
264 {
265 phase = PHASE_CANCEL;
266 triggerHandler(event, phase, start, end);
267 touchCancel(event);
268 }
269 }
270 else if (phase == PHASE_MOVE)
271 {
272 phase = PHASE_CANCEL;
273 triggerHandler(event, phase, start, end);
274 touchCancel(event);
275 }
276 that.removeEventListener(MOVE_EV, touchMove, false);
277 that.removeEventListener(END_EV, touchEnd, false);
278 }
279
280 /**
281 * Event handler for a touch cancel event.
282 * Clears current vars
283 */
284 function touchCancel(event)
285 {
286 // reset the variables back to default values
287 fingerCount = 0;
288
289 start.x = 0;
290 start.y = 0;
291 end.x = 0;
292 end.y = 0;
293 delta.x = 0;
294 delta.y = 0;
295 }
296
297
298 /**
299 * Trigger the relevant event handler
300 * 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"
301 */
302 // changed by Codrops added start & end
303 function triggerHandler(event, phase, start, end)
304 {
305 //update status
306 if (defaults.swipeStatus)
307 defaults.swipeStatus.call($this,event, phase, start, end, direction || null, distance || 0);
308
309
310 if (phase == PHASE_CANCEL)
311 {
312 if (defaults.click && (fingerCount==1 || !hasTouch) && (isNaN(distance) || distance==0))
313 defaults.click.call($this,event, event.target);
314 }
315
316 if (phase == PHASE_END)
317 {
318 //trigger catch all event handler
319 if (defaults.swipe)
320 {
321
322 defaults.swipe.call($this,event, direction, distance);
323
324 }
325 //trigger direction specific event handlers
326 switch(direction)
327 {
328 case LEFT :
329 if (defaults.swipeLeft)
330 defaults.swipeLeft.call($this,event, direction, distance);
331 break;
332
333 case RIGHT :
334 if (defaults.swipeRight)
335 defaults.swipeRight.call($this,event, direction, distance);
336 break;
337
338 case UP :
339 if (defaults.swipeUp)
340 defaults.swipeUp.call($this,event, direction, distance);
341 break;
342
343 case DOWN :
344 if (defaults.swipeDown)
345 defaults.swipeDown.call($this,event, direction, distance);
346 break;
347 }
348 }
349 }
350
351
352 /**
353 * Checks direction of the swipe and the value allowPageScroll to see if we should allow or prevent the default behaviour from occurring.
354 * This will essentially allow page scrolling or not when the user is swiping on a touchSwipe object.
355 */
356 function validateDefaultEvent(event, direction)
357 {
358 if( defaults.allowPageScroll==NONE )
359 {
360 event.preventDefault();
361 }
362 else
363 {
364 var auto=defaults.allowPageScroll==AUTO;
365
366 switch(direction)
367 {
368 case LEFT :
369 if ( (defaults.swipeLeft && auto) || (!auto && defaults.allowPageScroll!=HORIZONTAL))
370 event.preventDefault();
371 break;
372
373 case RIGHT :
374 if ( (defaults.swipeRight && auto) || (!auto && defaults.allowPageScroll!=HORIZONTAL))
375 event.preventDefault();
376 break;
377
378 case UP :
379 if ( (defaults.swipeUp && auto) || (!auto && defaults.allowPageScroll!=VERTICAL))
380 event.preventDefault();
381 break;
382
383 case DOWN :
384 if ( (defaults.swipeDown && auto) || (!auto && defaults.allowPageScroll!=VERTICAL))
385 event.preventDefault();
386 break;
387 }
388 }
389
390 }
391
392
393
394 /**
395 * Calcualte the length / distance of the swipe
396 */
397 function caluculateDistance()
398 {
399 //return Math.round(Math.sqrt(Math.pow(end.x - start.x,2) + Math.pow(end.y - start.y,2)));
400 return Math.round(Math.abs(end.x - start.x));
401 }
402
403 /**
404 * Calcualte the angle of the swipe
405 */
406 function caluculateAngle()
407 {
408 var X = start.x-end.x;
409 var Y = end.y-start.y;
410 var r = Math.atan2(Y,X); //radians
411 var angle = Math.round(r*180/Math.PI); //degrees
412
413 //ensure value is positive
414 if (angle < 0)
415 angle = 360 - Math.abs(angle);
416
417 return angle;
418 }
419
420 /**
421 * Calcualte the direction of the swipe
422 * This will also call caluculateAngle to get the latest angle of swipe
423 */
424 function caluculateDirection()
425 {
426 var angle = caluculateAngle();
427
428 if ( (angle <= 45) && (angle >= 0) )
429 return LEFT;
430
431 else if ( (angle <= 360) && (angle >= 315) )
432 return LEFT;
433
434 else if ( (angle >= 135) && (angle <= 225) )
435 return RIGHT;
436
437 else if ( (angle > 45) && (angle < 135) )
438 return DOWN;
439
440 else
441 return UP;
442 }
443
444 // added by codrops
445 function calculateDirection()
446 {
447 var dir;
448 if( end.x < lastPositionX ) {
449 dir = LEFT
450 }
451 else if( end.x > lastPositionX ) {
452 dir = RIGHT;
453 }
454 else {
455 dir = UP
456 }
457 return dir;
458 }
459
460 // Add gestures to all swipable areas if supported
461 try
462 {
463
464 this.addEventListener(START_EV, touchStart, false);
465 this.addEventListener(CANCEL_EV, touchCancel);
466 }
467 catch(e)
468 {
469 //touch not supported
470 }
471
472 });
473 };
474
475
476
477
478})(jQuery);
diff --git a/Blocks/Flipboard/js/modernizr.custom.08464.js b/Blocks/Flipboard/js/modernizr.custom.08464.js
new file mode 100644
index 0000000..5325668
--- /dev/null
+++ b/Blocks/Flipboard/js/modernizr.custom.08464.js
@@ -0,0 +1,4 @@
1/* Modernizr 2.5.3 (Custom Build) | MIT & BSD
2 * Build: http://www.modernizr.com/download/#-csstransforms3d-csstransitions-shiv-cssclasses-teststyles-testprop-testallprops-prefixes-domprefixes-load
3 */
4;window.Modernizr=function(a,b,c){function z(a){j.cssText=a}function A(a,b){return z(m.join(a+";")+(b||""))}function B(a,b){return typeof a===b}function C(a,b){return!!~(""+a).indexOf(b)}function D(a,b){for(var d in a)if(j[a[d]]!==c)return b=="pfx"?a[d]:!0;return!1}function E(a,b,d){for(var e in a){var f=b[a[e]];if(f!==c)return d===!1?a[e]:B(f,"function")?f.bind(d||b):f}return!1}function F(a,b,c){var d=a.charAt(0).toUpperCase()+a.substr(1),e=(a+" "+o.join(d+" ")+d).split(" ");return B(b,"string")||B(b,"undefined")?D(e,b):(e=(a+" "+p.join(d+" ")+d).split(" "),E(e,b,c))}var d="2.5.3",e={},f=!0,g=b.documentElement,h="modernizr",i=b.createElement(h),j=i.style,k,l={}.toString,m=" -webkit- -moz- -o- -ms- ".split(" "),n="Webkit Moz O ms",o=n.split(" "),p=n.toLowerCase().split(" "),q={},r={},s={},t=[],u=t.slice,v,w=function(a,c,d,e){var f,i,j,k=b.createElement("div"),l=b.body,m=l?l:b.createElement("body");if(parseInt(d,10))while(d--)j=b.createElement("div"),j.id=e?e[d]:h+(d+1),k.appendChild(j);return f=["&#173;","<style>",a,"</style>"].join(""),k.id=h,(l?k:m).innerHTML+=f,m.appendChild(k),l||(m.style.background="",g.appendChild(m)),i=c(k,a),l?k.parentNode.removeChild(k):m.parentNode.removeChild(m),!!i},x={}.hasOwnProperty,y;!B(x,"undefined")&&!B(x.call,"undefined")?y=function(a,b){return x.call(a,b)}:y=function(a,b){return b in a&&B(a.constructor.prototype[b],"undefined")},Function.prototype.bind||(Function.prototype.bind=function(b){var c=this;if(typeof c!="function")throw new TypeError;var d=u.call(arguments,1),e=function(){if(this instanceof e){var a=function(){};a.prototype=c.prototype;var f=new a,g=c.apply(f,d.concat(u.call(arguments)));return Object(g)===g?g:f}return c.apply(b,d.concat(u.call(arguments)))};return e});var G=function(a,c){var d=a.join(""),f=c.length;w(d,function(a,c){var d=b.styleSheets[b.styleSheets.length-1],g=d?d.cssRules&&d.cssRules[0]?d.cssRules[0].cssText:d.cssText||"":"",h=a.childNodes,i={};while(f--)i[h[f].id]=h[f];e.csstransforms3d=(i.csstransforms3d&&i.csstransforms3d.offsetLeft)===9&&i.csstransforms3d.offsetHeight===3},f,c)}([,["@media (",m.join("transform-3d),("),h,")","{#csstransforms3d{left:9px;position:absolute;height:3px;}}"].join("")],[,"csstransforms3d"]);q.csstransforms3d=function(){var a=!!F("perspective");return a&&"webkitPerspective"in g.style&&(a=e.csstransforms3d),a},q.csstransitions=function(){return F("transition")};for(var H in q)y(q,H)&&(v=H.toLowerCase(),e[v]=q[H](),t.push((e[v]?"":"no-")+v));return z(""),i=k=null,function(a,b){function g(a,b){var c=a.createElement("p"),d=a.getElementsByTagName("head")[0]||a.documentElement;return c.innerHTML="x<style>"+b+"</style>",d.insertBefore(c.lastChild,d.firstChild)}function h(){var a=k.elements;return typeof a=="string"?a.split(" "):a}function i(a){var b={},c=a.createElement,e=a.createDocumentFragment,f=e();a.createElement=function(a){var e=(b[a]||(b[a]=c(a))).cloneNode();return k.shivMethods&&e.canHaveChildren&&!d.test(a)?f.appendChild(e):e},a.createDocumentFragment=Function("h,f","return function(){var n=f.cloneNode(),c=n.createElement;h.shivMethods&&("+h().join().replace(/\w+/g,function(a){return b[a]=c(a),f.createElement(a),'c("'+a+'")'})+");return n}")(k,f)}function j(a){var b;return a.documentShived?a:(k.shivCSS&&!e&&(b=!!g(a,"article,aside,details,figcaption,figure,footer,header,hgroup,nav,section{display:block}audio{display:none}canvas,video{display:inline-block;*display:inline;*zoom:1}[hidden]{display:none}audio[controls]{display:inline-block;*display:inline;*zoom:1}mark{background:#FF0;color:#000}")),f||(b=!i(a)),b&&(a.documentShived=b),a)}var c=a.html5||{},d=/^<|^(?:button|form|map|select|textarea)$/i,e,f;(function(){var a=b.createElement("a");a.innerHTML="<xyz></xyz>",e="hidden"in a,f=a.childNodes.length==1||function(){try{b.createElement("a")}catch(a){return!0}var c=b.createDocumentFragment();return typeof c.cloneNode=="undefined"||typeof c.createDocumentFragment=="undefined"||typeof c.createElement=="undefined"}()})();var k={elements:c.elements||"abbr article aside audio bdi canvas data datalist details figcaption figure footer header hgroup mark meter nav output progress section summary time video",shivCSS:c.shivCSS!==!1,shivMethods:c.shivMethods!==!1,type:"default",shivDocument:j};a.html5=k,j(b)}(this,b),e._version=d,e._prefixes=m,e._domPrefixes=p,e._cssomPrefixes=o,e.testProp=function(a){return D([a])},e.testAllProps=F,e.testStyles=w,g.className=g.className.replace(/(^|\s)no-js(\s|$)/,"$1$2")+(f?" js "+t.join(" "):""),e}(this,this.document),function(a,b,c){function d(a){return o.call(a)=="[object Function]"}function e(a){return typeof a=="string"}function f(){}function g(a){return!a||a=="loaded"||a=="complete"||a=="uninitialized"}function h(){var a=p.shift();q=1,a?a.t?m(function(){(a.t=="c"?B.injectCss:B.injectJs)(a.s,0,a.a,a.x,a.e,1)},0):(a(),h()):q=0}function i(a,c,d,e,f,i,j){function k(b){if(!o&&g(l.readyState)&&(u.r=o=1,!q&&h(),l.onload=l.onreadystatechange=null,b)){a!="img"&&m(function(){t.removeChild(l)},50);for(var d in y[c])y[c].hasOwnProperty(d)&&y[c][d].onload()}}var j=j||B.errorTimeout,l={},o=0,r=0,u={t:d,s:c,e:f,a:i,x:j};y[c]===1&&(r=1,y[c]=[],l=b.createElement(a)),a=="object"?l.data=c:(l.src=c,l.type=a),l.width=l.height="0",l.onerror=l.onload=l.onreadystatechange=function(){k.call(this,r)},p.splice(e,0,u),a!="img"&&(r||y[c]===2?(t.insertBefore(l,s?null:n),m(k,j)):y[c].push(l))}function j(a,b,c,d,f){return q=0,b=b||"j",e(a)?i(b=="c"?v:u,a,b,this.i++,c,d,f):(p.splice(this.i++,0,a),p.length==1&&h()),this}function k(){var a=B;return a.loader={load:j,i:0},a}var l=b.documentElement,m=a.setTimeout,n=b.getElementsByTagName("script")[0],o={}.toString,p=[],q=0,r="MozAppearance"in l.style,s=r&&!!b.createRange().compareNode,t=s?l:n.parentNode,l=a.opera&&o.call(a.opera)=="[object Opera]",l=!!b.attachEvent&&!l,u=r?"object":l?"script":"img",v=l?"script":u,w=Array.isArray||function(a){return o.call(a)=="[object Array]"},x=[],y={},z={timeout:function(a,b){return b.length&&(a.timeout=b[0]),a}},A,B;B=function(a){function b(a){var a=a.split("!"),b=x.length,c=a.pop(),d=a.length,c={url:c,origUrl:c,prefixes:a},e,f,g;for(f=0;f<d;f++)g=a[f].split("="),(e=z[g.shift()])&&(c=e(c,g));for(f=0;f<b;f++)c=x[f](c);return c}function g(a,e,f,g,i){var j=b(a),l=j.autoCallback;j.url.split(".").pop().split("?").shift(),j.bypass||(e&&(e=d(e)?e:e[a]||e[g]||e[a.split("/").pop().split("?")[0]]||h),j.instead?j.instead(a,e,f,g,i):(y[j.url]?j.noexec=!0:y[j.url]=1,f.load(j.url,j.forceCSS||!j.forceJS&&"css"==j.url.split(".").pop().split("?").shift()?"c":c,j.noexec,j.attrs,j.timeout),(d(e)||d(l))&&f.load(function(){k(),e&&e(j.origUrl,i,g),l&&l(j.origUrl,i,g),y[j.url]=2})))}function i(a,b){function c(a,c){if(a){if(e(a))c||(j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}),g(a,j,b,0,h);else if(Object(a)===a)for(n in m=function(){var b=0,c;for(c in a)a.hasOwnProperty(c)&&b++;return b}(),a)a.hasOwnProperty(n)&&(!c&&!--m&&(d(j)?j=function(){var a=[].slice.call(arguments);k.apply(this,a),l()}:j[n]=function(a){return function(){var b=[].slice.call(arguments);a&&a.apply(this,b),l()}}(k[n])),g(a[n],j,b,n,h))}else!c&&l()}var h=!!a.test,i=a.load||a.both,j=a.callback||f,k=j,l=a.complete||f,m,n;c(h?a.yep:a.nope,!!i),i&&c(i)}var j,l,m=this.yepnope.loader;if(e(a))g(a,0,m,0);else if(w(a))for(j=0;j<a.length;j++)l=a[j],e(l)?g(l,0,m,0):w(l)?B(l):Object(l)===l&&i(l,m);else Object(a)===a&&i(a,m)},B.addPrefix=function(a,b){z[a]=b},B.addFilter=function(a){x.push(a)},B.errorTimeout=1e4,b.readyState==null&&b.addEventListener&&(b.readyState="loading",b.addEventListener("DOMContentLoaded",A=function(){b.removeEventListener("DOMContentLoaded",A,0),b.readyState="complete"},0)),a.yepnope=k(),a.yepnope.executeStack=h,a.yepnope.injectJs=function(a,c,d,e,i,j){var k=b.createElement("script"),l,o,e=e||B.errorTimeout;k.src=a;for(o in d)k.setAttribute(o,d[o]);c=j?h:c||f,k.onreadystatechange=k.onload=function(){!l&&g(k.readyState)&&(l=1,c(),k.onload=k.onreadystatechange=null)},m(function(){l||(l=1,c(1))},e),i?k.onload():n.parentNode.insertBefore(k,n)},a.yepnope.injectCss=function(a,c,d,e,g,i){var e=b.createElement("link"),j,c=i?h:c||f;e.href=a,e.rel="stylesheet",e.type="text/css";for(j in d)e.setAttribute(j,d[j]);g||(n.parentNode.insertBefore(e,n),m(c,0))}}(this,document),Modernizr.load=function(){yepnope.apply(window,[].slice.call(arguments,0))}; \ No newline at end of file
Powered by cgit v1.2.3 (git 2.41.0)