#!/bin/sh
#
# Common functions for TazPanel CGI and cmdline interface
#

# Get parameters with GET, POST and FILE functions
. /usr/bin/httpd_helper.sh

# I18n
. /etc/locale.conf
. /usr/bin/gettext.sh
TEXTDOMAIN='tazpanel'
export TEXTDOMAIN LANG LC_ALL

# We need a config file first
get_config() {
	CONFIG="/etc/slitaz/tazpanel.conf"
	[ -f data/tazpanel.conf ] && CONFIG="data/tazpanel.conf"
	[ -f "$CONFIG" ] && . $CONFIG
	[ ! -f "$PANEL/lib/libtazpanel" ] && \
		echo "No config file or libtazpanel found: $CONFIG" && \
		exit 1
}

# Syntax highlighting for config file and SHell scripts
# HTML entities: -e 's|&|\&amp;|g' -e 's|<|\&lt;|g' -e 's|>|\&gt;|g'
syntax_highlighter() {
	case $1 in
		conf)
			sed -e 's|&|\&amp;|g' -e 's|<|\&lt;|g' -e 's|>|\&gt;|g' \
				-e s"#^\#\([^']*\)#<span class='conf-comment'>\0</span>#"g \
				-e s"#^[A-Z]\([^']*\)=#<span class='conf-var'>\0</span>#"g \
				-e s"#^[a-z]\([^']*\)#<span class='conf-var'>\0</span>#"g \
				-e s"#\"\([^']*\)\"#<span class='conf-val'>\0</span>#"g ;;
		sh)
			sed -e 's|&|\&amp;|g' -e 's|<|\&lt;|g' -e 's|>|\&gt;|g' \
				-e s"#^\#\([^']*\)#<span class='sh-comment'>\0</span>#"g \
				-e s"#\"\([^']*\)\"#<span class='sh-val'>\0</span>#"g ;;
		diff)
			sed -e 's|&|\&amp;|g' -e 's|<|\&lt;|g' -e 's|>|\&gt;|g' \
				-e s"#^-\(.*\).#<span class='diff-rm'>\0</span>#"g \
				-e s"#^+\(.*\).#<span class='diff-add'>\0</span>#"g \
				-e s"#@@\(.*\)@@#<span class='diff-at'>@@\1@@</span>#"g ;;
		activity)
			sed s"#^\([^']*:\)#<span class='activity-log''>\0</span>#"g ;;
	esac
}

# Remove status and ESC char from tazpkg/tazlito commands output
filter_taztools_msgs() {
	sed	-e s'/\[^Gm]*.//g' \
		-e ':a;s/^\(.\{1,68\}\)\(\[ [A-Za-z]* \]\)/\1 \2/;ta' \
		-e 's#\[ OK \]#[ <span class="diff-add">OK</span> ]#' \
		-e 's#\[ Failed \]#[ <span class="diff-rm">Failed</span> ]#'
}

# LOG activities
log() {
	date=$(date "+%Y-%m-%d %H:%M")
	filter_taztools_msgs | \
	sed s"#[^']*#$date : \0#" >> $LOG_FILE
}

ok_status() {
	echo "[<span class='diff-add'> OK </span>]"
}

# Network interface status
interface_status() {
	if 	ifconfig | grep -A 1 $i | grep -q inet; then
		ip=`ifconfig | grep -A 1 $i | grep inet | \
			awk '{ print $2 }' | cut -d ":" -f 2`
		echo "<td>connected</td><td>$ip</td>"
		echo "<td><a href='/network.cgi?scan=$ip'>"
		echo "<img src='$IMAGES/recharge.png' /></a></td>"
	else
		echo "<td>----</td><td>----</td><td></td>"
	fi
}

# Catch network interface (used in summary and network main page)
list_network_interfaces() {
	table_start
	cat << EOT
<tr id="thead">
	<td>`gettext "Interface"`</td>
	<td>`gettext "Name"`</td>
	<td>`gettext "Status"`</td>
	<td>`gettext "IP Address"`</td>
	<td>`gettext "Scan ports"`</td>
</tr>
EOT
	for i in `ls /sys/class/net`
	do
		case $i in
			eth*)
				echo "<tr><td><a href='/network.cgi?eth'>
					<img src='$IMAGES/ethernet.png' />$i</a></td>
					<td>Ethernet</td> $(interface_status)</tr>" ;;
			wlan*|ath*|ra*)
				echo "<tr><td><a href='/network.cgi?wifi'>
					<img src='$IMAGES/wireless.png' />$i</a></td>
					<td>Wireless</td> $(interface_status)</tr>" ;;
			lo)
				echo "<tr><td><img src='$IMAGES/loopback.png' />$i</td>
				<td>Loopback</td> $(interface_status)</tr>" ;;
			*)
				continue ;;
		esac
	done
	table_end
}

# Get the list of panel styles
list_styles() {
	for style in $PANEL/styles/*
	do
		style=$(basename $style)
		echo "<option value='$style'>$style</option>"
	done
}

# Get the list of system locales
list_locales() {
	for locale in $(find /usr/share/i18n/locales -type f -name "[a-z][a-z]_[A-Z][A-Z]")
	do
		echo "<option value='$locale'>$locale</option>"
	done
}

# Get the list of console keymaps
list_keymaps() {
	for keymap in /usr/share/kmap/*.kmap
	do
		basename $keymap .kmap | sed "s|.*|<option value='&'>&</option>|"
	done
}

#
# xHTML 5 (header and footer skel are from the style)
#

loading_msg() {
	cat << EOT
<script type="text/javascript">
	document.write('<div id="loading"><img src="/styles/default/images/loader.gif" />$LOADING_MSG</div>');
</script>
EOT
}

xhtml_header() {
	cat ${PANEL}$HEADER | sed s/'- %TITLE%'/"$TITLE"/
	if [ $DEBUG == "1" ]; then
		local i
		local j
		local x
		args=""
		for x in GET POST COOKIE ; do
			for i in $($x) ; do
				if [ $($x $i count) -gt 1 ]; then
					for j in $(seq 1 $($x $i count)); do
						args="$args $x($i,$j)='$($x $i $j)'"
					done
				else
					args="$args $x($i)='$($x $i)'"
				fi
			done
		done
		for i in $(FILE); do
			for j in name size type tmpname ; do
				args="$args FILE($i,$j)=$(FILE $i $j)"
			done
		done
		cat << EOT
<pre class='debug'>
QUERY_STRING="$QUERY_STRING"$args
</pre>
EOT
	fi
}

xhtml_footer() {
	cat ${PANEL}$FOOTER
}

table_start() {
	cat << EOT
<table>
	<tbody>
EOT
}

table_end() {
	cat << EOT
	</tbody>
</table>
EOT
	
}

df_thead() {
	cat << EOT
<thead>
	<tr>
		<td>$(gettext "Disk")</td>
		<td>$(gettext "Size")</td>
		<td>$(gettext "Available")</td>
		<td>$(gettext "Used")</td>
		<td>$(gettext "Mount point")</td>
	</tr>
</thead>
EOT
}
