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

var View = {};

//---------------------------------------------------------------------------
View.userLink = function (o)
{
	return ((o.id != 1 && o.id != 7)
			? '<a href="/view?i=' + o.id + '">' + htmlEscape (o.name) + '</a>'
			: htmlEscape (o.name));
};


View.objectTree = function (items, hobj)
{
	return '<ul>' + View.objectTree.add (items, hobj || null, 0) + '</ul>';
};


View.objectTree.add = function (a, hobj, level)
{
	var h = '';
	for (var i = 0; i < a.length; i++)
	{
		var o = a [i];
		var b = a [i + 1];
		h += '<li style="white-space:nowrap; margin-left:-24px;">';
		if (hobj && o.id == hobj.id)
			h += htmlEscape (o.name || o.title);
		else
			h += '<a href="/view.htm?i=' + o.id + '">' + htmlEscape (o.name || o.title) + '</a>';
		if (isArray (b))
		{
			h += '<ul>' + View.objectTree.add (b, hobj, level + 1) + '</ul>';
			i++;
		}
	}
	return h;
};


//--------------------------------------------------------------------------
function viewInfo (h)
{
	document.getElementById ("viewInfo").innerHTML = h + '</table>';
}

function viewAd (id)
{
	var e = document.getElementById ("viewAdObjectContainer");
	var x = Server.get ('/command?a=qAd&i=' + id);
	x = eval ('[' + x + '][0]') [id];
	if (x)
	{
		e.style.display = "block";
		document.getElementById ("viewAdObjectBody").innerHTML = x;
	}
}


function ViewAd (id)
{
	setTimeout (viewAd, 10, id);
};


function viewHead (o, extra)
{
	var w = '';
	if (o.latd && o.lotd)
		w += '<a href="/map.htm?i=' + o.id + '&a=' + o.latd + '&b=' + o.lotd + '">Map</a>';

	var h =
		(extra || '') + (w ? '<div style="margin-bottom:12px;">' + w + '</div>' : '') +
		'<table cellspacing="0" cellpadding="0" border="0" style="font-size:smaller;">' +
			'<tr valign="top">' +
				'<td>ID:&nbsp;' +
				'<td>' + o.id;

	if (o.ids)
		h +=  '<tr valign="top">' +
				'<td>Code:&nbsp;' +
				'<td>' + o.ids;
	h +=	
			'<tr valign="top">' +
				'<td>Type:&nbsp;' +
				'<td>' + CLASSTITLE [o.klass] +
			'<tr valign="top">' +
				'<td>Modified:&nbsp;' +
				'<td>' + Date.qu2js (o.ctime).format ("F") +
			'<tr valign="top">' +
				'<td>By:&nbsp;' +
				'<td>' + View.userLink (o.owner) +
			'<tr valign="top">' +
				'<td>Viewed:&nbsp;' +
				'<td>' + o.viewed;

	if (o.latd && o.lotd)
	{
		h +=	
			'<tr valign="top">' +
				'<td>Latitude:&nbsp;' +
				'<td>' + (o.latd / 1000000).toFixed (6) +
			'<tr valign="top">' +
				'<td>Longitude:&nbsp;' +
				'<td>' + (o.lotd / 1000000).toFixed (6);
	}

	if (o.keywords)
		h +=
			'<tr valign="top">' +
				'<td>Keywords:&nbsp;' +
				'<td>' + o.keywords;
	return h;
}

function viewLocation (id, a, depth)
{
	if (depth > 4)
		return;

	try
	{
		var o = Server.get ('/command?a=qGet&i=' + id);
		o = eval ('[' + o + ']') [0];

		var c = o.klass;
		if (c == "Continent" || c == "Planet" || c == "Galaxy")
			return;

		a.push ('<a href="/view.htm?i=' + o.id + '">' + (o.name || o.title) + '</a>');
		var r = o.relation;
		if (r && r.length)
		{
			for (var i = 0; i < r.length; i++)
			{
				var o = r [i];
				if (o [1] == 3) // Located in
				{
					viewLocation (o [0], a, depth + 1);
					break;
				}
			}
		}
	}
	catch (err)
	{
		return;
	}
}

