Clean up repository

This commit is contained in:
Dmitriy Simushev 2013-09-27 16:52:12 +04:00
parent d310943b0e
commit 3be9d20a31
1058 changed files with 0 additions and 49381 deletions

17
.gitignore vendored
View File

@ -1,17 +0,0 @@
bin
src/messenger/.idea/workspace.xml
src/messenger/mibew/install/package
src/messenger/absent_*
src/messenger/release*
src/mibewjava/.idea/workspace.xml
src/mibewjava/org.mibew.notifier/resources/
mibew.ini
.DS_Store
# No index actual configuration files
src/messenger/mibew/libs/config.php
src/messenger/tests/server_side/mibew/libs/config.php
# No index plugins
src/messenger/mibew/plugins/*
!src/messenger/mibew/plugins/.keep

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 348 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.9 KiB

Binary file not shown.

Binary file not shown.

View File

@ -1 +0,0 @@
messenger

View File

@ -1,31 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectCodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<option name="OTHER_INDENT_OPTIONS">
<value>
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="true" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</value>
</option>
<XML>
<option name="XML_LEGACY_SETTINGS_IMPORTED" value="true" />
</XML>
<codeStyleSettings language="PHP">
<indentOptions>
<option name="USE_TAB_CHARACTER" value="true" />
</indentOptions>
</codeStyleSettings>
</value>
</option>
<option name="USE_PER_PROJECT_SETTINGS" value="true" />
</component>
</project>

View File

@ -1,13 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="Encoding" useUTFGuessing="true" native2AsciiForPropertiesFiles="false">
<file url="file://$PROJECT_DIR$" charset="UTF-8" />
<file url="file://$PROJECT_DIR$/mibew/locales/be/properties" charset="windows-1251" />
<file url="file://$PROJECT_DIR$/mibew/locales/bg/properties" charset="windows-1251" />
<file url="file://$PROJECT_DIR$/mibew/locales/ca/properties" charset="ISO-8859-1" />
<file url="file://$PROJECT_DIR$/mibew/locales/ru/properties" charset="windows-1251" />
<file url="file://$PROJECT_DIR$/mibew/locales/sp/properties" charset="ISO-8859-1" />
<file url="file://$PROJECT_DIR$/mibew/locales/ua/properties" charset="windows-1251" />
</component>
</project>

View File

@ -1,11 +0,0 @@
<component name="InspectionProjectProfileManager">
<profile version="1.0" is_locked="false">
<option name="myName" value="Project Default" />
<option name="myLocal" value="false" />
<inspection_tool class="SpellCheckingInspection" enabled="false" level="TYPO" enabled_by_default="false">
<option name="processCode" value="true" />
<option name="processLiterals" value="true" />
<option name="processComments" value="true" />
</inspection_tool>
</profile>
</component>

View File

@ -1,7 +0,0 @@
<component name="InspectionProjectProfileManager">
<settings>
<option name="PROJECT_PROFILE" value="Project Default" />
<option name="USE_PROJECT_PROFILE" value="true" />
<version value="1.0" />
</settings>
</component>

View File

@ -1,15 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<module type="WEB_MODULE" version="4">
<component name="NewModuleRootManager">
<content url="file://$MODULE_DIR$" />
<orderEntry type="inheritedJdk" />
<orderEntry type="sourceFolder" forTests="false" />
<orderEntry type="module-library">
<library name="PHP">
<CLASSES />
<SOURCES />
</library>
</orderEntry>
</component>
</module>

View File

@ -1,8 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectResources">
<default-html-doctype>http://www.w3.org/1999/xhtml</default-html-doctype>
</component>
<component name="ProjectRootManager" version="2" />
</project>

View File

@ -1,9 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="ProjectModuleManager">
<modules>
<module fileurl="file://$PROJECT_DIR$/.idea/messenger.iml" filepath="$PROJECT_DIR$/.idea/messenger.iml" />
</modules>
</component>
</project>

View File

@ -1,80 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="CodeStyleSettingsManager">
<option name="PER_PROJECT_SETTINGS">
<value>
<ADDITIONAL_INDENT_OPTIONS fileType="js">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="jsp">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="php">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="sass">
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="sql">
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="xml">
<option name="INDENT_SIZE" value="4" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
<ADDITIONAL_INDENT_OPTIONS fileType="yml">
<option name="INDENT_SIZE" value="2" />
<option name="CONTINUATION_INDENT_SIZE" value="8" />
<option name="TAB_SIZE" value="4" />
<option name="USE_TAB_CHARACTER" value="false" />
<option name="SMART_TABS" value="false" />
<option name="LABEL_INDENT_SIZE" value="0" />
<option name="LABEL_INDENT_ABSOLUTE" value="false" />
<option name="USE_RELATIVE_INDENTS" value="false" />
</ADDITIONAL_INDENT_OPTIONS>
</value>
</option>
</component>
</project>

View File

@ -1,5 +0,0 @@
<component name="DependencyValidationManager">
<state>
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
</state>
</component>

View File

@ -1,7 +0,0 @@
<?xml version="1.0" encoding="UTF-8"?>
<project version="4">
<component name="VcsDirectoryMappings">
<mapping directory="$PROJECT_DIR$/../.." vcs="Git" />
</component>
</project>

View File

@ -1,430 +0,0 @@
<project name="mibew messenger" default="all">
<property name="mibew_path" value="mibew" />
<property name="closure.c" value="/opt/closure/compiler.jar" />
<property name="handlebars" value="handlebars" />
<property name="dialogs_styles_path" value="${mibew_path}/styles/dialogs" />
<property name="js_path" value="${mibew_path}/js" />
<!-- Compile Handlebars templates for dialogs styles -->
<target name="styles_handlebars" description="Compile Handlebars templates for dialogs styles">
<echo>Flatten templates directory structure</echo>
<!-- Use system 'mkdir' instead of ant 'mkdir' task because it do not
work with dirsets -->
<apply executable="mkdir" addsourcefile="false">
<targetfile />
<dirset dir=".">
<include name="${dialogs_styles_path}/*/handlebars_templates" />
</dirset>
<mapper type="glob" from="*/handlebars_templates" to="*/handlebars_templates_tmp" />
</apply>
<!-- Flatten templates directory structure -->
<apply executable="tools/flat_cp" force="true">
<srcfile />
<targetfile />
<arg value="handlebars_templates" />
<fileset dir=".">
<include name="${dialogs_styles_path}/*/handlebars_templates/**/*.handlebars" />
</fileset>
<mapper type="regexp" from="^(.*)/handlebars_templates/(.*)$$" to="\1/handlebars_templates_tmp" />
</apply>
<echo>Compile templates</echo>
<!-- Compile templates -->
<apply executable="${handlebars}">
<arg value="-f"/>
<targetfile />
<dirset dir=".">
<include name="${dialogs_styles_path}/*/handlebars_templates_tmp" />
</dirset>
<mapper type="glob" from="*/handlebars_templates_tmp" to="*/js/compiled/templates_tmp.js" />
</apply>
<!-- Use closule compiler instead of handlebars minifyer (-m flag)
because of handlebars not insert line breaks.
Very long lines are cutted by ant and this brings problems -->
<apply executable="java">
<arg value="-jar" />
<arg value="${closure.c}" />
<arg value="--js" />
<srcfile />
<arg value="--js_output_file" />
<targetfile />
<fileset dir=".">
<include name="${dialogs_styles_path}/*/js/compiled/templates_tmp.js" />
</fileset>
<mapper type="glob" from="*_tmp.js" to="*_tmp.c.js" />
</apply>
<!-- Add license info. Use move because of it is the best way to append
some info to files -->
<move todir="${dialogs_styles_path}" overwrite="true">
<fileset dir="${dialogs_styles_path}"/>
<mapper type="glob" from="*/js/compiled/templates_tmp.c.js" to="*/js/compiled/templates.js"/>
<filterchain>
<!-- Add header -->
<concatfilter prepend="tools/compiled_templates_header.txt" />
<!-- Skip empty lines -->
<linecontainsregexp negate="true">
<regexp pattern="^\s+$$" />
</linecontainsregexp>
</filterchain>
</move>
<!-- Remove all temporary files -->
<!-- Use system 'rm' instead of ant
'delete' task because it do not work with dirsets -->
<echo>Remove temporary files</echo>
<apply executable="rm">
<arg value="-r" />
<arg value="-f" />
<dirset dir=".">
<include name="${dialogs_styles_path}/*/handlebars_templates_tmp" />
</dirset>
</apply>
<delete>
<fileset dir=".">
<include name="${dialogs_styles_path}/*/js/compiled/templates_tmp.js" />
</fileset>
</delete>
<echo>Done</echo>
</target>
<!-- Compile and concatenate JavaScript files for dialog styles -->
<target name="styles_js" description="Compile JavaScript files for all dialogs styles">
<echo>Compile and concatenate JavaScript files for dialogs styles:</echo>
<!-- Create temporary directories for compiled JavaScript files -->
<echo>Create temporary directories</echo>
<apply executable="mkdir" addsourcefile="false">
<targetfile />
<dirset dir=".">
<include name="${dialogs_styles_path}/*/js/source" />
</dirset>
<mapper type="glob" from="*/source" to="*/tmp" />
</apply>
<!-- Compile JavaScript files -->
<echo>Compile JavaScript files</echo>
<apply executable="java">
<arg value="-jar" />
<arg value="${closure.c}" />
<arg value="--js" />
<srcfile />
<arg value="--js_output_file" />
<targetfile />
<fileset dir=".">
<include name="${dialogs_styles_path}/*/js/source/*.js" />
</fileset>
<mapper type="regexp" from="^(.+)/source/(.+)$$" to="\1/tmp/\2" />
</apply>
<!-- Concatenate all scripts in one file. Use special script for
expanding wildcards. -->
<echo>Concatenate JavaScript files</echo>
<apply executable="tools/cat">
<srcfile suffix="/*.js"/>
<targetfile />
<dirset dir=".">
<include name="${dialogs_styles_path}/*/js/tmp" />
</dirset>
<mapper type="glob" from="*/tmp" to="*/compiled/scripts.js" />
</apply>
<!-- Remove temporary directories -->
<echo>Remove temporary directories</echo>
<apply executable="rm">
<arg value="-r" />
<arg value="-f" />
<dirset dir=".">
<include name="${dialogs_styles_path}/*/js/tmp" />
</dirset>
</apply>
<echo>Done</echo>
</target>
<!-- Build all stuff related to dialogs styles -->
<target name="styles_all" depends="styles_handlebars,styles_js" description="Run styles_handlebars and styles_js targets">
<echo>Dialogs styles built.</echo>
</target>
<!-- Compile all JavaScript files of the Mibew Core -->
<target name="core_js">
<echo>Compile JavaScript files of the Mibew Core</echo>
<!-- Copy directory tree from source to compiled -->
<echo>Copy directory tree</echo>
<copy todir="${js_path}/compiled">
<dirset dir="${js_path}/source">
<include name="**" />
</dirset>
</copy>
<!-- Compile JavaScript files -->
<echo>Compile JavaScript files</echo>
<apply executable="java">
<arg value="-jar" />
<arg value="${closure.c}" />
<arg value="--js" />
<srcfile />
<arg value="--js_output_file" />
<targetfile />
<fileset dir=".">
<include name="${js_path}/source/**/*.js" />
</fileset>
<mapper type="regexp" from="^(.+)/source/(.+)$$" to="\1/compiled/\2" />
</apply>
<echo>Done</echo>
</target>
<!-- Build JavaScript application -->
<target name="app_js" depends="core_handlebars">
<echo>Build "${app_name}" JavaScript application</echo>
<!-- Remove old application file -->
<delete file="${js_path}/compiled/${app_name}_app.js" />
<!-- Append application files to the result file -->
<concat destfile="${js_path}/compiled/${app_name}_app.js" eol="lf">
<!-- Append templates -->
<filelist dir="${js_path}/templates/compiled" files="${app_name}_app.tpl.js" />
<!-- Append application static initialization code -->
<filelist dir="${js_path}/compiled/${app_name}" files="init.js" />
<!-- Include files from ${js_path}/compiled/${app_name}/ -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="*.js" />
<exclude name="init.js" />
<exclude name="app.js" />
</fileset>
<!-- Include models files -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="models/**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="models/**/*.js" />
<!-- Exclude base files -->
<exclude name="models/**/base*.js" />
</fileset>
<!-- Include collections files -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="collections/**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="collections/**/*.js" />
<!-- Exclude base files -->
<exclude name="collections/**/base*.js" />
</fileset>
<!-- Include models views files -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="model_views/**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="model_views/**/*.js" />
<!-- Exclude base files -->
<exclude name="model_views/**/base*.js" />
</fileset>
<!-- Include collections views files -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="collection_views/**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="collection_views/**/*.js" />
<!-- Exclude base files -->
<exclude name="collection_views/**/base*.js" />
</fileset>
<!-- Include regions files -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="regions/**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="regions/**/*.js" />
<!-- Exclude base files -->
<exclude name="regions/**/base*.js" />
</fileset>
<!-- Include layouts files -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="layouts/**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="layouts/**/*.js" />
<!-- Exclude base files -->
<exclude name="layouts/**/base*.js" />
</fileset>
<!-- Include all other files -->
<fileset dir="${js_path}/compiled/${app_name}">
<include name="**/base*.js" />
<exclude name="models/**/base*.js" />
<exclude name="collections/**/base*.js" />
<exclude name="model_views/**/base*.js" />
<exclude name="collection_views/**/base*.js" />
<exclude name="regions/**/base*.js" />
<exclude name="layouts/**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="**/*.js" />
<!-- Exclude files from ${js_path}/compiled/${app_name}/ -->
<exclude name="*.js" />
<!-- Exclude models, collections, views, regions and layouts
files -->
<exclude name="models/**/*.js" />
<exclude name="collections/**/*.js" />
<exclude name="model_views/**/*.js" />
<exclude name="collection_views/**/*.js" />
<exclude name="regions/**/*.js" />
<exclude name="layouts/**/*.js" />
<!-- Exclude base files -->
<exclude name="**/base*.js" />
</fileset>
<fileset dir="${js_path}/compiled/${app_name}">
<include name="app.js" />
</fileset>
<!-- Apply filters -->
<filterchain>
<!-- Skip empty lines -->
<linecontainsregexp negate="true">
<regexp pattern="^\s+$$" />
</linecontainsregexp>
</filterchain>
</concat>
<echo>Done</echo>
</target>
<!-- Build JavaScript files related to default application -->
<target name="default_app_js" depends="core_js" description="Build JavaScript files related to default application">
<antcall target="app_js">
<param name="app_name" value="default" />
</antcall>
<echo>Default JavaScript application built.</echo>
</target>
<!-- Compile and concatenate JavaScript files related to chat application -->
<target name="chat_app_js" depends="default_app_js" description="Build JavaScript files related to chat application">
<antcall target="app_js">
<param name="app_name" value="chat" />
</antcall>
<echo>Chat JavaScript application built.</echo>
</target>
<!-- Compile and concatenate JavaScript files related to users application -->
<target name="users_app_js" depends="default_app_js" description="Build JavaScript files related to users application">
<antcall target="app_js">
<param name="app_name" value="users" />
</antcall>
<echo>Users JavaScript application built.</echo>
</target>
<!-- Compile and concatenate JavaScript files related to thread log application -->
<target name="thread_log_app_js" depends="default_app_js" description="Build JavaScript files related to thread log application">
<antcall target="app_js">
<param name="app_name" value="thread_log" />
</antcall>
<echo>Thread log JavaScript application built.</echo>
</target>
<!-- Compile Handlebars templates of the Core -->
<target name="core_handlebars" description="Compile Handlebars templates of the Core">
<echo>Compile Handlebars templates of the Core</echo>
<!-- Compile applications templates -->
<apply executable="${handlebars}">
<arg value="-f"/>
<targetfile />
<dirset dir=".">
<include name="${js_path}/templates/source/*" />
</dirset>
<mapper type="regexp" from="^(.*)/source/(.*)$$" to="\1/compiled/\2_app_tmp.tpl.js" />
</apply>
<!-- Build misc files -->
<apply executable="${handlebars}">
<arg value="-f"/>
<targetfile />
<fileset dir=".">
<include name="${js_path}/templates/source/*.handlebars" />
</fileset>
<mapper type="regexp" from="^(.*)/source/(.*)\.handlebars$$" to="\1/compiled/\2_tmp.tpl.js" />
</apply>
<!-- Use closule compiler instead of handlebars minifyer (-m flag)
because of handlebars not insert line breaks.
Very long lines are cutted by ant and this brings problems -->
<apply executable="java">
<arg value="-jar" />
<arg value="${closure.c}" />
<arg value="--js" />
<srcfile />
<arg value="--js_output_file" />
<targetfile />
<fileset dir=".">
<include name="${js_path}/templates/compiled/*_app_tmp.tpl.js" />
</fileset>
<mapper type="glob" from="*_app_tmp.tpl.js" to="*_app_tmp.c.tpl.js" />
</apply>
<!-- Add license info. Use move because of it is the best way to append
some info to files -->
<move todir="${js_path}/templates/compiled" overwrite="true">
<fileset dir="${js_path}/templates/compiled">
<include name="*_tmp.c.tpl.js" />
</fileset>
<mapper type="glob" from="*_tmp.c.tpl.js" to="*.tpl.js"/>
<filterchain>
<!-- Add header -->
<concatfilter prepend="tools/compiled_templates_header.txt" />
<!-- Skip empty lines -->
<linecontainsregexp negate="true">
<regexp pattern="^\s+$$" />
</linecontainsregexp>
</filterchain>
</move>
<!-- Remove all temporary files. -->
<delete>
<fileset dir="${js_path}/templates/compiled">
<include name="*_tmp.tpl.js" />
</fileset>
</delete>
<echo>Done</echo>
</target>
<!-- Build all project -->
<target name="all" depends="chat_app_js,thread_log_app_js,users_app_js,styles_all" description="Build everything">
<echo>Mibew Messenger built.</echo>
</target>
</project>

