Roadmap
	[_] 61% Pre-Alpha - limited preview
		[_] 50% Supported formats
			[X] jpeg
			[_] RAW
		[_] 33% Usecases
			[_] view unprepared dir (read-only / tmp-cache / mem-cache)
			| XXX initially lags for hi-res images...
			[_] view unprepared dir (cache in background)
			| XXX initially lags for hi-res images...
			[X] view prepared dir
		[_] 57% UI
			[_] 0% Tablet-specific
				[_] screen buttons
			[X] 100% modes
				[X] single image
				[X] slideshow (single image)
				[X] ribbon
				[X] cropped mode
				| show only selected images
			[_] 71% other
				[X] load/open
				[X] browse for location (open)
				[X] select saved set
				[X] keyboard help
				[_] general help
				[_] settings
				[X] image info
		[_] 75% navigation
			[X] image next/prev
			[X] ribbon next/prev
			[X] screen next/prev
			[_] marks next/prev (???)
		[X] slideshow
		[_] 71% editing
			[X] 100% ribbon
				[X] merge up/down
				| via. marking... 
				|
				| still thinking if this is the right way...
				[X] sort
			[_] 92% image
				[X] shift up/down
				[X] shift left/right
				[X] mark/unmark (selection)
				[X] rotate left/right
				[X] flip H/V
				[_] 50% metadata
					[_] tag
					[X] note
				[X] open with external software
			[_] 42% marked (selected) set
				[X] crop (marked only mode)
				[_] tag
				[X] shift up/down
				[_] shift left/right
				[_] group
				[_] note
				[X] save as set
			[_] 50% crop selection via
				[X] marked
				[X] ribbon
				[_] tag
				[_] date
		[_] 54% storage and loading
			[_] 75% ImageGrid cache
				[X] generate
				[X] load
				[X] save
				[_] update
				| needs revision...
			[_] 75% fav tree
				[X] generate
				[X] load
				[X] save
				[_] update
				| at this time images are added to the tree but not removed...
			[_] 0% xmp files
				[_] generate
				| XXX make this native
				[_] load
				[_] save
				[_] update
			[_] 66% raw directory tree
				[X] load
				[X] save
				[_] update
		[_] 50% build targets
			[X] 100% Windows
				[X] CEF (Python/...)
				[X] node-webkit
			[X] MacOS X (node-webkit)
			| needs more work...
			[_] Android (PhoneGap)
			[_] iOS (PhoneGap)
			[_] Windows 8 (Native?)
			[X] Linux ia32 (node-webkit)
			[X] Linux x64 (node-webkit)
			[_] Windows Phone 8 (PhoneGap/Native)
	[_] 0% Alpha - limited preview
		[_] 0% editing
			[_] 0% ribbon
				[_] flatten
			[_] 0% image
				[_] crop
	[_] 0% Beta - public?
	[_] 0% 1.0 - public
	