function viewRelation (self)
{
	var r = self.relation;
	var h = '';
	if (r && r.length)
	{
		for (var i = 0; i < r.length; i++)
		{
			var o = r [i];
			var k = o [1];
			o = o [0];
			var s = '';
			if (k == 3) // Located in
			{
				var a = [];
				var l = viewLocation (o, a, 0);
				s += a.join (', ');
			}
			else
			{
				try
				{
					o = Server.get ('/command?a=qGet&i=' + o);
					o = eval ('[' + o + ']') [0];
					s += '<a href="/view.htm?i=' + o.id + '"><b>' + (o.name || o.title) + '</b></a> (' + CLASSTITLE [o.klass] + ')';
				}
				catch (err)
				{
				}
			}
			if (s)
				h += '<tr valign="top"><td style="white-space:nowrap;">' + RELATION [k] + ':&nbsp;<td>' + s;
		}
	}
	return h;
};


function viewTree (self)
{
	var t = self.haschild;
	var r = self.relation;
	if (r && r.length)
	{
		for (var i = 0; i < r.length; i++)
		{
			var o = r [i];
			var k = o [1];
			if (k == 2) // Child of
			{
				t = true;
				break;
			}
		}
	}

	if (!t)
		return '';

	var a;
	try
	{
		a = Server.get ('/command?a=qGetTree&i=' + self.id);
		a = eval (a);
	}
	catch (err)
	{
		return ''
	}

	var get = function (a, k, x)
	{
		if (isArray (x))
		{
			for (var i = 0; i < x.length; i++)
				get (x, i, x[i]);
		}
		else
		{
			var s = Server.get ('/command?a=qGet&i=' + x);
			a [k] = eval ('['+ s + '][0]');
		}
	}

	for (var i = 0; i < a.length; i++)
		get (a, i, a [i]);

	return View.objectTree (a, self);
};


function viewAuxFormat (k, v)
{
	var h = '';
	switch (k)
	{
		case "URL":
			if (v.indexOf ('\n') > 0)
			{
				v = v.split (/\n+/);
				for (var j = 0; j < v.length; j++)
				{
					var s = v [i];
					if (s.indexOf (' ') > 0)
						s = s.split (/\s+/)[0];
					h += '<a href="' + s + '" target="_blank">' + s + '</a><br>';
				}
			}
			else
			{
				if (v.indexOf (' ') > 0)
					v = v.split (/\s+/)[0];
				h += '<a href="' + v + '" target="_blank">' + v + '</a>';
			}
			break;

		case "EMA":
			if (v.indexOf ('\n') > 0)
			{
				v = v.split (/\n+/);
				for (var j = 0; j < y.length; j++)
				{
					var s = y [i];
					if (s.indexOf (' ') > 0)
						s = s.split (/\s+/)[0];
					h += '<a href="mailto:' + s + '">' + s + '</a><br>';
				}
			}
			else
			{
				if (v.indexOf (' ') > 0)
					v = v.split (/\s+/)[0];
				h += '<a href="mailto:' + v + '">' + v + '</a>';
			}
			break;

		default:
			h = htmlEscape (v);
	}
	return h;
}	


function viewAux (aux)
{
	var h = '';
	if (aux)
	{
		var sorted = {};
		for (var i = 0; i < AUXSORTED.length; i++)
		{
			var k = AUXSORTED[i];
			if (k in aux)
			{
				var s = AUX [k];
				if (s)
				{
					sorted [k] = true;
					var v = aux [k];
					if (v)
						h += '<tr valign="top"><td>' + s + ':&nbsp;<td>' + viewAuxFormat (k, v);
				}
			}
		}
		for (var k in aux)
		{
			if (k in sorted)
				continue;
			var s = AUX [k];
			if (s)
			{
				var v = aux [k];
				if (v)
					h += '<tr valign="top"><td>' + s + ':&nbsp;<td>' + viewAuxFormat (k, v);
			}
		}
	}
	return h;
}


