/*
** GDMess - lightweighted, easy to link, simplest
** ajax comments module
*/

var GDMess_script		= '/gdmess/gdmess_aj.cgi';
var GDMess_refreshInterval	= 600000;

var GDMess_defaults = new Array();

	GDMess_defaults['t_input_an']	=
		'<input id="GDMNAME_input_an" class="GDMSTYLE_input_an" value="Anonymous" /><br />';
	GDMess_defaults['t_input']	=
		'<textarea id="GDMNAME_input_area" class="GDMSTYLE_input_area" cols="40" rows="3"></textarea><br />'+
		'<input class="GDMSTYLE_input_submit" type="submit" value="submit" onclick="javascript:GDMessSubmit(\'GDMNAME\');" />';
	GDMess_defaults['t_nav']	=
		'<div class="GDMSTYLE_nav">Pages: %PG</div>';
	GDMess_defaults['t_nav_pg']	= ' %P '
	GDMess_defaults['t_nav_cpg']	= ' [%P] '
	GDMess_defaults['t_msg']	=
		'<div class="GDMSTYLE_msg">'+
			'<div class="GDMSTYLE_msg_header"><span class="GDMSTYLE_msg_hname">%N </span><span class="GDMSTYLE_msg_htime">(%T)</span></div>'+
			'<div class="GDMSTYLE_msg_data">%D</div>'+
		'</div>';


var GDMesses = new Array();  // get object by name hash


//
// the basic thing GDMess constructor needs is a unique 'name' parameter.
// other parameters are optional and are passed through params hash.
//
// most importand of them are:
//
// 'root' - it is a special code which
// marks messages related to one topic. it must be unique for each
// forum/guestbook thread. if not specified it would be the same as 'name'.
//
// 'style' - used to change css style of the board. default is 'gdmess'.
// see gdmess.css file to find out what style classes should be created
// btw - make sure to include this style file (or your own file) to your page.
// 
// other optional parameters are html templates also defined in GDMess_defaults
// override them if you only 100% sure what you're doing.
// DON'T modify this file, only override defaults through params to the constructor!
//

function GDMess(name, params)
{
	this.p = new Array();

	var style = (params ? params['style']  : 'gdmess');
	if (!style) { style = 'gdmess'; }	
	
	for (var i in GDMess_defaults)
	{
		var z = GDMess_defaults[i];
		z = z.replace(/GDMNAME/g,name);
		z = z.replace(/GDMSTYLE/g,style);
		this.p[i] = z;
	}

	for (var i in params)
		{ this.p[i] = params[i]; }

	this.p['name'] = name;

	if (! this.p['root'])
		{ this.p['root'] = name; }

	document.write('<div id="'+this.p['name']+'">'+
		'<div id="'+this.p['name']+'_input" class="'+style+'_input" ></div>'+
		'<div id="'+this.p['name']+'_mess" class="'+style+'_mess" ></div>'+
		'</div>');

	this.currentPage = 0;
	this.isInputRendered = false;
	this.iterationTimeout = null;

	this.render = GDMess_render;
	this.sendQuery = GDMess_sendQuery;

	this.renderInput = GDMess_renderInput;

	GDMesses[this.p['name']] = this;

	this.sendQuery();
}


// for onClick calls and etc.
// retrieves object reference from name
//
function GDMessGet(name)
{
	return GDMesses[name];
}

// used by text submit button
//
function GDMessSubmit(name)
{
	var me = GDMessGet(name);

	var area = document.getElementById(name+'_input_area');
	if (!area.value)
		{ return false; }

	var an = document.getElementById(name+"_input_an");

	var param = ( an ? 'a_name=' + encodeURIComponent(an.value) + '&' : '');

	param = param + 'data=' + encodeURIComponent(area.value);

	area.value = '';
	me.sendQuery(param);
}

// used by setTimeout function
//
function GDMessRefresh(name)
{
	var me = GDMessGet(name);
	me.sendQuery('pg='+me.currentPage);	
}


function GDMess_sendQuery(param)
{
	if (this.iterationTimeout)
	{
		clearTimeout(this.iterationTimeout);
		this.iterationTimeout = null;
	}

	var rootp = 'root=' + this.p['root'];
	param = rootp + (param ? '&'+param : '');

//	if (this.isQuerySent)
//		{ return false; }
//	this.isQuerySent = true;

	var ajax = new Ajax();
	ajax.caller = this;

	ajax.onDone = function (ajaxObj, code) {
		var me = ajaxObj.caller;

		eval("me.render(" + code + ")");
//		me.isQuerySent = false;

		if (GDMess_refreshInterval>0) {
			me.iterationTimeout = setTimeout("GDMessRefresh('"+me.p['name']+"')", GDMess_refreshInterval);
		}
	}

	ajax.onFail = function (ajaxObj) { alert('ajax_err'); }
	ajax.get(GDMess_script,param);
}


function GDMess_renderInput(lUser)
{
	var d = document.getElementById(this.p['name'] + '_input');

	d.innerHTML = 
	( lUser ? '' : this.p['t_input_an']) +
	this.p['t_input'];

	this.isInputRendered = true;
}

function GDMess_render(a)
{
	var f = a.shift();

	var curP = f.shift();
	var maxP = f.shift();
	var loggedUser = f.shift();

	this.currentPage = curP;

	var PG = '';

	for (var i=0; i<=maxP; i++)
	{
		var z = (i==curP ? this.p['t_nav_cpg'] :
				'<span onClick="javascript:GDMessGet(\''+this.p['name']+'\').sendQuery(\'pg='+i+'\')" >'+
				this.p['t_nav_pg'] +
				'</span>'
			);
		z = z.replace(/%P/,i);
		PG = PG + z;
	}

	var res = this.p['t_nav'];
	res = res.replace(/%PG/,PG);

	if (a.length==0)
	{
		res = '<p>No records</p>';
	}
	else
	{
		for (var i = 0; i<a.length; i++)
		{
			var z = this.p['t_msg'];
			z = z.replace(/%T/,a[i][0]);
			z = z.replace(/%N/,a[i][1]);
			z = z.replace(/%D/,a[i][2]);
			res = res + z;
		}
	}

	var d = document.getElementById(this.p['name'] + '_mess');
	d.innerHTML = res;

	if (!this.isInputRendered)
	{
		this.renderInput(loggedUser);
	}

	return 1;
}