View File

@ -1,56 +0,0 @@
#!/usr/bin/perl
sub read_transl($) {
my($from) = @_;
my %translation = ();
open(IN, "mibew/locales/$from/properties");
while(<IN>) {
chomp;
if(/^([\w\.]+)=(.*)$/) {
if($1 ne "encoding" && $1 ne "output_charset" && $1 ne "output_encoding") {
$translation{$1} = $2;
}
} else {
die "wrong line in $from: $_\n";
}
}
close(IN);
return %translation;
}
%tr_en = read_transl("en");
@all_keys = keys %tr_en;
sub check_transl($%) {
my($name,%tr) = @_;
print "checking $name...\n";
my @totransl = ();
for $key (@all_keys) {
unless(exists $tr{$key}) {
push @totransl, "$key=".$tr_en{$key};
}
}
for $key(keys %tr) {
unless(exists $tr_en{$key}) {
print "unknown key in $name: $key\n";
}
}
if($#totransl >= 0) {
print "@{[$#totransl+1]} lines absent in locales/$name/properties\n";
open(OUT, "> absent_$name");
for(sort @totransl) {
print OUT "$_\n";
}
close(OUT);
}
}
check_transl("ru", read_transl("ru"));
check_transl("fr", read_transl("fr"));
check_transl("de", read_transl("de"));
check_transl("sp", read_transl("sp"));
check_transl("it", read_transl("it"));
check_transl("pl", read_transl("pl"));
check_transl("zh-tw", read_transl("zh-tw"));

View File

@ -1,245 +0,0 @@
#!/usr/bin/perl
use Digest::MD5 qw(md5 md5_hex md5_base64);
@rules = (
["redirect(ed)?\\.tpl", 1],
["\\.tpl", 0],
["view/license.php", 0],
["view/themes.php", 2],
["view/translate.php", 2],
["view/translatelist.php", 2],
["view/settings.php", 2],
["view/updates.php", 2],
["view/features.php", 2],
["view/performance.php", 2],
["view/avatar.php", 2],
["view/permissions.php", 2],
["view/agent.php", 2],
["view/agents.php", 2],
["view/group.php", 2],
["view/groupmembers.php", 2],
["view/groups.php", 2],
["view/operator_groups.php", 2],
["view/gen_button.php", 2],
["view/install_err.php", 2],
["view/install_index.php", 2],
["view/.*\\.php", 1],
["install/.*\\.php", 2],
["operator/themes.php", 2],
["operator/translate.php", 2],
["operator/settings.php", 2],
["operator/updates.php", 2],
["operator/features.php", 2],
["operator/performance.php", 2],
["operator/avatar.php", 2],
["operator/permissions.php", 2],
["operator/operator.php", 2],
["operator/operators.php", 2],
["operator/group.php", 2],
["operator/groupmembers.php", 2],
["operator/groups.php", 2],
["operator/opgroups.php", 2],
["operator/getcode.php", 2],
["operator/.*\\.php", 1],
["mibew/client.php", 0],
["mibew/leavemessage.php", 0],
["mibew/captcha.php", 0],
["mibew/license.php", 0],
["mibew/mail.php", 0],
["libs/operator_settings.php", 2],
["mibew/libs/chat.php", 0],
["libs/pagination.php", 1],
["libs/settings.php", 2],
["libs/groups.php", 2],
["libs/demothread.php", 2],
["mibew/thread.php", 0],
["mibew/b.php", 0],
["mibew/button.php", 0],
["mibew/index.php", 0],
["mibew/libs/.*\\.php", 1],
);
%messagekeys = (
"localeid" => 0,
"output_charset" => 0,
"output_encoding" => 0,
"harderrors.header" => 0,
"errors.required" => 0,
"errors.wrong_field" => 0,
"errors.file.move.error" => 2,
"errors.invalid.file.type" => 2,
"errors.file.size.exceeded" => 2,
"permission.admin" => 1,
"permission.takeover" => 1,
"permission.viewthreads" => 1,
"chat.thread.state_chatting_with_agent" => 1,
"chat.thread.state_closed" => 1,
"chat.thread.state_loading" => 1,
"chat.thread.state_wait" => 1,
"chat.thread.state_wait_for_another_agent" => 1,
"clients.queue.chat" => 1,
"clients.queue.prio" => 1,
"clients.queue.wait" => 1,
);
$mibewPath = "mibew";
%urls = ();
%usermessages = ();
%operatormessages = ();
$current_level = 0;
sub usemsg($) {
my ($m) = @_;
$messagekeys{$m} = exists $messagekeys{$m} && $messagekeys{$m} < $current_level ? $messagekeys{$m} : $current_level;
if($current_level == -1) {
print " .. $m\n";
}
}
sub file_content($) {
my $input = $_[0];
open( IN1, "< $input" ) or die "cannot find file $input";
my $oldslash = $/;
$/ = EOI;
$content = <IN1>;
close( IN1 );
if($content =~ s/\r//g) {
open( OUT1, "> $input") or die "cannot fix $input";
print OUT1 $content;
close(OUT1);
}
$/ = $oldslash;
return $content;
}
sub process_tpl($) {
my ($filename) = @_;
my $m = file_content($filename);
while( $m =~ /\${msg:([\w\.]+)(,[\w\.]+)?}/g ) {
usemsg($1);
}
while( $m =~ /\${url:([\w\.]+)(,[\w\.]+)?}/g ) {
usemsg($1);
$urls{"%$1"} = 1;
}
}
sub process_php($) {
my ($source) = @_;
my $content = file_content($source);
$content =~ s/<\?xml version=\\"1\.0\\" encoding=\\"UTF-8\\"\?>//;
while( $content =~ s/<\?(?!xml)(.*?)\?>//s ) {
my $inner = $1;
while($inner =~ s/(getlocal|getstring|no_field)2?_?\((.*?)[,\)]//s) {
my $firstarg = $2;
if( $firstarg =~ /^["']([\w\.]+)['"]$/) {
usemsg($1);
} elsif($firstarg =~ /^\$\w+$/ || $firstarg eq '"$var.header"' || $firstarg eq '"permission.$permid"' || $firstarg eq '$threadstate_key[$thread[\'istate\']]') {
# skip
} else {
print "> unknown: $firstarg\n";
}
}
}
}
sub file_checksum($) {
my ($source) = @_;
if($source =~ /\.(png|gif|jpg|ico|wav)$/ || $source =~ /config\.php$/) {
return "-";
}
my $content = file_content($source);
return md5_hex($content);
}
@allsources = ();
sub process_one($) {
my($source) = @_;
push @allsources, $source unless $source =~ /$mibewPath\/locales/ && $source !~ /$mibewPath\/locales\/(en|names)/ || $source =~ /\/package$/;
if($source !~ /\.(php|tpl)$/) {
return;
}
$current_level = -1;
A: foreach $rule (@rules) {
my $key = $$rule[0];
if($source =~ /$key/) {
$current_level = $$rule[1];
last A;
}
}
if($current_level < 0 || $current_level > 2) {
print "not detected for: $source\n";
$current_level = 0;
}
if($source =~ /\.php$/) {
# print "$source ($current_level)\n";
process_php($source);
} elsif($source =~ /\.tpl$/) {
process_tpl($source);
} else {
#print ". $source\n";
}
}
sub process_files($) {
my($from) = @_;
opendir(DIR, $from) || die "can't opendir $from: $!";
my @content = readdir(DIR);
closedir DIR;
for(grep { -f "$from/$_" && ($_ !~ /^\./ || $_ eq ".htaccess") } @content) {
process_one("$from/$_");
}
for(grep { -d "$from/$_" && $_ !~ /^\./ } @content) {
process_files("$from/$_");
}
}
process_files($mibewPath);
# fix
$messagekeys{'page.analysis.userhistory.title'} = 1;
$messagekeys{'errors.failed.uploading.file'} = 2;
open( OUT, "> $mibewPath/locales/names/level1") or die "cannot write file, $!";
for $key(sort grep { $messagekeys{$_} == 0 } keys %messagekeys) {
print OUT "$key\n";
}
close( OUT );
open( OUT, "> $mibewPath/locales/names/level2") or die "cannot write file, $!";
for $key(sort grep { $messagekeys{$_} == 1 } keys %messagekeys) {
print OUT "$key\n";
}
close( OUT );
open( OUT, "> $mibewPath/install/package") or die "cannot write file, $!";
for $key(sort @allsources) {
$digest = file_checksum($key);
$key =~ s/$mibewPath\///;
print OUT "$key $digest\n";
}
close( OUT );

View File

@ -1,6 +0,0 @@
Options -Indexes
<IfModule mod_security.c>
SecFilterEngine Off
SecFilterScanPOST Off
</IfModule>

