#!/bin/sh

set_ENV() {

	# global var
	BASE_NAME=$(basename $1 .sh)

	if [ -n "$HTTP_ACCEPT_LANGUAGE" -a -d ../form/$HTTP_ACCEPT_LANGUAGE ]; then
		FORM_FILE_DIR=../form/$HTTP_ACCEPT_LANGUAGE
	else
		FORM_FILE_DIR=../form/en
	fi

	# ULib version
	ULIB_VERSION=1.0.5

	# location of index db
	IR_DIRECTORY=../../../IR

	# location of docs indexed
	DOC_DIRECTORY=/usr/src/ULib-$ULIB_VERSION/tests/examples/IR/doc

	# directory to put result search, session, etc...
	RESULT_DIR=../result

	if [ -n "$HTTP_COOKIE" ]; then
		RESULT_DIR=$RESULT_DIR/$HTTP_COOKIE
	fi

	export BASE_NAME FORM_FILE_DIR ULIB_VERSION IR_DIRECTORY DOC_DIRECTORY RESULT_DIR TMP_FORM_FILE SET_COOKIE FORM_PART1 FORM_PART2 FORM_PART3 QUERY TIME

	# paginazione
	export FOR_PAGE NUM_START NUM_END NUM_DOC pagina_corrente link_paginazione
}

write_OUTPUT() {

	if [ -n "$1" ]; then

		if [ -n "$SET_COOKIE" ]; then

			# REQ: Set-Cookie: TODO[ data expire path domain secure HttpOnly ]
			# ----------------------------------------------------------------------------------------------------------------------------
			# string -- Data to put into the cookie         -- must
			# int    -- Lifetime of the cookie in HOURS     -- must (0 -> valid until browser exit)
			# string -- Path where the cookie can be used   --  opt
			# string -- Domain which can read the cookie    --  opt
			# bool   -- Secure mode                         --  opt
			# bool   -- Only allow HTTP usage               --  opt
			# ----------------------------------------------------------------------------------------------------------------------------
			# RET: Set-Cookie: ulib_sid=data&expire&HMAC-MD5(data&expire); expires=expire(GMT); path=path; domain=domain; secure; HttpOnly

			echo -e "Set-Cookie: TODO[ $SET_COOKIE 24 ]\r"

		fi

		echo -e "Content-Type: text/html; charset=iso-8859-1\r\n\r"
		echo -n -E "$1"

		exit 0

	fi
}

view_form() {

	if [ -z "$FORM_PART3" ]; then
		FORM_PART3=$ULIB_VERSION
	fi

	printf -v OUTPUT "`cat $FORM_FILE_DIR/$BASE_NAME.tmpl`" "sh" "$FORM_PART1" "$FORM_PART2" "$FORM_PART3"

	unset FORM_PART1 FORM_PART2
}

view_form_with_help() {

	FORM_PART1=$BASE_NAME".sh"

	if [ -z "$FORM_PART2" ]; then
		FORM_PART2="`cat $FORM_FILE_DIR/$BASE_NAME.hlp`"
	fi

	view_form
}

view_form_without_help() {

	FORM_PART1="?ext=help"

	if [ -z "$FORM_PART2" ]; then
		FORM_PART2="`cat $FORM_FILE_DIR/$BASE_NAME.top`"
	fi

	view_form
}

load_value_session() {

	if [ -f $TMP_FORM_FILE ]; then

		i=0
		while read LINE
		do
			let "i = i + 1"

			eval v$i=\"$LINE\"
		done < $TMP_FORM_FILE

	fi
}

save_value_session() {

	cat <<END >$TMP_FORM_FILE
$1
$2
$3
$4
$5
END
}

execute_query() {

	# set session cookie

	if [ -z "$HTTP_COOKIE" ]; then
		SET_COOKIE=SESSION_$$
		HTTP_COOKIE=$SET_COOKIE
		RESULT_DIR=$RESULT_DIR/$HTTP_COOKIE
	fi

	mkdir -p $RESULT_DIR

	TMP_FORM_FILE=$RESULT_DIR/$BASE_NAME.query

	QUERY=$1
	FOR_PAGE=$2

	# run query

	(cd ../../..; TIME='%e' time ../../examples/IR/query -c index.cfg "$QUERY") 2>$TMP_FORM_FILE >$RESULT_DIR/$BASE_NAME.list

	TIME=`tail -n 1 $TMP_FORM_FILE`
	NUM_DOC=`wc -l < $RESULT_DIR/$BASE_NAME.list`

	# read num records index db

	CDB_NUM_RECS=../../../../../cdb/cdbnumrecs

	if [ -x $CDB_NUM_RECS ]; then

		NUM_REC_DOCS=`$CDB_NUM_RECS  < $IR_DIRECTORY/db/tbl_names.cdb`
		NUM_REC_WORDS=`$CDB_NUM_RECS < $IR_DIRECTORY/db/tbl_words.cdb`

	fi

	printf -v FORM_PART3 "$ULIB_VERSION, with %u documents and %u words." $NUM_REC_DOCS $NUM_REC_WORDS

	set_paginazione 1

	view_page

	save_value_session "$QUERY" $FOR_PAGE $TIME $NUM_DOC "$FORM_PART3"
}

