@ -0,0 +1,38 @@
|
||||
cmake_minimum_required(VERSION 3.13)
|
||||
project(conversations)
|
||||
message(STATUS "Initiating compile using CMake ${CMAKE_VERSION}")
|
||||
|
||||
set(VERSION_MAJOR "1")
|
||||
set(VERSION_MINOR "1")
|
||||
set(VERSION_REVISION "0")
|
||||
|
||||
# add `cmake` directory as cmake module path
|
||||
list(INSERT CMAKE_MODULE_PATH 0 "${CMAKE_SOURCE_DIR}/cmake")
|
||||
|
||||
set(THREADS_PREFER_PTHREAD_FLAG ON)
|
||||
|
||||
include(VersionConversations)
|
||||
|
||||
set(CMAKE_CXX_STANDARD 14)
|
||||
include(FindCcache)
|
||||
include(CheckIncludeFiles)
|
||||
include(CheckFunctionExists)
|
||||
#include(CheckSymbolExists)
|
||||
|
||||
# Find X11
|
||||
if (NOT CMAKE_BUILD_TYPE STREQUAL "Debug")
|
||||
set(CMAKE_SKIP_RPATH ON)
|
||||
endif()
|
||||
|
||||
find_package(X11 REQUIRED)
|
||||
message(STATUS "X11_FOUND = ${X11_FOUND}")
|
||||
message(STATUS "X11_INCLUDE_DIR = ${X11_INCLUDE_DIR}")
|
||||
message(STATUS "X11_LIBRARIES = ${X11_LIBRARIES}")
|
||||
|
||||
include_directories(${X11_INCLUDE_DIR})
|
||||
link_directories(${X11_LIBRARIES})
|
||||
|
||||
# Find pthread
|
||||
find_package(Threads REQUIRED)
|
||||
|
||||
add_subdirectory(src)
|
@ -0,0 +1,23 @@
|
||||
## Conversations
|
||||
|
||||
op maemo:
|
||||
```
|
||||
sudo apt install -y libqt5svg5-dev en nog wat meer dingen
|
||||
```
|
||||
|
||||
Als user (uid 1000) anders gaat 'ie zeuren :P
|
||||
|
||||
```bash
|
||||
cmake -Bbuild .
|
||||
make -Cbuild -j2
|
||||
./build/bin/conversations
|
||||
```
|
||||
|
||||
### remote debug (dev)
|
||||
|
||||
Since we run as root we need env. variables:
|
||||
|
||||
```
|
||||
QTWEBENGINE_DISABLE_SANDBOX=1
|
||||
DISPLAY=:0.0
|
||||
```
|
@ -0,0 +1,80 @@
|
||||
set(CMAKE_AUTOMOC ON)
|
||||
set(CMAKE_AUTORCC ON)
|
||||
set(CMAKE_AUTOUIC ON)
|
||||
|
||||
# PNG
|
||||
find_package(ZLIB REQUIRED)
|
||||
find_package(PNG REQUIRED)
|
||||
|
||||
# the source files
|
||||
file(GLOB SOURCE_FILES
|
||||
"*.h"
|
||||
"*.cpp"
|
||||
"lib/*.h"
|
||||
"lib/*.cpp"
|
||||
)
|
||||
|
||||
find_package(Qt5 REQUIRED COMPONENTS Core Widgets Gui Network Svg Xml WebEngineWidgets WebChannel)
|
||||
|
||||
qt5_add_resources(RESOURCES assets.qrc assets/images/flags/flags.qrc)
|
||||
|
||||
set(EXECUTABLE_FLAG)
|
||||
|
||||
add_executable(conversations ${EXECUTABLE_FLAG} main.cpp
|
||||
${SOURCE_FILES}
|
||||
${RESOURCES}
|
||||
)
|
||||
|
||||
set_property(TARGET conversations PROPERTY RUNTIME_OUTPUT_DIRECTORY "${CMAKE_BINARY_DIR}/bin")
|
||||
|
||||
target_include_directories(conversations PUBLIC ${Qt5Gui_PRIVATE_INCLUDE_DIRS})
|
||||
|
||||
target_include_directories(conversations PUBLIC
|
||||
${CMAKE_SOURCE_DIR}/src
|
||||
${X11_INCLUDE_DIR}
|
||||
${CMAKE_CURRENT_SOURCE_DIR}
|
||||
${Qt5Core_INCLUDE_DIRS}
|
||||
${Qt5Widgets_INCLUDE_DIRS}
|
||||
${Qt5Gui_INCLUDE_DIRS}
|
||||
${Qt5Network_INCLUDE_DIRS}
|
||||
${Qt5Svg_INCLUDE_DIRS}
|
||||
${Qt5Xml_INCLUDE_DIRS}
|
||||
)
|
||||
|
||||
add_definitions(${QT_DEFINITIONS})
|
||||
if(NOT "${CMAKE_BUILD_TYPE}" EQUAL "Debug")
|
||||
add_definitions(-DQT_NO_DEBUG)
|
||||
endif()
|
||||
|
||||
target_compile_definitions(conversations
|
||||
PUBLIC
|
||||
${Qt5Core_DEFINITIONS}
|
||||
${Qt5Widgets_DEFINITIONS}
|
||||
${Qt5Gui_DEFINITIONS}
|
||||
${Qt5Network_DEFINITIONS}
|
||||
${Qt5Svg_DEFINITIONS}
|
||||
${Qt5Xml_DEFINITIONS}
|
||||
)
|
||||
|
||||
set(CMAKE_CXX_FLAGS "${CMAKE_CXX_FLAGS} ${Qt5Widgets_EXECUTABLE_COMPILE_FLAGS}")
|
||||
|
||||
target_link_libraries(conversations PUBLIC
|
||||
${CMAKE_DL_LIBS}
|
||||
Qt5::Core
|
||||
Qt5::Widgets
|
||||
Qt5::Gui
|
||||
Qt5::Network
|
||||
Qt5::Svg
|
||||
Qt5::Xml
|
||||
Qt5::WebEngineWidgets
|
||||
Qt5::WebChannel
|
||||
Threads::Threads
|
||||
)
|
||||
|
||||
if(X11_FOUND)
|
||||
target_link_libraries(conversations PUBLIC ${X11_LIBRARIES})
|
||||
endif()
|
||||
|
||||
install(TARGETS conversations
|
||||
DESTINATION ${CMAKE_INSTALL_PREFIX}
|
||||
)
|
@ -0,0 +1,10 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource prefix="/">
|
||||
<file>assets/appicon.icns</file>
|
||||
<file>assets/country-codes.csv</file>
|
||||
<file alias="chat/colors.css">assets/html/chat/colors.css</file>
|
||||
<file alias="chat/conversation.html">assets/html/chat/SMSConversation.html</file>
|
||||
<file alias="chat/conversation.css">assets/html/chat/SMSConversation.css</file>
|
||||
<file alias="chat/conversation.js">assets/html/chat/SMSConversation.js</file>
|
||||
</qresource>
|
||||
</RCC>
|
|
@ -0,0 +1,175 @@
|
||||
/**
|
||||
* Style rules for the MessageBuffer
|
||||
*/
|
||||
|
||||
/**
|
||||
* the body defaults
|
||||
*/
|
||||
body {
|
||||
margin-left: 16px;
|
||||
margin-right: 16px;
|
||||
}
|
||||
|
||||
/**
|
||||
* The table column formats
|
||||
*/
|
||||
|
||||
div.Message {
|
||||
padding-bottom: 8px;
|
||||
display: table;
|
||||
width: 100%;
|
||||
}
|
||||
|
||||
div.Message.Other {
|
||||
padding-left: 6px;
|
||||
}
|
||||
|
||||
div.Message:first-child {
|
||||
padding-top: 0px;
|
||||
}
|
||||
|
||||
div.Message:last-child {
|
||||
padding-bottom: 0px;
|
||||
}
|
||||
|
||||
div.BubbleSelf {
|
||||
-moz-border-radius: 4px 4px 4px 4px;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
|
||||
padding: 4px 8px;
|
||||
|
||||
margin-right: 0px;
|
||||
margin-left: 0px;
|
||||
|
||||
display: table-cell;
|
||||
/* overflow: hidden; this bugs mouse events. see bug #123077 */
|
||||
}
|
||||
|
||||
div.BubbleOther {
|
||||
-moz-border-radius: 6px ;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
|
||||
margin-left: 0px;
|
||||
margin-right: 0px;
|
||||
vertical-align: middle;
|
||||
padding: 4px 8px;
|
||||
|
||||
display: table-cell;
|
||||
min-height: 56px;
|
||||
/* overflow: hidden; this bugs mouse events. see bug #123077 */
|
||||
margin-right: 4px;
|
||||
}
|
||||
|
||||
div.BubbleSpacer {
|
||||
padding: 0px;
|
||||
margin: 0px;
|
||||
vertical-align: middle;
|
||||
display: table-cell;
|
||||
height: 52px;
|
||||
}
|
||||
|
||||
div.BubbleSelfClicked {
|
||||
-moz-border-radius: 4px 4px 4px 4px;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
|
||||
padding: 4px 8px;
|
||||
|
||||
text-shadow: 0.1em 0.1em #000;
|
||||
|
||||
display: table-cell;
|
||||
/* overflow: hidden; this bugs mouse events. see bug #123077 */
|
||||
}
|
||||
|
||||
|
||||
div.BubbleOtherClicked {
|
||||
-moz-border-radius: 6px ;
|
||||
border-style: solid;
|
||||
border-width: 1px;
|
||||
text-shadow: 0.1em 0.1em #000;
|
||||
vertical-align: middle;
|
||||
padding: 4px 8px;
|
||||
|
||||
display: table-cell;
|
||||
min-height: 56px;
|
||||
/* overflow: hidden; this bugs mouse events. see bug #123077 */
|
||||
}
|
||||
|
||||
/**
|
||||
* Others' Avatars
|
||||
*
|
||||
* This needs a "drop down" shadow, but no idea if that can be done
|
||||
*Adele: please note that this drop down shadow might be subjected to change
|
||||
*I've talked about it with Vilja who's in charge of address book layout
|
||||
*and we might change it so that it's a double border colour to indicate
|
||||
*that the avatar is clickable. drop shawdow doesn't seem to work with
|
||||
*dark backgrounds unless it's a light colour drop shadow.
|
||||
*PLEASE tell me if it's difficult to implement the drop shadow.
|
||||
* Looks like drop shadow is dropped from ui specs. And bug 139130 made me
|
||||
*remove the space for it anyway.
|
||||
*/
|
||||
|
||||
div.Avatar {
|
||||
display: table-cell;
|
||||
vertical-align: middle;
|
||||
padding-right: 2px;
|
||||
width: 64px;
|
||||
}
|
||||
|
||||
.MessageAvatar {
|
||||
width: 64px;
|
||||
height:64px;
|
||||
border: 1px solid; /* #9e9e9e; */
|
||||
-moz-border-radius: 6px;
|
||||
}
|
||||
|
||||
img.MessagePresence {
|
||||
vertical-align: middle;
|
||||
width: 16px;
|
||||
height: 16px;
|
||||
}
|
||||
|
||||
/**
|
||||
* the Name field
|
||||
*/
|
||||
span.MessageNameField {
|
||||
word-wrap: break-word;
|
||||
vertical-align: middle;
|
||||
}
|
||||
|
||||
/**
|
||||
* the Text field
|
||||
*/
|
||||
span.MessageText {
|
||||
text-align: left;
|
||||
vertical-align: middle;
|
||||
word-wrap: break-word;
|
||||
}
|
||||
|
||||
/**
|
||||
* the TimeStamp default rules
|
||||
*/
|
||||
div.MessageRight {
|
||||
float: right;
|
||||
padding-left: 16px;
|
||||
white-space: nowrap;
|
||||
text-align: right;
|
||||
display: inline-block;
|
||||
}
|
||||
|
||||
img.MessageBusinessCardImg {
|
||||
vertical-align: middle;
|
||||
padding-right: 4px;
|
||||
}
|
||||
|
||||
img.MessageStatusImg {
|
||||
vertical-align: middle;
|
||||
padding-right: 8px;
|
||||
}
|
||||
|
||||
.MessagingWidgetsSmiley {
|
||||
height: 24px;
|
||||
width: 24px;
|
||||
}
|
@ -0,0 +1,49 @@
|
||||
<html lang="en-US">
|
||||
<head>
|
||||
<title>Test</title>
|
||||
<link rel="stylesheet" type="text/css" href="qrc:/chat/conversation.css"></link>
|
||||
<link rel="stylesheet" type="text/css" href="qrc:/chat/colors.css" id="ThemeCSSLink"></link>
|
||||
<script type="text/javascript" src="qrc:/chat/conversation.js"></script>
|
||||
</head>
|
||||
|
||||
<style>
|
||||
.MessageAvatar {
|
||||
background-size: contain;
|
||||
}
|
||||
</style>
|
||||
|
||||
<!-- Preserve the tag IDs. Everything else can be changed and rearranged -->
|
||||
|
||||
<body class="DefaultBackgroundColor DefaultTextColor SystemFont" onload="MessagingWidgetsSMSConversation_init()">
|
||||
<div id="MessageContainerSelf" class="Message Self">
|
||||
<div id="MessageSelf" class="MessagingBubbleSelfBackgroundColor MessagingBubbleBorderColor BubbleSelf">
|
||||
<span id="MessageSenderNameSelf" class="MessageNameField AccentColor2 Self"></span>
|
||||
<span id="MessageTextSelf" class="MessageText Self"></span>
|
||||
<div class="MessageRight Self">
|
||||
<img id="MessageBusinessCardImgSelf" class="MessageBusinessCardImg" src=""/>
|
||||
<span id="MessageTimeStampSelf" class="MessageTimeStamp SecondaryTextColor Self SmallSystemFont">12:30 PM</span>
|
||||
<span id="MessageDeliveryTimeStampSelf" class="MessageDeliveryTimeStamp SecondaryTextColor Self SmallSystemFont"> | 1:30 PM</span>
|
||||
<img id="MessageStatusImgSelf" class="MessageStatusImg" src=""/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
<div id="MessageContainerOther" class="Message Other">
|
||||
<div class="Avatar">
|
||||
<div id="AvatarImgOther" class="MessageAvatar MessagingAvatarBorderColor DefaultBackgroundColor "></div>
|
||||
</div>
|
||||
<div id="MessageOther" class="MessagingBubbleOtherBackgroundColor MessagingBubbleBorderColor BubbleOther">
|
||||
<div class="BubbleSpacer">
|
||||
<img id="MessagePresenceOther" src="" class="MessagePresence"/>
|
||||
<span id="MessageSenderNameOther" class="MessageNameField AccentColor1 Other"></span>
|
||||
<span id="MessageTextOther" class="MessageText Other"></span>
|
||||
<div class="MessageRight Other">
|
||||
<img id="MessageBusinessCardImgOther" class="MessageBusinessCardImg" src=""/>
|
||||
<span id="MessageTimeStampOther" class="MessageTimeStamp SecondaryTextColor Other SmallSystemFont">12:30 PM</span>
|
||||
<span id="MessageDeliveryTimeStampOther" class="MessageDeliveryTimeStamp SecondaryTextColor Other SmallSystemFont"> | 1:30 PM</span>
|
||||
<img id="MessageStatusImgOther" class="MessageStatusImg" src=""/>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</div>
|
||||
</body>
|
||||
</html>
|
@ -0,0 +1,913 @@
|
||||
/**
|
||||
* @file MessagingWidgetsSMSConversation.js
|
||||
*
|
||||
* Javascript for messaging rendering widget's ring buffer.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This file is part of rtcom messaging ui
|
||||
*
|
||||
* Copyright (C) 2009 Nokia Corporation. All rights reserved.
|
||||
*
|
||||
* Contact: Naba Kumar <naba.kumar@nokia.com>
|
||||
*
|
||||
* This software, including documentation, is protected by copyright
|
||||
* controlled by Nokia Corporation. All rights are reserved.
|
||||
* Copying, including reproducing, storing, adapting or translating,
|
||||
* any or all of this material requires the prior written consent of
|
||||
* Nokia Corporation. This material also contains confidential
|
||||
* information which may not be disclosed to others without the prior
|
||||
* written consent of Nokia.
|
||||
*/
|
||||
|
||||
/**
|
||||
* Globals:
|
||||
*
|
||||
* @myBatchRequested:
|
||||
* if HISTORY_FETCHING_NOREQUEST, no batch has been requested.
|
||||
* if HISTORY_FETCHING_DONE, history fetching done; no more request to give.
|
||||
* if > 0, request in progress and the amount requested.
|
||||
*
|
||||
* @myBatchesAdded: Number of message batches retrieved from log.
|
||||
*
|
||||
* @myShowTimes: Display method for time stamps, set to 'inline' to show
|
||||
* and 'none' to hide
|
||||
*
|
||||
**/
|
||||
|
||||
var HISTORY_BATCH_SIZE = 30;
|
||||
var HISTORY_PAGE_SIZE = 15;
|
||||
var HISTORY_SCREENFULL_SIZE = 8;
|
||||
var HISTORY_FETCHING_DONE = -1;
|
||||
var HISTORY_FETCHING_NOREQUEST = 0;
|
||||
|
||||
var myBatchRequested = 0;
|
||||
|
||||
var myShowTimes = "inline";
|
||||
|
||||
var myBatchesAdded = 0;
|
||||
|
||||
var myMaxMessages = -1;
|
||||
|
||||
var markupTemplateSelf;
|
||||
var markupTemplateOther;
|
||||
|
||||
var messagesBuffer = new Array();
|
||||
|
||||
var pastPresenceAnchor = new Array();
|
||||
var firstFlush = true;
|
||||
var flushTimeout = 0;
|
||||
|
||||
var lastClickedBubble = null;
|
||||
|
||||
var storedScreenHeight = 0;
|
||||
var storedBottomElement;
|
||||
|
||||
/**
|
||||
* MessagingWidgetsSMSConversation_alert:
|
||||
* @str Parameter to set for alert() call
|
||||
*
|
||||
* Custom, error safe alert call. Apparently with some version mismatches, the
|
||||
* alert() javascript function sometimes fails. This is to prevent alert()
|
||||
* failure to prevent rest of the script execution.
|
||||
*
|
||||
* For functionality, that actually depends on alert() call to succeed this
|
||||
* is not helpful, rather it's another way of creating a malfuction that is
|
||||
* harder to detect.
|
||||
**/
|
||||
function MessagingWidgetsSMSConversation_alert(str)
|
||||
{
|
||||
alert(str);
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsSMSConversation_init:
|
||||
*
|
||||
* Called when the page has actually been loaded.
|
||||
* Acts as a "constructor", could be used for creating the template item and
|
||||
* getting the element where we will add the children in the page.
|
||||
*
|
||||
* However, creating such template items doesn't seem so simple, we would
|
||||
* need several of them in order to be able to keep it really usable.
|
||||
**/
|
||||
function MessagingWidgetsSMSConversation_init ()
|
||||
{
|
||||
/* Setting onscroll handler to window */
|
||||
window.onscroll = MessagingWidgetsRenderer_onScroll;
|
||||
|
||||
/* Setting onresize handler to window */
|
||||
window.onresize = MessagingWidgetsRenderer_onResize;
|
||||
|
||||
storedScreenHeight = screen.height;
|
||||
storedWindowHeight = storedScreenHeight - 140;
|
||||
|
||||
/* setting body onmousedown for clearing stored message id on ui side */
|
||||
document.body.onmousedown = MessagingWidgetsRenderer_messagePressBody;
|
||||
|
||||
if (!markupTemplateSelf)
|
||||
{
|
||||
markupTemplateSelf = document.getElementById("MessageContainerSelf");
|
||||
markupTemplateSelf.parentNode.removeChild(markupTemplateSelf);
|
||||
markupTemplateSelf.removeAttribute('id');
|
||||
markupTemplateOther = document.getElementById("MessageContainerOther");
|
||||
markupTemplateOther.parentNode.removeChild(markupTemplateOther);
|
||||
markupTemplateOther.removeAttribute('id');
|
||||
}
|
||||
|
||||
MessagingWidgetsRenderer_addMessage(0, "13:37", "", "dsc",
|
||||
"Hallo daar!", false, "1337", "https://avatars.githubusercontent.com/u/1478325?v=4",
|
||||
"", "", "", "sander@sanderf.nl", false, "ltr");
|
||||
|
||||
MessagingWidgetsRenderer_addMessage(0, "13:50", "", "Wizzup",
|
||||
"Is het al klaar??", false, "1338", "https://avatars.githubusercontent.com/u/517897?v=4",
|
||||
"", "", "", "wizzup@wizzup.org", false, "ltr");
|
||||
|
||||
MessagingWidgetsRenderer_addMessage(0, "13:52", "", "Wizzup",
|
||||
"#duurtlang", false, "1338", "https://avatars.githubusercontent.com/u/517897?v=4",
|
||||
"", "", "", "wizzup@wizzup.org", false, "ltr");
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_messageClicked:
|
||||
* @event:
|
||||
* @id:
|
||||
*
|
||||
* Message area clicked
|
||||
**/
|
||||
function MessagingWidgetsRenderer_messageClicked(event)
|
||||
{
|
||||
var x = event.target;
|
||||
var idstr;
|
||||
|
||||
/* Only handle clicks on message blocks, not on URIs */
|
||||
if (x.href == "" || (!x.href && !x.parentNode.href)){
|
||||
}else{
|
||||
return true;
|
||||
}
|
||||
|
||||
idstr = "file://id:"+event.currentTarget.id;
|
||||
MessagingWidgetsSMSConversation_alert(idstr);
|
||||
|
||||
MessagingWidgetsRenderer_clearHighlight(event.currentTarget.id);
|
||||
|
||||
event.returnValue = true;
|
||||
event.cancelBubble = false;
|
||||
}
|
||||
|
||||
function MessagingWidgetsRenderer_messagePress(event)
|
||||
{
|
||||
var idstr;
|
||||
|
||||
idstr = "file://pre-id:"+event.currentTarget.id;
|
||||
|
||||
MessagingWidgetsSMSConversation_alert(idstr);
|
||||
|
||||
/* The popup menu posted from C code seems to steal events
|
||||
and when the popup is closed, the message remains highlighted.
|
||||
Workaround: use a 2-second timeout to clear highlight.
|
||||
*/
|
||||
setTimeout("MessagingWidgetsRenderer_clearHighlight()", 2000);
|
||||
|
||||
event.returnValue = true;
|
||||
/* Canceling bubble so body onmousedown isn't called */
|
||||
event.cancelBubble = true;
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_messagePressBubble:
|
||||
* @event: An onmousedown event
|
||||
* Highlight message bubble when pressed.
|
||||
*/
|
||||
function MessagingWidgetsRenderer_messagePressBubble(event)
|
||||
{
|
||||
var block;
|
||||
|
||||
MessagingWidgetsRenderer_clearHighlight(event.currentTarget.id);
|
||||
|
||||
block = document.getElementById(event.currentTarget.id);
|
||||
if (block) {
|
||||
block.className = block.clickedClassName;
|
||||
lastClickedBubble = block;
|
||||
}
|
||||
|
||||
event.returnValue = true;
|
||||
/* Canceling bubble so body onmousedown isn't called */
|
||||
event.cancelBubble = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_messagePressBubble:
|
||||
* @event: (Usually) an onmouseup event
|
||||
* Message bubble is not pressed any more - clear highlighting.
|
||||
*/
|
||||
function MessagingWidgetsRenderer_messageReleaseBubble(event)
|
||||
{
|
||||
MessagingWidgetsRenderer_clearHighlight();
|
||||
|
||||
event.returnValue = true;
|
||||
event.cancelBubble = false;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_clearHighlight:
|
||||
* @elem_id: (optional) Don't clear if @elem_id is currently highlighted.
|
||||
*
|
||||
* Remove highlighting from highlighted element, if any.
|
||||
*/
|
||||
function MessagingWidgetsRenderer_clearHighlight(/* [elem_id] */)
|
||||
{
|
||||
if (lastClickedBubble) {
|
||||
if (arguments.length >= 0) {
|
||||
var elem_id = arguments[0];
|
||||
var elem = document.getElementById(elem_id);
|
||||
if (elem && elem == lastClickedBubble) {
|
||||
return;
|
||||
}
|
||||
}
|
||||
lastClickedBubble.className = lastClickedBubble.normalClassName;
|
||||
lastClickedBubble = null;
|
||||
}
|
||||
}
|
||||
|
||||
function MessagingWidgetsRenderer_messagePressBody(event)
|
||||
{
|
||||
var idstr;
|
||||
|
||||
MessagingWidgetsSMSConversation_alert("file://pre-id:None");
|
||||
|
||||
event.returnValue = true;
|
||||
event.cancelBubble = false;
|
||||
}
|
||||
|
||||
function MessagingWidgetsRenderer_avatarClicked(event)
|
||||
{
|
||||
MessagingWidgetsSMSConversation_alert(event.currentTarget.id);
|
||||
|
||||
event.returnValue = true;
|
||||
event.cancelBubble = false;
|
||||
}
|
||||
|
||||
/*
|
||||
* Fixes presence...
|
||||
*/
|
||||
function
|
||||
MessagingWidgetsRenderer_fixPresence (
|
||||
self, presence_img, presence, contact_info_str, add_to_top)
|
||||
{
|
||||
var presenceID = "PresenceImg" + contact_info_str;
|
||||
if (!self) {
|
||||
if (presence_img) {
|
||||
|
||||
presence_img.id = presenceID;
|
||||
|
||||
if (presence != null && presence != "") {
|
||||
presence_img.src = presence;
|
||||
}
|
||||
|
||||
/* Find current presence anchor in document */
|
||||
var prevPresence = document.getElementById (presenceID);
|
||||
if (add_to_top) {
|
||||
|
||||
/* If we are adding a history, check if presence anchor is
|
||||
* already present in document (presumably added at bottom
|
||||
* from pending messages) or in pastPresenceAnchor which
|
||||
* remebers if we already created the anchor (it should
|
||||
* not be re-created if already created when populating
|
||||
* history).
|
||||
*/
|
||||
if (prevPresence ||
|
||||
pastPresenceAnchor[contact_info_str] == true) {
|
||||
/*
|
||||
* Presence is already anchored; remove it from this item.
|
||||
*/
|
||||
presence_img.parentNode.removeChild (presence_img);
|
||||
} else{
|
||||
/*
|
||||
* There is no anchor found, either in document or in
|
||||
* previously anchored, so leave presence node intact
|
||||
* in this item and record that anchor is already set.
|
||||
*/
|
||||
pastPresenceAnchor[contact_info_str] = true;
|
||||
}
|
||||
} else {
|
||||
/* If we found a previous presence icon, we remove that.
|
||||
* this one replaces the anchor
|
||||
*/
|
||||
if (prevPresence) {
|
||||
prevPresence.parentNode.removeChild (prevPresence);
|
||||
}
|
||||
}
|
||||
}
|
||||
} else if (presence_img) {
|
||||
presence_img.parentNode.removeChild (presence_img);
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_messageNode:
|
||||
* @item: The message.
|
||||
* @add_to_top: Add the new message to the top of the list
|
||||
*
|
||||
* Creates a message node
|
||||
**/
|
||||
function
|
||||
MessagingWidgetsRenderer_messageNode (item, add_to_top)
|
||||
{
|
||||
/* Top level items */
|
||||
var new_message;
|
||||
|
||||
/* Avatar data */
|
||||
var avatar_img;
|
||||
|
||||
/* The graphics */
|
||||
var bubble_cell;
|
||||
|
||||
/* Presence icon and name area */
|
||||
var presence_img = null;
|
||||
var name_tag;
|
||||
|
||||
/* Message text content */
|
||||
var message_txt;
|
||||
|
||||
/* Time stamps and potential icons */
|
||||
var time_tag;
|
||||
var delivery_time_tag;
|
||||
var business_img;
|
||||
var status_img;
|
||||
|
||||
var party;
|
||||
var count;
|
||||
|
||||
if (!markupTemplateSelf) {
|
||||
MessagingWidgetsSMSConversation_init();
|
||||
}
|
||||
|
||||
if (item.type !== 0) {
|
||||
MessagingWidgetsSMSConversation_alert("Only type 0 is allowed");
|
||||
return;
|
||||
}
|
||||
|
||||
if (item.self === true) {
|
||||
party = "Self";
|
||||
new_message = markupTemplateSelf.cloneNode(true);
|
||||
|
||||
/* Finally, append the whole message to the document */
|
||||
new_message.id = "Message" + item.id_str;
|
||||
new_message.onmousedown = MessagingWidgetsRenderer_messagePress;
|
||||
|
||||
/* Retrieve the elements to update */
|
||||
var node_tags = new_message.getElementsByTagName('*');
|
||||
for (var i = 0; i < node_tags.length; i++) {
|
||||
if (node_tags[i].hasAttribute('id')) {
|
||||
var id = node_tags[i].getAttribute('id');
|
||||
if (id == ("AvatarImg" + party))
|
||||
avatar_img = node_tags[i];
|
||||
if (id == ("Message" + party))
|
||||
bubble_cell = node_tags[i];
|
||||
if (id == ("MessagePresence" + party))
|
||||
presence_img = node_tags[i];
|
||||
if (id == ("MessageSenderName" + party))
|
||||
name_tag = node_tags[i];
|
||||
if (id == ("MessageText" + party))
|
||||
message_txt = node_tags[i];
|
||||
if (id == ("MessageTimeStamp" + party))
|
||||
time_tag = node_tags[i];
|
||||
if (id == ("MessageBusinessCardImg" + party))
|
||||
business_img = node_tags[i];
|
||||
if (id == ("MessageDeliveryTimeStamp" + party))
|
||||
delivery_time_tag = node_tags[i];
|
||||
if (id == ("MessageStatusImg" + party))
|
||||
status_img = node_tags[i];
|
||||
}
|
||||
}
|
||||
|
||||
} else {
|
||||
party = "Other";
|
||||
new_message = markupTemplateOther.cloneNode(true);
|
||||
|
||||
/* Finally, append the whole message to the document */
|
||||
new_message.id = "Message" + item.id_str;
|
||||
new_message.onmousedown = MessagingWidgetsRenderer_messagePress;
|
||||
|
||||
/* Retrieve the elements to update */
|
||||
var node_tags = new_message.getElementsByTagName('*');
|
||||
for (var i = 0; i < node_tags.length; i++) {
|
||||
if (node_tags[i].hasAttribute('id')) {
|
||||
var id = node_tags[i].getAttribute('id');
|
||||
if (id == ("AvatarImg" + party))
|
||||
avatar_img = node_tags[i];
|
||||
if (id == ("Message" + party))
|
||||
bubble_cell = node_tags[i];
|
||||
if (id == ("MessagePresence" + party))
|
||||
presence_img = node_tags[i];
|
||||
if (id == ("MessageSenderName" + party))
|
||||
name_tag = node_tags[i];
|
||||
if (id == ("MessageText" + party))
|
||||
message_txt = node_tags[i];
|
||||
if (id == ("MessageTimeStamp" + party))
|
||||
time_tag = node_tags[i];
|
||||
if (id == ("MessageBusinessCardImg" + party))
|
||||
business_img = node_tags[i];
|
||||
if (id == ("MessageDeliveryTimeStamp" + party))
|
||||
delivery_time_tag = node_tags[i];
|
||||
if (id == ("MessageStatusImg" + party))
|
||||
status_img = node_tags[i];
|
||||
}
|
||||
}
|
||||
|
||||
avatar_img.id = "avatar:" + item.contact_info_str;
|
||||
}
|
||||
bubble_cell.id = item.id_str;
|
||||
message_txt.id = "MessageText" + item.id_str;
|
||||
name_tag.id = "MessageSenderName" + item.id_str;
|
||||
business_img.id = "MessageBusinessCardImg" + item.id_str;
|
||||
time_tag.id = "MessageTimeStamp" + item.id_str;
|
||||
delivery_time_tag.id = "MessageDeliveryTimeStamp" + item.id_str;
|
||||
status_img.id = "MessageStatusImg" + item.id_str;
|
||||
message_txt.setAttribute("dir", item.text_dir);
|
||||
|
||||
/* Creation of an avatar image */
|
||||
if (item.self == false) {
|
||||
if (item.avatar != "") {
|
||||
avatar_img.style.backgroundImage = "url('"+item.avatar+"')";
|
||||
avatar_img.onclick = MessagingWidgetsRenderer_avatarClicked;
|
||||
}
|
||||
}
|
||||
|
||||
/* The bubble content */
|
||||
bubble_cell.normalClassName = bubble_cell.className;
|
||||
bubble_cell.clickedClassName = bubble_cell.className +
|
||||
"Clicked MessagingBubbleClickedBackgroundColor MessagingBubbleBorderColor";
|
||||
bubble_cell.onclick = MessagingWidgetsRenderer_messageClicked;
|
||||
bubble_cell.onmousedown = MessagingWidgetsRenderer_messagePressBubble;
|
||||
bubble_cell.onmouseup = MessagingWidgetsRenderer_messageReleaseBubble;
|
||||
|
||||
if (item.name_str != "") {
|
||||
name_tag.textContent = item.name_str;
|
||||
}
|
||||
|
||||
message_txt.innerHTML = item.message_str.replace(/\t/g, " ");
|
||||
|
||||
if (item.business_icon != "") {
|
||||
business_img.src = item.business_icon;
|
||||
}
|
||||
|
||||
time_tag.style.display = myShowTimes;
|
||||
time_tag.innerHTML = item.time_str;
|
||||
|
||||
delivery_time_tag.style.display = myShowTimes;
|
||||
delivery_time_tag.innerHTML = item.delivery_str;
|
||||
|
||||
if (item.status_icon != "") {
|
||||
status_img.src = item.status_icon;
|
||||
status_img.style.display = "inline";
|
||||
} else {
|
||||
/* Hiding element, so it's paddings etc don't affect timestamp */
|
||||
/* placement. It gets hidden in SetTimes() also */
|
||||
status_img.src = "";
|
||||
status_img.style.display = "none";
|
||||
}
|
||||
|
||||
/* FIXME: Move it somewhere appropriate */
|
||||
MessagingWidgetsRenderer_fixPresence(item.self, presence_img, item.presence,
|
||||
item.contact_info_str, add_to_top);
|
||||
|
||||
return new_message;
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_messageObject:
|
||||
* @type: Type of the message (normal/action/notice/autoreply)
|
||||
* @time_str: The time string to show in the screen
|
||||
* @delivery_str: The delivery time string to possibly show in the screen
|
||||
* @name_str: The name string to show in the screen
|
||||
* @message_str: The actual message to show
|
||||
* @self: TRUE if message is from self
|
||||
* @id_str: The ID of the message for access
|
||||
* @avatar: path(/url?) to avatar image
|
||||
* @presence: presence icon of sender
|
||||
* @business_icon: path to business card icon
|
||||
* @status_icon: path to message status icon (pending/failed)
|
||||
* @contact_info_str: Additional contact information
|
||||
* @text_dir: Text direction ("ltr" or "rtl")
|
||||
*
|
||||
* Creates a message object.
|
||||
**/
|
||||
function
|
||||
MessagingWidgetsRenderer_messageObject (
|
||||
type, time_str, delivery_str, name_str, message_str, self, id_str,
|
||||
avatar, presence, business_icon, status_icon, contact_info_str, text_dir)
|
||||
{
|
||||
this.type = type;
|
||||
this.time_str = time_str;
|
||||
this.delivery_str = delivery_str;
|
||||
this.name_str = name_str;
|
||||
this.message_str = message_str;
|
||||
this.self = self;
|
||||
this.id_str = id_str;
|
||||
this.avatar = avatar;
|
||||
this.presence = presence;
|
||||
this.business_icon = business_icon;
|
||||
this.status_icon = status_icon;
|
||||
this.contact_info_str = contact_info_str;
|
||||
this.text_dir = text_dir;
|
||||
}
|
||||
|
||||
/*
|
||||
* Flushes the given amount of messages from the buffer to renderer
|
||||
*/
|
||||
function
|
||||
MessagingWidgetsRenderer_flushBuffer (amount)
|
||||
{
|
||||
if (messagesBuffer.length > 0) {
|
||||
if (amount < 0)
|
||||
amount = messagesBuffer.length;
|
||||
var fragment = document.createDocumentFragment();
|
||||
for (var i = 0; i < amount; i++) {
|
||||
if (messagesBuffer.length <= 0)
|
||||
break;
|
||||
|
||||
var item = messagesBuffer.shift();
|
||||
new_message = MessagingWidgetsRenderer_messageNode (item, true);
|
||||
|
||||
if (fragment.childNodes.length > 0)
|
||||
fragment.insertBefore(new_message, fragment.firstChild);
|
||||
else
|
||||
fragment.appendChild(new_message);
|
||||
}
|
||||
|
||||
/* Restore scroll position */
|
||||
var savedScrollPos =
|
||||
document.body.scrollHeight - window.pageYOffset;
|
||||
document.body.insertBefore(fragment, document.body.firstChild);
|
||||
window.scrollTo(0, (document.body.scrollHeight - savedScrollPos));
|
||||
}
|
||||
}
|
||||
|
||||
/* Scroll event handler to potentially add more past history */
|
||||
function
|
||||
MessagingWidgetsRenderer_onScroll ()
|
||||
{
|
||||
MessagingWidgetsRenderer_clearHighlight();
|
||||
|
||||
/* Buffer flushing if there isn't already one running. */
|
||||
if (window.pageYOffset < 100 && messagesBuffer.length > 0) {
|
||||
|
||||
/* Add a page of messages (about 4 screen-full) to renderer */
|
||||
MessagingWidgetsRenderer_flushBuffer(HISTORY_PAGE_SIZE);
|
||||
}
|
||||
|
||||
/* If we run out of messages in buffer and history hasn't finished,
|
||||
* request for more
|
||||
*/
|
||||
if (messagesBuffer.length == 0 &&
|
||||
myBatchRequested == HISTORY_FETCHING_NOREQUEST &&
|
||||
myBatchesAdded > 0)
|
||||
{
|
||||
myBatchRequested = HISTORY_BATCH_SIZE;
|
||||
alert("history-request:" + HISTORY_BATCH_SIZE);
|
||||
}
|
||||
|
||||
obj=document.elementFromPoint(120, window.innerHeight-16);
|
||||
if(obj.id != "")
|
||||
storedBottomElement = obj;
|
||||
}
|
||||
|
||||
/* When conversation view editor expands/shrinks, scroll accordingly to */
|
||||
/* keep the the bottom position of the screen fixed. */
|
||||
function
|
||||
MessagingWidgetsRenderer_onResize (event)
|
||||
{
|
||||
if( storedScreenHeight != screen.height)
|
||||
{
|
||||
storedBottomElement.scrollIntoView(false);
|
||||
storedScreenHeight = screen.height;
|
||||
storedWindowHeight = window.innerHeight;
|
||||
}
|
||||
|
||||
if (Math.abs(storedWindowHeight - window.innerHeight) != 0) {
|
||||
window.scrollBy(0, storedWindowHeight - window.innerHeight);
|
||||
storedWindowHeight = window.innerHeight;
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_addMessage:
|
||||
* @type: Type of the message (normal/action/notice/autoreply)
|
||||
* @time_str: The time string to show in the screen
|
||||
* @delivery_str: The delivery time string to possibly show in the screen
|
||||
* @name_str: The name string to show in the screen
|
||||
* @message_str: The actual message to show
|
||||
* @self: TRUE if message is from self
|
||||
* @id_str: The ID of the message for access
|
||||
* @avatar: path(/url?) to avatar image
|
||||
* @presence: presence icon of sender
|
||||
* @business_icon: path to business card icon
|
||||
* @status_icon: path to message status icon (pending/failed)
|
||||
* @contact_info_str: Additional contact information
|
||||
* @add_to_top: Add the new message to the top of the list
|
||||
* @text_dir: Text direction ("ltr" or "rtl")
|
||||
*
|
||||
* Queues messages to buffer and triggers flush schedule. Also forces
|
||||
* an immediate flush if there are 8 messages already in buffer for
|
||||
* the first time. It's a screenful of messages shown to the user in
|
||||
* first opportunity.
|
||||
**/
|
||||
function
|
||||
MessagingWidgetsRenderer_addMessage (
|
||||
type, time_str, delivery_str, name_str, message_str, self, id_str,
|
||||
avatar, presence, business_icon, status_icon, contact_info_str, add_to_top,
|
||||
text_dir)
|
||||
{
|
||||
var item =
|
||||
new MessagingWidgetsRenderer_messageObject (type, time_str,
|
||||
delivery_str,
|
||||
name_str, message_str,
|
||||
self, id_str, avatar,
|
||||
presence, business_icon,
|
||||
status_icon,
|
||||
contact_info_str,
|
||||
text_dir);
|
||||
|
||||
if (add_to_top) {
|
||||
/* Queue the top (history) message in buffer. */
|
||||
messagesBuffer[messagesBuffer.length] = item;
|
||||
|
||||
/* Force flush if there's already screenful of messages to show for
|
||||
* the first time.
|
||||
*/
|
||||
if (firstFlush == true &&
|
||||
messagesBuffer.length >= HISTORY_SCREENFULL_SIZE)
|
||||
{
|
||||
firstFlush = false;
|
||||
MessagingWidgetsRenderer_flushBuffer(HISTORY_SCREENFULL_SIZE);
|
||||
}
|
||||
} else {
|
||||
/* If the message is bottom, add it directly without queuing. */
|
||||
var new_message =
|
||||
MessagingWidgetsRenderer_messageNode (item, false);
|
||||
|
||||
document.body.appendChild (new_message);
|
||||
|
||||
/* scrolling to new message, if the view is close to bottom, or */
|
||||
/* sent by self. If not, we don't scroll */
|
||||
if (document.body.scrollHeight - window.pageYOffset < (screen.height-140)*2 || self) {
|
||||
new_message.scrollIntoView (false);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_batchAdded:
|
||||
* @messages_fetched: Number of messages fetched from log. Note that all
|
||||
* fetched messages are not necessarily added to the view.
|
||||
*
|
||||
* History batch has been added to renderer
|
||||
**/
|
||||
function MessagingWidgetsRenderer_batchAdded (messages_fetched)
|
||||
{
|
||||
myBatchesAdded++;
|
||||
|
||||
/* Force flush if there hasn't been anything shown yet.
|
||||
* This happens because the first batch was smaller than
|
||||
* HISTORY_SCREENFULL_SIZE.
|
||||
*/
|
||||
if (firstFlush == true && messagesBuffer.length >= 0) {
|
||||
firstFlush = false;
|
||||
MessagingWidgetsRenderer_flushBuffer(-1);
|
||||
}
|
||||
|
||||
/* If there was no request made, then it's the first batch pushed.
|
||||
* The subsequent batch is requested after a delay of 1s to allow
|
||||
* first screenfull to be rendered properly.
|
||||
*/
|
||||
if (myBatchRequested == HISTORY_FETCHING_NOREQUEST) {
|
||||
if (flushTimeout != 0)
|
||||
clearTimeout(flushTimeout);
|
||||
flushTimeout = setTimeout("MessagingWidgetsRenderer_onScroll();",
|
||||
1000);
|
||||
} else if (myBatchRequested > 0) {
|
||||
/* If there was a request, check if we got everything.
|
||||
* If fetched messages is the amount requested, we could
|
||||
* continue fetching more, otherwise there is no more history
|
||||
* to fetch.
|
||||
*/
|
||||
if (messages_fetched < myBatchRequested) {
|
||||
myBatchRequested = HISTORY_FETCHING_DONE; /* No more history */
|
||||
} else {
|
||||
myBatchRequested = HISTORY_FETCHING_NOREQUEST; /* Batch delivered */
|
||||
}
|
||||
|
||||
/* Check if anything needs to be rendered at this scroll position */
|
||||
MessagingWidgetsRenderer_onScroll();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_deleteMessage:
|
||||
*
|
||||
* @id_str: The ID of the message to delete
|
||||
*
|
||||
* Removes a message from the message area
|
||||
**/
|
||||
function MessagingWidgetsRenderer_deleteMessage (id_str)
|
||||
{
|
||||
var txt;
|
||||
var node = null;
|
||||
|
||||
MessagingWidgetsSMSConversation_alert(
|
||||
"MessagingWidgetsRenderer_deleteMessage("+id_str+") called.");
|
||||
|
||||
txt = "Message"+id_str;
|
||||
node = document.getElementById(txt);
|
||||
|
||||
if (node == null) {
|
||||
MessagingWidgetsSMSConversation_alert (
|
||||
"No messages with id: " + id_str);
|
||||
return;
|
||||
}
|
||||
|
||||
try {
|
||||
document.body.removeChild (node);
|
||||
window.scrollBy (0,0);
|
||||
} catch (e) {
|
||||
MessagingWidgetsSMSConversation_alert (
|
||||
"Message " + index + " removal failed: " + e);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_showDeliveryTimes:
|
||||
*
|
||||
* @visibility: Set to 'inline' to show delivery time stamps. Set to
|
||||
* 'none' not to show them.
|
||||
*
|
||||
* Set if delivery time stamps should be visible
|
||||
**/
|
||||
function MessagingWidgetsRenderer_showDeliveryTimes (visibility)
|
||||
{
|
||||
var times;
|
||||
|
||||
if (visibility != "inline" && visibility != "none") {
|
||||
MessagingWidgetsSMSConversation_alert(
|
||||
"MessagingWidgetsRenderer_showDeliveryTimes: Illegal parameter: " +
|
||||
visibility);
|
||||
return;
|
||||
}
|
||||
|
||||
myShowTimes = visibility;
|
||||
|
||||
times = document.getElementsByTagName("span");
|
||||
if (times == null) {
|
||||
return;
|
||||
|
||||
}
|
||||
|
||||
for (i = 0; i < times.length; i++) {
|
||||
if (times[i].className.indexOf ("MessageDeliveryTimeStamp") != -1) {
|
||||
times[i].style.display = myShowTimes;
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_setTimes:
|
||||
*
|
||||
* @id_str: id of the message
|
||||
* @time_str: message time stamp
|
||||
* @delivery_str: message delivery time stamp
|
||||
* @status_icon: path+name of a status icon (pending/failed)
|
||||
*
|
||||
* Set time stamps and status icon
|
||||
**/
|
||||
function MessagingWidgetsRenderer_setTimes (id_str, time_str, delivery_str,
|
||||
status_icon)
|
||||
{
|
||||
var icon;
|
||||
|
||||
// Weird new browser behaviour here. Looks like if the src of the status
|
||||
// icon is set to not valid icon value, the browser keeps displaying the old
|
||||
// valid icon. Only when you put to the src a valid icon does it change.
|
||||
// Worked around this by hiding the image altogether if the icon is set
|
||||
// to "".
|
||||
|
||||
icon = document.getElementById("MessageStatusImg"+id_str);
|
||||
if (icon != null) {
|
||||
icon.src = status_icon;
|
||||
|
||||
if (status_icon == "") {
|
||||
icon.style.display = "none";
|
||||
} else {
|
||||
icon.style.display = "inline";
|
||||
}
|
||||
}
|
||||
|
||||
document.getElementById("MessageTimeStamp"+id_str).innerHTML = time_str;
|
||||
document.getElementById("MessageDeliveryTimeStamp"+id_str).innerHTML =
|
||||
delivery_str;
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_setPresence:
|
||||
* @contact_info: The contact info for presence icon
|
||||
* @presence: Presence icon path
|
||||
*
|
||||
* Sets the presence icon of @contact_info to @presence
|
||||
**/
|
||||
function MessagingWidgetsRenderer_setPresence (contact_info, presence)
|
||||
{
|
||||
var presenceImg = document.getElementById ("PresenceImg" + contact_info);
|
||||
if (presenceImg != null) {
|
||||
presenceImg.src = presence;
|
||||
} else {
|
||||
/* Find in buffer */
|
||||
for (var i = 0; i < messagesBuffer.length; i++) {
|
||||
if (messagesBuffer[i].contact_info_str == contact_info) {
|
||||
messagesBuffer[i].presence = presence;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_setMaxMessages:
|
||||
*
|
||||
* @max: maximum number of messages
|
||||
*
|
||||
* Sets the maximum number of messages (default is 50)
|
||||
**/
|
||||
function MessagingWidgetsRenderer_setMaxMessages (max)
|
||||
{
|
||||
var count;
|
||||
|
||||
myMaxMessages = max;
|
||||
|
||||
count = document.body.childNodes.count;
|
||||
|
||||
if (count >= myMaxMessages) {
|
||||
var i;
|
||||
|
||||
for (i = count - myMaxMessages + 1; i > 0; i--) {
|
||||
document.body.removeChild (document.body.firstChild);
|
||||
}
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_setCSS:
|
||||
*
|
||||
* @file: Path of theme CSS file
|
||||
*
|
||||
* Sets the theme CSS file to the current page.
|
||||
*
|
||||
* FIXME: Should use the .styleSheets property of the document
|
||||
**/
|
||||
function MessagingWidgetsRenderer_setCSS (file)
|
||||
{
|
||||
document.getElementById("ThemeCSSLink").href = file;
|
||||
MessagingWidgetsSMSConversation_alert("set: "+file+" as theme CSS file.");
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/**
|
||||
* MessagingWidgetsRenderer_addBatch:
|
||||
*
|
||||
* @messages: Array of messages to add
|
||||
*
|
||||
* Adds several messages to view
|
||||
*
|
||||
**/
|
||||
function MessagingWidgetsRenderer_addBatch (messages)
|
||||
{
|
||||
var len = messages.length;
|
||||
var i;
|
||||
|
||||
// starting from 1, because of the extra ',' at the beginning due to
|
||||
// performance optimizations
|
||||
for(i=1; i<len; i++) {
|
||||
// Calling addMessage for each batched call. Converting strings
|
||||
// representing bool/int parameters
|
||||
|
||||
MessagingWidgetsRenderer_addMessage(Number(messages[i][0]),
|
||||
messages[i][1], messages[i][2], messages[i][3], messages[i][4],
|
||||
(messages[i][5] === 'true'), messages[i][6], messages[i][7],
|
||||
messages[i][8], messages[i][9], messages[i][10], messages[i][11],
|
||||
(messages[i][12]) === 'true', messages[i][13]);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
|
@ -0,0 +1,215 @@
|
||||
/*
|
||||
This file contains CSS definitions for all the Maemo desktop theme colors and fonts.
|
||||
Theme Name : Nokia Nseries
|
||||
Installed in : @CSS_FULL_DIR@
|
||||
*/
|
||||
|
||||
/* COLORS */
|
||||
|
||||
/* Normal Text Colors */
|
||||
.DefaultTextColor {
|
||||
color: #ffffff;
|
||||
}
|
||||
.SecondaryTextColor {
|
||||
color: #999999;
|
||||
}
|
||||
.ActiveTextColor {
|
||||
color: #37b4fc;
|
||||
}
|
||||
.DisabledTextColor {
|
||||
color: #666666;
|
||||
}
|
||||
.PaintedTextColor {
|
||||
color: #00101a;
|
||||
}
|
||||
|
||||
/* Reversed Text Colors */
|
||||
.ReversedTextColor {
|
||||
color: #000000;
|
||||
}
|
||||
.ReversedSecondaryTextColor {
|
||||
color: #666666;
|
||||
}
|
||||
.ReversedActiveTextColor {
|
||||
color: #00a0fc;
|
||||
}
|
||||
.ReversedDisabledTextColor {
|
||||
color: #808080;
|
||||
}
|
||||
.ReversedPaintedTextColor {
|
||||
color: #ffffff;
|
||||
}
|
||||
|
||||
/* Background colors */
|
||||
.DefaultBackgroundColor {
|
||||
background: #000000;
|
||||
}
|
||||
.DarkerBackgroundColor {
|
||||
background: #000000;
|
||||
}
|
||||
.ReversedBackgroundColor {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
/* Selections */
|
||||
.SelectionColor {
|
||||
color: #37b4fc;
|
||||
}
|
||||
.ReversedSelectionColor {
|
||||
color: #37b4fc;
|
||||
}
|
||||
|
||||
/* Media colors */
|
||||
.ContentBackgroundColor {
|
||||
background: #000000;
|
||||
}
|
||||
.ContentFrameColor {
|
||||
background: #000000;
|
||||
}
|
||||
.ContentSelectionColor {
|
||||
background: #ffffff;
|
||||
}
|
||||
|
||||
/* Framework stuff */
|
||||
.TitleTextColor {
|
||||
color: #ffffff;
|
||||
}
|
||||
.ButtonTextColor {
|
||||
color: #ffffff;
|
||||
}
|
||||
.ButtonTextPressedColor {
|
||||
color: #ffffff;
|
||||
}
|
||||
.ButtonTextDisabledColor {
|
||||
color: #666666;
|
||||
}
|
||||
|
||||
/* Crayons */
|
||||
.AccentColor1 {
|
||||
color: #86d5fc;
|
||||
}
|
||||
|
||||
.AccentColor2 {
|
||||
color: #00639e;
|
||||
}
|
||||
|
||||
.AccentColor3 {
|
||||
color: #00639e;
|
||||
}
|
||||
|
||||
.AttentionColor {
|
||||
color: #e3002a;
|
||||
}
|
||||
|
||||
/* Notification Colors */
|
||||
.NotificationBackgroundColor {
|
||||
color: #efcb00;
|
||||
}
|
||||
|
||||
.NotificationTextColor {
|
||||
color: #491b03;
|
||||
}
|
||||
|
||||
.NotificationSecondaryTextColor {
|
||||
color: #783800;
|
||||
}
|
||||
|
||||
/* Messaging UI specific colours */
|
||||
.MessagingViewBackgroundColor {
|
||||
background-color: #3f3f3d;
|
||||
}
|
||||
.MessagingBubbleSelfBackgroundColor {
|
||||
background-color: #30302f;
|
||||
}
|
||||
.MessagingBubbleOtherBackgroundColor {
|
||||
background-color: #000000;
|
||||
}
|
||||
.MessagingBubbleClickedBackgroundColor {
|
||||
background-color: #37b4fc;
|
||||
}
|
||||
.MessagingBubbleBorderColor {
|
||||
border-color: #30302f;
|
||||
}
|
||||
.MessagingAvatarBorderColor {
|
||||
border-color: #999999;
|
||||
}
|
||||
.MessagingAvatarBorderMaskColor {
|
||||
outline-color: #000000;
|
||||
}
|
||||
|
||||
|
||||
a:link {
|
||||
color: #86d5fc;
|
||||
}
|
||||
|
||||
|
||||
/* FONTS */
|
||||
|
||||
/* legacy */
|
||||
|
||||
.osso-SystemFont {
|
||||
font: 18px "Nokia Sans"
|
||||
}
|
||||
|
||||
.osso-EmpSystemFont {
|
||||
font: bold 18px "Nokia Sans"
|
||||
}
|
||||
|
||||
.osso-LargeFont {
|
||||
font: 26px "Nokia Sans"
|
||||
}
|
||||
|
||||
.osso-SmallFont {
|
||||
font: 13px "Nokia Sans"
|
||||
}
|
||||
|
||||
.osso-HWRFont1 {
|
||||
font: 52px "Nokia Sans"
|
||||
}
|
||||
|
||||
.osso-HWRFont2 {
|
||||
font: 38px "Nokia Sans"
|
||||
}
|
||||
|
||||
.osso-TitleFont {
|
||||
font: 18px "Nokia Sans"
|
||||
}
|
||||
|
||||
.osso-ButtonFont {
|
||||
font: 18px "Nokia Sans"
|
||||
}
|
||||
|
||||
/* new fonts for fremantle */
|
||||
|
||||
.SystemFont {
|
||||
font: 24px "Nokia Sans"
|
||||
}
|
||||
|
||||
.EmpSystemFont {
|
||||
font: bold 24px "Nokia Sans"
|
||||
}
|
||||
|
||||
.LargeSystemFont {
|
||||
font: 35px "Nokia Sans"
|
||||
}
|
||||
|
||||
.SmallSystemFont {
|
||||
font: 18px "Nokia Sans"
|
||||
}
|
||||
|
||||
.EmpSmallSystemFont {
|
||||
font: bold 18px "Nokia Sans"
|
||||
}
|
||||
|
||||
.X-LargeSystemFont {
|
||||
font: 42px "Nokia Sans"
|
||||
}
|
||||
|
||||
.XX-LargeSystemFont {
|
||||
font: 70px "Nokia Sans"
|
||||
}
|
||||
|
||||
.XXX-LargeSystemFont {
|
||||
font: 100px "Nokia Sans"
|
||||
}
|
||||
|
@ -0,0 +1,520 @@
|
||||
<!DOCTYPE RCC><RCC version="1.0">
|
||||
<qresource prefix="/flags">
|
||||
<file alias="gl.svg">svg/gl.svg</file>
|
||||
<file alias="no.svg">svg/no.svg</file>
|
||||
<file alias="gb-sct.svg">svg/gb-sct.svg</file>
|
||||
<file alias="au.svg">svg/au.svg</file>
|
||||
<file alias="pf.svg">svg/pf.svg</file>
|
||||
<file alias="es.svg">svg/es.svg</file>
|
||||
<file alias="nz.svg">svg/nz.svg</file>
|
||||
<file alias="ao.svg">svg/ao.svg</file>
|
||||
<file alias="bt.svg">svg/bt.svg</file>
|
||||
<file alias="mz.svg">svg/mz.svg</file>
|
||||
<file alias="kh.svg">svg/kh.svg</file>
|
||||
<file alias="gb-nir.svg">svg/gb-nir.svg</file>
|
||||
<file alias="io.svg">svg/io.svg</file>
|
||||
<file alias="gn.svg">svg/gn.svg</file>
|
||||
<file alias="ye.svg">svg/ye.svg</file>
|
||||
<file alias="cc.svg">svg/cc.svg</file>
|
||||
<file alias="bv.svg">svg/bv.svg</file>
|
||||
<file alias="ru.svg">svg/ru.svg</file>
|
||||
<file alias="hu.svg">svg/hu.svg</file>
|
||||
<file alias="sl.svg">svg/sl.svg</file>
|
||||
<file alias="cv.svg">svg/cv.svg</file>
|
||||
<file alias="gb-wls.svg">svg/gb-wls.svg</file>
|
||||
<file alias="dk.svg">svg/dk.svg</file>
|
||||
<file alias="mf.svg">svg/mf.svg</file>
|
||||
<file alias="cn.svg">svg/cn.svg</file>
|
||||
<file alias="aw.svg">svg/aw.svg</file>
|
||||
<file alias="gh.svg">svg/gh.svg</file>
|
||||
<file alias="ua.svg">svg/ua.svg</file>
|
||||
<file alias="th.svg">svg/th.svg</file>
|
||||
<file alias="nc.svg">svg/nc.svg</file>
|
||||
<file alias="nr.svg">svg/nr.svg</file>
|
||||
<file alias="ai.svg">svg/ai.svg</file>
|
||||
<file alias="tg.svg">svg/tg.svg</file>
|
||||
<file alias="ae.svg">svg/ae.svg</file>
|
||||
<file alias="bs.svg">svg/bs.svg</file>
|
||||
<file alias="is.svg">svg/is.svg</file>
|
||||
<file alias="mm.svg">svg/mm.svg</file>
|
||||
<file alias="sd.svg">svg/sd.svg</file>
|
||||
<file alias="dj.svg">svg/dj.svg</file>
|
||||
<file alias="tw.svg">svg/tw.svg</file>
|
||||
<file alias="sy.svg">svg/sy.svg</file>
|
||||
<file alias="es-ga.svg">svg/es-ga.svg</file>
|
||||
<file alias="pn.svg">svg/pn.svg</file>
|
||||
<file alias="bo.svg">svg/bo.svg</file>
|
||||
<file alias="rs.svg">svg/rs.svg</file>
|
||||
<file alias="na.svg">svg/na.svg</file>
|
||||
<file alias="it.svg">svg/it.svg</file>
|
||||
<file alias="cx.svg">svg/cx.svg</file>
|
||||
<file alias="ni.svg">svg/ni.svg</file>
|
||||
<file alias="gu.svg">svg/gu.svg</file>
|
||||
<file alias="ph.svg">svg/ph.svg</file>
|
||||
<file alias="mv.svg">svg/mv.svg</file>
|
||||
<file alias="us.svg">svg/us.svg</file>
|
||||
<file alias="mo.svg">svg/mo.svg</file>
|
||||
<file alias="va.svg">svg/va.svg</file>
|
||||
<file alias="cf.svg">svg/cf.svg</file>
|
||||
<file alias="cl.svg">svg/cl.svg</file>
|
||||
<file alias="ss.svg">svg/ss.svg</file>
|
||||
<file alias="ad.svg">svg/ad.svg</file>
|
||||
<file alias="ws.svg">svg/ws.svg</file>
|
||||
<file alias="gy.svg">svg/gy.svg</file>
|
||||
<file alias="bl.svg">svg/bl.svg</file>
|
||||
<file alias="tz.svg">svg/tz.svg</file>
|
||||
<file alias="cw.svg">svg/cw.svg</file>
|
||||
<file alias="je.svg">svg/je.svg</file>
|
||||
<file alias="uz.svg">svg/uz.svg</file>
|
||||
<file alias="li.svg">svg/li.svg</file>
|
||||
<file alias="bz.svg">svg/bz.svg</file>
|
||||
<file alias="sx.svg">svg/sx.svg</file>
|
||||
<file alias="kg.svg">svg/kg.svg</file>
|
||||
<file alias="bi.svg">svg/bi.svg</file>
|
||||
<file alias="pw.svg">svg/pw.svg</file>
|
||||
<file alias="pm.svg">svg/pm.svg</file>
|
||||
<file alias="um.svg">svg/um.svg</file>
|
||||
<file alias="nf.svg">svg/nf.svg</file>
|
||||
<file alias="bm.svg">svg/bm.svg</file>
|
||||
<file alias="wf.svg">svg/wf.svg</file>
|
||||
<file alias="gf.svg">svg/gf.svg</file>
|
||||
<file alias="sg.svg">svg/sg.svg</file>
|
||||
<file alias="lc.svg">svg/lc.svg</file>
|
||||
<file alias="pa.svg">svg/pa.svg</file>
|
||||
<file alias="ke.svg">svg/ke.svg</file>
|
||||
<file alias="ma.svg">svg/ma.svg</file>
|
||||
<file alias="to.svg">svg/to.svg</file>
|
||||
<file alias="bq.svg">svg/bq.svg</file>
|
||||
<file alias="sm.svg">svg/sm.svg</file>
|
||||
<file alias="py.svg">svg/py.svg</file>
|
||||
<file alias="gb-eng.svg">svg/gb-eng.svg</file>
|
||||
<file alias="md.svg">svg/md.svg</file>
|
||||
<file alias="gt.svg">svg/gt.svg</file>
|
||||
<file alias="sr.svg">svg/sr.svg</file>
|
||||
<file alias="vn.svg">svg/vn.svg</file>
|
||||
<file alias="re.svg">svg/re.svg</file>
|
||||
<file alias="ci.svg">svg/ci.svg</file>
|
||||
<file alias="gq.svg">svg/gq.svg</file>
|
||||
<file alias="yt.svg">svg/yt.svg</file>
|
||||
<file alias="mp.svg">svg/mp.svg</file>
|
||||
<file alias="tj.svg">svg/tj.svg</file>
|
||||
<file alias="fk.svg">svg/fk.svg</file>
|
||||
<file alias="so.svg">svg/so.svg</file>
|
||||
<file alias="lr.svg">svg/lr.svg</file>
|
||||
<file alias="bn.svg">svg/bn.svg</file>
|
||||
<file alias="gp.svg">svg/gp.svg</file>
|
||||
<file alias="bh.svg">svg/bh.svg</file>
|
||||
<file alias="by.svg">svg/by.svg</file>
|
||||
<file alias="bj.svg">svg/bj.svg</file>
|
||||
<file alias="be.svg">svg/be.svg</file>
|
||||
<file alias="jo.svg">svg/jo.svg</file>
|
||||
<file alias="vu.svg">svg/vu.svg</file>
|
||||
<file alias="vi.svg">svg/vi.svg</file>
|
||||
<file alias="gw.svg">svg/gw.svg</file>
|
||||
<file alias="ec.svg">svg/ec.svg</file>
|
||||
<file alias="hm.svg">svg/hm.svg</file>
|
||||
<file alias="nu.svg">svg/nu.svg</file>
|
||||
<file alias="mn.svg">svg/mn.svg</file>
|
||||
<file alias="tf.svg">svg/tf.svg</file>
|
||||
<file alias="kz.svg">svg/kz.svg</file>
|
||||
<file alias="fj.svg">svg/fj.svg</file>
|
||||
<file alias="iq.svg">svg/iq.svg</file>
|
||||
<file alias="bb.svg">svg/bb.svg</file>
|
||||
<file alias="st.svg">svg/st.svg</file>
|
||||
<file alias="cr.svg">svg/cr.svg</file>
|
||||
<file alias="ro.svg">svg/ro.svg</file>
|
||||
<file alias="dz.svg">svg/dz.svg</file>
|
||||
<file alias="tv.svg">svg/tv.svg</file>
|
||||
<file alias="ve.svg">svg/ve.svg</file>
|
||||
<file alias="sh.svg">svg/sh.svg</file>
|
||||
<file alias="gs.svg">svg/gs.svg</file>
|
||||
<file alias="fi.svg">svg/fi.svg</file>
|
||||
<file alias="ck.svg">svg/ck.svg</file>
|
||||
<file alias="ps.svg">svg/ps.svg</file>
|
||||
<file alias="cz.svg">svg/cz.svg</file>
|
||||
<file alias="uy.svg">svg/uy.svg</file>
|
||||
<file alias="lv.svg">svg/lv.svg</file>
|
||||
<file alias="ie.svg">svg/ie.svg</file>
|
||||
<file alias="sz.svg">svg/sz.svg</file>
|
||||
<file alias="eg.svg">svg/eg.svg</file>
|
||||
<file alias="mk.svg">svg/mk.svg</file>
|
||||
<file alias="un.svg">svg/un.svg</file>
|
||||
<file alias="vc.svg">svg/vc.svg</file>
|
||||
<file alias="tk.svg">svg/tk.svg</file>
|
||||
<file alias="gg.svg">svg/gg.svg</file>
|
||||
<file alias="lk.svg">svg/lk.svg</file>
|
||||
<file alias="in.svg">svg/in.svg</file>
|
||||
<file alias="zm.svg">svg/zm.svg</file>
|
||||
<file alias="tn.svg">svg/tn.svg</file>
|
||||
<file alias="pt.svg">svg/pt.svg</file>
|
||||
<file alias="cm.svg">svg/cm.svg</file>
|
||||
<file alias="tr.svg">svg/tr.svg</file>
|
||||
<file alias="ht.svg">svg/ht.svg</file>
|
||||
<file alias="pe.svg">svg/pe.svg</file>
|
||||
<file alias="bf.svg">svg/bf.svg</file>
|
||||
<file alias="br.svg">svg/br.svg</file>
|
||||
<file alias="ga.svg">svg/ga.svg</file>
|
||||
<file alias="km.svg">svg/km.svg</file>
|
||||
<file alias="sc.svg">svg/sc.svg</file>
|
||||
<file alias="ax.svg">svg/ax.svg</file>
|
||||
<file alias="ng.svg">svg/ng.svg</file>
|
||||
<file alias="gd.svg">svg/gd.svg</file>
|
||||
<file alias="ms.svg">svg/ms.svg</file>
|
||||
<file alias="lu.svg">svg/lu.svg</file>
|
||||
<file alias="il.svg">svg/il.svg</file>
|
||||
<file alias="mc.svg">svg/mc.svg</file>
|
||||
<file alias="do.svg">svg/do.svg</file>
|
||||
<file alias="ba.svg">svg/ba.svg</file>
|
||||
<file alias="sj.svg">svg/sj.svg</file>
|
||||
<file alias="td.svg">svg/td.svg</file>
|
||||
<file alias="qa.svg">svg/qa.svg</file>
|
||||
<file alias="gi.svg">svg/gi.svg</file>
|
||||
<file alias="ar.svg">svg/ar.svg</file>
|
||||
<file alias="sk.svg">svg/sk.svg</file>
|
||||
<file alias="bg.svg">svg/bg.svg</file>
|
||||
<file alias="az.svg">svg/az.svg</file>
|
||||
<file alias="kw.svg">svg/kw.svg</file>
|
||||
<file alias="za.svg">svg/za.svg</file>
|
||||
<file alias="my.svg">svg/my.svg</file>
|
||||
<file alias="id.svg">svg/id.svg</file>
|
||||
<file alias="om.svg">svg/om.svg</file>
|
||||
<file alias="fo.svg">svg/fo.svg</file>
|
||||
<file alias="mu.svg">svg/mu.svg</file>
|
||||
<file alias="cg.svg">svg/cg.svg</file>
|
||||
<file alias="ir.svg">svg/ir.svg</file>
|
||||
<file alias="mr.svg">svg/mr.svg</file>
|
||||
<file alias="ky.svg">svg/ky.svg</file>
|
||||
<file alias="vg.svg">svg/vg.svg</file>
|
||||
<file alias="es-ct.svg">svg/es-ct.svg</file>
|
||||
<file alias="kr.svg">svg/kr.svg</file>
|
||||
<file alias="er.svg">svg/er.svg</file>
|
||||
<file alias="me.svg">svg/me.svg</file>
|
||||
<file alias="bw.svg">svg/bw.svg</file>
|
||||
<file alias="zw.svg">svg/zw.svg</file>
|
||||
<file alias="jp.svg">svg/jp.svg</file>
|
||||
<file alias="ls.svg">svg/ls.svg</file>
|
||||
<file alias="ch.svg">svg/ch.svg</file>
|
||||
<file alias="pk.svg">svg/pk.svg</file>
|
||||
<file alias="eh.svg">svg/eh.svg</file>
|
||||
<file alias="dm.svg">svg/dm.svg</file>
|
||||
<file alias="pg.svg">svg/pg.svg</file>
|
||||
<file alias="se.svg">svg/se.svg</file>
|
||||
<file alias="xk.svg">svg/xk.svg</file>
|
||||
<file alias="im.svg">svg/im.svg</file>
|
||||
<file alias="ki.svg">svg/ki.svg</file>
|
||||
<file alias="ag.svg">svg/ag.svg</file>
|
||||
<file alias="sn.svg">svg/sn.svg</file>
|
||||
<file alias="gb.svg">svg/gb.svg</file>
|
||||
<file alias="am.svg">svg/am.svg</file>
|
||||
<file alias="tt.svg">svg/tt.svg</file>
|
||||
<file alias="mq.svg">svg/mq.svg</file>
|
||||
<file alias="et.svg">svg/et.svg</file>
|
||||
<file alias="hn.svg">svg/hn.svg</file>
|
||||
<file alias="mh.svg">svg/mh.svg</file>
|
||||
<file alias="tl.svg">svg/tl.svg</file>
|
||||
<file alias="ly.svg">svg/ly.svg</file>
|
||||
<file alias="jm.svg">svg/jm.svg</file>
|
||||
<file alias="af.svg">svg/af.svg</file>
|
||||
<file alias="aq.svg">svg/aq.svg</file>
|
||||
<file alias="mw.svg">svg/mw.svg</file>
|
||||
<file alias="kn.svg">svg/kn.svg</file>
|
||||
<file alias="tm.svg">svg/tm.svg</file>
|
||||
<file alias="as.svg">svg/as.svg</file>
|
||||
<file alias="cu.svg">svg/cu.svg</file>
|
||||
<file alias="si.svg">svg/si.svg</file>
|
||||
<file alias="gr.svg">svg/gr.svg</file>
|
||||
<file alias="hr.svg">svg/hr.svg</file>
|
||||
<file alias="kp.svg">svg/kp.svg</file>
|
||||
<file alias="de.svg">svg/de.svg</file>
|
||||
<file alias="bd.svg">svg/bd.svg</file>
|
||||
<file alias="rw.svg">svg/rw.svg</file>
|
||||
<file alias="sa.svg">svg/sa.svg</file>
|
||||
<file alias="mg.svg">svg/mg.svg</file>
|
||||
<file alias="np.svg">svg/np.svg</file>
|
||||
<file alias="nl.svg">svg/nl.svg</file>
|
||||
<file alias="al.svg">svg/al.svg</file>
|
||||
<file alias="ge.svg">svg/ge.svg</file>
|
||||
<file alias="gm.svg">svg/gm.svg</file>
|
||||
<file alias="mt.svg">svg/mt.svg</file>
|
||||
<file alias="pl.svg">svg/pl.svg</file>
|
||||
<file alias="cy.svg">svg/cy.svg</file>
|
||||
<file alias="co.svg">svg/co.svg</file>
|
||||
<file alias="ne.svg">svg/ne.svg</file>
|
||||
<file alias="sv.svg">svg/sv.svg</file>
|
||||
<file alias="la.svg">svg/la.svg</file>
|
||||
<file alias="at.svg">svg/at.svg</file>
|
||||
<file alias="lb.svg">svg/lb.svg</file>
|
||||
<file alias="pr.svg">svg/pr.svg</file>
|
||||
<file alias="hk.svg">svg/hk.svg</file>
|
||||
<file alias="lt.svg">svg/lt.svg</file>
|
||||
<file alias="fr.svg">svg/fr.svg</file>
|
||||
<file alias="sb.svg">svg/sb.svg</file>
|
||||
<file alias="ca.svg">svg/ca.svg</file>
|
||||
<file alias="mx.svg">svg/mx.svg</file>
|
||||
<file alias="cd.svg">svg/cd.svg</file>
|
||||
<file alias="fm.svg">svg/fm.svg</file>
|
||||
<file alias="ml.svg">svg/ml.svg</file>
|
||||
<file alias="eu.svg">svg/eu.svg</file>
|
||||
<file alias="tc.svg">svg/tc.svg</file>
|
||||
<file alias="ug.svg">svg/ug.svg</file>
|
||||
<file alias="ee.svg">svg/ee.svg</file>
|
||||
|
||||
|
||||
|
||||
<file alias="rs.png">png/rs.png</file>
|
||||
<file alias="ml.png">png/ml.png</file>
|
||||
<file alias="ve.png">png/ve.png</file>
|
||||
<file alias="ws.png">png/ws.png</file>
|
||||
<file alias="na.png">png/na.png</file>
|
||||
<file alias="cd.png">png/cd.png</file>
|
||||
<file alias="tc.png">png/tc.png</file>
|
||||
<file alias="gf.png">png/gf.png</file>
|
||||
<file alias="ro.png">png/ro.png</file>
|
||||
<file alias="lk.png">png/lk.png</file>
|
||||
<file alias="sg.png">png/sg.png</file>
|
||||
<file alias="ng.png">png/ng.png</file>
|
||||
<file alias="au.png">png/au.png</file>
|
||||
<file alias="vi.png">png/vi.png</file>
|
||||
<file alias="kh.png">png/kh.png</file>
|
||||
<file alias="bt.png">png/bt.png</file>
|
||||
<file alias="pr.png">png/pr.png</file>
|
||||
<file alias="it.png">png/it.png</file>
|
||||
<file alias="sj.png">png/sj.png</file>
|
||||
<file alias="gh.png">png/gh.png</file>
|
||||
<file alias="gi.png">png/gi.png</file>
|
||||
<file alias="ar.png">png/ar.png</file>
|
||||
<file alias="kp.png">png/kp.png</file>
|
||||
<file alias="cf.png">png/cf.png</file>
|
||||
<file alias="bb.png">png/bb.png</file>
|
||||
<file alias="dj.png">png/dj.png</file>
|
||||
<file alias="gm.png">png/gm.png</file>
|
||||
<file alias="af.png">png/af.png</file>
|
||||
<file alias="la.png">png/la.png</file>
|
||||
<file alias="us-ca.png">png/us-ca.png</file>
|
||||
<file alias="hm.png">png/hm.png</file>
|
||||
<file alias="ht.png">png/ht.png</file>
|
||||
<file alias="by.png">png/by.png</file>
|
||||
<file alias="jo.png">png/jo.png</file>
|
||||
<file alias="az.png">png/az.png</file>
|
||||
<file alias="cw.png">png/cw.png</file>
|
||||
<file alias="im.png">png/im.png</file>
|
||||
<file alias="fr.png">png/fr.png</file>
|
||||
<file alias="il.png">png/il.png</file>
|
||||
<file alias="gb-nir.png">png/gb-nir.png</file>
|
||||
<file alias="ug.png">png/ug.png</file>
|
||||
<file alias="cz.png">png/cz.png</file>
|
||||
<file alias="kr.png">png/kr.png</file>
|
||||
<file alias="hn.png">png/hn.png</file>
|
||||
<file alias="nc.png">png/nc.png</file>
|
||||
<file alias="st.png">png/st.png</file>
|
||||
<file alias="ch.png">png/ch.png</file>
|
||||
<file alias="tr.png">png/tr.png</file>
|
||||
<file alias="al.png">png/al.png</file>
|
||||
<file alias="nl.png">png/nl.png</file>
|
||||
<file alias="mx.png">png/mx.png</file>
|
||||
<file alias="td.png">png/td.png</file>
|
||||
<file alias="ss.png">png/ss.png</file>
|
||||
<file alias="kw.png">png/kw.png</file>
|
||||
<file alias="bd.png">png/bd.png</file>
|
||||
<file alias="gb-wls.png">png/gb-wls.png</file>
|
||||
<file alias="uz.png">png/uz.png</file>
|
||||
<file alias="rw.png">png/rw.png</file>
|
||||
<file alias="ga.png">png/ga.png</file>
|
||||
<file alias="vn.png">png/vn.png</file>
|
||||
<file alias="ne.png">png/ne.png</file>
|
||||
<file alias="hu.png">png/hu.png</file>
|
||||
<file alias="gr.png">png/gr.png</file>
|
||||
<file alias="tf.png">png/tf.png</file>
|
||||
<file alias="ge.png">png/ge.png</file>
|
||||
<file alias="lgbt.png">png/lgbt.png</file>
|
||||
<file alias="so.png">png/so.png</file>
|
||||
<file alias="ls.png">png/ls.png</file>
|
||||
<file alias="io.png">png/io.png</file>
|
||||
<file alias="za.png">png/za.png</file>
|
||||
<file alias="cx.png">png/cx.png</file>
|
||||
<file alias="mt.png">png/mt.png</file>
|
||||
<file alias="ph.png">png/ph.png</file>
|
||||
<file alias="ax.png">png/ax.png</file>
|
||||
<file alias="km.png">png/km.png</file>
|
||||
<file alias="lv.png">png/lv.png</file>
|
||||
<file alias="bn.png">png/bn.png</file>
|
||||
<file alias="pn.png">png/pn.png</file>
|
||||
<file alias="vg.png">png/vg.png</file>
|
||||
<file alias="bs.png">png/bs.png</file>
|
||||
<file alias="fo.png">png/fo.png</file>
|
||||
<file alias="ag.png">png/ag.png</file>
|
||||
<file alias="co.png">png/co.png</file>
|
||||
<file alias="pe.png">png/pe.png</file>
|
||||
<file alias="sx.png">png/sx.png</file>
|
||||
<file alias="yt.png">png/yt.png</file>
|
||||
<file alias="bg.png">png/bg.png</file>
|
||||
<file alias="um.png">png/um.png</file>
|
||||
<file alias="ie.png">png/ie.png</file>
|
||||
<file alias="gq.png">png/gq.png</file>
|
||||
<file alias="sb.png">png/sb.png</file>
|
||||
<file alias="cr.png">png/cr.png</file>
|
||||
<file alias="lt.png">png/lt.png</file>
|
||||
<file alias="fk.png">png/fk.png</file>
|
||||
<file alias="pm.png">png/pm.png</file>
|
||||
<file alias="kn.png">png/kn.png</file>
|
||||
<file alias="th.png">png/th.png</file>
|
||||
<file alias="sn.png">png/sn.png</file>
|
||||
<file alias="iq.png">png/iq.png</file>
|
||||
<file alias="fj.png">png/fj.png</file>
|
||||
<file alias="bf.png">png/bf.png</file>
|
||||
<file alias="my.png">png/my.png</file>
|
||||
<file alias="hr.png">png/hr.png</file>
|
||||
<file alias="lr.png">png/lr.png</file>
|
||||
<file alias="gn.png">png/gn.png</file>
|
||||
<file alias="nu.png">png/nu.png</file>
|
||||
<file alias="pf.png">png/pf.png</file>
|
||||
<file alias="np.png">png/np.png</file>
|
||||
<file alias="aw.png">png/aw.png</file>
|
||||
<file alias="ps.png">png/ps.png</file>
|
||||
<file alias="si.png">png/si.png</file>
|
||||
<file alias="sr.png">png/sr.png</file>
|
||||
<file alias="jp.png">png/jp.png</file>
|
||||
<file alias="tz.png">png/tz.png</file>
|
||||
<file alias="id.png">png/id.png</file>
|
||||
<file alias="mh.png">png/mh.png</file>
|
||||
<file alias="mc.png">png/mc.png</file>
|
||||
<file alias="qa.png">png/qa.png</file>
|
||||
<file alias="to.png">png/to.png</file>
|
||||
<file alias="mw.png">png/mw.png</file>
|
||||
<file alias="pl.png">png/pl.png</file>
|
||||
<file alias="mz.png">png/mz.png</file>
|
||||
<file alias="je.png">png/je.png</file>
|
||||
<file alias="as.png">png/as.png</file>
|
||||
<file alias="sy.png">png/sy.png</file>
|
||||
<file alias="tl.png">png/tl.png</file>
|
||||
<file alias="tn.png">png/tn.png</file>
|
||||
<file alias="dz.png">png/dz.png</file>
|
||||
<file alias="ki.png">png/ki.png</file>
|
||||
<file alias="cc.png">png/cc.png</file>
|
||||
<file alias="mk.png">png/mk.png</file>
|
||||
<file alias="ke.png">png/ke.png</file>
|
||||
<file alias="ca.png">png/ca.png</file>
|
||||
<file alias="cu.png">png/cu.png</file>
|
||||
<file alias="mm.png">png/mm.png</file>
|
||||
<file alias="pa.png">png/pa.png</file>
|
||||
<file alias="gg.png">png/gg.png</file>
|
||||
<file alias="sk.png">png/sk.png</file>
|
||||
<file alias="sz.png">png/sz.png</file>
|
||||
<file alias="cm.png">png/cm.png</file>
|
||||
<file alias="bh.png">png/bh.png</file>
|
||||
<file alias="gb-eng.png">png/gb-eng.png</file>
|
||||
<file alias="ua.png">png/ua.png</file>
|
||||
<file alias="is.png">png/is.png</file>
|
||||
<file alias="pt.png">png/pt.png</file>
|
||||
<file alias="ky.png">png/ky.png</file>
|
||||
<file alias="pg.png">png/pg.png</file>
|
||||
<file alias="fi.png">png/fi.png</file>
|
||||
<file alias="cg.png">png/cg.png</file>
|
||||
<file alias="sv.png">png/sv.png</file>
|
||||
<file alias="ms.png">png/ms.png</file>
|
||||
<file alias="cl.png">png/cl.png</file>
|
||||
<file alias="bi.png">png/bi.png</file>
|
||||
<file alias="re.png">png/re.png</file>
|
||||
<file alias="mu.png">png/mu.png</file>
|
||||
<file alias="pk.png">png/pk.png</file>
|
||||
<file alias="hk.png">png/hk.png</file>
|
||||
<file alias="gp.png">png/gp.png</file>
|
||||
<file alias="xk.png">png/xk.png</file>
|
||||
<file alias="mq.png">png/mq.png</file>
|
||||
<file alias="do.png">png/do.png</file>
|
||||
<file alias="gu.png">png/gu.png</file>
|
||||
<file alias="tt.png">png/tt.png</file>
|
||||
<file alias="dk.png">png/dk.png</file>
|
||||
<file alias="md.png">png/md.png</file>
|
||||
<file alias="in.png">png/in.png</file>
|
||||
<file alias="er.png">png/er.png</file>
|
||||
<file alias="mf.png">png/mf.png</file>
|
||||
<file alias="gl.png">png/gl.png</file>
|
||||
<file alias="cn.png">png/cn.png</file>
|
||||
<file alias="gb-sct.png">png/gb-sct.png</file>
|
||||
<file alias="mr.png">png/mr.png</file>
|
||||
<file alias="mg.png">png/mg.png</file>
|
||||
<file alias="nf.png">png/nf.png</file>
|
||||
<file alias="mv.png">png/mv.png</file>
|
||||
<file alias="lc.png">png/lc.png</file>
|
||||
<file alias="eu.png">png/eu.png</file>
|
||||
<file alias="tm.png">png/tm.png</file>
|
||||
<file alias="tw.png">png/tw.png</file>
|
||||
<file alias="ye.png">png/ye.png</file>
|
||||
<file alias="om.png">png/om.png</file>
|
||||
<file alias="pw.png">png/pw.png</file>
|
||||
<file alias="li.png">png/li.png</file>
|
||||
<file alias="sc.png">png/sc.png</file>
|
||||
<file alias="tj.png">png/tj.png</file>
|
||||
<file alias="ir.png">png/ir.png</file>
|
||||
<file alias="bo.png">png/bo.png</file>
|
||||
<file alias="dm.png">png/dm.png</file>
|
||||
<file alias="bj.png">png/bj.png</file>
|
||||
<file alias="gb-zet.png">png/gb-zet.png</file>
|
||||
<file alias="gs.png">png/gs.png</file>
|
||||
<file alias="ly.png">png/ly.png</file>
|
||||
<file alias="me.png">png/me.png</file>
|
||||
<file alias="lu.png">png/lu.png</file>
|
||||
<file alias="sh.png">png/sh.png</file>
|
||||
<file alias="gw.png">png/gw.png</file>
|
||||
<file alias="eg.png">png/eg.png</file>
|
||||
<file alias="mo.png">png/mo.png</file>
|
||||
<file alias="se.png">png/se.png</file>
|
||||
<file alias="py.png">png/py.png</file>
|
||||
<file alias="ee.png">png/ee.png</file>
|
||||
<file alias="br.png">png/br.png</file>
|
||||
<file alias="vu.png">png/vu.png</file>
|
||||
<file alias="bl.png">png/bl.png</file>
|
||||
<file alias="ma.png">png/ma.png</file>
|
||||
<file alias="mn.png">png/mn.png</file>
|
||||
<file alias="tk.png">png/tk.png</file>
|
||||
<file alias="ni.png">png/ni.png</file>
|
||||
<file alias="ck.png">png/ck.png</file>
|
||||
<file alias="ec.png">png/ec.png</file>
|
||||
<file alias="no.png">png/no.png</file>
|
||||
<file alias="zm.png">png/zm.png</file>
|
||||
<file alias="gy.png">png/gy.png</file>
|
||||
<file alias="wf.png">png/wf.png</file>
|
||||
<file alias="kz.png">png/kz.png</file>
|
||||
<file alias="sl.png">png/sl.png</file>
|
||||
<file alias="us.png">png/us.png</file>
|
||||
<file alias="gd.png">png/gd.png</file>
|
||||
<file alias="sd.png">png/sd.png</file>
|
||||
<file alias="sm.png">png/sm.png</file>
|
||||
<file alias="ci.png">png/ci.png</file>
|
||||
<file alias="mp.png">png/mp.png</file>
|
||||
<file alias="zw.png">png/zw.png</file>
|
||||
<file alias="ao.png">png/ao.png</file>
|
||||
<file alias="de.png">png/de.png</file>
|
||||
<file alias="ad.png">png/ad.png</file>
|
||||
<file alias="cv.png">png/cv.png</file>
|
||||
<file alias="ae.png">png/ae.png</file>
|
||||
<file alias="tv.png">png/tv.png</file>
|
||||
<file alias="nz.png">png/nz.png</file>
|
||||
<file alias="sa.png">png/sa.png</file>
|
||||
<file alias="et.png">png/et.png</file>
|
||||
<file alias="nr.png">png/nr.png</file>
|
||||
<file alias="va.png">png/va.png</file>
|
||||
<file alias="gt.png">png/gt.png</file>
|
||||
<file alias="at.png">png/at.png</file>
|
||||
<file alias="jm.png">png/jm.png</file>
|
||||
<file alias="es.png">png/es.png</file>
|
||||
<file alias="gb.png">png/gb.png</file>
|
||||
<file alias="bz.png">png/bz.png</file>
|
||||
<file alias="ba.png">png/ba.png</file>
|
||||
<file alias="kg.png">png/kg.png</file>
|
||||
<file alias="am.png">png/am.png</file>
|
||||
<file alias="lb.png">png/lb.png</file>
|
||||
<file alias="vc.png">png/vc.png</file>
|
||||
<file alias="ai.png">png/ai.png</file>
|
||||
<file alias="bw.png">png/bw.png</file>
|
||||
<file alias="be.png">png/be.png</file>
|
||||
<file alias="tg.png">png/tg.png</file>
|
||||
<file alias="ru.png">png/ru.png</file>
|
||||
<file alias="cy.png">png/cy.png</file>
|
||||
<file alias="bm.png">png/bm.png</file>
|
||||
<file alias="bv.png">png/bv.png</file>
|
||||
<file alias="fm.png">png/fm.png</file>
|
||||
<file alias="uy.png">png/uy.png</file>
|
||||
</qresource>
|
||||
</RCC>
|
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 2.6 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 3.6 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 1.5 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 2.0 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 3.5 KiB |
After Width: | Height: | Size: 1.4 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 3.9 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 3.0 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.5 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 2.9 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 2.8 KiB |
After Width: | Height: | Size: 1.7 KiB |
After Width: | Height: | Size: 2.2 KiB |
After Width: | Height: | Size: 3.4 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 3.2 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 3.8 KiB |
After Width: | Height: | Size: 4.2 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 1.9 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 1.8 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 3.3 KiB |
After Width: | Height: | Size: 4.0 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 4.5 KiB |
After Width: | Height: | Size: 3.7 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 3.1 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.7 KiB |
After Width: | Height: | Size: 2.4 KiB |
After Width: | Height: | Size: 2.3 KiB |
After Width: | Height: | Size: 2.1 KiB |
After Width: | Height: | Size: 2.5 KiB |