local outfunc = "echo"

local function out (s, i, f)
	s = string.sub(s, i, f or -1)
	if s == "" then return s end
	s = string.gsub(s, "([\\\n\'])", "\\%1")
	s = string.gsub(s, "\r", "\\r")
	return string.format(" %s('%s'); ", outfunc, s)
end

function echo(str)
	if type(str) =="string" then
		echo_out = echo_out..str
	elseif type(str) =="number" then
		echo_out = echo_out..tostring(str)
	else
		echo_out = echo_out.."["..type(str).." value]"
	end
end
print=echo


local function translate (s)
	s = string.gsub(s, "<%%(.-)%%>", "<??lua %1 ??>")
	local res = {}
	local start = 1
	while true do
		local ip, fp, target, exp, code = string.find(s, "<%?%?(%w*)[ \t]*(=?)(.-)%?%?>", start)
		if not ip then break end
		table.insert(res, out(s, start, ip-1))
		if target ~= "" and target ~= "lua" then
			table.insert(res, out(s, ip, fp))
		else
			if exp == "=" then
				table.insert(res, string.format(" %s(%s);", outfunc, code))
			else
				table.insert(res, string.format(" %s ", code))
			end
		end
		start = fp + 1
	end
	table.insert(res, out(s, start))
	return table.concat(res)
end


local function compile (src, chunkname)
	local cacheid = md5(src)
	local cid, err = _CACHE_ID[chunkname]
	if cid and cid == cacheid then 
		return _CACHE_CONTENT[chunkname]
	end
	_CACHE_CONTENT[chunkname] = loadstring(translate(src),chunkname)
	_CACHE_ID[chunkname] = cacheid
	return _CACHE_CONTENT[chunkname]
end


function include (filename, env)
	if incfiles[filename] == nil then
		incfiles[filename] = true;
		path = c_GetAppPath()
		path = path .. "/webclient/"..filename
		local errstr = string.format("<b>The page '%s' does not exist!</b>",filename)
		local fh,_ = io.open (path)
		if not fh then 
			echo_out = echo_out..errstr
			return
		end
		local src = fh:read("*a")
		fh:close()
		local prog = compile(src, path)

		local _env
		if env then
			_env = getfenv (prog)
			setfenv (prog, env)
		end

		local status,err = pcall(prog)
		if not status then
			if type(err) == "string" and not string.find(err,"exit function!")  then
				print(string.format("<b>some error in %s!</b>",err))
			end
			return
		end
	end
end


function unescape(s)
	s = string.gsub(s,"%%(%x%x)",function(h)
		return string.char(tonumber(h,16))
		end)
	return s
end
urldecode=unescape

function escape(s)
	s = s.gsub (s, "\n", "\r\n")
	s = s.gsub (s, "([^%w ])",
		function (c) return s.format ("%%%02X", s.byte(c)) end)
	s = s.gsub (s, " ", "+")
	return s
end
urlencode=escape


function specialhtml_encode(src)
	src=src.gsub(src,">", "&gt;")
	src=src.gsub(src,"<", "&lt;")
	src=src.gsub(src,"\"", "&quot;")
	src=src.gsub(src,"\'", "&#39;")
	src=src.gsub(src,"\\", "&#92;")
	return src
end

function specialhtml_decode(src)
	src=src.gsub(src,"&gt;", ">") 
 	src=src.gsub(src,"&lt;", "<") 
	src=src.gsub(src,"&quot;", "\"")
	src=src.gsub(src,"&#39;", "\'")
	src=src.gsub(src,"&#92;", "\\")
	return src
end



function init_get()
	local MatchedReferer = true
	
	if _SESSION_ID ~= nil then
		local Referer = string.match(strHead,"[rR]eferer:%s?%s([^\r\n]*)")
		if Referer ~= nil and Referer ~= "" then
			local Host = string.match(strHead,"[hH]ost:%s?%s([^\r\n]*)")
			if Host ~= nil and Host ~= "" then
				if string.sub(Referer,8,string.len(Host)+7) == Host or string.sub(Referer,9,string.len(Host)+8) == Host then
					MatchedReferer = true
				else
					MatchedReferer = false
					exit()
				end
			end
		else
			local filename = string.gsub(filetorun, "/", "")
			local strCookie = string.match(strHead,"[cC]ookie:%s?(%s[^\r\n]*)")
			if filename ~= "main.html" and filename ~= "main_m.html" and filename ~= "login.html" and filename ~= "login_m.html" and filename ~= "loginok.html" and filename ~= "loginok_m.html" and filename ~= "uploadlink.html" and filename ~= "downloadpass.html" and filename ~= "downloadfolder.html" then
				if string.len(strCookie) ~= 69 then
					MatchedReferer = false
					exit()
				end
			end
		end
	end

	string.gsub (urlparam, "([^&=]+)=([^&=]*)&?",
	function (key, val)
		if MatchedReferer == true then
			rawset(_GET,unescape(key),unescape(val))
		end
	end
	)
end

