| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //var DEBUG = DEBUG != null ? DEBUG : true
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | var SLIDESHOW_INTERVAL = 3000 | 
					
						
							|  |  |  | var SLIDESHOW_LOOP = true | 
					
						
							|  |  |  | var SLIDESHOW_DIRECTION = 'next' | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Utils... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // NOTE: this expects a certain structure, this it is not generic...
 | 
					
						
							| 
									
										
										
										
											2013-06-02 05:33:27 +04:00
										 |  |  | //function makeDrawerToggler(contentRenderer, root, element_class, mode_class){
 | 
					
						
							|  |  |  | function makeDrawerToggler(contentRenderer, root){ | 
					
						
							|  |  |  | 	var element_class = '.drawer-block' | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | 	var toggler = createCSSClassToggler( | 
					
						
							|  |  |  | 			root,  | 
					
						
							|  |  |  | 			'drawer-mode overlay', | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 			function(action){ | 
					
						
							|  |  |  | 				// XXX
 | 
					
						
							|  |  |  | 				var body = $(document.body) | 
					
						
							|  |  |  | 				var win = $(window) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// on...
 | 
					
						
							|  |  |  | 				if(action == 'on'){ | 
					
						
							|  |  |  | 					// remove helo when we scroll to the top...
 | 
					
						
							|  |  |  | 					var scroll_handler = function(){ | 
					
						
							|  |  |  | 						if(body.scrollTop() <= 0){ | 
					
						
							|  |  |  | 							toggler('off') | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// prepare and cleanup...
 | 
					
						
							|  |  |  | 					$(element_class).remove() | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 					showInOverlay($(root)) | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// build the help...
 | 
					
						
							|  |  |  | 					var doc = contentRenderer() | 
					
						
							|  |  |  | 						.addClass(element_class.replace('.', ' ')) | 
					
						
							|  |  |  | 						.on('click', function(){ | 
					
						
							|  |  |  | 							event.stopImmediatePropagation() | 
					
						
							|  |  |  | 							return false | 
					
						
							|  |  |  | 						}) | 
					
						
							|  |  |  | 						.css({ | 
					
						
							|  |  |  | 							cursor: 'auto', | 
					
						
							|  |  |  | 						}) | 
					
						
							|  |  |  | 						// XXX depends on body...
 | 
					
						
							|  |  |  | 						.appendTo(body) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// add exit by click...
 | 
					
						
							|  |  |  | 					// XXX depends on body...
 | 
					
						
							|  |  |  | 					body | 
					
						
							|  |  |  | 						.one('click', function(){ | 
					
						
							|  |  |  | 							toggler('off') | 
					
						
							|  |  |  | 						}) | 
					
						
							|  |  |  | 						.css({ | 
					
						
							|  |  |  | 							cursor: 'hand', | 
					
						
							|  |  |  | 						}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// scroll to the help...
 | 
					
						
							|  |  |  | 					// NOTE: need to set the scroll handler AFTER we 
 | 
					
						
							|  |  |  | 					// 		scroll down, or it will be more of a 
 | 
					
						
							|  |  |  | 					// 		tease than a help...
 | 
					
						
							|  |  |  | 					var t = getRelativeVisualPosition($(root), doc).top | 
					
						
							|  |  |  | 					body | 
					
						
							|  |  |  | 						.animate({ | 
					
						
							|  |  |  | 							scrollTop: Math.abs(t) - 40, | 
					
						
							|  |  |  | 						}, function(){ | 
					
						
							|  |  |  | 							// XXX depends on window...
 | 
					
						
							|  |  |  | 							win | 
					
						
							|  |  |  | 								.on('scroll', scroll_handler) | 
					
						
							|  |  |  | 						}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// off...
 | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					// things to cleanup...
 | 
					
						
							|  |  |  | 					var _cleanup = function(){ | 
					
						
							|  |  |  | 						$(element_class).remove() | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 						hideOverlay($(root)) | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 						// XXX depends on body...
 | 
					
						
							|  |  |  | 						body.click() | 
					
						
							|  |  |  | 						win.off('scroll', scroll_handler) | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// animate things if we are not at the top...
 | 
					
						
							|  |  |  | 					if(body.scrollTop() > 0){ | 
					
						
							|  |  |  | 							// XXX depends on body...
 | 
					
						
							|  |  |  | 							body | 
					
						
							|  |  |  | 								.css({ | 
					
						
							|  |  |  | 									cursor: '', | 
					
						
							|  |  |  | 								}) | 
					
						
							|  |  |  | 								.animate({ | 
					
						
							|  |  |  | 									scrollTop: 0, | 
					
						
							|  |  |  | 								}, _cleanup)  | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					// if we are at the top do things fast...
 | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						_cleanup() | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 	return toggler | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Modes | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | // XXX make this save and restore settings...
 | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | var toggleSingleImageMode = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer',  | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 		'single-image-mode', | 
					
						
							| 
									
										
										
										
											2013-06-01 20:16:45 +04:00
										 |  |  | 		function(action){ | 
					
						
							| 
									
										
										
										
											2013-06-09 02:26:22 +04:00
										 |  |  | 			// prevent reentering...
 | 
					
						
							| 
									
										
										
										
											2013-06-01 20:16:45 +04:00
										 |  |  | 			if(action == toggleSingleImageMode('?')){ | 
					
						
							|  |  |  | 				return false | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}, | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 		function(action){ | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 			var w = getScreenWidthInImages() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// single image mode...
 | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 			if(action == 'on'){ | 
					
						
							|  |  |  | 				TRANSITION_MODE_DEFAULT = 'css' | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// save things...
 | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 				UI_STATE['ribbon-mode-screen-images'] = w | 
					
						
							|  |  |  | 				UI_STATE['ribbon-mode-image-info'] = toggleImageInfo('?') | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// load things...
 | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 				w = UI_STATE['single-image-mode-screen-images'] | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 				w = w == null ? 1 : w | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// set stuff...
 | 
					
						
							|  |  |  | 				fitNImages(w) | 
					
						
							| 
									
										
										
										
											2013-05-30 07:29:07 +04:00
										 |  |  | 				toggleImageInfo('off') | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// ribbon mode...
 | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				TRANSITION_MODE_DEFAULT = 'animate' | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// save things...
 | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 				UI_STATE['single-image-mode-screen-images'] = w | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// load things...
 | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 				w = UI_STATE['ribbon-mode-screen-images'] | 
					
						
							| 
									
										
										
										
											2014-01-15 22:52:28 +04:00
										 |  |  | 				w = w == null  | 
					
						
							|  |  |  | 					? getScreenWidthInImages(CONFIG.default_image_size)  | 
					
						
							|  |  |  | 					: w | 
					
						
							| 
									
										
										
										
											2013-05-24 00:09:13 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				fitNImages(w) | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 				var i = UI_STATE['ribbon-mode-image-info'] == 'on' ? 'on' : 'off' | 
					
						
							| 
									
										
										
										
											2013-05-30 07:29:07 +04:00
										 |  |  | 				toggleImageInfo(i) | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 				UI_STATE['ribbon-mode-image-info'] = i | 
					
						
							| 
									
										
										
										
											2013-06-04 01:37:27 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				centerRibbons() | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 19:54:46 +04:00
										 |  |  | // TODO transitions...
 | 
					
						
							|  |  |  | // TODO a real setup UI (instead of prompt)
 | 
					
						
							| 
									
										
										
										
											2014-03-05 01:57:51 +04:00
										 |  |  | //
 | 
					
						
							|  |  |  | // XXX avoid using globals:
 | 
					
						
							|  |  |  | // 		_pre_slideshow_marks_view
 | 
					
						
							|  |  |  | // 		_slideshow_timer
 | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | var toggleSlideShowMode = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer',  | 
					
						
							| 
									
										
										
										
											2013-06-01 20:16:45 +04:00
										 |  |  | 		'.slideshow-mode', | 
					
						
							| 
									
										
										
										
											2013-06-01 19:54:46 +04:00
										 |  |  | 		function(action){ | 
					
						
							|  |  |  | 			if(action == 'on'){ | 
					
						
							|  |  |  | 				updateStatus('Slideshow...').show() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-03-05 01:57:51 +04:00
										 |  |  | 				// XXX hackish...
 | 
					
						
							|  |  |  | 				_pre_slideshow_marks_view = toggleMarksView('?') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 19:54:46 +04:00
										 |  |  | 				// interval from user...
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 				//var interval = prompt('Slideshow interval (sec):', SLIDESHOW_INTERVAL/1000)
 | 
					
						
							| 
									
										
										
										
											2013-06-13 02:02:24 +04:00
										 |  |  | 				formDialog($('.viewer'), 'Slideshow', { | 
					
						
							| 
									
										
										
										
											2013-06-13 17:51:28 +04:00
										 |  |  | 						'Interval': (SLIDESHOW_INTERVAL/1000) + 'sec', | 
					
						
							|  |  |  | 						'Looping': SLIDESHOW_LOOP ? true : false, | 
					
						
							|  |  |  | 						'Reverse direction': SLIDESHOW_DIRECTION == 'prev' ? true : false | 
					
						
							| 
									
										
										
										
											2013-06-13 02:02:24 +04:00
										 |  |  | 				}, 'Start') | 
					
						
							|  |  |  | 					.done(function(data){ | 
					
						
							| 
									
										
										
										
											2013-06-13 17:51:28 +04:00
										 |  |  | 						var looping = data['Looping'] | 
					
						
							|  |  |  | 						var reverse = data['Reverse direction'] | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-13 02:02:24 +04:00
										 |  |  | 						SLIDESHOW_LOOP = looping | 
					
						
							|  |  |  | 						SLIDESHOW_DIRECTION = reverse == true ? 'prev' : 'next' | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-29 16:32:15 +04:00
										 |  |  | 						// parse interval...
 | 
					
						
							|  |  |  | 						var interval_raw = data['Interval'] | 
					
						
							|  |  |  | 						// units...
 | 
					
						
							|  |  |  | 						var M = 1000 | 
					
						
							|  |  |  | 						if(/ms|msec|milsec|millisecond[s]/i.test(interval_raw)){ | 
					
						
							|  |  |  | 							M = 1 | 
					
						
							|  |  |  | 						} else if(/(s|sec|second[s])/i.test(interval_raw)){ | 
					
						
							|  |  |  | 							M = 1000 | 
					
						
							|  |  |  | 						} else if(/m|min|minute[s]/i.test(interval_raw)){ | 
					
						
							|  |  |  | 							M = 1000*60 | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						// fractions...
 | 
					
						
							|  |  |  | 						if(/[0-9]+\/[0-9]+/.test(interval_raw)){ | 
					
						
							|  |  |  | 							var parts = interval_raw.split('/') | 
					
						
							|  |  |  | 							var interval = parseFloat(parts[0]) / parseFloat(parts[1]) | 
					
						
							|  |  |  | 						} else { | 
					
						
							|  |  |  | 							var interval = parseFloat(interval_raw) | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 						SLIDESHOW_INTERVAL = isNaN(interval) ? 3000 : interval*M | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						showStatus('Slideshow: starting:', SLIDESHOW_INTERVAL/1000 +'sec,', SLIDESHOW_LOOP ? 'looped...' : 'unlooped...') | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 					 | 
					
						
							|  |  |  | 						// XXX is this the correct way to go???
 | 
					
						
							|  |  |  | 						hideOverlay($('.viewer')) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 						toggleSingleImageMode('on') | 
					
						
							| 
									
										
										
										
											2014-03-05 01:57:51 +04:00
										 |  |  | 						toggleMarksView('off') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 						_slideshow_timer = setInterval(function(){ | 
					
						
							|  |  |  | 							var cur = getImage() | 
					
						
							|  |  |  | 							// advance the image...
 | 
					
						
							|  |  |  | 							var next = SLIDESHOW_DIRECTION == 'next' ? nextImage() : prevImage() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							// handle slideshow end...
 | 
					
						
							|  |  |  | 							if(getImageGID(cur) == getImageGID(next)){ | 
					
						
							|  |  |  | 								if(SLIDESHOW_LOOP){ | 
					
						
							|  |  |  | 									SLIDESHOW_DIRECTION == 'next' ? firstImage() : lastImage() | 
					
						
							|  |  |  | 								} else { | 
					
						
							|  |  |  | 									toggleSlideShowMode('off') | 
					
						
							| 
									
										
										
										
											2014-03-05 01:57:51 +04:00
										 |  |  | 									toggleMarksView(window._pre_slideshow_marks_view == null ? 'on'  | 
					
						
							|  |  |  | 											: window._pre_slideshow_marks_view) | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 									return  | 
					
						
							|  |  |  | 								} | 
					
						
							|  |  |  | 							} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 							// center and trigger load events...
 | 
					
						
							|  |  |  | 							centerRibbon() | 
					
						
							|  |  |  | 						}, SLIDESHOW_INTERVAL) | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 					// user cancelled...
 | 
					
						
							|  |  |  | 					.fail(function(){ | 
					
						
							|  |  |  | 						toggleSlideShowMode('off') | 
					
						
							| 
									
										
										
										
											2014-03-05 01:57:51 +04:00
										 |  |  | 						toggleMarksView(window._pre_slideshow_marks_view == null ? 'on'  | 
					
						
							|  |  |  | 								: window._pre_slideshow_marks_view) | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 					}) | 
					
						
							| 
									
										
										
										
											2013-06-01 19:54:46 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				window._slideshow_timer != null && clearInterval(_slideshow_timer) | 
					
						
							| 
									
										
										
										
											2013-06-21 20:02:54 +04:00
										 |  |  | 				showStatus('Slideshow: canceled.') | 
					
						
							| 
									
										
										
										
											2014-03-05 01:57:51 +04:00
										 |  |  | 				toggleMarksView(window._pre_slideshow_marks_view == null ? 'on'  | 
					
						
							|  |  |  | 						: window._pre_slideshow_marks_view) | 
					
						
							| 
									
										
										
										
											2013-06-13 02:02:24 +04:00
										 |  |  | 				hideOverlay($('.viewer')) | 
					
						
							| 
									
										
										
										
											2013-06-01 19:54:46 +04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | var toggleTheme = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer', | 
					
						
							| 
									
										
										
										
											2013-05-17 17:58:23 +04:00
										 |  |  | 		[ | 
					
						
							|  |  |  | 			'gray', | 
					
						
							| 
									
										
										
										
											2013-05-18 01:16:56 +04:00
										 |  |  | 			'dark', | 
					
						
							| 
									
										
										
										
											2013-05-17 17:58:23 +04:00
										 |  |  | 			'light' | 
					
						
							| 
									
										
										
										
											2013-05-24 00:32:42 +04:00
										 |  |  | 		], | 
					
						
							| 
									
										
										
										
											2013-06-01 21:06:10 +04:00
										 |  |  | 		// XXX does this get called for default state (gray)???
 | 
					
						
							| 
									
										
										
										
											2013-05-24 00:32:42 +04:00
										 |  |  | 		function(action){ | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 			UI_STATE['global-theme'] = action | 
					
						
							| 
									
										
										
										
											2013-05-24 00:32:42 +04:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-05-17 17:58:23 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | var toggleImageInfo = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer', | 
					
						
							| 
									
										
										
										
											2013-06-01 18:43:14 +04:00
										 |  |  | 		'.image-info-visible', | 
					
						
							|  |  |  | 		function(action){ | 
					
						
							|  |  |  | 			if(toggleSingleImageMode('?') == 'off'){ | 
					
						
							| 
									
										
										
										
											2013-12-15 18:56:21 +04:00
										 |  |  | 				UI_STATE['ribbon-mode-image-info'] = action | 
					
						
							| 
									
										
										
										
											2013-06-01 18:43:14 +04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-05-30 03:26:49 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | var toggleInlineImageInfo = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer',  | 
					
						
							| 
									
										
										
										
											2013-05-30 19:15:38 +04:00
										 |  |  | 		'.image-info-inline-visible', | 
					
						
							|  |  |  | 		function(action){ | 
					
						
							|  |  |  | 			if(action == 'on'){ | 
					
						
							|  |  |  | 				$(document) | 
					
						
							|  |  |  | 					.on('mouseover', inlineImageInfoHoverHandler) | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				$(document) | 
					
						
							|  |  |  | 					.off('mouseover', inlineImageInfoHoverHandler) | 
					
						
							|  |  |  | 					$('.inline-image-info').remove() | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | // Toggle image container proportions mode
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Available modes:
 | 
					
						
							|  |  |  | // 	- none			: square proportions
 | 
					
						
							|  |  |  | // 	- fit-viewer	: calculate proportions
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // If CONFIG.proportions_ratio_threshold is null or if ignore_thresholds,
 | 
					
						
							|  |  |  | // is set, this willsimply switch between square and viewer proportions.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // If CONFIG.proportions_ratio_threshold is set to a list of two values,
 | 
					
						
							|  |  |  | // this will use the screen width in images (S) to calculate the 
 | 
					
						
							|  |  |  | // proportions:
 | 
					
						
							|  |  |  | // 			S < min 		: viewer proportions
 | 
					
						
							|  |  |  | // 			S > max			: square proportions
 | 
					
						
							|  |  |  | // 			min > S < max	: transitional, proportions between 
 | 
					
						
							|  |  |  | // 								square and viewer...
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // NOTE: if n is not passed, getScreenWidthInImages() will be used...
 | 
					
						
							|  |  |  | // NOTE: if ignore_thresholds is set or the threshold is not a list, this
 | 
					
						
							|  |  |  | // 		will ignore the threshold...
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // XXX is this the right place to calculate proportions??? (revise)
 | 
					
						
							| 
									
										
										
										
											2013-06-03 21:10:42 +04:00
										 |  |  | var toggleImageProportions = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer', | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 		[ | 
					
						
							| 
									
										
										
										
											2013-06-03 22:45:01 +04:00
										 |  |  | 			'none', | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 			'fit-viewer' | 
					
						
							|  |  |  | 		], | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 		function(action, viewer, n, ignore_thresholds){ | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 			var image = $('.image') | 
					
						
							|  |  |  | 			// viewer proportions...
 | 
					
						
							| 
									
										
										
										
											2013-06-03 18:31:37 +04:00
										 |  |  | 			if(action == 'fit-viewer'){ | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 				// NOTE: we care about n only in fit-viewer mode...
 | 
					
						
							|  |  |  | 				n = n == null ? getScreenWidthInImages() : n | 
					
						
							|  |  |  | 				var threshold = CONFIG.proportions_ratio_threshold | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// image proportions between square and viewer indicator...
 | 
					
						
							|  |  |  | 				//
 | 
					
						
							|  |  |  | 				// must be between 0 and 1:
 | 
					
						
							|  |  |  | 				// 	- 1 is square proportions
 | 
					
						
							|  |  |  | 				// 	- 0 is viewer proportions
 | 
					
						
							|  |  |  | 				var c = 0 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				// calculate c...
 | 
					
						
							|  |  |  | 				if(!ignore_thresholds  | 
					
						
							|  |  |  | 						&& (threshold != null  | 
					
						
							|  |  |  | 							|| threshold.length == 2)){ | 
					
						
							|  |  |  | 					var min = Math.min.apply(null, threshold) | 
					
						
							|  |  |  | 					var max = Math.max.apply(null, threshold) | 
					
						
							|  |  |  | 					var c = (n - min) / (max - min) | 
					
						
							|  |  |  | 					c = c < 0 ? 0  | 
					
						
							|  |  |  | 						: c > 1 ? 1  | 
					
						
							|  |  |  | 						: c | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 				var W = viewer.innerWidth() | 
					
						
							|  |  |  | 				var H = viewer.innerHeight() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 				// landscape viewer...
 | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 				if(W > H){ | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 					var h = image.outerHeight(true) | 
					
						
							|  |  |  | 					var scale = h/H | 
					
						
							|  |  |  | 					var tw = W * scale | 
					
						
							|  |  |  | 					var d = tw - h | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 02:18:14 +04:00
										 |  |  | 					image.css({ | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 						//width: W * scale,
 | 
					
						
							|  |  |  | 						width: tw - (d * c), | 
					
						
							| 
									
										
										
										
											2013-12-18 02:18:14 +04:00
										 |  |  | 						height: '', | 
					
						
							|  |  |  | 					}) | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				// portrait viewer...
 | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 				} else { | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 					var w = image.outerWidth(true) | 
					
						
							|  |  |  | 					var scale = w/W | 
					
						
							|  |  |  | 					var th = H * scale | 
					
						
							|  |  |  | 					var d = th - w | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 02:18:14 +04:00
										 |  |  | 					image.css({ | 
					
						
							|  |  |  | 						width: '', | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 						//height: H * scale,
 | 
					
						
							|  |  |  | 						height: th - d * c, | 
					
						
							| 
									
										
										
										
											2013-12-18 02:18:14 +04:00
										 |  |  | 					}) | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// square proportions...
 | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 			// NOTE: this will reset the size to default (defined in CSS)
 | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				image.css({ | 
					
						
							| 
									
										
										
										
											2013-12-18 04:58:59 +04:00
										 |  |  | 					width: '', | 
					
						
							|  |  |  | 					height: '' | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 				}) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-12-18 21:48:40 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-05 02:51:43 +04:00
										 |  |  | 			// account for rotation...
 | 
					
						
							|  |  |  | 			correctImageProportionsForRotation(image) | 
					
						
							|  |  |  | 			centerView(null, 'css') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-18 21:48:40 +04:00
										 |  |  | 			viewer.trigger('updatingImageProportions') | 
					
						
							| 
									
										
										
										
											2013-06-03 17:48:27 +04:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-05-18 01:16:56 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | var toggleHelp = makeDrawerToggler( | 
					
						
							|  |  |  | 		function(){ | 
					
						
							| 
									
										
										
										
											2013-06-02 04:55:10 +04:00
										 |  |  | 			// XXX populate...
 | 
					
						
							|  |  |  | 			// 		...load from file.
 | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 			return $('<h1>Help</h1>') | 
					
						
							| 
									
										
										
										
											2013-06-02 05:33:27 +04:00
										 |  |  | 		}, '.viewer') | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var toggleKeyboardHelp = makeDrawerToggler( | 
					
						
							|  |  |  | 		function(){ | 
					
						
							|  |  |  | 			return buildKeybindingsHelpHTML(KEYBOARD_CONFIG) | 
					
						
							| 
									
										
										
										
											2013-06-02 05:33:27 +04:00
										 |  |  | 		}, '.viewer') | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var toggleOptionsUI = makeDrawerToggler( | 
					
						
							|  |  |  | 		function(){ | 
					
						
							| 
									
										
										
										
											2013-06-02 04:55:10 +04:00
										 |  |  | 			// XXX populate...
 | 
					
						
							| 
									
										
										
										
											2013-06-02 02:54:52 +04:00
										 |  |  | 			return $('<h1>Options</h1>') | 
					
						
							| 
									
										
										
										
											2013-06-02 05:33:27 +04:00
										 |  |  | 		}, '.viewer') | 
					
						
							| 
									
										
										
										
											2013-05-23 16:13:10 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-02 05:33:27 +04:00
										 |  |  | // XXX needs styling and cleanup...
 | 
					
						
							|  |  |  | // XXX add a preview...
 | 
					
						
							|  |  |  | var toggleImageInfoDrawer = makeDrawerToggler( | 
					
						
							|  |  |  | 		function(){ | 
					
						
							|  |  |  | 			var gid = getImageGID(getImage()) | 
					
						
							|  |  |  | 			var r = getRibbonIndex(getRibbon()) | 
					
						
							|  |  |  | 			var data = IMAGES[gid] | 
					
						
							|  |  |  | 			var orientation = data.orientation | 
					
						
							|  |  |  | 			orientation = orientation == null ? 0 : orientation | 
					
						
							|  |  |  | 			var order = DATA.order.indexOf(gid) | 
					
						
							| 
									
										
										
										
											2013-10-18 05:03:11 +04:00
										 |  |  | 			var name = getImageFileName(gid) | 
					
						
							| 
									
										
										
										
											2013-06-02 05:33:27 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			return $('<div>'+ | 
					
						
							|  |  |  | 					'<h1>"'+ name +'"</h1>'+ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 					'Orientation: '+ orientation +'deg<br>'+ | 
					
						
							|  |  |  | 					'GID: '+ gid +'<br>'+ | 
					
						
							|  |  |  | 					'Path: "'+ data.path +'"<br>'+ | 
					
						
							|  |  |  | 					'Order: '+ order +'<br>'+ | 
					
						
							|  |  |  | 					'Position (ribbon): '+ (DATA.ribbons[r].indexOf(gid)+1) + | 
					
						
							|  |  |  | 						'/'+ DATA.ribbons[r].length +'<br>'+ | 
					
						
							|  |  |  | 					'Position (global): '+ (order+1) +'/'+ DATA.order.length +'<br>'+ | 
					
						
							|  |  |  | 				'</div>') | 
					
						
							|  |  |  | 		}, '.viewer') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-23 16:13:10 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-05 02:51:43 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Experimental... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getImageProportions(gid){ | 
					
						
							|  |  |  | 	gid = gid == null ? getImageGID() : gid | 
					
						
							|  |  |  | 	var o = IMAGES[gid].orientation | 
					
						
							|  |  |  | 	o = o == null ? 0 : o | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var res = $.Deferred() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var i = new Image() | 
					
						
							|  |  |  | 	i.onload = function(){ | 
					
						
							|  |  |  | 		if(o == 0 || o == 180){ | 
					
						
							|  |  |  | 			var w = i.width/i.height | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			var w = i.height/i.width | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 		res.resolve(w) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	i.src = getBestPreview(gid).url | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function _fitImageToRibbonHeight(gid, image){ | 
					
						
							|  |  |  | 	setTimeout(function(){ | 
					
						
							|  |  |  | 		getImageProportions(gid).done(function(r){ | 
					
						
							|  |  |  | 			var h = image.height() | 
					
						
							|  |  |  | 			image.css({ | 
					
						
							|  |  |  | 				width: h * r, | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			correctImageProportionsForRotation(image, image) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	}, 0) | 
					
						
							|  |  |  | 	return image | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX this does not work yet + I'm not sure if we need it...
 | 
					
						
							|  |  |  | var toggleRibbonImageProportions = createCSSClassToggler( | 
					
						
							|  |  |  | 		'.viewer', | 
					
						
							|  |  |  | 		[ | 
					
						
							|  |  |  | 			'none', | 
					
						
							|  |  |  | 			'ribbon-image-proportions' | 
					
						
							|  |  |  | 		], | 
					
						
							|  |  |  | 		function(action){ | 
					
						
							|  |  |  | 			var image = $('.image') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(action == 'ribbon-image-proportions'){ | 
					
						
							|  |  |  | 				// register the updater...
 | 
					
						
							|  |  |  | 				IMAGE_UPDATERS.push(_fitImageToRibbonHeight) | 
					
						
							|  |  |  | 				updateImages() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				// unregister the updater...
 | 
					
						
							|  |  |  | 				IMAGE_UPDATERS.splice(IMAGE_UPDATERS.indexOf(_fitImageToRibbonHeight), 1) | 
					
						
							|  |  |  | 				image.css({ | 
					
						
							|  |  |  | 					width: '', | 
					
						
							|  |  |  | 					height: '' | 
					
						
							|  |  |  | 				}) | 
					
						
							|  |  |  | 				// account for rotation...
 | 
					
						
							|  |  |  | 				correctImageProportionsForRotation(image) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			centerView(null, 'css') | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-05-17 15:34:45 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 :                                                */ |