| 
									
										
										
										
											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-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-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) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // 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) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return elem  | 
					
						
							|  |  |  | 		.appendTo(target) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 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:') | 
					
						
							|  |  |  | 	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() | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX move to ui.js?
 | 
					
						
							|  |  |  | 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
										 |  |  | 
 | 
					
						
							|  |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Modal dialogs... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | function getOverlay(root){ | 
					
						
							|  |  |  | 	root = $(root) | 
					
						
							|  |  |  | 	var overlay = root.find('.overlay-block') | 
					
						
							|  |  |  | 	if(overlay.length == 0){ | 
					
						
							|  |  |  | 		return $('<div class="overlay-block">'+ | 
					
						
							|  |  |  | 					'<div class="background"/>'+ | 
					
						
							|  |  |  | 					'<div class="content"/>'+ | 
					
						
							|  |  |  | 				'</div>').appendTo(root) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	return overlay | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function showInOverlay(root, data){ | 
					
						
							|  |  |  | 	root = $(root) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var overlay = getOverlay(root) | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	if(data != null){ | 
					
						
							|  |  |  | 		var container = $('<table width="100%" height="100%"><tr><td align="center" valign="center">'+ | 
					
						
							|  |  |  | 								'<div class="dialog"/>'+ | 
					
						
							|  |  |  | 							'</td></tr></table>') | 
					
						
							|  |  |  | 		var dialog = container.find('.dialog') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		//overlay.find('.background')
 | 
					
						
							|  |  |  | 		//	.click(function(){ hideOverlay(root) })
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		dialog | 
					
						
							|  |  |  | 			.append(data) | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 			.one('click', function(){  | 
					
						
							|  |  |  | 				event.stopPropagation()  | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | 		overlay.find('.content') | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 			.on('click', function(){  | 
					
						
							|  |  |  | 				overlay.trigger('close') | 
					
						
							|  |  |  | 				hideOverlay(root)  | 
					
						
							|  |  |  | 			}) | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | 			.append(container) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	root.addClass('overlay') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return overlay | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function hideOverlay(root){ | 
					
						
							|  |  |  | 	root.removeClass('overlay') | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 	root.find('.overlay-block') | 
					
						
							|  |  |  | 		.trigger('close') | 
					
						
							|  |  |  | 		.remove() | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /************************************************ Standard dialogs ***/ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | function alert(){ | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 	var res = $.Deferred() | 
					
						
							|  |  |  | 	showInOverlay($('.viewer'), $('<span/>') | 
					
						
							|  |  |  | 			.text(Array.apply(null, arguments).join(' '))) | 
					
						
							|  |  |  | 		.addClass('alert dialog') | 
					
						
							|  |  |  | 		.on('close accept', function(){  | 
					
						
							|  |  |  | 			res.resolve()  | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	return res | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | function prompt(message, dfl){ | 
					
						
							|  |  |  | 	var root = $('.viewer') | 
					
						
							|  |  |  | 	var res = $.Deferred() | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var form = $('<div>'+ | 
					
						
							|  |  |  | 				'<div class="text"/>'+ | 
					
						
							|  |  |  | 				'<input type="text" tabindex=1/>'+ | 
					
						
							|  |  |  | 				'<button tabindex=2>Done</button>'+ | 
					
						
							|  |  |  | 			'</div>') | 
					
						
							|  |  |  | 	form.find('.text') | 
					
						
							|  |  |  | 		.text(message) | 
					
						
							|  |  |  | 	var overlay = showInOverlay(root, form) | 
					
						
							|  |  |  | 		.addClass('prompt dialog') | 
					
						
							|  |  |  | 		.on('close', function(){  | 
					
						
							|  |  |  | 			res.reject()  | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.on('accept', function(){ | 
					
						
							|  |  |  | 			res.resolve(form.find('input').attr('value'))  | 
					
						
							|  |  |  | 			hideOverlay(root) | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	form.find('button') | 
					
						
							|  |  |  | 		.click(function(){ | 
					
						
							|  |  |  | 			overlay.trigger('accept') | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var input = form.find('input') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	input | 
					
						
							|  |  |  | 		.focus() | 
					
						
							|  |  |  | 	setTimeout(function(){  | 
					
						
							|  |  |  | 		input.attr('value', dfl == null ? '' : dfl) | 
					
						
							|  |  |  | 	}, 100) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | /* | 
					
						
							| 
									
										
										
										
											2013-06-10 17:28:32 +04:00
										 |  |  | function confirm(){ | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-01 18:26:06 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-06-10 19:20:35 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2012-07-24 14:40:15 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							| 
									
										
										
										
											2012-08-10 18:31:32 +04:00
										 |  |  | // vim:set ts=4 sw=4 nowrap :
 |