function viewDates (d)
{
	var h = '<tr valign="top">' +
			'<td>Date&nbsp;:' +
			'<td>';
	if (d.length == 1)
		h += '<div style="white-space:nowrap;"> ' + Date.qu2js (d [0]).format ("D");
	else
	{
		for (var i = 0; i < d.length; i++)
			h += '<div style="white-space:nowrap;"> ' + Date.qu2js (d [i]).format ("D");
	}
	return h;
}


function viewRelatedSearch (id, index)
{
	var perpage = 10;

	var ep = document.getElementById ("rightPanePrev");
	if (!ep)
	{
		setTimeout (viewRelatedSearch, 10, id, 0);
		return;
	}

	var en = document.getElementById ("rightPaneNext");
	var eh = document.getElementById ("rightPaneHead");
	var er = document.getElementById ("rightPaneResult");

	ep.style.display = "none";
	en.style.display = "none";
	eh.style.display = "";
	er.style.display = "none";

	index = index || 0;

	var v = document.getElementById ("rightPaneSelect").value;
	var a;
	try
	{
		a = Server.get ('/command?a=qGetRelated&i=' + index + '&n=' + perpage + '&x=' + id + (v ? '&k=' + v : ''));
	}
	catch (err)
	{
		eh.innerHTML = 'Error: ' + htmlEscape (err);
		return;
	}
	a = eval (a);
	var count = a.length;
	if (count < 1)
	{
		eh.innerHTML = 'None';
	}
	else
	{
		var more = count > perpage;
		if (more)
		{
			a.pop ();
			eh.innerHTML = 'Showing ' + (index + 1) + ' - ' + (index + perpage);
			en.src = '/Gate17/Ui/Icons/next.png';
			en.style.cursor = 'pointer';
			en.searchIndex = index + perpage;
			en.onclick = function ()
			{
				viewRelatedSearch (id, this.searchIndex);
			};
		}
		else
		{
			en.src = '/Gate17/Ui/Icons/nextnot.png';
			en.style.cursor = 'default';
			eh.innerHTML = 'Showing ' + (index + 1) + ' - ' + (index + count);
		}

		if (index > 0)
		{
			ep.src = '/Gate17/Ui/Icons/prev.png';
			ep.style.cursor = 'pointer';
			var i = index - perpage;
			if (i < 0)
				i = 0;
			ep.searchIndex = i;
			ep.onclick = function ()
			{
				viewRelatedSearch (id, this.searchIndex);
			};
		}
		else
		{
			ep.src = '/Gate17/Ui/Icons/prevnot.png';
			ep.style.cursor = 'default';
		}

		ep.style.display = '';
		en.style.display = '';

		var h = '';
		for (var i = 0; i < a.length; i++)
		{
			var o = a [i];
			var f = SearchItem [o.klass];
			h += '<div style="margin-bottom:12px;">' +
					(f ? f.apply (o) : SearchItem.Generic.apply (o)) +
				'</div>';
		}

		er.innerHTML = h;
		er.style.display = '';
	}
}


//---------------------------------------------------------------------------
function viewReferrers(id)
{
	var classes = Server.get ('/command?a=qGetRelatedClasses&i=' + id);
	classes = eval (classes);

	var h = '';
	if (classes.length)
	{
		var clist = {};
		var names = [];
		for (var i = 0; i < classes.length; i++)
		{
			var cid = classes [i];
			var name = CLASSTITLEX [cid];
			clist [name] = cid;
			names.push (name);
		}
		names.sort ();

		h += '<select id="rightPaneSelect" onchange="viewRelatedSearch(' + id + ');" style="border:1px solid #000000; width:100%;">' +
				'<option value="">All</option>';

		for (var i = 0; i < names.length; i++)
		{
			var name = names [i];
			var cid = clist [name];
			h += '<option value="' + cid + '">' + name + '</option>';
		}

		h +=
			'</select>' +
			'<p>' +
			'<div id="rightPaneHead" style="display:none;"></div>' +
			'<p>' +
			'<img id="rightPanePrev" src="/Gate17/Ui/Icons/prevnot.png" style="display:none;">' +
			'<img id="rightPaneNext" src="/Gate17/Ui/Icons/nextnot.png" style="display:none;">' +
			'<p>' +
			'<div id="rightPaneResult" style="display:none;"></div>';

		setTimeout (viewRelatedSearch, 10, id, 0);
	}

	if (h)
		document.getElementById ("viewReferrers").innerHTML = h;
	else
		document.getElementById ("viewReferrersBox").style.display = "none";
};


