Clean up repository
17
.gitignore
vendored
@ -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
|
Before Width: | Height: | Size: 348 B |
Before Width: | Height: | Size: 796 B |
Before Width: | Height: | Size: 1.9 KiB |
@ -1 +0,0 @@
|
||||
messenger
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
@ -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>
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -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>
|
||||
|
@ -1,5 +0,0 @@
|
||||
<component name="DependencyValidationManager">
|
||||
<state>
|
||||
<option name="SKIP_IMPORT_STATEMENTS" value="false" />
|
||||
</state>
|
||||
</component>
|
@ -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>
|
||||
|
@ -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>
|
@ -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"));
|
||||
|
@ -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 );
|
@ -1,6 +0,0 @@
|
||||
Options -Indexes
|
||||
|
||||
<IfModule mod_security.c>
|
||||
SecFilterEngine Off
|
||||
SecFilterScanPOST Off
|
||||
</IfModule>
|
@ -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.
|
@ -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.
|
@ -1 +0,0 @@
|
||||
Mibew/1.6.5
|
@ -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;
|
||||
?>
|
@ -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;
|
||||
?>
|
@ -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;
|
||||
?>
|
@ -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");
|
||||
}
|
||||
|
||||
?>
|
@ -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.');
|
||||
}
|
||||
|
||||
?>
|
@ -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;
|
||||
}
|
@ -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;
|
||||
}
|
Before Width: | Height: | Size: 372 B |
@ -1,4 +0,0 @@
|
||||
<html><head>
|
||||
</head><body>
|
||||
</body></html>
|
||||
|
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 732 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 340 B |
Before Width: | Height: | Size: 728 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 604 B |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.1 KiB |
@ -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.
|
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.3 KiB |
Before Width: | Height: | Size: 1.2 KiB |
Before Width: | Height: | Size: 1.1 KiB |
Before Width: | Height: | Size: 1.4 KiB |
Before Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 49 B |
Before Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 162 B |
Before Width: | Height: | Size: 713 B |
Before Width: | Height: | Size: 60 B |
Before Width: | Height: | Size: 377 B |
Before Width: | Height: | Size: 68 B |
Before Width: | Height: | Size: 148 B |
Before Width: | Height: | Size: 199 B |
Before Width: | Height: | Size: 139 B |
Before Width: | Height: | Size: 142 B |
Before Width: | Height: | Size: 796 B |
Before Width: | Height: | Size: 2.2 KiB |
Before Width: | Height: | Size: 915 B |
Before Width: | Height: | Size: 905 B |
Before Width: | Height: | Size: 906 B |
Before Width: | Height: | Size: 914 B |
Before Width: | Height: | Size: 75 B |
Before Width: | Height: | Size: 74 B |
Before Width: | Height: | Size: 1.6 KiB |
Before Width: | Height: | Size: 55 B |
Before Width: | Height: | Size: 89 B |
Before Width: | Height: | Size: 43 B |
Before Width: | Height: | Size: 92 B |
Before Width: | Height: | Size: 329 B |
Before Width: | Height: | Size: 309 B |
Before Width: | Height: | Size: 291 B |
Before Width: | Height: | Size: 554 B |
Before Width: | Height: | Size: 338 B |
Before Width: | Height: | Size: 640 B |
Before Width: | Height: | Size: 53 B |
Before Width: | Height: | Size: 70 B |
@ -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;
|
||||
|
||||
?>
|
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
?>
|
@ -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;
|
||||
?>
|
@ -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');
|
||||
?>
|
@ -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");
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
?>
|
@ -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
|
||||
|