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

//---------------------------------------------------------------------------
// Crappy as usual

var isIE = document.all ? true : false;
var isOpera = self.opera ? true : false;
var isChrome = /chrome/.test(navigator.userAgent.toLowerCase());


//---------------------------------------------------------------------------
// Useful

function doNothing () {}


//---------------------------------------------------------------------------
// Override me!

var inform = function (s)
{
	window.status = s;
}

var error = function (s)
{
	window.status = s;
}

var progressStart = doNothing;
var progressEnd = doNothing;


//---------------------------------------------------------------------------
// Server

var Server = {};

// set my functions!
Server.processResponse = null;
Server.addRequestHeader = null;


Server.getAsync = function (url, onsuccess, onerror)
{
	var r = isIE ? new ActiveXObject ("Microsoft.XMLHTTP") : new XMLHttpRequest ();

	r.onreadystatechange = function ()
	{
		if (r.readyState == 4)
		{
			progressEnd ();

			if (Server.processResponse)
				Server.processResponse (r);

			if (r.status != 200)
			{
				var e = r.responseText;
				if (e.charAt (0) == '*')
				{
					e = e.substr (1).trim ();
					e = e.charAt (0).toUpperCase () + e.substr (1);
				}
				error (e);
				if (onerror)
					onerror (e);
			}
			else
			{
				if (r.getResponseHeader("Content-Type") == 'text/xml')
					onsuccess (r.responseXML);
				else
					onsuccess (r.responseText);
			}
		}
	};

	progressStart ();
	r.open ("GET", url, true);
	if (Server.addRequestHeader)
		Server.addRequestHeader (r);
	r.send (null);
};


Server.get = function (url)
{
	var r = isIE ? new ActiveXObject ("Microsoft.XMLHTTP") : new XMLHttpRequest ();

	progressStart ();
	r.open ("GET", url, false);
	if (Server.addRequestHeader)
		Server.addRequestHeader (r);
	r.send (null);
	progressEnd ();

	if (Server.processResponse)
		Server.processResponse (r);

	if (r.status != 200)
	{
		var e = r.responseText;
		if (e.charAt (0) == '*')
		{
			e = e.substr (1).trim ();
			e = e.charAt (0).toUpperCase () + e.substr (1);
		}
		error (e);
		throw e;
	}

	if (r.getResponseHeader("Content-Type") == 'text/xml')
		return r.responseXML;

	return r.responseText;
};


Server.post = function (url, body)
{
	var r = isIE ? new ActiveXObject ("Microsoft.XMLHTTP") : new XMLHttpRequest ();

	progressStart ();
	r.open ("POST", url, false);
	if (Server.addRequestHeader)
		Server.addRequestHeader (r);
	r.setRequestHeader ("Content-type", "application/x-www-form-urlencoded");
	r.setRequestHeader ("Content-length", body.length);
	r.send (body);
	progressEnd ();

	if (Server.processResponse)
		Server.processResponse (r);

	if (r.status != 200)
	{
		var e = r.responseText;
		if (e.charAt (0) == '*')
		{
			e = e.substr (1).trim ();
			e = e.charAt (0).toUpperCase () + e.substr (1);
		}
		error (e);
		throw e;
	}

	if (r.getResponseHeader("Content-Type") == 'text/xml')
		return r.responseXML;

	return r.responseText;
};



/*---------------------------------------------------------------------------
	HTML processor

	 1 <help src="foo/bar">...</help>
	 2 <icon src="foo">
	 3 <ico src="foo">
	 4 <image src="foo.jpeg" ...>
	 5 <media oid="1" title="blah">
	 6 <link oid="1" title="bla">
	 7 <include src="/foo/bar.htm">
	 8 <service src="/foo/bar?a=xxx">
	 9 <date format="D">
	10 <time format="HM">
	11 <domain>
	12 <note>...</note>
	14 <gotop>
	15 <imgof oid="123" idx="0" title="blah" ...>
	16 <fileof oid="123" idx="0" ...>click here</fileof>
	17 <search query="batik" title="batik" ...>

---------------------------------------------------------------------------*/
var HTML_IMAGE_BASE_URL = '';