//---------------------------------------------------------------------------
var viewMediaTypes =
{
	"css"  : 'CSS style sheet',
	"html" : 'HTML',
	"htm"  : 'HTML',
	"txt"  : 'Plain text',
	"asc"  : 'ASCII text',
	"sstf" : 'SSTF text',
	"rtx"  : 'Rich text',
	"rtf"  : 'RTF',
	"sgml" : 'SGML',
	"sgm"  : 'SGM',
	"xml"  : 'XML',
	"xsl"  : 'XSL',
	"xul"  : 'XUL',
	"c"    : 'C',
	"cpp"  : 'C++',
	"h"    : 'C header',
	"js"   : 'Javascript',
	"php"  : 'Php',
	"pl"   : 'Perl program',
	"pm"   : 'Perl module',
	"py"   : 'Python program',
	"qu"   : 'Qu program',
	"qm"   : 'Qu module',
	"rb"   : 'Ruby program',
	"sql"  : 'SQL',

	"zip"   : 'Archive',
	"tar"   : 'Archive',
	"tar.gz": 'Archive',
	"tgz"   : 'Archive',

	"jpg"  : 'JPEG image',
	"jpeg" : 'JPEG image',
	"png"  : 'PNG image',
	"gif"  : 'GIF image',

	"au"   : 'AU audio',
	"mid"  : 'MIDI audio',
	"mp3"  : 'MP3 audio',
	"wav"  : 'WAV audio',

	"avi"  : 'AVI video',
	"mov"  : 'MOV video',
	"mpg"  : 'MPEG video',
	"mpeg" : 'MPEG video',
	"mpe"  : 'MPEG video',
	"mp4"  : 'MP4 video',
	"wmv"  : 'WMV video'
};


function viewLinkFile (id, i, ext)
{
	var s = viewMediaTypes [ext];
	if (s)
		s += ' (' + ext + ')';
	else
		s = (ext + ' file');
	return '<a href="/command?a=qGetFile&r=1&i=' + id + '&j=' + i + '">' + s + '</a>';
}


function viewImageFile (id, i, ext)
{
	return '<img src="/command?a=qGetFile&i=' + id + '&j=0">';
}


function viewFiles (o)
{
	var h = '';
	var f = o.files;
	if (f)
	{
		var k = false;
		for (var i = 0; i < f.length; i++)
		{
			var ext = f [i];
			if (ext)
			{
				if (!k)
				{
					k = true;
					h += '<tr valign="top">' +
								'<td>Files:&nbsp;' +
								'<td>';
					if (o.thumbnail)
						h += '<div><a href="/command?a=qGetThumb&i=' + o.id + '">Thumbnail</a></div>';
				}
				h += '<div>' + viewLinkFile (o.id, i, f [i]) + '</div>';
			}
		}
	}
	if (!h && o.thumbnail)
		h += '<tr valign="top">' +
				'<td>Files:&nbsp;' +
					'<td><a href="/command?a=qGetThumb&i=' + o.id + '">Thumbnail</a>';
	return h;
}


//---------------------------------------------------------------------------
var ViewMessage = {};
ViewMessage.perPage = 20;
ViewMessage.theObject = null;
ViewMessage.timeOut = 0;
ViewMessage.curIndex = 0;
ViewMessage.barTitle = 'Comments';
ViewMessage.postTitle = 'Add comment';

ViewMessage.reportSpam = function (msgid)
{
	if (!confirm ('Are you sure you want to report this message as spam?'))
		return;
	var x = Server.get ('/command?a=qMessageSpam&i=' + ViewMessage.theObject.id + '&j=' + msgid);
	x = parseInt (x);
	if (x)
		alert ('You have already reported this message as spam on ' + Date.qu2js (parseInt (x)).format ("F"));
	else
	{
		document.getElementById ('MsgSpamButton' + msgid).style.display = "none";
		var t = document.getElementById ('MsgSpamStatus' + msgid);
		t.style.display = "block";
		t.innerHTML = '<em>You have reported this message as spam a while ago.</em>';
		alert ('Thank you for your report!');
	}
};