View File

@ -1,202 +0,0 @@
Apache License
Version 2.0, January 2004
http://www.apache.org/licenses/
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
1. Definitions.
"License" shall mean the terms and conditions for use, reproduction,
and distribution as defined by Sections 1 through 9 of this document.
"Licensor" shall mean the copyright owner or entity authorized by
the copyright owner that is granting the License.
"Legal Entity" shall mean the union of the acting entity and all
other entities that control, are controlled by, or are under common
control with that entity. For the purposes of this definition,
"control" means (i) the power, direct or indirect, to cause the
direction or management of such entity, whether by contract or
otherwise, or (ii) ownership of fifty percent (50%) or more of the
outstanding shares, or (iii) beneficial ownership of such entity.
"You" (or "Your") shall mean an individual or Legal Entity
exercising permissions granted by this License.
"Source" form shall mean the preferred form for making modifications,
including but not limited to software source code, documentation
source, and configuration files.
"Object" form shall mean any form resulting from mechanical
transformation or translation of a Source form, including but
not limited to compiled object code, generated documentation,
and conversions to other media types.
"Work" shall mean the work of authorship, whether in Source or
Object form, made available under the License, as indicated by a
copyright notice that is included in or attached to the work
(an example is provided in the Appendix below).
"Derivative Works" shall mean any work, whether in Source or Object
form, that is based on (or derived from) the Work and for which the
editorial revisions, annotations, elaborations, or other modifications
represent, as a whole, an original work of authorship. For the purposes
of this License, Derivative Works shall not include works that remain
separable from, or merely link (or bind by name) to the interfaces of,
the Work and Derivative Works thereof.
"Contribution" shall mean any work of authorship, including
the original version of the Work and any modifications or additions
to that Work or Derivative Works thereof, that is intentionally
submitted to Licensor for inclusion in the Work by the copyright owner
or by an individual or Legal Entity authorized to submit on behalf of
the copyright owner. For the purposes of this definition, "submitted"
means any form of electronic, verbal, or written communication sent
to the Licensor or its representatives, including but not limited to
communication on electronic mailing lists, source code control systems,
and issue tracking systems that are managed by, or on behalf of, the
Licensor for the purpose of discussing and improving the Work, but
excluding communication that is conspicuously marked or otherwise
designated in writing by the copyright owner as "Not a Contribution."
"Contributor" shall mean Licensor and any individual or Legal Entity
on behalf of whom a Contribution has been received by Licensor and
subsequently incorporated within the Work.
2. Grant of Copyright License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
copyright license to reproduce, prepare Derivative Works of,
publicly display, publicly perform, sublicense, and distribute the
Work and such Derivative Works in Source or Object form.
3. Grant of Patent License. Subject to the terms and conditions of
this License, each Contributor hereby grants to You a perpetual,
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
(except as stated in this section) patent license to make, have made,
use, offer to sell, sell, import, and otherwise transfer the Work,
where such license applies only to those patent claims licensable
by such Contributor that are necessarily infringed by their
Contribution(s) alone or by combination of their Contribution(s)
with the Work to which such Contribution(s) was submitted. If You
institute patent litigation against any entity (including a
cross-claim or counterclaim in a lawsuit) alleging that the Work
or a Contribution incorporated within the Work constitutes direct
or contributory patent infringement, then any patent licenses
granted to You under this License for that Work shall terminate
as of the date such litigation is filed.
4. Redistribution. You may reproduce and distribute copies of the
Work or Derivative Works thereof in any medium, with or without
modifications, and in Source or Object form, provided that You
meet the following conditions:
(a) You must give any other recipients of the Work or
Derivative Works a copy of this License; and
(b) You must cause any modified files to carry prominent notices
stating that You changed the files; and
(c) You must retain, in the Source form of any Derivative Works
that You distribute, all copyright, patent, trademark, and
attribution notices from the Source form of the Work,
excluding those notices that do not pertain to any part of
the Derivative Works; and
(d) If the Work includes a "NOTICE" text file as part of its
distribution, then any Derivative Works that You distribute must
include a readable copy of the attribution notices contained
within such NOTICE file, excluding those notices that do not
pertain to any part of the Derivative Works, in at least one
of the following places: within a NOTICE text file distributed
as part of the Derivative Works; within the Source form or
documentation, if provided along with the Derivative Works; or,
within a display generated by the Derivative Works, if and
wherever such third-party notices normally appear. The contents
of the NOTICE file are for informational purposes only and
do not modify the License. You may add Your own attribution
notices within Derivative Works that You distribute, alongside
or as an addendum to the NOTICE text from the Work, provided
that such additional attribution notices cannot be construed
as modifying the License.
You may add Your own copyright statement to Your modifications and
may provide additional or different license terms and conditions
for use, reproduction, or distribution of Your modifications, or
for any such Derivative Works as a whole, provided Your use,
reproduction, and distribution of the Work otherwise complies with
the conditions stated in this License.
5. Submission of Contributions. Unless You explicitly state otherwise,
any Contribution intentionally submitted for inclusion in the Work
by You to the Licensor shall be under the terms and conditions of
this License, without any additional terms or conditions.
Notwithstanding the above, nothing herein shall supersede or modify
the terms of any separate license agreement you may have executed
with Licensor regarding such Contributions.
6. Trademarks. This License does not grant permission to use the trade
names, trademarks, service marks, or product names of the Licensor,
except as required for reasonable and customary use in describing the
origin of the Work and reproducing the content of the NOTICE file.
7. Disclaimer of Warranty. Unless required by applicable law or
agreed to in writing, Licensor provides the Work (and each
Contributor provides its Contributions) on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
implied, including, without limitation, any warranties or conditions
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
PARTICULAR PURPOSE. You are solely responsible for determining the
appropriateness of using or redistributing the Work and assume any
risks associated with Your exercise of permissions under this License.
8. Limitation of Liability. In no event and under no legal theory,
whether in tort (including negligence), contract, or otherwise,
unless required by applicable law (such as deliberate and grossly
negligent acts) or agreed to in writing, shall any Contributor be
liable to You for damages, including any direct, indirect, special,
incidental, or consequential damages of any character arising as a
result of this License or out of the use or inability to use the
Work (including but not limited to damages for loss of goodwill,
work stoppage, computer failure or malfunction, or any and all
other commercial damages or losses), even if such Contributor
has been advised of the possibility of such damages.
9. Accepting Warranty or Additional Liability. While redistributing
the Work or Derivative Works thereof, You may choose to offer,
and charge a fee for, acceptance of support, warranty, indemnity,
or other liability obligations and/or rights consistent with this
License. However, in accepting such obligations, You may act only
on Your own behalf and on Your sole responsibility, not on behalf
of any other Contributor, and only if You agree to indemnify,
defend, and hold each Contributor harmless for any liability
incurred by, or claims asserted against, such Contributor by reason
of your accepting any such warranty or additional liability.
END OF TERMS AND CONDITIONS
APPENDIX: How to apply the Apache License to your work.
To apply the Apache License to your work, attach the following
boilerplate notice, with the fields enclosed by brackets "[]"
replaced with your own identifying information. (Don't include
the brackets!) The text should be enclosed in the appropriate
comment syntax for the file format. We also recommend that a
file or class name and description of purpose be included on the
same "printed page" as the copyright notice for easier
identification within third-party archives.
Copyright [yyyy] [name of copyright owner]
Licensed under the Apache License, Version 2.0 (the "License");
you may not use this file except in compliance with the License.
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
Unless required by applicable law or agreed to in writing, software
distributed under the License is distributed on an "AS IS" BASIS,
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
See the License for the specific language governing permissions and
limitations under the License.

View File

@ -1,41 +0,0 @@
Mibew Messenger
Copyright 2005-2013 the original author or authors.
REQUIREMENTS
* Apache web server 1.3.34 or above
* MySQL database 5.0 or above
* PHP 4.x or above with MySQL support
INSTALLATION
1. Create folder with name 'mibew' in the root of your website.
2. Upload all the files contained in this archive (retaining the directory structure) into created folder.
Be sure to chromo the mibew folder to 755 and the install folder to 644.
3. Add a MySQL database with the name 'mibew'
4. Edit /mibew/libs/config.php to the information needed to connect to the database
5. Using your web browser visit http://<yourdomain>/mibew/install/ and
hit 'Create tables'
6. Remove /mibew/install/ directory from your server
7. Logon as
user: admin
password: <empty>
8. Get button code and setup it on your site.
9. Change your password and name.
10. Wait for your visitors on 'Pending users' page.
On unix/linux platforms change the owner of /mibew/images/avatar folder
to the user, under which the web server is running (for instance, www).
The owner should have all rights on the folder /mibew/images/avatar
(chmod 700 /mibew/images/avatar).
UPDATE
1. Backup your /mibew/libs/config.php
2. Backup your /mibew/images/avatar folder.
3. Delete the items in the mibew folder on the server.
4. Upload all the files contained in the downloaded archive (retaining the directory structure) into mibew folder.
5. Re-edit the MySQL database settings you config.php
6. Visit http://<yourdomain>/mibew/install/ and follow the instructions to update database (if needed).
7. Remove /mibew/install/ directory from your server
8. Restore contents of /mibew/images/avatar folder.

View File

@ -1 +0,0 @@
Mibew/1.6.5

View File

@ -1,70 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
require_once('libs/init.php');
require_once('libs/chat.php');
require_once('libs/operator.php');
require_once('libs/groups.php');
require_once('libs/classes/thread.php');
$referer = isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "";
if($referer && isset($_SESSION['threadid'])) {
$thread = Thread::load($_SESSION['threadid']);
if ($thread && $thread->state != Thread::STATE_CLOSED) {
$msg = getstring2_("chat.client.visited.page", array($referer), $thread->locale);
$thread->postMessage(Thread::KIND_FOR_AGENT, $msg);
}
}
$image = verifyparam(isset($_GET['image']) ? "image" : "i", "/^\w+$/", "mibew");
$lang = verifyparam(isset($_GET['language']) ? "language" : "lang", "/^[\w-]{2,5}$/", "");
if(!$lang || !locale_exists($lang)) {
$lang = $current_locale;
}
$groupid = verifyparam( "group", "/^\d{1,8}$/", "");
if($groupid) {
if(Settings::get('enablegroups') == '1') {
$group = group_by_id($groupid);
if(!$group) {
$groupid = "";
}
} else {
$groupid = "";
}
}
$image_postfix = has_online_operators($groupid) ? "on" : "off";
$filename = "locales/${lang}/button/${image}_${image_postfix}.gif";
$fp = fopen($filename, 'rb') or die("no image");
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Pragma: no-cache");
header("Content-Type: image/gif");
header("Content-Length: ".filesize($filename));
if(function_exists('fpassthru')){
@fpassthru($fp);
} else {
while( (!feof($fp)) && (connection_status()==0)){
print(fread($fp, 1024*8));
flush();
}
fclose($fp);
}
exit;
?>

View File

@ -1,20 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
require_once('b.php');
exit;
?>

View File

@ -1,26 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
require_once('libs/init.php');
require_once('libs/captcha.php');
$captchaCode = gen_captcha();
$_SESSION["mibew_captcha"] = $captchaCode;
draw_captcha($captchaCode);
exit;
?>

View File

