// Instant Messenger // im_functions.js function IM() { this.array_lang_im = new Array(); this.array_users = new Array(); this.vcard_user = new Array(); this.load_photo = false; } /* * Load Contatos */ IM.prototype.load_im = function() { var force = ( arguments.length ) ? true : false; var _this = this; Sincro.count = 0; var handler_contacts = function(data) { if ( data[1] ) { _this.array_users.splice(0,_this.array_users.length); _this.array_users = data; _this.mount_list(data); } _this.conf_VcardUser(data[0]); } if ( force || this.getWinContactsState() ) cIM.cExecute("$this.Ujabber.list_user",handler_contacts); } /* * Update Contatos */ IM.prototype.UpdateContacts = function() { var _this = this; _this.load_im(); } IM.prototype.showContacts = function() { if ( this.getWinContactsState() ) im_win.windowClose('contacts_im'); else { im_win.windowMaximizeRestore('contacts_im'); this.load_im(); } } IM.prototype.getWinContactsState = function() { try { var win_state = false; win_state = ( windowItems['contacts'].state == WINDOW_STATE_REGULAR ) ? true : false; win_state = ( win_state ) ? win_state : ( windowItems['contacts'].state == WINDOW_STATE_MAXIMIZED ) ? true : false; return win_state; } catch(e) { return false; } } /* * Monta Lista de Contatos */ IM.prototype.mount_list = function(pList) { var _this = this; var div = document.getElementById("div_contacts"); div.innerHTML = ""; div.innerHTML += '' + ''+_this.get_lang('list of contacts') + ' - ' + ( pList.length - 1 ) + '
' + '
'; for(var i=1; i < pList.length; i++){ var div_agroups = document.getElementById("all_groups"); if(document.getElementById("img_" + pList[i].group.rm_space()) == null ){ div_agroups.innerHTML += ''; div_agroups.innerHTML += '' + pList[i].group + '
'; if(pList[i].group.rm_space() != 'sem_grupo'){ var div_group = document.createElement('DIV'); div_group.id = pList[i].group.rm_space(); if(pList[i].subscription.rm_space() == "both") div_group.innerHTML = '
' + pList[i].name + '
'; else div_group.innerHTML = '
' + pList[i].name + '
'; div_agroups.appendChild(div_group); }else{ var div_group = document.createElement('DIV'); div_group.id = pList[i].group.rm_space(); div_group.innerHTML = '
'+ ''+pList[i].jid+'
'; div_agroups.appendChild(div_group); } }else{ if(pList[i].group.rm_space() != 'sem_grupo'){ var div_group = document.getElementById(pList[i].group.rm_space()); if(pList[i].subscription.rm_space() == "both") div_group.innerHTML += '
' + pList[i].name + '
'; else div_group.innerHTML = '
' + pList[i].name + '
'; div_agroups.appendChild(div_group); }else{ var div_group = document.getElementById(pList[i].group.rm_space()); div_group.innerHTML += '
'+ ''+pList[i].jid+'
'; div_agroups.appendChild(div_group); } } } setTimeout("Templates.Users_Not_Auth()",2500); } /* * Requisitar autorização; */ IM.prototype.Authorization = function(pJid,pSubscription) { if(confirm("Enviar pedido?")){ var handler_accept_request = function(data){ if(!data) alert("Pedido já foi enviado!"); } cIM.cExecute("$this.Ujabber.AcceptRequest",handler_accept_request,"jid="+pJid+"&subscription="+pSubscription); } } /* * Grupos dos Contatos; */ IM.prototype.visible_group = function(el) { var _this = this; el = el.rm_space(); var div = document.getElementById(el); div.style.display = "none"; var img = document.getElementById("img_" + el); img.onclick = function(){_this.unvisible_group(el)}; img.src = img_group_close.src; } IM.prototype.unvisible_group = function(el) { var _this = this; el = el.rm_space(); var div = document.getElementById(el); div.style.display = ""; var img = document.getElementById("img_" + el); img.onclick = function(){_this.visible_group(el)}; img.src = img_group_open.src; } /* * Conf. Vcard */ IM.prototype.conf_VcardUser = function(data) { var _this = this; // Vcard pessoal; if ( !_this.load_photo ){ _this.vcard_user['VCARD_FN'] = decodeURI(data.VCARD_FN); _this.vcard_user['VCARD_NICKNAME'] = decodeURI(data.VCARD_NICKNAME); _this.vcard_user['VCARD_ORGNAME'] = decodeURI(data.VCARD_ORGNAME); _this.vcard_user['VCARD_ORGUNIT'] = decodeURI(data.VCARD_ORGUNIT); _this.vcard_user['VCARD_ROLE'] = decodeURI(data.VCARD_ROLE); _this.vcard_user['VCARD_BDAY'] = decodeURI(data.VCARD_BDAY); _this.vcard_user['VCARD_DESC'] = decodeURI(data.VCARD_DESC); _this.vcard_user['VCARD_JID'] = decodeURI(data.VCARD_JID); im_win.get_photo_ldap(decodeURI(data['VCARD_JID'])); _this.load_photo = true; } // NickName; if(_this.vcard_user['VCARD_NICKNAME'] != "") document.getElementById('span_nickname').innerHTML = " " + _this.vcard_user['VCARD_NICKNAME'].substring(0,30) + ""; else document.getElementById('span_nickname').innerHTML = " " + IM.get_lang('your nickname') + ""; // Custom Message; if(_this.vcard_user['VCARD_DESC'] != "") document.getElementById('span_message').innerHTML = " " + _this.vcard_user['VCARD_DESC'].substring(0,30) + ""; else document.getElementById('span_message').innerHTML = " " + IM.get_lang('your message') + ""; } /* * Menu */ IM.prototype.visible_box = function() { var _this = this; document.getElementById('list_users').style.display = ""; var img = document.getElementById('box_menu'); img.onclick = function(){_this.unvisible_box()}; img.src = img_open_box.src; } IM.prototype.unvisible_box = function() { var _this = this; document.getElementById('list_users').style.display = "none"; var img = document.getElementById('box_menu'); img.onclick = function(){_this.visible_box()}; img.src = img_close_box.src; } /* * Traduções */ // Translate words and phrases using user language from eGroupware. IM.prototype.get_lang = function(_key,_arg1,_arg2,_arg3,_arg4) { var _this = this; if(!_this.array_lang_im[0]){ return _key+"*"; } _value = ""; for(i = 0; i < _this.array_lang_im[0].length;i++){ if(_this.array_lang_im[0][i] == _key.toLowerCase()) { _value = _this.array_lang_im[1][i]; break; } } if(!_value) return _key+"*"; if(_arg1 || _arg2 ||_arg3 || _arg4) { for(j = 1; j <= 4; j++){ if(eval("_arg"+j)) { var regExp = new RegExp("%"+j+""); _value = _value.replace(regExp,eval("_arg"+j)); } } } return _value; } /* * Pega Mensagens */ IM.prototype.getMessage = function() { _this = this; var handler_message = function(data) { if(data.length > 0) { var aux = ""; var hora = new Date(); for(var i=0; i < data.length; i++) { mensagens = document.getElementById(data[i].from.substr(0, data[i].from.indexOf('/')) + '_chatMessages'); var nickname = data[i].from.substr(0, data[i].from.indexOf('/')); for(var j=1 ; j < _this.array_users.length ; j++) { var nick_user = decodeURI(_this.array_users[j].VCARD_JID); if( nickname.rm_space() == nick_user.rm_space()) { var vcard_nick = decodeURI(_this.array_users[j].VCARD_NICKNAME); if( vcard_nick != "") { nickname = vcard_nick; if(nickname.rm_space() == decodeURI(_this.array_users[j].VCARD_NICKNAME)) nickname = nickname; else nickname = decodeURI(_this.array_users[j].VCARD_NICKNAME); } } } minuto = ( hora.getMinutes() > 9 ) ? hora.getMinutes() : '0' + hora.getMinutes(); _hora = '[' + hora.getHours() + ':' + minuto + '] '; data[i].body = decodeURI(data[i].body).replace(/\\\'/g, '\''); if ( mensagens ) { mensagens.innerHTML += '' + _hora + nickname + ' fala:
' + _this.emotions_icons(data[i].body) + '
'; if ( windowItems[data[i].from.substr(0, data[i].from.indexOf('/'))].state != WINDOW_STATE_REGULAR && windowItems[data[i].from.substr(0, data[i].from.indexOf('/'))].state != WINDOW_STATE_MAXIMIZED ) im_win.showWindowItem(data[i].from.substr(0, data[i].from.indexOf('/'))); } else { im_win.open_chat(data[i].from.substr(0, data[i].from.indexOf('/'))); mensagens = document.getElementById(data[i].from.substr(0, data[i].from.indexOf('/')) + '_chatMessages'); mensagens.innerHTML += '' + _hora + nickname + ' fala:
' + _this.emotions_icons(data[i].body) + '
'; } } mensagens.scrollTop = mensagens.scrollHeight; im_win.newMessageNotification(); } } cIM.cExecute("$this.Ujabber.getMessages", handler_message); } /* * Envia Mensagens */ IM.prototype.sendMessage = function (pJID) { var _this = this; var name_document = document.getElementById(pJID + '_edita'); var envio = name_document.contentWindow.document.getElementsByTagName('body').item(0); envio.innerHTML = func.trim(envio.innerHTML.replace(/^( |
| )*|( |
| )*$/g, '')); if ( envio.innerHTML != "" ) { var message_text = "
"; message_text += envio.innerHTML + "
"; envio.innerHTML = ''; var message_element = document.getElementById(pJID + '_chatMessages'); message_element.innerHTML += '' + ((_this.vcard_user['VCARD_NICKNAME'] != "") ? _this.vcard_user['VCARD_NICKNAME'] : _this.vcard_user['VCARD_JID'] ); message_element.innerHTML += ' ' + _this.get_lang('speak') + ':
'; message_element.innerHTML += _this.emotions_icons(message_text.replace(/^( |
| )*|( |
| )*$/g, '')) + '
'; message_element.scrollTop = message_element.scrollHeight; var handler_sendMessage = function(data) { if(!data) alert(data); } cIM.cExecute("$this.Ujabber.SendMessage",handler_sendMessage,"to="+pJID+"&body="+url_encode(encodeURI(message_text))); } } /* * Smiles */ IM.prototype.emotions_icons = function(pMessage) { for ( i = 1; i < cod_emotions.length; i++ ) { var image = eval('smile_' + i + '.src.substr(smile_' + i + '.src.indexOf(im_path))') pMessage = pMessage.replace(cod_emotions[i], ''); } return pMessage; } IM.prototype.atalho = function() { if ( local = func.byId('user_info') ) { var aux = new Array(); var _mix = func.newEl('a', 'a', 'img', 'img', 'dl'); var fast_menu_link = _mix[0]; var contacts_link = _mix[1]; var fast_menu_image = _mix[2]; var contacts_image = _mix[3]; var im_fast_menu = _mix[4]; fast_menu_link.onclick = function(){IM.showFastMenu();}; contacts_link.onclick = function(){IM.showContacts();}; aux['fast_menu_image'] = new Array(); aux['fast_menu_image']['element'] = fast_menu_image; aux['fast_menu_image']['style'] = 'width:9px;height:9px'; aux['fast_menu_image']['src'] = im_path + 'templates/default/images/menuarwopen.gif'; aux['im_fast_menu'] = new Array(); aux['im_fast_menu']['element'] = im_fast_menu; aux['im_fast_menu']['id'] = 'fast_menu_im'; aux['im_fast_menu']['class'] = 'menu_im'; aux['contacts_image'] = new Array(); aux['contacts_image']['element'] = contacts_image; aux['contacts_image']['id'] = 'chat_bubble'; aux['contacts_image']['src'] = im_path + 'templates/default/images/navbar.png'; aux['contacts_image']['style'] = 'width:15px;height:15px'; func.confEl(aux); func.insEl(fast_menu_image, fast_menu_link); func.insEl(contacts_image, contacts_link); func.insElB(fast_menu_link, contacts_link, im_fast_menu, document.createTextNode(' '), local.firstChild); } else setTimeout('IM.atalho()', 5000); } IM.prototype.showFastMenu = function() { if ( !messages_timeout ) { var option = func.newEl('dt'); var option_link = func.newEl('a'); var option_image = func.newEl('img'); option_link.onclick = function(){IM.login();}; func.confEl(option_image, 'src', img_online.src); func.confEl(option_image, 'style', 'width:16px;height:16px;'); func.insEl(option_image, IM.get_lang('login'), option_link); func.insEl(option_link, option); im_menu_action.menu('fast_menu_im', option); } else { var _dt = func.newEl('dt', 'dt', 'dt', 'dt', 'dt'); var _a = func.newEl('a', 'a', 'a', 'a', 'a'); for ( var i in _dt ) { if ( typeof _dt[i] == 'function' ) continue; eval('var option' + (parseInt(i)+1) + ' = _dt[' + i + '];'); eval('var option' + (parseInt(i)+1) + '_link = _a[' + i + '];'); } var _img = func.newEl('img', 'img', 'img', 'img'); for ( var i in _img ) { if ( typeof _dt[i] == 'function' ) continue; eval('var option' + (parseInt(i)+1) + '_image = _img[' + i + '];'); } option1_link.onclick = function(){IM.setStatus('online');}; option2_link.onclick = function(){IM.setStatus('idle');}; option3_link.onclick = function(){IM.setStatus('busy');}; option4_link.onclick = function(){IM.logout();}; option5_link.onclick = function(){IM.setStatus('custom')}; func.confEl(option1_image, 'src', img_online.src); func.confEl(option1_image, 'style', 'width:16px;height:16px;'); func.confEl(option2_image, 'src', img_idle.src); func.confEl(option2_image, 'style', 'width:16px;height:16px;'); func.confEl(option3_image, 'src', img_busy.src); func.confEl(option3_image, 'style', 'width:16px;height:16px;'); func.confEl(option4_image, 'src', img_offline.src); func.confEl(option4_image, 'style', 'width:16px;height:16px;'); func.insEl(option1_image, IM.get_lang('online'), option1_link); func.insEl(option1_link, option1); func.insEl(option2_image, IM.get_lang('????'), option2_link); func.insEl(option2_link, option2); func.insEl(option3_image, IM.get_lang('busy'), option3_link); func.insEl(option3_link, option3); func.insEl(option4_image, IM.get_lang('offline'), option4_link); func.insEl(option4_link, option4); func.insEl(IM.get_lang('Custom message...'), option5_link); func.insEl(option5_link, option5); im_menu_action.menu('fast_menu_im', option1, option2, option3, option4, option5); } } IM.prototype.setStatus = function(pStatus) { im_menu_action.menu('fast_menu_im', null); } IM.prototype.getStatus = function() { } IM.prototype.login = function() { try { im_menu_action.menu('fast_menu_im', null); Sincro.get_list(); Sincro.get_Message(); var contacts_image = func.byId('chat_bubble'); contacts_image.parentNode.onclick = function(){IM.showContacts()}; func.confEl(contacts_image, 'src', im_path + 'templates/default/images/navbar.png'); } catch (e) { } } IM.prototype.logout = function() { im_menu_action.menu('fast_menu_im', null); clearTimeout(messages_timeout); clearTimeout(contacts_timeout); messages_timeout = false; contacts_timeout = false; var contacts_image = func.byId('chat_bubble'); contacts_image.parentNode.onclick = function(){IM.showFastMenu()}; func.confEl(contacts_image, 'src', img_chat_bubble.src); } IM.prototype.menu_preferences = function(pElement) { if ( document.getElementById(pElement).innerHTML == "" ) { var form_pref = "
"; form_pref += "
"; form_pref += " "+IM.get_lang('Add Contact')+"
"; form_pref += "
"; form_pref += " "+IM.get_lang('Remove Contact')+"
"; form_pref += "
"; form_pref += " "+IM.get_lang('Information')+"
"; form_pref += "
"; im_menu_action.menu(pElement, form_pref); } } IM.prototype.menu_button_right = function(pElement,pReq) { var form_menu_button_right = '
'; if(pReq) { form_menu_button_right += '
' + IM.get_lang('Authorization') + ''; } form_menu_button_right += '
' + IM.get_lang('Nick') + ''+ '
' + IM.get_lang('Send File') + ''+ '
' + IM.get_lang('Group') + ''+ '
' + IM.get_lang('Delete') + ''+ '
' + IM.get_lang('See Info') + ''+ '
'; im_menu_action.menu("_span_" + pElement, form_menu_button_right); } /* * url_encode */ function url_encode(str) { var hex_chars = "0123456789ABCDEF"; var noEncode = /^([a-zA-Z0-9\_\-\.])$/; var n, strCode, hex1, hex2, strEncode = ""; for( n = 0; n < str.length; n++ ) { if ( noEncode.test(str.charAt(n)) ) { strEncode += str.charAt(n); } else { strCode = str.charCodeAt(n); hex1 = hex_chars.charAt(Math.floor(strCode / 16)); hex2 = hex_chars.charAt(strCode % 16); strEncode += "%" + (hex1 + hex2); } } return strEncode; } /* * Ação do botão onclick da lista de contatos; */ IM.prototype.action_button = function(pEv,pStatus,pJid,pReq) { var _this = this; if(pEv.button > 1){ _this.menu_button_right(pJid,pReq); document.oncontextmenu = new Function("return false"); }else{ if(pStatus == parseInt(1)) _this.open_chat(pJid); } } /* * Abre Conversa */ IM.prototype.open_chat = function(pJID) { func.byId(pJID).firstChild.src = img_chat_bubble.src; im_win.open_chat(pJID); } String.prototype.rm_space = function() { return this.replace(/( *)/g,""); } IM.prototype.LTrim = function(value) { var w_space = String.fromCharCode(32); var strTemp = ""; var iTemp = 0; if(v_length < 1) return ""; var v_length = value ? value.length : 0; while ( iTemp < v_length ) { if ( value && value.charAt(iTemp) != w_space ) { strTemp = value.substring(iTemp,v_length); break; } iTemp++; } return strTemp; } // Build Object var IM = new IM();