ViewMessage.toggle = function (t, b)
{
	if (b.style.display == "none")
	{
		t.className = 'MsgTitleOn';
		b.style.display = "block";
	}
	else
	{
		t.className = 'MsgTitleOff';
		b.style.display = "none";
	}
};


ViewMessage.render = function ()
{
	var msg = document.getElementById ('viewMessage');
	if (!msg)
	{
		ViewMessage.timeOut++;
		if (ViewMessage.timeOut < 100)
			setTimeout (ViewMessage.render, 10);
		return;
	}		

	var i = ViewMessage.curIndex
	var a = Server.get ('/command?a=qMessageGet&i=' + ViewMessage.theObject.id + '&j=' + i + '&n=' + ViewMessage.perPage);
	a = eval (a);

	var h = '<div style="clear:both;">';

	getThisUser ();
	/*if (!thisUser.auth)
		h += '<p><span class="Warning">Please login to add message/comment</span>';*/
	h += '<p><div class="MsgBar">' + ViewMessage.barTitle + '<br><span style="font-weight:normal;">';

	if (a.length < 1)
	{
		h += 'None</span></div>';
	}
	else
	{
		var n = a.length;
		var more = (n > ViewMessage.perPage);
		if (more)
		{
			a.pop ();
			n = a.length;
		}

		h += 'Showing ' + (ViewMessage.curIndex + 1) + ' to ' + (ViewMessage.curIndex + a.length) + '</span></div><p>';

		var prev, next;
		if (i > 0)
			prev = '<img src="/Gate17/Ui/Icons/prev.png" style="cursor:pointer" onclick="ViewMessage.prev();">';
		else
			prev = '<img src="/Gate17/Ui/Icons/prevnot.png">';

		if (more)
			next = '<img src="/Gate17/Ui/Icons/next.png" style="cursor:pointer" onclick="ViewMessage.next();">';
		else
			next = '<img src="/Gate17/Ui/Icons/nextnot.png">';

		h += prev + next + '<p>';

		for (var i = 0; i < n; i++)
		{
			var o = a [i];
			h += '<div class="MsgTitleOff"><span onclick="ViewMessage.toggle(this, this.parentNode.nextSibling)" style="cursor:pointer;">' + (i + ViewMessage.curIndex + 1) + '. ' + o.title + '</span></div>' +
				'<div class="MsgBody" style="display:none;">' +
					'<div class="MsgBy">' + o.time + ' by ' + View.userLink (o.by) + '</div>' +
					o.msg +
					'<p>' +
					((o.rep || !thisUser.auth) ? '' : '<div><button id="MsgSpamButton' + o.id + '" class="MsgButton" onclick="ViewMessage.reportSpam(' + o.id + ')">Report spam</button></div>') +
					(o.spam ? '<div class="Warning">This message has been reported as spam by ' + o.spam + ' user(s).</div>' : '') +
					'<div id="MsgSpamStatus' + o.id + '"' +
						(o.rep ? '><em>You have reported this message as spam on ' + Date.qu2js (o.rep).format ("F") + '.</em>'
								: ' style="display:none;">') +
					'</div>' +
				'</div>';
		}

		if (a.length > 1)
			h += '<p>' + prev + next;
	}

	if (thisUser.auth)
	{
		h += '<p>' +
			'<button class="MsgButton" onclick="ViewMessage.postShow()">' + ViewMessage.postTitle + '</button>' +
			'<div id="boardPostMessage" style="display:none;">' +
				'<table class="MsgPostBody" cellspacing="0" cellpadding="2" border="0">' +
					'<tr valign="top">' +
						'<td>Title:&nbsp;' +
						'<td><input id="boardMessageTitle" type="text" size="60" maxlength="80">' +
					'<tr valign="top">' +
						'<td>Message:<p>No HTML please&nbsp;' +
						'<td><textarea id="boardMessageMsg" rows="10" cols="60""></textarea><p>' +
					'<tr valign="top">' +
						'<td>' +
						'<td><button class="MsgButton" onclick="ViewMessage.postDo();">Post</button> ' +
							'<button class="MsgButton" onclick="ViewMessage.postCancel();">Cancel</button>' +
				'</table>' +
			'</div>';
	}

	h += '</div>';

	msg.innerHTML = h;
};


