##parameters=b_start=0, key='', reverse=0, ids=(), items_copy='', items_cut='', items_delete='', items_new='', items_paste='', items_rename='', items_up='', items_down='', items_top='', items_bottom='', items_sort='', template='', macro='', ajax='',**others
##
from Products.Plinn.PloneMisc import Batch
from DateTime import DateTime
locale_date_fmt = context.locale_date_fmt()
from ZTUtils import make_query
from Products.CMFCore.utils import getToolByName
from Products.CMFDefault.permissions import AddPortalContent
from Products.CMFDefault.permissions import DeleteObjects
from Products.CMFDefault.permissions import ListFolderContents
from Products.CMFDefault.permissions import ManageProperties
from Products.CMFDefault.permissions import ViewManagementScreens
from Products.CMFDefault.permissions import ModifyPortalContent
from Products.CMFDefault.utils import html_marshal

mtool = getToolByName(script, 'portal_membership')
checkPermission = mtool.checkPermission
utool = getToolByName(script, 'portal_url')
portal_url = utool()


form = context.REQUEST.form
default_target = 'object/folderContents'
default_kw = {'b_start': b_start, 'key': key, 'reverse': reverse, 'ajax' : ajax}
if items_copy :
	if ajax : default_kw['syncFragments']=['rightCell']
	if context.validateItemIds(**form) and \
			context.folder_copy_control(**form) and \
			context.setRedirect(context, default_target, **default_kw):
		return
elif items_cut :
	if ajax : default_kw['syncFragments']=['rightCell']
	if context.validateItemIds(**form) and \
			context.folder_cut_control(**form) and \
			context.setRedirect(context, default_target, **default_kw):
			return
elif items_delete and \
		context.validateItemIds(**form) and \
		context.folder_delete_control(**form) and \
		context.setRedirect(context, default_target, **default_kw):
	return
elif items_new and \
		context.setRedirect(context, 'object/new', **default_kw):
	return
elif items_paste :
	if ajax : default_kw['syncFragments']=['rightCell']
	if context.folder_paste_control(**form) and \
			context.setRedirect(context, default_target, **default_kw):
			return
elif items_rename and \
		context.validateItemIds(**form) and \
		context.setRedirect(context, 'object/rename_items', ids=ids,
							**default_kw):
	return
elif items_sort and \
		context.folder_sort_control(**form) and \
		context.setRedirect(context, default_target, b_start=b_start):
	return
elif items_up and \
		context.validateItemIds(**form) and \
		context.folder_up_control(**form) and \
		context.setRedirect(context, default_target, **default_kw):
	return
elif items_down and \
		context.validateItemIds(**form) and \
		context.folder_down_control(**form) and \
		context.setRedirect(context, default_target, **default_kw):
	return
elif items_top and \
		context.validateItemIds(**form) and \
		context.folder_top_control(**form) and \
		context.setRedirect(context, default_target, **default_kw):
	return
elif items_bottom and \
		context.validateItemIds(**form) and \
		context.folder_bottom_control(**form) and \
		context.setRedirect(context, default_target, **default_kw):
	return
	

options = {}

items_add_allowed = checkPermission(AddPortalContent, context)
upitems_list_allowed = checkPermission(ListFolderContents, context, 'aq_parent')
manage_props_allowed = checkPermission(ManageProperties, context)

# information pour remonter au dossier parent
up_info = {}
if upitems_list_allowed:
	up_obj = context.aq_parent
	if hasattr(up_obj, 'portal_url'):
		up_url = up_obj.getActionInfo('object/folderContents')['url']
		up_info = { 'icon': '%s/UpFolder_icon.gif' % portal_url,
					'id': up_obj.getId(),
					'url': up_url }
	else:
		up_info = { 'icon': '',
					'id': 'Root',
					'url': '' }
options['up_info'] = up_info

target = context.getActionInfo(default_target)['url']

if not key:
	(key, reverse) = context.getDefaultSorting()
	is_default = 1
elif (key, reverse) == context.getDefaultSorting():
	is_default = 1
else:
	is_default = 0

columns = ( {'key': 'Lock',
			 'title': '',
			 'width': '16',
			 'colspan': None}
			, {'key': 'Type',
			 'title': 'Type',
			 'width': None,
			 'colspan': '2'}
			, {'key': 'title_or_id',
			 'title': 'Name',
			 'width': None,
			 'colspan': None}
			, {'key': 'modified',
			 'title': 'Last Modified',
			 'width': None,
			 'colspan': None}
			, {'key': 'position',
			 'title': 'Position',
			 'width': None,
			 'colspan': None }
			)

