| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | /********************************************************************** | 
					
						
							| 
									
										
										
										
											2013-01-27 03:40:00 +04:00
										 |  |  | * | 
					
						
							|  |  |  | * XXX add copyright and licence info... | 
					
						
							|  |  |  | * | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | //var DEBUG = DEBUG != null ? DEBUG : true
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | // number of pages to display in ribbon...
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | var PAGES_IN_RIBBON = 6 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | // if true, expand a page to fit the whole view in single page mode...
 | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | var FIT_PAGE_TO_VIEW = true | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 15:05:33 +04:00
										 |  |  | // if true will make page resizes after window resize animated...
 | 
					
						
							|  |  |  | var ANIMATE_WINDOW_RESIZE = true | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | // if true will disable page dragging in single page mode...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 03:36:10 +04:00
										 |  |  | var DRAG_FULL_PAGE = true | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | // XXX make this default and remove the option...
 | 
					
						
							|  |  |  | // XXX this produces a funny animation that gets more ampletude the farther 
 | 
					
						
							|  |  |  | // 		we get to the right from the no-resize element...
 | 
					
						
							|  |  |  | // 		...think the reason is .no-resize page centering...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 03:25:04 +04:00
										 |  |  | // XXX still buggy on togglePageView to TN after funny sized pages...
 | 
					
						
							| 
									
										
										
										
											2013-01-29 15:50:52 +04:00
										 |  |  | //var USE_REAL_PAGE_SIZES = true
 | 
					
						
							|  |  |  | var USE_REAL_PAGE_SIZES = false | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-24 03:15:54 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | // toggles .dragging CSS class on the viewer while dragging is in 
 | 
					
						
							|  |  |  | // progress.
 | 
					
						
							|  |  |  | // NOTE: this is used mostly for styling and drag assisting...
 | 
					
						
							| 
									
										
										
										
											2013-01-26 21:46:49 +04:00
										 |  |  | togglePageDragging = createCSSClassToggler('.viewer', 'dragging') | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 00:04:29 +04:00
										 |  |  | // this is here only for speed, helps with dragging...
 | 
					
						
							|  |  |  | // DO NOT USE DIRECTLY!
 | 
					
						
							|  |  |  | var _PAGE_VIEW | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | // toggle between the two main modes:
 | 
					
						
							|  |  |  | // 	- single page mode (.page-view-mode)
 | 
					
						
							|  |  |  | // 	- thumbnail/ribbon mode
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | togglePageView = createCSSClassToggler( | 
					
						
							|  |  |  | 	'.viewer',  | 
					
						
							|  |  |  | 	'page-view-mode', | 
					
						
							|  |  |  | 	null, | 
					
						
							|  |  |  | 	// post-change callback...
 | 
					
						
							| 
									
										
										
										
											2013-01-26 15:05:33 +04:00
										 |  |  | 	function(action){ | 
					
						
							|  |  |  | 		if(action == 'on'){ | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | 			fitNPages(1, !FIT_PAGE_TO_VIEW) | 
					
						
							| 
									
										
										
										
											2013-01-27 00:04:29 +04:00
										 |  |  | 			_PAGE_VIEW = true | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 		} else { | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 			fitNPages(PAGES_IN_RIBBON) | 
					
						
							| 
									
										
										
										
											2013-01-27 00:04:29 +04:00
										 |  |  | 			_PAGE_VIEW = false | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 10:09:58 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 21:46:49 +04:00
										 |  |  | // this will simply refresh the current view...
 | 
					
						
							|  |  |  | function updateView(){ | 
					
						
							|  |  |  | 	return togglePageView(togglePageView('?')) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************* helpers ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | function getPageScale(){ | 
					
						
							|  |  |  | 	return getElementScale($('.scaler')) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | function getPageNumber(page){ | 
					
						
							|  |  |  | 	if(page == null){ | 
					
						
							|  |  |  | 		page = $('.current.page') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return $('.page').index(page)  | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 13:58:27 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | function getPageAt(n){ | 
					
						
							|  |  |  | 	return $($('.page')[n]) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 13:58:27 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | /************************************************** event handlers ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 00:04:29 +04:00
										 |  |  | // hash url handler...
 | 
					
						
							|  |  |  | // NOTE: most of the handling actually happens in loadURLState...
 | 
					
						
							| 
									
										
										
										
											2013-01-26 23:48:57 +04:00
										 |  |  | function hashChangeHandler(e){ | 
					
						
							|  |  |  | 	e.preventDefault() | 
					
						
							|  |  |  | 	var r = loadURLState() | 
					
						
							|  |  |  | 	// if we are dealing with history actions the browser will 
 | 
					
						
							|  |  |  | 	// do the work for us...
 | 
					
						
							|  |  |  | 	if(r == 'back'){ | 
					
						
							| 
									
										
										
										
											2013-01-27 03:40:00 +04:00
										 |  |  | 		// we shift by 2 to combensate for the back/forward URL itself...
 | 
					
						
							| 
									
										
										
										
											2013-01-26 23:48:57 +04:00
										 |  |  | 		window.history.go(-2) | 
					
						
							|  |  |  | 	} else if(r == 'forward'){ | 
					
						
							|  |  |  | 		window.history.go(2) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		setCurrentPage(r) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:40:00 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | // window resize event handler...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 22:06:39 +04:00
										 |  |  | // XXX might be good to compensate for document zoom...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 01:25:20 +04:00
										 |  |  | function viewResizeHandler(){ | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 	/* | 
					
						
							| 
									
										
										
										
											2013-01-27 01:25:20 +04:00
										 |  |  | 	if(document.width/$(document).width() != 1){ | 
					
						
							|  |  |  | 		// XXX scale the page...
 | 
					
						
							|  |  |  | 		console.log('>>> Page Zoom:', document.width/$(document).width()) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2013-01-27 01:25:20 +04:00
										 |  |  | 	if(ANIMATE_WINDOW_RESIZE){ | 
					
						
							|  |  |  | 		updateView() | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		unanimated($('.scaler'), updateView, 30)() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 23:48:57 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | // swipe state handler
 | 
					
						
							|  |  |  | // this handles single and double finger swipes and dragging
 | 
					
						
							| 
									
										
										
										
											2013-01-27 22:06:39 +04:00
										 |  |  | // while draggign this triggers magazineDragging event on the viewer...
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | function swipeHandler(evt, phase, direction, distance, duration, fingers){ | 
					
						
							|  |  |  | 	var pages = $('.page') | 
					
						
							|  |  |  | 	var cur = $('.current.page') | 
					
						
							|  |  |  | 	var n = pages.index(cur) | 
					
						
							|  |  |  | 	var scale = getPageScale() | 
					
						
							|  |  |  | 	var mag = $('.magazine') | 
					
						
							| 
									
										
										
										
											2013-01-27 18:24:30 +04:00
										 |  |  | 	var pos = $('.navigator .bar .indicator') | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | 	if(phase=='move'  | 
					
						
							|  |  |  | 			// see if wee need to drag the page and allways drag the ribbon...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 00:04:29 +04:00
										 |  |  | 			&& (DRAG_FULL_PAGE || !_PAGE_VIEW) | 
					
						
							| 
									
										
										
										
											2013-01-26 22:48:59 +04:00
										 |  |  | 			&& (direction=='left' || direction=='right')){ | 
					
						
							|  |  |  | 		// using the "unanimated" trick we will make the drag real-time...
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 		if(direction == 'left'){ | 
					
						
							| 
									
										
										
										
											2013-01-29 13:58:27 +04:00
										 |  |  | 			mag.css({left: -cur.position()['left']/scale - distance/scale}) | 
					
						
							|  |  |  | 			//mag.css({left: -n*cur.width()-distance/scale})
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 		} else if(direction == 'right') { | 
					
						
							| 
									
										
										
										
											2013-01-29 13:58:27 +04:00
										 |  |  | 			mag.css({left: -cur.position()['left']/scale + distance/scale}) | 
					
						
							|  |  |  | 			//mag.css({left: -n*cur.width()+distance/scale})
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-27 22:06:39 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		$('.viewer').trigger('magazineDragging') | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:44:45 +04:00
										 |  |  | 	} else if(phase == 'start'){ | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 		togglePageDragging('on') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:44:45 +04:00
										 |  |  | 	} else if(phase == 'cancel'){ | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 		togglePageDragging('off') | 
					
						
							|  |  |  | 		setCurrentPage() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:44:45 +04:00
										 |  |  | 	} else if(phase =='end' ){ | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 		togglePageDragging('off') | 
					
						
							|  |  |  | 		// see which page is closer to the middle of the screen and set it...
 | 
					
						
							|  |  |  | 		// do this based on how much we dragged...
 | 
					
						
							|  |  |  | 		var p = Math.ceil((distance/scale)/cur.width()) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// prev page...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:44:45 +04:00
										 |  |  | 		if(direction == 'right'){ | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 			// two+ fingers moves to closest article...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 			if(fingers == 2){ | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 				prevArticle() | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 			} else if(fingers >= 3){ | 
					
						
							|  |  |  | 				prevBookmark() | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				setCurrentPage(Math.max(n-p, 0)) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		// next page...
 | 
					
						
							|  |  |  | 		} else if(direction == 'left'){ | 
					
						
							|  |  |  | 			// two+ fingers moves to closest article...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 			if(fingers == 2){ | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 				nextArticle() | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 			} else if(fingers >= 3){ | 
					
						
							|  |  |  | 				nextBookmark() | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				setCurrentPage(Math.min(n+p, pages.length-1)) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************** layout ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | // NOTE: special cases:
 | 
					
						
							|  |  |  | // 	- if n is not given then it defaults to 1
 | 
					
						
							|  |  |  | // 	- if n > 1 and fit_to_content is not given it defaults to true
 | 
					
						
							|  |  |  | // 	- if n is 1 then fit_to_content bool argument controls wether:
 | 
					
						
							|  |  |  | // 		- the page will be stretched to viewer (false)
 | 
					
						
							|  |  |  | // 		- or to content (true)
 | 
					
						
							| 
									
										
										
										
											2013-01-29 18:55:21 +04:00
										 |  |  | // XXX on USE_REAL_PAGE_SIZES offset is calculated incorrectly...
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | function fitNPages(n, fit_to_content){ | 
					
						
							|  |  |  | 	if(n == null){ | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 		n = 1 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 	if(n > 1 && fit_to_content == null){ | 
					
						
							|  |  |  | 		fit_to_content = true | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	var view = $('.viewer') | 
					
						
							| 
									
										
										
										
											2013-01-29 15:50:52 +04:00
										 |  |  | 	if(USE_REAL_PAGE_SIZES){ | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 		var page = $('.page:not(.no-resize)') | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		var page = $('.page') | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	var content = $('.content') | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 	var cur = $('.current.page') | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 	var W = view.width() | 
					
						
							|  |  |  | 	var H = view.height() | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	var cW = content.width() | 
					
						
							|  |  |  | 	var cH = content.height() | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var rW = cW | 
					
						
							|  |  |  | 	var scale = getPageScale() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 	// to compensate for transitions, no data sampling should be beyound
 | 
					
						
							|  |  |  | 	// this point, as we will start changing things next...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:40:00 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 	if(fit_to_content){ | 
					
						
							| 
									
										
										
										
											2013-01-29 15:50:52 +04:00
										 |  |  | 		if(USE_REAL_PAGE_SIZES){ | 
					
						
							| 
									
										
										
										
											2013-01-28 03:25:04 +04:00
										 |  |  | 			page.width('auto') | 
					
						
							|  |  |  | 			page.height('auto') | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			page.width(cW) | 
					
						
							|  |  |  | 			page.height(cH) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 		if(W/H > (cW*n)/cH){ | 
					
						
							|  |  |  | 			scale = H/cH | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			scale = W/(cW*n) | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-25 10:09:58 +04:00
										 |  |  | 		// resulting page width...
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 		var rW = cW | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		// need to calc width only...
 | 
					
						
							|  |  |  | 		if(W/H > (cW*n)/cH){ | 
					
						
							|  |  |  | 			scale = H/cH | 
					
						
							|  |  |  | 			page.width(W/scale) | 
					
						
							|  |  |  | 			page.height(cH) | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 		// need to calc height only...
 | 
					
						
							|  |  |  | 		} else if(W/H > (cW*n)/cH){ | 
					
						
							|  |  |  | 			scale = W/(cW*n) | 
					
						
							|  |  |  | 			page.height(H/scale) | 
					
						
							|  |  |  | 			page.width(cW) | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 		// set both width and height to defaults (content and page ratios match)...
 | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			scale = W/(cW*n) | 
					
						
							|  |  |  | 			page.height(cH) | 
					
						
							|  |  |  | 			page.width(cW) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		// resulting page width...
 | 
					
						
							|  |  |  | 		var rW = W/scale | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-29 18:55:21 +04:00
										 |  |  | 	if(USE_REAL_PAGE_SIZES){ | 
					
						
							|  |  |  | 		$('.page.no-resize').width('auto') | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 18:55:21 +04:00
										 |  |  | 	// NOTE: we need to calculate the offset as the actual widths during 
 | 
					
						
							|  |  |  | 	// 		the anumation are not correct...
 | 
					
						
							|  |  |  | 	// XXX in general this is correct, but still there is some error...
 | 
					
						
							|  |  |  | 	if(!USE_REAL_PAGE_SIZES && fit_to_content){ | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 		var offset = rW * getPageNumber()-1 | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		// calculate the target offset...
 | 
					
						
							| 
									
										
										
										
											2013-01-29 15:50:52 +04:00
										 |  |  | 		if(USE_REAL_PAGE_SIZES){ | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 			var rpages = $('.page:not(.no-resize), .current.page') | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			var rpages = page  | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		var i = rpages.index(cur)  | 
					
						
							|  |  |  | 		var offset = rW * i-1 | 
					
						
							| 
									
										
										
										
											2013-01-29 18:55:21 +04:00
										 |  |  | 		// now do the no-resize elements...
 | 
					
						
							|  |  |  | 		// XXX this still generates slightly incorrect values...
 | 
					
						
							| 
									
										
										
										
											2013-01-29 15:50:52 +04:00
										 |  |  | 		if(USE_REAL_PAGE_SIZES){ | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 			var nrpages = $('.page.no-resize, .current.page') | 
					
						
							|  |  |  | 			i = nrpages.index(cur)  | 
					
						
							|  |  |  | 			nrpages.splice(i) | 
					
						
							|  |  |  | 			nrpages.each(function(_, e){ | 
					
						
							| 
									
										
										
										
											2013-01-29 18:55:21 +04:00
										 |  |  | 				offset += $(e).children('.content').width() | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 			}) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 15:50:52 +04:00
										 |  |  | 	if(USE_REAL_PAGE_SIZES){ | 
					
						
							| 
									
										
										
										
											2013-01-28 03:36:10 +04:00
										 |  |  | 		if(cur.hasClass('no-resize')){ | 
					
						
							| 
									
										
										
										
											2013-01-29 18:55:21 +04:00
										 |  |  | 			rW = cur.children('.content').width() | 
					
						
							| 
									
										
										
										
											2013-01-28 03:36:10 +04:00
										 |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 	// do the scaling... 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	setElementScale($('.scaler'), scale) | 
					
						
							| 
									
										
										
										
											2013-01-25 09:59:53 +04:00
										 |  |  | 	// fix position...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 	setCurrentPage(null, offset, rW) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | /********************************************************* actions ***/ | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 18:55:21 +04:00
										 |  |  | // Argument width is used ONLY to center the page.
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | // NOTE: if n is not given it will be set to current page number
 | 
					
						
							|  |  |  | // NOTE: if width is not given it will be set to current page width.
 | 
					
						
							|  |  |  | // NOTE: n can be:
 | 
					
						
							|  |  |  | // 		- page number
 | 
					
						
							|  |  |  | // 		- page element
 | 
					
						
							| 
									
										
										
										
											2013-01-27 18:38:00 +04:00
										 |  |  | // NOTE: this will fire a 'pageChanged' event on the viewer each time 
 | 
					
						
							|  |  |  | // 		it is called...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | function setCurrentPage(n, offset, width){ | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	if(n == null){ | 
					
						
							|  |  |  | 		var cur = $('.current.page') | 
					
						
							|  |  |  | 		n = $('.page').index(cur)  | 
					
						
							|  |  |  | 	} else if(typeof(n) == typeof(1)) { | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 		var cur = getPageAt(n) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	} else { | 
					
						
							|  |  |  | 		var cur = $(n) | 
					
						
							|  |  |  | 		n = $('.page').index(cur)  | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 	if(width == null){ | 
					
						
							|  |  |  | 		width = cur.width() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	$('.current.page').removeClass('current') | 
					
						
							|  |  |  | 	cur.addClass('current') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var mag = $('.magazine') | 
					
						
							| 
									
										
										
										
											2013-01-29 13:58:27 +04:00
										 |  |  | 	var offset = offset == null ? cur.position()['left']/getPageScale() : offset | 
					
						
							| 
									
										
										
										
											2013-01-28 03:01:20 +04:00
										 |  |  | 	mag.css({left: -offset}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// center the pages correctly...
 | 
					
						
							|  |  |  | 	$('.magazine').css({ | 
					
						
							|  |  |  | 		'margin-left': -width/2 | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// XXX should this be here???
 | 
					
						
							|  |  |  | 	saveState() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 	// trigger the page cange event...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 18:38:00 +04:00
										 |  |  | 	$('.viewer').trigger('pageChanged', n) | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 	 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	return cur | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function goToMagazineCover(){ | 
					
						
							|  |  |  | 	setCurrentPage(0) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-01-27 22:41:06 +04:00
										 |  |  | function goToMagazineEnd(){ | 
					
						
							|  |  |  | 	setCurrentPage($('.page').length-1) | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | function goToArticleCover(){ | 
					
						
							|  |  |  | 	setCurrentPage($('.current.page').parents('.article').children('.page').first()) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function nextPage(){ | 
					
						
							|  |  |  | 	var pages = $('.page') | 
					
						
							|  |  |  | 	var cur = $('.current.page') | 
					
						
							|  |  |  | 	return setCurrentPage(Math.min(pages.index(cur)+1, pages.length-1)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function prevPage(){ | 
					
						
							|  |  |  | 	var pages = $('.page') | 
					
						
							|  |  |  | 	var cur = $('.current.page') | 
					
						
							|  |  |  | 	return setCurrentPage(Math.max(pages.index(cur)-1, 0)) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function nextArticle(){ | 
					
						
							|  |  |  | 	var cur = $('.current.page').parents('.article') | 
					
						
							| 
									
										
										
										
											2013-01-23 23:17:29 +04:00
										 |  |  | 	// we are at the magazine cover...
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	if(cur.length == 0){ | 
					
						
							|  |  |  | 		return setCurrentPage( | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 			$('.magazine .article .page:first-child').first()) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// just find the next one...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 	var articles = $('.magazine .article') | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	return setCurrentPage( | 
					
						
							|  |  |  | 		$(articles[Math.min(articles.index(cur)+1, articles.length-1)]) | 
					
						
							|  |  |  | 			.children('.page') | 
					
						
							|  |  |  | 			.first()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function prevArticle(){ | 
					
						
							|  |  |  | 	var cur = $('.current.page').parents('.article') | 
					
						
							| 
									
										
										
										
											2013-01-23 23:17:29 +04:00
										 |  |  | 	// we are at the magazine cover...
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	if(cur.length == 0){ | 
					
						
							| 
									
										
										
										
											2013-01-23 23:17:29 +04:00
										 |  |  | 		//return $('.current.page')
 | 
					
						
							|  |  |  | 		return setCurrentPage() | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 	// just find the prev one...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 	var articles = $('.magazine .article') | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	return setCurrentPage( | 
					
						
							|  |  |  | 		$(articles[Math.max(articles.index(cur)-1, 0)]) | 
					
						
							|  |  |  | 			.children('.page') | 
					
						
							|  |  |  | 			.first()) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | /*********************************************************** state ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | // XXX make these magazine-specific...
 | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | // XXX BUG: if the hash url part coresponds to a real anchor the browser 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | // 		shifts the page, need to disable this...
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | // URL state managers...
 | 
					
						
							|  |  |  | function loadURLState(){ | 
					
						
							|  |  |  | 	if(window.location.hash == ''){ | 
					
						
							|  |  |  | 		return null | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | 	var anchor = window.location.hash.split('#')[1] | 
					
						
							|  |  |  | 	var n = parseInt(anchor) | 
					
						
							|  |  |  | 	if(typeof(n) == typeof(1) && n >= 0){ | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 		return n | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | 	// XXX add real external aliases...
 | 
					
						
							|  |  |  | 	} else if(anchor == 'thumbnails') { | 
					
						
							|  |  |  | 		togglePageView('off') | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | 	} else if(anchor == 'home') { | 
					
						
							|  |  |  | 		return 0 | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | 	} else if(anchor == 'end') { | 
					
						
							|  |  |  | 		return $('.page').length-1 | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-26 23:45:38 +04:00
										 |  |  | 	// history...
 | 
					
						
							| 
									
										
										
										
											2013-01-26 23:48:57 +04:00
										 |  |  | 	// NOTE: these are handled by hashChangeHandler()
 | 
					
						
							| 
									
										
										
										
											2013-01-26 23:45:38 +04:00
										 |  |  | 	} else if(anchor == 'back') { | 
					
						
							|  |  |  | 		return anchor | 
					
						
							|  |  |  | 	} else if(anchor == 'forward') { | 
					
						
							|  |  |  | 		return anchor | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 	// relative URLs...
 | 
					
						
							|  |  |  | 	} else if(anchor == 'next') { | 
					
						
							|  |  |  | 		nextPage() | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else if(anchor == 'prev') { | 
					
						
							|  |  |  | 		prevPage() | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else if(anchor == 'nextArticle') { | 
					
						
							|  |  |  | 		nextArticle() | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else if(anchor == 'prevArticle') { | 
					
						
							|  |  |  | 		prevArticle() | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 	} else if(anchor == 'nextBookmark') { | 
					
						
							|  |  |  | 		nextBookmark() | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else if(anchor == 'prevBookmark') { | 
					
						
							|  |  |  | 		prevBookmark() | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else if(anchor == 'bookmark'){ | 
					
						
							|  |  |  | 		toggleBookmark() | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 	// hide all visible layers on current page...
 | 
					
						
							|  |  |  | 	} else if(anchor == 'hideLayers') { | 
					
						
							|  |  |  | 		$('.current.page .shown') | 
					
						
							|  |  |  | 			.addClass('hidden') | 
					
						
							|  |  |  | 			.removeClass('shown') | 
					
						
							|  |  |  | 		return getPageNumber() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 		var elem = $('[name='+anchor+']') | 
					
						
							|  |  |  | 		n = getPageNumber(elem.parents('.page')) | 
					
						
							|  |  |  | 		// toggle hidden/shown elements...
 | 
					
						
							|  |  |  | 		if(elem.hasClass('hidden')){ | 
					
						
							|  |  |  | 			elem | 
					
						
							|  |  |  | 				.addClass('shown') | 
					
						
							|  |  |  | 				.removeClass('hidden') | 
					
						
							|  |  |  | 		} else if(elem.hasClass('shown')){ | 
					
						
							|  |  |  | 			elem | 
					
						
							|  |  |  | 				.addClass('hidden') | 
					
						
							|  |  |  | 				.removeClass('shown') | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		return n | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function saveURLState(){ | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | 	var anchor = window.location.hash.split('#')[1] | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 	var elem = $('[name='+anchor+']') | 
					
						
							|  |  |  | 	var page = elem | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | 	if(!page.hasClass('page')){ | 
					
						
							|  |  |  | 		page = page.parents('.page') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var n = getPageNumber() | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// decide which #URLs stay in the URL and which get replaces with a
 | 
					
						
							|  |  |  | 	// page number...
 | 
					
						
							|  |  |  | 	if(!elem.hasClass('shown') && !elem.hasClass('hidden')){ | 
					
						
							|  |  |  | 		// XXX use real aliases...
 | 
					
						
							|  |  |  | 		// do not replace these urls with page numbers...
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 		if(n == getPageNumber(page) | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 				|| (anchor == 'home' && n == 0) | 
					
						
							|  |  |  | 				|| (anchor == 'end' && n == $('.page').length-1)){ | 
					
						
							|  |  |  | 			return anchor | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-01-23 04:10:05 +04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 05:53:42 +04:00
										 |  |  | 	window.location.hash = n | 
					
						
							|  |  |  | 	return n | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | // local storage state managers...
 | 
					
						
							|  |  |  | function loadStorageState(){ | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 	return { | 
					
						
							|  |  |  | 		current_page: parseInt($.jStorage.get('current_page', 0)), | 
					
						
							|  |  |  | 		bookmarks: $.jStorage.get('bookmarks', []) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | } | 
					
						
							|  |  |  | function saveStorageState(){ | 
					
						
							|  |  |  | 	$.jStorage.set('current_page', getPageNumber()) | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 	$.jStorage.set('bookmarks', buildBookmarkList()) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 23:18:27 +04:00
										 |  |  | // JSON format state managers...
 | 
					
						
							|  |  |  | function loadJSONState(data){ | 
					
						
							|  |  |  | 	// XXX
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function buildJSONState(){ | 
					
						
							|  |  |  | 	// XXX
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function dumpJSONState(){ | 
					
						
							|  |  |  | 	// XXX
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | // generic state managers...
 | 
					
						
							|  |  |  | function loadState(){ | 
					
						
							|  |  |  | 	var n = loadURLState() | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 	var state = loadStorageState()  | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	if(n != null){ | 
					
						
							|  |  |  | 		setCurrentPage(n) | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 		setCurrentPage(state.current_page) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 	loadBookmarks(state.bookmarks) | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | } | 
					
						
							|  |  |  | function saveState(){ | 
					
						
							|  |  |  | 	saveURLState() | 
					
						
							|  |  |  | 	saveStorageState() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | /******************************************************* navigator ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | function _makeArticleIndicator(i, article, width){ | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 	var bar = $('.navigator .bar') | 
					
						
							|  |  |  | 	var article = $(article) | 
					
						
							|  |  |  | 	var n = getPageNumber(article.children('.cover').first()) | 
					
						
							|  |  |  | 	$('<div/>') | 
					
						
							|  |  |  | 		.prependTo($('.navigator .bar')) | 
					
						
							|  |  |  | 		.addClass('article') | 
					
						
							|  |  |  | 		.css({ | 
					
						
							|  |  |  | 			width: width, | 
					
						
							|  |  |  | 			left: width*n | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-01-27 18:24:30 +04:00
										 |  |  | 		.click(function(){ | 
					
						
							|  |  |  | 			setCurrentPage(n) | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 	return article | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 22:06:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | function setupArticleIndicators(W){ | 
					
						
							|  |  |  | 	var articles = $('.magazine .article') | 
					
						
							|  |  |  | 	// cleanup...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 	$('.navigator .bar .article').remove() | 
					
						
							| 
									
										
										
										
											2013-01-27 22:06:39 +04:00
										 |  |  | 	// set article indicator positions...
 | 
					
						
							|  |  |  | 	articles.each(function(i, e){ | 
					
						
							|  |  |  | 		return _makeArticleIndicator(i, e, W) | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function setupNavigator(){ | 
					
						
							|  |  |  | 	var bar = $('.navigator .bar') | 
					
						
							|  |  |  | 	var elems = $('.navigator .indicator, .navigator .article') | 
					
						
							|  |  |  | 	var pos = $('.navigator .indicator') | 
					
						
							|  |  |  | 	var pages = $('.page').length | 
					
						
							|  |  |  | 	var mag = $('.magazine') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var W = bar.width()/pages | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	setupArticleIndicators(W) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// set navigator element sizes...
 | 
					
						
							|  |  |  | 	elems.css({ | 
					
						
							|  |  |  | 		width: W | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	updateNavigator() | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// setup event handlers...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 22:06:39 +04:00
										 |  |  | 	$('.viewer') | 
					
						
							|  |  |  | 		.on('pageChanged', function(e, n){updateNavigator(n)}) | 
					
						
							|  |  |  | 		.on('magazineDragging', function(){updateNavigator()}) | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function updateNavigator(n){ | 
					
						
							|  |  |  | 	var mag = $('.magazine') | 
					
						
							|  |  |  | 	var page = $('.page') | 
					
						
							|  |  |  | 	var bar = $('.navigator .bar') | 
					
						
							|  |  |  | 	var pos = $('.navigator .indicator') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var pn = page.length | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var bW = bar.width() | 
					
						
							|  |  |  | 	var mW = mag.width() | 
					
						
							|  |  |  | 	var PW = page.width() | 
					
						
							|  |  |  | 	var pW = bar.width()/pn | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(n == null){ | 
					
						
							| 
									
										
										
										
											2013-01-27 18:58:05 +04:00
										 |  |  | 		// XXX this behaves erratically if the page is zoomed...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 		var res = (-parseFloat(mag.css('left'))/(mW-PW)) * (bW-pW) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		res = pW*n | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// normalize the position...
 | 
					
						
							|  |  |  | 	res = res > 0 ? res: 0 | 
					
						
							|  |  |  | 	res = res < (bW-pW) ? res: (bW-pW) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// set indicator position...
 | 
					
						
							|  |  |  | 	pos.css({ | 
					
						
							|  |  |  | 		left: res  | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 02:28:10 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | function makeBookmarkIndicator(n){ | 
					
						
							|  |  |  | 	if(n == null){ | 
					
						
							|  |  |  | 		n = getPageNumber() | 
					
						
							|  |  |  | 	} else if(typeof(n) != typeof(1)){ | 
					
						
							|  |  |  | 		n = getPageNumber(n) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var bar = $('.navigator .bar') | 
					
						
							|  |  |  | 	var pages = $('.page').length | 
					
						
							|  |  |  | 	var width = bar.width()/pages | 
					
						
							|  |  |  | 	var res = $('<div/>') | 
					
						
							|  |  |  | 		.prependTo($('.navigator .bar')) | 
					
						
							|  |  |  | 		.addClass('bookmark') | 
					
						
							|  |  |  | 		.css({ | 
					
						
							| 
									
										
										
										
											2013-01-29 02:15:03 +04:00
										 |  |  | 			left: width*n + width*0.75 | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		.attr({ | 
					
						
							|  |  |  | 			page: n | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.click(function(){ | 
					
						
							|  |  |  | 			setCurrentPage(n) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | function clearBookmarkIndicators(){ | 
					
						
							|  |  |  | 	$('.navigator .bar .bookmark').remove() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function removeBookmarkIndicator(n){ | 
					
						
							|  |  |  | 	$('.navigator .bar .bookmark[page="'+n+'"]').remove() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 02:28:10 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /******************************************************* bookmarks ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // load bookmarks from list...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | function loadBookmarks(lst){ | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 	clearBookmarks() | 
					
						
							|  |  |  | 	$(lst).each(function(i, e){toggleBookmark(e)}) | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-01-29 02:28:10 +04:00
										 |  |  | // build bookmark list...
 | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | function buildBookmarkList(){ | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 	var res = [] | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 	$('.magazine .page .bookmark').each(function(_, e){ | 
					
						
							|  |  |  | 		res.push(getPageNumber($(e).parents('.page'))) | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 02:28:10 +04:00
										 |  |  | function clearBookmarks(){ | 
					
						
							|  |  |  | 	$('.magazine .page .bookmark').remove() | 
					
						
							|  |  |  | 	clearBookmarkIndicators() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | function toggleBookmark(n){ | 
					
						
							|  |  |  | 	if(n == null){ | 
					
						
							|  |  |  | 		n = getPageNumber() | 
					
						
							|  |  |  | 	} else if(typeof(n) != typeof(1)){ | 
					
						
							|  |  |  | 		n = getPageNumber(n) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var res | 
					
						
							|  |  |  | 	var cur = getPageAt(n) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(cur.children('.bookmark').length == 0){ | 
					
						
							|  |  |  | 		var res = $('<div/>') | 
					
						
							|  |  |  | 			.prependTo(cur) | 
					
						
							| 
									
										
										
										
											2013-01-29 03:05:42 +04:00
										 |  |  | 			.addClass('bookmark justcreated') | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 			.click(function(){ | 
					
						
							|  |  |  | 				toggleBookmark(n) | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 03:05:42 +04:00
										 |  |  | 		setTimeout(function(){ | 
					
						
							|  |  |  | 			res.removeClass('justcreated') | 
					
						
							|  |  |  | 		}, 1000) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-28 18:15:14 +04:00
										 |  |  | 		makeBookmarkIndicator(n) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		cur.children('.bookmark').remove() | 
					
						
							|  |  |  | 		removeBookmarkIndicator(n) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// XXX should this be here???
 | 
					
						
							|  |  |  | 	saveState() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function nextBookmark(){ | 
					
						
							| 
									
										
										
										
											2013-01-29 02:15:03 +04:00
										 |  |  | 	var pages = $('.page') | 
					
						
							|  |  |  | 	pages = $(pages.splice(getPageNumber()+1)) | 
					
						
							|  |  |  | 	page = pages.children('.bookmark').first().parents('.page') | 
					
						
							|  |  |  | 	if(page.length != 0){ | 
					
						
							|  |  |  | 		return setCurrentPage(page) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | } | 
					
						
							|  |  |  | function prevBookmark(){ | 
					
						
							| 
									
										
										
										
											2013-01-29 02:15:03 +04:00
										 |  |  | 	var pages = $('.page') | 
					
						
							|  |  |  | 	pages.splice(getPageNumber()) | 
					
						
							|  |  |  | 	page = pages.children('.bookmark').last().parents('.page') | 
					
						
							|  |  |  | 	if(page.length != 0){ | 
					
						
							|  |  |  | 		return setCurrentPage(page) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-01-28 17:14:47 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-27 17:59:33 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-29 02:28:10 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | /********************************************************** editor ***/ | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | // XXX create magazine...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:40:00 +04:00
										 |  |  | // 		- magazine
 | 
					
						
							|  |  |  | // 		- cover
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | function createMagazine(){ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | // XXX create article (magazine, title, position)...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:40:00 +04:00
										 |  |  | // 		- article
 | 
					
						
							|  |  |  | // 		- cover
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | function createArticle(magazine, title){ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | // XXX create page (article, template, position)...
 | 
					
						
							| 
									
										
										
										
											2013-01-27 03:40:00 +04:00
										 |  |  | // 		- page
 | 
					
						
							|  |  |  | // 		- content
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | function createPage(article, template){ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-25 18:19:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-01-23 01:37:39 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | // vim:set ts=4 sw=4 :
 |