// Copyright (c) Gate17 System www.gate17.net by Marc Krisnanto. All rights reserved.

/*TEMPORARY SOLUTION BEGIN*/
function htmlProcess (s)
{
	function tagparam (s)
	{
		var r = {};
		var param, value;
		var i = 0;
		s = s.trim ();
		while (true)
		{
			j = s.indexOf ("=", i);
			if (j < 0)
				break;
			param = s.substr (i, j - i).trim ();
			i = s.indexOf ('"', j + 1);
			if (i < 0)
				break;
			j = s.indexOf ('"', i + 1);
			if (j < 0)
				break;
			value = s.substr (i + 1, j - i - 1);
			i = j + 1;
			r [param] = value;
		}
		return r;
	}

	var r = [];
	var k = 0;

	s = s.replace (/<--*-->/g, '');

	var t = s.length;

	while (k < t)
	{
		var tag = -1, closer, len, title, rest, i, j, m;

		if ((i = s.indexOf ("<", k)) >= 0)
		{
			if (s.substr (i, 6) == "<link ")
			{
				tag = 1;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 7) == "<media ")
			{
				tag = 2;
				len = 7;
				closer = "";
			}
			else if (s.substr (i, 7) == "<imgof ")
			{
				tag = 3;
				len = 7;
				closer = "";
			}
			else if (s.substr (i, 8) == "<fileof ")
			{
				tag = 4;
				len = 8;
				closer = "</fileof>";
			}
			else if (s.substr (i, 8) == "<search ")
			{
				tag = 5;
				len = 8;
				closer = "";
			}
			else
			{
				if (k < i)
					r.push ([0, null, s.substr (k, i - k)]);
				r.push ([0, null, '<']);
				k = i + 1;
				continue;
			}
		}
		else
		{
			s = s.substr (k);
			if (s)
				r.push ([0, null, s]);
			break;
		}

		j = s.indexOf (">", i + len);
		if (j <= i)
			break;

		if (closer)
		{
			m = s.indexOf (closer, j + 1);
			if (m < 0)
				break;
		}
		else
		{
			m = j + 1;
		}

		if (k < i)
			r.push ([0, null, s.substr (k, i - k)]);

		title = s.substr (j + 1, m - j - 1).trim ();
		rest  = s.substr (i + len, j - i - len);

		r.push ([tag, title, rest]);
		k = m + closer.length;
	}

	s = "";
	for (var i = 0; i < r.length; i++)
	{
		var part  = r [i];
		var tag   = part [0];
		var title = part [1];
		var rest  = part [2];
		var param;
		var obj;

		switch (tag)
		{
			case 1: // <link oid="1" title="bla">
				param = tagparam (rest);
				if (param.oid == '0')
				{
					part = '[' + (param.title || '[LINK ?') + ']';
				}
				else
				{
					try
					{
						obj = Server.get ('/command?a=qGet&i=' + param.oid);
						obj = eval ('[' + obj + '][0]');
						part = '<a href="/view.htm?i=' + param.oid + '">' + (param.title || obj.name || obj.title) + '</a>';
					}
					catch (err)
					{
						part = '[OBJECT oid=' + param.oid + ']';
					}
				}
				break;

			case 2: // <media oid="1" ...>
				param = tagparam (rest);
				try
				{
					obj = Server.get ('/command?a=qGet&i=' + param.oid);
					obj = eval ('[' + obj + '][0]');
					if (obj.kind == 0)
						part = '<img src="/command?a=qGetFile&o=' + param.oid + '&i=0">';
					else
						part = '<a href="/command?a=qGetFile&o=' + param.oid + '&i=0">' +
									H(param.title || obj.title) + '</a>';
				}
				catch (err)
				{
					part = '[MEDIA oid=' + param.oid + ']';
				}
				break;

			case 3: // <imgof oid="123" idx="1" ...>
				param = tagparam (rest);
				part = '<img src="/command?a=qGetFile&i=' + param.oid + '&j=' + param.idx + '"';
				delete param.oid;
				delete param.idx;
				for (k in param)
					part += ' ' + k + '="' + param [k] + '"';
				part += '>';
				break;

			case 4: // <fileof oid="123" idx="0" ...>click here</fileof>
				param = tagparam (rest);
				part = '<a href="/command?a=qGetFile&r=1&i=' + param.oid + '&j=' + param.idx + '"';
				delete param.oid;
				delete param.idx;
				for (k in param)
					part += ' ' + k + '="' + param [k] + '"';
				part += '>' + title + '</a>';
				break;

			case 5: // <search query="foo" title="blah">
				param = tagparam (rest);
				part = '<a href="/query.htm?q=' + encodeURIComponent (param.query) + '"';
				title = param.title || param.query;
				delete param.query;
				delete param.title;
				for (k in param)
					part += ' ' + k + '="' + param [k] + '"';
				part += '>' + title + '</a>';
				break;

			default:
				part = rest;
				break;
		}
		s += part;
	}
	return s;
}
/*TEMPORARY SOLUTION END*/