for column in columns:	
	images = []
	if key == column['key'] :
		if not is_default and manage_props_allowed :
			images.append( {'src' : getattr(context, 'set_default_sorting.gif').absolute_url(),
							'alt' : 'Set Sorting as Default',
							'id'	 : 'SetSortingAsDefault',
							'href': '%s?%s' % (target, make_query(items_sort=True,
																  key=key,
																  reverse= (key != 'position' and [reverse] or [False])[0] )
												  )
							 }
							 )

		if key != 'position' :
			if reverse :
				toggleImg = getattr(context, 'arrowDown.gif')
				alt = 'descending sort'
			else :
				toggleImg = getattr(context, 'arrowUp.gif')
				alt = 'ascending sort'
			query = make_query(key=column['key'], reverse = not reverse)
		else :	
			toggleImg = getattr(context, 'arrowUp.gif')
			alt = 'ascending sort'
			query = make_query(key=column['key'])
		images.append( {'src' : toggleImg.absolute_url(), 'alt' : alt} )
	else :
		if key != 'position' :
			query = make_query(key=column['key'], reverse = reverse)
		else :
			query = make_query(key=column['key'])
	
	column['url'] = '%s?%s' % (target, query)
	column['images'] = images

context.filterCookie()
folderfilter = context.REQUEST.get('folderfilter', '')
filter = context.decodeFolderFilter(folderfilter)
items = context.listNearestFolderContents(contentFilter=filter)
sort_dir = reverse and 'desc' or 'asc'
sortFunc = key in ['Type', 'title_or_id'] and 'nocase' or 'cmp'
items = sequence.sort( items, ((key, sortFunc, sort_dir),) )
batch_obj = Batch(items, context.default_batch_size, b_start, orphan=0, quantumleap=1)
items = []
i = 1
display_delete_button = False
for item in batch_obj:
	item_icon = item.getIcon(1)
	item_id = item.getId()
	item_position = key == 'position' and str(b_start + i) or '...'
	i += 1
	item_url = item.absolute_url()
	try : item_delete_allowed = context.objectIdCanBeDeleted(item_id)
	except : item_delete_allowed = checkPermission(DeleteObjects, context) # std zope perm
	if not display_delete_button :
		display_delete_button = item_delete_allowed
	items.append(
		{'lock' : not checkPermission(ModifyPortalContent, item),
		 'checkbox': item_delete_allowed and ('cb_%s' % item_id) or '',
		 'icon': item_icon and ( '%s/%s' % (portal_url, item_icon) ) or '',
		 'id': item_id,
		 'modified': item.modified().strftime(locale_date_fmt),
		 'position': item_position,
		 'title_or_id': item.title_or_id(),
		 'type': item.Type() or None,
		 'url': item_url } )

options['batch'] = { 'listColumnInfos': tuple(columns),
					 'listItemInfos': tuple(items),
					 'sort_key' : key,
					 'sort_dir' : sort_dir,
					 'batch_obj': batch_obj }

hidden_vars = []
for name, value in html_marshal(**default_kw):
	hidden_vars.append( {'name': name, 'value': value} )
	
# buttons
buttons = []
if items_add_allowed and context.allowedContentTypes():
	buttons.append( {'name': 'items_new', 'value': 'New...'} )
	if items:
		buttons.append( {'name': 'items_rename', 'value': 'Rename'} )
		
if checkPermission(ViewManagementScreens, context) and items:
	buttons.append( {'name': 'items_cut', 'value': 'Cut'} )
	buttons.append( {'name': 'items_copy', 'value': 'Copy'} )
	
if items_add_allowed and context.cb_dataValid():
	buttons.append( {'name': 'items_paste', 'value': 'Paste'} )
	
if display_delete_button and items:
	buttons.append( {'name': 'items_delete', 'value': 'Delete'} )

length = batch_obj.sequence_length
is_orderable = manage_props_allowed and (key == 'position') and length > 1
is_sortable = manage_props_allowed and not is_default
options['form'] = { 'action': target,
					'listHiddenVarInfos': tuple(hidden_vars),
					'listButtonInfos': tuple(buttons),
					'is_orderable': is_orderable,
					'is_sortable': is_sortable }
if not ajax and is_orderable :
	deltas = range( 1, min(5, length) ) + range(5, length, 5)
	options['form']['listDeltas'] = tuple(deltas)

if template and macro :
	options['template'] = template
	options['macro'] = macro
	return context.use_macro(**options)
else :
	options.update(others)
	return context.folder_contents_template(**options)

