| 
									
										
										
										
											2013-05-14 18:10:33 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //var DEBUG = DEBUG != null ? DEBUG : true
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 21:44:49 +04:00
										 |  |  | var CURSOR_SHOW_THRESHOLD = 20 | 
					
						
							| 
									
										
										
										
											2013-06-01 21:33:59 +04:00
										 |  |  | var CURSOR_HIDE_TIMEOUT = 1000 | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 01:48:22 +04:00
										 |  |  | var STATUS_QUEUE = [] | 
					
						
							|  |  |  | var STATUS_QUEUE_TIME = 200 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-15 14:33:26 +04:00
										 |  |  | var CONTEXT_INDICATOR_UPDATERS = [] | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-30 05:56:27 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | // this can be:
 | 
					
						
							|  |  |  | // 	- 'floating'
 | 
					
						
							|  |  |  | // 	- 'panel'
 | 
					
						
							|  |  |  | var PROGRESS_WIDGET_CONTAINER = 'floating' | 
					
						
							| 
									
										
										
										
											2014-01-25 02:07:21 +04:00
										 |  |  | // can be between 0 and 3000
 | 
					
						
							|  |  |  | var PROGRESS_HIDE_TIMEOUT = 1500 | 
					
						
							| 
									
										
										
										
											2013-06-08 01:48:22 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 14:40:15 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | // XXX revise...
 | 
					
						
							| 
									
										
										
										
											2013-06-01 18:43:14 +04:00
										 |  |  | // NOTE: to catch the click event correctly while the cursor is hidden
 | 
					
						
							|  |  |  | //		this must be the first to get the event...
 | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | // NOTE: this uses element.data to store the timer and cursor position...
 | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | function autoHideCursor(elem){ | 
					
						
							|  |  |  | 	elem = $(elem) | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 	var data = elem.data() | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 	elem | 
					
						
							|  |  |  | 		.on('mousemove', function(evt){ | 
					
						
							| 
									
										
										
										
											2013-06-01 21:33:59 +04:00
										 |  |  | 			var cursor = elem.css('cursor') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 			data._cursor_pos = data._cursor_pos == null || cursor != 'none' ? | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 						[evt.clientX, evt.clientY]  | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 					: data._cursor_pos | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 21:33:59 +04:00
										 |  |  | 			// cursor visible -- extend visibility...
 | 
					
						
							|  |  |  | 			if(cursor != 'none'){ | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 				if(data._cursor_timeout != null){ | 
					
						
							|  |  |  | 					clearTimeout(data._cursor_timeout) | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 				data._cursor_timeout = setTimeout(function(){ | 
					
						
							|  |  |  | 						if(Math.abs(evt.clientX - data._cursor_pos[0]) < CURSOR_SHOW_THRESHOLD  | 
					
						
							|  |  |  | 								|| Math.abs(evt.clientY - data._cursor_pos[1]) < CURSOR_SHOW_THRESHOLD){ | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 21:33:59 +04:00
										 |  |  | 							elem.css('cursor', 'none') | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}, CURSOR_HIDE_TIMEOUT) | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 21:33:59 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 			// cursor hidden -- if outside the threshold, show...
 | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 			} else if(Math.abs(evt.clientX - data._cursor_pos[0]) > CURSOR_SHOW_THRESHOLD  | 
					
						
							|  |  |  | 				|| Math.abs(evt.clientY - data._cursor_pos[1]) > CURSOR_SHOW_THRESHOLD){ | 
					
						
							| 
									
										
										
										
											2013-06-01 21:33:59 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 				elem.css('cursor', '') | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-06-01 18:43:14 +04:00
										 |  |  | 		.click(function(evt){ | 
					
						
							|  |  |  | 			if(elem.css('cursor') == 'none'){ | 
					
						
							|  |  |  | 				//event.stopImmediatePropagation()
 | 
					
						
							|  |  |  | 				//event.preventDefault()
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 				if(data._cursor_timeout != null){ | 
					
						
							|  |  |  | 					clearTimeout(data._cursor_timeout) | 
					
						
							|  |  |  | 					data._cursor_timeout = null | 
					
						
							| 
									
										
										
										
											2013-06-01 18:43:14 +04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				elem.css('cursor', '') | 
					
						
							|  |  |  | 				//return false
 | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 	return elem | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | /* | 
					
						
							|  |  |  | // XXX does not work...
 | 
					
						
							|  |  |  | // 		...does not show the cursor without moving it...
 | 
					
						
							|  |  |  | function showCursor(elem){ | 
					
						
							|  |  |  | 	elem = $(elem) | 
					
						
							|  |  |  | 	var data = elem.data() | 
					
						
							|  |  |  | 	if(data._cursor_timeout != null){ | 
					
						
							|  |  |  | 		clearTimeout(data._cursor_timeout) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	elem.css('cursor', '') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-15 14:33:26 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function setupIndicators(){ | 
					
						
							|  |  |  | 	showGlobalIndicator( | 
					
						
							| 
									
										
										
										
											2014-02-02 05:23:13 +04:00
										 |  |  | 			'cropped-view',  | 
					
						
							|  |  |  | 			'Cropped view (shift-F2/F3/C/F)') | 
					
						
							| 
									
										
										
										
											2013-12-15 14:33:26 +04:00
										 |  |  | 		.css('cursor', 'hand') | 
					
						
							| 
									
										
										
										
											2014-02-02 05:23:13 +04:00
										 |  |  | 		.click(function(){ uncropData() }) | 
					
						
							| 
									
										
										
										
											2013-12-15 14:33:26 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function makeContextIndicatorUpdater(image_class){ | 
					
						
							|  |  |  | 	var _updater = function(image){ | 
					
						
							|  |  |  | 		var indicator = $('.context-mode-indicators .current-image-'+image_class) | 
					
						
							|  |  |  | 		if(image.hasClass(image_class)){ | 
					
						
							|  |  |  | 			indicator.addClass('shown') | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			indicator.removeClass('shown') | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	CONTEXT_INDICATOR_UPDATERS.push(_updater) | 
					
						
							|  |  |  | 	return _updater | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function updateContextIndicators(image){ | 
					
						
							|  |  |  | 	image = image == null ? getImage() : $(image) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	CONTEXT_INDICATOR_UPDATERS.map(function(update){ | 
					
						
							|  |  |  | 		update(image) | 
					
						
							|  |  |  | 	})	 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-02 08:50:43 +04:00
										 |  |  | function showCurrentMarker(){ | 
					
						
							|  |  |  | 	return $('<div/>') | 
					
						
							|  |  |  | 		.addClass('current-marker') | 
					
						
							|  |  |  | 		.css({ | 
					
						
							|  |  |  | 			opacity: '0', | 
					
						
							|  |  |  | 			top: '0px', | 
					
						
							|  |  |  | 			left: '0px', | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.appendTo($('.ribbon-set')) | 
					
						
							|  |  |  | 		.animate({ | 
					
						
							|  |  |  | 			'opacity': 1 | 
					
						
							|  |  |  | 		}, 500) | 
					
						
							|  |  |  | 		.mouseover(function(){ | 
					
						
							|  |  |  | 			$('.current.image') | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function updateCurrentMarker(){ | 
					
						
							|  |  |  | 	var scale = getElementScale($('.ribbon-set')) | 
					
						
							|  |  |  | 	var marker = $('.current-marker') | 
					
						
							| 
									
										
										
										
											2013-12-18 21:48:40 +04:00
										 |  |  | 	var cur = $('.current.image') | 
					
						
							|  |  |  | 	var w = cur.outerWidth(true) | 
					
						
							|  |  |  | 	var h = cur.outerHeight(true) | 
					
						
							| 
									
										
										
										
											2013-12-02 08:50:43 +04:00
										 |  |  | 	marker = marker.length == 0 ? showCurrentMarker() : marker  | 
					
						
							| 
									
										
										
										
											2013-12-18 21:48:40 +04:00
										 |  |  | 	var d = getRelativeVisualPosition(marker, cur) | 
					
						
							| 
									
										
										
										
											2013-12-02 08:50:43 +04:00
										 |  |  | 	return marker.css({ | 
					
						
							|  |  |  | 		top: parseFloat(marker.css('top')) + d.top/scale, | 
					
						
							|  |  |  | 		left: parseFloat(marker.css('left')) + d.left/scale, | 
					
						
							| 
									
										
										
										
											2013-12-18 21:48:40 +04:00
										 |  |  | 		// keep size same as the image...
 | 
					
						
							|  |  |  | 		width: w, | 
					
						
							|  |  |  | 		height: h, | 
					
						
							| 
									
										
										
										
											2013-12-02 08:50:43 +04:00
										 |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 20:04:27 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | function flashIndicator(direction){ | 
					
						
							|  |  |  | 	var cls = { | 
					
						
							| 
									
										
										
										
											2013-06-08 02:29:14 +04:00
										 |  |  | 		// shift up/down...
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 		prev: '.up-indicator', | 
					
						
							|  |  |  | 		next: '.down-indicator', | 
					
						
							| 
									
										
										
										
											2013-06-08 05:46:57 +04:00
										 |  |  | 		// hit start/end/top/bottom of view...
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 		start: '.start-indicator', | 
					
						
							|  |  |  | 		end: '.end-indicator', | 
					
						
							| 
									
										
										
										
											2013-06-08 02:29:14 +04:00
										 |  |  | 		top: '.top-indicator', | 
					
						
							|  |  |  | 		bottom: '.bottom-indicator', | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 	}[direction] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var indicator = $(cls) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(indicator.length == 0){ | 
					
						
							|  |  |  | 		indicator = $('<div>') | 
					
						
							|  |  |  | 			.addClass(cls.replace('.', '')) | 
					
						
							|  |  |  | 			.appendTo($('.viewer')) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return indicator | 
					
						
							|  |  |  | 		// NOTE: this needs to be visible in all cases and key press 
 | 
					
						
							|  |  |  | 		// 		rhythms... 
 | 
					
						
							|  |  |  | 		.show() | 
					
						
							|  |  |  | 		.delay(100) | 
					
						
							|  |  |  | 		.fadeOut(300) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | function showRibbonIndicator(){ | 
					
						
							|  |  |  | 	var cls = '.ribbon-indicator' | 
					
						
							|  |  |  | 	var indicator = $(cls) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(indicator.length == 0){ | 
					
						
							|  |  |  | 		indicator = $('<div>') | 
					
						
							|  |  |  | 			.addClass(cls.replace('.', '')) | 
					
						
							|  |  |  | 			.appendTo($('.viewer')) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var r = getRibbonIndex() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// get the base ribbon...
 | 
					
						
							| 
									
										
										
										
											2013-09-27 21:45:31 +04:00
										 |  |  | 	var base = getBaseRibbonIndex() | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var r =  r == base ? r+'*' : r | 
					
						
							|  |  |  | 	return indicator.text(r) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-27 21:45:31 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | function flashRibbonIndicator(){ | 
					
						
							|  |  |  | 	var indicator = showRibbonIndicator() | 
					
						
							|  |  |  | 	var cls = '.flashing-ribbon-indicator' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var flashing_indicator = $(cls) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(flashing_indicator.length == 0){ | 
					
						
							|  |  |  | 		flashing_indicator = indicator | 
					
						
							|  |  |  | 			.clone() | 
					
						
							|  |  |  | 			.addClass(cls.replace('.', '')) | 
					
						
							|  |  |  | 			.appendTo($('.viewer')) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return flashing_indicator | 
					
						
							| 
									
										
										
										
											2013-09-21 03:09:19 +04:00
										 |  |  | //		.stop()
 | 
					
						
							|  |  |  | //		.show()
 | 
					
						
							|  |  |  | //		.delay(200)
 | 
					
						
							|  |  |  | //		.fadeOut(500)
 | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | 		.show() | 
					
						
							| 
									
										
										
										
											2013-09-21 03:09:19 +04:00
										 |  |  | 		.delay(100) | 
					
						
							|  |  |  | 		.fadeOut(300) | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | // Update an info element
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // align can be:
 | 
					
						
							|  |  |  | // 	- top
 | 
					
						
							|  |  |  | // 	- bottom
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // If target is an existing info container (class: overlay-info) then 
 | 
					
						
							|  |  |  | // just fill that.
 | 
					
						
							|  |  |  | function updateInfo(elem, data, target){ | 
					
						
							|  |  |  | 	var viewer = $('.viewer') | 
					
						
							|  |  |  | 	target = target == null ? viewer : $(target) | 
					
						
							|  |  |  | 	elem = elem == null ? $('.overlay-info') : $(elem) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(elem.length == 0){ | 
					
						
							|  |  |  | 		elem = $('<div/>') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	elem | 
					
						
							|  |  |  | 		.addClass('overlay-info') | 
					
						
							|  |  |  | 		.html('') | 
					
						
							|  |  |  | 		.off() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(typeof(data) == typeof('abc')){ | 
					
						
							|  |  |  | 		elem.html(data) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		elem.append(data) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-03 07:46:57 +04:00
										 |  |  | 	elem  | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 		.appendTo(target) | 
					
						
							| 
									
										
										
										
											2014-02-03 07:46:57 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return elem | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function showInfo(elem, data, target){ | 
					
						
							|  |  |  | 	elem = elem == null ? $('.overlay-info') : elem | 
					
						
							|  |  |  | 	elem = data == null ? elem : updateInfo(elem, data, traget) | 
					
						
							|  |  |  | 	return elem.fadeIn() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function hideInfo(elem){ | 
					
						
							|  |  |  | 	elem = elem == null ? $('.overlay-info') : elem | 
					
						
							|  |  |  | 	return elem.fadeOut() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Update status message
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // NOTE: this will update message content and return it as-is, things 
 | 
					
						
							|  |  |  | // 		like showing the message are to be done manually...
 | 
					
						
							|  |  |  | // 		see: showStatus(...) and showErrorStatus(...) for a higher level
 | 
					
						
							|  |  |  | // 		API...
 | 
					
						
							|  |  |  | // NOTE: in addition to showing user status, this will also log the 
 | 
					
						
							|  |  |  | // 		satus to browser console...
 | 
					
						
							|  |  |  | // NOTE: the message will be logged to console via either console.log(...)
 | 
					
						
							|  |  |  | // 		or console.error(...), if the message starts with "Error".
 | 
					
						
							|  |  |  | // NOTE: if message is null, then just return the status element...
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // XXX add abbility to append and clear status...
 | 
					
						
							|  |  |  | function updateStatus(message){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var elem = $('.global-status') | 
					
						
							|  |  |  | 	if(elem.length == 0){ | 
					
						
							|  |  |  | 		elem = $('<div class="global-status"/>') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	if(message == null){ | 
					
						
							|  |  |  | 		return elem | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(typeof(message) == typeof('s') && /^error.*/i.test(message)){ | 
					
						
							|  |  |  | 		console.error.apply(console, arguments) | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		console.log.apply(console, arguments) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(arguments.length > 1){ | 
					
						
							|  |  |  | 		message = Array.apply(Array, arguments).join(' ') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return updateInfo(elem, message) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Same as updateInfo(...) but will aslo show and animate-close the message
 | 
					
						
							| 
									
										
										
										
											2013-06-04 16:32:33 +04:00
										 |  |  | //
 | 
					
						
							|  |  |  | // XXX the next call will not reset the animation of the previous, rather 
 | 
					
						
							|  |  |  | // 		it will pause it and rezume...
 | 
					
						
							|  |  |  | // 		...not sure if this is correct.
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | function showStatus(message){ | 
					
						
							|  |  |  | 	return updateStatus.apply(null, arguments) | 
					
						
							| 
									
										
										
										
											2013-06-04 16:32:33 +04:00
										 |  |  | 		//.stop()
 | 
					
						
							|  |  |  | 		.stop(true, false) | 
					
						
							|  |  |  | 		//.finish()
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 		.show() | 
					
						
							|  |  |  | 		.delay(500) | 
					
						
							|  |  |  | 		.fadeOut(800) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-08 01:48:22 +04:00
										 |  |  | // Same as showStatus(...) but queue the message so as to display it for
 | 
					
						
							|  |  |  | // a meaningful amount of time...
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | //	- This will print the first message right away.
 | 
					
						
							|  |  |  | //	- Each consecutive message if STATUS_QUEUE_TIME has not passed yet 
 | 
					
						
							|  |  |  | //		will get queued.
 | 
					
						
							|  |  |  | //	- Once the STATUS_QUEUE_TIME has passed the next message is reported 
 | 
					
						
							|  |  |  | // 		and so on until the queue is empty.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // NOTE: for very a fast and large sequence of messages the reporting 
 | 
					
						
							|  |  |  | // 		may (will) take longer (significantly) than the actual "job"...
 | 
					
						
							|  |  |  | // NOTE: this will delay the logging also...
 | 
					
						
							|  |  |  | function showStatusQ(message){ | 
					
						
							|  |  |  | 	if(STATUS_QUEUE.length == 0){ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		// end marker...
 | 
					
						
							|  |  |  | 		STATUS_QUEUE.push(0) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		showStatus.apply(null, arguments) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		function _printer(){ | 
					
						
							|  |  |  | 			// if queue is empty we have nothing to do...
 | 
					
						
							|  |  |  | 			if(STATUS_QUEUE.length == 1){ | 
					
						
							|  |  |  | 				STATUS_QUEUE.pop() | 
					
						
							|  |  |  | 				return | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			// if not empty show a status and repeat...
 | 
					
						
							|  |  |  | 			showStatus.apply(null, STATUS_QUEUE.pop()) | 
					
						
							|  |  |  | 			setTimeout(_printer, STATUS_QUEUE_TIME) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		setTimeout(_printer, STATUS_QUEUE_TIME) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// queue not empty...
 | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		STATUS_QUEUE.splice(1, 0, Array.apply(Array, arguments)) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | // Same as showStatus(...) but will always add 'Error: ' to the start 
 | 
					
						
							|  |  |  | // of the message
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // NOTE: this will show the message but will not hide it.
 | 
					
						
							|  |  |  | function showErrorStatus(message){ | 
					
						
							|  |  |  | 	message = Array.apply(Array, arguments) | 
					
						
							|  |  |  | 	message.splice(0, 0, 'Error:') | 
					
						
							| 
									
										
										
										
											2014-02-03 07:46:57 +04:00
										 |  |  | 	//return showStatusQ.apply(null, message)
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 	return updateStatus.apply(null, message) | 
					
						
							|  |  |  | 		.one('click', function(){ $(this).fadeOut() }) | 
					
						
							| 
									
										
										
										
											2013-06-04 16:32:33 +04:00
										 |  |  | 		//.stop()
 | 
					
						
							|  |  |  | 		.stop(true, false) | 
					
						
							|  |  |  | 		//.finish()
 | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 		.show() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // shorthand methods...
 | 
					
						
							|  |  |  | function hideStatus(){ | 
					
						
							|  |  |  | 	// yes, this indeed looks funny -- to hide a status you need to show
 | 
					
						
							|  |  |  | 	// it without any arguments... ;)
 | 
					
						
							|  |  |  | 	return showStatus() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function getStatus(){ | 
					
						
							|  |  |  | 	return updateStatus() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function makeIndicator(text){ | 
					
						
							| 
									
										
										
										
											2013-06-08 02:29:14 +04:00
										 |  |  | 	return $('<span class="indicator expanding-text">'+ | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 				'<span class="hidden">'+ text +'</span>'+ | 
					
						
							|  |  |  | 				'<span class="shown">'+ text[0] +'</span>'+ | 
					
						
							|  |  |  | 			'</span>') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function showGlobalIndicator(cls, text){ | 
					
						
							|  |  |  | 	var c = $('.global-mode-indicators') | 
					
						
							|  |  |  | 	if(c.length == 0){ | 
					
						
							|  |  |  | 		c = $('<div>') | 
					
						
							|  |  |  | 			.addClass('global-mode-indicators') | 
					
						
							| 
									
										
										
										
											2013-06-08 02:29:14 +04:00
										 |  |  | 			.append('<span class="mode-tip">Global status</span>') | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 			.appendTo($('.viewer')) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return makeIndicator(text) | 
					
						
							|  |  |  | 			.addClass(cls) | 
					
						
							|  |  |  | 			.appendTo(c) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | function showContextIndicator(cls, text){ | 
					
						
							|  |  |  | 	var c = $('.context-mode-indicators') | 
					
						
							|  |  |  | 	if(c.length == 0){ | 
					
						
							|  |  |  | 		c = $('<div>') | 
					
						
							|  |  |  | 			.addClass('context-mode-indicators') | 
					
						
							| 
									
										
										
										
											2013-06-08 02:29:14 +04:00
										 |  |  | 			.append('<span class="mode-tip">Context status</span>') | 
					
						
							| 
									
										
										
										
											2013-06-04 09:29:38 +04:00
										 |  |  | 			.appendTo($('.viewer')) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return makeIndicator(text) | 
					
						
							|  |  |  | 			.addClass(cls) | 
					
						
							|  |  |  | 			.appendTo(c) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Progress bar... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Make or get progress bar container...
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:25:19 +04:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | // mode can be:
 | 
					
						
							|  |  |  | // 	- null			- default
 | 
					
						
							|  |  |  | // 	- 'floating'
 | 
					
						
							|  |  |  | // 	- 'panel'
 | 
					
						
							|  |  |  | function getProgressContainer(mode, parent){ | 
					
						
							|  |  |  | 	parent = parent == null ? $('.viewer') : parent | 
					
						
							|  |  |  | 	mode = mode == null ? PROGRESS_WIDGET_CONTAINER : mode | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(mode == 'floating'){ | 
					
						
							|  |  |  | 		// widget container...
 | 
					
						
							|  |  |  | 		var container = parent.find('.progress-container') | 
					
						
							|  |  |  | 		if(container.length == 0){ | 
					
						
							|  |  |  | 			container = $('<div class="progress-container"/>') | 
					
						
							|  |  |  | 				.appendTo(parent) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		var container = getPanel('Progress') | 
					
						
							|  |  |  | 		if(container.length == 0){ | 
					
						
							|  |  |  | 			container = makeSubPanel('Progress') | 
					
						
							|  |  |  | 				.addClass('.progress-container') | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		container = container.find('.content') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return container | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Make or get progress bar by name...
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-01-30 06:28:47 +04:00
										 |  |  | // Setting close to false will disable the close button...
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:25:19 +04:00
										 |  |  | // Events:
 | 
					
						
							| 
									
										
										
										
											2014-01-25 07:58:47 +04:00
										 |  |  | // 	- progressUpdate (done, total)
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:25:19 +04:00
										 |  |  | // 		Triggered by user to update progress bar state.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 		takes two arguments:
 | 
					
						
							|  |  |  | // 			done	- the number of done tasks
 | 
					
						
							|  |  |  | // 			total	- the total number of tasks
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 		Usage:
 | 
					
						
							|  |  |  | // 			widget.trigger('progressUpdate', [done, total])
 | 
					
						
							|  |  |  | // 			
 | 
					
						
							|  |  |  | // 		Shorthand:
 | 
					
						
							|  |  |  | // 			updateProgressBar(name, done[, total])
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 	- progressClose
 | 
					
						
							|  |  |  | // 		Triggered by the close button.
 | 
					
						
							|  |  |  | //		By default triggers the progressDone event.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 		Shorthand:
 | 
					
						
							| 
									
										
										
										
											2014-02-18 00:20:51 +04:00
										 |  |  | // 			closeProgressBar(name[, msg])
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:25:19 +04:00
										 |  |  | //
 | 
					
						
							|  |  |  | // 	- progressDone
 | 
					
						
							|  |  |  | // 		Triggered by user or progressClose handler.
 | 
					
						
							|  |  |  | // 		Set the progress bar to done state and hide after hide_timeout.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 	- progressReset
 | 
					
						
							|  |  |  | // 		Triggered by user or progressBar(..) if the progress bar already 
 | 
					
						
							|  |  |  | // 		exists and is hidden (display: none).
 | 
					
						
							|  |  |  | // 		Reset the progress bar to it's initial (indeterminite) state 
 | 
					
						
							|  |  |  | // 		and show it.
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // 		Shorthand:
 | 
					
						
							|  |  |  | // 			resetProgressBar(name)
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-02-13 05:46:46 +04:00
										 |  |  | function progressBar(name, container, close, hide_timeout, auto_remove){ | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 	container = container == null  | 
					
						
							|  |  |  | 		? getProgressContainer()  | 
					
						
							|  |  |  | 		: container | 
					
						
							| 
									
										
										
										
											2014-01-25 02:07:21 +04:00
										 |  |  | 	close = close === undefined  | 
					
						
							|  |  |  | 		? function(){  | 
					
						
							|  |  |  | 			$(this).trigger('progressDone') }  | 
					
						
							|  |  |  | 		: close | 
					
						
							|  |  |  | 	hide_timeout = hide_timeout == null ? PROGRESS_HIDE_TIMEOUT  | 
					
						
							|  |  |  | 		: hide_timeout < 0 ? 0 | 
					
						
							|  |  |  | 		: hide_timeout > 3000 ? 3000 | 
					
						
							|  |  |  | 		: hide_timeout | 
					
						
							| 
									
										
										
										
											2014-02-13 05:46:46 +04:00
										 |  |  | 	auto_remove = auto_remove == null ? true : auto_remove | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var widget = getProgressBar(name) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// a progress bar already exists, reset it and return...
 | 
					
						
							|  |  |  | 	// XXX should we re-bind the event handlers here???
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:07:21 +04:00
										 |  |  | 	if(widget.length > 0 && widget.css('display') == 'none'){ | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 		return widget.trigger('progressReset') | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// fields we'll need to update...
 | 
					
						
							|  |  |  | 	var state = $('<span class="progress-details"/>') | 
					
						
							|  |  |  | 	var bar = $('<progress/>') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// the progress bar widget...
 | 
					
						
							|  |  |  | 	var widget = $('<div class="progress-bar" name="'+name+'">'+name+'</div>') | 
					
						
							|  |  |  | 		// progress state...
 | 
					
						
							|  |  |  | 		.append(state) | 
					
						
							| 
									
										
										
										
											2014-01-30 06:28:47 +04:00
										 |  |  | 	// the close button...
 | 
					
						
							|  |  |  | 	if(close !== false){ | 
					
						
							|  |  |  | 		widget | 
					
						
							|  |  |  | 			.append($('<span class="close">×</span>') | 
					
						
							|  |  |  | 				.click(function(){ | 
					
						
							|  |  |  | 					$(this).trigger('progressClose') | 
					
						
							|  |  |  | 				})) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	widget | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 		.append(bar) | 
					
						
							|  |  |  | 		.appendTo(container) | 
					
						
							|  |  |  | 		.on('progressUpdate', function(evt, done, total){ | 
					
						
							|  |  |  | 			done = done == null ? bar.attr('value') : done | 
					
						
							|  |  |  | 			total = total == null ? bar.attr('max') : total | 
					
						
							|  |  |  | 			bar.attr({ | 
					
						
							|  |  |  | 				value: done, | 
					
						
							|  |  |  | 				max: total | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			state.text(' ('+done+' of '+total+')') | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2014-02-18 00:20:51 +04:00
										 |  |  | 		.on('progressDone', function(evt, done, msg){ | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 			done = done == null ? bar.attr('value') : done | 
					
						
							| 
									
										
										
										
											2014-02-18 00:20:51 +04:00
										 |  |  | 			msg = msg == null ? 'done' : msg | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 			bar.attr('value', done) | 
					
						
							| 
									
										
										
										
											2014-02-18 00:20:51 +04:00
										 |  |  | 			state.text(' ('+msg+')') | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 			widget.find('.close').hide() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			setTimeout(function(){ | 
					
						
							|  |  |  | 				widget.hide() | 
					
						
							| 
									
										
										
										
											2014-02-13 05:46:46 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-02-13 18:59:44 +04:00
										 |  |  | 				// XXX this is not a good way to go... 
 | 
					
						
							|  |  |  | 				// 		need a clean way to reset...
 | 
					
						
							| 
									
										
										
										
											2014-02-13 05:46:46 +04:00
										 |  |  | 				if(auto_remove){ | 
					
						
							|  |  |  | 					widget.remove() | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2014-01-25 02:07:21 +04:00
										 |  |  | 			}, hide_timeout) | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		.on('progressReset', function(){ | 
					
						
							|  |  |  | 			widget | 
					
						
							|  |  |  | 				.css('display', '') | 
					
						
							|  |  |  | 				.find('.close') | 
					
						
							|  |  |  | 					.css('display', '') | 
					
						
							|  |  |  | 			state.text('') | 
					
						
							|  |  |  | 			bar.attr({ | 
					
						
							|  |  |  | 				value: '', | 
					
						
							|  |  |  | 				max: '', | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-30 06:28:47 +04:00
										 |  |  | 	if(close === false){ | 
					
						
							| 
									
										
										
										
											2014-02-18 00:20:51 +04:00
										 |  |  | 		widget.on('progressClose', function(evt, msg){ | 
					
						
							|  |  |  | 			if(msg != null){ | 
					
						
							|  |  |  | 				widget.trigger('progressDone', [null, msg])  | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				widget.trigger('progressDone')  | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-30 06:28:47 +04:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 	} else if(close != null){ | 
					
						
							| 
									
										
										
										
											2014-01-25 02:07:21 +04:00
										 |  |  | 		widget.on('progressClose', close) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 	bar = $(bar[0]) | 
					
						
							|  |  |  | 	state = $(state[0]) | 
					
						
							|  |  |  | 	widget = $(widget[0]) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return widget | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getProgressBar(name){ | 
					
						
							|  |  |  | 	return $('.progress-bar[name="'+name+'"]') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:07:21 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /******************************************* Event trigger helpers ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:14:05 +04:00
										 |  |  | function triggerProgressBarEvent(name, evt, args){ | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | 	var widget = typeof(name) == typeof('str')  | 
					
						
							|  |  |  | 		? getProgressBar(name)  | 
					
						
							|  |  |  | 		: name | 
					
						
							| 
									
										
										
										
											2014-01-25 02:14:05 +04:00
										 |  |  | 	return widget.trigger(evt, args) | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:14:05 +04:00
										 |  |  | function resetProgressBar(name){ | 
					
						
							|  |  |  | 	return triggerProgressBarEvent(name, 'progressReset') | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | function updateProgressBar(name, done, total){ | 
					
						
							| 
									
										
										
										
											2014-01-25 02:14:05 +04:00
										 |  |  | 	return triggerProgressBarEvent(name, 'progressUpdate', [done, total]) | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2014-02-18 00:20:51 +04:00
										 |  |  | function closeProgressBar(name, msg){ | 
					
						
							|  |  |  | 	if(msg != null){ | 
					
						
							|  |  |  | 		return triggerProgressBarEvent(name, 'progressClose', [msg]) | 
					
						
							|  |  |  | 	}	 | 
					
						
							| 
									
										
										
										
											2014-01-25 02:14:05 +04:00
										 |  |  | 	return triggerProgressBarEvent(name, 'progressClose') | 
					
						
							| 
									
										
										
										
											2014-01-25 00:50:21 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | /********************************************************************** | 
					
						
							| 
									
										
										
										
											2014-01-30 05:56:27 +04:00
										 |  |  | * Dialogs... | 
					
						
							| 
									
										
										
										
											2013-06-13 01:37:30 +04:00
										 |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-05 05:50:26 +04:00
										 |  |  | function detailedAlert(text, description, button){ | 
					
						
							|  |  |  | 	return formDialog(null, '', {'': { | 
					
						
							|  |  |  | 		html: $('<details/>') | 
					
						
							|  |  |  | 			.append($('<summary/>') | 
					
						
							|  |  |  | 				.html(text)) | 
					
						
							|  |  |  | 			.append($('<span/>') | 
					
						
							|  |  |  | 				.html(description)) | 
					
						
							|  |  |  | 	}}, button == null ? false : button, 'detailed-alert') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-13 19:42:42 +04:00
										 |  |  | // NOTE: this will not work without node-webkit...
 | 
					
						
							| 
									
										
										
										
											2013-06-13 17:25:38 +04:00
										 |  |  | function getDir(message, dfl, btn){ | 
					
						
							|  |  |  | 	btn = btn == null ? 'OK' : btn | 
					
						
							|  |  |  | 	dfl = dfl == null ? '' : dfl | 
					
						
							|  |  |  | 	var res = $.Deferred() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	formDialog(null, message, {'': {ndir: dfl}}, btn, 'getDir') | 
					
						
							|  |  |  | 		.done(function(data){ res.resolve(data['']) }) | 
					
						
							|  |  |  | 		.fail(function(){ res.reject() }) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 17:54:15 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /***************************************** Domain-specific dialogs ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-21 17:47:44 +04:00
										 |  |  | // XXX do reporting...
 | 
					
						
							| 
									
										
										
										
											2013-07-07 02:20:22 +04:00
										 |  |  | // XXX would be nice to save settings...
 | 
					
						
							| 
									
										
										
										
											2013-07-07 03:19:41 +04:00
										 |  |  | // 		...might be good to use datalist...
 | 
					
						
							| 
									
										
										
										
											2013-06-27 17:29:53 +04:00
										 |  |  | function exportPreviewsDialog(state, dfl){ | 
					
						
							| 
									
										
										
										
											2013-06-21 17:47:44 +04:00
										 |  |  | 	dfl = dfl == null ? BASE_URL : dfl | 
					
						
							| 
									
										
										
										
											2013-06-27 17:29:53 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	// XXX make this more generic...
 | 
					
						
							| 
									
										
										
										
											2013-07-03 07:03:46 +04:00
										 |  |  | 	// tell the user what state are we exporting...
 | 
					
						
							| 
									
										
										
										
											2013-06-27 17:29:53 +04:00
										 |  |  | 	if(state == null){ | 
					
						
							| 
									
										
										
										
											2013-12-01 06:12:57 +04:00
										 |  |  | 		var imgs = 0 | 
					
						
							|  |  |  | 		// NOTE: we are not using order or image count as these sets may
 | 
					
						
							|  |  |  | 		// 		be larger that the current crop...
 | 
					
						
							|  |  |  | 		DATA.ribbons.map(function(e){ | 
					
						
							|  |  |  | 			imgs += e.length | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 		state = toggleSingleImageMode('?') == 'on' ? 'current image' : state | 
					
						
							| 
									
										
										
										
											2013-12-01 06:12:57 +04:00
										 |  |  | 		state = state == null && isViewCropped() ?  | 
					
						
							|  |  |  | 			'cropped view: '+ | 
					
						
							|  |  |  | 				imgs+' images in '+ | 
					
						
							|  |  |  | 				DATA.ribbons.length+' ribbons'  | 
					
						
							|  |  |  | 			: state | 
					
						
							|  |  |  | 		state = state == null ? | 
					
						
							|  |  |  | 			'all: '+ | 
					
						
							|  |  |  | 				imgs+' images in '+ | 
					
						
							|  |  |  | 				DATA.ribbons.length+' ribbons'  | 
					
						
							|  |  |  | 			: state | 
					
						
							| 
									
										
										
										
											2013-06-27 17:29:53 +04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-21 17:47:44 +04:00
										 |  |  | 	var res = $.Deferred() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-21 20:02:54 +04:00
										 |  |  | 	updateStatus('Export...').show() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-01 18:05:50 +04:00
										 |  |  | 	// NOTE: we are not defining the object in-place here because some 
 | 
					
						
							|  |  |  | 	// 		keys become unreadable with JS syntax preventing us from 
 | 
					
						
							|  |  |  | 	// 		splitting the key into several lines...
 | 
					
						
							|  |  |  | 	var cfg = {} | 
					
						
							| 
									
										
										
										
											2014-01-16 04:07:34 +04:00
										 |  |  | 	var img_pattern = 'Image name pattern | '+ | 
					
						
							|  |  |  | 		'%f - full filename (same as %n%e)\n'+ | 
					
						
							|  |  |  | 		'%n - filename\n'+ | 
					
						
							|  |  |  | 		'%e - extension (with leading dot)\n'+ | 
					
						
							|  |  |  | 		'%(abc)m - if marked insert "abc"\n'+ | 
					
						
							|  |  |  | 		'%(abc)b - if bookmarked insert "abc"\n'+ | 
					
						
							|  |  |  | 		'%gid - long gid\n'+ | 
					
						
							|  |  |  | 		'%g - short gid\n' | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 	// multiple images...
 | 
					
						
							|  |  |  | 	if(state != 'current image'){ | 
					
						
							| 
									
										
										
										
											2014-01-16 04:07:34 +04:00
										 |  |  | 		cfg[img_pattern + | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 				'%I - global order\n'+ | 
					
						
							|  |  |  | 				'%i - current selection order'] = '%f' | 
					
						
							|  |  |  | 		cfg['Level directory name'] = 'fav' | 
					
						
							|  |  |  | 	// single image...
 | 
					
						
							|  |  |  | 	} else { | 
					
						
							| 
									
										
										
										
											2014-01-16 04:07:34 +04:00
										 |  |  | 		cfg[img_pattern + | 
					
						
							| 
									
										
										
										
											2013-11-07 02:24:30 +04:00
										 |  |  | 				'\n'+ | 
					
						
							|  |  |  | 				'NOTE: %i and %I are not supported for single\n'+ | 
					
						
							|  |  |  | 				'image exporting.'] = '%f' | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-07-08 07:07:26 +04:00
										 |  |  | 	cfg['Size | '+ | 
					
						
							|  |  |  | 			'The selected size is aproximate, the actual\n'+ | 
					
						
							| 
									
										
										
										
											2013-11-07 02:24:30 +04:00
										 |  |  | 			'preview will be copied from cache.\n'+ | 
					
						
							|  |  |  | 			'\n'+ | 
					
						
							| 
									
										
										
										
											2013-07-08 07:18:43 +04:00
										 |  |  | 			'NOTE: if not all previews are yet generated,\n'+ | 
					
						
							|  |  |  | 			'this will save the available previews, not all\n'+ | 
					
						
							|  |  |  | 			'of which may be of the right size, if this\n'+ | 
					
						
							|  |  |  | 			'happens wait till all the previews are done\n'+ | 
					
						
							|  |  |  | 			'and export again.'] = { | 
					
						
							| 
									
										
										
										
											2013-07-08 07:07:26 +04:00
										 |  |  | 		select: ['Original image'].concat(PREVIEW_SIZES.slice().sort()), | 
					
						
							|  |  |  | 		default: 1 | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-07-08 07:37:57 +04:00
										 |  |  | 	cfg['Destination | '+ | 
					
						
							|  |  |  | 			'Relative paths are supported.\n\n'+ | 
					
						
							|  |  |  | 			'NOTE: All paths are relative to the curent\n'+ | 
					
						
							|  |  |  | 			'directory.'] = {ndir: dfl} | 
					
						
							| 
									
										
										
										
											2013-07-01 18:05:50 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	var keys = Object.keys(cfg) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-21 04:11:33 +04:00
										 |  |  | 	formDialog(null, 'Export: <b>'+ state +'</b>.', cfg, 'OK', 'exportPreviewsDialog') | 
					
						
							| 
									
										
										
										
											2013-06-21 17:47:44 +04:00
										 |  |  | 		.done(function(data){ | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 			// get the form data...
 | 
					
						
							|  |  |  | 			var name = data[keys[0]] | 
					
						
							|  |  |  | 			if(state != 'current image'){ | 
					
						
							|  |  |  | 				var size = data[keys[2]] | 
					
						
							|  |  |  | 				var path = normalizePath(data[keys[3]])  | 
					
						
							|  |  |  | 				var dir = data[keys[1]] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				var size = data[keys[1]] | 
					
						
							|  |  |  | 				var path = normalizePath(data[keys[2]]) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			size = size == 'Original image' ? Math.max.apply(null, PREVIEW_SIZES)*2 : parseInt(size)-5 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// do the actual exporting...
 | 
					
						
							| 
									
										
										
										
											2013-11-07 02:26:11 +04:00
										 |  |  | 			// full state...
 | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 			if(state != 'current image'){ | 
					
						
							|  |  |  | 				exportImagesTo(path, name, dir, size) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-07 02:26:11 +04:00
										 |  |  | 			// single image...
 | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 			} else { | 
					
						
							|  |  |  | 				exportImageTo(getImageGID(), path, name, size) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-21 20:02:54 +04:00
										 |  |  | 			// XXX do real reporting...
 | 
					
						
							|  |  |  | 			showStatusQ('Copying data...') | 
					
						
							| 
									
										
										
										
											2013-06-21 17:47:44 +04:00
										 |  |  | 			res.resolve(data['']) | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-06-21 20:02:54 +04:00
										 |  |  | 		.fail(function(){  | 
					
						
							|  |  |  | 			showStatusQ('Export: canceled.') | 
					
						
							|  |  |  | 			res.reject()  | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-06-21 17:47:44 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-22 17:54:15 +04:00
										 |  |  | function loadDirectoryDialog(dfl){ | 
					
						
							| 
									
										
										
										
											2013-06-21 20:02:54 +04:00
										 |  |  | 	dfl = dfl == null ? BASE_URL : dfl | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	updateStatus('Open...').show() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-11-27 17:15:19 +04:00
										 |  |  | 	formDialog(null, 'Path to open | To see list of previously loaded urls press ctrl-H.', { | 
					
						
							| 
									
										
										
										
											2013-07-03 06:42:14 +04:00
										 |  |  | 		'': {ndir: dfl}, | 
					
						
							| 
									
										
										
										
											2013-07-05 05:33:54 +04:00
										 |  |  | 		'Precess previews': true, | 
					
						
							| 
									
										
										
										
											2013-07-03 06:58:28 +04:00
										 |  |  | 	}, 'OK', 'loadDirectoryDialog') | 
					
						
							| 
									
										
										
										
											2013-07-03 06:42:14 +04:00
										 |  |  | 		.done(function(data){ | 
					
						
							| 
									
										
										
										
											2013-07-03 06:58:28 +04:00
										 |  |  | 			var path = normalizePath(data[''].trim()) | 
					
						
							| 
									
										
										
										
											2013-07-03 06:42:14 +04:00
										 |  |  | 			var process_previews = data['Precess previews'] | 
					
						
							| 
									
										
										
										
											2013-07-03 06:58:28 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-21 22:57:16 +04:00
										 |  |  | 			// reset the modes...
 | 
					
						
							|  |  |  | 			toggleSingleImageMode('off') | 
					
						
							|  |  |  | 			toggleSingleRibbonMode('off') | 
					
						
							| 
									
										
										
										
											2013-06-23 03:14:04 +04:00
										 |  |  | 			toggleMarkedOnlyView('off') | 
					
						
							| 
									
										
										
										
											2013-06-21 22:57:16 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-07-03 06:58:28 +04:00
										 |  |  | 			// do the loading...
 | 
					
						
							| 
									
										
										
										
											2013-07-08 04:11:04 +04:00
										 |  |  | 			statusNotify(loadDir(path, !process_previews)) | 
					
						
							|  |  |  | 				/* | 
					
						
							| 
									
										
										
										
											2013-07-03 06:42:14 +04:00
										 |  |  | 				.done(function(){ | 
					
						
							| 
									
										
										
										
											2013-07-05 05:33:54 +04:00
										 |  |  | 					if(process_previews){  | 
					
						
							| 
									
										
										
										
											2013-07-03 06:42:14 +04:00
										 |  |  | 						showStatusQ('Previews: processing started...') | 
					
						
							| 
									
										
										
										
											2013-07-03 06:58:28 +04:00
										 |  |  | 						// generate/attach previews...
 | 
					
						
							| 
									
										
										
										
											2013-07-03 06:42:14 +04:00
										 |  |  | 						makeImagesPreviewsQ(DATA.order)  | 
					
						
							|  |  |  | 							.done(function(){  | 
					
						
							|  |  |  | 								showStatusQ('Previews: processing done.') | 
					
						
							|  |  |  | 							}) | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2013-07-08 04:11:04 +04:00
										 |  |  | 				*/ | 
					
						
							| 
									
										
										
										
											2013-11-25 07:43:15 +04:00
										 |  |  | 				.done(function(){ | 
					
						
							|  |  |  | 					// XXX is this the right place for this???
 | 
					
						
							|  |  |  | 					pushURLHistory(BASE_URL) | 
					
						
							|  |  |  | 				}) | 
					
						
							| 
									
										
										
										
											2013-06-21 20:02:54 +04:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 		.fail(function(){ | 
					
						
							|  |  |  | 			showStatusQ('Open: canceled.') | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-13 17:44:14 +04:00
										 |  |  | // XXX get EXIF, IPTC...
 | 
					
						
							| 
									
										
										
										
											2013-06-11 03:10:01 +04:00
										 |  |  | function showImageInfo(){ | 
					
						
							|  |  |  | 	var gid = getImageGID(getImage()) | 
					
						
							|  |  |  | 	var r = getRibbonIndex(getRibbon()) | 
					
						
							|  |  |  | 	var data = IMAGES[gid] | 
					
						
							|  |  |  | 	var orientation = data.orientation | 
					
						
							|  |  |  | 	orientation = orientation == null ? 0 : orientation | 
					
						
							|  |  |  | 	var flipped = data.flipped | 
					
						
							|  |  |  | 	flipped = flipped == null ? '' : ', flipped '+flipped+'ly' | 
					
						
							|  |  |  | 	var order = DATA.order.indexOf(gid) | 
					
						
							| 
									
										
										
										
											2013-10-18 05:03:11 +04:00
										 |  |  | 	var name = getImageFileName(gid) | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 	var date = new Date(data.ctime * 1000) | 
					
						
							| 
									
										
										
										
											2013-09-09 15:56:39 +04:00
										 |  |  | 	var comment = data.comment | 
					
						
							|  |  |  | 	comment = comment == null ? '' : comment | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 	comment = comment.replace(/\n/g, '<br>') | 
					
						
							| 
									
										
										
										
											2013-12-08 21:53:05 +04:00
										 |  |  | 	var tags = data.tags | 
					
						
							|  |  |  | 	tags = tags == null ? '' : tags.join(', ') | 
					
						
							| 
									
										
										
										
											2013-06-11 03:10:01 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-09-13 17:44:14 +04:00
										 |  |  | 	return formDialog(null, | 
					
						
							|  |  |  | 			('<div>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 				'<h2>"'+ name +'"</h2>'+ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 				'<table>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | 					// basic info...
 | 
					
						
							| 
									
										
										
										
											2014-02-03 06:28:55 +04:00
										 |  |  | 					// XXX BUG: something here breaks when self-generated data is 
 | 
					
						
							|  |  |  | 					// 		currently open -- .length of undefined...
 | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | 					'<tr><td colspan="2"><hr></td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 					'<tr><td>GID: </td><td>'+ gid +'</td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-11-07 02:20:20 +04:00
										 |  |  | 					'<tr><td>Date: </td><td>'+ date +'</td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-10-18 05:03:11 +04:00
										 |  |  | 					'<tr><td>Path: </td><td>"'+ unescape(data.path) +'"</td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 					'<tr><td>Orientation: </td><td>'+ orientation +'°'+flipped+'</td></tr>'+ | 
					
						
							|  |  |  | 					'<tr><td>Order: </td><td>'+ order +'</td></tr>'+ | 
					
						
							|  |  |  | 					'<tr><td>Position (ribbon): </td><td>'+ (DATA.ribbons[r].indexOf(gid)+1) + | 
					
						
							|  |  |  | 						'/'+ DATA.ribbons[r].length +'</td></tr>'+ | 
					
						
							|  |  |  | 					'<tr><td>Position (global): </td><td>'+ (order+1) +'/'+ DATA.order.length +'</td></tr>'+ | 
					
						
							| 
									
										
										
										
											2014-01-13 08:31:10 +04:00
										 |  |  | 					'<tr><td>Sorted: </td><td>'+  | 
					
						
							| 
									
										
										
										
											2014-01-13 08:34:48 +04:00
										 |  |  | 						//Math.round(((DATA.order.length-tagSelectAND('unsorted', DATA.order).length)/DATA.order.length)*100+'') +
 | 
					
						
							|  |  |  | 						//Math.round(((DATA.order.length-tagSelectAND('unsorted').length)/DATA.order.length)*100+'') +
 | 
					
						
							|  |  |  | 						Math.round(((DATA.order.length-TAGS['unsorted'].length)/DATA.order.length)*100+'') + | 
					
						
							| 
									
										
										
										
											2014-01-13 08:31:10 +04:00
										 |  |  | 					'%</td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 					// editable fields...
 | 
					
						
							|  |  |  | 					'<tr><td colspan="2"><hr></td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:30:34 +04:00
										 |  |  | 					// XXX this expanding to a too big size will mess up the screen...
 | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 					// 		add per editable and global dialog max-height and overflow
 | 
					
						
							|  |  |  | 					'<tr><td>Comment: </td><td class="comment" contenteditable>'+ comment +'</td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-12-08 21:53:05 +04:00
										 |  |  | 					'<tr><td>Tags: </td><td class="tags" contenteditable>'+ tags +'</td></tr>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 				'</table>'+ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:44:14 +04:00
										 |  |  | 				'<br>'+ | 
					
						
							|  |  |  | 			'</div>'), | 
					
						
							|  |  |  | 			// NOTE: without a save button, there will be no way to accept the 
 | 
					
						
							|  |  |  | 			// 		form on a touch-only device...
 | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | 			{}, 'OK', 'showImageInfoDialog') | 
					
						
							| 
									
										
										
										
											2013-09-13 17:44:14 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// save the form data...
 | 
					
						
							| 
									
										
										
										
											2013-09-13 17:30:34 +04:00
										 |  |  | 		.done(function(_, form){ | 
					
						
							| 
									
										
										
										
											2013-09-13 17:44:14 +04:00
										 |  |  | 			// comment...
 | 
					
						
							| 
									
										
										
										
											2013-09-13 21:51:58 +04:00
										 |  |  | 			var ncomment = form.find('.comment').html() | 
					
						
							|  |  |  | 			if(ncomment != comment){ | 
					
						
							|  |  |  | 				ncomment = ncomment.replace(/<br>/ig, '\n') | 
					
						
							|  |  |  | 				if(ncomment.trim() == ''){ | 
					
						
							|  |  |  | 					delete data.comment | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					data.comment = ncomment | 
					
						
							|  |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-15 03:38:15 +04:00
										 |  |  | 				imageUpdated(gid) | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-09-13 17:44:14 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-08 21:53:05 +04:00
										 |  |  | 			// tags...
 | 
					
						
							|  |  |  | 			var ntags = form.find('.tags').text().trim() | 
					
						
							|  |  |  | 			if(ntags != tags){ | 
					
						
							|  |  |  | 				ntags = ntags.split(/\s*,\s*/) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-08 22:14:51 +04:00
										 |  |  | 				updateTags(ntags, gid) | 
					
						
							| 
									
										
										
										
											2013-12-08 21:53:05 +04:00
										 |  |  | 			} | 
					
						
							| 
									
										
										
										
											2013-09-13 17:21:14 +04:00
										 |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-06-11 03:10:01 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-11 03:10:01 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-01 05:27:16 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX need a propper:
 | 
					
						
							|  |  |  | // 		- update mechanics...
 | 
					
						
							|  |  |  | // 		- save mechanics
 | 
					
						
							|  |  |  | function makeCommentPanel(panel){ | 
					
						
							|  |  |  | 	return makeSubPanel( | 
					
						
							|  |  |  | 			'Info: Comment',  | 
					
						
							|  |  |  | 			$('Comment: <div class="comment" contenteditable/>'), | 
					
						
							|  |  |  | 			panel,  | 
					
						
							|  |  |  | 			true,  | 
					
						
							|  |  |  | 			true) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-15 14:24:00 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function setupUI(viewer){ | 
					
						
							|  |  |  | 	console.log('UI: setup...') | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-15 14:33:26 +04:00
										 |  |  | 	setupIndicators() | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-15 14:24:00 +04:00
										 |  |  | 	return viewer | 
					
						
							|  |  |  | 		.click(function(){ | 
					
						
							|  |  |  | 			if($('.ribbon').length == 0){ | 
					
						
							|  |  |  | 				loadDirectoryDialog() | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.on([ | 
					
						
							|  |  |  | 				'focusingImage', | 
					
						
							| 
									
										
										
										
											2013-12-18 21:48:40 +04:00
										 |  |  | 				'fittingImages', | 
					
						
							|  |  |  | 				//'updatingImageProportions',
 | 
					
						
							| 
									
										
										
										
											2014-01-13 03:38:06 +04:00
										 |  |  | 				'horizontalShiftedImage', | 
					
						
							| 
									
										
										
										
											2013-12-15 14:24:00 +04:00
										 |  |  | 			].join(' '),  | 
					
						
							|  |  |  | 			function(){ | 
					
						
							|  |  |  | 				updateCurrentMarker() | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | SETUP_BINDINGS.push(setupUI) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-11 03:10:01 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 nowrap :										 */ |