#!/usr/bin/env python

import os, re#, md5 #, cStringIO
from PythonInsideHTML import PIH

__DEBUG__ = False

#from os import environ
#from urllib import quote, unquote
#from string import strip
#import Cookie
from cgitools import isOnline, cgi_token, cgi_token_xml, unescape
import cgitb; cgitb.enable(display=0, logdir='/tmp')

# full use: http://XXXX/.../ui/func_page[.pih|.py]:[{params_dic}|params_str_by_&]?[{params_dic}|params_str_by_&]
# then params can passed by web forms or as dict/string introduced by ":", "?". dict are eval as one entity.

#pih_vars = {}
			
#index_html = open('ui_logon.html','rt')
#cgi_token = "Content-type:text/html\n\n"
pih_dir = 'pages'
guest_page = 'ui_guestpage.pih'
user_page = 'ui_userpage.pih'
default_page = guest_page
page_dict = {
# webarray pages
'logon':'ui_logon.pih', 'register':'ui_register.pih', 'upload':'ui_upload.pih', 'userpage':'ui_userpage.pih', 'analyze':'ui_analyze.pih', 'analyze_linear_affy':'ui_analyze_linear_affy.pih', 'analyze_linear_dual':'ui_analyze_linear_dual.pih', 'browse':'ui_browse.pih', 'userinfo':'ui_userinfo.pih', 'mainfunc':'ui_mainfunc.pih', 'userfunc':'ui_userfunc.pih', 'guestfunc':'ui_guestfunc.pih', 'userwin':'ui_userwin.pih', 'intro':'ui_intro.pih', 'normPCA':'ui_normpca.pih', 'manage':'ui_manage.pih', 'userprofile':'ui_profile.pih',
# mpmdb pages
#'db_fill_single':'db_fill_single.pih', 'db_fill_file':'db_fill_file.pih',
'dbs_fill_single':'dbs_fill_single.pih', #'dbs_fill_file':'dbs_fill_file.pih',
'dbs_bac_fill_single':'dbs_bac_fill_single.pih', 
'dbs_prostate_fill_single':'dbs_prostate_fill_single.pih', 
'dbs_fill_file':'dbs_fill_file.pih'
} # pages not present in this dict should be found in pih_dir directly
guest_allowed_pages = {'logon':'ui_logon.pih', 'register':'ui_register.pih', 'intro':'ui_intro.pih', 'guestfunc':'ui_guestfunc.pih'}

#cookies = getCookiesForServer()
#if CookieJar.has_key('username'): pih_vars['username'] = CookieJar['username'] 

# decide which page according to user logon state 
#print cgi_token

on_line = isOnline()
#request_page = os.getenv('PATH_INFO') # 'REQUEST_STRING'
query_str = os.getenv('QUERY_STRING')
if query_str: query_str = unescape(query_str)
path_info = os.getenv('PATH_INFO')
if path_info: path_info = unescape(path_info)
request_page = None
if path_info: request_page = path_info[1:] # remove the leading '/'
if not request_page: 
	request_page = query_str  # query_string will be used as path_info/request_page
	query_str = ''

#request_page = os.getenv('QUERY_STRING')
#if not request_page: #is None: 
#	request_page = os.getenv('PATH_INFO')
#	if request_page and len(request_page)>1: request_page = request_page[1:] # remove the leading slash '/'

# parse pih_vars
import cgi
pih_vars = {}

def getParams(s, dic_str=re.compile(r'^\s*(\{.+\})\s*$'), kv_str=re.compile(r'^\s*(.+?)\s*=\s*(.+?)\s*$')):
	m = dic_str.match(s)
	if m:
		try: eval(m.groups()[0])
		except:
			print cgi_token
			print '<pre'+repr(m.groups()[0])+'</pre>'
			import sys
			sys.exit(0)
	if m: return eval(m.groups()[0]) # query_str is a python dict
	rlt = {}
	for kv in s.split('&'): #a string like "aaa=333&bbb='xxx'"
		m = kv_str.match(kv)
		if m: rlt[m.groups()[0]] = eval(m.groups()[1])
	return rlt

# request_page could be request_page:{...a_python_dict_...}  or request_page:aaa=333&bbb='xxx'
if False: #request_page: # get data from dict
	dic_str = re.compile(r'^\s*(.+?)\s*:\s*(\{.+\})\s*$')
	m = dic_str.match(request_page)
	if m:
		request_page = m.groups()[0]
		pih_vars.update(eval(m.groups()[1]))
if request_page:
	idx = request_page.find(':')
	if idx > 0: # idx >= 0
		pih_vars.update(getParams(request_page[idx+1:]))
		request_page = request_page[:idx]
# query_str could be {...a_python_dict_...} or a string like "aaa=333&bbb='xxx'"
if query_str:  # get data from dict or string
	pih_vars.update(getParams(query_str))

form = cgi.FieldStorage() # this should override the request_page
for k in form.keys():
	try: pih_vars[k] = eval(form.getvalue(k)) # for number value
	except: pih_vars[k] = form.getvalue(k) # for string

#print cgi_token
#print 'QUERY_STRING is', '"'+str(os.getenv('QUERY_STRING'))+'"'
#print 'PATH_INFO is', '"'+str(os.getenv('PATH_INFO'))+'"'
#import cgi
#print cgi.print_environ()
#import sys
#sys.exit(0)

#open('tmpfile.txt', 'a').write("site_0"+os.getenv('REQUEST_URI')+'\n')

#if request_page and len(request_page)>1:
#	page = request_page[1:] # remove the leading slash '/'
if request_page:
	page = request_page
	if on_line:
		if page_dict.has_key(page): page = page_dict[page] 
	else: page = guest_allowed_pages.get(page, default_page)
else:
	if on_line: page = user_page
	else: page = default_page

page = os.path.join(pih_dir, page)
#fpage = open(page, 'rt')
#memo_page = cStringIO.StringIO()
#memo_page.write(fpage.read())
#fpage.close()

tp = pih_vars.get('cont_type', 'html').lower()
if tp == 'html': print cgi_token
elif tp == 'xml': print cgi_token_xml

#print request_page
#import sys
#sys.exit(0)

#first_line = index_html.readline()
#if cgi_token.strip() != first_line.strip(): print first_line
#for line in index_html.readlines(): print line,


#print page
#print CookieJar
#if CookieJar.has_key('user_name'): print '<p>',CookieJar['user_name']
#if CookieJar.has_key('online'): print '<p>',CookieJar['online']

#print PIH(page).pythonCode()#.replace('\n','<br>')

#if request_page[1:] != 'analyze':
#	import traceback
#	try:

page_type = os.path.splitext(page)[1]
if page_type in ['.pih']:
	if __DEBUG__:
		open('tmpfile.py', 'w').write(PIH(page).pythonCode())
		execfile('tmpfile.py') #from  tmpfile import *
	else:
		exec PIH(page).pythonCode()
elif page_type == '.py': execfile(page)
else: # treat as html page
	print open(page).read()

#	except:
#		#import traceback
#		#traceback.print_exc()
#		traceback.format_exc()
#		raise
#	sys.exit(0)

#sys.exit(0)
#memo_page.close()

#import cgi
#print cgi.print_environ()
#print '\n\n'
#print cgi.print_environ_usage()