function Sstf (s, uri)
{
	// uri: class URI for Gate17 applications (e.g. Hotel.Uri), undefine otherwise (for website thus using /command)
	s = s.trim ();
	if (s.charAt (0) != '@')
		s = '@txt\n' + s;
	var sections = Sstf.parse (s);
	var n = sections.length;
	var h = "";
	for (var i = 0; i < n; i++)
	{
		var o = sections [i];
		var g = o.arg;
		var s = o.block;
		switch (o.kind)
		{
			case "txt": h += Sstf.txt (uri, s, g, true); break;
			case "lst": h += Sstf.lst (uri, s, g); break;
			case "tbl": h += Sstf.tbl (uri, s, g); break;
			case "img": h += Sstf.img (uri, g); break;
			case "fle": h += Sstf.fle (uri, g); break;
			case "prg": h += Sstf.prg (uri, s, g); break;
			case "doc": break;
			case "dat": break;
		}
	}
	return h;
};


Sstf.escape = function (s)
{
	return s.replace (/</g, '&lt;').replace (/>/g, '&gt;').replace (/&/g,'&amp;');
};


Sstf.Section = function (kind, block, arg)
{
	this.kind = kind;
	this.block = block;
	this.arg = arg;
};


Sstf.arg = function (s)
{
	var a = s.replace (/\s*,$/).split (/\s*,\s*/);
	s = {};
	for (var i = 0; i < a.length; i++)
	{
		var x = a [i].split (/\s*=\s*/);
		s [x [0].trim ()] = x [1].trim ();
	}
	return s;
};


Sstf.parse = function (s)
{
	var sections = [];
	s = '\n' + s;
	s = s.split (/\n@/);
	var n = s.length;
	for (var i = 0; i < n; i++)
	{
		var o = s[i];
		if (!o)
			continue;

		var arg = {};
		var kind, block, line;

		var j = o.indexOf ("\n");
		if (j < 1)
		{
			line = o;
			block = "";
		}
		else
		{
			line  = o.substr (0, j);
			block = o.substr (j);
		}

		j = line.indexOf (" ");
		if (j < 0)
			j = line.indexOf ("\t");

		if (j < 0)
			kind = line;
		else
		{
			kind = line.substr (0, j);
			arg = Sstf.arg (line.substr (j));
		}

		kind = kind.replace (/^\s+/,"").replace (/\s+$/, "").toLowerCase();
		sections.push (new Sstf.Section (kind, block, arg));
	}
	return sections;
};


Sstf.txt = function (uri, s, arg, t)
{
	var n = s.length;
	var h = "";
	if (arg && ("title" in arg))
		h += '<div class="PageSubTitle">' + Sstf.escape (arg.title) + '</div>';
	if (t)
		h += '<div style="margin-bottom:12px; text-align:justify;">';
	var i = 0;
	while (i < n)
	{
		var c = s.charAt (i++);
		if (c == "o" && s.charAt (i) == "{")
		{
			h += '<a href="/view.htm?i=';
			i++;
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == ' ' || c == '\t')
					break;
				h += c;
			}
			h += '">';
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == "}")
					break;
				h += c;
			}
			h += '</a>';
		}
		else if (c == "f" && s.charAt (i) == "{")
		{
			h += '<a href="' + (uri ? uri + '?a=qGetFile&r=1&o=' : '/command?r=1&a=qGetFile&i=');
			i++;
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == ' ' || c == '\t')
					break;
				h += c;
			}
			h += (uri ? '&i=' : '&j=');
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == ' ' || c == '\t' || c == "}")
					break;
				h += c;
			}
			h += '">';
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == "}")
					break;
				h += c;
			}
			h += '</a>';
		}
		else if (c == "g" && s.charAt (i) == "{")
		{
			h += '<img src="' + (uri ? uri + '?a=qGetFile&o=' : '/command?a=qGetFile&i=');
			i++;
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == ' ' || c == '\t')
					break;
				h += c;
			}
			h += (uri ? '&i=' : '&j=');
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == ' ' || c == '\t' || c == "}")
					break;
				h += c;
			}
			h += '" ';
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == "}")
					break;
				h += c;
			}
			h += '>';
		}
		else if (c == "d" && s.charAt (i) == "{")
		{
			h += '<a href="';
			i++
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == ' ' || c == '\t')
					break;
				h += c;
			}
			h += '">';
			while (i < n)
			{
				c = s.charAt (i++);
				if (c == "}")
					break;
				h += c;
			}
			h += '</a>';
		}
		else
			h += c;
	}
	if (t)
		h += '</div>';
	/*TEMPORARY SOLUTION BEGIN
	return h.replace (/;\n/g, '<br>').replace (/\n\n/g, '<br><br>');
	*/
	h = h.replace (/;\n/g, '<br>').replace (/\n\n/g, '<br><br>');
	return htmlProcess (h);
	/*TEMPORARY SOLUTION END*/
};


