| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * XXX add copyright and licence info... | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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'){ | 
					
						
							|  |  |  | 				var n = getPageNumber() | 
					
						
							|  |  |  | 				var scale = getMagazineScale() | 
					
						
							|  |  |  | 				$('.page:not(.no-resize)').width($('.viewer').width()/scale) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				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)
 | 
					
						
							| 
									
										
										
										
											2013-02-20 04:37:47 +04:00
										 |  |  | 				// 		...use the implementation in magazine.js
 | 
					
						
							| 
									
										
										
										
											2013-02-12 04:14:48 +04:00
										 |  |  | 				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
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | /************************************************** event handlers ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | /********************************************************* helpers ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | // XXX make this more acurate...
 | 
					
						
							|  |  |  | // 		...should check mode or if we are in a ribbon...
 | 
					
						
							| 
									
										
										
										
											2013-02-19 22:52:54 +04:00
										 |  |  | var NAVIGATION_MODE_THRESHOLD = 0.7 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | function isNavigationViewRelative(){ | 
					
						
							| 
									
										
										
										
											2013-02-19 22:52:54 +04:00
										 |  |  | 	return getMagazineScale() <= NAVIGATION_MODE_THRESHOLD | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | // XXX there is something here that depends on scale that is either not 
 | 
					
						
							|  |  |  | // 		compensated, or is over compensated...
 | 
					
						
							|  |  |  | function getMagazineOffset(page, scale, align){ | 
					
						
							|  |  |  | 	if(page == null){ | 
					
						
							|  |  |  | 		page = $('.current.page') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if(scale == null){ | 
					
						
							|  |  |  | 		scale = getMagazineScale() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if(align == null){ | 
					
						
							|  |  |  | 		align = getPageAlign(page) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	var mag = $('.magazine') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// calculate the align offset...
 | 
					
						
							|  |  |  | 	if(align == 'left'){ | 
					
						
							|  |  |  | 		var offset = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	} else if(align == 'right'){ | 
					
						
							|  |  |  | 		var offset = $('.viewer').width() - page.width()*scale | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// center (default)
 | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		var offset = $('.viewer').width()/2 - (page.width()/2)*scale | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-20 04:37:47 +04:00
										 |  |  | 	// NOTE: this without scaling also represents the inner width of 
 | 
					
						
							|  |  |  | 	// 		the viewer...
 | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 	var w = mag.outerWidth(true) | 
					
						
							|  |  |  | 	// XXX this depends on scale...
 | 
					
						
							|  |  |  | 	var pos = page.position().left//*scale
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-20 04:37:47 +04:00
										 |  |  | 	var l = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 	return -((w - w*scale)/2 + pos) + offset | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | function getPageNumber(page){ | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 	// a page is given explicitly, get the next one...
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	if(page != null){ | 
					
						
							|  |  |  | 		return $('.page').index($(page)) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-02-12 18:50:40 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 	// get the next page relative to the current... 
 | 
					
						
							|  |  |  | 	if(!isNavigationViewRelative()){ | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 		return $('.page').index($('.current.page')) | 
					
						
							| 
									
										
										
										
											2013-02-12 18:50:40 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 	// get the closest page to view center... 
 | 
					
						
							|  |  |  | 	// NOTE: this ignores page aligns and only gets the page who's center 
 | 
					
						
							|  |  |  | 	// 		is closer to view's center
 | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 		var scale = getMagazineScale() | 
					
						
							| 
									
										
										
										
											2013-02-14 05:47:25 +04:00
										 |  |  | 		var o = -$($('.magazine')[0]).offset().left - $('.viewer').offset().left | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 		var W = $('.viewer').width() | 
					
						
							|  |  |  | 		var cur = -1 | 
					
						
							|  |  |  | 		var res = $('.page').map(function(i, e){ | 
					
						
							|  |  |  | 			e = $(e) | 
					
						
							|  |  |  | 			var l = e.position().left | 
					
						
							|  |  |  | 			var w = e.width()*scale | 
					
						
							| 
									
										
										
										
											2013-02-14 05:47:25 +04:00
										 |  |  | 			return Math.abs((l+(w/2)) - (o+(W/2))) | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 		}).toArray() | 
					
						
							|  |  |  | 		cur = res.indexOf(Math.min.apply(Math, res)) | 
					
						
							| 
									
										
										
										
											2013-02-12 02:23:29 +04:00
										 |  |  | 		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') | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 	var cur = $('.current.page') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 	// center-align ribbon view pages...
 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:38:09 +04:00
										 |  |  | 	var align = isNavigationViewRelative() ? 'center' : null | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 	var left = getMagazineOffset(cur, scale, align) | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	setElementTransform(mag, left, scale) | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return mag | 
					
						
							| 
									
										
										
										
											2013-02-12 03:05:20 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											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 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:48:39 +04:00
										 |  |  | 	// normalize the number...
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	n = n < 0 ? l - n : n | 
					
						
							|  |  |  | 	n = n < -l ? 0 : n | 
					
						
							|  |  |  | 	n = n >= l ? l - 1 : n | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	$('.current.page').removeClass('current') | 
					
						
							|  |  |  | 	$($('.page')[n]).addClass('current') | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	var cur = $('.current.page') | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 	// center-align pages in ribbon view...
 | 
					
						
							| 
									
										
										
										
											2013-02-19 20:38:09 +04:00
										 |  |  | 	var align = isNavigationViewRelative() ? 'center' : null | 
					
						
							| 
									
										
										
										
											2013-02-19 20:08:05 +04:00
										 |  |  | 	var left = getMagazineOffset(cur, null, align) | 
					
						
							| 
									
										
										
										
											2013-02-19 19:34:03 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	setElementTransform($('.magazine'), left, scale) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-13 01:05:26 +04:00
										 |  |  | 	return cur | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-02-19 05:35:42 +04:00
										 |  |  | function nextPage(page){ | 
					
						
							|  |  |  | 	setCurrentPage(getPageNumber(page)+1) | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2013-02-19 05:35:42 +04:00
										 |  |  | function prevPage(page){ | 
					
						
							|  |  |  | 	var n = getPageNumber(page)-1 | 
					
						
							| 
									
										
										
										
											2013-02-12 01:28:52 +04:00
										 |  |  | 	n = n < 0 ? 0 : n | 
					
						
							|  |  |  | 	setCurrentPage(n) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function firstPage(){ | 
					
						
							|  |  |  | 	setCurrentPage(0) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function lastPage(){ | 
					
						
							|  |  |  | 	setCurrentPage(-1) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | // vim:set ts=4 sw=4 :
 |