ViewMessage.prev = function ()
{
	ViewMessage.curIndex -= ViewMessage.PerPage;
	if (ViewMessage.curIndex < 0)
		ViewMessage.curIndex = 0;
	ViewMessage.render ();
};


ViewMessage.next = function ()
{
	ViewMessage.curIndex += ViewMessage.PerPage;
	ViewMessage.render ();
};


ViewMessage.postShow = function ()
{
	document.getElementById ("boardPostMessage").style.display = "block";
	document.getElementById ("boardMessageTitle").focus ();
};


ViewMessage.postCancel = function ()
{
	document.getElementById ("boardPostMessage").style.display = "none";
};


ViewMessage.postDo = function ()
{
	var t = document.getElementById ("boardMessageTitle").value.trim ();
	if (!t)
	{
		alert ('Please enter a title');
		return;
	}
	if (t.length < 3)
	{
		alert ('Please enter a longer title');
		return;
	}
	if (t.length > 80)
	{
		alert ('Please enter a shorter title');
		return;
	}

	var m = document.getElementById ("boardMessageMsg").value.trim ();
	if (!m)
	{
		alert ('Please enter a message');
		return;
	}
	if (m.length < 4)
	{
		alert ('Please enter a longer message');
		return;
	}
	if (m.length > 4096)
	{
		alert ('Please enter a shorter message');
		return;
	}

	document.getElementById ("boardMessageTitle").value = t;
	document.getElementById ("boardMessageMsg").value = m;

	m = m.replace (/</g, '&lt;').replace (/>/g, '&gt;').replace(/\n/g, '<br>');
	try
	{
		Server.get ('/command?a=qMessagePost&i=' + ViewMessage.theObject.id + '&t=' + encodeURIComponent (t) + '&m=' + encodeURIComponent (m));
	}
	catch (err)
	{
		alert (err);
	}

	ViewMessage.curIndex = 0;
	ViewMessage.render ();
};


function ViewMessageBoard (o, title)
{
	if (o.postable)
	{
		ViewMessage.theObject = o;
		setTimeout (ViewMessage.render, 10, title);
	}
};


//---------------------------------------------------------------------------
// Generic

View.Generic = function ()
{
	viewReferrers (this.id);
	var h = viewHead (this) +
			viewRelation (this) +
			viewAux (this.aux) +
			viewFiles (this);
	viewInfo (h);
	ViewMessageBoard (this);
	ViewAd (this.id);
	return '';
};


//---------------------------------------------------------------------------
// General

//View.AddressBook
//View.Ad
//View.Agenda
//View.Album
//View.Article
//View.Blog


View.Board = function ()
{
	getThisUser ();
	ViewMessage.barTitle = 'Messages';
	ViewMessage.postTitle = 'Add message';

	var h = viewHead (this) +
			viewAux (this.aux) +
			viewRelation (this) +
			viewFiles (this);

	viewInfo (h);
	viewReferrers (this.id);
	ViewMessageBoard (this);
	ViewAd (this.id);
	return '';
};


//View.Book
//View.Category


View.Classified = function ()
{
	var h = viewHead (this) +
			viewRelation (this);

	viewInfo (h);
	viewReferrers (this.id);
	ViewMessageBoard (this);
	return '<p>' + this.content;
};


//View.Conference
//View.DataSheet
//View.Diary
//View.Document
//View.Ecard

View.Event = function ()
{
	var h = viewHead (this) +
			viewDates (this.dates) +
			viewRelation (this) +
			viewAux (this.aux) +
			viewFiles (this);

	viewInfo (h);
	viewReferrers (this.id);
	ViewMessageBoard (this);
	ViewAd (this.id);
	return '';
};


