PortableMag/index-old.html
Alex A. Naanou b67505dbc0 fixed index-old.html (went out of sync with changes)...
Signed-off-by: Alex A. Naanou <alex.nanou@gmail.com>
2013-03-18 13:54:26 +04:00

1125 lines
47 KiB
HTML
Executable File
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!-- XXX for some reason a doctype kills the layout, need to investigate -->
<!--DOCTYPE html-->
<html>
<head>
<title>PortableMag</title>
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
<link rel="stylesheet" href="css/magazine.css">
<link rel="stylesheet" href="css/magazine-themes.css">
<link rel="stylesheet" href="css/magazine-custom.css">
<link rel="stylesheet" href="css/magazine-editor.css">
<script src="ext-lib/jquery.js"></script>
<script src="ext-lib/jquery.touchSwipe.js"></script>
<script src="ext-lib/jstorage.js"></script>
<script src="ext-lib/spin.js"></script>
<script src="ext-lib/jquery.spin.js"></script>
<!-- zip functionality -->
<script src="ext-lib/jszip.js"></script>
<script src="ext-lib/jszip-load.js"></script>
<script src="ext-lib/jszip-inflate.js"></script>
<!--script src="ext-lib\jszip-deflate.js"></script-->
<!-- EXPERIMENTAL -->
<!--
XXX scrollTo is a cool and a powerfull tool but it needs a sustantial code reorganization
this might be a good idea/exersize sometime in the future...
-->
<!--script src="ext-lib/jquery.scrollto.js"></script-->
<script src="lib/jli.js"></script>
<script src="lib/keyboard.js"></script>
<script src="magazine.js"></script>
<script src="navigator.js"></script>
<script src="editor.js"></script>
<!-- configuration, keep this last... -->
<script src="platform.js"></script>
<script src="keybindings.js"></script>
<script src="config.js"></script>
<script>
var DEBUG = true
$(document).ready(function(){
if(DEBUG){
$('.splash').click(function(){
$('.splash').fadeOut()
})
}
$(window)
.resize(viewResizeHandler)
.bind('hashchange', hashChangeHandler)
$(document)
.keydown(makeKeyboardHandler(keybindings))
$('.viewer')
// setup internal events...
.on('pageChanged bookmarkAdded bookmarkRemoved bookmarksCleared', saveState)
.on('pageChanged', updatePageNumberIndicator)
.on('magazineDataLoaded', loadMagazineChrome)
// user interactions...
.swipe({
swipeStatus: makeSwipeHandler(),
// XXX these get called instead of pinches...
swipeUp: function(event, direction, distance, duration, fingerCount){
if(fingerCount == 2){
toggleBookmark()
} else {
togglePageView()
}
},
// XXX these get called instead of pinches...
swipeDown: function(event, direction, distance, duration, fingerCount){
if(fingerCount == 2){
toggleBookmark()
} else {
togglePageView()
}
},
// XXX for some reasons these lose the competition with swipes...
pinchIn: function(event, direction, distance, duration, fingerCount, pinchZoom) {
if(pinchZoom < distance){
return
}
if(fingerCount == 2){
togglePageView('on')
}
},
// XXX for some reasons these lose the competition with swipes...
pinchOut: function(event, direction, distance, duration, fingerCount, pinchZoom) {
if(pinchZoom < distance){
return
}
if(fingerCount == 2){
togglePageView('off')
}
},
// XXX for some reason this deos not bubble up the nested elements...
// XXX just stopped working....
// ...works if we double click but not on a single click...
click: function(evt, elem){
elem = $(elem)
// bubble up to nearest page...
if(!elem.hasClass('page')
&& elem.parents('.page').length != 0){
elem = elem.parents('.page').first()
}
// click current page to toggle full page view...
if(elem.hasClass('current', 'page')
&& togglePageView('?') == 'off'){
togglePageView('on')
// click any page to set it to current...
} else if(elem.hasClass('page')){
setCurrentPage(elem)
}
return true
},
excludedElements: $.fn.swipe.defaults.excludedElements + ', [contenteditable=true]',
fingers: $.fn.swipe.fingers.ALL
//fingers: $.fn.swipe.fingers.THREE
})
// load state and setup everything that depends on it...
// XXX load the data with loadJSON()
loadState()
// need to call this once per whole page load....
setupNavigator()
// XXX STUB, needed untill we load everything frim JSON...
$('.viewer').trigger('magazineDataLoaded')
// set default view...
togglePageView('on')
// hide the splash screen...
$(window).one('webkitTransitionEnd oTransitionEnd msTransitionEnd transitionend',
function(){
// NOTE: this will fix a bug on android -- the pages appear
// to rendering quite a bit longer than loading, so on
// loadState() above the current page is set well before
// it is alligned correctly, so this will reset the
// current page after everything is aligned...
setTimeout(function(){
//updateView()
setCurrentPage()
}, 300)
// hide the splash...
setTimeout(function(){
$('.splash').fadeOut()
}, 350)
// remove the spinner...
setTimeout(function(){
$('#spinner').spin(false)
}, 500)
})
})
</script>
</head>
<body>
<div class="viewer dark-viewer">
<!-- Splash screen -->
<div class="splash noSwipe">
<!-- XXX replace this with a background-image logo... -->
<table width="100%" height="100%"><tr><td align="center" valign="middle">
<!--h2><div id="spinner" style="position:relative; display:inline-block; width:50px; height:50px; vertical-align:middle;"></div><i>loading...</i></h2-->
<div id="spinner" style="position:relative; display:inline-block; width:50px; height:50px; vertical-align:middle;"></div>
<script>
// add a spinner to the splash...
var opts = {
lines: 11, // The number of lines to draw
length: 6, // The length of each line
width: 4, // The line thickness
radius: 8, // The radius of the inner circle
corners: 1, // Corner roundness (0..1)
rotate: 0, // The rotation offset
color: $('.splash #spinner').css('color'), // #rgb or #rrggbb
speed: 1, // Rounds per second
trail: 64, // Afterglow percentage
shadow: false, // Whether to render a shadow
hwaccel: true, // Whether to use hardware acceleration
className: 'spinner', // The CSS class to assign to the spinner
zIndex: 2e9, // The z-index (defaults to 2000000000)
top: 'auto', // Top position relative to parent in px
left: 'auto' // Left position relative to parent in px
}
$('#spinner').spin(opts)
</script>
</td></tr></table>
</div>
<!-- Toolbars -->
<!--div class="left-toolbar">
<svg id="new-magazine" width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>New Magazine</title>
<g id="svg_47">
<g id="svg_33">
<g id="svg_34">
<circle fill="#000000" stroke="#ffffff" fill-opacity="0" cx="28.671385" cy="30.356987" r="7.062921" id="svg_35"/>
<text fill="#ffffff" stroke="#000000" stroke-width="0" x="28.820414" y="36.240832" font-size="18" font-family="serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_36">+</text>
</g>
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m22.8386,34.497002l-13.95876,0.052097l-0.06013,-28.683099l24.052891,0l-0.060101,18.821401" id="svg_37"/>
</g>
<text fill="#ffffff" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="15.923339" y="17.539691" font-size="12" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_38">M</text>
</g>
</g>
</svg>
<hr>
<div>
<svg id="new-article" width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>New Article</title>
<g id="svg_48">
<g id="svg_26">
<g id="svg_27">
<circle fill="#000000" stroke="#ffffff" fill-opacity="0" cx="28.671385" cy="30.356987" r="7.062921" id="svg_28"/>
<text fill="#ffffff" stroke="#000000" stroke-width="0" x="28.820414" y="36.240832" font-size="18" font-family="serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_29">+</text>
</g>
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m22.83856,34.49699l-13.95872,0.052139l-0.06013,-28.683129l24.052921,0l-0.06015,18.82142" id="svg_30"/>
</g>
<text fill="#ffffff" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="15.68281" y="17.539691" font-size="12" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_31">A</text>
</g>
</g>
</svg>
<svg id="shift-article-left" width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Shift Article Left</title>
<g id="svg_76">
<g id="svg_70">
<g id="svg_71">
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m28.62114,34.492649l-19.73146,0.052151l-0.06013,-28.68306l24.052919,0l-0.000019,17.438419" id="svg_72"/>
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m32.840248,24.30155l0.05212,10.154291l-1.082369,0.060139" id="svg_73"/>
</g>
<path d="m30.587009,30.33219l-4.3314,-7.037199l2.8526,0l4.331209,7.037199l-4.331209,7.037241l-2.8526,0l4.3314,-7.037241z" fill-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="#000000" stroke="#ffffff" transform="rotate(180 29.8475 30.3322)" id="svg_74"/>
</g>
<text fill="#ffffff" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="15.692654" y="17.535428" font-size="12" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_75">A</text>
</g>
</g>
</svg>
<svg id="shift-article-right" width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Shift Article Right</title>
<g id="svg_89">
<g id="svg_85">
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m29.583229,34.612888l-20.693559,-0.007988l-0.06013,-28.6831l24.052921,0l-0.000023,20.86595" id="svg_86"/>
<path d="m32.27066,30.392269l-4.33132,-7.037249l2.852549,0l4.33123,7.037249l-4.33123,7.03727l-2.852549,0l4.33132,-7.03727z" fill-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="#000000" stroke="#ffffff" id="svg_87"/>
</g>
<text fill="#ffffff" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="15.692638" y="17.595492" font-size="12" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_88">A</text>
</g>
</g>
</svg>
</div>
<hr>
<div>
<svg id="new-page" width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>New Page</title>
<g id="svg_24">
<g id="svg_16">
<g id="svg_9">
<circle fill="#000000" stroke="#ffffff" fill-opacity="0" cx="28.691122" cy="30.383944" r="7.062921" id="svg_7"/>
<text fill="#ffffff" stroke="#000000" stroke-width="0" x="28.840151" y="36.267789" id="svg_8" font-size="18" font-family="serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0">+</text>
</g>
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m22.85829,34.523949l-13.95871,0.052132l-0.06013,-28.68312l24.05293,0l-0.06015,18.82142" id="svg_15"/>
</g>
<text fill="#ffffff" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="15.281621" y="17.566648" id="svg_17" font-size="12" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0">P</text>
</g>
</g>
</svg>
<svg id="shift-page-left" width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Shift Page Left</title>
<g id="svg_68">
<g id="svg_67">
<g id="svg_66">
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m28.621111,34.492619l-19.731441,0.052151l-0.06013,-28.683099l24.052921,0l-0.000011,17.4384" id="svg_61"/>
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m32.840248,24.30146l0.05212,10.15435l-1.082397,0.060131" id="svg_65"/>
</g>
<path d="m30.586981,30.3321l-4.3314,-7.037199l2.852598,0l4.331251,7.037199l-4.331251,7.0373l-2.852598,0l4.3314,-7.0373z" fill-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="#000000" stroke="#ffffff" id="svg_62" transform="rotate(180 29.8475 30.3321)"/>
</g>
<text fill="#ffffff" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="15.271712" y="17.535359" font-size="12" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_63">P</text>
</g>
</g>
</svg>
<svg id="shift-page-right" width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Shift Page Right</title>
<g id="svg_58">
<g id="svg_57">
<path fill="none" stroke="#ffffff" stroke-width="null" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" d="m29.57338,34.557121l-20.69354,-0.007992l-0.06013,-28.683129l24.052929,0l-0.000019,20.86593" id="svg_54"/>
<path d="m32.260818,30.336451l-4.331329,-7.037251l2.852551,0l4.331299,7.037251l-4.331299,7.037321l-2.852551,0l4.331329,-7.037321z" fill-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="#000000" id="svg_56" stroke="#ffffff"/>
</g>
<text fill="#ffffff" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="15.261884" y="17.539691" font-size="12" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" id="svg_55">P</text>
</g>
</g>
</svg>
</div>
</div-->
<div class="top-toolbar">
<div class="left-set">
<div class="button title"><a href="#home" class="magazine-title-text">Magazine Title</a></div>
</div>
<div class="right-set">
<div class="button prev-bookmark">
<a href="#prevBookmark">
<svg width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Previous bookmark (S-Left)</title>
<path transform="rotate(-180 18.9697 20.1122)" id="svg_13" stroke="#ffffff" d="m20.467497,20.112247l-8.773763,-14.254913l5.778195,0l8.773788,14.254913l-8.773788,14.25491l-5.778195,0l8.773763,-14.25491z" fill-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="#afafaf"/>
</g>
</svg>
</a>
</div>
<div class="button toggle-bookmark">
<a href="#bookmark">
<svg width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Toggle bookmark (B)</title>
<rect stroke="#ffffff" id="svg_1" height="28.604868" width="24.052915" y="5.858955" x="8.807377" fill-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="#afafaf"/>
<path stroke="#ffffff" id="svg_4" d="m21.762226,3.651895l8.416584,0l0,14.510554l-4.124887,-2.792193l-4.291697,2.792193l0,-14.510554l0,0z" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" fill="#ff0000"/>
</g>
</svg>
</a>
</div>
<div class="button next-bookmark">
<a href="#nextBookmark">
<svg width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Next bookmark (S-Right)</title>
<path stroke="#ffffff" id="svg_11" d="m23.175751,20.132858l-8.773797,-14.254913l5.77823,0l8.773788,14.254913l-8.773788,14.254913l-5.77823,0l8.773797,-14.254913z" fill-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="#afafaf"/>
</g>
</svg>
</a>
</div>
<div class="button info">
<a href="javascript:alert('not implemented yet...')">
<svg width="40" height="40" xmlns="http://www.w3.org/2000/svg">
<g>
<title>Info</title>
<g id="svg_6">
<circle fill="#000000" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" cx="20.762543" cy="20.120354" r="14.302816" id="svg_2" stroke="#ffffff"/>
<text fill="#ffffff" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="21.029904" y="21.833322" id="svg_5" font-size="24" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" stroke-opacity="0" transform="matrix(0.894143 0 0 0.894143 1.91526 8.19192)" stroke="#000000">i</text>
</g>
</g>
</svg>
</a>
</div>
</div>
</div>
<div class="bottom-toolbar">
<!-- this is just an example-->
<div class="controls">
<a href="#home" title="(Home)">Cover</a>
<a href="#prevBookmark" title="(S-Left)">&lt; Bookmark</a>
<a href="#prevArticle" title="(C-Left)">&lt; Article</a>
<a href="#prev" title="Previous page (Left)">&lt; Pa</a><a href="#next" title="Next page (Right)">ge &gt;</a>
<a href="#nextArticle" title="(C-Right)">Article &gt;</a>
<a href="#nextBookmark" title="(S-Right)">Bookmark &gt;</a>
<a href="#end" title="(End)">End</a>
</div>
<!-- position indicator -->
<div class="navigator">
<div class="bar">
<div class="indicator"></div>
</div>
</div>
<div class="page-number">0/0</div>
</div>
<div class="scaler">
<div class="aligner">
<div class="magazine" name="PortableMag">
<div class="cover page current">
<div class="content">
<!--h1 style="color:gray;font-size:125px;margin-bottom:-35px; margin-top: 160px">PortableMag</h1>
<h1 style="color:silver; font-size: 20px; margin-left:10px">A suit for publishing portable periodic magazines on mobile platforms.</h1-->
<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg">
<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
<g>
<title>PortableMag cover</title>
<defs>
<path id="circle_path" d="m177.720383,238.333344c0,-82.290771 66.655533,-148.946304 148.946304,-148.946304c82.290771,0 148.946289,66.655533 148.946289,148.946304c0,82.290771 -66.655518,148.946289 -148.946289,148.946289c-82.290771,0 -148.946304,-66.655518 -148.946304,-148.946289z"/>
</defs>
<text fill="#7f7f7f" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="306" y="434.33334" id="svg_2" font-size="15" font-family="Arial" text-anchor="middle" xml:space="preserve"/>
<g id="svg_1">
<g id="svg_8">
<text stroke="#000000" fill="#7f7f7f" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="224.898504" y="309.870464" id="svg_6" font-size="24" font-family="Arial" text-anchor="middle" xml:space="preserve" font-weight="bold" transform="matrix(5.71749 0 0 5.71749 -632.211 -1442.56)">Mag</text>
<text stroke="#000000" fill="#a8a8a8" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="156.581224" y="309.650884" id="svg_7" font-size="24" font-family="Arial" text-anchor="middle" xml:space="preserve" transform="matrix(5.71749 0 0 5.71749 -632.211 -1442.56)">Portable</text>
</g>
<text stroke="#000000" fill="#afafaf" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="261.526111" y="338.824173" id="svg_4" font-size="15" font-family="Arial" text-anchor="middle" xml:space="preserve" transform="matrix(1.53525 0 0 1.53525 -34.4106 -167.936)" font-weight="normal" font-style="normal">A suit for publishing portable periodic magazines on mobile platforms.</text>
</g>
</g>
</svg>
<!-- if you do not want a page number just do not include it... -->
<!--div class="page-number-text">[PAGE NUMBER]</div-->
</div>
</div>
<!-- XXX do we need a Magazine Credits page??? -->
<div class="article">
<div class="cover page">
<div class="content">
<h1 name="basics" style="color:gray;font-size:100px;">The Basics...</h1>
<big>
<h2>Main features</h2>
<ul>
<li>Magazines, Covers, Articles and Pages, fully navigable
<li>Three main views: <i style="color:silver">Magazine (under development)</i> Page and Ribbon
<li>Fully linkable structure
<li>Full intuitive Gesture, Mouse or Keyboard navigation
<li>Special #URLs enable full link-based navigation and control
<li>Bookmarks and bookmark navigation
<li>Intuitive navigator widget
<li>Portable to most mobile platforms including: Apple iOS, Android, Windows Phone 7/8, BlackBery, HP webOS and more.
<li>Standalone on main desktop operating systems, including Apple MacOS X and Microsoft Windows
<li>Based on popular, open and easy to learn and use standards (HTML5 layout, SVG vector graphics)
<i style="color: silver">
<li>Usable from the web (support for engines other than WebKit not here yet)
<li>Integrated Editor (under development)
<li>Integrated publishing framework (under development)
</i>
</ul>
</big>
<div style="position:absolute; bottom:10px; right:30px">
<a href="#next">get started...</a><br>
</div>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page">
<div class="content">
<h1 name="navigation">PortableMag Navigation and Linking</h1>
<div style="float:left; width: 40%; height: 100%; margin: 10px;">
<h2>Finger controls</h2>
<ul>
<li> Single finger swipe left/right &ndash; prev/next page.
<li> Two finger swipe left/right &ndash; prev/next article.
<li> Single finger swipe up/down &ndash; toggle thumbnail view.
<li> Pinch in/out &ndash; go in/out of thumbnail view.
</ul>
<h2>Navigation via #URLs</h2>
<h3>The basics</h3>
<a href="#1">Page #1</a><br>
<a href="#ArticleAnchorExample">Named page</a><br>
<p>
<s><a href="#page-3-anchor" style="pointer-events:none">Anchor on page #3</a></s><br>
<i> currently navigation via existing anchors
will break the layout, so use the name attribute
on any other tags (see example).
</i>
</p>
</div>
<div style="float:left; width: 40%; height: 100%; padding: 10px;">
<h3>Special anchors</h3>
<p>These show up in the page URL</p>
<a href="#home">Magazine cover</a><br>
<a href="#end">Last page</a><br>
<a href="#thumbnails">Thumbnail view</a><br>
<a href="#example-layer">Toggle a hidden layer</a><br>
<span name="example-layer" class="hidden">
<a href="#hideLayers">Hide all layers</a><br>
</span>
<a href="#bookmark">Toggle bookmark</a><br>
<h3>Relative special anchors</h3>
<p>These will get replaced by corresponding page numbers in the URL</p>
<a href="#next">Next page</a><br>
<a href="#prev">Previous page</a><br>
<a href="#nextArticle">Next article</a><br>
<a href="#prevArticle">Previous article</a><br>
<h3>History support</h3>
<i>NOTE: this is still a bit flaky...</i><br>
<a href="#back">Go back</a><br>
<a href="#forward">Go forward</a><br>
</div>
<div style="position:absolute; right: 30px; bottom:10px;">
<a href="#config">configuration demo</a> <a href="#next">next page...</a><br>
</div>
<div name="example-layer" class="hidden" onclick="window.location='#example-layer'" style="position:absolute; left:450px; top:250px; width: 300px; height:50px; text-align: center; padding: 15px; border: solid gray 5px; background: white; color: gray; cursor: hand; opacity: 0.8">
<h3>This is an example layer</h3>
<i>click or tap to hide</i>
</div>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<!-- XXX do we need an Article Credits page??? -->
<div class="page">
<div class="content">
<svg width="800" height="600" xmlns="http://www.w3.org/2000/svg">
<!-- Created with SVG-edit - http://svg-edit.googlecode.com/ -->
<defs>
<marker refY="50" refX="50" markerHeight="5" markerWidth="5" viewBox="0 0 100 100" orient="auto" markerUnits="strokeWidth" id="se_marker_start_svg_36">
<path stroke-width="10" stroke="#000000" fill="#000000" d="m0,50l100,40l-30,-40l30,-40l-100,40z" id="svg_3"/>
</marker>
<marker refY="50" refX="50" markerHeight="5" markerWidth="5" viewBox="0 0 100 100" orient="auto" markerUnits="strokeWidth" id="se_marker_start_svg_37">
<path stroke-width="10" stroke="#000000" fill="#000000" d="m0,50l100,40l-30,-40l30,-40l-100,40z" id="svg_8"/>
</marker>
</defs>
<title>PortableMag Anatomy</title>
<g>
<title>Layer 1</title>
<text fill="#000000" stroke="#000000" stroke-width="0" x="199" y="56.33334" id="svg_1" font-size="32" font-family="Sans-serif" text-anchor="middle" xml:space="preserve" font-weight="bold">PortableMag Anatomy</text>
<path id="svg_34" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="2" stroke="#000000" fill="none"/>
<g id="svg_30">
<g id="svg_2">
<path stroke="#000000" fill="#000000" fill-opacity="0" d="m78.166656,117.166718l675.000092,0l0,123.000031l-675.000092,0" transform="rotate(180 415.667 178.667)" id="svg_12"/>
<rect fill="#ffffff" stroke-width="2" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="87" y="132" width="130" height="100" stroke="#000000" id="svg_13"/>
<rect stroke="#000000" fill="#000000" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" fill-opacity="0" x="223" y="132" width="415.00001" height="100" id="svg_14"/>
<text stroke-opacity="0" fill="#000000" stroke="#000000" stroke-width="0" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="152" y="187.5" id="svg_24" font-size="14" font-family="Sans-serif" text-anchor="middle" xml:space="preserve">Magazine cover</text>
<rect stroke="#000000" id="svg_7" fill="#ffffff" stroke-width="2" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="229.66666" y="138.66667" width="130" height="86"/>
<text stroke-opacity="0" xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="14" id="svg_4" y="187" x="294.83334" stroke-width="0" stroke="#000000" fill="#000000">Article Cover</text>
<rect id="svg_15" stroke="#000000" fill="#e5e5e5" stroke-width="2" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="365.66667" y="138.66668" width="130" height="86"/>
<text stroke-opacity="0" xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="14" id="svg_5" y="187.00003" x="430.83337" stroke-width="0" stroke="#000000" fill="#000000">Page</text>
<rect id="svg_16" stroke="#000000" fill="#e5e5e5" stroke-width="2" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="501.66665" y="138.66666" width="130" height="86"/>
<text id="svg_6" stroke-opacity="0" xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="14" y="186.66667" x="567.00001" stroke-width="0" stroke="#000000" fill="#000000">Page</text>
<path stroke="#000000" id="svg_17" fill="#bfbfbf" d="m646.167236,132.167267l105,0l0,99.000031l-105,0" transform="rotate(180 698.667 181.667)"/>
<text stroke-opacity="0" xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="14" id="svg_25" y="187.00063" x="709.66669" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Next Article</text>
<text xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="10" id="svg_26" y="113.33334" x="98.66669" stroke-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Magazine</text>
<text xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="9" id="svg_27" y="129.33334" x="236.16669" stroke-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Article</text>
</g>
<g id="svg_29">
<g id="svg_11">
<rect stroke="#000000" fill="#cccccc" stroke-width="2" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="273" y="295" width="322.99999" height="180" id="svg_20"/>
<rect stroke="#000000" fill="#ffffff" stroke-width="2" stroke-dasharray="null" stroke-linejoin="null" stroke-linecap="null" x="324.5" y="300.38461" width="220" height="169.23077" id="svg_21"/>
<text xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="18" id="svg_10" y="289.33334" x="292.66669" stroke-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Page</text>
<g id="svg_19">
<text stroke-opacity="0" xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="18" id="svg_9" y="381.83334" x="434.16669" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">Page Content</text>
<text xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="14" id="svg_18" y="400.83334" x="433.66669" stroke-opacity="0" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">(safe area)</text>
</g>
</g>
<g id="svg_28">
<line id="svg_32" y2="275.33334" x2="305.66669" y1="227.33334" x1="362.66669" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke="#000000" fill="none"/>
<line stroke="#000000" id="svg_33" y2="228.33334" x2="497.66669" y1="289.33334" x1="587.66669" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="none"/>
</g>
<g id="svg_23">
<text stroke-opacity="0" xml:space="preserve" text-anchor="middle" font-family="Sans-serif" font-size="10" id="svg_22" y="532.33334" x="446.66669" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" stroke-width="0" stroke="#000000" fill="#000000">This area might get clipped</text>
<path marker-start="url(#se_marker_start_svg_36)" stroke="#000000" id="svg_36" d="m301.666687,464.333344c1,39 84,28 112,55.000031" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="none"/>
<path id="svg_37" marker-start="url(#se_marker_start_svg_37)" stroke="#000000" d="m577.666687,461.666687c1,39 -71,31 -98,56" stroke-linecap="null" stroke-linejoin="null" stroke-dasharray="null" fill="none"/>
</g>
</g>
</g>
</g>
</svg>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page">
<div class="content" style="background: black; color: gray; padding-left: 20px; padding-right: 20px;">
<h1>The Page <i>content</i> has a fixed size...</h1>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page">
<div class="content">
<a name="page-3-anchor"></a>
<img src="img.jpg" height="100%" align="left" style="margin-right: 15px"/>
<h1>Using the content block...</h1>
<p>
The content block can contain any HTML.
</p>
<p>
The contents will allways fit the screen, the aspect ratio
of the content block is fixed regardless of the viewer.
</p>
<p>
Contents will not get clipped as long as they are within the block.
</p>
<p>
NOTE: by default the overflow is visible (see <a href="#next">next page</a>), so be carefull.
</p>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page">
<div class="content">
<img src="img.jpg" width="200%" style="position: absolute; left: -50%; top: -20%"/>
<div style="position:absolute; width:100%; height: 100%; color: white;">
<h1>You can still use the full page area...</h1>
<p>
Though anything outside the content block can and will get clipped,
depending on viewer aspect ratio...
</p>
<p>
You can see this by resizing the page in browser or rotating the device.
</p>
</div>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
</div>
<div class="article">
<div class="cover page">
<div class="content" name="ArticleAnchorExample">
<h1>Page Templates</h1>
<p>
This page contains several examples of template fields,
the first one is the simplest, the magazine name
(<span class="magazine-title-text">[MAGAZINE NAME]</span>),
then we'll have the index (see next) and in the bottom-right
corner is the page number...
</p>
<div class="article-index">[ARTICLE INDEX]</div>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page" style="background: black; color: white;">
<div class="content">
<h1>Two column</h1>
<div style="float:left; width: 45%; height: 100%; margin: 10px;">
Column 1
</div>
<div style="float:left; width: 45%; height: 100%; padding: 10px;">
Column 2
</div>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page no-resize page-align-left">
<div class="content" style="background:gold">
Left-aligned page...
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page no-resize page-align-center">
<div class="content" style="background:yellow; width: 600px">
Center-aligned page...
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page no-resize page-align-right">
<div class="content" style="background:gold; width: 400px">
Right-aligned page...
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page no-resize page-align-right">
<div class="content" style="background:orange; width: 200px">
Right-aligned page...
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
</div>
<div class="article">
<div class="cover page">
<div class="content">
<h1>Article Cover</h1>
<a href="#home">home</a><br>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page">
<div class="content">
Page
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page">
<div class="content">
Page<br>
<a href="#home">home</a><br>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
</div>
<div class="article">
<!-- page set -->
<div class="group" style="background: url(img.jpg) no-repeat right top; background-size: 100% auto; color: white;">
<div class="page cover no-resize page-align-left" style="background:transparent">
<div class="content">
<h1>Page Set Example</h1>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page no-resize" style="background:transparent">
<div class="content">
Page in set<br>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
<div class="page no-resize page-align-right" style="background:transparent">
<div class="content">
Page in set<br>
<div class="page-number-text">[PAGE NUMBER]</div>
</div>
</div>
</div>
</div>
<div class="article">
<div class="cover page">
<div class="content">
<h1 name="config">Configuration demo</h1>
<p>
NOTE: this is not an actual configuration page, just a live demo
of some of the available configuration option effects.
</p>
<p>
<button onclick="generateMagazineDownload()">build the magazine...</button>
<a id="data_download" style="display:none">download...</a>
<input type="file" id="upload" name="file" multiple onchange="handleFileSelect(event)"/>
Alternative layouts: <a href="./layout.html">native scroll</a>,
<a href="./index-iscroll.html">iscroll</a>
<a href="./index2.html">hand-written drag</a>
</p>
<hr noshade color="silver">
<style>
.settings tr td:first-child {
text-align: right;
vertical-align: middle;
padding-right: 10px;
}
.settings tr {
height: 30px;
}
.settings button, .settings input {
background: white;
height: 25px;
}
.settings input {
border: solid silver 1px;
}
.settings button {
border: solid gray 1px;
cursor: hand;
padding-top: 3px;
padding-bottom: 3px;
padding-left: 15px;
padding-right: 15px;
}
#RESET {
background: red;
color: white;
font-weight: bold;
}
</style>
<table class="settings" width="100%">
<tr>
<td width="50%">
Pages in ribbon:
</td>
<td>
<input id="PAGES_IN_RIBBON" type="text" size="8" style="text-align:center" disabled>
<button onclick="$('#PAGES_IN_RIBBON').attr('value', parseFloat($('#PAGES_IN_RIBBON').attr('value'))+0.5); saveSettings()">+</button>
<button onclick="$('#PAGES_IN_RIBBON').attr('value', parseFloat($('#PAGES_IN_RIBBON').attr('value'))-0.5); saveSettings()">-</button>
</td>
</tr>
<tr>
<td>
Transition duration:
</td>
<td>
<input id="transition_duration" type="text" size="8" style="text-align:center" disabled>
<button onclick="$('#transition_duration').attr('value', parseInt($('#transition_duration').attr('value'))*2); saveSettings()">+</button>
<button onclick="$('#transition_duration').attr('value', parseInt($('#transition_duration').attr('value'))/2); saveSettings()">-</button>
</td>
</tr>
<tr>
<td>
Fit page to view:
</td>
<td>
<button id="FIT_PAGE_TO_VIEW" onclick="toggleSetting(this)"></button>
</td>
</tr>
<tr>
<td>
Enable different size pages (still flaky):
</td>
<td>
<button id="USE_REAL_PAGE_SIZES" onclick="toggleSetting(this)"></button>
</td>
</tr>
<!--tr>
<td>
Animate window resize:
</td>
<td>
<button id="ANIMATE_WINDOW_RESIZE" onclick="toggleSetting(this)"></button>
</td>
</tr-->
<tr>
<td>
Drag in full page view:
</td>
<td>
<button id="DRAG_FULL_PAGE" onclick="toggleSetting(this)"></button>
</td>
</tr>
<!--tr>
<td>
Toggle viewer animation (affects transition to and from full page view):
</td>
<td>
<button id="viewer_transition_state" onclick="toggleViewerAnimation()"></button>
</td>
</tr-->
<tr>
<td>
Use transform to drag:
</td>
<td>
<button id="USE_TRANSFORM" onclick="toggleSetting(this); setCurrentPage()"></button>
</td>
</tr>
<tr>
<td>
Enable #URL updating on page flip:
</td>
<td>
<button id="UPDATE_HASH_URL_POSITION" onclick="toggleSetting(this)"></button>
</td>
</tr>
<tr>
<td>
Toggele viewer themes:
</td>
<td>
<button id="theme_toggler" onclick="toggleThemes(); $(this).text(toggleThemes('?'))"></button>
</td>
</tr>
<tr>
<td>
Toggele theme shadowless mode:
</td>
<td>
<button id="theme_shadow_toggler" onclick="toggleShadows(); $(this).text(toggleShadows('?'))"></button>
</td>
</tr>
<tr>
<td>
Full navigation gistory:
</td>
<td>
<button id="FULL_HISTORY_ENABLED" onclick="toggleSetting(this)"></button>
</td>
</tr>
<tr>
<td>
Reset stored data:
</td>
<td>
<button id="RESET" onclick="confirm('You really want to reset?')&&resetState()">Reset</button>
</td>
</tr>
<table/>
<hr noshade color="silver">
<table class="settings" width="100%" style="font-size:x-small">
<tr>
<td width="50%">
Fingers supported:
</td>
<td id="FingersSupported">
</td>
</tr>
<tr>
<td>
User Agent:
</td>
<td id="UserAgent">
</td>
</tr>
<table/>
<div style="position:absolute; width:100%; bottom:10px; text-align: right;">
<a href="#back">go back</a>, or return to <a href="#home">magazine cover...</a><br>
</div>
<script>
var TRANSITION_DURATION = 100
var toggleViewerAnimation = function(){
var toggler = createCSSClassToggler(
// XXX this will turn off magazine animations...
'.scaler, .page, .magazine',
//'.scaler, .page',
'unanimated',
function(action){
$('#viewer_transition_state').text(action == 'on' ? 'off' : 'on')
})
return function(action){
if(action == null || action == '?'){
var res = toggler(action)
} else {
var res = toggler(action == 'on' ? 'off' : 'on')
}
return res == 'on' ? 'off' : 'on'
}
}()
toggleViewerAnimation('on')
function saveSettings(){
var v = parseFloat($('#PAGES_IN_RIBBON').attr('value'))
// ignore bad values...
v = v == null ? PAGES_IN_RIBBON : v
// can't be less that 1...
v = v < 1 ? 1 : v
PAGES_IN_RIBBON = v
// we need to reset the visible value in case it was wrong...
$('#PAGES_IN_RIBBON').attr('value', PAGES_IN_RIBBON)
// transition duration...
var t = parseInt($('#transition_duration').attr('value'))
t = t == null ? TRANSITION_DURATION : t
t = t < 25 ? 25 : t
TRANSITION_DURATION = t
setTransitionDuration($('.scaler'), t)
setTransitionDuration($('.magazine'), t)
FIT_PAGE_TO_VIEW = $('#FIT_PAGE_TO_VIEW').text() == 'true' ? true : false
//ANIMATE_WINDOW_RESIZE = $('#ANIMATE_WINDOW_RESIZE').text() == 'true' ? true : false
DRAG_FULL_PAGE = $('#DRAG_FULL_PAGE').text() == 'true' ? true : false
USE_REAL_PAGE_SIZES = $('#USE_REAL_PAGE_SIZES').text() == 'true' ? true : false
UPDATE_HASH_URL_POSITION = $('#UPDATE_HASH_URL_POSITION').text() == 'true' ? true : false
FULL_HISTORY_ENABLED = $('#FULL_HISTORY_ENABLED').text() == 'true' ? true : false
USE_TRANSFORM = $('#USE_TRANSFORM').text() == 'true' ? true : false
}
function loadSettings(){
$('#transition_duration').attr('value', TRANSITION_DURATION)
$('#PAGES_IN_RIBBON').attr('value', PAGES_IN_RIBBON)
$('#FIT_PAGE_TO_VIEW').text(FIT_PAGE_TO_VIEW)
//$('#ANIMATE_WINDOW_RESIZE').text(ANIMATE_WINDOW_RESIZE)
$('#DRAG_FULL_PAGE').text(DRAG_FULL_PAGE)
$('#USE_REAL_PAGE_SIZES').text(USE_REAL_PAGE_SIZES)
$('#UPDATE_HASH_URL_POSITION').text(UPDATE_HASH_URL_POSITION)
$('#FULL_HISTORY_ENABLED').text(FULL_HISTORY_ENABLED)
$('#USE_TRANSFORM').text(USE_TRANSFORM)
$('#theme_toggler').text(toggleThemes('?'))
$('#theme_shadow_toggler').text(toggleShadows('?'))
$('#FingersSupported').text($.fn.swipe.fingers.ALL)
var b = $('#BrowserInfo')
$.each($.browser, function(i, e){$('<div>'+i+': '+e+'</div>').appendTo(b)})
$('#UserAgent').text(navigator.userAgent)
}
function toggleSetting(obj){
obj = $(obj)
obj.text() == 'true' ? obj.text('false') : obj.text('true')
saveSettings()
updateView()
}
loadSettings()
// setup download link...
var USE_ZIP = true
var USE_DATA_URL = true
function generateMagazineDownload(){
var zip = new JSZip()
var json = JSON.stringify(buildJSON(true, true))
// this is a really odd one, Chrome seems to replace some
// entities with actual chars...
// what is even more odd, this then confuses some unicode
// readers/wwriters...
.replace(//g, '&ndash;')
if(USE_ZIP){
zip.file('magazine.json', json)
var content = zip.generate()
} else {
var content = btoa(json)
}
if(USE_DATA_URL){
$('#data_download')
.attr('href','data:text/octet-stream;base64,'+content)
.css('display', 'inline')
if(USE_ZIP){
$('#data_download')
.attr('download','magazine.zip')
} else {
$('#data_download')
.attr('download','magazine.json')
}
} else {
location.href="data:application/zip;base64,"+content
}
}
/*
// util...
// from: http://stackoverflow.com/a/11058858
function ab2str(buf) {
return String.fromCharCode.apply(null, new Uint16Array(buf));
}
function str2ab(str) {
var buf = new ArrayBuffer(str.length*2); // 2 bytes for each char
var bufView = new Uint16Array(buf);
for (var i=0, strLen=str.length; i<strLen; i++) {
bufView[i] = str.charCodeAt(i);
}
return buf;
}
*/
// upload...
function handleFileSelect(evt) {
var files = evt.target.files; // FileList object
// Loop through the FileList and render image files as thumbnails.
for (var i = 0, f; f = files[i]; i++) {
var reader = new FileReader();
// Closure to capture the file information.
reader.onload = (function(theFile) {
return function(e) {
console.log('loading...')
var raw_data = e.target.result
window.JSON_DATA = raw_data
if(USE_ZIP){
var zip = new JSZip(raw_data)
console.log('zip loaded...')
var json = zip.file('magazine.json').data
} else {
var json = raw_data
}
loadJSON($.parseJSON(json), true)
console.log('done.')
};
})(f);
// Read in the image file as a data URL.
if(USE_ZIP){
reader.readAsArrayBuffer(f)
} else {
reader.readAsBinaryString(f)
}
//reader.readAsText(f)
}
}
</script>
</div>
</div>
</div>
</div>
</div>
</div>
</div>
</body>
</html>
<!-- vim:set ts=4 sw=4 nowrap : -->