#!/bin/bash
#
#Copyright 2012 - 2013 CurlyMo & mk01 <development@xbian.org>
#
#This file is part of XBian - XBMC on the Raspberry Pi.
#
#XBian is free software: you can redistribute it and/or modify it under the
#terms of the GNU General Public License as published by the Free Software
#Foundation, either version 3 of the License, or (at your option) any later
#version.
#
#XBian is distributed in the hope that it will be useful, but WITHOUT ANY
#WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS
#FOR A PARTICULAR PURPOSE. See the GNU General Public License for more
#details.
#
#You should have received a copy of the GNU General Public License along
#with XBian. If not, see <http://www.gnu.org/licenses/>

#Disable or enable table column
TBLCOLUMNCENTER=1

# Wrap text fit in dialog width
#  $1 [String]		Text
#  $2 [Integer] 	Width (optional) 
# Returns
#  $HEIGHT [Integer]		Needed height for the dialog
#  $WRAPPEDTEXT [String]	String wrapped in newlines to fit width
function wrapTxtFn() {
	TEXT="$1";
	
	if [ $# -gt 1 ]; then
		WIDTH=$2;
	else
		WIDTH=$DEFAULTWIDTH;
	fi
	IFS=" ";
	WORDS=($TEXT);
	RAWLINES=();	
	LINES=();
	IFS=$'\n';
	for WORD in ${WORDS[@]}; do
		if [ $((${#RAWLINES}+${#WORD})) -lt $(($WIDTH)) ]; then
			RAWLINES+=$WORD" ";
		else
			LINES+=($(echo $RAWLINES | sed -e 's/^[[:space:]]*//' -e 's/[[:space:]]*$//'));
			RAWLINES=$WORD" ";
		fi
	done;
	LINES+=($RAWLINES);
	RAWLINES="";
	WRAPPEDTXT="\n";
	HEIGHT=6;
	for LINE in ${LINES[@]}; do
		HEIGHT=$(($HEIGHT+1));
		WRAPPEDTXT+=$LINE"\n";
	done
	IFS=$ORIGINALIFS;
	return $HEIGHT;
}

# Centers text in predefined width
#  $1 [String]	Text
#  $2 [Integer] Width (optional)
# Returns
#  $CENTEREDTXT [String]
function centerTxtFn() {
	TEXT="$1";
	IFS=$'\n';
	if [ $# -gt 1 ]; then
		WIDTH=$2;
	else
		WIDTH=$DEFAULTWIDTH;
	fi
	LINES=($(echo -e "$TEXT"));

	CENTEREDTXT="";
	for LINE in ${LINES[@]}; do
		NEWLINE=$(echo $LINE | sed 's/\\Z[0-9a-z]\{1\}//g');
		NRSPACES=$(($(($WIDTH/2))-$((${#LINE}/2))));
		
		if [ $(($NRSPACES%2)) -eq 1 ] && [ $((${#NEWLINE}%2)) -eq 1 ] && [ $((${#LINE}%2)) -eq 1 ]; then
			NRSPACES=$(($NRSPACES));
		elif [ $(($NRSPACES%2)) -eq 0 ] && [ $((${#NEWLINE}%2)) -eq 1 ] && [ $((${#LINE}%2)) -eq 1 ]; then
			NRSPACES=$(($NRSPACES));
		fi
		if [ $NRSPACES -le 0 ]; then
			NRSPACES=1;
		fi
		for (( c=0; c<$NRSPACES; c++ )); do
			CENTEREDTXT+=" ";
		done;
		if [ ${#LINES[@]} -gt 1 ]; then
			CENTEREDTXT+=$LINE"\n";
		else
			CENTEREDTXT+=$LINE;
		fi
	done;
}

function valignTxtFn() {
	TEXT=$1;
	IFS=$'\n';
	if [ $# -gt 1 ]; then
		NEWHEIGHT=$2;
	else
		NEWHEIGHT=$DEFAULTHEIGHT;
	fi	
	
	LINES=($(echo -e "$TEXT"));
	ALIGNEDTXT="\n";
	for (( c=0; c<=$(($(($NEWHEIGHT/2))-4-${#LINES[@]})); c++ )); do
		ALIGNEDTXT+="\n";
	done;
	ALIGNEDTXT+=$TEXT;
}

# Trim trailing and leading spaces from line
#  $1 [String]	Line
# Returns
#  $TRIMMEDLN [String]
function trimLnFn() {
	TRIMMEDLN=$(echo -e "$1" | sed 's/^[\ ]*//;s/[\ ]*$//');
}

# Create table header used inside table
#  $1 [String] Radio/Menu: Are we creating a row for a menu or radio dialog?
#  $2 [String] Rows: Strings with the values likes used in dialogs
#  $3 [String] Header: A string with names of the header words seperated by commas
# Returns
#  $HEADER [String] String containing the outlined header
#  $ROWS   [String] String with all outlined rows
function createTableFn() {
	TYPE="$1";
	shift;
	IFS=";";
	OLDHEADER=($1)
	shift
	OLDROWS=();
	NEWROW="";
	IFS=$ORIGINALIFS;
	KEY=-1;
	for ROW in "$@"; do
		if [[ "$ROW" =~ ^[0-9] ]]; then
			KEY=$(($KEY+1));
			OLDROWS[$KEY]+=$ROW;
		else
			if [ ${#OLDROWS} -lt $(($KEY+1)) ]; then
				OLDROWS[$KEY]+=" "$ROW;
			fi
		fi
	done;
	NRCOLUMNS=0;
	WORDLENGTH=();
	for (( c=0; c<${#OLDROWS[@]}; c++ )); do
		IFS=",";
		OLDROW=(${OLDROWS[$c]});
		NRCOLUMNS=${#OLDROW[@]};
		for (( d=0; d<${#OLDROW[@]}; d++ )); do
			if [ $c -eq 0 ]; then
				WORDLENGTH+=(${#OLDROW[$d]});
			elif [[ "${WORDLENGTH[$d]}" =~ ^[0-9] ]] && [ ${WORDLENGTH[$d]} -lt ${#OLDROW[$d]} ]; then
				WORDLENGTH[$d]=${#OLDROW[$d]}
			fi
		done
	done
	IFS=$ORIGINALIFS;
	
	 #if [ $TYPE == "radio" ]; then
		# NRCOLUMNS=$(($NRCOLUMNS-1));
	 #fi
	
	if [ $TYPE == "radio" ]; then
		HEADER="  "${OLDHEADER[0]};
	elif [ $TYPE == "check" ]; then
		HEADER=" "${OLDHEADER[0]};
	else
		HEADER=${OLDHEADER[0]};
	fi
	if [ ${#OLDROWS[@]} -ge 10 ]; then
		HEADER+="   ";
	else
		HEADER+="  ";
	fi
	shift
	CENTERED=();
	
	for (( c=0; c<$NRCOLUMNS; c++ )); do
		if [[ ${WORDLENGTH[$c]} -lt ${#OLDHEADER[$c]} ]]; then
			if [ "$TBLCOLUMNCENTER" -eq 1 ]; then
				CENTERED[$c]=1;
			else
				CENTERED[$c]=0;
			fi
			WORDLENGTH[$c]=${#OLDHEADER[$c]};
		else
			CENTERED[$c]=0;
		fi
		ENDOFCOLUMN="true";
		if [ $TYPE != "radio" ] && [ $TYPE != "check" ] && [ $c -gt 0 ] && [ $c -lt $NRCOLUMNS ]; then
			ENDOFCOLUMN="false"
		fi
		if [[ $TYPE == "radio" || $TYPE == "check" ]] && [ $c -gt 0 ] && [ $c -lt $(($NRCOLUMNS-1)) ]; then
			ENDOFCOLUMN="false"
		fi
		if [ $ENDOFCOLUMN == "false" ]; then
			LENGTH=$((${WORDLENGTH[$c]}-${#OLDHEADER[$c]}));

			HEADER+="\Zb[ ";
			HEADER+=${OLDHEADER[$c]};
			
			for (( d=0; d<$(($LENGTH)); d++ )); do
				HEADER+=" ";
			done
			HEADER+="\Zb ] ";
		fi
		shift;
	done
	
	ROWS="";
	for (( c=0; c<${#OLDROWS[@]}; c++ )); do
		IFS=",";
		OLDROW=(${OLDROWS[$c]});
		for (( d=0; d<$NRCOLUMNS; d++ )); do
			LENGTH=$((${WORDLENGTH[$d]}-${#OLDROW[$d]}));
			ENDOFCOLUMN="true";
			if [ $TYPE != "radio" ] && [ $TYPE != "check" ] && [ $d -gt 0 ] && [ $d -lt $NRCOLUMNS ]; then
				ENDOFCOLUMN="false"
			fi
			if [[ $TYPE == "radio" || $TYPE == "check" ]] && [ $d -gt 0 ] && [ $d -lt $(($NRCOLUMNS-1)) ]; then
				ENDOFCOLUMN="false"
			fi
			if [ $ENDOFCOLUMN == "false" ]; then
				if [ $d -gt 1 ]; then
					ROWS+="$DEFAULTCOLSEP"
				fi
				ROWS+="\Zn[ ";
				if [ ${CENTERED[$d]} -eq 1 ]; then					
					for (( e=0; e<$(($LENGTH/2)); e++ )); do
						ROWS+=" ";
					done
					ROWS+=${OLDROW[$d]};
					for (( e=0; e<$(($LENGTH/2)); e++ )); do
						ROWS+=" ";
					done
					
					if ! [ $(($e+$e)) -eq $LENGTH ]; then
						ROWS+=" ";
					fi;
				else
					ROWS+=${OLDROW[$d]};
					for (( e=0; e<$LENGTH; e++ )); do
						ROWS+=" ";
					done
				fi
				ROWS+="\Zn ]";
			else
				if [ $d -gt 0 ] && [[ $TYPE == "radio" || $TYPE == "check" ]]; then
					ROWS+="$DEFAULTDELIMITER"${OLDROW[$d]}"$DEFAULTDELIMITER";
				elif [ $c -gt 0 ] && [ $TYPE != "radio" ] && [ $TYPE != "check" ]; then
					ROWS+="$DEFAULTDELIMITER"${OLDROW[$d]}"$DEFAULTDELIMITER";
				else
					ROWS+=${OLDROW[$d]}"$DEFAULTDELIMITER";
				fi
			fi
		done
	done
}