Sstf.lst = function (uri, s, arg)
{
	var h = '';
	if ("title" in arg)
		h += '<div class="PageSubTitle">' + Sstf.escape (arg.title) + '</div>';
	var li = arg.li;
	delete arg.li;
	delete arg.title;
	delete arg.type;
	s = s.split (/\n[ \t]*\./);
	h += '<div style="margin-bottom:12px;"><ul';
	for (var i in arg)
		h += ' ' + i + '="' + arg [i] + '"';
	h += '>';
	var n = s.length;
	for (var i = 0; i < n; i++)
	{
		var v = s[i].replace (/^\s+/, "").replace (/\s+$/, "");
		if (v)
			h += '<li style="' + (li || 'margin-bottom:12px') + '">' + Sstf.txt (uri, s[i]) + '</li>';
	}
	return h + '</ul></div>';
};


Sstf.tbl = function (uri, s, arg)
{
	var h = '';
	if ("title" in arg)
		h += '<div class="PageSubTitle">' + Sstf.escape (arg.title) + '</div>';
	delete arg.title;
	var alt = arg.alt == '1';
	delete arg.alt;
	delete arg.type;
	h += '<div style="margin-bottom:12px;"><table'
	for (var k in arg)
		h += ' ' + k + '="' + arg [k] + '"';
	h += '>';
	s = '\n' + s.replace (/\s+/, '');
	var a = s.split (/\n\|/);
	var k = true;
	for (var i = 0; i < a.length; i++)
	{
		var v = a[i];
		if (!v)
			continue;
		v = v.split (/\s*\|/);
		if (alt && !(k = !k))
			h += '<tr style="background-color:#DDDDDD;">';
		else
			h += '<tr>';
		for (var j = 0; j < v.length; j++)
		{
			var x = v[j];
			h += '<td';
			var z = 1;
			switch (x.charAt (0))
			{
				case "#": h += ' style="background-color:#666666; color:#FFFFFF; font-weight:bold; text-align:center;"'; break;
				case "!": h += ' style="text-align:center;"'; break;
				case ">": h += ' style="text-align:right;"'; break;
				default : z = 0;
			}
			x = x.substr (z);
			var p = '';
			var f = 0;
			while ((' 0123456789').indexOf (x.charAt (0)) > 0)
			{
				p += x.charAt (0);
				x = x.substr (1);
				if (++f > 4)
					break;
			}
			if (p)
				h += ' colspan="' + p + '"';
			h += '>' + Sstf.txt (uri, x.trim ());
		}
	}
	h += '</table></div>';
	return h;
};


Sstf.img = function (uri, arg)
{
	var s = '<img src="' + (uri ? uri + '?a=qGetFile&o=' : '/command?a=qGetFile&i=') + arg.id + (uri ? '&i=' : '&j=') + arg.index + '"';
	if (arg ["class"])
		s += ' class="' + arg ["class"] + '"';
	if (arg.zoom)
	{
		var w = parseInt (arg.zoom);
		var z = parseInt (w / 2);
		s += ' style="width:' + z + 'px; height:auto;"' +
				'onmouseover="this.style.width=\'' + w + 'px\'"' +
				'onmouseout="this.style.width=\'' + z + 'px\'"';
	}
	delete arg ["class"];
	delete arg.zoom;
	delete arg.id;
	delete arg.index;
	for (var k in arg)
		s += ' ' + k + '="' + arg [k] + '"';
	return s + '>';
};


Sstf.fle = function (uri, arg)
{
	var s = '<div style="margin-bottom:12px;"><a href="' + (uri ? uri + '?a=qGetFile&o=' : '/command?a=qGetFile&i=') + arg.id + (uri ? '&i=' : '&j=') + arg.index + '"';
	if (arg ["class"])
		s += ' class="' + arg ["class"] + '"';
	delete arg ["class"];
	delete arg.id;
	delete arg.index;
	var t = arg.title;
	delete arg.title;
	for (var k in arg)
		s += ' ' + k + '="' + arg [k] + '"';
	return s + '>' + (arg.title || 'Download') + '</a></div>';
};


Sstf.prg = function (uri, s, arg)
{
	var h = '';
	if ("title" in arg)
		h += '<div class="PageSubTitle" style="margin-bottom:0px;">' + Sstf.escape (arg.title) + '</div>';
	h += '<div style="margin-left:24px; font-family:monospace;">' + Highlight (arg.lang || "plain", s) + '<br>&nbsp;</div>';
	return h;
};