//View.Formula
//View.Job
//View.Mailbox
//View.Mailist
//View.Manual


View.Map = function ()
{
	var h = viewHead (this) +
			viewRelation (this) +
			viewAux (this.aux);

	var k = false;
	for (var i = 0; i < this.files.length; i++)
	{
		var ext = this.files [i];
		if (ext)
		{
			if (!k)
			{
				h += '<tr valign="top">' +
							'<td>Files:&nbsp;' +
							'<td>';
				k = true;
			}
			h += '<div>' + viewLinkFile (this.id, i, this.files [i]) + '</div>';
		}
	}

	if (!this.page)
		this.page = viewImageFile (this.id, 0, this.files [0]);

	viewInfo (h);
	viewReferrers (this.id);
	ViewMessageBoard (this);
	ViewAd (this.id);
	return '';
};

	
View.Media = function ()
{
	var h = viewHead (this) +
			viewRelation (this) +
			viewAux (this.aux);

	var k = false;
	for (var i = 0; i < this.files.length; i++)
	{
		var ext = this.files [i];
		if (ext)
		{
			if (!k)
			{
				h += '<tr valign="top">' +
							'<td>Files:&nbsp;' +
							'<td>';
				k = true;
			}
			h += '<div>' + viewLinkFile (this.id, i, this.files [i]) + '</div>';
		}
	}

	if (!this.page)
		this.page = this.kind ? viewLinkFile (this.id, 0, this.files [0]) : viewImageFile (this.id, 0, this.files [0]);

	viewInfo (h);
	viewReferrers (this.id);
	ViewMessageBoard (this);
	return '';
};


//View.News


View.Poll = function ()
{
	View.Poll.object = this;

	var h = viewHead (this, '<div id="viewPollResult" style="border:1px solid #CCCCCC; padding:2px; margin-bottom:12px;"></div>') +
			viewRelation (this) +
			viewAux (this.aux);

	viewInfo (h);
	viewReferrers (this.id);
	ViewMessageBoard (this);
	ViewAd (this.id);

	setTimeout (View.Poll.result, 10, 0);
	return '';
};


View.Poll.resultHtml = function (self, width)
{
	var colors =
	[
		'blue',
		'green',
		'red',
		'yellow',
		'brown',
		'cyan',
		'magenta',
		'navy'
	];

	width = width || 80;
	var e = Server.get ('/command?a=qGetVotes&i=' + self.id);
	e = eval (e);

	var a = self.choices.split (/\n/);

	var total = 0;
	for (var i = 0; i < e.length; i++)
		total += e [i];

	var h =
		'<table cellspacing="0" cellpadding="2" border="0" style="font-size:smaller;">' +
			'<tr valign="top">' +
				'<td style="text-align:center; background-color:#DDDDDD;">Choice' +
				'<td style="text-align:center; background-color:#DDDDDD;">Votes' +
				'<td style="text-align:center; background-color:#DDDDDD;">' +
				'<td style="text-align:center; background-color:#DDDDDD;">Percentage';

	var c = 0;
	for (var i = 0; i < a.length; i++)
	{
		h += '<tr valign="top">' +
				'<td>' + a [i];

		var n = e [i];

		h += '<td>';

		var w = total ? parseInt (n / total * width) : 0;
		if (w)
			h += '<div style="padding:2px; background-color:' + colors [c] + '; white-space:nowrap; height:8px; width:' + w + 'px;"></div>';

		h += '<td style="text-align:right;">' + n;

		var v = total ? n / total * 100 : 0;
		h += '<td style="text-align:right;">' + (v ? v.toFixed (1) : '0') + '%';

		c++;
		if (c >= colors.length)
			c = 0;
	}

	h += '<tr valign="top">' +
			'<td colspan="2" style="font-weight:bold; text-align:right;">Total&nbsp;' +
			'<td style="text-align:right; font-weight:bold;">' + self.votes +
		'</table>';

	return h;
};