[_] 30% Gen 3 current todo
	[_] 60% High priority
		[_] BUG: OSX: unable to load absolute paths...
		[_] OSX: add alternatives to function buttons...
		[_] Feature: basic editor...
		| use CSS3 filters to edit and save edit values for:
		| 	- brightness
		| 	- contrast
		| 	- saturation
		| 	- hue
		| 	- grayscale
		| 	- sepia
		| 	- invert
		| 	- blur
		|
		| save settings and load them on a per preview basis...
		|
		| see: http://html5-demos.appspot.com/static/css/filters/index.html
		|
		| For UI use a left/right pane to "hold" the sliders...
		[_] UI: Panes...
		|
		| 	+-----+---------------+-----+
		| 	|	  |				  |		|
		| 	|	  |				  |		|
		| 	|	  |	+-----------+ |		|
		| 	|	  |	|			| |	  <---- Pane
		| 	|	  |	|	Image	| |		|
		| 	|	  |	|			| |		|
		| 	|	  |	+-----------+ |		|
		| 	|	  |				  |		|
		| 	|	  |				  |		|
		| 	+-----+---------------+-----+
		|
		|		  +---------------+
		|			Viewer
		|
		|
		| NOTE: panes should be outside the viewer, so as not to overlap
		| 		with the image...
		| NOTE: we can also try and use top and bottom panes, but that 
		| 		might over-complicate things...
		[_] UI: touch controls / toolbars...
		|
		| 	+-+-----------------------+-+
		| 	| |    				  	  | |
		| 	| |    				  	  | |
		| 	| |    	+-----------+ 	  | |
		| 	| |    	|			| 	  |<--- Button bar
		| 	| |    	|	Image	| 	  | |
		| 	| |    	|			| 	  | |
		| 	| |    	+-----------+ 	  | |
		| 	| |    				  	  | |
		| 	| |    				  	  | |
		| 	+-+-----------------------+-+
		|
		|
		| Basic layout:
		| 		Left bar			Right bar
		| 			help				config		+ low priority
		|
		| 			up					up			+
		| 			prev				next		| main controls
		| 			down				down		+  (under thumbs)
		|
		|											+
		| 			...					...			| misc controls
		|											+
		|
		| Things to have in buttons:
		| 	- navigation
		| 	- shift
		| 	- crop select / exit crop
		| 	- modes
		| 		- slideshow
		| 		- image/ribbon toggle
		| 	- zoom
		| 	- tags/metadata editor toggle
		| 	- image editor toggle
		| 	- open/history/...
		| 	- sort
		| 	- export
		[_] 30% mark-based operations
			[_] 50% cropping selection
				[X] marked
				[X] ribbon
				[_] by tag/collection
				[_] by group
			[X] shift up/down
			[_] tag
			[_] group
			| a group should behave as a single image but is 
			| viewable/expandable as a ribbon...
			|
			| should be two types of groups:
			| 	- strict - always as a single image
			| 		like a set of versions, processed and processing 
			| 		versions of the same image.
			| 		(auto-group?)
			| 	- loose - similar images, could be named collections
			| 		viewed individually, but can be accessed either from 
			| 		a list or a member image (primary).
			[_] collection
			| make or add to existing collection
		[_] 0% grouping / meta-image
			[_] versions w. label image
			| a set of images that is represented by one of the group
			[_] collection
		[_] editable list of external commands...
		| to add things like exportdirs.py etc.
		[_] Export data...
		| same as export dirs but also include .ImageGrid/ dir with current
		| data and images...
		[_] BUG: after loading a non-existing dir, opening a new dir raises an error
		| i.e. the open dialog does not close, while the images are loaded...
		[_] BUG: sometimes opening a dir (open dialog) does not do anything...
		| Uncaught TypeError: Cannot call method 'indexOf' of undefined -- data.js:576
		[_] Q: how do we mark unsorted sections in base ribbon after aligning?
		| - there is a big gap in the ribbon below, but it's not visible...
		| - can we "mark" big gaps? ...what's the threshold of "big"?
		|
		| Possible approaches:
		| 	- do not mark
		| 		In theory the base ribbon is always "final", thus marking and 
		| 		sorted/unsorted categories are un-needed complexity.
		| 		This plays well with the "auto-align" mechanics...
		| 		This may play well with bookmarking...
		| 	- sorted/unsorted images marking (viewed/unviewed)
		| 		This can be done in several ways:
		| 			- track viewing
		| 			- anything in the aligned group is "sorted"
		| 			- ...
		| 		Added complexity
		| 	- manual bookmarking
		[_] do we need to store marks in localstorage???
		[_] would be good to unify buildcache and viewer to use the same code...
		| rewrite buildcache in js?
		|
		| XXX this will need code reorganization to support node.js' require(...)
		| 		mechanics...
		[_] 75% add data updating to buildcache
			[X] non-destructive updates...
			| force create new data-set, backup old data 
			| default: update
			|
			| find and add new images to images.json and data.json
			| should be added as updates, i.e. 201310101445-data.json
			| and 201310101445-images-diff.json
			|
			| add new images to base ribbon
			|
			| NOTE: fav dirs are ignored by buildcache
			[X] --base-ribbon=N
			| default N=0 i.e. top ribbon
			[_] --reset-gids
			| replace gids in data.json and images.json
			[X] fast update by default
			| - store a file-list in .ImageGrid/filelist.json
			| - make a pedantic update (current) optional via
			|   	--force-full-scan
		[_] add data updating to viewer...
		| make this separate from ribbonsFromFavDirs(...)
		|
		| might be good to make this semi-manual:
		| 	- notify user of "directory updated, load new data?"
		| 	- ctrl-r reload and load new data
		[_] 0% plugins:
			[_] might be good to split some current functionality into plugins
			| this mostly concerns non-core and not portable stuff like:
			| 	- loadDirectoryDialog(...)
			| 	- vips index generator
			| 	- metadata readers (exiv2, exiftool, vips)
			| 	- viewer/editor runner
			[_] 0% directory selector
				[_] path(s) to use as source
				| to list sub-dirs under...
				| e.g. /mnt/l/mnt/* (photo)/*/media/img/my/*
				|
				| editable in plugin config
				[_] .ImageGrid.metadata
				| store/get:
				| 	- sup-path to index
				| 	- title
				| 	- directory taggs and meta info
				| 	- ...
		[_] 33% normalize ribbons -- top-align sorted chunks
			[X] basic mechanics
			| splitData(...)
			| mergeData(...)
			| alignDataToRibbon(...)
			| shiftRibbonBy(...)
			[_] manual invoke mechanics
			| ctrl-s is a good candidate
			|
			| NOTE: might need a good preview to make this understandable...
			[_] auto-invoke mechanics
		[_] update data set...
		| - add new images to the set
		| - update changed images
		[_] merge data sets...
		| combine two or more separate data.json and images.json sets...
		|
		| this can be done in two ways:
		| 	- live
		| 		the view jumps between sets and saves the changes to its 
		| 		origin set.
		| 		some operations like shifting left/right would be difficult
		| 	- full merge (preferred)
		| 		save a new data set.
		| 		not different to single data set.
		| 		will eventually need fragmenting...
		[_] fragmenting of data/images/marks support...
		| split data into chunks...
		|
		| need a simple way to split chunks to:
		| 	1) make the scheme as simple as possible
		| 	2) make things fast -- minimal read/write/cache
		| 	3) try not to depend on sort order
		|
		| a possible simple way out of this is to use a DB
		| 	- CouchDB
		| 	- SQL
		| 	- file-db
			[_] add ability to save/load ranges of images and the structures around them
			| e.g.load image 100 to current ribbon -> will load 100 images
			| for current ribbon and all the in between images from other
			| ribbons above and below...
		[_] BUG CLASS: everything should work with empty ribbons...
		| currently some code breaks when seeing an empty ribbon...
		[_] BUG: shifting last image out of a ribbon misaligns the current ribbon
		| i.e. the prev ribbon was deleted and the new focused ribbon
		| is aligned as if it was not current...
		|
		| this is due to a race condition -- the alignment is done BEFORE 
		| the current image is set...
		[_] BUG: sometimes loading a raw directory stops at "error loading data.json"
		| and some times it does not err..
		|
		| Q: did not see this for some time, is this resolved???
		[_] BUG: sometimes images.json folder is created...
		| can't repeat this yet, and seen only once...
		[_] 0% full archive index
			[_] segmented loading of images and data
			[_] ribbon separation
			| split ribbon into manageable chunks
			|
			| this can be done naturally by:
			| 	- date
			| 	- event
			|	- tag
			[_] index and group ALL files in an archive
			[_] import metadata
			[_] real GIDs
		[_] 33% FAST thumbnail generation strategies
			[_] 0% pass 1: generate really fast previews
				[_] ~1/3 screen - for ribbon
				[_] ~1 screen - for single image mode
			[X] pass 2: generate normal previews
			[_] extract existing raw thumbnails/previews (for RAW files)
		[_] 0% Tablet UI
			[_] screen buttons
		[_] save settings to config.json
		[_] Q: do we need separate theme settings?
		| ...for ribbon and single-image modes?
		[_] workflow editor (external app?)...
		| edit sequence of actions and events...
		|
		| Example:	
		| 	- on mount volume name X
		| 		-> make previews
		| 		-> make cache
		| 		-> import to index
		| 		-> run Viewer
		| 	- on Viewer data change
		| 		-> run exportdirs.py
		| 	- on tweak 
		| 		-> run Irfan view
		| 	- on edit
		| 		-> run Photoshop
		| 	- on PSD created
		| 		-> make preview
		| 		-> add to index
		| 		-> group with preview
		| 	...
		|
		|
		[_] 0% keyboard.js
			[_] multiple key handler...
			| handle multiple key presses...
			|
			| one way to do this:
			| 	- a generic handler with timeout
			| 		- if key N pressed before timeout kandle it's action
			| 		- if timeout handle default action
			|
			| Q: how do we organize the config for this?
			| 	a) <key-spec> syntax, some thing like 'A, B'
			| 	b) complex handler with keys (in addition to modifiers)
			|
			[_] 0% online config editor API...
				[_] onKey(<key-spec>, handler[, mode])
				| <key-spec> should be something simple like a string
				|
				| Examples that should work:
				| 	'Enter'
				| 	'alt-F4'
				|
				| NOTE: with current config structure this is not that 
				| 		trivial
				[_] offKey(<key-spec>[, mode])
				[_] introspection
				| this is partially done already, need a simpler API for 
				| the user...
		[_] ASAP: test on Android...
		[_] 50% Undo/Redo
			[X] basic one step (revert to last save)
			[_] push/pop state stack
		[_] check if preview loaded, else load a different preview...
		[_] single image mode transition (alpha-blend/fade/none)
		[_] 0% CSS
			[_] cleanup
			[_] split themes and layout
		[_] tweak image pre-caching size -- keep as many images cached as possible.
		| might be good to always cache the smaller previews so as to make things
		| look faster...
		[_] revise reporting scheme...
		| showStatus(...) should be called uniformly, either at the source 
		| or a specific reporting layer...
		[_] 0% tweak loader
			[_] thresholds and frame size
			[_] remove extra and repetitive actions
			[_] caching config
		[_] side-by side view...
		[_] Simplify tool-tip structure in dialogs...
		| might also bee good to unify tool-tips across the app...
		[X] URL history...
		[X] BUG: ribbons above and below are still sometimes loaded incorrectly
		| likely due to trying to align 
		[X] BUG: cropping in single image mode will change image scale...
		| likely a problem with reloadViewer(...)
		[X] BUG: align problems are back...
		| default data set (browser/images.js) same images #4 (going 
		| from right) & #5 (going from left) of 18 in the first ribbon 
		| get aligned wrong...
		|
		| this is at a zoom level with screen proportions...
		|
		| zooming to a different level affects which images are 
		| misaligned, at "max" #2 and #5 are affected...
		|
		| centerView() fixes this, but only for the current image...
		[X] BUG CLASS: file-name auto escaping...
		| mostly fixed, but need to check more thoroughly...
		[X] BUG: @ 9 image width, jumping to end of ribbon length 39 messes up loading...
		| problem likely in loadImagesAround(...)
		|
		|	- ribbon length 178 also ends up messing things up, while 68 and
		|	  69 pose no problems...
		|	- 19 images @ 5 per ribbon also breaks things...
		|
		| was a bug in rollImages(...)
		[X] BUG CLASS (ASAP!): race conditions due to browser rendering lag...
		| this happens when updating/adding lots of elements:
		| 
		| the update code is done and returns BEFORE the browser is done 
		| rendering the updates...
		|
		| one of the side-effects is that the updates or added elements
		| do not yet exist when the code is done and returned.
		|
		| XXX I do not know why or how but this appears to have gotten fixed
		| 		by rewriting loadImages(...) to loadImagesAround(...)
		[X] BUG: reloadViewer(...) loses image focus...
		| ...if the image is not near ribbon start.
		|
		| This is due to the fact that we are trying to focus an image
		| before the DOM is ready...
		|
		| To fix:
		| 	- make focusImage(...) in reload viewer run AFTER all the 
		| 	  images are created...
		|
		| XXX this is the cause for several other bugs...
		[X] BUG: sometimes duplicate images get loaded...
		| this happens when jumping back and forth on the mid ribbon until
		| the last element shows up and then moving left until the frame
		| around the image disappears...
		| at this point, this will return 2:
		|
		| 	$('[order='+$('.current.image').attr('order')+']').length
		|
		| happens when:
		| 	ribbon length: ~42
		| 	screen width: 4
		| 	jumping to end from start of ribbon
		|
		| Example 1:
		| 	1) first ribbon in (loaded at first image):
		|	 "F:\work\ImageGrid\cur\ImageGrid\src\ui\BUGS\ribbon loading error\"
		|	2) ctrl-end (error state in "jumping ribbon .." bug)
		|	3) left/right (next/prev image)
		|	now the last portion of the ribbon is loaded twice
		|
		| XXX possibly related to 
		|		 BUG CLASS (ASAP!): race conditions due to browser rendering lag...
		[X] BUG: jumping in ribbon sometimes does not load the ribbon correctly...
		| Example 1:
		| 	first ribbon in (loaded at first image):
		|	 "F:\work\ImageGrid\cur\ImageGrid\src\ui\BUGS\ribbon loading error\"
		|	jumping to the end will result in an inconsistent view:
		|		- ribbon not aligned at the correct spot
		|		- wrong image is .current
		|		- part of the images appear to be loaded but misaligned...
		|
		| Example 2:
		| 	load same data at same position as in #1
		| 		- shift-F2 to marked-only view
		| 		- go to end of ribbon (any means work)
		| 		- shift-F2 or Esc out of marked-only mode
		| 	this will result in a state very similar (if not identical) to
		| 	example #1...
		|
		|
		| NOTE: jumping back and forth several times will make this problem
		| 		go away...
		| 		Q: could this be initial load/state error?
		|
		| XXX possibly related to 
		|		 BUG CLASS (ASAP!): race conditions due to browser rendering lag...
		|
		| Appears to be fixed...
		[X] BUG: something wrong with the export dialog...
		| when a different destination is specified nothing is copied 
		| form the base ribbon...
		[X] BUG: need to prioretize marks loading...
		| if no markes.json is empty then localstorage marks will get 
		| loaded...
		[X] rework the marks.js/modes.js to enable multi-level ribbon cropping...
		[X] add indicator to ribbon up/down navigation in full screen...
		| this might be a number or some kind of animation...
		[X] BUG: scaling #2 in single image mode fits image to screen on wide screens
		[X] BUG: cropping in cropped mode will not save the whole data...
		[X] 100% BUG: sometimes the previews are not updated...
			[X] wrong resolution preview is loaded
			| when coming out of single-image-mode after moving to a 
			| different position (so as ribbons go reloaded)
			[X] previews do not get replaced at all, e.g. everything 
			| behaves correctly (order, etc.) but the previews are 
			| from wrong (ones before re-attaching) images
			| (this I can't repeat at this point)
			|
			| Example:
			|	URL: "file:///L:/mnt/P7000 (photo)/PHOTOS/Last week of September 2011/"
			|	going through the previews in the top row forward and backward
			|	watch the ribbon below -- on the way back everything is aligned
			|	correctly but the images are different.
			|	also, there are times when the ribbon below is partially loaded 
			|	or at it's edge when there are other images...
			|	NOTE: calling updateImages() will load the correct previews.
			|
			| The mechanics of this bug:
			| 	- sometimes the .onload handler gets the right image ref in 
			| 	  the closue but a wrong p_url, how can this happen I do not
			| 	  know.
			| 	- slowing down the browser appears to make this happen 
			| 	  less often, is this a race condition?
			|
			| Might be caused by fast sequential updating/reloading of an image:
			| 	- call the updateImage(...) in order several times
			| 	- cache .onload events get called in order of images loading 
			| 	  not in order of updateImage(...) calls...
			| (this cause is not confirmed)
			|
			| Apparently fixed by storing the preview URL in image.data(), this 
			| is slower but avoids problems with multiple updates and races...
		[X] make tooltip balloons on top of everything else...
		| currently a tooltip balloon is bellow the next tooltip...
		[X] add min-height to tooltips
		| one line tooltip-right get messed-up...
		[X] add option to export either original or preview (exportDialog)
		[X] BUG: when creating previews for small-ish pics the original is not used
		| after updating the image...
		|
		| e.g. for a 900px image, 150px and 350px images are created and
		| the 350px is used in full screen.
		[X] 100% basic dialogs
			[X] select from list
			[X] alert
			[X] prompt
			[X] open directory (native)
		[X] BUG: context status does not get updated on Ctrl-D
		[X] single ribbon mode
		| should this have up/down navigation?
		|
		| something like showGidsAsRibbon(gids) would be generic and logical...
		[X] build cache in background...
		| this must be done while updating IMAGES live...
		[X] 100% dialog constructor
			[X] widget: text
			[X] widget: bool
			[X] widget: choice
			[X] widget: dir/ndir
			| browser native (dir) and custom (ndir) directory selector...
		[X] 100% image sorting (date/name/...)
			[X] 100% sort by:
				[X] date
				[X] name
				[X] manual shift left/right/position
				| position shift is mark and shift here..
			[X] 100% Sort ui
				[X] reverse
				[X] select sort method
		[X] usable empty view -- w.o. data...
		[X] 100% UI elements
			[X] indicators
			[X] image info
			[X] stub info dialog
			[X] detailed image info
		[X] build for windows (node-webkit)
		[X] BUG: scaling is again broken with rotated images
		| - rotate an image
		| - scale it to 1 (press 1)
		[X] BUG: BASE_URL seems to gain a new trailing '/' on each save...
		| low priority as this does not affect anything...
		[X] 100% gesture support
			[X] up/down - navigate
			[X] left/right - navigate
		[X] make the marks in single image mode show in corner of viewer, not image
		| and think of a uniform indicator position...
		|
		| 	+---------------------------+
		| 	|					   oooo	| <-- global indicators
		| 	|							|		(all modes)
		| 	|							|
		| 	|							|
		| 	|							|
		| 	|							|
		| 	|							|
		| 	|							|
		| 	|							|
		| 	|					   oooo	| <-- context indicators
		| 	+---------------------------+		(single image mode)
		|
		| make global indicators semi-transparent in single-image-mode, so as to 
		| indicate their lesser priority than context/image indicators...
		|
		| keep image indicators within the image square for ribbon mode...
		|
		| possible indicator styles:
		| 	- letter, expand on hover
		| 	- colored circle -- show text of same color under or to the side on hover
		|
		| might bee nice too use both styles, one for images one for global...
		[X] BUG: shifting ribbon left sometimes results in wrong order...
		| i.e. an image with order 12 before image with order 11
		|
		| Example:
		| 	- default image set
		| 	- move first image 2 positions right
		|
		| Resulting state:
		| 	- current image order: 12
		| 	- next image order: 11
		| 	- prev image order: 10
		|
		| This is stably reproducible.
		[X] BUG: changing window size (F11) in single image modes messes things up...
		| some images are of different sizes (newly loaded) and aligned in a wrong way...
		|
		| appears not to affect square-fit view...
		|
		| until we cycle to ribbon mode and back...
		| 
		| Q: does this trigger the on-resize event???
		| A: no, not connected...
		|
		| possible that this is connected with the align/load bug...
		|
		| appears to be a state leak, this affects:
		| 	- correctImageProportionsForRotation(image) -- mis-alignes images
		| 	  while after cycling single image mode, behaves correctly...
		| 	- affects finNImages(...) -- uses old size of viewer...
		[X] BUG: aligning still sometimes gets off...
		| ...after rotating a number of images
		|
		| happens when:
		| 	- getScreenWidthInImages() < 2
		| 	- looking through images in one direction and back, some get misaligned
		| 		...this is stable behaviour by centerRibbon(...), 
		| 		calling it again will not fix this.
		| 		moving next/prev will fix the issue until it comes back again
		| 	- affected by LOAD_SCREENS and number of images in ribbon
		| 		current figures:
		| 			Ribbon: 18
		| 			Position going forward: 4
		| 			Position going back: 1
		| 			LOAD_SCREENS: 6
		| 	NOTE: changing LOAD_SCREENS moves the affected positions.
		| 	NOTE: had a similar bug where some images still kept their 
		| 			prior sizing after recycling...
		| 			...check if centerRibbon(...) and correctImageProportionsForRotation(...)
		| 			are called in right sequence...
		[X] BUG: keyboard.js, some combinations resolve problems...
		| in current help shows E, F4, alt-F4 as "Open image in ..."
		| 	- E and F4 work OK
		| 	- alt-F4 both close the viewer (default) and open an image.
		|
		| Example:
		| 	E: doc('Open image in external software', openImage),
		|	F4: {
		|			default: 'E',
		|			alt: doc('Close viewer'),
		|		},
		|
		[X] reverse ribbons...
		[X] slideshow mode...
		[X] default STUB image...
		| or a loading animation..
		|
		| ...would be good to make something pixilated so as to look nise 
		| on various magnifications.
		|
		| keep always cached.
		[X] import fav dirs (wo. index)...
		[X] ASAP: load/view un-cached directories...
		[X] ASAP: support relative paths in cache...
		[X] ASAP: account for image rotation with screen proportions while positioning
		| getRelativeVisualPosition(...) gives an odd position when:
		| 	- image is rotated
		| 	- image is screen-proportioned
		[X] NOTE: rotating might still produce alignment errors
		| this is due:
		| 	- most outerWidth/outerHeight being used do not account for margins...
		[X] ASAP: rotate images in the viewer...
		| This is a tad complicated by:
		| 	- marks
		| 	- image elem proportions that can change
		[X] 100% themes
			[X] light
			[X] gray
			[X] dark
		[X] make focus up/down chose a closest independently of direction...
		| navigation should be stable and moving up then down should yield 
		| exactly the same result...
		[X] ASAP: rewrite binSearch!! 
		| linSearch obviously is not usable for large sets of data...
		[X] split saving/loading into files and localStorage
		| DATA
		| 	- stored in localStorage
		| 	- stored in file
		| IMAGES
		| 	- stored only in files (does not change)
		|
		[X] 100% modes
			[X] ribbon
			[X] single-image
		[X] Save/load state
		[X] 100% action visual indication
			[X] first/last image
			[X] shift up/down
	[_] Low priority
		[_] Help
		[_] Keyboard config
		[_] general config
		


[_] 74% Gen 3 UI implementation
	[X] 100% Infinite ribbon (lib)
		[X] cyclic ribbon
		[X] image block generation
		[X] image block update
		[X] ribbon head/tail management
		| must be adaptive to current user scroll speed...
		|
		| at least a couple of screens at current zoom level...
	[_] Partial save/load
	| save only a block or changed data...
	[X] Adaptive preview size (lib)
	[X] Multiple ribbon (reuse)
	[_] 44% User actions
		| see [[controls.otl]] for basic actions...
		|
		| additional actions:
		[X] 100% toggle mark image
			[X] mark between
			| mark all images between closest marks
			[X] mark all/none
			[X] mark invert
		[X] show marked only in ribbon (crop selection)
		[_] crop image
		| shows a red/blue rectangle around image
		|
		| can be:
		| 	turned +/- 90 deg
		| 	turned arbitrarily
		| 	scaled with constrained proportions
			[_] show crop as red rectangle
			[_] show only cropped area
			[_] show crop as black veil
		[X] add note to image
		| a-la flickr notes...
		[_] edit IPCT
		[_] add/edit tags (set of images)
		[_] add/edit tags (single image)
		[X] rotate image
	[X] 100% UI modes
		[X] 100% single ribbon
			[X] show marked only
			[X] show current ribbon
			[X] show images shifted (all / above only / below only) in current ribbon
		[X] 100% multiple ribbons
			[X] show images above/below
			[X] show marked only
		[X] 100% single image


.
| vim:set spell :
