#!/usr/bin/env python
# -*- coding: UTF-8 -*-
#
# webinterface for re_codec configuration 
# (c)2004 jan gerber <j@reboot.fm>
#
import cgi
import cgitb; cgitb.enable()
from xmlrpclib  import *
from SimpleXMLRPCServer import *
import re
import sys

class confClass:
	def __init__(self,server):
		self.mode=server.getMode()
		self.streamswitch_mode=server.getStreamSwitchMode()
		#get values via xmlrpc must go here.



def save_values(form):
	global conf
	savemode=form.getvalue("save", "").strip()
	mode = form.getvalue("mode", "")	
	if savemode=="mode":
		conf.mode = form.getvalue("mode", "")	
		if form.getvalue("streamswitch_mode", "").strip():
			conf.streamswitch_mode = "enabled"
		else:
			conf.streamswitch_mode = "disabled"
	elif savemode=="encoder":
		for port in ['In','Out','Fallback']:
			for channel in [1,2]:
				value=form.getvalue('Jackmixer%s-%s'%(port,channel),'')
				if value:
					print "aha",value,"<br />"
	elif savemode=="decoder":
		for port in ['In','Out','Fallback']:
			for channel in [1,2]:
				value=form.getvalue('Jackmixer%s-%s'%(port,channel),'')
				if value:
					print "aha",value,"<br />"


def input_form(label,value):
	print '<p>',label,' <input type="text" size="40" name="inputname" value="%s"></p>'%value

def getJackmixerSelectbox(name,mode='Playback'):
	channels=2
	portnum=0
	selectbox=''
	while portnum<channels:
		portnum += 1
		value_set_done=0
		try:
			value_set=getattr(server,"get%s"%name)(portnum)
			selectbox += '<select name="%s-%s">'%(name,portnum)
			for value in getattr(server,"getJack%sPorts"%mode)():
				if not re.search("jackmixer",value):
					if value==value_set:
						value_set_done=1
						selected='selected'
					else:
						selected=''
					selectbox += '<option value="%s" %s>%s</option>'%(value,selected,value)
			if value_set_done==0:
				selectbox += '<option value="%s" selected>%s</option>'%(value_set,value_set)
			selectbox += '</select>\n'
		except:
			print "<h1>make sure jackd is running.</h1>"
			sys.exit()
	return selectbox

def jackmixer_form():
	print '<p>'
	print "<h2>jackmixer</h2>"
	"""<p>
	encoder: <b>input</b>: alsa_pcm:capture, <b>output</b>: ices, <b>fallback</b>: player_fallback <br />
	decoder: <b>input</b>: player_in, <b>output</b>: alsa_pcm:playback , <b>fallback</b>: player_fallback <br />
	</p>"""
	print '<table><tr><td>'
	print "<h3>input port:</h3>"
	print getJackmixerSelectbox('JackmixerIn','Capture')
	print "<h3>fallback port:</h3>"
	print getJackmixerSelectbox('JackmixerFallback','Capture')

	print '</td><td>'
	print '&nbsp;</td><td valign="top">'
	print "<h3>output port:</h3>"
	print getJackmixerSelectbox('JackmixerOut')		
	print '</td></tr></table>'
	
	print '<br /><br /><input type="button" value="default"></p>'



def fallback_form():
	print '<p>'
	print '<h2>fallback settings:</h2>'
	input_form("Playlist: ",'')
	print '</p>'
	

def mode_form():
	global conf
	print '<p>'
	print '<form name="re_codec" action="re_codec.cgi" method="post">'
	print '<input type="hidden" value="mode" name="save">'
	print '<table cellpadding=5><tr><td>'
	print 'mode: <select name="mode">'
	for modeline in ['encoder','decoder','none']:
		if conf.mode==modeline:
			selected='selected'
		else:
			selected=''
		print '<option value="%s" %s>%s</option>'%(modeline,selected,modeline)
	print '</select>'
	print '</p>'
	if conf.streamswitch_mode=='enabled':
		state='checked'
	else:
		state=''
	print '</td><td>'
	print '''
	<input type="checkbox" name="streamswitch_mode" value="1" %s>
	 enable streamswitch
	'''% state
	print '</td><td>'
	print '<input type="submit" name="re_codec" value="Save">'
	print '</td></tr>'
	print '</table>'
	print '</form>'



def streamswitch_form():
	print '<div style="background-color:#ff0">'
	print "<h2>streamswitch</h2>"
	print '''<p>
	basic settings for the streanswitch<br />
	possible advanced settings for the future: shout settings
	</p>'''
	overwrite=server.getStreamSwitchOverwriteURL()
	if overwrite:
		checked='checked'
		disabled="true"
	else:
		checked=''
		disabled="false"
	
	print '''
	<script>
		function disable_overwrite(){
			if(document.getElementsByName('disable_over_i')[0].checked){
				document.getElementsByName('overwrite')[0].disabled=false;
			}
			else{
				document.getElementsByName('overwrite')[0].value='';
				document.getElementsByName('overwrite')[0].disabled=true;
			}
		}
	</script>
	<p>[<input type="checkbox" name="disable_over_i" value="disable" onClick="disable_overwrite()" %s>] manual overwrite <input type="text" size="50" name="overwrite" value="%s" disabled="%s">
	</p>
	'''%(checked,overwrite,disabled)
	print "<b>Settings</b>:"
	input_form("Default stream: ",server.getStreamSwitchDefaultURL())
	input_form("Fallback stream: ",server.getStreamSwitchFallbackURL())
	input_form("iCalender URL: ",server.getStreamSwitchIcsURL())
	print '</div>'


def decoder_form():
	print '<div style="background-color:#0f0">'
	print '<h2>decoder settings:</h2>'
	print '''<p>
	basic settings for the decoder<br />
	possible advanced settings for the future: fallback,recording[ices,icecast]
	</p>'''

	input_form("Stream: ",server.getStreamDecoderUrl())
	jackmixer_form()
	print '</div>'

def encoder_form():
	print '<div style="background-color:#f00">'
	print '<h2>encoder settings:</h2>'
	print '''<p>
	basic settings for the encoder<br />
	possible advanced settings for the future: fallback,ices,icecast,recording
	</p>'''
	jackmixer_form()
	print '</div>'

# main part
print "Content-Type: text/html; charset=utf-8"     # HTML is following
print                               # blank line, end of headers


server = ServerProxy("http://localhost:96123")
try:
	xmlrpc_methods=server.system.listMethods()
	conf=confClass(server)
except:
	print 'XMLRPC backend down. please check and restart backend if needed.'
	sys.exit()
form = cgi.FieldStorage()
save_values(form)


print '<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">'
print "<html>"
print "<title>re_codec config</title>"
print "<body>"
print '<table width="100%"><tr><td>'

print "<h1>re_codec configuration</h1>"
print "</td><td>"

print "uptime:    ",server.uptime(),"<br />"
print "jackmixer: ",server.jackmixerStatus(),"<br />"
if conf.streamswitch_mode=="enabled":
	print "switch:    ",server.switchStatus(),"<br />"

mode_form()
print "</td></tr></table>"


print ' <form name="re_codec" action="re_codec.cgi" method="post">'
if conf.mode=="encoder":
	encoder_form()
elif conf.mode=="decoder":
	decoder_form()

if conf.streamswitch_mode=="enabled":
	streamswitch_form()
print '<br /> <input type="submit" name="re_codec" value="Save">'

print ' </form>'

print "</body>"
print "</html>"
