| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * XXX add copyright and licence info... | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-13 04:01:51 +04:00
										 |  |  | //var NAVIGATE_RELATIVE_TO_VISIBLE = false
 | 
					
						
							|  |  |  | var NAVIGATE_RELATIVE_TO_VISIBLE = true | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | var USE_PAGE_ALIGN = true | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 04:14:48 +04:00
										 |  |  | var PAGES_IN_RIBBON = 4 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | /********************************************************** layout ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var togglePageFitMode = createCSSClassToggler( | 
					
						
							| 
									
										
										
										
											2013-02-12 04:14:48 +04:00
										 |  |  | 		'.viewer',  | 
					
						
							|  |  |  | 		'.page-fit-to-viewer',  | 
					
						
							|  |  |  | 		function(action){ | 
					
						
							|  |  |  | 			if(action == 'on'){ | 
					
						
							|  |  |  | 				console.log('fitting pages to view...') | 
					
						
							|  |  |  | 				var n = getPageNumber() | 
					
						
							|  |  |  | 				var scale = getMagazineScale() | 
					
						
							|  |  |  | 				$('.page:not(.no-resize)').width($('.viewer').width()/scale) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				console.log('restoring page sizes...') | 
					
						
							|  |  |  | 				var n = getPageNumber() | 
					
						
							|  |  |  | 				$('.page:not(.no-resize)').width('') | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 			setCurrentPage(n) | 
					
						
							| 
									
										
										
										
											2013-02-12 04:14:48 +04:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var togglePageView = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer', | 
					
						
							|  |  |  | 		'.full-page-view-mode', | 
					
						
							|  |  |  | 		// XXX make this support transitions...
 | 
					
						
							|  |  |  | 		function(action){ | 
					
						
							|  |  |  | 			var view = $('.viewer') | 
					
						
							|  |  |  | 			var page = $('.page') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(action == 'on'){ | 
					
						
							|  |  |  | 				var W = view.width() | 
					
						
							|  |  |  | 				var H = view.height() | 
					
						
							|  |  |  | 				var w = page.width() | 
					
						
							|  |  |  | 				var h = page.height() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// XXX this is not correct...
 | 
					
						
							|  |  |  | 				// 		...need to fit one rectangel (page) into another (viewer)
 | 
					
						
							|  |  |  | 				if(W >= H){ | 
					
						
							|  |  |  | 					// fit to width...
 | 
					
						
							|  |  |  | 					var scale = W/w | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					// fit to height...
 | 
					
						
							|  |  |  | 					var scale = H/h | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 				setMagazineScale(scale) | 
					
						
							|  |  |  | 				unanimated($('.magazine, .viewer'), togglePageFitMode)('on') | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				unanimated($('.magazine, .viewer'), togglePageFitMode)('off') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				var W = view.width() | 
					
						
							|  |  |  | 				var H = view.height() | 
					
						
							|  |  |  | 				var w = page.width() | 
					
						
							|  |  |  | 				var h = page.height() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				scale = W/(w*PAGES_IN_RIBBON) | 
					
						
							|  |  |  | 				setMagazineScale(scale) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			// NOTE: can't disable transitions on this one because ScrollTo
 | 
					
						
							|  |  |  | 			// 		uses jQuery animation...
 | 
					
						
							|  |  |  | 			setCurrentPage() | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************* helpers ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getPageNumber(page){ | 
					
						
							| 
									
										
										
										
											2013-02-12 18:50:40 +04:00
										 |  |  | 	// a page is given...
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	if(page != null){ | 
					
						
							|  |  |  | 		return $('.page').index($(page)) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-02-12 18:50:40 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// get the next page... 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 	if(!NAVIGATE_RELATIVE_TO_VISIBLE){ | 
					
						
							|  |  |  | 		return $('.page').index($('.current.page')) | 
					
						
							| 
									
										
										
										
											2013-02-12 18:50:40 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// get the closest page to view... 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2013-02-12 03:45:39 +04:00
										 |  |  | 		// XXX this gets crazy when magazine is scaled...
 | 
					
						
							| 
									
										
										
										
											2013-02-14 05:47:25 +04:00
										 |  |  | 		//var s = $('.viewer').scrollLeft()
 | 
					
						
							|  |  |  | 		var o = -$($('.magazine')[0]).offset().left - $('.viewer').offset().left | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 		var W = $('.viewer').width() | 
					
						
							| 
									
										
										
										
											2013-02-12 03:05:20 +04:00
										 |  |  | 		var scale = getMagazineScale() | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 		var cur = -1 | 
					
						
							|  |  |  | 		var res = $('.page').map(function(i, e){ | 
					
						
							|  |  |  | 			e = $(e) | 
					
						
							|  |  |  | 			var l = e.position().left | 
					
						
							| 
									
										
										
										
											2013-02-14 05:47:25 +04:00
										 |  |  | 			//var l = e.offset().left
 | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 			var w = e.width()*scale | 
					
						
							| 
									
										
										
										
											2013-02-14 05:47:25 +04:00
										 |  |  | 			//return Math.abs((l+(w/2)) - (s+(W/2)))
 | 
					
						
							|  |  |  | 			return Math.abs((l+(w/2)) - (o+(W/2))) | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		cur = res.index(Math.min.apply(Math, res)) | 
					
						
							|  |  |  | 		return cur | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 03:45:39 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 03:05:20 +04:00
										 |  |  | function getMagazineScale(){ | 
					
						
							|  |  |  | 	return getElementScale($('.magazine')) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function setMagazineScale(scale){ | 
					
						
							|  |  |  | 	var mag = $('.magazine') | 
					
						
							|  |  |  | 	// NOTE: we are updating margins to make the scroll area adapt to new scale...
 | 
					
						
							|  |  |  | 	var w = mag.width() | 
					
						
							|  |  |  | 	var m = -(w - (w*scale))/2 + $('.viewer').width()/2 | 
					
						
							|  |  |  | 	mag.css({ | 
					
						
							|  |  |  | 		'margin-left': m, | 
					
						
							|  |  |  | 		'margin-right': m | 
					
						
							| 
									
										
										
										
											2013-02-12 03:45:39 +04:00
										 |  |  | 		// XXX also add margins at top and bottom for vertical elements...
 | 
					
						
							| 
									
										
										
										
											2013-02-12 03:05:20 +04:00
										 |  |  | 	}) | 
					
						
							|  |  |  | 	setElementScale(mag, scale) | 
					
						
							|  |  |  | 	setCurrentPage() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | /********************************************************* actions ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function setCurrentPage(n){ | 
					
						
							|  |  |  | 	if(n == null){ | 
					
						
							|  |  |  | 		n = getPageNumber() | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-02-12 03:05:20 +04:00
										 |  |  | 	var scale = getMagazineScale() | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	var l = $('.page').length | 
					
						
							|  |  |  | 	n = n < 0 ? l - n : n | 
					
						
							|  |  |  | 	n = n < -l ? 0 : n | 
					
						
							|  |  |  | 	n = n >= l ? l - 1 : n | 
					
						
							|  |  |  | 	$('.current.page').removeClass('current') | 
					
						
							|  |  |  | 	$($('.page')[n]).addClass('current') | 
					
						
							|  |  |  | 	var cur = $('.current.page') | 
					
						
							| 
									
										
										
										
											2013-02-12 03:05:20 +04:00
										 |  |  | 	if(USE_PAGE_ALIGN | 
					
						
							|  |  |  | 			&& $('.page').width()*2*scale > $('.viewer').width()){ | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 		var align = getPageAlign() | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		var align = 'center' | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if(align == 'left'){ | 
					
						
							|  |  |  | 		var offset = 0 | 
					
						
							|  |  |  | 	} else if(align == 'right'){ | 
					
						
							|  |  |  | 		var offset = $('.viewer').width() - cur.width()*scale | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		var offset = $('.viewer').width()/2 - (cur.width()/2)*scale | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	cur.ScrollTo({ | 
					
						
							| 
									
										
										
										
											2013-02-12 03:45:39 +04:00
										 |  |  | 		offsetTop: $('.viewer').height()/2 - (cur.height()/2)*scale, | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 		offsetLeft: offset | 
					
						
							|  |  |  | 	}) | 
					
						
							| 
									
										
										
										
											2013-02-13 01:05:26 +04:00
										 |  |  | 	return cur | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function nextPage(){ | 
					
						
							|  |  |  | 	setCurrentPage(getPageNumber()+1) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function prevPage(){ | 
					
						
							|  |  |  | 	var n = getPageNumber()-1 | 
					
						
							|  |  |  | 	n = n < 0 ? 0 : n | 
					
						
							|  |  |  | 	setCurrentPage(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function firstPage(){ | 
					
						
							|  |  |  | 	setCurrentPage(0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function lastPage(){ | 
					
						
							|  |  |  | 	setCurrentPage(-1) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | // vim:set ts=4 sw=4 :
 |