View.Poll.result = function (width)
{
	var msg = document.getElementById ('viewPollResult');
	if (!msg)
	{
		setTimeout (View.Poll.result, 10, 0);
		return;
	}

	var colors =
	[
		'blue',
		'green',
		'red',
		'yellow',
		'brown',
		'cyan',
		'magenta',
		'navy'
	];

	var h = '';

	var self = View.Poll.object;
	var a = self.choices.split (/\n/);
	if (isNull (self.voted))
	{
		if (self.pub || thisUser.auth)
		{
			h += '<select id="pollVote">' +
					'<option value="">...</option>';
			for (var i = 0; i < a.length; i++)
				h += '<option value="' + i + '">' + a[i] + '</option>';
			h += '</select>' +
				'<button onclick="View.Poll.vote();" style="margin-left:2px;">Vote</button><p>';
		}
		else
			h += '<em>Please login to vote</em><p>';
	}
	else
		h += '<em>You have voted for: ' + a [self.voted] + '</em><p>';

	h += View.Poll.resultHtml (self, width);
	msg.innerHTML = h;
};


View.Poll.vote = function ()
{
	var self = View.Poll.object;

	var i = document.getElementById ("pollVote").value;
	if (!i)
	{
		alert ('Please select a choice');
		return;
	}
	i = parseInt (i);
	var a = self.choices.split (/\n/);
	if (!confirm ('Vote for ' + a [i] + '?'))
		return;
	if (self.voted)
	{
		alert ('You have already voted for ' + a [self.voted]);
	}
	else
	{
		try
		{
			Server.get ('/command?a=qVote&i=' + self.id + '&j=' + i);
			alert ('Thank you for your vote.\nPlease refresh your browser to view the updated result.');
		}
		catch (err)
		{
			alert ('You have already voted.');
		}
	}
};


//View.ProductPage
//View.Project
//View.Regulation
//View.Todo

View.Topic = View.Board;


//---------------------------------------------------------------------------
// Geography

//View.Galaxy
//View.Planet
//View.Continent
//View.Country
//View.Province
//View.Regency
//View.City
//View.District
//View.Village
//View.Sea
//View.Island
//View.Mountain
//View.River
//View.Lake
//View.Beach
//View.Forest
//View.Waterfall
//View.Cave

//---------------------------------------------------------------------------
// Realworld

//View.Airline
//View.Airport
//View.AmusementPark
//View.Apartment
//View.Bakery
//View.Bank
//View.BeautySalon
//View.Bridge
//View.Bus
//View.BusTerminal
//View.Cafe
//View.Casino
//View.Church
//View.Coach
//View.Company
//View.Consulate
//View.Cruise
//View.DrugStore
//View.Embassy
//View.Exhibition
//View.FitnessCenter
//View.FoodCourt
//View.Fortress
//View.Gallery
//View.Garden
//View.GeneralStore
//View.GolfCourse
//View.GuestHouse
//View.Harbor
//View.Helicopter
//View.Helipad
//View.HomeStay
//View.Hospital


View.Hotel = function ()
{
	viewReferrers (this.id);

	var h = viewHead (this);
	if (this.rating)
	{
		h += '<tr valign="top"><td>Rating:&nbsp;<td>';
		for (var i = 0; i < this.rating; i++)
			h += '<img src="/Gate17/Ui/Images/star.png">';
	}

	h += viewRelation (this) +
		 viewAux (this.aux);

	viewInfo (h);
	ViewMessageBoard (this);
	ViewAd (this.id);
	return '';
};


//View.Insurance
//View.Library
//View.LightHouse
//View.Marina
//View.MeetingRoom
//View.Monument
//View.Museum
//View.NationalPark
//View.OldBuilding
//View.Organization
//View.Palace
//View.Park
//View.People
//View.PoliceStation
//View.PostOffice
//View.Pub
//View.Railway
//View.Rental
//View.Resort
//View.Restaurant
//View.Ruins
//View.School
//View.Ship
//View.ShoppingCenter
//View.Shuttle
//View.Sport
//View.Stadium
//View.Supermarket
//View.Temple
//View.TennisCourt
//View.Theater
//View.Tower
//View.TrainStation
//View.TravelAgent
//View.University
//View.Villa