function init_post()
	local MatchedReferer = true
	
	if _SESSION_ID ~= nil then
		local Referer = string.match(strHead,"[rR]eferer:%s?%s([^\r\n]*)")
		if Referer ~= nil and Referer ~= "" then
			local Host = string.match(strHead,"[hH]ost:%s?%s([^\r\n]*)")
			if Host ~= nil and Host ~= "" then
				if string.sub(Referer,8,string.len(Host)+7) == Host or string.sub(Referer,9,string.len(Host)+8) == Host then
					MatchedReferer = true
				else
					MatchedReferer = false
					exit()
				end
			end
		else
			local filename = string.gsub(filetorun, "/", "")
			local strCookie = string.match(strHead,"[cC]ookie:%s?(%s[^\r\n]*)")
			if filename ~= "main.html" and filename ~= "main_m.html" and filename ~= "login.html" and filename ~= "login_m.html" and filename ~= "loginok.html" and filename ~= "loginok_m.html" and filename ~= "uploadlink.html" and filename ~= "downloadpass.html" and filename ~= "downloadfolder.html" then
				if string.len(strCookie) ~= 69 then
					MatchedReferer = false
					exit()
				end
			end
		end
	end

	if string.find(strHead,"[cC]ontent%-[tT]ype:%s?multipart/form%-data;%s?boundary=") then
		string.gsub (strContent, "[cC]ontent%-[dD]isposition:%s?form%-data;%s?name=\"([^\"\r\n]*)\"\r\n\r\n([^\r\n]*)\r\n",
		function (key, val)
			if MatchedReferer == true then
				rawset(_POST,unescape(key),unescape(val))
			end
		end
		)
	else
		string.gsub (strContent, "([^&=\r\n]+)=([^&=\r\n]*)&?",
		function (key, val)
			if MatchedReferer == true then
				rawset(_POST,unescape(key),unescape(val))
			end
		end
		)
	end
end

function init_session()
	if _COOKIE["UID"] ~= nil then
		_SESSION_ID = _COOKIE["UID"]
		SessionModule.load(_SESSION_ID)
	end
end


function init_cookie()
	local cookiestr = string.match(strHead,"[cC]ookie:%s?(%s[^\r\n]*)")
	if cookiestr == nil or cookiestr == "" then return end
	string.gsub (cookiestr, "([^%s;=]+)=([^;=]*)[;%s]?",
	function (key, val)
		rawset(_COOKIE,unescape(key),unescape(val))
	end
	)
end

function setcookie(name,value,expire_secs)
	if name == "UID" then return end
	local expiretime = os.date("!%A, %d-%b-%Y %H:%M:%S GMT", os.time()+3600*24*365)
	_SETCOOKIE = _SETCOOKIE.."Set-Cookie: "..name.."="..value.."; expires="..expiretime.."\r\n"
	rawset(_COOKIE,name,value)
end

function getcookie(name)
	if name == "UID" then return end
	return _COOKIE[name]
end

function deletecookie(name)
	setcookie(name,"",-10000000)
end

function deleteallcookies()
	for name,_ in pairs(_COOKIE) do
		deletecookie(name)
	end
end

local cookie_metatable = 
{
	__newindex = function(t,k,v)
		setcookie(k,v,360000)
	end
}
setmetatable(_COOKIE,cookie_metatable)


session_metatable = 
{
	__newindex = function(t,k,v)
		if type(v) ~= "table" then
			if k ~= nil then
				k = string.gsub(k,"'","")
				k = string.gsub(k,"\"","")
			end
			if v ~= nil then
				--v = string.gsub(v,"%[","")
				--v = string.gsub(v,"%]","")
			end
			rawset(_SESSION,k,v)
			SessionModule.save(_SESSION_ID)
		end
	end
}
--setmetatable(_SESSION,session_metatable)


function init_all()
	init_cookie()
	init_session()
	init_get()
	init_post()
end

function page_loadtime()
	local nowtime = os.clock()
	local timeval = string.format("%0.2f",nowtime-_STARTCLOCK)
	return timeval
end

function setContentType(typestr)
	_CONTENTTYPE = typestr
end

function exit()
	error("exit function!")
end

function register_plugin(tab)

	if tab.plugin_enabled ~= nil and tab.plugin_enabled == false then
		return false
	end

	local bExist = false

	for _,val in pairs(_SERVER) do
		if val.extbutton_name ~= nil and val.extbutton_name == tab.extbutton_name then
			bExist = true
			break
		end
	end

	if bExist == false then
		table.insert(_SERVER,tab)
		return true
	end

	return false
end

function Split(fullstring, separator)
	local findstartindex = 1
	local splitindex = 1
	local splitarray = {}
	while true do
	   local findlastindex = string.find(fullstring, separator, findstartindex)
	   if not findlastindex then
		splitarray[splitindex] = string.sub(fullstring, findstartindex, string.len(fullstring))
		break
	   end
	   splitarray[splitindex] = string.sub(fullstring, findstartindex, findlastindex-1)
	   findstartindex = findlastindex+string.len(separator)
	   splitindex = splitindex+1
	end
	return splitarray
end