view_page() {

	# header

	printf -v RESULT_TOP "`cat $FORM_FILE_DIR/result.top`" $NUM_START $NUM_END $NUM_DOC "$QUERY" $TIME

	# documents

	if [ $NUM_DOC -eq 0 ]; then

		RESULT_DOC="<p class=\"note\">Your search did not match any documents.</p>"

	else

		RESULT_DOC_FILE="`cat $FORM_FILE_DIR/result.doc`"

		DOC_VEC=( $(cat "$RESULT_DIR/$BASE_NAME.list") )

		for (( i=$NUM_START-1; i<$NUM_END; i+=1 )); do

			DOC=${DOC_VEC[i]}

			SNIPPET_DOC=`fmt -w 300 $IR_DIRECTORY/doc/$DOC | head -n 1 | ../../../../base/crypto_xml`

			printf -v ADD "$RESULT_DOC_FILE" $IR_DIRECTORY/doc/$DOC `basename $DOC` "$SNIPPET_DOC" $DOC_DIRECTORY/$DOC

			RESULT_DOC=$RESULT_DOC$ADD" "

		done

	fi

	# link page

	printf -v RESULT_PAG "`cat $FORM_FILE_DIR/result.pag`" "$link_paginazione"

	FORM_PART2="$RESULT_TOP $RESULT_DOC $RESULT_PAG"

	view_form_without_help
}

view_page_result() {

	TMP_FORM_FILE=$RESULT_DIR/$BASE_NAME.query

	load_value_session

	QUERY="$v1"
	FOR_PAGE=$v2
	TIME=$v3
	NUM_DOC=$v4
	FORM_PART3="$v5"

	set_paginazione $1

	view_page
}

# funzioni che creano i link alle pagine dei risultati
# ----------------------------------------------------

crea_link() {

	if [ "$pagina_corrente" = "$1" ]; then
		ADD="<span class=\"pnow\">$1</span>"
	else
		ADD="<a href=\"?page=$1\" class=\"pnum\">$1</a>"
	fi

	link_paginazione=$link_paginazione$ADD" "
}

set_paginazione() {

	pagina_corrente=$1

	if [ $NUM_DOC -le $FOR_PAGE ]; then

		if [ $NUM_DOC -eq 0 ]; then
			NUM_START=0
		else
			NUM_START=1
		fi

		NUM_END=$NUM_DOC

 		link_paginazione="<span class=\"void\">PREV</span><span class=\"void\">NEXT</span>"

		return

	fi

	let "pagina_precedente = $pagina_corrente - 1"
	let "pagina_successiva = $pagina_corrente + 1"

	let "tot_pagine = $NUM_DOC / $FOR_PAGE"
	let "resto		 = $NUM_DOC % $FOR_PAGE"

	if [ $resto -ne 0 ]; then
		let "tot_pagine = $tot_pagine + 1"
	fi

	let "ultima_pagina = $tot_pagine - 1"
	let "penultima_pagina = $ultima_pagina - 1"

	# link alla pagina precedente

	if [ $pagina_corrente -eq 1 ]; then
		NUM_START=1

 		link_paginazione="<span class=\"void\">PREV</span> "
	else
		let "NUM_START = 1 + $pagina_precedente * $FOR_PAGE"

 		link_paginazione="<a href=\"?page=$pagina_precedente\" class=\"pnum\">PREV</a> "
	fi

	# mostriamo sempre il link alla prima pagina

	crea_link 1

	# se il prossimo link non è alla seconda pagina aggiungo dei puntini ... oppure la sola pagina mancante

	if [ $pagina_precedente -gt 2 ]; then

		if [ $pagina_precedente -eq 3 ]; then
			crea_link 2
		else
			link_paginazione=$link_paginazione" ... "
		fi

	fi

	# creo i link alla pagina corrente ed a quelle ad essa vicine

	for (( i=$pagina_precedente; i<=$pagina_successiva; i+=1 )); do

		# se tra quelle vicine c'è la prima pagina (già riportata)

		if [ $i -lt 2 ]; then
			continue
		fi

		# se tra quelle vicine c'è l'ultima pagina (che mostrerò con le prossime istruzioni)

		if [ $i -gt $ultima_pagina ]; then
			continue
		fi

		crea_link $i
	done

	# se il precedente link non era alla penultima pagina aggiungo dei puntini ... oppure la sola pagina mancante

	if [ $pagina_successiva -lt $ultima_pagina ]; then

		if [ $pagina_successiva -eq $penultima_pagina ]; then
			crea_link $ultima_pagina
		else
			link_paginazione=$link_paginazione" ... "
		fi

	fi

	# mostriamo il link all'ultima pagina se questa non coincide con la prima

	if [ $tot_pagine -ne 1 ]; then
		crea_link $tot_pagine
	fi

	# link alla pagina successiva

	if [ $pagina_corrente -eq $tot_pagine ]; then
		NUM_END=$NUM_DOC

		link_paginazione=$link_paginazione"<span class=\"void\">NEXT</span>"
	else
		let "NUM_END = $NUM_START + $FOR_PAGE - 1"

		link_paginazione=$link_paginazione"<a href=\"?page=$pagina_successiva\" class=\"pnum\">NEXT</a>"
	fi
}
# ------------------------------------------------------
