#!/mod/bin/jimsh

package require cgi
source /mod/webif/lib/setup
require settings.class plugin system.class

puts "Content-Type: text/html"
puts ""

cgi_input
#cgi_dump

if {[cgi_get act] eq "https"} {
	if {[cgi_get val off] eq "off"} {
		file delete /mod/etc/mongoose.cert
		puts "HTTPS Server will be disabled after next reboot."
	} else {
		exec /mod/sbin/mongoose_mkcert
		puts "HTTPS Server will be enabled after next reboot."
	}
	exit
}

if {[cgi_get act] eq "xtelnet"} {
	if {[cgi_get val off] eq "off"} {
		file delete /mod/boot/xtelnet
		puts "Telnet server expert mode will be disabled after next reboot."
	} else {
		exec /mod/bin/busybox/touch /mod/boot/xtelnet
		puts "Telnet server expert mode will be enabled after next reboot."
	}
	exit
}

set settings [settings new]

set hostname [$settings hostname]
set smtp_server [$settings smtp_server]
set channel_group [$settings channel_group]
set epg_style [$settings epg_style]
set pkgdev [$settings pkgdev]
set notoolbar [$settings notoolbar]
set nomobile [$settings nomobile]

# Handle updates

if {![dict exists $env REQUEST_URI]} { set env(REQUEST_URI) "" }

proc _handle_update {class var old text} {
	global _cgi
	global settings

	if {[dict exists $_cgi $var]} {
		set new [string trim [dict get $_cgi $var]]
		if {$new == $old} {
			puts "$text unchanged."
		} elseif [string is $class -strict $new] {
			$settings $var $new
			puts "$text updated."
		} else {
			puts "Invalid value for $var."
		}
		exit
	}
}

proc handle_int_update {var old {text "Value"}} {
	_handle_update digit $var $old $text
}

proc handle_str_update {var old {text "Value"}} {
	_handle_update alnum $var $old $text
}

handle_str_update hostname $hostname Hostname
_handle_update ascii smtp_server $smtp_server "SMTP Server"
handle_int_update channel_group $channel_group "Channel Group"
handle_str_update epg_style $epg_style "EPG Type"
handle_int_update pkgdev $pkgdev "Development Package Display"
handle_int_update notoolbar $notoolbar "Disable toolbar"
handle_int_update nomobile $nomobile "Disable mobile link"

set acluser [cgi_get acluser "-"]
set aclpass [cgi_get aclpass "-"]
set aclpassc [cgi_get aclpassc "-"]
if {$acluser ne "-" && $aclpass ne "-"} {
	if {![string length $acluser]} {
		puts "No username provided."
		exit
	}
	if {$aclpass ne $aclpassc} {
		puts "Passwords do not match."
		exit
	}
	if {[string length $aclpass] < 4} {
		puts "Password is too short (< 4 characters)"
		exit
	}
	puts [$settings addacluser $acluser $aclpass]
	exit
}

set aclact [cgi_get aclact "-"]
if {$aclact ne "-" && $acluser ne "-"} {
	switch $aclact {
		"del" { puts [$settings delacluser $acluser] }
	}
	exit
}

header

puts {
<script type="text/javascript" src="/cgi-bin/settings.js"></script>
<script type="text/javascript" src="/js/jquery.form.js"></script>
<script type="text/javascript" src="/js/jconfirmaction.jquery.js"></script>
<link href=/css/jconfirmaction.jquery.css rel=stylesheet type=text/css />
<script type="text/javascript" src="/js/iphone-style-checkboxes.js"></script>
<link href=/css/iphone-style-checkboxes.css rel=stylesheet type=text/css />
}

puts "
	<fieldset style=\"display: inline\">
		<legend>
			General Settings
		</legend>
	<table>
"

puts "
	<tr>
	<form class=auto id=hostname method=get action=$env(REQUEST_URI)>
		<th class=key>Hostname</th>
		<td><input name=hostname value=\"$hostname\"
		    class=\"text ui-widget-content ui-corner-all\"
		    length=20 maxlength=50>
		    <small>
		    <input id=hostname_submit value=\"change\" type=submit>
		    </small>
		    <div id=hostname_output></div>
		</td>
	</form>
	</tr>
"

puts -nonewline "
	<tr>
		<th class=key>HTTPS web server?</th>
		<td><input id=https_toggle name=https type=checkbox value=yes"
if {[file exists /mod/etc/mongoose.cert]} { puts -nonewline " checked" }
puts ">
		    <div id=https_output></div>
		</td>
	</tr>
"

puts -nonewline "
	<tr>
		<th class=key>Slide-down toolbar?</th>
		<td><input id=toolbar_toggle name=toolbar type=checkbox value=yes"
if {$notoolbar == 0} { puts -nonewline " checked" }
puts ">
		    <div id=toolbar_output></div>
		</td>
	</tr>
"

puts -nonewline "
	<tr>
		<th class=key>Mobile link on main page?</th>
		<td><input id=mobile_toggle name=mobile type=checkbox value=yes"
if {$nomobile == 0} { puts -nonewline " checked" }
puts ">
		    <div id=mobile_output></div>
		</td>
	</tr>
"

puts "
	<tr>
	<form class=auto id=epg_style method=get action=$env(REQUEST_URI)>
		<th class=key>Default Now/Next style</th>
		<td><select id=epg_style name=epg_style
		    class=\"text ui-widget-content ui-corner-all\">
"
puts "<option value=standard"
if {$epg_style ne "grid"} { puts " selected" }
puts ">Standard\n"
puts "<option value=grid"
if {$epg_style eq "grid"} { puts " selected" }
puts ">Grid\n"
puts "
		</select>
		<small>
		<input name=epg_style value=\"set\" type=submit>
		</small>
		<div id=epg_style_output></div>
		</td>
	</form>
	</tr>
