mirror of
https://github.com/Mibew/mibew.git
synced 2024-11-15 08:34:11 +03:00
move js
git-svn-id: https://webim.svn.sourceforge.net/svnroot/webim/trunk@106 c66351dc-e62f-0410-b875-e3a5c0b9693f
This commit is contained in:
parent
91483bb642
commit
c2206ec72b
30
src/messenger/js/brws.js
Normal file
30
src/messenger/js/brws.js
Normal file
@ -0,0 +1,30 @@
|
|||||||
|
var myAgent = "";
|
||||||
|
var myVer = 0;
|
||||||
|
var myRealAgent = "";
|
||||||
|
|
||||||
|
function detectAgent() {
|
||||||
|
var AGENTS = ["opera","msie","safari","firefox","netscape","mozilla"];
|
||||||
|
var agent = navigator.userAgent.toLowerCase();
|
||||||
|
for (var i = 0; i < AGENTS.length; i++) {
|
||||||
|
var agentStr = AGENTS[i];
|
||||||
|
if (agent.indexOf(agentStr) != -1) {
|
||||||
|
myAgent = agentStr;
|
||||||
|
if (!window.RegExp)
|
||||||
|
break;
|
||||||
|
|
||||||
|
var versionExpr = new RegExp(agentStr + "[ \/]?([0-9]+(\.[0-9]+)?)");
|
||||||
|
if (versionExpr.exec(agent) != null) {
|
||||||
|
myVer = parseFloat(RegExp.$1);
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
myRealAgent = myAgent;
|
||||||
|
if( navigator.product == "Gecko")
|
||||||
|
myAgent = "moz";
|
||||||
|
}
|
||||||
|
detectAgent();
|
||||||
|
|
||||||
|
function getEl(name) {
|
||||||
|
return document.getElementById(name);
|
||||||
|
}
|
368
src/messenger/js/chat.js
Normal file
368
src/messenger/js/chat.js
Normal file
@ -0,0 +1,368 @@
|
|||||||
|
var FrameUtils = {
|
||||||
|
getDocument: function(frm) {
|
||||||
|
if (frm.contentDocument) {
|
||||||
|
return frm.contentDocument;
|
||||||
|
} else if (frm.contentWindow) {
|
||||||
|
return frm.contentWindow.document;
|
||||||
|
} else if (frm.document) {
|
||||||
|
return frm.document;
|
||||||
|
} else {
|
||||||
|
alert( myRealAgent + ": cannot find document in frame " + frm);
|
||||||
|
//for( var a in frm )
|
||||||
|
// alert( a );
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
initFrame: function(frm) {
|
||||||
|
var doc = this.getDocument(frm);
|
||||||
|
doc.open();
|
||||||
|
doc.write("<html><head>");
|
||||||
|
doc.write("<link rel=\"stylesheet\" type=\"text/css\" media=\"all\" href=\""+Chat.webimRoot+"/chat.css\" />");
|
||||||
|
doc.write("</head><body bgcolor='#FFFFFF' text='#000000' link='#C28400' vlink='#C28400' alink='#C28400' marginwidth='0' marginheight='0' leftmargin='0' rightmargin='0' topmargin='0' bottommargin='0'>");
|
||||||
|
doc.write("<table width='100%' cellspacing='0' cellpadding='0' border='0'><tr><td valign='top' class='message' id='content'></td></tr></table><a id='bottom'/>");
|
||||||
|
doc.write("</body></html>");
|
||||||
|
doc.close();
|
||||||
|
frm.onload = function() {
|
||||||
|
if( frm./**/myHtml ) {
|
||||||
|
FrameUtils.getDocument(frm).getElementById('content').innerHTML += frm.myHtml;
|
||||||
|
FrameUtils.scrollDown(frm);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
insertIntoFrame: function(frm, htmlcontent) {
|
||||||
|
var vcontent = this.getDocument(frm).getElementById('content');
|
||||||
|
if( vcontent == null ) {
|
||||||
|
if( !frm.myHtml ) frm.myHtml = "";
|
||||||
|
frm.myHtml += htmlcontent;
|
||||||
|
} else {
|
||||||
|
vcontent.innerHTML += htmlcontent;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
scrollDown: function(frm) {
|
||||||
|
var vbottom = this.getDocument(frm).getElementById('bottom');
|
||||||
|
if( myAgent == 'opera' ) {
|
||||||
|
frm.contentWindow.scrollTo(0,this.getDocument(frm).getElementById('content').clientHeight);
|
||||||
|
} else if( vbottom )
|
||||||
|
vbottom.scrollIntoView(false);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ajax.ChatThreadUpdater = Class.create();
|
||||||
|
Class.inherit( Ajax.ChatThreadUpdater, Ajax.Base, {
|
||||||
|
|
||||||
|
initialize: function(_options) {
|
||||||
|
this.setOptions(_options);
|
||||||
|
this._options.onComplete = this.requestComplete.bind(this);
|
||||||
|
this._options.onException = this.handleException.bind(this);
|
||||||
|
this.updater = {};
|
||||||
|
this.frequency = (this._options.frequency || 2);
|
||||||
|
this.cansend = true;
|
||||||
|
FrameUtils.initFrame(this._options.container);
|
||||||
|
if( this._options.message ) {
|
||||||
|
this._options.message.onkeydown = this.handleKeyDown.bind(this);
|
||||||
|
this._options.message.onfocus = (function() { this.focused = true; }).bind(this);
|
||||||
|
this._options.message.onblur = (function() { this.focused = false; }).bind(this)
|
||||||
|
}
|
||||||
|
this.update();
|
||||||
|
},
|
||||||
|
|
||||||
|
handleException: function(_request, ex) {
|
||||||
|
this.setStatus(ex.name + " occured: " + ex.message);
|
||||||
|
this.stopUpdate();
|
||||||
|
this.timer = setTimeout(this.update.bind(this), this.frequency * 1000);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateOptions: function(act) {
|
||||||
|
this._options.parameters = 'act='+act+'&thread=' + (this._options.threadid || -1) +
|
||||||
|
'&token=' + (this._options.token || 0)+
|
||||||
|
'&lastid=' + (this._options.lastid || 0);
|
||||||
|
if( this._options.user )
|
||||||
|
this._options.parameters += "&user=true";
|
||||||
|
if( act == 'refresh' && this._options.message && this._options.message.value != '' )
|
||||||
|
this._options.parameters += "&typed=1";
|
||||||
|
},
|
||||||
|
|
||||||
|
enableInput: function(val) {
|
||||||
|
if( this._options.message )
|
||||||
|
this._options.message.disabled = !val;
|
||||||
|
},
|
||||||
|
|
||||||
|
stopUpdate: function() {
|
||||||
|
this.enableInput(true);
|
||||||
|
if( this.updater._options )
|
||||||
|
this.updater._options.onComplete = undefined;
|
||||||
|
clearTimeout(this.timer);
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function() {
|
||||||
|
this.updateOptions("refresh");
|
||||||
|
this.updater = new Ajax.Request(this._options.servl, this._options);
|
||||||
|
},
|
||||||
|
|
||||||
|
requestComplete: function(_response) {
|
||||||
|
this.enableInput(true);
|
||||||
|
this.cansend = true;
|
||||||
|
var xmlRoot = Ajax.getXml(_response);
|
||||||
|
if( xmlRoot && xmlRoot.tagName == 'thread' ) {
|
||||||
|
this.updateContent( xmlRoot );
|
||||||
|
} else {
|
||||||
|
this.handleError(_response, xmlRoot, 'refresh messages failed');
|
||||||
|
}
|
||||||
|
|
||||||
|
this.timer = setTimeout(this.update.bind(this), this.frequency * 1000);
|
||||||
|
},
|
||||||
|
|
||||||
|
postMessage: function(msg) {
|
||||||
|
if( msg == "" || !this.cansend) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this.cansend = false;
|
||||||
|
this.stopUpdate();
|
||||||
|
this.updateOptions("post");
|
||||||
|
var postOptions = {}.extend(this._options);
|
||||||
|
postOptions.parameters += "&message=" + encodeURIComponent(msg);
|
||||||
|
postOptions.onComplete = (function(presponse) {
|
||||||
|
this.requestComplete( presponse );
|
||||||
|
if( this._options.message ) {
|
||||||
|
this._options.message.value = '';
|
||||||
|
this._options.message.focus();
|
||||||
|
}
|
||||||
|
}).bind(this);
|
||||||
|
if( myRealAgent != 'opera' )
|
||||||
|
this.enableInput(false);
|
||||||
|
this.updater = new Ajax.Request(this._options.servl, postOptions);
|
||||||
|
},
|
||||||
|
|
||||||
|
changeName: function(newname) {
|
||||||
|
new Ajax.Request(this._options.servl, {parameters:'act=rename&thread=' + (this._options.threadid || -1) +
|
||||||
|
'&token=' + (this._options.token || 0) + '&name=' + encodeURIComponent(newname)});
|
||||||
|
},
|
||||||
|
|
||||||
|
onThreadClosed: function(_response) {
|
||||||
|
var xmlRoot = Ajax.getXml(_response);
|
||||||
|
if( xmlRoot && xmlRoot.tagName == 'closed' ) {
|
||||||
|
setTimeout('window.close()', 2000);
|
||||||
|
} else {
|
||||||
|
this.handleError(_response, xmlRoot, 'cannot close');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
closeThread: function() {
|
||||||
|
var _params = 'act=close&thread=' + (this._options.threadid || -1) + '&token=' + (this._options.token || 0);
|
||||||
|
if( this._options.user )
|
||||||
|
_params += "&user=true";
|
||||||
|
new Ajax.Request(this._options.servl, {parameters:_params, onComplete: this.onThreadClosed.bind(this)});
|
||||||
|
},
|
||||||
|
|
||||||
|
processMessage: function(_target, message) {
|
||||||
|
var destHtml = NodeUtils.getNodeText(message);
|
||||||
|
FrameUtils.insertIntoFrame(_target, destHtml );
|
||||||
|
},
|
||||||
|
|
||||||
|
showTyping: function(istyping) {
|
||||||
|
if( $("typingdiv") ) {
|
||||||
|
$("typingdiv").style.display=istyping ? 'inline' : 'none';
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setupAvatar: function(avatar) {
|
||||||
|
var imageLink = NodeUtils.getNodeText(avatar);
|
||||||
|
if( this._options.avatar && this._options.user ) {
|
||||||
|
this._options.avatar.innerHTML = imageLink != ""
|
||||||
|
? "<img src=\""+Chat.webimRoot+"/images/free.gif\" width=\"7\" height=\"1\" border=\"0\" alt=\"\" /><img src=\""
|
||||||
|
+imageLink+ "\" border=\"0\" alt=\"\"/>"
|
||||||
|
: "";
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
updateContent: function(xmlRoot) {
|
||||||
|
var haveMessage = false;
|
||||||
|
|
||||||
|
var result_div = this._options.container;
|
||||||
|
var _lastid = NodeUtils.getAttrValue(xmlRoot, "lastid");
|
||||||
|
if( _lastid ) {
|
||||||
|
this._options.lastid = _lastid;
|
||||||
|
}
|
||||||
|
|
||||||
|
var typing = NodeUtils.getAttrValue(xmlRoot, "typing");
|
||||||
|
if( typing ) {
|
||||||
|
this.showTyping(typing == '1');
|
||||||
|
}
|
||||||
|
|
||||||
|
for( var i = 0; i < xmlRoot.childNodes.length; i++ ) {
|
||||||
|
var node = xmlRoot.childNodes[i];
|
||||||
|
if( node.tagName == 'message' ) {
|
||||||
|
haveMessage = true;
|
||||||
|
this.processMessage(result_div, node);
|
||||||
|
} else if( node.tagName == 'avatar' ) {
|
||||||
|
this.setupAvatar(node);
|
||||||
|
}
|
||||||
|
// TODO thread events
|
||||||
|
}
|
||||||
|
if( haveMessage ) {
|
||||||
|
FrameUtils.scrollDown(this._options.container);
|
||||||
|
if( !this.focused )
|
||||||
|
window.focus();
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
handleKeyDown: function(k) {
|
||||||
|
if( k ){ ctrl=k.ctrlKey;k=k.which; } else { k=event.keyCode;ctrl=event.ctrlKey; }
|
||||||
|
if( this._options.message && ((k==13 && (ctrl || myRealAgent == 'opera')) || (k==10)) ) {
|
||||||
|
var mmsg = this._options.message.value;
|
||||||
|
if( myRealAgent == 'opera' ) {
|
||||||
|
mmsg = mmsg.replace(/[\r\n]+$/,'');
|
||||||
|
}
|
||||||
|
this.postMessage( mmsg );
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
return true;
|
||||||
|
},
|
||||||
|
|
||||||
|
handleError: function(_response, xmlRoot, _action) {
|
||||||
|
if( xmlRoot && xmlRoot.tagName == 'error' ) {
|
||||||
|
this.setStatus(NodeUtils.getNodeValue(xmlRoot,"descr"));
|
||||||
|
} else {
|
||||||
|
this.setStatus(_action+', ' + Ajax.getError(_response));
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setStatus: function(k) {
|
||||||
|
if( this.statusTimeout )
|
||||||
|
clearTimeout(this.statusTimeout);
|
||||||
|
window.status = k;
|
||||||
|
this.statusTimeout = setTimeout(this.clearStatus.bind(this), 4000);
|
||||||
|
},
|
||||||
|
|
||||||
|
clearStatus: function() {
|
||||||
|
window.status = "";
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
HSplitter = Class.create();
|
||||||
|
HSplitter.prototype = {
|
||||||
|
initialize: function(_options) {
|
||||||
|
this._options = _options;
|
||||||
|
this.captured = 0;
|
||||||
|
if( this._options.first && this._options.second && this._options.control ) {
|
||||||
|
this._options.control.onmousedown = this.onmousedownEvent.bind(this);
|
||||||
|
this._options.control.onmouseup = this.onmouseupEvent.bind(this);
|
||||||
|
this._options.control.onmousemove = this.onmouseMoveEvent.bind(this);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onmousedownEvent: function(e) {
|
||||||
|
var ev = e || event;
|
||||||
|
|
||||||
|
if( this._options.control.setCapture )
|
||||||
|
this._options.control.setCapture();
|
||||||
|
this.start_height = this._options.first.style.pixelHeight || this._options.first.clientHeight;
|
||||||
|
this.start_offset = ev.screenY;
|
||||||
|
this._options.maxfirst = this._options.first.style.pixelHeight + this._options.second.clientHeight - this._options.minsec;
|
||||||
|
this.captured = 1;
|
||||||
|
},
|
||||||
|
|
||||||
|
onmouseupEvent: function() {
|
||||||
|
if( this.captured ) {
|
||||||
|
if( this._options.control.releaseCapture )
|
||||||
|
this._options.control.releaseCapture();
|
||||||
|
this.captured = 0;
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
onmouseMoveEvent: function(e) {
|
||||||
|
var ev = e || event;
|
||||||
|
|
||||||
|
if( this.captured ) {
|
||||||
|
var new_height = this.start_height - (ev.screenY - this.start_offset);
|
||||||
|
if( new_height > this._options.maxfirst )
|
||||||
|
new_height = this._options.maxfirst;
|
||||||
|
else if( new_height < this._options.minfirst )
|
||||||
|
new_height = this._options.minfirst;
|
||||||
|
if( myAgent == 'moz' )
|
||||||
|
this._options.first.style.height=new_height+'px';
|
||||||
|
else
|
||||||
|
this._options.first.style.pixelHeight = new_height;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var Chat = {
|
||||||
|
threadUpdater : {},
|
||||||
|
hSplitter : {},
|
||||||
|
|
||||||
|
applyName: function() {
|
||||||
|
Chat.threadUpdater.changeName($('uname').value);
|
||||||
|
$('changename1').style.display='none';
|
||||||
|
$('changename2').style.display='inline';
|
||||||
|
},
|
||||||
|
|
||||||
|
showNameField: function() {
|
||||||
|
$('changename1').style.display='inline';
|
||||||
|
$('changename2').style.display='none';
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Behaviour.register({
|
||||||
|
'#postmessage a' : function(el) {
|
||||||
|
el.onclick = function() {
|
||||||
|
var message = $('msgwnd');
|
||||||
|
if( message )
|
||||||
|
Chat.threadUpdater.postMessage(message.value);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'a#sndmessagelnk' : function(el) {
|
||||||
|
if( myRealAgent == 'opera' ) {
|
||||||
|
el.innerHTML = el.innerHTML.replace('Ctrl-','');
|
||||||
|
}
|
||||||
|
},
|
||||||
|
'select#predefined' : function(el) {
|
||||||
|
el.onchange = function() {
|
||||||
|
var message = $('msgwnd');
|
||||||
|
message.value = this.options[this.selectedIndex].innerText || this.options[this.selectedIndex].innerHTML;
|
||||||
|
this.selectedIndex = 0;
|
||||||
|
message.focus();
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'div#changename2 a' : function(el) {
|
||||||
|
el.onclick = function() {
|
||||||
|
Chat.showNameField();
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'div#changename1 a' : function(el) {
|
||||||
|
el.onclick = function() {
|
||||||
|
Chat.applyName();
|
||||||
|
return false;
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'div#changename1 input#uname' : function(el) {
|
||||||
|
el.onkeydown = function(e) {
|
||||||
|
var ev = e || event;
|
||||||
|
if( ev.keyCode == 13 ) {
|
||||||
|
Chat.applyName();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'a#refresh' : function(el) {
|
||||||
|
el.onclick = function() {
|
||||||
|
Chat.threadUpdater.stopUpdate();
|
||||||
|
Chat.threadUpdater.update();
|
||||||
|
};
|
||||||
|
},
|
||||||
|
'a.closethread' : function(el) {
|
||||||
|
el.onclick = function() {
|
||||||
|
Chat.threadUpdater.closeThread();
|
||||||
|
};
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
EventHelper.register(window, 'onload', function(){
|
||||||
|
Chat.webimRoot = threadParams.wroot;
|
||||||
|
Chat.hSplitter = new HSplitter({control:$("spl1"), first:$("msgwndtd"), second:$("chatwndtd"), minfirst:30, minsec:30});
|
||||||
|
Chat.threadUpdater = new Ajax.ChatThreadUpdater(({container:myRealAgent=='safari'?self.frames[0]:$("chatwnd"),avatar:$("avatarwnd"),message:$("msgwnd")}).extend( threadParams || {} ));
|
||||||
|
});
|
526
src/messenger/js/common.js
Normal file
526
src/messenger/js/common.js
Normal file
@ -0,0 +1,526 @@
|
|||||||
|
/*
|
||||||
|
* Web Messenger common script
|
||||||
|
* http://sourceforge.net/projects/webim
|
||||||
|
*
|
||||||
|
* Based on Prototype JavaScript framework, version 1.3.1
|
||||||
|
* http://prototype.conio.net/ (c) 2005 Sam Stephenson <sam@conio.net>
|
||||||
|
*/
|
||||||
|
|
||||||
|
//- getEl, myAgent, myRealAgent
|
||||||
|
|
||||||
|
//- localized
|
||||||
|
|
||||||
|
//- onComplete, obj, params, $apply$
|
||||||
|
//- threadParams, servl, frequency, user, threadid, token
|
||||||
|
//- updaterOptions, url, company, agentservl, noclients, wroot
|
||||||
|
|
||||||
|
|
||||||
|
var Class = {
|
||||||
|
create: function() {
|
||||||
|
return function() {
|
||||||
|
this./**/initialize./**/apply(this, arguments);
|
||||||
|
};
|
||||||
|
},
|
||||||
|
|
||||||
|
inherit: function(child,parent,body) {
|
||||||
|
Object./**/extend(Object.extend(child.prototype, parent.prototype), body );
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.extend = function(destination, source) {
|
||||||
|
for (property in source) {
|
||||||
|
destination[property] = source[property];
|
||||||
|
}
|
||||||
|
return destination;
|
||||||
|
};
|
||||||
|
|
||||||
|
Object.prototype.extend = function(_object) {
|
||||||
|
return Object.extend.apply(this, [this, _object]);
|
||||||
|
};
|
||||||
|
|
||||||
|
Function.prototype./**/bind = function(_object) {
|
||||||
|
var __method = this;
|
||||||
|
return function() {
|
||||||
|
return __method.apply(_object, arguments);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Function.prototype./**/bindAsEventListener = function(_object) {
|
||||||
|
var __method = this;
|
||||||
|
return function(event) {
|
||||||
|
__method.call(_object, event || window.event);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Number.prototype./**/toColorPart = function() {
|
||||||
|
var digits = this.toString(16);
|
||||||
|
if (this < 16) return '0' + digits;
|
||||||
|
return digits;
|
||||||
|
};
|
||||||
|
|
||||||
|
var Try = {
|
||||||
|
these: function() {
|
||||||
|
var returnValue;
|
||||||
|
|
||||||
|
for (var i = 0; i < arguments.length; i++) {
|
||||||
|
var lambda = arguments[i];
|
||||||
|
try {
|
||||||
|
returnValue = lambda();
|
||||||
|
break;
|
||||||
|
} catch (e) {}
|
||||||
|
}
|
||||||
|
|
||||||
|
return returnValue;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
var PeriodicalExecuter = Class.create();
|
||||||
|
PeriodicalExecuter.prototype = {
|
||||||
|
initialize: function(callback, frequency) {
|
||||||
|
this.callback = callback;
|
||||||
|
this.frequency = frequency;
|
||||||
|
this./**/currentlyExecuting = false;
|
||||||
|
|
||||||
|
this./**/registerCallback();
|
||||||
|
},
|
||||||
|
|
||||||
|
registerCallback: function() {
|
||||||
|
setInterval(this.onTimerEvent.bind(this), this.frequency * 1000);
|
||||||
|
},
|
||||||
|
|
||||||
|
onTimerEvent: function() {
|
||||||
|
if (!this.currentlyExecuting) {
|
||||||
|
try {
|
||||||
|
this.currentlyExecuting = true;
|
||||||
|
this.callback();
|
||||||
|
} finally {
|
||||||
|
this.currentlyExecuting = false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*--------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
function findObj( id )
|
||||||
|
{
|
||||||
|
var x;
|
||||||
|
if( !( x = document[ id ] ) && document.all ) x = document.all[ id ];
|
||||||
|
if( !x && document.getElementById ) x = document.getElementById( id );
|
||||||
|
if( !x && !document.all && document.getElementsByName )
|
||||||
|
{
|
||||||
|
x = document.getElementsByName( id );
|
||||||
|
if( x.length == 0 ) return null;
|
||||||
|
if( x.length == 1 ) return x[ 0 ];
|
||||||
|
}
|
||||||
|
|
||||||
|
return x;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Array.prototype./**/push) {
|
||||||
|
Array.prototype.push = function() {
|
||||||
|
var startLength = this.length;
|
||||||
|
for (var i = 0; i < arguments.length; i++)
|
||||||
|
this[startLength + i] = arguments[i];
|
||||||
|
return this.length;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
function $() {
|
||||||
|
var elems = new Array();
|
||||||
|
|
||||||
|
for (var i = 0; i < arguments.length; i++) {
|
||||||
|
var elem = arguments[i];
|
||||||
|
if (typeof elem == 'string')
|
||||||
|
elem = findObj(elem);
|
||||||
|
|
||||||
|
if (arguments.length == 1)
|
||||||
|
return elem;
|
||||||
|
|
||||||
|
elems.push(elem);
|
||||||
|
}
|
||||||
|
|
||||||
|
return elems;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!Function.prototype.apply) {
|
||||||
|
Function.prototype.apply = function(obj, params) {
|
||||||
|
var parameterStrings = new Array();
|
||||||
|
if (!obj) obj = window;
|
||||||
|
if (!params) params = new Array();
|
||||||
|
|
||||||
|
for (var i = 0; i < params.length; i++)
|
||||||
|
parameterStrings[i] = 'params[' + i + ']';
|
||||||
|
|
||||||
|
obj.$apply$ = this;
|
||||||
|
var result = eval('obj.$apply$(' +
|
||||||
|
parameterStrings.join(', ') + ')');
|
||||||
|
obj.$apply$ = null;
|
||||||
|
|
||||||
|
return result;
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
var Ajax = {
|
||||||
|
getTransport: function() {
|
||||||
|
return Try.these(
|
||||||
|
function() {return new ActiveXObject('Msxml2.XMLHTTP')},
|
||||||
|
function() {return new ActiveXObject('Microsoft.XMLHTTP')},
|
||||||
|
function() {return new XMLHttpRequest()}
|
||||||
|
) || false;
|
||||||
|
},
|
||||||
|
|
||||||
|
getXml: function(_response) {
|
||||||
|
if( _response &&
|
||||||
|
_response.status >= 200 &&
|
||||||
|
_response.status < 300 ) {
|
||||||
|
var xmlDoc = _response.responseXML;
|
||||||
|
if( xmlDoc && xmlDoc.documentElement )
|
||||||
|
return xmlDoc.documentElement;
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
getError: function(_response) {
|
||||||
|
return _response.statusText || "connection error N" + _response.status;
|
||||||
|
},
|
||||||
|
|
||||||
|
emptyFunction: function() {}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ajax./**/Base = function() {};
|
||||||
|
Ajax.Base.prototype = {
|
||||||
|
setOptions: function(_options) {
|
||||||
|
this._options = {
|
||||||
|
_method: 'post',
|
||||||
|
asynchronous: true,
|
||||||
|
parameters: ''
|
||||||
|
}.extend(_options || {});
|
||||||
|
},
|
||||||
|
|
||||||
|
responseIsSuccess: function() {
|
||||||
|
return this./**/transport.status == undefined
|
||||||
|
|| this.transport.status == 0
|
||||||
|
|| (this.transport.status >= 200 && this.transport.status < 300);
|
||||||
|
},
|
||||||
|
|
||||||
|
responseIsFailure: function() {
|
||||||
|
return !this.responseIsSuccess();
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Ajax./**/Request = Class.create();
|
||||||
|
Ajax.Request./**/Events =
|
||||||
|
['Uninitialized', 'Loading', 'Loaded', 'Interactive', 'Complete'];
|
||||||
|
|
||||||
|
Class.inherit( Ajax.Request, Ajax.Base, {
|
||||||
|
initialize: function(url, _options) {
|
||||||
|
this.transport = Ajax.getTransport();
|
||||||
|
this.setOptions(_options);
|
||||||
|
this.request(url);
|
||||||
|
},
|
||||||
|
|
||||||
|
request: function(url) {
|
||||||
|
var parameters = this._options.parameters || '';
|
||||||
|
if (parameters.length > 0) parameters += '&_=';
|
||||||
|
|
||||||
|
try {
|
||||||
|
if (this._options._method == 'get' && parameters.length > 0)
|
||||||
|
url += '?' + parameters;
|
||||||
|
|
||||||
|
this.transport.open(this._options._method, url, this._options.asynchronous);
|
||||||
|
|
||||||
|
if (this._options.asynchronous) {
|
||||||
|
this.transport.onreadystatechange = this.onStateChange.bind(this);
|
||||||
|
setTimeout((function() {this.respondToReadyState(1)}).bind(this), 10);
|
||||||
|
}
|
||||||
|
|
||||||
|
this.setRequestHeaders();
|
||||||
|
|
||||||
|
var pbody = this._options.postBody ? this._options.postBody : parameters;
|
||||||
|
this.transport.send(this._options._method == 'post' ? pbody : null);
|
||||||
|
|
||||||
|
} catch (e) {
|
||||||
|
this.dispatchException(e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
setRequestHeaders: function() {
|
||||||
|
var requestHeaders =
|
||||||
|
['X-Requested-With', 'XMLHttpRequest'];
|
||||||
|
|
||||||
|
if (this._options._method == 'post') {
|
||||||
|
requestHeaders.push('Content-type',
|
||||||
|
'application/x-www-form-urlencoded');
|
||||||
|
|
||||||
|
/* Force "Connection: close" for Mozilla browsers to work around
|
||||||
|
* a bug where XMLHttpReqeuest sends an incorrect Content-length
|
||||||
|
* header. See Mozilla Bugzilla #246651.
|
||||||
|
*/
|
||||||
|
if (this.transport.overrideMimeType)
|
||||||
|
requestHeaders.push('Connection', 'close');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (this._options.requestHeaders)
|
||||||
|
requestHeaders.push.apply(requestHeaders, this._options.requestHeaders);
|
||||||
|
|
||||||
|
for (var i = 0; i < requestHeaders.length; i += 2)
|
||||||
|
this.transport.setRequestHeader(requestHeaders[i], requestHeaders[i+1]);
|
||||||
|
},
|
||||||
|
|
||||||
|
onStateChange: function() {
|
||||||
|
var readystate = this.transport.readyState;
|
||||||
|
if (readystate != 1)
|
||||||
|
this.respondToReadyState(this.transport.readyState);
|
||||||
|
},
|
||||||
|
|
||||||
|
header: function(name) {
|
||||||
|
try {
|
||||||
|
return this.transport.getResponseHeader(name);
|
||||||
|
} catch (e) {}
|
||||||
|
},
|
||||||
|
|
||||||
|
evalResponse: function() {
|
||||||
|
try {
|
||||||
|
return eval(this.transport.responseText);
|
||||||
|
} catch (e) {
|
||||||
|
this.dispatchException(e);
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
respondToReadyState: function(readystate) {
|
||||||
|
var event = Ajax.Request.Events[readystate];
|
||||||
|
|
||||||
|
if (event == 'Complete') {
|
||||||
|
try {
|
||||||
|
(this._options['on' + this.transport.status]
|
||||||
|
|| this._options['on' + (this.responseIsSuccess() ? 'Success' : 'Failure')]
|
||||||
|
|| Ajax.emptyFunction)(this.transport);
|
||||||
|
} catch (e) {
|
||||||
|
this.dispatchException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
if ((this.header('Content-type') || '').match("text\\/javascript"))
|
||||||
|
this.evalResponse();
|
||||||
|
}
|
||||||
|
|
||||||
|
try {
|
||||||
|
(this._options['on' + event] || Ajax.emptyFunction)(this.transport);
|
||||||
|
} catch (e) {
|
||||||
|
this.dispatchException(e);
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Avoid memory leak in MSIE: clean up the oncomplete event handler */
|
||||||
|
if (event == 'Complete')
|
||||||
|
this.transport.onreadystatechange = Ajax.emptyFunction;
|
||||||
|
},
|
||||||
|
|
||||||
|
dispatchException: function(exception) {
|
||||||
|
(this._options.onException || Ajax.emptyFunction)(this, exception);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var EventHelper = {
|
||||||
|
register : function(obj, ev,func){
|
||||||
|
var oldev = obj[ev];
|
||||||
|
|
||||||
|
if (typeof oldev != 'function') {
|
||||||
|
obj[ev] = func;
|
||||||
|
} else {
|
||||||
|
obj[ev] = function() {
|
||||||
|
oldev();
|
||||||
|
func();
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
/*
|
||||||
|
Behaviour v1.1 by Ben Nolan, June 2005. Based largely on the work
|
||||||
|
of Simon Willison (see comments by Simon below).
|
||||||
|
http://ripcord.co.nz/behaviour/
|
||||||
|
*/
|
||||||
|
|
||||||
|
var Behaviour = {
|
||||||
|
list : new Array,
|
||||||
|
|
||||||
|
register : function(sheet){
|
||||||
|
Behaviour.list.push(sheet);
|
||||||
|
},
|
||||||
|
|
||||||
|
init : function(){
|
||||||
|
EventHelper.register(window, 'onload', function(){
|
||||||
|
Behaviour.apply();
|
||||||
|
});
|
||||||
|
},
|
||||||
|
|
||||||
|
apply : function(){
|
||||||
|
for (h=0;sheet=Behaviour.list[h];h++){
|
||||||
|
for (selector in sheet) {
|
||||||
|
list = document.getElementsBySelector(selector);
|
||||||
|
if (!list)
|
||||||
|
continue;
|
||||||
|
for( i = 0; element = list[i]; i++ ) {
|
||||||
|
sheet[selector]( element );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
Behaviour.init();
|
||||||
|
|
||||||
|
function getAllChildren(e) {
|
||||||
|
// Returns all children of element. Workaround required for IE5/Windows. Ugh.
|
||||||
|
return e.all ? e.all : e.getElementsByTagName('*');
|
||||||
|
}
|
||||||
|
|
||||||
|
document.getElementsBySelector = function(selector) {
|
||||||
|
// Attempt to fail gracefully in lesser browsers
|
||||||
|
if (!document.getElementsByTagName) {
|
||||||
|
return new Array();
|
||||||
|
}
|
||||||
|
// Split selector in to tokens
|
||||||
|
var tokens = selector.split(' ');
|
||||||
|
var currentContext = new Array(document);
|
||||||
|
for (var i = 0; i < tokens.length; i++) {
|
||||||
|
token = tokens[i].replace(/^\s+/,'').replace(/\s+$/,'');;
|
||||||
|
if (token.indexOf('#') > -1) {
|
||||||
|
// Token is an ID selector
|
||||||
|
var bits = token.split('#');
|
||||||
|
var tag_name = bits[0];
|
||||||
|
var id = bits[1];
|
||||||
|
var element = document.getElementById(id);
|
||||||
|
if (element == null || tag_name && element.nodeName.toLowerCase() != tag_name ) {
|
||||||
|
// tag with that ID not found, return false
|
||||||
|
return new Array();
|
||||||
|
}
|
||||||
|
// Set currentContext to contain just this element
|
||||||
|
currentContext = new Array(element);
|
||||||
|
continue; // Skip to next token
|
||||||
|
}
|
||||||
|
if (token.indexOf('.') > -1) {
|
||||||
|
// Token contains a class selector
|
||||||
|
var bits = token.split('.');
|
||||||
|
var tag_name = bits[0];
|
||||||
|
var class_name = bits[1];
|
||||||
|
if (!tag_name) {
|
||||||
|
tag_name = '*';
|
||||||
|
}
|
||||||
|
// Get elements matching tag, filter them for class selector
|
||||||
|
var found = new Array;
|
||||||
|
var foundCount = 0;
|
||||||
|
for (var h = 0; h < currentContext.length; h++) {
|
||||||
|
var elements;
|
||||||
|
if (tag_name == '*') {
|
||||||
|
elements = getAllChildren(currentContext[h]);
|
||||||
|
} else {
|
||||||
|
elements = currentContext[h].getElementsByTagName(tag_name);
|
||||||
|
}
|
||||||
|
if( elements == null )
|
||||||
|
continue;
|
||||||
|
for (var j = 0; j < elements.length; j++) {
|
||||||
|
found[foundCount++] = elements[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentContext = new Array;
|
||||||
|
var currentContextIndex = 0;
|
||||||
|
for (var k = 0; k < found.length; k++) {
|
||||||
|
if (found[k].className && found[k].className.match(new RegExp("\\b"+class_name+"\\b"))) {
|
||||||
|
currentContext[currentContextIndex++] = found[k];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
continue; // Skip to next token
|
||||||
|
}
|
||||||
|
|
||||||
|
// [evgeny] code for attribute selection is removed...
|
||||||
|
|
||||||
|
if (!currentContext[0]){
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// If we get here, token is JUST an element (not a class or ID selector)
|
||||||
|
tag_name = token;
|
||||||
|
var found = new Array;
|
||||||
|
var foundCount = 0;
|
||||||
|
for (var h = 0; h < currentContext.length; h++) {
|
||||||
|
var elements = currentContext[h].getElementsByTagName(tag_name);
|
||||||
|
for (var j = 0; j < elements.length; j++) {
|
||||||
|
found[foundCount++] = elements[j];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
currentContext = found;
|
||||||
|
}
|
||||||
|
return currentContext;
|
||||||
|
};
|
||||||
|
|
||||||
|
var NodeUtils = {
|
||||||
|
|
||||||
|
getNodeValue: function(parent,name) {
|
||||||
|
var nodes = parent.getElementsByTagName( name );
|
||||||
|
if( nodes.length == 0 )
|
||||||
|
return "";
|
||||||
|
nodes = nodes[0].childNodes;
|
||||||
|
var reslt = "";
|
||||||
|
for( i = 0; i < nodes.length; i++ )
|
||||||
|
reslt += nodes[i].nodeValue;
|
||||||
|
return reslt;
|
||||||
|
},
|
||||||
|
|
||||||
|
getNodeText: function(_node) {
|
||||||
|
var _nodes = _node.childNodes;
|
||||||
|
var _text = "";
|
||||||
|
for( i = 0; i < _nodes.length; i++ )
|
||||||
|
_text += _nodes[i].nodeValue;
|
||||||
|
return _text;
|
||||||
|
},
|
||||||
|
|
||||||
|
getAttrValue: function(parent,name) {
|
||||||
|
for( k=0; k < parent.attributes.length; k++ )
|
||||||
|
if( parent.attributes[k].nodeName == name )
|
||||||
|
return parent.attributes[k].nodeValue;
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
var CommonUtils = {
|
||||||
|
getRow: function(_id,_table) {
|
||||||
|
var _row = _table.rows[_id];
|
||||||
|
if( _row != null )
|
||||||
|
return _row;
|
||||||
|
if( _table.rows['head'] != null )
|
||||||
|
return null;
|
||||||
|
|
||||||
|
for( k=0; k < _table.rows.length; k++ ) {
|
||||||
|
if( _table.rows[k].id == _id )
|
||||||
|
return _table.rows[k];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
getCell: function(_id,_row,_table) {
|
||||||
|
var _cell = _row.cells[_id];
|
||||||
|
if( _cell != null )
|
||||||
|
return _cell;
|
||||||
|
if( _table.rows['head'] != null )
|
||||||
|
return null;
|
||||||
|
for( k=0; k < _row.cells.length; k++ ) {
|
||||||
|
if( _row.cells[k].id == _id )
|
||||||
|
return _row.cells[k];
|
||||||
|
}
|
||||||
|
return null;
|
||||||
|
},
|
||||||
|
|
||||||
|
insertCell: function(_row,_id,_className,_align,_height, _inner) {
|
||||||
|
var cell = _row.insertCell(-1);
|
||||||
|
cell.id = _id;
|
||||||
|
if(_align)
|
||||||
|
cell.align = _align;
|
||||||
|
cell.className = _className;
|
||||||
|
if(_height)
|
||||||
|
cell.height = _height;
|
||||||
|
cell.innerHTML = _inner;
|
||||||
|
}
|
||||||
|
};
|
310
src/messenger/js/users.js
Normal file
310
src/messenger/js/users.js
Normal file
@ -0,0 +1,310 @@
|
|||||||
|
Ajax.PeriodicalUpdater = Class.create();
|
||||||
|
Class.inherit( Ajax.PeriodicalUpdater, Ajax.Base, {
|
||||||
|
|
||||||
|
initialize: function(_options) {
|
||||||
|
this.setOptions(_options);
|
||||||
|
this._options.onComplete = this.requestComplete.bind(this);
|
||||||
|
this._options.onException = this.handleException.bind(this);
|
||||||
|
this.frequency = (this._options.frequency || 2);
|
||||||
|
this.updater = {};
|
||||||
|
this.update();
|
||||||
|
},
|
||||||
|
|
||||||
|
handleException: function(_request, ex) {
|
||||||
|
if( this._options.handleError )
|
||||||
|
this._options.handleError( ex.name + " occured: " + ex.message );
|
||||||
|
this.stopUpdate();
|
||||||
|
this.timer = setTimeout(this.update.bind(this), this.frequency * 1000);
|
||||||
|
},
|
||||||
|
|
||||||
|
stopUpdate: function() {
|
||||||
|
if( this.updater._options )
|
||||||
|
this.updater._options.onComplete = undefined;
|
||||||
|
clearTimeout(this.timer);
|
||||||
|
},
|
||||||
|
|
||||||
|
update: function() {
|
||||||
|
if( this._options.updateParams )
|
||||||
|
this._options.parameters = (this._options.updateParams)();
|
||||||
|
this.updater = new Ajax.Request(this._options.url, this._options);
|
||||||
|
},
|
||||||
|
|
||||||
|
requestComplete: function(presponse) {
|
||||||
|
if (presponse != null && presponse.status == 200 ) {
|
||||||
|
var xmlDoc = presponse.responseXML;
|
||||||
|
(this._options.updateContent || Ajax.emptyFunction)( xmlDoc );
|
||||||
|
} else {
|
||||||
|
if( this._options.handleError )
|
||||||
|
this._options.handleError(Ajax.getError(_response));
|
||||||
|
}
|
||||||
|
|
||||||
|
this.timer = setTimeout(this.update.bind(this), this.frequency * 1000);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var HtmlGenerationUtils = {
|
||||||
|
|
||||||
|
insertSplitter: function( _row ) {
|
||||||
|
var cell = _row.insertCell(-1);
|
||||||
|
cell.style.backgroundImage = 'url('+webimRoot+'/images/tablediv3.gif)';
|
||||||
|
cell.innerHTML = '<img src="'+webimRoot+'/images/free.gif" width="3" height="1" border="0" alt="">';
|
||||||
|
},
|
||||||
|
|
||||||
|
removeHr: function(_table, _index ) {
|
||||||
|
_table.deleteRow(_index+2);
|
||||||
|
_table.deleteRow(_index+1);
|
||||||
|
_table.deleteRow(_index);
|
||||||
|
},
|
||||||
|
|
||||||
|
insertHr: function(_table, _index) {
|
||||||
|
var row = _table.insertRow(_index);
|
||||||
|
var cell = row.insertCell(-1);
|
||||||
|
cell.colSpan = 13;
|
||||||
|
cell.height = 2;
|
||||||
|
|
||||||
|
row = _table.insertRow(_index);
|
||||||
|
cell = row.insertCell(-1);
|
||||||
|
cell.colSpan = 13;
|
||||||
|
cell.style.backgroundColor = '#E1E1E1';
|
||||||
|
cell.innerHTML = '<img src="'+webimRoot+'/images/free.gif" width="1" height="1" border="0" alt="">';
|
||||||
|
|
||||||
|
row = _table.insertRow(_index);
|
||||||
|
cell = row.insertCell(-1);
|
||||||
|
cell.colSpan = 13;
|
||||||
|
cell.height = 2;
|
||||||
|
},
|
||||||
|
|
||||||
|
popupLink: function(link, title, wndid, inner, width, height) {
|
||||||
|
return '<a href="'+link+'" target="_blank" title="'+title+'" onclick="this.newWindow = window.open(\''+link+'\', \''+
|
||||||
|
wndid+'\', \'toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width='+width+',height='+height+',resizable=1\');this.newWindow.focus();this.newWindow.opener=window;return false;">'+
|
||||||
|
inner+'</a>';
|
||||||
|
},
|
||||||
|
|
||||||
|
generateOneRowTable: function(content) {
|
||||||
|
return '<table width="100%" cellspacing="0" cellpadding="0" border="0"><tr>' + content + '</tr></table>';
|
||||||
|
},
|
||||||
|
|
||||||
|
viewOpenCell: function(username,servlet,id,canview,canopen,ban,message) {
|
||||||
|
var cellsCount = 2;
|
||||||
|
var link = servlet+"?thread="+id;
|
||||||
|
var innerContent = ( ban == "full" ) ? "<i style='color:#aaaaaa;'>"+username+"</i>" : ( ( ban == "other" ) ? "<i>"+username+"</i>" : username );
|
||||||
|
var gen = '<td class="table" style="padding-left:0px; padding-right:0px;">';
|
||||||
|
gen += HtmlGenerationUtils.popupLink( canopen ? link : link+"&viewonly=true", localized[canopen ? 0 : 1], "ImCenter"+id, innerContent, 600, 420);
|
||||||
|
gen += '</td><td><img src="'+webimRoot+'/images/free.gif" width="5" height="1" border="0" alt=""></td>';
|
||||||
|
if( canopen ) {
|
||||||
|
gen += '<td width="30" align="center">';
|
||||||
|
gen += HtmlGenerationUtils.popupLink( link, localized[0], "ImCenter"+id, '<img src="'+webimRoot+'/images/tbliclspeak.gif" width="15" height="15" border="0" alt="'+localized[0]+'">', 600, 420);
|
||||||
|
gen += '</td>';
|
||||||
|
cellsCount++;
|
||||||
|
}
|
||||||
|
|
||||||
|
return HtmlGenerationUtils.generateOneRowTable(gen);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
};
|
||||||
|
|
||||||
|
Ajax.ThreadListUpdater = Class.create();
|
||||||
|
Class.inherit( Ajax.ThreadListUpdater, Ajax.Base, {
|
||||||
|
|
||||||
|
initialize: function(_options) {
|
||||||
|
this.setOptions(_options);
|
||||||
|
this._options.updateParams = this.updateParams.bind(this);
|
||||||
|
this._options.handleError = this.handleError.bind(this);
|
||||||
|
this._options.updateContent = this.updateContent.bind(this);
|
||||||
|
this._options.lastrevision = 0;
|
||||||
|
this.threadTimers = new Object();
|
||||||
|
this.delta = 0;
|
||||||
|
this.t = this._options.table;
|
||||||
|
this.periodicalUpdater = new Ajax.PeriodicalUpdater(this._options);
|
||||||
|
},
|
||||||
|
|
||||||
|
updateParams: function() {
|
||||||
|
return "company=" + this._options.company + "&since=" + this._options.lastrevision;
|
||||||
|
},
|
||||||
|
|
||||||
|
setStatus: function(msg) {
|
||||||
|
this._options.status.innerHTML = msg;
|
||||||
|
},
|
||||||
|
|
||||||
|
handleError: function(s) {
|
||||||
|
this.setStatus( s );
|
||||||
|
},
|
||||||
|
|
||||||
|
updateThread: function(node) {
|
||||||
|
var id, stateid, vstate, canview = false, canopen = false, ban = null;
|
||||||
|
|
||||||
|
for( var i = 0; i < node.attributes.length; i++ ) {
|
||||||
|
var attr = node.attributes[i];
|
||||||
|
if( attr.nodeName == "id" )
|
||||||
|
id = attr.nodeValue;
|
||||||
|
else if( attr.nodeName == "stateid" )
|
||||||
|
stateid = attr.nodeValue;
|
||||||
|
else if( attr.nodeName == "state" )
|
||||||
|
vstate = attr.nodeValue;
|
||||||
|
else if( attr.nodeName == "canopen" )
|
||||||
|
canopen = true;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
function setcell(_table, row,id,pcontent) {
|
||||||
|
var cell = CommonUtils.getCell( id, row, _table );
|
||||||
|
if( cell )
|
||||||
|
cell.innerHTML = pcontent;
|
||||||
|
}
|
||||||
|
|
||||||
|
var row = CommonUtils.getRow("thr"+id, this.t);
|
||||||
|
if( stateid == "closed" ) {
|
||||||
|
if( row ) {
|
||||||
|
HtmlGenerationUtils.removeHr(this.t, row.rowIndex+1);
|
||||||
|
this.t.deleteRow(row.rowIndex);
|
||||||
|
}
|
||||||
|
this.threadTimers[id] = null;
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
var vname = NodeUtils.getNodeValue(node,"name");
|
||||||
|
var vaddr = NodeUtils.getNodeValue(node,"addr");
|
||||||
|
var vtime = NodeUtils.getNodeValue(node,"time");
|
||||||
|
var agent = NodeUtils.getNodeValue(node,"agent");
|
||||||
|
var modified = NodeUtils.getNodeValue(node,"modified");
|
||||||
|
var message = NodeUtils.getNodeValue(node,"message");
|
||||||
|
var etc = "";
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
var startRow = CommonUtils.getRow(stateid, this.t);
|
||||||
|
var endRow = CommonUtils.getRow(stateid+"end", this.t);
|
||||||
|
|
||||||
|
if( row != null && (row.rowIndex <= startRow.rowIndex || row.rowIndex >= endRow.rowIndex ) ) {
|
||||||
|
HtmlGenerationUtils.removeHr(this.t, row.rowIndex+1);
|
||||||
|
this.t.deleteRow(row.rowIndex);
|
||||||
|
this.threadTimers[id] = null;
|
||||||
|
row = null;
|
||||||
|
}
|
||||||
|
if( row == null ) {
|
||||||
|
row = this.t.insertRow(startRow.rowIndex+1);
|
||||||
|
HtmlGenerationUtils.insertHr(this.t, startRow.rowIndex+2);
|
||||||
|
row.id = "thr"+id;
|
||||||
|
this.threadTimers[id] = new Array(vtime,modified,stateid);
|
||||||
|
CommonUtils.insertCell(row, "name", "table", null, 30, HtmlGenerationUtils.viewOpenCell(vname,this._options.agentservl,id,canview,canopen,ban,message) );
|
||||||
|
HtmlGenerationUtils.insertSplitter(row);
|
||||||
|
CommonUtils.insertCell(row, "contid", "table", "center", null, vaddr );
|
||||||
|
HtmlGenerationUtils.insertSplitter(row);
|
||||||
|
CommonUtils.insertCell(row, "state", "table", "center", null, vstate );
|
||||||
|
HtmlGenerationUtils.insertSplitter(row);
|
||||||
|
CommonUtils.insertCell(row, "op", "table", "center", null, agent );
|
||||||
|
HtmlGenerationUtils.insertSplitter(row);
|
||||||
|
CommonUtils.insertCell(row, "time", "table", "center", null, this.getTimeSince(vtime) );
|
||||||
|
HtmlGenerationUtils.insertSplitter(row);
|
||||||
|
CommonUtils.insertCell(row, "wait", "table", "center", null, (stateid!='chat' ? this.getTimeSince(modified) : '-') );
|
||||||
|
HtmlGenerationUtils.insertSplitter(row);
|
||||||
|
CommonUtils.insertCell(row, "etc", "table", "center", null, etc );
|
||||||
|
|
||||||
|
if( stateid == 'wait' || stateid == 'prio' )
|
||||||
|
return true;
|
||||||
|
} else {
|
||||||
|
this.threadTimers[id] = new Array(vtime,modified,stateid);
|
||||||
|
setcell(this.t, row,"name",HtmlGenerationUtils.viewOpenCell(vname,this._options.agentservl,id,canview,canopen,ban,message));
|
||||||
|
setcell(this.t, row,"contid",vaddr);
|
||||||
|
setcell(this.t, row,"state",vstate);
|
||||||
|
setcell(this.t, row,"op",agent);
|
||||||
|
setcell(this.t, row,"time",this.getTimeSince(vtime));
|
||||||
|
setcell(this.t, row,"wait",(stateid!='chat' ? this.getTimeSince(modified) : '-'));
|
||||||
|
setcell(this.t, row,"etc",etc);
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
},
|
||||||
|
|
||||||
|
updateQueueMessages: function() {
|
||||||
|
function updateQueue(t,id,nclients) {
|
||||||
|
var startRow = t.rows[id];
|
||||||
|
var endRow = t.rows[id+"end"];
|
||||||
|
if( startRow == null || endRow == null )
|
||||||
|
return;
|
||||||
|
var _status = endRow.cells["status"];
|
||||||
|
if( _status == null )
|
||||||
|
return;
|
||||||
|
_status.innerHTML = (startRow.rowIndex + 1 == endRow.rowIndex) ? nclients : "";
|
||||||
|
_status.height = (startRow.rowIndex + 1 == endRow.rowIndex) ? 30 : 10;
|
||||||
|
}
|
||||||
|
|
||||||
|
updateQueue(this.t, "wait", this._options.noclients);
|
||||||
|
updateQueue(this.t, "prio", this._options.noclients);
|
||||||
|
updateQueue(this.t, "chat", this._options.noclients);
|
||||||
|
},
|
||||||
|
|
||||||
|
getTimeSince: function(srvtime) {
|
||||||
|
var secs = Math.floor(((new Date()).getTime()-srvtime-this.delta)/1000);
|
||||||
|
var minutes = Math.floor(secs/60);
|
||||||
|
var prefix = "";
|
||||||
|
secs = secs % 60;
|
||||||
|
if( secs < 10 )
|
||||||
|
secs = "0" + secs;
|
||||||
|
if( minutes >= 60 ) {
|
||||||
|
var hours = Math.floor(minutes/60);
|
||||||
|
minutes = minutes % 60;
|
||||||
|
if( minutes < 10 )
|
||||||
|
minutes = "0" + minutes;
|
||||||
|
prefix = hours + ":";
|
||||||
|
}
|
||||||
|
|
||||||
|
return prefix + minutes+":"+secs;
|
||||||
|
},
|
||||||
|
|
||||||
|
updateTimers: function() {
|
||||||
|
for (var i in this.threadTimers) {
|
||||||
|
if (this.threadTimers[i] != null) {
|
||||||
|
var value = this.threadTimers[i];
|
||||||
|
var row = CommonUtils.getRow("thr"+i, this.t);
|
||||||
|
if( row != null ) {
|
||||||
|
function setcell(_table, row,id,pcontent) {
|
||||||
|
var cell = CommonUtils.getCell( id, row, _table );
|
||||||
|
if( cell )
|
||||||
|
cell.innerHTML = pcontent;
|
||||||
|
}
|
||||||
|
setcell(this.t, row,"time",this.getTimeSince(value[0]));
|
||||||
|
setcell(this.t, row,"wait",(value[2]!='chat' ? this.getTimeSince(value[1]) : '-'));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
updateContent: function(xmldoc) {
|
||||||
|
var root = xmldoc.documentElement;
|
||||||
|
var newAdded = false;
|
||||||
|
if( root.tagName == 'threads' ) {
|
||||||
|
var _time = NodeUtils.getAttrValue(root, "time");
|
||||||
|
var _revision = NodeUtils.getAttrValue(root, "revision" );
|
||||||
|
|
||||||
|
if( _time )
|
||||||
|
this.delta = (new Date()).getTime() - _time;
|
||||||
|
if( _revision )
|
||||||
|
this._options.lastrevision = _revision;
|
||||||
|
|
||||||
|
for( var i = 0; i < root.childNodes.length; i++ ) {
|
||||||
|
var node = root.childNodes[i];
|
||||||
|
if( node.tagName == 'thread' )
|
||||||
|
if( this.updateThread(node) )
|
||||||
|
newAdded = true;
|
||||||
|
}
|
||||||
|
this.updateQueueMessages();
|
||||||
|
this.updateTimers();
|
||||||
|
this.setStatus( "Up to date" );
|
||||||
|
if( newAdded )
|
||||||
|
window.focus();
|
||||||
|
} else if( root.tagName == 'error' ) {
|
||||||
|
this.setStatus( "error: " + NodeUtils.getNodeValue(root,"descr") );
|
||||||
|
} else {
|
||||||
|
this.setStatus( "wrong response" );
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
var webimRoot = "";
|
||||||
|
|
||||||
|
EventHelper.register(window, 'onload', function(){
|
||||||
|
webimRoot = updaterOptions.wroot;
|
||||||
|
new Ajax.ThreadListUpdater(({table:$("threadlist"),status:$("connstatus")}).extend(updaterOptions || {}));
|
||||||
|
});
|
||||||
|
|
Loading…
Reference in New Issue
Block a user