/**
* @preserve This file is part of Mibew Messenger project.
* http://mibew.org
*
* Copyright (c) 2005-2011 Mibew Messenger Community
* License: http://mibew.org/license.php
*/
var FrameUtils = {
options: {},
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 {
return null;
}
},
initFrame: function(frm) {
var doc = this.getDocument(frm);
doc.open();
doc.write("
");
if (this.options.cssfile) {
doc.write("");
}
doc.write("");
doc.write("");
doc.write("");
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') {
try {
frm.contentWindow.scrollTo(0,this.getDocument(frm).getElementById('content').clientHeight);
} catch(e) {}
}
if (vbottom) {
vbottom.scrollIntoView(false);
}
}
};
ChatView = Class.create();
ChatView.prototype = {
/**
* Status timeout identifier
* @type Number
* @private
*/
statusTimeout: null,
/**
* Contains localized strings. Properties names are language key and
* properties values are localized strings
* @type Object
*/
localizedStrings: {},
/**
* Contains predefined answers configurable from administrative interface
* @type Array
*/
predefinedAnswers: [],
/**
* Messages container DOM element
* @type Object
*/
messageContainer: null,
/**
* Create an instance of ChatView
* @constructor
*/
initialize: function(localizedStrings, predefinedAnswers) {
this.localizedStrings = localizedStrings || {};
this.predefinedAnswers = predefinedAnswers || [];
this.messageContainer = (myRealAgent == 'safari')
? self.frames[0]
: $("chatwnd");
FrameUtils.initFrame(this.messageContainer);
},
/**
* Get localized string by language key
* @param {String} key Language key
* @returns {Boolean|String} Returns boolean FALSE if string with specified
* key is undefined and localized string otherwise
*/
getLocaleString: function(key) {
if (typeof this.localizedStrings[key] == 'undefined') {
return false;
}
return this.localizedStrings[key];
},
/**
* Enables or disables input field
* @param {Boolean} val Use boolean true for enable input and false
* otherwise
*/
enableInput: function(val) {
var message = $('msgwnd');
if (message) {
message.disabled = !val;
}
},
/**
* Clear message input element and set focus to it
*/
clearInput: function() {
var message = $('msgwnd');
if(message) {
message.value = '';
message.focus();
}
},
/**
* Displays status div and sets the status string into it
* @param {String} k Status string
*/
showStatusDiv: function(k) {
if ($("engineinfo")) {
$("engineinfo").style.display = 'inline';
$("engineinfo").innerHTML = k;
}
},
/**
* Sets the status
* @param {String} k Status string
*/
setStatus: function(k) {
if (this.statusTimeout) {
clearTimeout(this.statusTimeout);
}
this.showStatusDiv(k);
this.statusTimeout = setTimeout(this.clearStatus.bind(this), 4000);
},
/**
* Hide the status string
*/
clearStatus: function() {
$("engineinfo").style.display='none';
},
/**
* Displays typing status
* @param {Boolean} istyping Indicates the other side of conversation is
* typing a message or not
*/
showTyping: function(istyping) {
if( $("typingdiv") ) {
$("typingdiv").style.display = istyping ? 'inline' : 'none';
}
},
/**
* Updates operator's avatar
* @param {String} root Base path
* @param {String} imageLink New avatar URL
*/
updateAvatar: function(root, imageLink) {
var avatar = "";
if (imageLink != "") {
avatar = '
' +
'
';
}
$("avatarwnd").innerHTML = avatar;
},
/**
* Display all messages at the message window
* @param {Array} messages Messages array
*/
displayMessages: function(messages) {
// Output messages
for (var i = 0; i < messages.length; i++) {
this.outputMessage(messages[i]);
}
// There are some new messages
if (messages.length > 0) {
FrameUtils.scrollDown(this.messageContainer);
}
},
/**
* Add message to the message window
* @param {String} message HTML message to insert
* @private
*/
outputMessage: function(message) {
FrameUtils.insertIntoFrame(this.messageContainer, message);
},
/**
* Show new user name input
*/
showNameField: function() {
$('changename1').style.display='inline';
$('changename2').style.display='none';
},
/**
* Hide new user name input
*/
hideNameField: function() {
$('changename1').style.display='none';
$('changename2').style.display='inline';
},
/**
* Update user name in chat window
* @param {String} name New user's name
*/
updateUserName: function(name) {
$('unamelink').innerHTML = htmlescape(name);
},
/**
* Change sound button state.
*
* @param {Boolean} enable TRUE if sound enabled and FALSE otherwise
*/
changeSoundButtonState: function(enable) {
var tsound = $('soundimg');
if (enable) {
tsound.className = "tplimage isound";
} else {
tsound.className = "tplimage inosound";
}
var messagePane = $('msgwnd');
if(messagePane) {
messagePane.focus();
}
},
/**
* Add predefined answer to message input element and set focus to it.
*
* @param {Number} answerIndex Index of predefined answer
*/
displayPredefinedAnswer: function(answerIndex) {
var message = $('msgwnd');
message.value = this.predefinedAnswers[answerIndex];
message.focus();
},
/**
* Set selectedIndex property of the select box DOM element passed as
* argument to zero.
* @param {Object} elem Select box DOM element
*/
resetSelectedIndex: function(elem) {
elem.selectedIndex = 0;
}
}