@ -1,195 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
require_once('libs/init.php');
require_once('libs/chat.php');
require_once('libs/operator.php');
require_once('libs/groups.php');
require_once('libs/expand.php');
require_once('libs/captcha.php');
require_once('libs/invitation.php');
require_once('libs/track.php');
require_once('libs/classes/thread.php');
if(Settings::get('enablessl') == "1" && Settings::get('forcessl') == "1") {
if(!is_secure_request()) {
$requested = $_SERVER['PHP_SELF'];
if($_SERVER['REQUEST_METHOD'] == 'GET' && $_SERVER['QUERY_STRING']) {
header("Location: ".get_app_location(true,true)."/client.php?".$_SERVER['QUERY_STRING']);
} else {
die("only https connections are handled");
}
exit;
}
}
// Do not support old browsers at all
if (get_remote_level($_SERVER['HTTP_USER_AGENT']) == 'old') {
// Create page array
$page = array_merge_recursive(
setup_logo()
);
expand("styles/dialogs", getchatstyle(), "nochat.tpl");
exit;
}
if (verifyparam("act", "/^(invitation)$/", "default") == 'invitation'
&& Settings::get('enabletracking')
) {
// Check if user invited to chat
$invitation_state = invitation_state($_SESSION['visitorid']);
if ($invitation_state['invited'] && $invitation_state['threadid']) {
$thread = Thread::load($invitation_state['threadid']);
// Prepare page
$page = setup_invitation_view($thread);
// Build js application options
$page['invitationOptions'] = json_encode($page['invitation']);
// Expand page
expand("styles/dialogs", getchatstyle(), "chat.tpl");
exit;
}
}
if( !isset($_GET['token']) || !isset($_GET['thread']) ) {
$thread = NULL;
if( isset($_SESSION['threadid']) ) {
$thread = Thread::reopen($_SESSION['threadid']);
}
if( !$thread ) {
// Load group info
$groupid = "";
$groupname = "";
$group = NULL;
if(Settings::get('enablegroups') == '1') {
$groupid = verifyparam( "group", "/^\d{1,8}$/", "");
if($groupid) {
$group = group_by_id($groupid);
if(!$group) {
$groupid = "";
} else {
$groupname = get_group_name($group);
}
}
}
// Get operator code
$operator_code = empty($_GET['operator_code'])
? ''
: $_GET['operator_code'];
if (! preg_match("/^[A-z0-9_]+$/", $operator_code)) {
$operator_code = false;
}
// Get visitor info
$visitor = visitor_from_request();
$info = getgetparam('info');
$email = getgetparam('email');
// Get referrer
$referrer = isset($_GET['url'])
? $_GET['url']
: (isset($_SERVER['HTTP_REFERER']) ? $_SERVER['HTTP_REFERER'] : "");
if(isset($_GET['referrer']) && $_GET['referrer']) {
$referrer .= "\n".$_GET['referrer'];
}
// Check if there are online operators
if(!has_online_operators($groupid)) {
// Display leave message page
$page = array_merge_recursive(
setup_logo($group),
setup_leavemessage(
$visitor['name'],
$email,
$groupid,
$info,
$referrer
)
);
$page['leaveMessageOptions'] = json_encode($page['leaveMessage']);
expand("styles/dialogs", getchatstyle(), "chat.tpl");
exit;
}
// Get invitation info
if (Settings::get('enabletracking')) {
$invitation_state = invitation_state($_SESSION['visitorid']);
$visitor_is_invited = $invitation_state['invited'];
} else {
$visitor_is_invited = false;
}
// Get operator info
$requested_operator = false;
if ($operator_code) {
$requested_operator = operator_by_code($operator_code);
}
// Check if survey should be displayed
if(Settings::get('enablepresurvey') == '1'
&& !$visitor_is_invited
&& !$requested_operator
) {
// Display prechat survey
$page = array_merge_recursive(
setup_logo($group),
setup_survey($visitor['name'], $email, $groupid, $info, $referrer)
);
$page['surveyOptions'] = json_encode($page['survey']);
expand("styles/dialogs", getchatstyle(), "chat.tpl");
exit;
}
// Start chat thread
$thread = chat_start_for_user($groupid, $requested_operator, $visitor['id'], $visitor['name'], $referrer, $info);
}
$threadid = $thread->id;
$token = $thread->lastToken;
$chatstyle = verifyparam( "style", "/^\w+$/", "");
header("Location: $mibewroot/client.php?thread=$threadid&token=$token".($chatstyle ? "&style=$chatstyle" : ""));
exit;
}
$token = verifyparam( "token", "/^\d{1,8}$/");
$threadid = verifyparam( "thread", "/^\d{1,8}$/");
$thread = Thread::load($threadid, $token);
if (! $thread) {
die("wrong thread");
}
$page = setup_chatview_for_user($thread);
$pparam = verifyparam( "act", "/^(mailthread)$/", "default");
if( $pparam == "mailthread" ) {
expand("styles/dialogs", getchatstyle(), "mail.tpl");
} else {
// Build js application options
$page['chatOptions'] = json_encode($page['chat']);
// Expand page
expand("styles/dialogs", getchatstyle(), "chat.tpl");
}
?>

View File

@ -1,55 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
// Initialize librariess
require_once('libs/init.php');
require_once('libs/classes/thread.php');
require_once('libs/track.php');
require_once('libs/statistics.php');
require_once('libs/cron.php');
$cron_key = empty($_GET['cron_key']) ? '' : $_GET['cron_key'];
// Check cron security key
if ($cron_key != Settings::get('cron_key')) {
die();
}
// Determine use or not quiet mode
$quiet = isset($_GET['q']);
set_time_limit(0);
// Run cron jobs of the core
calculate_thread_statistics();
calculate_operator_statistics();
calculate_page_statistics();
// Trigger cron event
$dispatcher = EventDispatcher::getInstance();
$dispatcher->triggerEvent('cronRun');
// Update time of last cron run
Settings::set('_last_cron_run', time());
Settings::update();
if (! $quiet) {
// TODO: May be localize it
echo('All cron jobs done.');
}
?>

View File

@ -1,989 +0,0 @@
/*
* Copyright 2005-2013 Evgeny Gryaznov
* Copyright 2013 Simushev Dmitriy
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
/* reset all */
html, body, div, h1, h2, h3, h4, h5, h6, ul, ol, dl, li, dt, dd, p, blockquote, pre, form, fieldset, table, th, td { margin: 0; padding: 0; }
table { border-collapse:collapse; border-spacing:0; }
fieldset,img { border:0; }
ol,ul { list-style:none; }
h1,h2,h3,h4,h5,h6 { font-size:100%; font-weight:normal; }
q:before,q:after { content:''; }
body {
background: #FFFFFF url(images/header.gif) repeat-x;
font-family: "Trebuchet MS", Arial, Helvetica, sans-serif;
font-size: 0.8em;
line-height: 140%;
color: #333333;
}
/* 100% height with footer, 200 px sidebar */
html, body {
height: 100%;
}
body {
min-width: 750px;
}
a {
color: #2f7599;
}
#wrap400, #wrap700, #fixedwrap {
position:relative;
margin: 0px auto -41px;
height:auto !important;
height:100%;
min-height:100%;
}
#wrap400 {
width: 100%;
min-width:450px;
}
#wrap700 {
width: 100%;
min-width:750px;
}
#fixedwrap {
width: 750px;
}
.contentdiv {
float:left;
width: 100%;
}
.contentinner {
margin-right: 210px;
padding: 10px 60px 10px 20px;
overflow: hidden;
}
.contentnomenu {
padding: 10px 60px 10px 20px;
}
.empty_inner {
height:40px;
}
.inline-block {
display: inline-block;
}
#footer {
background: white url(images/footer.gif) bottom repeat-x;
font-size:11px;
position:relative;
min-height: 40px;
height:40px;
vertical-align:middle;
width:100%;
text-align: center;
}
#legal {
clear: both;
line-height: 30px;
padding-top:10px;
text-align: center;
color: #375C69;
margin-bottom: 0px;
}
#footer .flink {
color: #2f7599;
text-decoration: underline;
}
#togglediv {
float:right;
padding-right:10px;
}
/* Header */
#header {
width: 100%;
height: 32px;
margin: 0px -2px 10px 0px;
padding-top: 10px;
padding-bottom: 5px;
background: url(images/graydot.gif) repeat-x left bottom;
display: block;
}
#header {
float: left;
}
img.left {
float: left;
margin-right: 15px;
}
#header h1 {
font-size: 2em;
line-height: 32px;
color: #494949;
margin-left: 40px;
}
#header h1 a {
color: #494949;
}
#header a {
text-decoration: none;
}
#title {
float: left;
display: inline;
}
#path {
float: right;
padding: 10px 20px 0px 0px;
line-height: 22px;
display: inline;
}
/* Sidebar */
#sidebar {
float: left;
width: 185px;
margin-left: -210px;
margin-top: 20px;
position:relative;
line-height: 180%
}
#sidebar ul {
margin: 0;
padding: 0;
list-style: none;
}
#sidebar li {
margin-bottom: 20px;
}
#sidebar li ul {
}
#sidebar li li {
margin: 0;
}
#sidebar h2 {
text-transform: lowercase;
margin-bottom: 10px;
background: url(images/graydot.gif) repeat-x left bottom;
font-size: 1.3em;
font-weight: bold;
}
.locales a {
color: #2f7599;
font-size: 1em;
text-decoration: none;
}
.locales .active a {
color: #555;
}
.locales a:hover {
text-decoration: underline;
}
.submenu a {
padding-left: 15px;
color: #2f7599;
font-size: 1em;
text-decoration: none;
}
.submenu a.inner { padding-left: 0px; }
.submenu span.small { font-size: 80%; padding-left: 5px; }
.submenu .active a {
background: url(images/li.gif) no-repeat left 1px;
color: #555;
}
.submenu .active a.inner {
background: none;
}
.submenu a:hover {
text-decoration: underline;
}
/* form, tabbed form */
.mform {
background: url(images/loginbg.gif);
clear: both;
width: 100%;
}
.tabs {
float: right;
display: inline;
margin-right: 15px;
}
.tabs li {
display: inline;
}
.tabs a {
display: block;
float: left;
padding: 2px 9px 3px 9px;
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 11px;
color: #2f7599;
}
.tabs li.active a {
background: url(images/loginbg.gif);
border-left:1px solid #bbbbbb;border-top:1px solid #bbbbbb;border-right:1px solid #bbbbbb;
color: #000;
text-decoration: none;
}
.formtop, .formbottom, .formtopi, .formbottomi { height: 15px;}
.formtop { background: url(images/logincrnrt.gif) no-repeat top right;}
.formtopi { background: url(images/logincrnlt.gif) no-repeat top left; }
.formbottom { background: url(images/logincrnrb.gif) no-repeat bottom right; }
.formbottomi { background: url(images/logincrnlb.gif) no-repeat bottom left; }
.forminner { margin: 0px 15px;}
.forminner p { margin-bottom: 1em; }
/* fieldForm */
.fieldForm {
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 11px;
width: 100%;
}
.packedFormField {
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 11px;
float:left;
margin-right:25px;
margin-bottom:8px;
}
div.errinfo {
color: #c13030;
}
.field {
width: 100%;
margin-top: 5px;
}
.fheader {
margin: 8px auto 8px;
}
.flabel {
position: relative;
margin: 8px auto 2px;
color: black;
}
.fleftlabel {
float: left;
width: 11em;
}
.flabel span.required {
font-size:8.0pt;
color:red;
font-weight: bold;
}
.field .subfield {
padding-left: 30px;
background: url(images/subitem.gif) no-repeat 10px 2px;
}
.forminner .level0{
}
.forminner .level1{
padding-left: 20px;
}
.fieldinrow {
min-width: 300px;
display: inline;
float:left;
width: 45%;
}
.fvalue {
float: left;
}
.fvaluewithta {
float: left;
width: 67%;
}
.fvaluewithta textarea {
width: 100%;
}
.fvaluenodesc {
}
.fvalueframe {
overflow: auto;
width: 100%;
}
.fvalueframe iframe {
border: solid 1px #999;
}
.fdescr {
float:left;
padding-left:10px;
color: #676767;
font-size: 10px;
min-width: 200px;
}
.fbutton {
background: url(images/formline.gif) repeat-x;
margin-top: 20px;
padding-top: 10px;
}
.fbutton .links {
float: right;
margin-top: 5px;
}
.fbutton .submitbutton {
float: left;
}
.formauth {
}
textarea.wide {
border:1px solid #878787;
overflow:auto;
width: 95%;
}
input.wide {
border: 1px solid #878787;
color: #333;
line-height: normal;
width: 95%;
}
input.formauth {
border: 1px solid #878787;
color: #333;
margin-right:15px;
padding-right: 0px;
}
#formmessage {
border: 1px solid #4C96D4;
background-color: #E7F1F9;
padding: 8px 11px;
font-size: 0.85em;
font-weight:bold;
max-width: 700px;
margin: -10px 2px 10px;
color: #515151;
}
#offwarn {
border: 1px solid #4CD496;
background-color: #E7F9F1;
color: #515151;
padding: 8px 11px;
font-size: 0.85em;
font-weight:bold;
line-height: 140%;
margin: 0px;
}
#offwarn img {
margin-top: .4em;
float: left;
padding-right: 10px;
}
.asterisk {
padding: 10px 20px;
}
/* tables */
.tabletool {
float: right;
}
.tabletool a {
color: #296685;
vertical-align: top;
padding-left: 4px;
}
.tabletitle {
background: url(images/graydot.gif) repeat-x left bottom;
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
font-size: 1.4em;
margin: 10px 0px 20px;
padding-bottom: 10px;
color: #1D485E;
font-weight: bold;
}
table.list, table.translate, table.statistics {
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
background: #fff;
width: 100%;
border-collapse: collapse;
text-align: left;
}
table.list th, table.translate th, table.statistics th {
font-size: 1em;
font-weight: normal;
padding: 10px 6px;
border-bottom: 2px solid #2F7598;
}
table.list th, table.translate th { color: #1D485E; }
table.statistics th { color: #2F7598; }
table.list td, table.statistics td {
color: #2f7599;
padding: 10px 8px;
border-bottom: 1px solid #ccc;
}
table.translate td {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
color: #515151;
padding: 2px 8px;
border-bottom: 1px solid #ccc;
}
table.list td a.man {
background: url(images/tbliclogin.gif) no-repeat left center;
padding-left: 15px;
}
table.list tbody tr:hover td, table.list tbody tr:hover td a, table.statistics tbody tr:hover td {
color: #1D485E;
}
table.list td.level0{
}
table.list td.level1{
padding-left: 20px;
}
/* awaiting */
table.awaiting {
font-family: "Lucida Sans Unicode", "Lucida Grande", Sans-Serif;
background: #fff;
width: 100%;
border-collapse: collapse;
text-align: left;
}
table.awaiting th {
font-size: 1.2em;
font-weight: normal;
color: #1D485E;
padding: 10px 8px;
border-bottom: 2px solid #2F7598;
text-align: center;
}
table.awaiting th.first {
text-align: left;
}
table.awaiting table.inner {
border: none;
width: 100%;
}
table.awaiting table.inner .icon {
width: 30px;
text-align: center;
}
table.awaiting td.visitor {
color: #296685;
border-bottom: 1px solid #ccc;
padding: 10px 8px;
margin: 0px;
text-align: center;
}
table.awaiting .no-threads, table.awaiting .no-visitors {
height: 30px;
}
.awaiting .visitor a { color: #296685; }
.awaiting tr:hover .visitor, .awaiting tr:hover .visitor a { color: #1D485E; }
.awaiting tr.ban .visitor, .awaiting tr.ban .visitor a { color: #9AC8E0; }
.awaiting tr.ban:hover .visitor, .awaiting tr.ban:hover .visitor a { color: #4C9CC8; }
.awaiting tr.inwait .visitor, .awaiting tr.inwait a { font-weight: bold; }
.awaiting tr.inprio .visitor, .awaiting tr.inprio a { font-weight: bold; font-size: 1.05em; }
.awaiting tr.inchat .visitor, .awaiting tr.inchat .visitor a { color: #777; }
.awaiting tr.inchat:hover .visitor, .awaiting tr.inchat:hover .visitor a { color: #444; }
.awaiting tr.inchat a { text-decoration: none; }
.first-message {
text-align: right;
font-size: 0.8em;
padding-right: 10px;
}
.first-message a {
text-decoration: none;
}
.first-message a:hover {
text-decoration: underline;
}
#status-panel-region {
margin: 10px;
}
#connstatus {
float:right;
}
#connlinks a {
color: #777;
text-decoration: none;
}
#connlinks a:hover {
text-decoration: underline;
}
.default-thread-controls {
width: 100px;
}
.default-visitor-controls {
width: 20px;
}
.default-thread-controls .control,
.default-visitor-controls .control {
height: 15px;
width: 15px;
margin: 0 2px;
border: none;
cursor: pointer;
}
.open-control {
background: no-repeat top left url('images/tbliclspeak.gif');
}
.view-control {
background: no-repeat top left url('images/tbliclread.gif');
}
.track-control {
background: no-repeat top left url('images/tblictrack.gif');
}
.ban-control {
background: no-repeat top left url('images/ban.gif');
}
#sound-region {
display: none;
}
/* online operators */
#agents-region {
padding-right: 10px;
float: right;
}
.agent-status-away, .agent-status-online {
display: inline-block;
height: 12px;
width: 12px;
border: none;
background-repeat: no-repeat;
margin-left: 5px;
margin-right: 2px;
}
.agent-status-away {
background-image: url("images/opaway.gif");
}
.agent-status-online {
background-image: url("images/oponline.gif");
}
/* search */
#searchtext {
float:left;
display: inline;
margin:7px 20px 5px 0px;
width:60%;
padding-right:5px;
}
.searchctrl {
float: left;
margin:7px 20px 5px 0px;
padding-right:5px;
display: inline;
}
#searchtext input {
width: 100%;
margin: 0px;
}
#searchbutton {
float:left;
}
/* login */
#loginsmallpane {
float: right;
padding: 10px 15px 0px 0px;
margin-right: 0px;
line-height: 22px;
display: inline;
}
#loginsmallpane input {
margin: 0px 3px;
padding: 0px 2px;
}
#loginsmallpane .butt {
height: 1.3em;
border: 0px;
background: none;
}
#loginsmallpane .butt:hover {
background: #aaa;
}
#loginintro {
width: 400px;
margin: 10px 30px;
}
#loginpane {
width: 400px;
margin: 30px 30px;
}
#loginpane .header h2 {
font-size: 2em;
margin-bottom: 0.9em;
padding-bottom: 0.8em;
border-bottom: 2px solid #2F7598;
}
/* nice button */
#confirmpane {
width:450px;
margin:0px auto 5px;
padding-top: 70px;
}
.nicebutton {
border: none;
float: left;
margin-left: 30px;
}
.submit a {
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 11px;
line-height: 35px;
color: #000000;
text-decoration: none;
}
.submit {
background: url(images/submitbg.gif) repeat-x;
vertical-align: top;
}
/* thread log */
.logpane {
margin: 10px 0px;
line-height: 150%;
}
.logpane .header {
padding-bottom: 0.8em;
border-bottom: 2px solid #2F7598;
}
.logpane .wlabel {
width: 10em;
float: left;
margin-right:10px;
}
.logpane .wvalue {
float: left;
}
/* dashboard */
#dashboard {
width: 100%;
}
.dashitem {
width:33%;
margin: 0px 2em 5em 0px;
padding: 5px 2em 5em;
vertical-align: top;
}
.dashitem:hover {
}
.dashitem a {
padding-top:2px;
padding-bottom: 10px;
display: block;
}
.dashitem img, #dashlocalesPopup h2 img {
float: left;
padding-right:10px;
}
#dashlocalesPopup h2 img {
margin-top: -3px;
}
#dashlocalesPopup .locales {
line-height: 180%;
margin-left:10px;
}
#dashlocalesPopup h2 {
font-size: 1.5em;
margin-bottom: 0.9em;
padding: 5px 30px 0.8em 0px;
border-bottom: 2px solid #2F7598;
}
#dashlocalesPopupClose {
float: right;
position:absolute;
right:5px;
top:5px;
}
#dashlocalesPopup {
display:none;
position:fixed;
_position:absolute; /* ie6*/
background:#FFFFFF;
border:2px solid #2F7598;
z-index:110;
padding:1em 1em;
font-size:1em;
}
#backgroundPopup{
display:none;
position:fixed;
_position:absolute; /* ie6*/
height:100%;
opacity: .5;
width:100%;
top:0;
left:0;
background:#000000;
border:1px solid #cecece;
z-index:101;
}
/* install */
#install li {
list-style-type: circle;
list-style-position: inside;
margin-left: 2em;
}
#check-nv, #check-nm {
color: #2f7599;
text-decoration: none;
}
#check-nv:hover, #check-nm:hover {
text-decoration: underline;
}
/* chat */
.message {
font-family: Arial, Helvetica, sans-serif;
font-size: 12px;
color: #4F4F4F;
padding: 15px 0px 0px 0px;
line-height: 17px;
}
.message span.time {
color: #000000;
}
.message span.nuser {
color: #B11E23;
font-weight: bold;
}
.message span.nagent {
font-weight: bold;
}
.message span.minf {
color: #1E48B1;
font-size: 11px;
}
.message span.mevent {
color: #A1A1A1;
font-size: 11px;
}
.message span.mhidden {
color: #A1A1A1;
font-size: 11px;
}
.message span.mconn {
color: #A1A1A1;
font-size: 11px;
}
/* themes */
.screenshot {
border: solid 1px #BBBBBB;
}
/* updates */
#news {
font-family: Verdana, Geneva, Arial, Helvetica, sans-serif;
font-size: 11px;
margin-bottom:15px;
padding:4px;
}
.newstext {
margin-bottom:1em;
}
/* rtl rules */
.lrtl .dashitem img, .lrtl #dashlocalesPopup h2 img, .lrtl #offwarn img {
float: right;
padding-right:0px;
padding-left:10px;
}
.lrtl .fleftlabel {
float: right;
width: 11em;
}
.lrtl .fdescr {
float:right;
padding-right:10px;
}
.lrtl .field .subfield {
padding-right: 30px;
background: url(images/subitem_rtl.gif) no-repeat 99% 2px;
}
.lrtl .fvalue {
float: right;
}
.lrtl .logpane .wlabel {
float: right;
margin-left:10px;
}
.lrtl .logpane .wvalue {
float: right;
}
.lrtl .fvaluewithta {
float: right;
}
.lrtl #togglediv {
float:left;
padding-left:10px;
}

