| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | *  | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | * | 
					
						
							|  |  |  | **********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | //var DEBUG = DEBUG != null ? DEBUG : true
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | // this is an element/selector to be used as the temporary parent for 
 | 
					
						
							|  |  |  | // helpers while dragging/sorting sub-panels...
 | 
					
						
							|  |  |  | // if set to null, the parent of a nearest panel will be used (slower)
 | 
					
						
							|  |  |  | var PANEL_ROOT = 'body' | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | var PANEL_HELPER_HIDE_DELAY = 50 | 
					
						
							|  |  |  | var PANEL_HELPER_HIDE_DELAY_NO_ROOT = 100 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | // Panel controller registry...
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // Format:
 | 
					
						
							|  |  |  | // 	{
 | 
					
						
							|  |  |  | // 		<title>: <controller>,
 | 
					
						
							|  |  |  | // 		...
 | 
					
						
							|  |  |  | // 	}
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // The controller is generated by makePanelController(...) and is called
 | 
					
						
							|  |  |  | // automatically by openPanel(...)
 | 
					
						
							|  |  |  | var PANELS = {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX write real doc...
 | 
					
						
							|  |  |  | // XXX see getPanelState(...)
 | 
					
						
							|  |  |  | // XXX we should keep track of panel state while moving, opening, closing
 | 
					
						
							|  |  |  | // 		and resizing panels...
 | 
					
						
							|  |  |  | // XXX move this to config???
 | 
					
						
							|  |  |  | var PANEL_STATE = {} | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 20:47:58 +04:00
										 |  |  | /* | 
					
						
							|  |  |  | // This can be:
 | 
					
						
							|  |  |  | // 	- hide
 | 
					
						
							|  |  |  | // 	- remove
 | 
					
						
							|  |  |  | var PANEL_CLOSE_METHOD = 'hide' | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Helpers... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // - start monitoring where we are dragged to...
 | 
					
						
							|  |  |  | // - open hidden side panels...
 | 
					
						
							| 
									
										
										
										
											2014-01-06 11:08:20 +04:00
										 |  |  | // XXX store number of panels we started with...
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | function _startSortHandler(e, ui){ | 
					
						
							|  |  |  | 	ui.item.data('isoutside', false) | 
					
						
							| 
									
										
										
										
											2014-01-06 11:08:20 +04:00
										 |  |  | 	ui.item.data('sub-panels-before', $(this).find('.sub-panel').length) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 	ui.placeholder | 
					
						
							|  |  |  | 		.height(ui.helper.outerHeight()) | 
					
						
							|  |  |  | 		.width(ui.helper.outerWidth()) | 
					
						
							|  |  |  | 	// show all hidden panels...
 | 
					
						
							|  |  |  | 	$('.side-panel').each(function(){ | 
					
						
							|  |  |  | 		var p = $(this) | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 		if(p.find('.sub-panel').length == 0){ | 
					
						
							|  |  |  | 			p.css('min-width', '50px') | 
					
						
							|  |  |  | 		} | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 		if(p.attr('autohide') == 'on'){ | 
					
						
							|  |  |  | 			p.attr('autohide', 'off') | 
					
						
							|  |  |  | 			p.data('autohide', true) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			p.data('autohide', false) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | // reset the auto-hide of the side panels...
 | 
					
						
							|  |  |  | function _resetSidePanels(){ | 
					
						
							|  |  |  | 	$('.side-panel').each(function(){ | 
					
						
							|  |  |  | 		var p = $(this) | 
					
						
							|  |  |  | 		p.css('min-width', '') | 
					
						
							|  |  |  | 		if(p.data('autohide')){ | 
					
						
							|  |  |  | 			p.attr('autohide', 'on') | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function _prepareHelper(evt, elem){ | 
					
						
							|  |  |  | 	var offset = elem.offset() | 
					
						
							|  |  |  | 	var w = elem.width() | 
					
						
							|  |  |  | 	var h = elem.height() | 
					
						
							|  |  |  | 	var root = elem.parents('.panel, .side-panel').first().parent() | 
					
						
							|  |  |  | 	elem | 
					
						
							|  |  |  | 		.detach() | 
					
						
							|  |  |  | 		.css({ | 
					
						
							|  |  |  | 			position: 'absolute', | 
					
						
							|  |  |  | 			width: w, | 
					
						
							|  |  |  | 			height: h, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.offset(offset) | 
					
						
							|  |  |  | 		.appendTo(root) | 
					
						
							|  |  |  | 	return elem | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function _resetSortedElem(elem){ | 
					
						
							|  |  |  | 	return elem | 
					
						
							|  |  |  | 		.css({ | 
					
						
							|  |  |  | 			position: '', | 
					
						
							|  |  |  | 			width: '', | 
					
						
							|  |  |  | 			height: '', | 
					
						
							|  |  |  | 			top: '', | 
					
						
							|  |  |  | 			left: '' | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | // XXX add visibility test here...
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | function isPanelVisible(panel){ | 
					
						
							|  |  |  | 	return panel.prop('open') | 
					
						
							|  |  |  | 			&& (panel.parents('.panel').prop('open') | 
					
						
							|  |  |  | 				|| panel.parents('.side-panel').width() > 20) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | // wrap a sub-panel with a new panel...
 | 
					
						
							|  |  |  | // 
 | 
					
						
							|  |  |  | function wrapWithPanel(panel, parent, offset){ | 
					
						
							|  |  |  | 	var new_panel = makePanel() | 
					
						
							|  |  |  | 		.css(offset) | 
					
						
							|  |  |  | 		.appendTo(parent) | 
					
						
							|  |  |  | 	new_panel.find('.panel-content') | 
					
						
							|  |  |  | 			.append(panel) | 
					
						
							|  |  |  | 	return new_panel | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | function getPanel(title){ | 
					
						
							|  |  |  | 	return $('[id="'+ title +'"]') | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Constructors... | 
					
						
							|  |  |  | */ | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | // XXX dragging out, into another panel and back out behaves oddly:
 | 
					
						
							|  |  |  | // 		should:
 | 
					
						
							|  |  |  | // 			either revert or create a new panel
 | 
					
						
							|  |  |  | // 		does:
 | 
					
						
							|  |  |  | // 			drops to last placeholder
 | 
					
						
							| 
									
										
										
										
											2014-01-05 23:31:33 +04:00
										 |  |  | // XXX need to stop this triggering panelClosing event when the last 
 | 
					
						
							|  |  |  | // 		panel is dragged out or when the panel is dragged...
 | 
					
						
							| 
									
										
										
										
											2014-01-03 02:25:38 +04:00
										 |  |  | function makePanel(title, parent, open, keep_empty, close_button){ | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 	title = title == null || title.trim() == '' ? ' ' : title | 
					
						
							| 
									
										
										
										
											2014-01-03 02:25:38 +04:00
										 |  |  | 	parent = parent == null ? $(PANEL_ROOT) : parent | 
					
						
							| 
									
										
										
										
											2014-01-06 05:42:48 +04:00
										 |  |  | 	close_button = close_button == null ? true : close_button | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 	// the outer panel...
 | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 	var panel = $('<details/>') | 
					
						
							|  |  |  | 		.prop('open', open == null ? true : open) | 
					
						
							|  |  |  | 		.addClass('panel noScroll') | 
					
						
							| 
									
										
										
										
											2014-01-07 04:25:51 +04:00
										 |  |  | 		// NOTE: this is split into a separate event so as to be able to
 | 
					
						
							|  |  |  | 		// 		be accessed from different contexts...
 | 
					
						
							|  |  |  | 		.on('subPanelsUpdated', function(){ | 
					
						
							| 
									
										
										
										
											2014-01-06 07:37:14 +04:00
										 |  |  | 			// remove the panel when it runs out of sub-panels...
 | 
					
						
							| 
									
										
										
										
											2014-01-07 20:47:58 +04:00
										 |  |  | 			if(!keep_empty && panel.find('.sub-panel:visible').length <= 0){ | 
					
						
							| 
									
										
										
										
											2014-01-06 07:37:14 +04:00
										 |  |  | 				removePanel(panel, true) | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 		.append((close_button | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 			? $('<summary>'+title+'</summary>') | 
					
						
							|  |  |  | 				.append($('<span/>') | 
					
						
							|  |  |  | 					.addClass('close-button') | 
					
						
							|  |  |  | 					.click(function(){ | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 						removePanel(panel) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 						return false | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 					.html('×')) | 
					
						
							|  |  |  | 			: $('<summary>'+title+'</summary>')) | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 				// XXX also do this on enter...
 | 
					
						
							|  |  |  | 				// XXX
 | 
					
						
							|  |  |  | 				.click(function(){ | 
					
						
							|  |  |  | 					if(!panel.prop('open')){ | 
					
						
							|  |  |  | 						var evt = 'panelOpening' | 
					
						
							|  |  |  | 					} else { | 
					
						
							|  |  |  | 						var evt = 'panelClosing' | 
					
						
							|  |  |  | 					} | 
					
						
							|  |  |  | 					panel.trigger(evt, panel) | 
					
						
							|  |  |  | 					panel.find('.sub-panel').each(function(){ | 
					
						
							|  |  |  | 						var sub_panel = $(this) | 
					
						
							|  |  |  | 						if(sub_panel.prop('open')){ | 
					
						
							|  |  |  | 							sub_panel.trigger(evt, sub_panel) | 
					
						
							|  |  |  | 						} | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 				})) | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 		.draggable({ | 
					
						
							|  |  |  | 			containment: 'parent', | 
					
						
							|  |  |  | 			scroll: false, | 
					
						
							|  |  |  | 			stack: '.panel', | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 			// sanp to panels...
 | 
					
						
							| 
									
										
										
										
											2013-12-11 02:47:44 +04:00
										 |  |  | 			//snap: ".panel", 
 | 
					
						
							|  |  |  | 			//snapMode: "outer",
 | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.css({ | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 			// NOTE: for some reason this is overwritten by jquery-ui to 
 | 
					
						
							|  |  |  | 			//		'relative' if it's not set explicitly...
 | 
					
						
							| 
									
										
										
										
											2013-12-11 02:47:44 +04:00
										 |  |  | 			position: 'absolute', | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 		}) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 	// content -- wrapper for sub-panels...
 | 
					
						
							| 
									
										
										
										
											2013-12-11 02:47:44 +04:00
										 |  |  | 	var content = $('<span class="panel-content content">') | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 		.sortable({ | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 			// general settings...
 | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 			forcePlaceholderSize: true, | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 			forceHelperSize: true, | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 			opacity: 0.7, | 
					
						
							|  |  |  | 			connectWith: '.panel-content', | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 			helper: _prepareHelper, | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 			start: _startSortHandler, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// - create a new panel when dropping outside of curent panel...
 | 
					
						
							|  |  |  | 			// - remove empty panels...
 | 
					
						
							| 
									
										
										
										
											2013-12-12 04:34:26 +04:00
										 |  |  | 			beforeStop: function(e, ui){ | 
					
						
							| 
									
										
										
										
											2013-12-11 02:47:44 +04:00
										 |  |  | 				// do this only when dropping outside the panel...
 | 
					
						
							| 
									
										
										
										
											2013-12-23 03:43:21 +04:00
										 |  |  | 				if(ui.item.data('isoutside') | 
					
						
							|  |  |  | 						// prevent draggingout the last panel...
 | 
					
						
							|  |  |  | 						// NOTE: 2 because we are taking into account 
 | 
					
						
							|  |  |  | 						// 		the placeholders...
 | 
					
						
							|  |  |  | 						&& panel.find('.sub-panel').length > 2){ | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 					wrapWithPanel(ui.item, panel.parent(), ui.offset) | 
					
						
							| 
									
										
										
										
											2013-12-11 02:47:44 +04:00
										 |  |  | 				} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 04:25:51 +04:00
										 |  |  | 				panel.trigger('subPanelsUpdated') | 
					
						
							| 
									
										
										
										
											2014-01-06 07:37:14 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 				_resetSidePanels() | 
					
						
							|  |  |  | 				_resetSortedElem(ui.item) | 
					
						
							|  |  |  | 					.data('isoutside', false) | 
					
						
							| 
									
										
										
										
											2013-12-12 04:34:26 +04:00
										 |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 			over: function(e, ui){ | 
					
						
							| 
									
										
										
										
											2013-12-12 04:34:26 +04:00
										 |  |  | 				ui.item.data('isoutside', false) | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 				ui.placeholder | 
					
						
							|  |  |  | 					//.height(ui.helper.outerHeight())
 | 
					
						
							|  |  |  | 					// NOTE: for some reason width does not allways get
 | 
					
						
							|  |  |  | 					// 		set by jquery-ui...
 | 
					
						
							|  |  |  | 					.width(ui.helper.outerWidth()) | 
					
						
							|  |  |  | 					.show() | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			out: function(e, ui){ | 
					
						
							| 
									
										
										
										
											2013-12-12 04:34:26 +04:00
										 |  |  | 				ui.item.data('isoutside', true) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 				ui.placeholder.hide() | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 		.appendTo(panel) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-03 02:25:38 +04:00
										 |  |  | 	if(parent != false){ | 
					
						
							|  |  |  | 		panel.appendTo(parent) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 	// NOTE: no need to call the panelOpening event here as at this point
 | 
					
						
							|  |  |  | 	// 		no one had the chance to bind a handler...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | 	return panel | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | // side can be:
 | 
					
						
							|  |  |  | // 	- left
 | 
					
						
							|  |  |  | // 	- right
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | //
 | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | // XXX in part this is exactly the same as makePanel
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | // XXX need to trigger open/close sub panel events...
 | 
					
						
							| 
									
										
										
										
											2014-01-03 02:25:38 +04:00
										 |  |  | function makeSidePanel(side, parent, autohide){ | 
					
						
							| 
									
										
										
										
											2013-12-24 04:40:57 +04:00
										 |  |  | 	autohide = autohide == null ? 'on' : 'off' | 
					
						
							| 
									
										
										
										
											2014-01-03 02:25:38 +04:00
										 |  |  | 	parent = parent == null ? $(PANEL_ROOT) : parent | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 	var panel = $('.side-panel.'+side) | 
					
						
							|  |  |  | 	// only one panel from each side can exist...
 | 
					
						
							|  |  |  | 	if(panel.length != 0){ | 
					
						
							|  |  |  | 		return panel | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	panel = $('<div/>') | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 		.addClass('side-panel panel-content ' + side) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 		.attr('autohide', autohide) | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 		// XXX trigger open/close events on hide/show..
 | 
					
						
							|  |  |  | 		// XXX
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 		// toggle auto-hide...
 | 
					
						
							|  |  |  | 		.dblclick(function(e){ | 
					
						
							|  |  |  | 			var elem = $(this) | 
					
						
							|  |  |  | 			if(elem.attr('autohide') == 'off'){ | 
					
						
							|  |  |  | 				elem.attr('autohide', 'on') | 
					
						
							|  |  |  | 			} else { | 
					
						
							|  |  |  | 				elem.attr('autohide', 'off') | 
					
						
							|  |  |  | 			} | 
					
						
							|  |  |  | 			return false | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2014-01-07 10:17:55 +04:00
										 |  |  | 		// hide temporarily opened side-panels...
 | 
					
						
							|  |  |  | 		.mouseout(function(){ | 
					
						
							|  |  |  | 			// XXX jQuery bug: this does not work...
 | 
					
						
							|  |  |  | 			//panel.prop('open', false)
 | 
					
						
							|  |  |  | 			panel.attr('open', null) | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 		.sortable({ | 
					
						
							|  |  |  | 			forcePlaceholderSize: true, | 
					
						
							|  |  |  | 			opacity: 0.7, | 
					
						
							|  |  |  | 			connectWith: '.panel-content', | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 			helper: _prepareHelper, | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 			start: _startSortHandler, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// - create a new panel when dropping outside of curent panel...
 | 
					
						
							|  |  |  | 			// - remove empty panels...
 | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 			beforeStop: function(e, ui){ | 
					
						
							|  |  |  | 				// do this only when dropping outside the panel...
 | 
					
						
							|  |  |  | 				if(ui.item.data('isoutside')){ | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 					wrapWithPanel(ui.item, panel.parent(), ui.offset) | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 				} | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 				_resetSidePanels() | 
					
						
							|  |  |  | 				_resetSortedElem(ui.item) | 
					
						
							|  |  |  | 					.data('isoutside', false) | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 			}, | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 			over: function(e, ui){ | 
					
						
							|  |  |  | 				ui.item.data('isoutside', false) | 
					
						
							| 
									
										
										
										
											2013-12-27 01:56:08 +04:00
										 |  |  | 				ui.placeholder | 
					
						
							|  |  |  | 					//.height(ui.helper.outerHeight())
 | 
					
						
							|  |  |  | 					// NOTE: for some reason width does not allways get
 | 
					
						
							|  |  |  | 					// 		set by jquery-ui...
 | 
					
						
							|  |  |  | 					.width(ui.helper.outerWidth()) | 
					
						
							|  |  |  | 					.show() | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 			out: function(e, ui){ | 
					
						
							|  |  |  | 				ui.item.data('isoutside', true) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 				ui.placeholder.hide() | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 			}, | 
					
						
							|  |  |  | 		}) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:00:20 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-03 02:25:38 +04:00
										 |  |  | 	if(parent != false){ | 
					
						
							|  |  |  | 		panel.appendTo(parent) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 	// NOTE: no need to call the panelOpening event here as at this point
 | 
					
						
							|  |  |  | 	// 		no one had the chance to bind a handler...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 	return panel | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-27 00:29:07 +04:00
										 |  |  | // NOTE: if parent is not given this will create a new panel...
 | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | // NOTE: title must be unique...
 | 
					
						
							| 
									
										
										
										
											2014-01-06 05:42:48 +04:00
										 |  |  | function makeSubPanel(title, content, parent, open, content_resizable, close_button){ | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 	title = title == null || title.trim() == '' ? ' ' : title | 
					
						
							| 
									
										
										
										
											2013-12-27 00:29:07 +04:00
										 |  |  | 	parent = parent == null ? makePanel() : parent | 
					
						
							| 
									
										
										
										
											2014-01-06 07:37:14 +04:00
										 |  |  | 	close_button = close_button == null ? true : close_button | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:49:16 +04:00
										 |  |  | 	open = open == null ? true : open | 
					
						
							|  |  |  | 	content_resizable = content_resizable == null  | 
					
						
							|  |  |  | 		? false  | 
					
						
							|  |  |  | 		: content_resizable | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var content_elem = $('<div class="sub-panel-content content"/>') | 
					
						
							|  |  |  | 	if(content != null){ | 
					
						
							|  |  |  | 		content_elem | 
					
						
							|  |  |  | 			.append(content) | 
					
						
							|  |  |  | 	} | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 	var sub_panel = $('<details/>') | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 		.attr('id', title) | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 		.addClass('sub-panel noScroll') | 
					
						
							| 
									
										
										
										
											2013-12-26 23:49:16 +04:00
										 |  |  | 		.prop('open', open) | 
					
						
							| 
									
										
										
										
											2014-01-06 05:42:48 +04:00
										 |  |  | 		.append((close_button | 
					
						
							|  |  |  | 			? $('<summary>'+title+'</summary>') | 
					
						
							|  |  |  | 				.append($('<span/>') | 
					
						
							|  |  |  | 					.addClass('close-button') | 
					
						
							|  |  |  | 					.click(function(){ | 
					
						
							| 
									
										
										
										
											2014-01-06 07:37:14 +04:00
										 |  |  | 						var parent = sub_panel.parents('.panel').first() | 
					
						
							|  |  |  | 						removePanel(sub_panel) | 
					
						
							| 
									
										
										
										
											2014-01-07 04:25:51 +04:00
										 |  |  | 						// notify the parent context update...
 | 
					
						
							|  |  |  | 						parent.trigger('subPanelsUpdated') | 
					
						
							| 
									
										
										
										
											2014-01-06 05:42:48 +04:00
										 |  |  | 						return false | 
					
						
							|  |  |  | 					}) | 
					
						
							|  |  |  | 					.html('×')) | 
					
						
							|  |  |  | 			: $('<summary>'+title+'</summary>')) | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 			// XXX also do this on enter...
 | 
					
						
							|  |  |  | 			// XXX
 | 
					
						
							|  |  |  | 			.click(function(){ | 
					
						
							|  |  |  | 				if(!sub_panel.prop('open')){ | 
					
						
							|  |  |  | 					sub_panel.trigger('panelOpening', sub_panel) | 
					
						
							|  |  |  | 				} else { | 
					
						
							|  |  |  | 					sub_panel.trigger('panelClosing', sub_panel) | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			})) | 
					
						
							| 
									
										
										
										
											2013-12-26 23:49:16 +04:00
										 |  |  | 		.append(content_elem) | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 	if(parent != null && parent != false){ | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 		if(parent.hasClass('panel-content')){ | 
					
						
							|  |  |  | 			sub_panel.appendTo(parent) | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			sub_panel.appendTo(parent.find('.panel-content')) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-26 23:49:16 +04:00
										 |  |  | 	if(content_resizable){ | 
					
						
							|  |  |  | 		// NOTE: we are wrapping the content into a div so as to make 
 | 
					
						
							|  |  |  | 		// 		the fact that the panel is resizable completely 
 | 
					
						
							|  |  |  | 		// 		transparent for the user -- no need to be aware of the 
 | 
					
						
							|  |  |  | 		// 		sizing elements, etc.
 | 
					
						
							|  |  |  | 		content_elem.wrap($('<div>')).parent() | 
					
						
							|  |  |  | 			.resizable({ | 
					
						
							|  |  |  | 				handles: 's', | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 			.css({ | 
					
						
							|  |  |  | 				overflow: 'hidden', | 
					
						
							|  |  |  | 			}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 	// NOTE: no need to call the panelOpening event here as at this point
 | 
					
						
							|  |  |  | 	// 		no one had the chance to bind a handler...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-23 19:47:37 +04:00
										 |  |  | 	return sub_panel | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-23 04:38:49 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * Actions... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // XXX this should take the state into consideration while opening panels
 | 
					
						
							|  |  |  | // 		and open panels in specific parents and locations, maybe even with
 | 
					
						
							|  |  |  | // 		other neighbor panels...
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:32:45 +04:00
										 |  |  | // XXX update panel state...
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | function openPanel(panel){ | 
					
						
							|  |  |  | 	var title = typeof(panel) == typeof('str') ? panel : null | 
					
						
							|  |  |  | 	panel = typeof(panel) == typeof('str') | 
					
						
							|  |  |  | 		? getPanel(panel) | 
					
						
							|  |  |  | 		: panel | 
					
						
							|  |  |  | 	title = title == null ? panel.attr('id') : title | 
					
						
							|  |  |  | 	var open = false | 
					
						
							|  |  |  | 	 | 
					
						
							|  |  |  | 	// create a new panel...
 | 
					
						
							|  |  |  | 	if(panel.length == 0){ | 
					
						
							|  |  |  | 		if(title in PANELS){ | 
					
						
							|  |  |  | 			var builder = PANELS[title] | 
					
						
							|  |  |  | 			panel = builder({ open: true }) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// show/open the panel and all it's parents...
 | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		open = isPanelVisible(panel) | 
					
						
							| 
									
										
										
										
											2014-01-07 10:17:55 +04:00
										 |  |  | 		// show panels...
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | 		panel | 
					
						
							| 
									
										
										
										
											2014-01-07 20:47:58 +04:00
										 |  |  | 			.css('display', '') | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | 			.prop('open', true) | 
					
						
							|  |  |  | 			.parents('.panel') | 
					
						
							| 
									
										
										
										
											2014-01-07 20:47:58 +04:00
										 |  |  | 				.css('display', '') | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | 				.prop('open', true) | 
					
						
							| 
									
										
										
										
											2014-01-07 10:17:55 +04:00
										 |  |  | 		// show side panels...
 | 
					
						
							|  |  |  | 		panel | 
					
						
							|  |  |  | 			.parents('.side-panel').first() | 
					
						
							|  |  |  | 				// XXX jQuery bug: this does not work...
 | 
					
						
							|  |  |  | 				//.prop('open', true)
 | 
					
						
							|  |  |  | 				.attr('open', 'yes') | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	// if the panel was not open trigger the event...
 | 
					
						
							|  |  |  | 	if(!open){ | 
					
						
							|  |  |  | 		panel.trigger('panelOpening', panel) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return panel | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:32:45 +04:00
										 |  |  | // XXX
 | 
					
						
							|  |  |  | // XXX update panel state...
 | 
					
						
							|  |  |  | function openPanels(){ | 
					
						
							|  |  |  | 	// XXX
 | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | // Close the panel...
 | 
					
						
							|  |  |  | //
 | 
					
						
							|  |  |  | // NOTE: this does not care if it's a panel or sub-panel...
 | 
					
						
							|  |  |  | // XXX do we need a panelRemoved event???
 | 
					
						
							|  |  |  | // 		...and a symmetrical panelCreated??
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:32:45 +04:00
										 |  |  | // XXX update panel state...
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | function closePanel(panel){ | 
					
						
							|  |  |  | 	panel = typeof(panel) == typeof('str') | 
					
						
							|  |  |  | 		? getPanel(panel) | 
					
						
							|  |  |  | 		: panel | 
					
						
							| 
									
										
										
										
											2014-01-07 20:47:58 +04:00
										 |  |  | 	panel.find('.sub-panel:visible').each(function(){ | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | 		var p = $(this) | 
					
						
							|  |  |  | 		if(p.prop('open')){ | 
					
						
							|  |  |  | 			p.trigger('panelClosing', p) | 
					
						
							|  |  |  | 		} | 
					
						
							|  |  |  | 	}) | 
					
						
							|  |  |  | 	return panel | 
					
						
							|  |  |  | 		.prop('open', false) | 
					
						
							|  |  |  | 		.trigger('panelClosing', panel) | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | // Remove the panel after firing close events on it and all sub-panels...
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:32:45 +04:00
										 |  |  | // XXX update panel state...
 | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | function removePanel(panel){ | 
					
						
							|  |  |  | 	panel = typeof(panel) == typeof('str') | 
					
						
							|  |  |  | 		? getPanel(panel) | 
					
						
							|  |  |  | 		: panel | 
					
						
							| 
									
										
										
										
											2014-01-07 20:47:58 +04:00
										 |  |  | 	/* | 
					
						
							|  |  |  | 	if(PANEL_CLOSE_METHOD == 'hide'){ | 
					
						
							|  |  |  | 		return closePanel(panel) | 
					
						
							|  |  |  | 			.hide() | 
					
						
							|  |  |  | 	} else { | 
					
						
							|  |  |  | 		return closePanel(panel) | 
					
						
							|  |  |  | 			.remove() | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 	*/ | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | 	return closePanel(panel) | 
					
						
							| 
									
										
										
										
											2014-01-07 20:47:58 +04:00
										 |  |  | 		.hide() | 
					
						
							| 
									
										
										
										
											2014-01-07 07:21:41 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * High level interface... | 
					
						
							|  |  |  | */ | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | //
 | 
					
						
							|  |  |  | //	content_builder()	- should build and setup panel content
 | 
					
						
							|  |  |  | //	panel_setup(panel)	- should register panel open/close event 
 | 
					
						
							|  |  |  | //							handlers
 | 
					
						
							|  |  |  | //
 | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | // NOTE: this will search an element by title, so if it is not unique 
 | 
					
						
							|  |  |  | // 		an existing element will be returned...
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | function makePanelController(title, content_builder, panel_setup, content_resizable){ | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 23:31:33 +04:00
										 |  |  | 	var controller = function(state){ | 
					
						
							|  |  |  | 		state = state == null ? {} : state | 
					
						
							|  |  |  | 		var parent = state.parent | 
					
						
							|  |  |  | 		var open = state.open | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 		// 1) search for panel and return it if it exists...
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 		var panel = getPanel(title) | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		// 2) if no panel exists, create it
 | 
					
						
							|  |  |  | 		// 		- content_builder() must return panel content
 | 
					
						
							|  |  |  | 		if(panel.length == 0){ | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 			panel = makeSubPanel(title, content_builder(), parent, open, content_resizable) | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 				.attr('id', title) | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 08:26:03 +04:00
										 |  |  | 			panel_setup(panel) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			// trigger the open event...
 | 
					
						
							|  |  |  | 			if(isPanelVisible(panel)){ | 
					
						
							|  |  |  | 				panel.trigger('panelOpening', panel) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 
 | 
					
						
							|  |  |  | 		} else { | 
					
						
							|  |  |  | 			var v = isPanelVisible(panel) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			if(open && !v){ | 
					
						
							|  |  |  | 				openPanel(panel) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			} else if(!open && v){ | 
					
						
							|  |  |  | 				closePanel(panel) | 
					
						
							|  |  |  | 			} | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 		} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 23:31:33 +04:00
										 |  |  | 		// XXX set panel position, size, ...
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 		return panel | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 	PANELS[title] = controller | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | 	return controller | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-05 09:32:14 +04:00
										 |  |  | // XXX also need:
 | 
					
						
							|  |  |  | // 		- togglePanels()
 | 
					
						
							|  |  |  | // 			show/hide all the panels (a-la Photoshop's Tab action)
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-27 02:55:48 +04:00
										 |  |  | /*********************************************************************/ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | function getPanelState(){ | 
					
						
							|  |  |  | 	var res = [] | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	var _getPanel = function(){ | 
					
						
							|  |  |  | 		var panel = $(this) | 
					
						
							|  |  |  | 		var offset = panel.offset() | 
					
						
							|  |  |  | 		var sub_panels = panel.find('.sub-panel') | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 		res.push({ | 
					
						
							|  |  |  | 			type: (panel.hasClass('panel') ? 'panel' | 
					
						
							|  |  |  | 					: panel.hasClass('side-panel')  | 
					
						
							|  |  |  | 						&& panel.hasClass('left') ? 'side-panel-left' | 
					
						
							|  |  |  | 					: panel.hasClass('side-panel')  | 
					
						
							|  |  |  | 						&& panel.hasClass('right') ? 'side-panel-right' | 
					
						
							|  |  |  | 					: null), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			top: offset.top, | 
					
						
							|  |  |  | 			left: offset.left, | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			open: panel.prop('open') ? true : false, | 
					
						
							|  |  |  | 			autohide: panel.attr('autohide'), | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 			content: sub_panels.map(function(){ | 
					
						
							|  |  |  | 				var p = $(this) | 
					
						
							|  |  |  | 				return { | 
					
						
							|  |  |  | 					title: p.find('summary').text(), | 
					
						
							|  |  |  | 				} | 
					
						
							|  |  |  | 			}).toArray(), | 
					
						
							|  |  |  | 		}) | 
					
						
							|  |  |  | 	} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	$('.panel, .side-panel').each(_getPanel) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 	return res | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-01-04 02:12:44 +04:00
										 |  |  | function setPanelState(data){ | 
					
						
							|  |  |  | 	// XXX
 | 
					
						
							| 
									
										
										
										
											2013-12-27 02:55:48 +04:00
										 |  |  | } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2013-12-09 21:10:12 +04:00
										 |  |  | /********************************************************************** | 
					
						
							|  |  |  | * vim:set ts=4 sw=4 :                                                */ |