function htmlProcess (s, admin)
{
	function tagparam (s)
	{
		// must be enclosed in double quotes, e.g. foo="bar"
		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) == "<help ")
			{
				tag = 1;
				len = 6;
				closer = "</help>";
			}
			else if (s.substr (i, 6) == "<icon ")
			{
				tag = 2;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 5) == "<ico ")
			{
				tag = 3;
				len = 5;
				closer = "";
			}
			else if (s.substr (i, 7) == "<image ")
			{
				tag = 4;
				len = 7;
				closer = "";
			}
			else if (s.substr (i, 7) == "<media ")
			{
				tag = 5;
				len = 7;
				closer = "";
			}
			else if (s.substr (i, 6) == "<link ")
			{
				tag = 6;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 9) == "<include ")
			{
				tag = 7;
				len = 9;
				closer = "";
			}
			else if (s.substr (i, 9) == "<service ")
			{
				tag = 8;
				len = 9;
				closer = "";
			}
			else if (s.substr (i, 6) == "<date ")
			{
				tag = 9;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 6) == "<date>")
			{
				tag = 9;
				len = 5;
				closer = "";
			}
			else if (s.substr (i, 6) == "<time ")
			{
				tag = 10;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 6) == "<time>")
			{
				tag = 10;
				len = 5;
				closer = "";
			}
			else if (s.substr (i, 8) == "<domain ")
			{
				tag = 11;
				len = 8;
				closer = "";
			}
			else if (s.substr (i, 8) == "<domain>")
			{
				tag = 11;
				len = 7;
				closer = "";
			}
			else if (s.substr (i, 6) == "<note ")
			{
				tag = 12;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 6) == "<note>")
			{
				tag = 12;
				len = 5;
				closer = "";
			}
			else if (s.substr (i, 7) == "</note>")
			{
				tag = 13;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 7) == "<gotop>")
			{
				tag = 14;
				len = 6;
				closer = "";
			}
			else if (s.substr (i, 7) == "<imgof ")
			{
				tag = 15;
				len = 7;
				closer = "";
			}
			else if (s.substr (i, 8) == "<fileof ")
			{
				tag = 16;
				len = 8;
				closer = "</fileof>";
			}
			else if (s.substr (i, 9) == "<search ")
			{
				tag = 17;
				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: // <help src="foo/bar">...</help>
				param = tagparam (rest);
				part = '<a href="javascript:cmdViewManual(\'' + param.src + '\',\'' + title + '\')">' + title + "</a>";
				break;

			case 2: // <icon src="foo">
				param = tagparam (rest);
				part = '<img src="/Gate17/Ui/Icons/' + param.src + '.png"';
				if ("title" in param)
					part += ' title="' + param.title + '"';
				part += '>';
				break;

			case 3: // <ico src="foo">
				param = tagparam (rest);
				part = '<img src="/Gate17/Ui/Icons/' + param.src + '.png" class="ManualIcon"';
				if ("title" in param)
					part += ' title="' + param.title + '"';
				part += '>';
				break;

			case 4: // <image src="foo.jpeg" ...>
				param = tagparam (rest);
				k = param.src;
				part = '<img src="' + HTML_IMAGE_BASE_URL + k + '"';
				if ("title" in param)
					part += ' title="' + param.title + '"';
				delete param.src;
				delete param.title;
				for (k in param)
					part += ' ' + k + '="' + param [k] + '"';
				part += '>';
				break;

			case 5: // <media oid="1" title="blah">
				param = tagparam (rest);
				try
				{
					obj = Media.get (param.oid);
					if (admin)
					{
						if (obj.kind == 0)
							part = '<a href="javascript:viewObject(\'Media\',\'' + obj.id + '\')">' +
									'<img src="/Gate17/Lib/Media/Media?a=qGetFile&i=0&o=' + obj.id + '"></a>';
						else
							part = '<a href="/Gate17/Lib/Media/Media?a=qGetFile&i=0&o' + obj.id + '">' +
										H(param.title || k.title) + '</a>';
					}
					else
					{
						if (obj.kind == 0)
							part = '<img src="/Gate17/Lib/Media/Media?a=qGetFile&i=0&o=' + obj.id + '">';
						else
							part = '<a href="/Gate17/Lib/Media/Media?a=qGetFile&i=0&o' + obj.id + '">' +
										H(param.title || k.title) + '</a>';
					}
				}
				catch (err)
				{
					part = '[MEDIA:' + param.src + ']';
				}
				break;

			case 6: // <link oid="1" title="bla">
				param = tagparam (rest);
				if (param.oid == '0')
				{
					part = '[' + (param.title || '[LINK ?') + ']';
				}
				else
				{
					try
					{
						obj = Server.get ('/Gate17/Lib/Generic/Generic?a=qGet&o=' + param.oid);
						obj = eval (obj);
						if (admin)
							part = '<a href="javascript:viewObject(\'' + obj.id + '\')">' + (param.title || obj.name || obj.title) + '</a>';
						else
							part = param.title || obj.name || obj.title;
					}
					catch (err)
					{
						part = '[LINK:' + param.src + ']';
					}
				}
				break;

			case 7: // <include src="/foo/bar.htm">
				param = tagparam (rest);
				try
				{
					var e = param.src.fileExt ();
					if (e != '.html' && e != '.htm')
						throw param.src + ' is not HTML';
					part = Server.get (param.src);
				}
				catch (err)
				{
					part = '[INCLUDE ' + H(err) + ']';
				}
				break;

			case 8: // <service src="/foo/bar?a=xxx">
				param = tagparam (rest);
				try
				{
					part = Server.get (param.src);
				}
				catch (err)
				{
					part = '[SERVICE ' + param.src + ': ' + err + ']';
				}
				break;

			case 9: // <date format="D">
				param = tagparam (rest);
				part = (new Date ()).format (param.format || "D");
				break;

			case 10: // <time format="HM">
				param = tagparam (rest);
				var xx = new Date ();
				var xh = xx.getHours();
				var xm = xx.getMinutes ();
				var xs = xx.getSeconds ();
				xh = (xh < 10) ? "0" + xh : xh;
				xm = (xm < 10) ? "0" + xm : xm;
				xs = (xs < 10) ? "0" + xs : xs;
				switch (param.format)
				{
					case "H" : part = xh; break;
					case "HM": part = xh + ':' + xm; break;
					default  : part = xh + ':' + xm + ':' + xs; break;
				}
				break;

			case 11: //<domain>
				try
				{
					part = document.documentURI;
					part = part.split (/\/\//)[1];
					part = part.split (/\//)[0];
				}
				catch (err)
				{
					part = document.domain || 'document.domain.bug';
				}
				break;

			case 12: // <note>
				param = tagparam (rest);
				part = '<table cellspacing="0" cellpadding="0" border="0"><tr valign="top"><td><img src="/Gate17/Ui/Icons/' + (param.icon || 'note') + '.png"><td> &nbsp;<td>';
				break;

			case 13: // </note>
				part = '</table>';
				break;

			case 14: // <gotop>
				part = '<a href="#top"><img src="/Gate17/Ui/Icons/up.png"></a>';
				break;

			case 15: // <imgof oid="123" idx="0" title="blah" auto="350" ...>
				param = tagparam (rest);
				part = '<img src="/command?a=qGetFile&i=' + param.oid + '&j=' + param.idx + '"';
				if (param.zoom)
				{
					var w = parseInt (param.zoom);
					var z = parseInt (w / 2);
					part += ' style="width:' + z + 'px; height:auto;"' +
							'onmouseover="this.style.width=\'' + w + 'px\'"' +
							'onmouseout="this.style.width=\'' + z + 'px\'"';
				}
				delete param.zoom;
				delete param.oid;
				delete param.idx;
				for (k in param)
					part += ' ' + k + '="' + param [k] + '"';
				part += '>';
				break;

			case 16: // <fileof oid="123" idx="0" ...>click here</fileof>
				param = tagparam (rest);
				part = '<a href="/Gate17/Lib/Generic/Generic?a=qGetFile&o=' + param.oid + '&i=' + param.idx + '"';
				delete param.oid;
				delete param.idx;
				for (k in param)
					part += ' ' + k + '="' + param [k] + '"';
				part += '>' + title + '</a>';
				break;

			case 17: // <search query="batik" title="batik" ...>
				// we don't do search in Admin
				part = param.query || param.title || '[search]';
				break;

			default:
				part = rest;
				break;
		}
		s += part;
	}
	return s;
}


//---------------------------------------------------------------------------
// Formula evaluator

function _evalFormula () { return ''; }

var getFormulaRef = function (x)
{
	throw 'Unknown formula reference: ' + x;
};


function evalFormula (s, rep)
{
	s = s.trim ();

	if (s.charAt (0) == '*')
		s = '{' + getFormulaRef (s.substr (1).trim ().split (/\s+/)[0].trim ()) + '}';
	else if (s.charAt (0) != '{')
		return s;

	// $( -> Money(
	s = s.replace (/\$\(/g, 'Money(');

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

	// ++ --> .__plus
	s = s.replace (/\+\+/g, '.__plus');

	// -- --> .__minus
	s = s.replace (/\-\-/g, '.__minus');

	if (rep)
	{
		for (var x in rep)
			s = s.replace (x, rep[x]);
	}

	s = eval ('function _evalFormula()\n' + s + '\n _evalFormula();');
	return s || '';
}