View File

@ -1,20 +0,0 @@
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
.inline-block {
display: inline;
zoom: 1;
}

Binary file not shown.

Before

Width:  |  Height:  |  Size: 372 B

View File

@ -1,4 +0,0 @@
<html><head>
</head><body>
</body></html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 732 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 340 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 728 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 604 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

View File

@ -1,19 +0,0 @@
"34aL volume 3.1" icons set
Ammount of icons:
60
Colors:
Colored, grey
Icon Sizes:
24x24
File Types:
.ico (RGBA, 256 color, 16 color),
.tiff (RGBA)
.gif (indexed)
.bmp (RGB - 1 color background),
.png (RGBA)
Note: These icons are free for use.

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.3 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.1 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.4 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 49 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 162 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 713 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 60 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 377 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 68 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 148 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 199 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 139 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 142 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 796 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 2.2 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 915 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 905 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 906 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 914 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 75 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 74 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.6 KiB

Binary file not shown.

Before

Width:  |  Height:  |  Size: 55 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 89 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 43 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 92 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 329 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 309 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 291 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 554 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 338 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 640 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 53 B

Binary file not shown.

Before

Width:  |  Height:  |  Size: 70 B

View File

@ -1,21 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
header("Location: operator/index.php");
exit;
?>

View File

@ -1,418 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
$dbtables = array(
"${mysqlprefix}chatgroup" => array(
"groupid" => "int NOT NULL auto_increment PRIMARY KEY",
"parent" => "int DEFAULT NULL",
"vcemail" => "varchar(64)",
"vclocalname" => "varchar(64) NOT NULL",
"vccommonname" => "varchar(64) NOT NULL",
"vclocaldescription" => "varchar(1024) NOT NULL",
"vccommondescription" => "varchar(1024) NOT NULL",
"iweight" => "int NOT NULL DEFAULT 0",
"vctitle" => "varchar(255) DEFAULT ''",
"vcchattitle" => "varchar(255) DEFAULT ''",
"vclogo" => "varchar(255) DEFAULT ''",
"vchosturl" => "varchar(255) DEFAULT ''",
),
// Chat threads
"${mysqlprefix}chatthread" => array(
// ID of the thread.
"threadid" => "int NOT NULL auto_increment PRIMARY KEY",
// Name of the user in chat.
"userName" => "varchar(64) NOT NULL",
// ID of the user. This field is foreign key for
// {chatsitevisitor}.userid
"userid" => "varchar(255)",
// Name of the operator who took place in the chat.
"agentName" => "varchar(64)",
// ID of the operator who took place in the chat.
"agentId" => "int NOT NULL DEFAULT 0",
// Unix timestamp of the moment when the thread was created.
"dtmcreated" => "int NOT NULL DEFAULT 0",
// Unix timestamp of the moment when chat actually started.
"dtmchatstarted" => "int NOT NULL DEFAULT 0",
// Unix timestamp of the last thread modification.
"dtmmodified" => "int NOT NULL DEFAULT 0",
// Unix timestamp of the moment when the thread was closed.
"dtmclosed" => "int NOT NULL DEFAULT 0",
// ID of the last thread revision.
"lrevision" => "int NOT NULL DEFAULT 0",
// State of the thread. It is one of Thread::STATE_* constants.
"istate" => "int NOT NULL DEFAULT 0",
// State of invitation related with the thread. It is one of
// Thread::INVITATION_* constants.
"invitationstate" => "int NOT NULL DEFAULT 0",
// Last token of the thread.
"ltoken" => "int NOT NULL",
// IP address of the user.
"remote" => "varchar(255)",
// Page from which chat thread was started.
"referer" => "text",
// ID of the operator who will next in the chat.
"nextagent" => "int NOT NULL DEFAULT 0",
// Code of chat locale.
"locale" => "varchar(8)",
// Unix timestamp of the last request from user's window to server.
"lastpinguser" => "int NOT NULL DEFAULT 0",
// Unix timestamp of the last request from operator's window to server.
"lastpingagent" => "int NOT NULL DEFAULT 0",
// Indicates if user typing or not. It can take two values 0 and 1.
"userTyping" => "int DEFAULT 0",
// Indicates if operator typing or not. It can take two values 0 and 1.
"agentTyping" => "int DEFAULT 0",
// ID of shown message in the chat.
"shownmessageid" => "int NOT NULL DEFAULT 0",
// User agent description that took from 'User-Agent' HTTP header.
"userAgent" => "varchar(255)",
// Total count of user's messages related with the thread.
"messageCount" => "varchar(16)",
// ID of the group at Mibew side related with the thread.
"groupid" => "int references ${mysqlprefix}chatgroup(groupid)",
),
"${mysqlprefix}chatthreadstatistics" => array(
"statid" => "int NOT NULL auto_increment PRIMARY KEY",
"date" => "int NOT NULL DEFAULT 0",
"threads" => "int NOT NULL DEFAULT 0",
"missedthreads" => "int NOT NULL DEFAULT 0",
"sentinvitations" => "int NOT NULL DEFAULT 0",
"acceptedinvitations" => "int NOT NULL DEFAULT 0",
"rejectedinvitations" => "int NOT NULL DEFAULT 0",
"ignoredinvitations" => "int NOT NULL DEFAULT 0",
"operatormessages" => "int NOT NULL DEFAULT 0",
"usermessages" => "int NOT NULL DEFAULT 0",
"averagewaitingtime" => "FLOAT(10, 1) NOT NULL DEFAULT 0",
"averagechattime" => "FLOAT(10, 1) NOT NULL DEFAULT 0"
),
"${mysqlprefix}requestbuffer" => array(
"requestid" => "int NOT NULL auto_increment PRIMARY KEY",
// Use MD5 hashes as keys
"requestkey" => "char(32) NOT NULL",
"request" => "text NOT NULL"
),
"${mysqlprefix}requestcallback" => array(
"callbackid" => "int NOT NULL auto_increment PRIMARY KEY",
"token" => "varchar(64) NOT NULL DEFAULT ''",
"function" => "varchar(64) NOT NULL",
"arguments" => "varchar(1024)"
),
// Store chat thread messages
"${mysqlprefix}chatmessage" => array(
// Message ID.
"messageid" => "int NOT NULL auto_increment PRIMARY KEY",
// ID of the thread related with the message.
"threadid" => "int NOT NULL references ${mysqlprefix}chatthread(threadid)",
// Message kind. It is one of Thread::KIND_* constants.
"ikind" => "int NOT NULL",
// ID of operator who sent the message. This value will be ignored for
// system messages and messages which sent by users.
"agentId" => "int NOT NULL DEFAULT 0",
// Message text body.
"tmessage" => "text NOT NULL",
// Name of the plugin which sent the message. If message was not sent by
// a plugin this field equals to an empty string.
"plugin" => "varchar(256) NOT NULL DEFAULT ''",
// Arbitrary serialized data related with message.
"data" => "text",
// Unix timestamp when message was created.
"dtmcreated" => "int NOT NULL DEFAULT 0",
// Name of the message sender.
"tname" => "varchar(64)"
),
"${mysqlprefix}chatoperator" => array(
"operatorid" => "int NOT NULL auto_increment PRIMARY KEY",
"vclogin" => "varchar(64) NOT NULL",
"vcpassword" => "varchar(64) NOT NULL",
"vclocalename" => "varchar(64) NOT NULL",
"vccommonname" => "varchar(64) NOT NULL",
"vcemail" => "varchar(64)",
"dtmlastvisited" => "int NOT NULL DEFAULT 0",
"istatus" => "int DEFAULT 0", /* 0 - online, 1 - away */
"idisabled" => "int DEFAULT 0",
"vcavatar" => "varchar(255)",
"vcjabbername" => "varchar(255)",
"iperm" => "int DEFAULT 0", /* Do not grant all privileges by default */
"dtmrestore" => "int NOT NULL DEFAULT 0",
"vcrestoretoken" => "varchar(64)",
// Use to start chat with specified operator
"code" => "varchar(64) DEFAULT ''"
),
"${mysqlprefix}chatoperatorstatistics" => array(
"statid" => "int NOT NULL auto_increment PRIMARY KEY",
"date" => "int NOT NULL DEFAULT 0",
"operatorid" => "int NOT NULL",
"threads" => "int NOT NULL DEFAULT 0",
"messages" => "int NOT NULL DEFAULT 0",
"averagelength" => "FLOAT(10, 1) NOT NULL DEFAULT 0",
"sentinvitations" => "int NOT NULL DEFAULT 0",
"acceptedinvitations" => "int NOT NULL DEFAULT 0",
"rejectedinvitations" => "int NOT NULL DEFAULT 0",
"ignoredinvitations" => "int NOT NULL DEFAULT 0"
),
"${mysqlprefix}chatrevision" => array(
"id" => "INT NOT NULL"
),
"${mysqlprefix}chatgroupoperator" => array(
"groupid" => "int NOT NULL references ${mysqlprefix}chatgroup(groupid)",
"operatorid" => "int NOT NULL references ${mysqlprefix}chatoperator(operatorid)",
),
"${mysqlprefix}chatban" => array(
"banid" => "INT NOT NULL auto_increment PRIMARY KEY",
"dtmcreated" => "int NOT NULL DEFAULT 0",
"dtmtill" => "int NOT NULL DEFAULT 0",
"address" => "varchar(255)",
"comment" => "varchar(255)",
"blockedCount" => "int DEFAULT 0"
),
"${mysqlprefix}chatconfig" => array(
"id" => "INT NOT NULL auto_increment PRIMARY KEY",
"vckey" => "varchar(255)",
"vcvalue" => "varchar(255)",
),
"${mysqlprefix}chatresponses" => array(
"id" => "INT NOT NULL auto_increment PRIMARY KEY",
"locale" => "varchar(8)",
"groupid" => "int references ${mysqlprefix}chatgroup(groupid)",
"vctitle" => "varchar(100) NOT NULL DEFAULT ''",
"vcvalue" => "varchar(1024) NOT NULL",
),
"${mysqlprefix}chatsitevisitor" => array(
"visitorid" => "INT NOT NULL auto_increment PRIMARY KEY",
"userid" => "varchar(255) NOT NULL",
"username" => "varchar(64)",
"firsttime" => "int NOT NULL DEFAULT 0",
"lasttime" => "int NOT NULL DEFAULT 0",
"entry" => "text NOT NULL",
"details" => "text NOT NULL",
"invitations" => "INT NOT NULL DEFAULT 0",
"chats" => "INT NOT NULL DEFAULT 0",
"threadid" => "INT references ${mysqlprefix}chatthread(threadid) on delete set null"
),
"${mysqlprefix}visitedpage" => array(
"pageid" => "INT NOT NULL auto_increment PRIMARY KEY",
"address" => "varchar(1024)",
"visittime" => "int NOT NULL DEFAULT 0",
"visitorid" => "INT",
// Indicates if path included in 'by page' statistics
"calculated" => "tinyint NOT NULL DEFAULT 0"
),
"${mysqlprefix}visitedpagestatistics" => array(
"pageid" => "INT NOT NULL auto_increment PRIMARY KEY",
"date" => "int NOT NULL DEFAULT 0",
"address" => "varchar(1024)",
"visits" => "int NOT NULL DEFAULT 0",
"chats" => "int NOT NULL DEFAULT 0",
"sentinvitations" => "int NOT NULL DEFAULT 0",
"acceptedinvitations" => "int NOT NULL DEFAULT 0",
"rejectedinvitations" => "int NOT NULL DEFAULT 0",
"ignoredinvitations" => "int NOT NULL DEFAULT 0"
),
);
$dbtables_indexes = array(
"${mysqlprefix}chatgroup" => array(
"parent" => "parent"
),
"${mysqlprefix}chatoperatorstatistics" => array(
"operatorid" => "operatorid"
),
"${mysqlprefix}chatgroupoperator" => array(
"groupid" => "groupid",
"operatorid" => "operatorid"
),
"${mysqlprefix}requestbuffer" => array(
"requestkey" => "requestkey"
),
"${mysqlprefix}chatmessage" => array(
"idx_agentid" => "agentid"
),
"${mysqlprefix}chatsitevisitor" => array(
"threadid" => "threadid"
),
"${mysqlprefix}requestcallback" => array(
"token" => "token"
),
"${mysqlprefix}visitedpage" => array(
"visitorid" => "visitorid"
)
);
$memtables = array();
$dbtables_can_update = array(
"${mysqlprefix}chatthread" => array("agentId", "userTyping", "agentTyping", "messageCount", "nextagent", "shownmessageid", "userid", "userAgent", "groupid", "dtmchatstarted", "dtmclosed", "invitationstate"),
"${mysqlprefix}chatthreadstatistics" => array("missedthreads", "sentinvitations", "acceptedinvitations", "rejectedinvitations", "ignoredinvitations"),
"${mysqlprefix}requestbuffer" => array("requestid", "requestkey", "request"),
"${mysqlprefix}chatmessage" => array("agentId", "plugin", "data"),
"${mysqlprefix}chatoperator" => array("vcavatar", "vcjabbername", "iperm", "istatus", "idisabled", "vcemail", "dtmrestore", "vcrestoretoken", "code"),
"${mysqlprefix}chatoperatorstatistics" => array("sentinvitations", "acceptedinvitations", "rejectedinvitations", "ignoredinvitations"),
"${mysqlprefix}chatban" => array(),
"${mysqlprefix}chatgroup" => array("vcemail", "iweight", "parent", "vctitle", "vcchattitle", "vclogo", "vchosturl"),
"${mysqlprefix}chatgroupoperator" => array(),
"${mysqlprefix}chatresponses" => array("vctitle"),
"${mysqlprefix}chatsitevisitor" => array(),
"${mysqlprefix}requestcallback" => array("callbackid", "token", "function", "arguments"),
"${mysqlprefix}visitedpage" => array(),
"${mysqlprefix}visitedpagestatistics" => array("sentinvitations", "acceptedinvitations", "rejectedinvitations", "ignoredinvitations"),
);
function show_install_err($text)
{
global $page, $version, $errors, $mibewroot;
$page = array(
'version' => $version,
'localeLinks' => get_locale_links("$mibewroot/install/index.php")
);
$errors = array($text);
start_html_output();
require('../view/install_err.php');
exit;
}
function create_table($id, $link)
{
global $dbtables, $dbtables_indexes, $memtables, $dbencoding, $mysqlprefix;
if (!isset($dbtables[$id])) {
show_install_err("Unknown table: $id, " . mysql_error($link));
}
$query =
"CREATE TABLE $id\n" .
"(\n";
foreach ($dbtables[$id] as $k => $v) {
$query .= " $k $v,\n";
}
if (isset($dbtables_indexes[$id])) {
foreach ($dbtables_indexes[$id] as $k => $v) {
$query .= " INDEX $k ($v),\n";
}
}
$query = preg_replace("/,\n$/", "", $query);
$query .= ") charset $dbencoding";
if (in_array($id, $memtables)) {
$query .= " ENGINE=MEMORY";
} else {
$query .= " ENGINE=InnoDb";
}
mysql_query($query, $link) or show_install_err(' Query failed: ' . mysql_error($link));
if ($id == "${mysqlprefix}chatoperator") {
// Create First Administrator
// Grant all privileges by default only for First Administrator
mysql_query(
"INSERT INTO ${mysqlprefix}chatoperator ( " .
"vclogin, " .
"vcpassword, " .
"vclocalename, " .
"vccommonname, " .
"vcavatar, " .
"vcemail, " .
"iperm " .
") values ( " .
"'admin', " .
"MD5(''), " .
"'', " .
"'Administrator', " .
"'Administrator', " .
"'', " .
"65535" .
")",
$link
);
} else if ($id == "${mysqlprefix}chatrevision") {
$result = mysql_query("INSERT INTO ${mysqlprefix}chatrevision VALUES (1)", $link);
if (! $result) {
die(' Query failed: ' . mysql_error($link));
}
}
}
function get_tables($link)
{
global $mysqldb, $errors;
$result = mysql_query("SHOW TABLES FROM `$mysqldb`", $link);
if ($result) {
$arr = array();
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
$arr[] = $row[0];
}
mysql_free_result($result);
return $arr;
} else {
$errors[] = "Cannot get tables from database. Error: " . mysql_error($link);
return false;
}
}
function get_columns($tablename, $link)
{
global $errors;
$result = mysql_query("SHOW COLUMNS FROM $tablename", $link);
if ($result) {
$arr = array();
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
$arr[] = $row[0];
}
mysql_free_result($result);
return $arr;
} else {
$errors[] = "Cannot get columns from table \"$tablename\". Error: " . mysql_error($link);
return false;
}
}
function get_indexes($tablename, $link)
{
global $mysqldb, $errors;
$result = mysql_query("SELECT index_name FROM information_schema.statistics where table_schema = '$mysqldb' and table_name = '$tablename' and index_name != 'PRIMARY'", $link);
if ($result) {
$arr = array();
while ($row = mysql_fetch_array($result, MYSQL_NUM)) {
$arr[] = $row[0];
}
mysql_free_result($result);
return $arr;
} else {
$errors[] = "Cannot get indexes for table \"$tablename\". Error: " . mysql_error($link);
return false;
}
}
?>

