#!/bin/bash
#
#Copyright 2012 - 2013 Hexagon & 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/>

# Show a menu for selecting interfaces
#  $1 List of interfaces
function showInterfacesSelectDlg() {
	MENU=()
	IFACES="$1"
	I=1
	for IFACE in ${IFACES[@]}; do
		IPADDR=$(ip a show $IFACE | sed -n -e 's/:127\.0\.0\.1 //g' -e 's/ *inet \([0-9.]\+\).*/\1/gp')
		NETMASK=$(ip a show $IFACE | grep inet | awk '{print $4}')
		MENU+=($I",\Zn"$IFACE",\Zn"$IPADDR",\Zn"$NETMASK)
		I=$(($I+1))
	done
	TBLCOLUMNCENTER=0;
	createTableFn "menu"\
	"#;\Zb$(_ network.label.interfaces);\Zb$(_ network.label.ipaddress);\Zb$(_ network.label.netmask)"\
	"${MENU[@]}";
	TBLCOLUMNCENTER=1;
	
	# Show interface selector dialog
	centerTxtFn "$(_ network.interfaces.select)" $(($DEFAULTWIDTH+11));
	HEADER1=$CENTEREDTXT;
	centerTxtFn "$HEADER" $(($DEFAULTWIDTH+11));
	showMenuDlg "$HEADER1\n$CENTEREDTXT" "$ROWS" ${#MENU[@]} $((${#MENU[@]}+9))
}

# Show a radio dialog for selecting DHCP or Static configuration
# Arguments
#  $1 Current mode (DHCP|Static)
function showIPModeConfigDlg() {
	MENU=();
	# Radio states
	STATUSDHCP="off"
	STATUSSTATIC="off"
	
	# Pre-select current state
	if [ "$1" == "static" ]; then
		STATUSSTATIC="on"
	else
		STATUSDHCP="on"
	fi
	IFS=$ORIGINALIFS;
	MENU+=(1",\Zn$(_ network.label.dhcp),"$STATUSDHCP);
	MENU+=(2",\Zn$(_ network.label.static),"$STATUSSTATIC);
	MENU+=(3",\Zn$(_ dialog.disable),off");
	
	createTableFn "radio" \
	"#;\Zb$(_ network.label.type)"\
	"${MENU[@]}"
	
	centerTxtFn "$HEADER" $(($DEFAULTWIDTH+6));
	showRadioDlg "$CENTEREDTXT" "$ROWS" ${#MENU[@]} $((${#MENU[@]}+9))
}

# Show a radio dialog for selecting WLAN Protection mode
# Arguments
#  $1 Current status (WPA|WEP|Open)
function showWlanModeConfigDlg() {

	MENU=();

	# Radio states
	STATUSWPA="off"
	STATUSWEP="off"
	STATUSOPEN="off"

	# Pre-select current state
	if [ "$1" = "WPA" ]; then
		STATUSWPA="on"
	elif [ "$1" = "WEP" ]; then
		STATUSWEP="on"
	elif [ "$1" = "Open" ]; then
		STATUSOPEN="on"
	else
		STATUSOPEN="on"
	fi
	
	IFS=$ORIGINALIFS;
	MENU+=(1",\Zn$(_ network.label.wpa),$STATUSWPA");
	MENU+=(2",\Zn$(_ network.label.wep),$STATUSWEP");
	MENU+=(3",\Zn$(_ network.label.open),$STATUSOPEN");
	createTableFn "radio" \
	"#;\Zb$(_ network.label.protection)"\
	"${MENU[@]}"
	
	centerTxtFn "$HEADER" $(($DEFAULTWIDTH+6));
	showRadioDlg "$CENTEREDTXT" "$ROWS" ${#MENU[@]} $((${#MENU[@]}+9))

}

function showInterfacesLoadingDlg() {
	wrapTxtFn "$(_ network.interfaces.loading)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showInfoDlg "$ALIGNEDTXT" $HEIGHT
}

function showNoInterfacesAvailableDlg() {
	wrapTxtFn "$(_ network.interfaces.unavailable)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

function showScanningForNetworksDlg() {
	wrapTxtFn "$(_ network.scanning)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showInfoDlg "$ALIGNEDTXT" $HEIGHT
}

# Ask for credentials for the selected interface
# Arguments
#  $1 Current SSID
#  $2 Current KEY
function showInterfaceCredentialsDlg() {
	wrapTxtFn "$(_ network.credentials.enter)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"

	ELEMENTS=();
	ELEMENTS+=("1,3,$(_ network.label.ssid):,$1,16,255,0,0");
	ELEMENTS+=("2,3,$(_ network.label.key):,$2,16,255,0,0");
	showInputFormDlg "$ALIGNEDTXT"
}

# Ask for static IP configuration
# Arguments
#  $1 Current IP
#  $2 Current Netmask
#  $3 Current Gateway
#  $4 Current Nameserver 1
#  $5 Current Nameserver 2
function showInterfaceStaticDlg() {
	wrapTxtFn "$(_ network.credentials.enter)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"

	ELEMENTS=();
	ELEMENTS+=("1,3,$(_ network.label.ipaddress)*:,$1,24,16,15,0");
	ELEMENTS+=("2,3,$(_ network.label.netmask)*:,$2,24,16,15,0");
	ELEMENTS+=("3,3,$(_ network.label.gateway)*:,$3,24,16,15,0");
	ELEMENTS+=("4,3,$(_ network.label.nameserver)*:,$4,24,16,15,0");
	ELEMENTS+=("5,3,$(_ network.label.nameserver)*:,$5,24,16,15,0");
	showInputFormDlg "$ALIGNEDTXT" 14;
}

function showInterfaceCredentialsErrorDlg() {
	wrapTxtFn "$(_ network.credentials.wlan.invalid)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

function showInterfaceCredentialsSuccessDlg() {
	wrapTxtFn "$(_ network.credentials.wlan.updated)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

function showInterfaceStaticErrorDlg() {
	wrapTxtFn "$(_ network.credentials.lan.invalid)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

function showInterfaceStaticSuccessDlg() {
	wrapTxtFn "$(_ network.credentials.lan.updated)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

function showInterfaceDhcpSuccessDlg() {
	wrapTxtFn "$(_ network.dhcp_selected)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

function showInterfaceDisableSuccessDlg() {
	wrapTxtFn "$(_ network.disabled)" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

# Shows available wlan networks
# Arguments
#  $1 Current SSID
#  $2 Current networklist
function showAvailableWLANDlg() {
	MENU=();
	IFS=$'\n';
	SSID=$1
	shift;
	WNETWORKS=($@)
	X=1;
	SIGNAL="";
	for WNETWORK in ${WNETWORKS[@]}; do
		IFS=",";
		VALUES=($WNETWORK);

		NAME=$(echo "${VALUES[0]}" | awk '{print substr($0,2,length-2)}');
		SELECTED="off";
		if [ "$NAME" == "$SSID" ]; then
			SELECTED="on";
		fi
		NAME=$(echo $NAME | tr '!' '|')
		if [ ${#NAME} -gt 20 ]; then
			NAME=${NAME:0:17}"...";
		fi
		SECURITY=${VALUES[2]};
		if [ "$SECURITY" == "on" ]; then
			SECURITY="$(_ dialog.yes)";
		else
			SECURITY="$(_ dialog.no)";
		fi
		if [ ${VALUES[3]} -eq 100 ]; then
			SIGNAL="*****";
		elif [ ${VALUES[3]} -gt 80 ]; then
			SIGNAL="****";
		elif [ ${VALUES[3]} -gt 60 ]; then
			SIGNAL="***";
		elif [ ${VALUES[3]} -gt 40 ]; then
			SIGNAL="**";
		else
			SIGNAL="*";
		fi
		MENU+=($X",\Zn"$NAME",\Zn"$SECURITY",\Zn"${VALUES[1]}",\Zn"$SIGNAL","$SELECTED);
		X=$(($X+1));
	done
	TBLCOLUMNCENTER=0;
	createTableFn "radio" \
	"#;\Zb$(_ network.label.name);\Zb$(_ network.label.protection);\Zb$(_ network.label.type);\Zb$(_ network.label.signal)" \
	"${MENU[@]}"
	TBLCOLUMNCENTER=1;
	centerTxtFn "$HEADER" $(($DEFAULTWIDTH+7));
	showRadioDlg "$CENTEREDTXT" "$ROWS" 6 15 $((DEFAULTWIDTH+22))
}

function showScanForWLANDlg() {
	MENU=()
	
	TBLCOLUMNCENTER=0;
	createTableFn "menu" \
	"#;\Zb$(_ network.label.wlan)" \
	"1,\Zn$(_ network.label.scan)" \
	"2,\Zn$(_ network.label.custom)"
	TBLCOLUMNCENTER=1;
	
	# Show interface selector dialog
	centerTxtFn "$HEADER" $(($DEFAULTWIDTH+8));
	showMenuDlg "$CENTEREDTXT" "$ROWS" ${#MENU[@]} $((${#MENU[@]}+8))
}

# Ask for network SSID in case of open protection
# Arguments
#  $1 Current SSID
function showInterfaceSSIDDlg() {
	showInputDlg "$(_ network.label.custom)" $1
}

function showRestartAdapterDlg() {
	wrapTxtFn "$(printf "$(_  network.connection.restart)" "$1")" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showInfoDlg "$ALIGNEDTXT" $HEIGHT
}

function showConnectingDlg() {
	wrapTxtFn "$(printf "$(_  network.connection.updating)" "$1")" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showInfoDlg "$ALIGNEDTXT" $HEIGHT
}

function showConnectionFailedDlg() {
	wrapTxtFn "$(printf "$(_  network.connection.failed)" "$1")" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}

function showConnectionSuccessDlg() {
	wrapTxtFn "$(printf "$(_  network.connection.success)" "$1")" $(($DEFAULTWIDTH-4));
	centerTxtFn "$WRAPPEDTXT" $(($DEFAULTWIDTH-4));
	valignTxtFn "$CENTEREDTXT"
	showMsgDlg "$ALIGNEDTXT" $HEIGHT
}
