##parameters=
from Products.CMFCore.utils import getToolByName
from ZTUtils import make_query as mq
from ZTUtils import make_hidden_input
from Products.Plinn.utils import translate
def _(message) : return translate(message, context).encode('utf-8')

utool = getToolByName(context, 'portal_url')
portal_url = utool()
ctool = getToolByName(context, 'portal_catalog')
mtool = getToolByName(context,'portal_membership')
homeDir = mtool.getHomeFolder(verifyPermission=True)
options = {}
indexes = {}
for i in ctool.indexes() :
	indexes[i] = True
hasindex = indexes.has_key

form = context.REQUEST.form
query = {}
skip_vars = ['strCreator', 'ajax', 'b_start']

# list typed criterions
select_vars = ( 'review_state'
			  , 'Subject'
			  , 'portal_type'
			  )
noFollowVars = []

# first cleaning: remove empty values / dict cast.
for k, v in form.items() :
	if not v : continue
	if k in select_vars :
		if same_type( v, [] ):
			v = filter( None, v )
		if not v:
			continue
	if hasattr(v, 'has_key') :
		v = dict(v.items())
	
	query[ k ] = v

# simplifications / cleaning again
if query.has_key('portal_type') :
	try : query['portal_type'].remove('Member Data')
	except (ValueError, AttributeError) : pass
else :
	query['portal_type'] = context.portal_types.objectIds()
	noFollowVars.append('portal_type')

# clean parameters that are not indexes
for k in skip_vars:
	if query.has_key(k) :
		del query[k]

# expand creator search item
if form.has_key('strCreator') and form['strCreator'].strip() :
	query['listCreators'] = [ m.getId() for m in context.portal_membership.looseSearchMembers(form['strCreator']) ]

# 'mofified' index solving
if query.has_key('modified') :
	def resolveDate(modified) :
		today = context.ZopeTime().earliestTime()
		dateResolution = {'yesterday'	: (today-1).Date()
						, 'lastWeek'	: (today-7).Date()
						, 'lastMonth'	: (today-31).Date()
						}
		member = mtool.getAuthenticatedMember()
		if member :
			lastLoginTime = member.getProperty('last_login_time', None)
			if lastLoginTime :
				dateResolution['lastLogin'] = lastLoginTime
		return dateResolution.get(modified)
	
	date = resolveDate(query['modified'])
	if date :
		query['modified'] = {'query':date, 'range':'min'}
	else :
		del query['modified']

sort_on = query.get('sort_on', 'fTitle')
if hasindex(sort_on) :
	query['sort_on'] = sort_on
	query['sort_order'] = query.get('sort_order', 'ascending')
else :
	if query.has_key('sort_on')		: query.pop('sort_on')
	if query.has_key('sort_order')	: query.pop('sort_order')	

def makeColumnHeader(indexName) :
	toggleSortOrder = indexName == sort_on
	columnQuery = query.copy()
	for name in noFollowVars :
		if columnQuery.has_key(name) :
			columnQuery.pop(name)
	columnQuery['sort_on'] = indexName
	sort_order = query.get('sort_order', 'ascending')
	if toggleSortOrder :
		if sort_order == 'ascending' :
			sort_order = 'reverse'
		elif sort_order == 'reverse' :
			sort_order = 'ascending'
	columnQuery['sort_order'] = sort_order
	url = '%s/search?%s' % (portal_url, mq(**columnQuery))
	
	toggleImg = None
	if toggleSortOrder : # e.g. selected
		if query['sort_order'] == 'ascending' :
			toggleImg = {'src':'%s/arrowUp.gif' % portal_url
					 	,'alt' : _('ascending sort')}

		elif query['sort_order'] == 'reverse' :
			toggleImg = {'src':'%s/arrowDown.gif' % portal_url
					 	,'alt' : _('ascending sort')}
	return {'url':url, 'img':toggleImg}
			

options['makeColumnHeader'] = makeColumnHeader
results = ctool( **query )
options['results'] = results
options['resultsLength'] = len(results)
if homeDir and results :
	options['canSaveAsTopic'] = True
	args = query.copy()
	for name in noFollowVars :
		try : args.pop(name)
		except : pass
	if form.has_key('modified') :
		possibleValues = {'yesterday'	: 1
						 ,'lastWeek'	: 7
						 ,'lastMonth' : 31}
		value = possibleValues.get(form['modified'])
		if value :
			d = {'critType'	: 'Friendly Date Criterion'
				,'value'	: value
				,'operation': 'max'
				,'daterange': 'old'}
			args['modified'] = d
		else :
			try : del args['modified']
			except KeyError : pass
	options['queryAsHiddenInputs'] = make_hidden_input(**args)
else :
	options['canSaveAsTopic'] = False
return context.search_results_template(**options)
