477 lines
12 KiB
JavaScript

/*
Copyright 2005 Rolando Gonzalez (rolosworld@gmail.com)
This program is free software; you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation; either version 2 of the License, or
(at your option) any later version.
This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
GNU General Public License for more details.
You should have received a copy of the GNU General Public License
along with this program; if not, write to the Free Software
Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
*/
var chats = new Array(); // private chats opened
var users = new Array(); // users list
var chat_data = null;
var mlid = 0; //msg last id
var DEBUG = false;
var PRIVATES = true;
var PUBLIC = true;
function getNick(uid)
{
for(var i in users)
{
if(users[i].uid == uid)
return users[i].nick;
}
return null;
};
function resetChatsZ()
{
for(var i = 0; i < chats.length; i++)
if(chats[i])
chats[i].win.table.style.zIndex = chats[i].win.z;
};
function debug(dib,msg)
{
if(!DEBUG) return;
if(document.getElementById(dib))
document.getElementById(dib).innerHTML = msg;
else
alert(msg);
};
// initialize chat connection.
function Chat(conf)
{
var me = this;
this.pcid = conf["pchatid"]?conf["pchatid"]:null;
this.dt = conf["dt"]?conf["dt"]:1000;
this.ulid = conf["ulid"]?conf["ulid"]:null;
this.w = conf["width"]?conf["width"]:"400px";
this.h = conf["height"]?conf["height"]:"300px";
this.ulist = null;
if(this.pcid)
{
chats[0] = new PubChat(this.dt,this.w,this.h);
document.getElementById(this.pcid).appendChild(chats[0].get());
}
// evaluate the returned json
this.callback = function(response)
{
me.ajax = null;
try{
me.doRefresh(response.responseText);
}catch(e){
debug("debug","Chat Error: "+response.responseText);
clearInterval(me.interv);
debug("debug",e.toString());
debug("debug",e.filename+":"+e.lineNumber);
return;
}
me.ajax = new Ajax(me.callback);
debug("debug",response.responseText);
window.status=Date();
};
this.doRefresh = function(response)
{
if(!me.ulist)
me.ulist = new UList(me.dt,me.ulid,me.w,me.h);
chat_data = eval("("+response+")");
me.ulist.refresh();
me.refreshChats();
};
this.ajax = new Ajax(me.callback);
// start the ajax request for the chat data
this.refresh = function()
{
if(me.ajax.state() == 0)
me.ajax.process("index.php?mode=chat&module=Home&action=chat","submode=get_all&mlid="+mlid);
};
this.interv = setInterval(me.refresh,me.dt);
this.refreshChats = function()
{
if(chat_data.pvchat)
{
cnum = 0;
for(var i in chat_data.pvchat)
{
cnum = chat_data.pvchat[i].chat;
if(!chats[cnum])
chats[cnum] = new PrivChat(me.dt,cnum,me.w,me.h);
if(mlid < chat_data.pvchat[i].mlid)
mlid = chat_data.pvchat[i].mlid;
if(chat_data.pvchat[i].msg.substr(0,5) == "\\sys ")
{
chats[cnum].appendSysMsg(chat_data.pvchat[i].msg.substr(5));
}
else
chats[cnum].appendMsg(chat_data.pvchat[i].from,chat_data.pvchat[i].msg);
}
chat_data.pvchat = null;
}
if(PUBLIC && chat_data.pchat)
{
for(var i in chat_data.pchat)
{
if(mlid < chat_data.pchat[i].mlid)
mlid = chat_data.pchat[i].mlid;
if(!chats[0])
continue;
if(chat_data.pchat[i].msg.substr(0,5) == "\\sys ")
{
chats[0].appendSysMsg(chat_data.pchat[i].msg.substr(5));
}
else
chats[0].appendMsg(chat_data.pchat[i].from,chat_data.pchat[i].msg);
}
chat_data.pchat = null;
}
};
};
// User list handler
function UList(dt,ulid,w,h)
{
var me = this;
this.w = w;
this.h = h;
this.dt = dt; // delta time to sleep the requests.
this.ulid = ulid; // user list ul tag id.
this.interv = null;
// updates the users list on the html
this.refreshList = function()
{
if(!document.getElementById(me.ulid))
{
clearInterval(me.interv);
return;
}
while(document.getElementById(me.ulid).firstChild)
document.getElementById(me.ulid).removeChild(document.getElementById(me.ulid).firstChild);
if(users)
{
var li;
var a;
var user;
for(var i in users)
{
user = users[i];
li = document.createElement("span");
a = document.createElement("a");
a.appendChild(document.createTextNode(user.nick));
a.setAttribute("href","#");
a.className = "chat";
if(PRIVATES)
a.onclick = me.newPriv(me.dt,user.uid);
li.appendChild(a);
document.getElementById(me.ulid).appendChild(li);
}
//var date = new Date();
//window.status=date.toString();
}
};
// higher order stuff
this.newPriv = function(dt,uid)
{
return function()
{
if(!chats[uid])
{
resetChatsZ();
chats[uid] = new PrivChat(dt,uid,me.w,me.h);
}
return false;
};
};
// check if theres a new user list
this.refresh = function()
{
//users = null;
if(chat_data.ulist)
{
users = chat_data.ulist;
me.refreshList();
}
chat_data.ulist = null;
};
};
//////////////////////////////////////////////////////////
// Input handler
function chatInput(to)
{
var me = this;
this.to = to?to:null;
this.input = document.createElement("input");
this.input.className = "cinput";
this.input.setAttribute("type","text");
this.input.setAttribute("name","input");
var table = document.createElement("table");
//table.border = "1";
var tbody = table.appendChild(document.createElement("tbody"));
var tr = tbody.appendChild(document.createElement("tr"));
var td = tr.appendChild(document.createElement("td"));
var td1 = tr.appendChild(document.createElement("td"));
var td2 = tr.appendChild(document.createElement("td"));
table.className = "cinput";
tbody.className = "cinput";
tr.className = "cinput";
td.className = "ckeyb";
td1.className = "cinput";
td2.className = "csubmit";
this.input = td1.appendChild(this.input);
td2.onclick = function()
{
var ajax = new Ajax(me.callback);
ajax.process("index.php?mode=chat&module=Home&action=chat","submode=submit&msg="+escapeAll(me.input.value)+(me.to?"&to="+me.to:""));
me.input.value = "";
me.input.focus();
return false;
};
this.form = document.createElement("form");
this.form.className = "cinput";
this.form.appendChild(table);
this.form.onsubmit = function()
{
var ajax = new Ajax(me.callback);
ajax.process("index.php?mode=chat&module=Home&action=chat","submode=submit&msg="+escapeAll(me.input.value)+(me.to?"&to="+me.to:""));
me.input.value = "";
me.input.focus();
return false;
};
this.setFocus = function()
{
me.input.focus();
};
// evaluate the returned json
this.callback = function(response)
{
response = response.responseText;
try{
if(response)
debug("debug",response);
}catch(e){
debug("debug","chatInput Error: "+response);
}
};
this.get = function()
{
return me.form;
};
};
//////////////////////////////////////////////////////////
// Private chat handler / abre ventana de usurio + usuario
function PrivChat(dt,to,w,h)
{
var me = this;
this.dt = dt; // delta time to sleep the requests.
this.to = to; // private chat the other user id
this.input = new chatInput(to);
this.toNick = getNick(to);
var conf = new Array();
conf["topic"] = "Private chat with <span class=\"chatTopicNick\">"+me.toNick+"</span>";
conf["class"] = "chat";
conf["width"] = w;
conf["height"] = h;
conf["drag"] = true;
this.win = new cssWindow(conf);
// move z+1..crappy way to send above others
this.win.table.onDragStart = function()
{
resetChatsZ();
chats[me.to].win.table.style.zIndex++;
};
this.win.cb = function()
{
me.ajax = new Ajax(me.callback);
me.ajax.process("index.php?mode=chat&module=Home&action=chat","submode=pvclose&to="+me.to);
chats[me.to]=null;
};
this.cbox = this.win.setBody(document.createElement("div"));
this.cbox.style.width = "100%";
this.cbox.style.height = "100%";
this.cbox.style.overflow = "auto";
this.cbox.className = "chatbox";
// Draws the top of the window
this.getHead = function()
{
var t = document.createElement("table");
t.style.width="100%";t.cellSpacing="0";t.cellPadding="0";
var tb = t.appendChild(document.createElement("tbody"));
var tr = tb.appendChild(document.createElement("tr"));
var td = tr.appendChild(document.createElement("td"));
td.className = "chaticon";
td = tr.appendChild(document.createElement("td"));
td.className = "chattopic1";
td.innerHTML = me.win.topic;
var hide = tr.appendChild(document.createElement("td"));
hide.className = "chathide";
hide.onclick = me.win.doHide;
var close = tr.appendChild(document.createElement("td"));
close.className = "chatclose";
close.onclick = me.win.doClose;
return t;
};
this.win.setHead(this.getHead());
this.win.setFoot(this.input.get());
// updates the chat on the html
this.appendMsg = function(from,msg)
{
var div;
var span;
span = document.createElement("span");
span.appendChild(document.createTextNode(from+": "));
span.className = "cunick";
div = document.createElement("div");
div.className = "cumsg";
div.appendChild(span);
div.innerHTML+=msg;
me.cbox.appendChild(div);
me.cbox.scrollTop=me.cbox.scrollHeight;
};
// updates the chat on the html
this.appendSysMsg = function(msg)
{
var div;
div = document.createElement("div");
div.className = "csmsg";
div.innerHTML+=msg;
me.cbox.appendChild(div);
me.cbox.scrollTop=me.cbox.scrollHeight;
};
this.win.show();
this.input.setFocus();
};
//////////////////////////////////////////////////////////
// Public chat handler / abre ventana de usurio + usuario
function PubChat(dt,w,h)
{
var me = this;
this.dt = dt; // delta time to sleep the requests.
this.to = 0; // public chat the other user id
this.input = new chatInput(this.to);
var conf = new Array();
conf["topic"] = "Public Chat";
conf["class"] = "pchat";
conf["width"] = w;
conf["height"] = h;
conf["drag"] = false;
this.win = new cssWindow(conf);
this.cbox = this.win.setBody(document.createElement("div"));
this.cbox.style.width = "100%";
this.cbox.style.height = "100%";
this.cbox.style.overflow = "auto";
this.cbox.className = "chatbox";
// Draws the top of the window
this.getHead = function()
{
var t = document.createElement("table");
t.style.width="100%";t.cellSpacing="0";t.cellPadding="0";
var tb = t.appendChild(document.createElement("tbody"));
var tr = tb.appendChild(document.createElement("tr"));
var td = tr.appendChild(document.createElement("td"));
td.className = "chattopic";
td.appendChild(document.createTextNode(me.win.topic));
var hide = tr.appendChild(document.createElement("td"));
hide.className = "chathide";
hide.onclick = me.win.doHide;
return t;
};
this.win.setHead(this.getHead());
this.win.setFoot(this.input.get());
// updates the chat on the html
this.appendMsg = function(from,msg)
{
var div;
var span;
span = document.createElement("span");
span.appendChild(document.createTextNode(from+": "));
span.className = "cunick";
div = document.createElement("div");
div.className = "cumsg";
div.appendChild(span);
div.innerHTML+=msg;
me.cbox.appendChild(div);
me.cbox.scrollTop=me.cbox.scrollHeight;
};
// updates the chat on the html
this.appendSysMsg = function(msg)
{
var div;
div = document.createElement("div");
div.className = "csmsg";
div.innerHTML+=msg;
me.cbox.appendChild(div);
me.cbox.scrollTop=me.cbox.scrollHeight;
};
this.get = function()
{
me.input.setFocus();
return me.win.get();
};
};