"

puts "
	<tr>
	<form class=auto id=channel_group method=get action=$env(REQUEST_URI)>
		<th class=key>Channel Group for EPG</th>
		<td><select id=channel_group name=channel_group
		    class=\"text ui-widget-content ui-corner-all\">
"

set i 0
puts "<option value=0>-- None --"
foreach grp [$settings channel_groups] {
	incr i
	puts -nonewline "<option value=$i"
	if {$channel_group == $i} {
		puts -nonewline " selected"
	}
	puts ">$grp"
}

puts "
		</select>
		<small>
		<input name=channel_group value=\"set\" type=submit>
		</small>
		<div id=channel_group_output></div>
		</td>
	</form>
	</tr>
"

puts "
	</table>
	</fieldset>
	<br><br>
	<fieldset style=\"display: inline\">
	<legend> Email Settings </legend>
	<table>
"

puts "
	<tr>
	<form class=auto id=smtp_server method=get action=$env(REQUEST_URI)>
		<th class=key>SMTP Server for outbound email</th>
		<td><input name=smtp_server value=\"$smtp_server\"
		    class=\"text ui-widget-content ui-corner-all\"
		    length=20 maxlength=50>
		    <small>
		    <input id=smtp_server_submit value=\"change\" type=submit>
		    </small>
		    <div id=smtp_server_output></div>
		</td>
	</form>
	</tr>
"

puts "
	</table>
	</fieldset>
"

puts "
	<br><br>
	<fieldset style=\"display: inline\">
	<legend> Web Interface User Access Control </legend>
	<table>
"

set aclusers [$settings aclusers]
if {[llength $aclusers]} {
	puts "<tr><th colspan=5 class=odd>Existing Users</th></tr>"
	foreach user [$settings aclusers] {
		lassign $user user
		puts "<tr><td align=center style=\"font-weight: bold\">
		    $user</td>"
		puts "<th class=key>New password:
	        <input
		  class=\"aclpass text ui-widget-content ui-corner-all\"
		  type=password size=20 maxlength=50><br>"
		puts "Again:
	        <input
		  class=\"aclpassc text ui-widget-content ui-corner-all\"
		  type=password size=20 maxlength=50></td>"
		puts "<th class=key><button class=pwchange>
		    Change</button></td>"
		puts "<th class=key><button class=userdel>
		    Delete User</button></td>"
		puts "</tr>"
	}
	puts "<tr><td colspan=5 id=aclusermod_output>&nbsp;</td></tr>"
	puts "<tr><td colspan=5>&nbsp;</td></tr>"
} else {
	puts "<tr><td colspan=5 class=blood><b>
	    Add a user to enable authentication.</b></td></tr>"
}

puts "<tr><th colspan=5 class=odd>Add New User</th></tr>"
puts "
	<form id=aclnewuser method=get action=$env(REQUEST_URI)>
	<tr><th class=key>New User:</th><td>
	    <input
		class=\"text ui-widget-content ui-corner-all\"
		id=acluser name=acluser size=20 maxlength=50></td></tr>
	<tr><th class=key>Password:</th><td>
	    <input type=password
		class=\"text ui-widget-content ui-corner-all\"
		id=aclpass name=aclpass size=20 maxlength=50></td></tr>
	<tr><th class=key>Password (confirm):</th><td>
	    <input type=password
		class=\"text ui-widget-content ui-corner-all\"
		id=aclpassc name=aclpassc size=20 maxlength=50></td></tr>
	<tr><td><input id=aclnewuser_submit value=\"Add User\" type=submit>
	    </td></tr>
	</form>
	</table>
	<div id=aclnewuser_output></div>
	</fieldset>
"

puts {
<script type=text/javascript>
$('#aclnewuser').ajaxForm({
	target: '#aclnewuser_output',
	success: function(txt) {
		if (txt.indexOf('Success') >= 0)
			window.location.reload(true);
	}
});

$('button.userdel').click(function(el) {
	var user = $('td:first', $(this).parents('tr')).text().trim();
	$('#aclusermod_output').load(
	    '/cgi-bin/settings.jim?aclact=del&acluser=' +
	    encodeURIComponent(user), function(txt) {
		if (txt.indexOf('Success') >= 0)
			window.location.reload(true);
	});
});

$('button.pwchange').click(function(el) {
	var tr = $(this).parents('tr');
	var user = $('td:first', $(tr)).text().trim();
	var pass = $(tr).find('input.aclpass').val();
	var passc = $(tr).find('input.aclpassc').val();
	$('#aclusermod_output').load('/cgi-bin/settings.jim?' +
	    'acluser=' + encodeURIComponent(user) + '&' +
	    'aclpass=' + encodeURIComponent(pass) + '&' +
	    'aclpassc=' + encodeURIComponent(passc));
});
</script>
}

puts -nonewline "
	<br><br>
	<fieldset style=\"display: inline\">
	<legend> Advanced Settings </legend>
	<table>
	<tr>
		<th class=key>Show development and advanced packages?</th>
		<td><input name=pkgdev id=pkgdev value=1 type=checkbox
"
if {$pkgdev} { puts -nonewline " checked" }
puts ">
		</td>
	</tr>
"

if {[system modversion 1] >= 214} {

puts -nonewline "
	<tr>
		<th class=key>Expert mode telnet server?</th>
		<td><input id=xtelnet_toggle name=xtelnet type=checkbox value=yes"
if {[file exists /mod/boot/xtelnet]} { puts -nonewline " checked" }
puts ">
		    <div id=xtelnet_output></div>
		</td>
	</tr>
"

}

puts "
	</table>
	<div id=pkgdev_output></div>
	</fieldset>
"

eval_plugins settings

footer

