/**********************************************************************
* 
*
*
**********************************************************************/

define(function(require){ var module = {}
console.log('>>> actions')

var actions = require('lib/actions')



/*********************************************************************/
//
// Action variables:
//
// 	SCREEN_IMAGES		
// 		- screen width in images
// 		- resolves to number
// 		
// 	CURRENT				
// 		- current image
// 		- resolves to gid
// 		- support basic math: +/-
// 			e.g. CURRENT + 1	~ next image
//
// 	RIBBON				
// 		- current ribbon
// 		- resolves to gid
// 		- support basic math: +/-
//
// 	BASE				
// 		- base ribbon
// 		- resolves to gid
// 		- support basic math: +/-
//
//
// XXX add action variables!!!
var SCREEN_IMAGES = null




/*********************************************************************/
//
// Contexts:
// 				Browser		node		node-webkit		PhoneGap
// 	UI			o			x			o				o
// 	navigation	o			o			o				o
// 	edit		o, x		o			o, x			o, x
//
//
// The basic inheritance tree should be something like this:
//
//							.
//					   Data . UI
//							.
//		MetaActions			.
//			^				.
//			|				.
//			|				.
// 		BaseActions			.
// 			^	^			.
// 			|	+------------------ UIActions
//			|				.			^
//			|				.			|	   -+
// 		BaseMarks			.			|		|
// 				^			.			|		| Plugin
// 				+ - - - - -???- - - UIMarks		|
//							.				   -+
//							.
//
//
// XXX Need a way to combine a set of features into a view, preferably
// 		in runtime...
// 			- turn feature on/off at load
// 			- turn feature on/off in runtime
//
// XXX without multiple inheritance we'll need to either:
//
// 		- build inheritance chains per task -- i.e. connect blocks in 
// 		  a custom way depending on use
// 		  ...this makes it really hard to have two systems configured 
// 		  differently in the same runtime...
//
// 		- build a multiple inheritance system
// 		  ...without the ability to hook into attribute access this is
// 		  not trivial... (feasibility unknown)
//
// 		- make the UI versions by copying methods from the base and UI 
// 		  into a single object, effectively creating two separate chains
// 		  ...auto-creating proxy methods is another way to implement this
// 		  	+ solves the problem
// 		  	- not dynamic -- changes have to be applied to both chains 
// 		  	  rather than to a single relevant object.
//
// 		- encapsulate and proxy?
//
// 		- static mixin...
//
//
// XXX actions should be split by feature
//	 		- basic navigation
// 			- basic editing
// 			- cropping
// 			- marking
// 			- bookmarking
// 			- tagging
// 			- image editing
// 			- url loading
// 			- url saving
// 			- fs loading
// 			- fs saving
// 		Features can be organized into contexts:
// 			- browser viewer
// 			- browser editor
// 			- app viewer
// 			- app editor
//
// XXX each plugin must be split into:
// 		- UI view -- display only
// 		- UI controls -- edit
// 		- base actions -- usable without UI
//
// XXX think about life-cycle...
//
//
/*********************************************************************/

var BaseActions =
module.BaseActions = actions.Actions({
	// state props...
	/*
	get current(){
		// XXX should this return a gid or a jQuery-like object for 
		// 		image-oriented operations???
		return this.data.current
	},
	set current(val){
		return this.focusImage(val)
	},
	*/

	// life-cycle / state...
	// XXX

	// actions...
	focusImage: '',
	focusRibbon: '',

	// basic editing...
	shiftImageUp: 
		'Shift image to the ribbon above current, creating one if '
		+'it does not exist',
	shiftImageDown:
		'Shift image to the ribbon below current, creating one if '
		+'it does not exist',
	shiftImageUpNewRibbon: 
		'Create an empty ribbon above and shift the image into it',
	shiftImageDownNewRibbon:
		'Create an empty ribbon below and shift the image into it',
	shiftImageLeft: 'Shift image to the left',
	shiftImageRight: 'Shift image to the right',

	shiftRibbonUp: 'Move current ribbon one position up',
	shiftRibbonDown: 'Move current ribbon one position down',

	// XXX
	sortImages: '',
	reverseImages: '',
	setAsBaseRibbon: '',

	// image adjustments...
	rotateCW: '',
	rotateCCW: '',
	flipVertical: '',
	flipHorizontal: '',

	// external editors/viewers...
	systemOpen: '',
	openWith: '',

	// crop...
	// XXX should this be here on in a crop pligin...
	cropRibbon: '',
	cropCurrentRibbonAndAbove: '',
	uncropView: 'Uncrop to previous crop',
	uncropAll: 'Uncrop to base',
	uncropViewAndKeepOrder: 
		'Uncrop view to previous crop, keeping current image order',
	uncropAllAndKeepOrder: 'Uncrop to base, keeping current image order',

	openURL: '',
	//openHistory: '',

	saveOrder: '',
	saveState: '',
	exportImages: '',

	exit: '',
})



/*********************************************************************/

var UIActions =
module.UIActions = {

	// basic navigation...
	nextImage: ['Focus next image in current ribbon', { focusImage: 'next' }],
	nextRibbon: ['Focus next ribbon (down)', { focusRibbon: 'next' }],
	// XXX actions vars...
	nextScreen: ['Show next screen width of images', { focusImage: SCREEN_IMAGES }],

	prevImage: ['Focus previous image in current ribbon', { focusImage: 'prev' }],
	prevRibbon: ['Focus previous ribbon (up)', { focusRibbon: 'prev' }],
	// XXX actions vars...
	prevScreen: ['Show previous screen width of images', { focusImage: -SCREEN_IMAGES }],

	firstImage: 'Focus first image in ribbon',
	lastImage: 'Focus last image in ribbon',

	// zooming...
	zoomIn: 'Zoom in',
	zoomOut: 'Zoom out',

	// NOTE: if this gets a count argument it will fit count images, 
	// 		default is one.
	fitImage: 'Fit image',

	// XXX should these be relative to screen rather than actual image counts?
	fitTwo: ['Fit two images', { fitImage: 2, }],
	fitThree: ['Fit three images', { fitImage: 3, }],
	fitFour: ['Fit four images', { fitImage: 4, }],
	fitFive: ['Fit five images', { fitImage: 5, }],
	fitSix: ['Fit six images', { fitImage: 6, }],
	fitSeven: ['Fit seven images', { fitImage: 7, }],
	fitEight: ['Fit eight images', { fitImage: 8, }],
	fitNine: ['Fit nine images', { fitImage: 9, }],

	fitMax: 'Fit the maximum number of images',

	fitSmall: 'Show small image',
	fitNormal: 'Show normal image',
	fitScreen: 'Fit image to screen',

	// modes...
	singleImageMode: 'Show single image',
	ribbonMode: 'Show ribbon',

	toggleTheme: 'Toggle themes',

	// dialogs...
	// XXX move to specific blocks...
	openDialog: 'Show open diaolg',
	historyDialog: 'Show history dialog',
	cropDialog: 'Show crop dialog',

	// panels...
	togglePanels: '',
	showInfoPanel: '',
	showTagsPanel: '',
	showSearchPanel: '',
	showQuickEditPanel: '',
	showStatesPanel: '',
	showHistoryPanel: '',
	showDirBrowserPanel: '',
	showConsolePanel: '',

	// developer actions...
	showConsole: 'Show application console',
	showDevTools: 'Show development tools',
}


/*********************************************************************/

// Marks actions...
// XXX move to marks.js
var MARKS_ACTIONS =
module.MARKS_ACTIONS = {
	toggleMark: '',
	toggleMarkBlock: '',

	nextMarked: '',
	prevMarked: '',
	nextMarkedInRibbon: '',
	prevMarkedInRibbon: '',

	markRibbon: '',
	unmarkRibbon: '',
	markAll: '',
	unmarkAll: '',
	invertMarkedRibbon: '',
	invertMarkedAll: '',

	// placing...
	placeMarkedAfter: 'Place marked images after current',
	placeMarkedBefore: 'Place marked images before current',

	shiftMarkedUp: '',
	shiftMarkedDown: '',
	shiftMarkedLeft: '',
	shiftMarkedRight: '',
	shiftMarkedUpNewRibbon: '',
	shiftMarkedDownNewRibbon: '',

	cropMarkedImages: '',
	cropMarkedImagesToSingleRibbon: '',

	markDialog: 'Show mark dialog',
	placeMarkedDialog: '',
}



/*********************************************************************/

// Bookmarks actions...
// XXX move to bookmarks.js
var BOOKMARKS_ACTIONS =
module.BOOKMARKS_ACTIONS = {
	toggleBookmark: 'Toggle image bookmark',

	nextBookmarked: '',
	prevBookmarked: '',
	nextBookmarkedInRibbon: '',
	prevBookmarkedInRibbon: '',

	bookmarkMarked: 'Bookmark marked images',
	unbookmarkMarked: 'Remove bookmarks from marked images',
	toggleBookmarkMarked: 'Toggle bookmarks on marked images',

	clearRibbonBookmarks: 'Remove bookmarks in ribbon',
	clearAllBookmarks: 'Clear all bookmarks',

	cropBookmarkedImages: '',
	cropBookmarkedImagesToSingleRibbon: '',
}



/**********************************************************************
* vim:set ts=4 sw=4 :                                                */
return module })