View File

@ -1,322 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
session_start();
require_once('../libs/config.php');
// Include some classes
require_once('../libs/classes/plugin_manager.php');
// Include common functions
require_once('../libs/common/constants.php');
require_once('../libs/common/locale.php');
require_once('../libs/common/misc.php');
require_once('../libs/common/response.php');
// Include database structure
require_once('dbinfo.php');
function runsql($query, $link)
{
$res = mysql_query($query, $link) or show_install_err(' Query failed: ' . mysql_error($link));
return $res;
}
$act = verifyparam("act", "/^(silentcreateall|createdb|ct|dt|addcolumns)$/");
$link = @mysql_connect($mysqlhost, $mysqllogin, $mysqlpass)
or show_install_err('Could not connect: ' . mysql_error());
if ($act == "silentcreateall") {
mysql_query("CREATE DATABASE $mysqldb", $link) or show_install_err(' Query failed: ' . mysql_error($link));
foreach ($dbtables as $id) {
create_table($id, $link);
}
} else if ($act == "createdb") {
mysql_query("CREATE DATABASE $mysqldb", $link) or show_install_err(' Query failed: ' . mysql_error($link));
} else {
mysql_select_db($mysqldb, $link) or show_install_err('Could not select database');
if ($force_charset_in_connection) {
mysql_query("SET character set $dbencoding", $link);
}
if ($act == "ct") {
$curr_tables = get_tables($link);
if ($curr_tables === false) {
show_install_err($errors[0]);
}
$tocreate = array_diff(array_keys($dbtables), $curr_tables);
foreach ($tocreate as $id) {
create_table($id, $link);
}
} else if ($act == "dt") {
# comment this line to be able to drop tables
show_install_err("For security reasons, removing tables is disabled by default");
foreach (array_keys($dbtables) as $id) {
mysql_query("DROP TABLE IF EXISTS $id", $link) or show_install_err(' Query failed: ' . mysql_error($link));
}
} else if ($act == "addcolumns") {
// Add absent columns
$absent_columns = array();
foreach ($dbtables as $id => $columns) {
$curr_columns = get_columns($id, $link);
if ($curr_columns === false) {
show_install_err($errors[0]);
}
$tocreate = array_diff(array_keys($columns), $curr_columns);
foreach ($tocreate as $v) {
$absent_columns[] = "$id.$v";
}
}
if (in_array("${mysqlprefix}chatmessage.agentId", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD agentId int NOT NULL DEFAULT 0 AFTER ikind", $link);
runsql("update ${mysqlprefix}chatmessage, ${mysqlprefix}chatoperator set agentId = operatorid where agentId = 0 AND ikind = 2 AND (vclocalename = tname OR vccommonname = tname)", $link);
}
if (in_array("${mysqlprefix}chatmessage.plugin", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD plugin varchar(256) NOT NULL DEFAULT '' AFTER tmessage", $link);
}
if (in_array("${mysqlprefix}chatmessage.data", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD data text AFTER plugin", $link);
}
if (in_array("${mysqlprefix}chatthread.agentId", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD agentId int NOT NULL DEFAULT 0 AFTER agentName", $link);
runsql("update ${mysqlprefix}chatthread, ${mysqlprefix}chatoperator set agentId = operatorid where agentId = 0 AND (vclocalename = agentName OR vccommonname = agentName)", $link);
}
if (in_array("${mysqlprefix}chatthread.dtmchatstarted", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD dtmchatstarted int NOT NULL DEFAULT 0 AFTER dtmcreated", $link);
runsql("update ${mysqlprefix}chatthread set dtmchatstarted = dtmcreated", $link);
}
if (in_array("${mysqlprefix}chatthread.dtmclosed", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD dtmclosed int NOT NULL DEFAULT 0 AFTER dtmmodified", $link);
runsql("update ${mysqlprefix}chatthread set dtmclosed = dtmmodified", $link);
}
if (in_array("${mysqlprefix}chatthread.agentTyping", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD agentTyping int DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatthread.userTyping", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD userTyping int DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatthread.messageCount", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD messageCount varchar(16)", $link);
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD INDEX idx_threadid_ikind (threadid, ikind)", $link);
runsql("UPDATE ${mysqlprefix}chatthread t SET t.messageCount = (SELECT COUNT(*) FROM ${mysqlprefix}chatmessage WHERE ${mysqlprefix}chatmessage.threadid = t.threadid AND ikind = 1)", $link);
runsql("ALTER TABLE ${mysqlprefix}chatmessage DROP INDEX idx_threadid_ikind", $link);
}
if (in_array("${mysqlprefix}chatthread.nextagent", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD nextagent int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatthread.shownmessageid", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD shownmessageid int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatthread.userid", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD userid varchar(255) DEFAULT \"\"", $link);
}
if (in_array("${mysqlprefix}chatthread.invitationstate", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD invitationstate int NOT NULL DEFAULT 0 AFTER istate", $link);
}
if (in_array("${mysqlprefix}chatthreadstatistics.missedthreads", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthreadstatistics ADD missedthreads int NOT NULL DEFAULT 0 AFTER threads", $link);
}
if (in_array("${mysqlprefix}chatthreadstatistics.sentinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthreadstatistics ADD sentinvitations int NOT NULL DEFAULT 0 AFTER missedthreads", $link);
}
if (in_array("${mysqlprefix}chatthreadstatistics.acceptedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthreadstatistics ADD acceptedinvitations int NOT NULL DEFAULT 0 AFTER sentinvitations", $link);
}
if (in_array("${mysqlprefix}chatthreadstatistics.rejectedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthreadstatistics ADD rejectedinvitations int NOT NULL DEFAULT 0 AFTER acceptedinvitations", $link);
}
if (in_array("${mysqlprefix}chatthreadstatistics.ignoredinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthreadstatistics ADD ignoredinvitations int NOT NULL DEFAULT 0 AFTER rejectedinvitations", $link);
}
if (in_array("${mysqlprefix}chatoperator.iperm", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD iperm int DEFAULT 65535", $link);
}
if (in_array("${mysqlprefix}chatoperator.istatus", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD istatus int DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatoperator.idisabled", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD idisabled int DEFAULT 0 AFTER istatus", $link);
}
if (in_array("${mysqlprefix}chatoperator.vcavatar", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcavatar varchar(255)", $link);
}
if (in_array("${mysqlprefix}chatoperator.vcjabbername", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcjabbername varchar(255)", $link);
}
if (in_array("${mysqlprefix}chatoperator.vcemail", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcemail varchar(64)", $link);
}
if (in_array("${mysqlprefix}chatoperator.dtmrestore", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD dtmrestore int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatoperator.vcrestoretoken", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD vcrestoretoken varchar(64)", $link);
}
if (in_array("${mysqlprefix}chatoperator.code", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperator ADD code varchar(64) DEFAULT ''", $link);
}
if (in_array("${mysqlprefix}chatoperatorstatistics.sentinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperatorstatistics ADD sentinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatoperatorstatistics.acceptedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperatorstatistics ADD acceptedinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatoperatorstatistics.rejectedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperatorstatistics ADD rejectedinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatoperatorstatistics.ignoredinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperatorstatistics ADD ignoredinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatresponses.vctitle", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatresponses ADD vctitle varchar(100) NOT NULL DEFAULT '' AFTER groupid", $link);
}
if (in_array("${mysqlprefix}chatthread.groupid", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD groupid int references ${mysqlprefix}chatgroup(groupid)", $link);
}
if (in_array("${mysqlprefix}chatthread.userAgent", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatthread ADD userAgent varchar(255)", $link);
}
if (in_array("${mysqlprefix}chatgroup.vcemail", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vcemail varchar(64)", $link);
}
if (in_array("${mysqlprefix}chatgroup.iweight", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD iweight int DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}chatgroup.parent", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD parent int DEFAULT NULL AFTER groupid", $link);
}
if (in_array("${mysqlprefix}chatgroup.vctitle", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vctitle varchar(255) DEFAULT ''", $link);
}
if (in_array("${mysqlprefix}chatgroup.vcchattitle", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vcchattitle varchar(255) DEFAULT ''", $link);
}
if (in_array("${mysqlprefix}chatgroup.vclogo", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vclogo varchar(255) DEFAULT ''", $link);
}
if (in_array("${mysqlprefix}chatgroup.vchosturl", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD vchosturl varchar(255) DEFAULT ''", $link);
}
if (in_array("${mysqlprefix}visitedpagestatistics.sentinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD sentinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}visitedpagestatistics.acceptedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD acceptedinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}visitedpagestatistics.rejectedinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD rejectedinvitations int NOT NULL DEFAULT 0", $link);
}
if (in_array("${mysqlprefix}visitedpagestatistics.ignoredinvitations", $absent_columns)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpagestatistics ADD ignoredinvitations int NOT NULL DEFAULT 0", $link);
}
// Add absent indexes
$absent_indexes = array();
foreach ($dbtables_indexes as $id => $indexes) {
$curr_indexes = get_indexes($id, $link);
if ($curr_indexes === false) {
show_install_err($errors[0]);
}
$tocreate = array_diff(array_keys($indexes), $curr_indexes);
foreach ($tocreate as $i) {
$absent_indexes[] = "$id.$i";
}
}
if (in_array("${mysqlprefix}chatgroup.parent", $absent_indexes)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroup ADD INDEX (parent)", $link);
}
if (in_array("${mysqlprefix}chatgroupoperator.groupid", $absent_indexes)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroupoperator ADD INDEX (groupid)", $link);
}
if (in_array("${mysqlprefix}chatgroupoperator.operatorid", $absent_indexes)) {
runsql("ALTER TABLE ${mysqlprefix}chatgroupoperator ADD INDEX (operatorid)", $link);
}
if (in_array("${mysqlprefix}chatmessage.idx_agentid", $absent_indexes)) {
runsql("ALTER TABLE ${mysqlprefix}chatmessage ADD INDEX idx_agentid (agentid)", $link);
}
if (in_array("${mysqlprefix}chatsitevisitor.threadid", $absent_indexes)) {
runsql("ALTER TABLE ${mysqlprefix}chatsitevisitor ADD INDEX (threadid)", $link);
}
if (in_array("${mysqlprefix}visitedpage.visitorid", $absent_indexes)) {
runsql("ALTER TABLE ${mysqlprefix}visitedpage ADD INDEX (visitorid)", $link);
}
if (in_array("${mysqlprefix}chatoperatorstatistics.operatorid", $absent_indexes)) {
runsql("ALTER TABLE ${mysqlprefix}chatoperatorstatistics ADD INDEX (operatorid)", $link);
}
}
}
mysql_close($link);
header("Location: $mibewroot/install/index.php");
exit;
?>

View File

@ -1,371 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
session_start();
require_once('../libs/config.php');
// Include some classes
require_once('../libs/classes/plugin_manager.php');
// Include common functions
require_once('../libs/common/constants.php');
require_once('../libs/common/locale.php');
require_once('../libs/common/misc.php');
require_once('../libs/common/response.php');
require_once('../libs/common/string.php');
// Include database structure
require_once('dbinfo.php');
$page = array(
'version' => $version,
'localeLinks' => get_locale_links("$mibewroot/install/index.php")
);
$page['done'] = array();
$page['nextstep'] = false;
$page['nextnotice'] = false;
$page['soundcheck'] = false;
$errors = array();
function check_mibewroot()
{
global $page, $errors, $mibewroot;
$requestUri = $_SERVER["REQUEST_URI"];
if (!preg_match('/^(.*)\\/install(\\/[^\\/\\\\]*)?$/', $requestUri, $matches)) {
$errors[] = "Cannot detect application location: $requestUri";
return false;
}
$applocation = $matches[1];
if ($applocation != $mibewroot) {
$errors[] = "Please, check file ${applocation}/libs/config.php<br/>Wrong value of \$mibewroot variable, should be \"$applocation\"";
$mibewroot = $applocation;
return false;
}
$page['done'][] = getlocal2("install.0.app", array($applocation));
return true;
}
function fpermissions($file)
{
$perms = fileperms($file);
if (($perms & 0x8000) == 0x8000) {
$info = '-';
} elseif (($perms & 0x4000) == 0x4000) {
$info = 'd';
} else {
$info = '?';
}
// Owner
$info .= (($perms & 0x0100) ? 'r' : '-');
$info .= (($perms & 0x0080) ? 'w' : '-');
$info .= (($perms & 0x0040) ?
(($perms & 0x0800) ? 's' : 'x') :
(($perms & 0x0800) ? 'S' : '-'));
// Group
$info .= (($perms & 0x0020) ? 'r' : '-');
$info .= (($perms & 0x0010) ? 'w' : '-');
$info .= (($perms & 0x0008) ?
(($perms & 0x0400) ? 's' : 'x') :
(($perms & 0x0400) ? 'S' : '-'));
// World
$info .= (($perms & 0x0004) ? 'r' : '-');
$info .= (($perms & 0x0002) ? 'w' : '-');
$info .= (($perms & 0x0001) ?
(($perms & 0x0200) ? 't' : 'x') :
(($perms & 0x0200) ? 'T' : '-'));
return $info;
}
function check_files()
{
global $page, $errors, $mibewroot;
$packageFile = dirname(__FILE__) . "/package";
$fp = @fopen($packageFile, "r");
if ($fp === FALSE) {
$errors[] = getlocal2("install.cannot_read", array("$mibewroot/install/package"));
if (file_exists($packageFile)) {
$errors[] = getlocal2("install.check_permissions", array(fpermissions($packageFile)));
}
return false;
}
$knownFiles = array();
while (!feof($fp)) {
$line = fgets($fp, 4096);
$keyval = preg_split("/ /", $line, 2);
if (isset($keyval[1])) {
$knownFiles[$keyval[0]] = trim($keyval[1]);
}
}
fclose($fp);
foreach ($knownFiles as $file => $sum) {
$relativeName = dirname(__FILE__) . "/../$file";
if (!is_readable($relativeName)) {
if (file_exists($relativeName)) {
$errors[] = getlocal2("install.cannot_read", array("$mibewroot/$file"));
$errors[] = getlocal2("install.check_permissions", array(fpermissions($relativeName)));
} else {
$errors[] = getlocal2("install.no_file", array("$mibewroot/$file"));
}
return false;
}
if ($sum != "-") {
$result = md5_file($relativeName);
if ($result != $sum) {
// try without \r
$result = md5(str_replace("\r", "", file_get_contents($relativeName)));
}
if ($result != $sum) {
$errors[] = getlocal2("install.bad_checksum", array("$mibewroot/$file"));
$errors[] = getlocal("install.check_files");
return false;
}
}
}
$page['done'][] = getlocal("install.0.package");
return true;
}
function check_connection()
{
global $mysqlhost, $mysqllogin, $mysqlpass, $page, $errors, $mibewroot;
$link = @mysql_connect($mysqlhost, $mysqllogin, $mysqlpass);
if ($link) {
$result = mysql_query("SELECT VERSION() as c", $link);
if ($result && $ver = mysql_fetch_array($result, MYSQL_ASSOC)) {
$page['done'][] = getlocal2("install.1.connected", array($ver['c']));
mysql_free_result($result);
} else {
$errors[] = "Version of your SQL server is unknown. Please check. Error: " . mysql_error($link);
mysql_close($link);
return null;
}
return $link;
} else {
$errors[] = getlocal2("install.connection.error", array(mysql_error()));
return null;
}
}
function check_database($link)
{
global $mysqldb, $force_charset_in_connection, $dbencoding, $page, $mibewroot;
if (mysql_select_db($mysqldb, $link)) {
$page['done'][] = getlocal2("install.2.db_exists", array($mysqldb));
if ($force_charset_in_connection) {
mysql_query("SET character set $dbencoding", $link);
}
return true;
} else {
$page['nextstep'] = getlocal2("install.2.create", array($mysqldb));
$page['nextnotice'] = getlocal("install.2.notice");
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=createdb";
}
return false;
}
function check_tables($link)
{
global $dbtables, $page, $mibewroot;
$curr_tables = get_tables($link);
if ($curr_tables !== false) {
$tocreate = array_diff(array_keys($dbtables), $curr_tables);
if (count($tocreate) == 0) {
$page['done'][] = getlocal("install.3.tables_exist");
return true;
} else {
$page['nextstep'] = getlocal("install.3.create");
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=ct";
}
}
return false;
}
function check_columns($link)
{
global $dbtables, $dbtables_can_update, $dbtables_indexes, $errors, $page, $mibewroot;
$need_to_create_columns = false;
foreach ($dbtables as $id => $columns) {
$curr_columns = get_columns($id, $link);
if ($curr_columns === false) {
return false;
}
$tocreate = array_diff(array_keys($columns), $curr_columns);
if (count($tocreate) != 0) {
$cannot_update = array_diff($tocreate, $dbtables_can_update[$id]);
if (count($cannot_update) != 0) {
$errors[] = "Key columns are absent in table `$id'. Unable to continue installation.";
$page['nextstep'] = getlocal("install.kill_tables");
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=dt";
$page['nextnotice'] = getlocal("install.kill_tables.notice");
return false;
}
$need_to_create_columns = true;
}
}
$need_to_create_indexes = false;
foreach ($dbtables_indexes as $id => $indexes) {
$curr_indexes = get_indexes($id, $link);
if ($curr_indexes === false) {
return false;
}
$tocreate = array_diff(array_keys($indexes), $curr_indexes);
if (count($tocreate) != 0) {
$need_to_create_indexes = true;
}
}
if ($need_to_create_columns || $need_to_create_indexes) {
$page['nextstep'] = getlocal("install.4.create");
$page['nextstepurl'] = "$mibewroot/install/dbperform.php?act=addcolumns";
$page['nextnotice'] = getlocal("install.4.notice");
return false;
}
$page['done'][] = getlocal("install.4.done");
return true;
}
function check_sound()
{
global $page;
$page['soundcheck'] = true;
$page['done'][] = getlocal2("install.5.text", array(
"<a id='check-nv' href='javascript:void(0)'>" . getlocal("install.5.newvisitor") . "</a>",
"<a id='check-nm' href='javascript:void(0)'>" . getlocal("install.5.newmessage") . "</a>"
));
}
function check_admin($link)
{
global $mysqlprefix;
$result = mysql_query("select * from ${mysqlprefix}chatoperator where vclogin = 'admin'", $link);
if ($result) {
$line = mysql_fetch_array($result, MYSQL_ASSOC);
mysql_free_result($result);
return $line['vcpassword'] != md5('');
}
return false;
}
function add_canned_messages($link){
global $mysqlprefix;
$localesresult = mysql_query("select locale from ${mysqlprefix}chatresponses", $link);
$existlocales = array();
for ($i = 0; $i < mysql_num_rows($localesresult); $i++) {
$existlocales[] = mysql_result($localesresult, $i, 'locale');
}
$result = array();
foreach (get_available_locales() as $locale) {
if (! in_array($locale, $existlocales)) {
foreach (explode("\n", getstring_('chat.predefined_answers', $locale)) as $answer) {
$result[] = array('locale' => $locale, 'vctitle' => cutstring($answer, 97, '...'), 'vcvalue' => $answer);
}
}
}
if (count($result) > 0) {
$updatequery = "insert into ${mysqlprefix}chatresponses (vctitle,vcvalue,locale,groupid) values ";
for ($i = 0; $i < count($result); $i++) {
if ($i > 0) {
$updatequery .= ", ";
}
$updatequery .= "('" . mysql_real_escape_string($result[$i]['vctitle'], $link) . "', "
. "'" . mysql_real_escape_string($result[$i]['vcvalue'], $link) . "', "
. "'" . mysql_real_escape_string($result[$i]['locale'], $link) . "', NULL)";
}
mysql_query($updatequery, $link);
}
}
function check_status()
{
global $page, $mibewroot, $dbversion, $mysqlprefix;
$page['done'][] = getlocal2("install.0.php", array(phpversion()));
if (!check_mibewroot()) {
return;
}
if (!check_files()) {
return;
}
$link = check_connection();
if (!$link) {
return;
}
if (!check_database($link)) {
mysql_close($link);
return;
}
if (!check_tables($link)) {
mysql_close($link);
return;
}
if (!check_columns($link)) {
mysql_close($link);
return;
}
add_canned_messages($link);
check_sound();
$page['done'][] = getlocal("installed.message");
if (!check_admin($link)) {
$page['nextstep'] = getlocal("installed.login_link");
$page['nextnotice'] = getlocal2("installed.notice", array("${mibewroot}/install/"));
$page['nextstepurl'] = "$mibewroot/operator/login.php?login=admin";
}
$page['show_small_login'] = true;
// Update current dbversion
$res = mysql_query("select COUNT(*) as count from ${mysqlprefix}chatconfig where vckey = 'dbversion'", $link);
if(mysql_result($res, 0, 'count') == 0) {
mysql_query("insert into ${mysqlprefix}chatconfig (vckey) values ('dbversion')", $link);
}
mysql_query("update ${mysqlprefix}chatconfig set vcvalue = '{$dbversion}' where vckey='dbversion'", $link);
mysql_close($link);
}
check_status();
start_html_output();
require('../view/install_index.php');
?>

View File

@ -1,68 +0,0 @@
<?php
/*
* Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License.
* You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
require_once('../libs/init.php');
$db = Database::getInstance();
$db->throwExeptions(true);
$update_datetime = array(
'{chatthread}' => array(
'dtmcreated',
'dtmchatstarted',
'dtmmodified',
'lastpinguser',
'lastpingagent'
),
'{chatmessage}' => array(
'dtmcreated'
),
'{chatoperator}' => array(
'dtmlastvisited',
'dtmrestore'
),
'{chatban}' => array(
'dtmcreated',
'dtmtill'
),
'{chatsitevisitor}' => array(
'firsttime',
'lasttime',
'invitationtime'
),
'{visitedpage}' => array(
'visittime'
),
'{visitedpagestatistics}' => array(
'visittime'
)
);
foreach($update_datetime as $table => $columns) {
echo("Table: {$table}<br />");
foreach($columns as $column) {
echo("-- Column: {$column}<br />");
$db->query("ALTER TABLE {$table} CHANGE {$column} {$column}_tmp datetime");
$db->query("ALTER TABLE {$table} ADD COLUMN {$column} int NOT NULL DEFAULT 0 AFTER {$column}_tmp");
$db->query("UPDATE {$table} SET {$column} = UNIX_TIMESTAMP({$column}_tmp)");
$db->query("ALTER TABLE {$table} DROP COLUMN {$column}_tmp");
}
}
?>

View File

@ -1,181 +0,0 @@
1.6.5
-----
[+] Apache 2 license
[!] csrf fixes
1.6.4
-----
[+] core UI improvements, "you are offline" and "new features" notification panels
[+] online/away operators list (on "awaiting visitors" page) by Andrew Armstrong
[+] several instances of mibew in one DB ($mysqlprefix variable)
[+] ability to override notification email for group
[!] various compatibility fixes: button image, captcha, check webimroot variable (installation)
[!] check file permissions/checksum (installation)
[!] fix speed of history search, fix redirection to groups
[!] fix sound issues in windows
1.6.3
-----
[+] password restore functionality for agent
[+] new Blue logo; new buttons: mgreen, mblue
[!] fixed: button code conflicts with spam filters and mod_security
[!] workarounds if some functions are disabled in php
[!] compatibility with PHP 5.3.0
[+] new domain: mibew.org
1.6.2
-----
[+] bi-licensed: EPL / GPL
[+] operator is away status, show status on redirect/survey/operators pages
[+] Captcha - Leave Message
[+] groups page: last active column
[+] pre-chat survey, redirect page: show group status - online/offline/away
[!] do not show empty groups in redirect/survey
[!] compatibility with the latest mod_security rules
[+] performance options in settings: update intervals, operator online time threshold
[+] information messages: visitor navigated to ...
[!] html code in templates, better appearance in Safari
1.6.1
-----
[!] 404 installation problem
[+] new permission: "Ability to modify profile"
[+] new project name: Mibew Messenger
[!] fixed localization of dates for all languages, nice formatting: Today/Yesterday
[!] fixed online/offline image for groups
[+] ability to delete operators, confirmation dialog when deleting group/operator/blocked address
[+] Information about last activity for operators: Online, Today at 22, 01 Jan.., or Never
[+] new theme: simplicity (by Sheldmandu)
[!] chat templates are fixed according to html standards
1.6.0
-----
[+] completely new layout of all administrator pages, XHTML 1.0
[+] New awaiting users and chat log pages
[+] right menu, show/hide menu on awaiting users page, nice locale chooser
[+] main page: warning if database is outdated (after install)
[+] "Updates": news, link to the latest version
[+] Operator's profile page
[+] Configurable pre-chat survey
[+] Create/edit/remove groups
[+] Canned messages page
[+] Statistics page
[+] Popup dialog notification of the new visitor (turned off by default)
[+] Send message option: enter vs ctrl-enter
[!] Slow loading of awating visitors page
1.5.2
-----
[+] Ability to disable sound notifications for chat (toolbar button)
[+] Switch to SSL in chat (should be enabled in "Settings -> Optional Services")
[!] lost query parameters after login redirect
[+] added referrer into button code
[+] ability to add text for operator into button code, define visitor's name and email
[!] geolocation on IPs in history
[!] Translation UI: added sorting, filters, fixed several problems
[+] New chat buttons
1.5.1
-----
[!] significant optimization of chat window (both themes), reduced number of images and their sizes
[+] tabs in settings: Optional Services, Themes preview
[+] better French and Spanish translations, additional languages are stored separately
[+] detect Chrome browser, show its version
[!] reverted order in title, removed available_locales variable from config.php (detect automatically)
[!] return English message by default (when translation for other language is absent)
[!] problems with styles, fixed error messages in avatar uploading
[+] nice confirmation when form is saved
1.5.0
-----
[!] sound notifications: FF (mac,win), Opera (mac,win), IE, Safari (mac,win)
[+] chat styles support: selectors in button generation and in settings
[+] styles are applied as set of page templates
[+] added styles preview page (the link from settings page) with "fake" chat
[+] 2 styles are included: original (old one) and default (new green scheme)
[+] new options in settings: user can change name, presentable name pattern
[+] customizable geolocation link for IPs on pending users page
[+] permissions support: Agents -> some agent -> Permissions
[+] New permissions:
[x] System administration: settings, operators management, button generation
[x] Take over chat thread
[x] View another operator's chat thread
1.4.2
-----
[+] Operators photos (appears in users chat window)
[+] pending users: show first user message (below the name)
[+] pending users: show visitors's browser name and version
[+] mark user with unique id to be able to see its dialogs later
[+] special button in operator's thread to browse previous chats
[+] Spam Blocking
1.4.1
-----
[+] redirect visitor to another operator
[+] predefined answers (without proper management yet)
[+] play notification sounds (new message, new visitor)
[+] confirmation when trying to intercept another operator's visitor
[+] ability to view threads without taking
1.4.0
-----
[+] introduce messenger settings page, persist several options in DB instead of config.php
[+] improve history search speed
[+] do not show typing notification for disconnected remote
[!] monitor connection status, show reconnecing message when connection is low (pendings users and chat window)
[!] support lang & language args in button code, create correct code for link
[!] fix safari, opera 9.5+ (+ several others compatibility fixes)
1.0.10
------
[+] Number of messages from visitor in history
[+] State "loading" (means user is still loading his window)
[+] Timers on peding users page are ticking now
[!] Company logo link target is now an option in config
[!] Mail encoding fixed (separate option)
[!] Operator/user locale is stored in cookie
[!] localized dates
[!] fixed installing on DB with numeric name
[!] empty and double messages
[!] #1983764
1.0.9
-----
[+] typing notifications in chat window
[!] completly new encoding handling, default is utf-8, page encoding is set in resources
[!] fixed user name storage in cookie (now utf8 in base64)
[!] some fixes for Opera
[!] force utf-8 for xml
1.0.8
-----
[+] install/update wizard, can create database and update it if needed
[+] leave message form when no operator is available
[!] location of web application can be other than /webim (see config.php)
[!] locale-specific resources extracted into /locales
[!] some fixes for Safari browser
[!] email validation in forms
1.0.7
-----
[+] history search with pagination
[+] advanced button generation: secure link, include hostname, choosing images
[+] post referer into thread as a message (visible only for agent)
[+] new config options: user can change name, company name, logo
[+] notify operator if user closed his window
[+] notify visitor if operator has connection problems and move it into priority queue
[+] automatically take visitor if operator connection restored
[!] encoding problems in Internet Explorer
[!] quotes in messages & user names
[!] do not reopen closed threads
[!] some fixes in handling thread locale
[!] version in menu, locales chooser in menu

Some files were not shown because too many files have changed in this diff Show More