diff --git a/src/webim/button.php b/src/webim/button.php
index 95328d9f..ed885f7a 100644
--- a/src/webim/button.php
+++ b/src/webim/button.php
@@ -1,31 +1,31 @@
-
\ No newline at end of file
diff --git a/src/webim/client.php b/src/webim/client.php
index 61166005..933b8542 100644
--- a/src/webim/client.php
+++ b/src/webim/client.php
@@ -1,68 +1,68 @@
-
\ No newline at end of file
diff --git a/src/webim/install/index.php b/src/webim/install/index.php
index 0e4f02df..4a2cd1e5 100644
--- a/src/webim/install/index.php
+++ b/src/webim/install/index.php
@@ -1,19 +1,19 @@
-
+
diff --git a/src/webim/install/install.php b/src/webim/install/install.php
index b47e3929..cbdf2b68 100644
--- a/src/webim/install/install.php
+++ b/src/webim/install/install.php
@@ -1,90 +1,98 @@
-
\ No newline at end of file
diff --git a/src/webim/install/view_index.php b/src/webim/install/view_index.php
index 5b32c2a2..461ad0c6 100644
--- a/src/webim/install/view_index.php
+++ b/src/webim/install/view_index.php
@@ -1,64 +1,57 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-">
-">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+">
+">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
diff --git a/src/webim/install/view_install.php b/src/webim/install/view_install.php
index 3e5b5b00..5633634a 100644
--- a/src/webim/install/view_install.php
+++ b/src/webim/install/view_install.php
@@ -1,64 +1,57 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- -
-
-
-">
-">
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
- |
-
-
-
-
-
-
+
+
+
+
+
+
+
+
+
+
+
+ -
+
+
+">
+">
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ |
+
+
+
+
+
+
diff --git a/src/webim/libs/chat.php b/src/webim/libs/chat.php
index ee7547b7..a09a4515 100644
--- a/src/webim/libs/chat.php
+++ b/src/webim/libs/chat.php
@@ -1,435 +1,438 @@
- "user", $kind_agent => "agent", $kind_for_agent => "hidden",
- $kind_info => "inf", $kind_conn => "conn", $kind_events => "event" );
-
-
-
-function next_token() {
- return rand(99999,99999999);
-}
-
-function next_revision($link) {
- perform_query("update chatrevision set id=LAST_INSERT_ID(id+1)",$link);
- $val = mysql_insert_id($link);
- return $val;
-}
-
-function post_message_($threadid,$kind,$message,$link,$from=null,$time=null) {
- $query = sprintf(
- "insert into chatmessage (threadid,ikind,tmessage,tname,dtmcreated) values (%s, %s,'%s',%s,%s)",
- $threadid,
- $kind,
- quote_smart($message,$link),
- $from ? "'".quote_smart($from,$link)."'" : "null",
- $time ? "FROM_UNIXTIME($time)" : "CURRENT_TIMESTAMP" );
-
- perform_query($query,$link);
-}
-
-function post_message($threadid,$kind,$message,$from=null) {
- $link = connect();
- post_message_($threadid,$kind,$message,$link,$from);
- mysql_close($link);
-}
-
-function prepare_html_message($text) {
- $escaped_text = htmlspecialchars($text);
- $text_w_links = preg_replace('/(http|ftp):\/\/\S*/','$0',$escaped_text);
- $multiline = str_replace("\n","
",$text_w_links);
- return $multiline;
-}
-
-function message_to_html($msg) {
- global $kind_to_string;
- $message = "".date("H:i:s",$msg['created'])." ";
- $kind = $kind_to_string{$msg['ikind']};
- if( $msg['tname'] )
- $message.= "".htmlspecialchars($msg['tname']).": ";
- $message.= "".prepare_html_message($msg['tmessage'])."
";
- return $message;
-}
-
-function message_to_text($msg) {
- global $kind_user, $kind_agent, $kind_info;
- $time = date("H:i:s ",$msg['created']);
- if($msg['ikind'] == $kind_user || $msg['ikind'] == $kind_agent) {
- if( $msg['tname'] )
- return $time.$msg['tname'].": ".$msg['tmessage']."\n";
- else
- return $time.$msg['tmessage']."\n";
- } else if($msg['ikind'] == $kind_info ) {
- return $time.$msg['tmessage']."\n";
- } else {
- return $time."[".$msg['tmessage']."]\n";
- }
-}
-
-function get_messages($threadid,$meth,$isuser,&$lastid) {
- global $kind_for_agent;
- $link = connect();
-
- $query = sprintf(
- "select messageid,ikind,unix_timestamp(dtmcreated) as created,tname,tmessage from chatmessage ".
- "where threadid = %s and messageid > %s %s order by messageid",
- $threadid, $lastid, $isuser ? "and ikind <> $kind_for_agent" : "" );
-
- $messages = array();
- $result = mysql_query($query,$link) or die(' Query failed: ' .mysql_error().": ".$query);
-
- while ($msg = mysql_fetch_array($result, MYSQL_ASSOC)) {
- $message = ($meth == 'text') ? message_to_text($msg) : message_to_html($msg);
- $messages[] = $message;
- if( $msg['messageid'] > $lastid )
- $lastid = $msg['messageid'];
- }
-
- mysql_free_result($result);
- mysql_close($link);
- return $messages;
-}
-
-function print_thread_mesages($threadid, $token, $lastid, $isuser,$format) {
- global $webim_encoding, $webimroot;
- $output = get_messages($threadid,"html",$isuser,$lastid);
-
- if( $format == "xml" ) {
- start_xml_output();
- print("");
- foreach( $output as $msg ) {
- print "".myiconv($webim_encoding,"utf-8",escape_with_cdata($msg))."\n";
- }
- print("");
- } else if( $format == "html" ) {
- start_html_output();
- $url = "$webimroot/thread.php?act=refresh&thread=$threadid&token=$token&html=on&user=".($isuser?"true":"false");
-
- print("\n".
- "\n".
- "\n".
- "\n".
- "".
- "".
- "" );
-
- foreach( $output as $msg ) {
- print $msg;
- }
-
- print(
- " |
".
- "" );
- }
-}
-
-function get_user_name($name, $id="") {
- global $presentable_name_pattern;
- return str_replace("{id}", $id, str_replace("{name}", $name, $presentable_name_pattern));
-}
-
-function setup_chatview_for_user($thread,$level) {
- global $page, $webimroot, $user_can_change_name, $company_logo_link, $company_name;
- $page = array();
- $page['agent'] = false;
- $page['user'] = true;
- $page['canpost'] = true;
- $nameisset = getstring("chat.default.username") != $thread['userName'];
- $page['displ1'] = $nameisset ? "none" : "inline";
- $page['displ2'] = $nameisset ? "inline" : "none";
- $page['level'] = $level;
- $page['ct.chatThreadId'] = $thread['threadid'];
- $page['ct.token'] = $thread['ltoken'];
- $page['ct.user.name'] = $thread['userName'];
- $page['canChangeName'] = $user_can_change_name;
-
- $page['ct.company.name'] = $company_name;
- $page['ct.company.chatLogoURL'] = $company_logo_link;
-
- $params = "thread=".$thread['threadid']."&token=".$thread['ltoken'];
- $page['selfLink'] = "$webimroot/client.php?".$params."&level=".$level;
-}
-
-function setup_chatview_for_operator($thread,$operator) {
- global $page, $webimroot, $company_logo_link, $company_name;
- $page = array();
- $page['agent'] = true;
- $page['user'] = false;
- $page['canpost'] = true;
- $page['ct.chatThreadId'] = $thread['threadid'];
- $page['ct.token'] = $thread['ltoken'];
- $page['ct.user.name'] = get_user_name($thread['userName']);
-
- $page['ct.company.name'] = $company_name;
- $page['ct.company.chatLogoURL'] = $company_logo_link;
-
- // TODO
- $page['namePostfix'] = "";
-}
-
-function is_ajax_browser($name,$ver,$useragent) {
- if( $name == "opera" )
- return $ver >= 8.02;
- if( $name == "safari" )
- return $ver >= 125;
- if( $name == "msie" )
- return $ver >= 5.5 && !strstr($useragent, "powerpc");
- if( $name == "netscape" )
- return $ver >= 7.1;
- if( $name == "mozilla")
- return $ver >= 1.4;
- if( $name == "firefox")
- return $ver >= 1.0;
-
- return false;
-}
-
-function is_old_browser($name,$ver) {
- if( $name == "opera" )
- return $ver < 7.0;
- if( $name == "msie" )
- return $ver < 5.0;
- return false;
-}
-
-$knownAgents = array("opera","msie","safari","firefox","netscape","mozilla");
-
-function get_remote_level($useragent) {
- global $knownAgents;
- $useragent = strtolower($useragent);
- foreach( $knownAgents as $agent ) {
- if( strstr($useragent,$agent) ) {
- if( preg_match( "/".$agent."[\\s\/]?(\\d+(\\.\\d+)?)/", $useragent, $matches ) ) {
- $ver = $matches[1];
-
- if( is_ajax_browser($agent,$ver,$useragent) )
- return "ajaxed";
- else if( is_old_browser($agent,$ver) )
- return "old";
-
- return "simple";
- }
- }
- }
- return "simple";
-}
-
-function update_thread_access($threadid, $params, $link) {
- $clause = "";
- foreach( $params as $k => $v ) {
- if( strlen($clause) > 0 )
- $clause .= ", ";
- $clause .= $k."=".$v;
- }
- perform_query(
- "update chatthread set $clause ".
- "where threadid = ".$threadid,$link);
-}
-
-function get_access_time($threadid, $isuser, $link) {
- return select_one_row(sprintf(
- "select unix_timestamp(%s) as lastping, ".
- "unix_timestamp(CURRENT_TIMESTAMP) as current ".
- "from chatthread where threadid = %s",
- $isuser ? "lastpinguser" : "lastpingagent",
- $threadid), $link);
-}
-
-function ping_thread($thread, $isuser) {
- global $kind_for_agent, $state_chatting, $state_waiting, $kind_conn, $connection_timeout;
- $link = connect();
- $params = array(($isuser ? "lastpinguser" : "lastpingagent") => "CURRENT_TIMESTAMP" );
-
- $access = get_access_time($thread['threadid'], !$isuser, $link);
- if( $access['lastping'] > 0 && abs($access['current']-$access['lastping']) > $connection_timeout ) {
- $params[$isuser ? "lastpingagent" : "lastpinguser"] = "0";
- if( !$isuser ) {
- $message_to_post = getstring_("chat.status.user.dead", $thread['locale']);
- post_message_($thread['threadid'],$kind_for_agent,$message_to_post,$link,null,$access['lastping']+$connection_timeout);
- } else if( $thread['istate'] == $state_chatting ) {
-
- $message_to_post = getstring_("chat.status.operator.dead", $thread['locale']);
- post_message_($thread['threadid'],$kind_conn,$message_to_post,$link,null,$access['lastping']+$connection_timeout);
- $params['istate'] = $state_waiting;
- commit_thread($thread['threadid'], $params, $link);
- mysql_close($link);
- return;
- }
- }
-
- update_thread_access($thread['threadid'], $params, $link);
- mysql_close($link);
-}
-
-function commit_thread($threadid,$params,$link) {
- $query = "update chatthread set lrevision = ".next_revision($link).", dtmmodified = CURRENT_TIMESTAMP";
- foreach( $params as $k => $v ) {
- $query .= ", ".$k."=".$v;
- }
- $query .= " where threadid = ".$threadid;
-
- perform_query($query,$link);
-}
-
-function rename_user($thread, $newname) {
- global $kind_events;
-
- $link = connect();
- commit_thread( $thread['threadid'], array('userName' => "'".mysql_real_escape_string($newname)."'"), $link);
- mysql_close($link);
-
- if( $thread['userName'] != $newname ) {
- post_message($thread['threadid'],$kind_events,
- getstring2_("chat.status.user.changedname",array($thread['userName'], $newname), $thread['locale']));
- }
-}
-
-function close_thread($thread,$isuser) {
- global $state_closed, $kind_events;
-
- if( $thread['istate'] != $state_closed ) {
- $link = connect();
- commit_thread( $thread['threadid'], array('istate' => $state_closed), $link);
- mysql_close($link);
- }
-
- $message = $isuser ? getstring2_("chat.status.user.left", array($thread['userName']), $thread['locale'])
- : getstring2_("chat.status.operator.left", array($thread['agentName']), $thread['locale']);
- post_message($thread['threadid'], $kind_events, $message);
-}
-
-function create_thread($username,$remote,$referer,$lang) {
- $link = connect();
-
- $query = sprintf(
- "insert into chatthread (userName,"."ltoken,remote,referer,lrevision,locale,dtmcreated,dtmmodified) values ".
- "('%s',"."%s,'%s','%s',%s,'%s',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)",
- mysql_real_escape_string($username),
- next_token(),
- mysql_real_escape_string($remote),
- mysql_real_escape_string($referer),
- next_revision($link),
- mysql_real_escape_string($lang) );
-
- perform_query($query,$link);
- $id = mysql_insert_id($link);
-
- $newthread = select_one_row("select * from chatthread where threadid = ". $id, $link );
- mysql_close($link);
- return $newthread;
-}
-
-function do_take_thread($threadid,$operatorName) {
- global $state_chatting;
- $link = connect();
- commit_thread( $threadid,
- array("istate" => $state_chatting,
- "agentName" => "'".mysql_real_escape_string($operatorName)."'"), $link);
- mysql_close($link);
-}
-
-function reopen_thread($threadid) {
- global $state_queue,$state_waiting,$state_chatting,$state_closed,$kind_events;
- $thread = thread_by_id($threadid);
-
- if( !$thread )
- return FALSE;
-
- if( $thread['istate'] == $state_closed )
- return FALSE;
-
- if( $thread['istate'] != $state_chatting && $thread['istate'] != $state_queue ) {
- $link = connect();
- commit_thread( $threadid,
- array("istate" => $state_waiting ), $link);
- mysql_close($link);
- }
-
- post_message($thread['threadid'], $kind_events, getstring_("chat.status.user.reopenedthread", $thread['locale']));
- return $thread;
-}
-
-function take_thread($thread,$operator) {
- global $state_queue, $state_waiting, $state_chatting, $kind_events, $home_locale;
-
- $state = $thread['istate'];
- $threadid = $thread['threadid'];
- $message_to_post = "";
-
- $operatorName = ($thread['locale'] == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
-
- if( $state == $state_queue || $state == $state_waiting) {
- do_take_thread($threadid, $operatorName);
-
- if( $state == $state_waiting ) {
- $message_to_post = getstring2_("chat.status.operator.changed", array($operatorName,$thread['agentName']), $thread['locale']);
- } else {
- $message_to_post = getstring2_("chat.status.operator.joined", array($operatorName), $thread['locale']);
- }
- } else if( $state == $state_chatting ) {
- if( $operatorName != $thread['agentName'] ) {
- do_take_thread($threadid, $operatorName);
- $message_to_post = getstring2_("chat.status.operator.changed", array($operatorName, $thread['agentName']), $thread['locale']);
- }
- } else {
- die("cannot take thread");
- }
-
- if( $message_to_post )
- post_message($threadid,$kind_events,$message_to_post);
-}
-
-function check_for_reassign($thread,$operator) {
- global $state_waiting, $home_locale, $kind_events;
- $operatorName = ($thread['locale'] == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
- if( $thread['istate'] == $state_waiting &&
- ( $thread['agentName'] == $operatorName )) {
- do_take_thread($thread['threadid'], $operatorName);
- $message_to_post = getstring2_("chat.status.operator.changed", array($operatorName,$thread['agentName']), $thread['locale']);
- post_message($thread['threadid'],$kind_events,$message_to_post);
- }
-}
-
-function thread_by_id($id) {
- $link = connect();
- $thread = select_one_row("select * from chatthread where threadid = ". $id, $link );
- mysql_close($link);
- return $thread;
-}
-
-function visitor_from_request() {
- global $namecookie;
- $userName = isset($_COOKIE[$namecookie]) ? $_COOKIE[$namecookie] : getstring("chat.default.username");
-
- return array( 'name' => $userName );
-}
-
-?>
+ "user", $kind_agent => "agent", $kind_for_agent => "hidden",
+ $kind_info => "inf", $kind_conn => "conn", $kind_events => "event" );
+
+
+
+function next_token() {
+ return rand(99999,99999999);
+}
+
+function next_revision($link) {
+ perform_query("update chatrevision set id=LAST_INSERT_ID(id+1)",$link);
+ $val = mysql_insert_id($link);
+ return $val;
+}
+
+function post_message_($threadid,$kind,$message,$link,$from=null,$time=null,$opid=null) {
+ $query = sprintf(
+ "insert into chatmessage (threadid,ikind,tmessage,tname,agentId,dtmcreated) values (%s, %s,'%s',%s,%s,%s)",
+ $threadid,
+ $kind,
+ quote_smart($message,$link),
+ $from ? "'".quote_smart($from,$link)."'" : "null",
+ $opid ? $opid : "0",
+ $time ? "FROM_UNIXTIME($time)" : "CURRENT_TIMESTAMP" );
+
+ perform_query($query,$link);
+}
+
+function post_message($threadid,$kind,$message,$from=null,$agentid=null) {
+ $link = connect();
+ post_message_($threadid,$kind,$message,$link,$from,null,$agentid);
+ mysql_close($link);
+}
+
+function prepare_html_message($text) {
+ $escaped_text = htmlspecialchars($text);
+ $text_w_links = preg_replace('/(http|ftp):\/\/\S*/','$0',$escaped_text);
+ $multiline = str_replace("\n","
",$text_w_links);
+ return $multiline;
+}
+
+function message_to_html($msg) {
+ global $kind_to_string;
+ $message = "".date("H:i:s",$msg['created'])." ";
+ $kind = $kind_to_string{$msg['ikind']};
+ if( $msg['tname'] )
+ $message.= "".htmlspecialchars($msg['tname']).": ";
+ $message.= "".prepare_html_message($msg['tmessage'])."
";
+ return $message;
+}
+
+function message_to_text($msg) {
+ global $kind_user, $kind_agent, $kind_info;
+ $time = date("H:i:s ",$msg['created']);
+ if($msg['ikind'] == $kind_user || $msg['ikind'] == $kind_agent) {
+ if( $msg['tname'] )
+ return $time.$msg['tname'].": ".$msg['tmessage']."\n";
+ else
+ return $time.$msg['tmessage']."\n";
+ } else if($msg['ikind'] == $kind_info ) {
+ return $time.$msg['tmessage']."\n";
+ } else {
+ return $time."[".$msg['tmessage']."]\n";
+ }
+}
+
+function get_messages($threadid,$meth,$isuser,&$lastid) {
+ global $kind_for_agent;
+ $link = connect();
+
+ $query = sprintf(
+ "select messageid,ikind,unix_timestamp(dtmcreated) as created,tname,tmessage from chatmessage ".
+ "where threadid = %s and messageid > %s %s order by messageid",
+ $threadid, $lastid, $isuser ? "and ikind <> $kind_for_agent" : "" );
+
+ $messages = array();
+ $result = mysql_query($query,$link) or die(' Query failed: ' .mysql_error().": ".$query);
+
+ while ($msg = mysql_fetch_array($result, MYSQL_ASSOC)) {
+ $message = ($meth == 'text') ? message_to_text($msg) : message_to_html($msg);
+ $messages[] = $message;
+ if( $msg['messageid'] > $lastid )
+ $lastid = $msg['messageid'];
+ }
+
+ mysql_free_result($result);
+ mysql_close($link);
+ return $messages;
+}
+
+function print_thread_mesages($threadid, $token, $lastid, $isuser,$format) {
+ global $webim_encoding, $webimroot;
+ $output = get_messages($threadid,"html",$isuser,$lastid);
+
+ if( $format == "xml" ) {
+ start_xml_output();
+ print("");
+ foreach( $output as $msg ) {
+ print "".myiconv($webim_encoding,"utf-8",escape_with_cdata($msg))."\n";
+ }
+ print("");
+ } else if( $format == "html" ) {
+ start_html_output();
+ $url = "$webimroot/thread.php?act=refresh&thread=$threadid&token=$token&html=on&user=".($isuser?"true":"false");
+
+ print("\n".
+ "\n".
+ "\n".
+ "\n".
+ "".
+ "".
+ "" );
+
+ foreach( $output as $msg ) {
+ print $msg;
+ }
+
+ print(
+ " |
".
+ "" );
+ }
+}
+
+function get_user_name($name, $id="") {
+ global $presentable_name_pattern;
+ return str_replace("{id}", $id, str_replace("{name}", $name, $presentable_name_pattern));
+}
+
+function setup_chatview_for_user($thread,$level) {
+ global $page, $webimroot, $user_can_change_name, $company_logo_link, $company_name;
+ $page = array();
+ $page['agent'] = false;
+ $page['user'] = true;
+ $page['canpost'] = true;
+ $nameisset = getstring("chat.default.username") != $thread['userName'];
+ $page['displ1'] = $nameisset ? "none" : "inline";
+ $page['displ2'] = $nameisset ? "inline" : "none";
+ $page['level'] = $level;
+ $page['ct.chatThreadId'] = $thread['threadid'];
+ $page['ct.token'] = $thread['ltoken'];
+ $page['ct.user.name'] = $thread['userName'];
+ $page['canChangeName'] = $user_can_change_name;
+
+ $page['ct.company.name'] = $company_name;
+ $page['ct.company.chatLogoURL'] = $company_logo_link;
+
+ $params = "thread=".$thread['threadid']."&token=".$thread['ltoken'];
+ $page['selfLink'] = "$webimroot/client.php?".$params."&level=".$level;
+}
+
+function setup_chatview_for_operator($thread,$operator) {
+ global $page, $webimroot, $company_logo_link, $company_name;
+ $page = array();
+ $page['agent'] = true;
+ $page['user'] = false;
+ $page['canpost'] = true;
+ $page['ct.chatThreadId'] = $thread['threadid'];
+ $page['ct.token'] = $thread['ltoken'];
+ $page['ct.user.name'] = get_user_name($thread['userName']);
+
+ $page['ct.company.name'] = $company_name;
+ $page['ct.company.chatLogoURL'] = $company_logo_link;
+
+ // TODO
+ $page['namePostfix'] = "";
+}
+
+function is_ajax_browser($name,$ver,$useragent) {
+ if( $name == "opera" )
+ return $ver >= 8.02;
+ if( $name == "safari" )
+ return $ver >= 125;
+ if( $name == "msie" )
+ return $ver >= 5.5 && !strstr($useragent, "powerpc");
+ if( $name == "netscape" )
+ return $ver >= 7.1;
+ if( $name == "mozilla")
+ return $ver >= 1.4;
+ if( $name == "firefox")
+ return $ver >= 1.0;
+
+ return false;
+}
+
+function is_old_browser($name,$ver) {
+ if( $name == "opera" )
+ return $ver < 7.0;
+ if( $name == "msie" )
+ return $ver < 5.0;
+ return false;
+}
+
+$knownAgents = array("opera","msie","safari","firefox","netscape","mozilla");
+
+function get_remote_level($useragent) {
+ global $knownAgents;
+ $useragent = strtolower($useragent);
+ foreach( $knownAgents as $agent ) {
+ if( strstr($useragent,$agent) ) {
+ if( preg_match( "/".$agent."[\\s\/]?(\\d+(\\.\\d+)?)/", $useragent, $matches ) ) {
+ $ver = $matches[1];
+
+ if( is_ajax_browser($agent,$ver,$useragent) )
+ return "ajaxed";
+ else if( is_old_browser($agent,$ver) )
+ return "old";
+
+ return "simple";
+ }
+ }
+ }
+ return "simple";
+}
+
+function update_thread_access($threadid, $params, $link) {
+ $clause = "";
+ foreach( $params as $k => $v ) {
+ if( strlen($clause) > 0 )
+ $clause .= ", ";
+ $clause .= $k."=".$v;
+ }
+ perform_query(
+ "update chatthread set $clause ".
+ "where threadid = ".$threadid,$link);
+}
+
+function get_access_time($threadid, $isuser, $link) {
+ return select_one_row(sprintf(
+ "select unix_timestamp(%s) as lastping, ".
+ "unix_timestamp(CURRENT_TIMESTAMP) as current ".
+ "from chatthread where threadid = %s",
+ $isuser ? "lastpinguser" : "lastpingagent",
+ $threadid), $link);
+}
+
+function ping_thread($thread, $isuser) {
+ global $kind_for_agent, $state_chatting, $state_waiting, $kind_conn, $connection_timeout;
+ $link = connect();
+ $params = array(($isuser ? "lastpinguser" : "lastpingagent") => "CURRENT_TIMESTAMP" );
+
+ $access = get_access_time($thread['threadid'], !$isuser, $link);
+ if( $access['lastping'] > 0 && abs($access['current']-$access['lastping']) > $connection_timeout ) {
+ $params[$isuser ? "lastpingagent" : "lastpinguser"] = "0";
+ if( !$isuser ) {
+ $message_to_post = getstring_("chat.status.user.dead", $thread['locale']);
+ post_message_($thread['threadid'],$kind_for_agent,$message_to_post,$link,null,$access['lastping']+$connection_timeout);
+ } else if( $thread['istate'] == $state_chatting ) {
+
+ $message_to_post = getstring_("chat.status.operator.dead", $thread['locale']);
+ post_message_($thread['threadid'],$kind_conn,$message_to_post,$link,null,$access['lastping']+$connection_timeout);
+ $params['istate'] = $state_waiting;
+ commit_thread($thread['threadid'], $params, $link);
+ mysql_close($link);
+ return;
+ }
+ }
+
+ update_thread_access($thread['threadid'], $params, $link);
+ mysql_close($link);
+}
+
+function commit_thread($threadid,$params,$link) {
+ $query = "update chatthread set lrevision = ".next_revision($link).", dtmmodified = CURRENT_TIMESTAMP";
+ foreach( $params as $k => $v ) {
+ $query .= ", ".$k."=".$v;
+ }
+ $query .= " where threadid = ".$threadid;
+
+ perform_query($query,$link);
+}
+
+function rename_user($thread, $newname) {
+ global $kind_events;
+
+ $link = connect();
+ commit_thread( $thread['threadid'], array('userName' => "'".mysql_real_escape_string($newname)."'"), $link);
+ mysql_close($link);
+
+ if( $thread['userName'] != $newname ) {
+ post_message($thread['threadid'],$kind_events,
+ getstring2_("chat.status.user.changedname",array($thread['userName'], $newname), $thread['locale']));
+ }
+}
+
+function close_thread($thread,$isuser) {
+ global $state_closed, $kind_events;
+
+ if( $thread['istate'] != $state_closed ) {
+ $link = connect();
+ commit_thread( $thread['threadid'], array('istate' => $state_closed), $link);
+ mysql_close($link);
+ }
+
+ $message = $isuser ? getstring2_("chat.status.user.left", array($thread['userName']), $thread['locale'])
+ : getstring2_("chat.status.operator.left", array($thread['agentName']), $thread['locale']);
+ post_message($thread['threadid'], $kind_events, $message);
+}
+
+function create_thread($username,$remote,$referer,$lang) {
+ $link = connect();
+
+ $query = sprintf(
+ "insert into chatthread (userName,"."ltoken,remote,referer,lrevision,locale,dtmcreated,dtmmodified) values ".
+ "('%s',"."%s,'%s','%s',%s,'%s',CURRENT_TIMESTAMP,CURRENT_TIMESTAMP)",
+ mysql_real_escape_string($username),
+ next_token(),
+ mysql_real_escape_string($remote),
+ mysql_real_escape_string($referer),
+ next_revision($link),
+ mysql_real_escape_string($lang) );
+
+ perform_query($query,$link);
+ $id = mysql_insert_id($link);
+
+ $newthread = select_one_row("select * from chatthread where threadid = ". $id, $link );
+ mysql_close($link);
+ return $newthread;
+}
+
+function do_take_thread($threadid,$operatorId,$operatorName) {
+ global $state_chatting;
+ $link = connect();
+ commit_thread( $threadid,
+ array("istate" => $state_chatting,
+ "agentId" => $operatorId,
+ "agentName" => "'".mysql_real_escape_string($operatorName)."'"), $link);
+ mysql_close($link);
+}
+
+function reopen_thread($threadid) {
+ global $state_queue,$state_waiting,$state_chatting,$state_closed,$kind_events;
+ $thread = thread_by_id($threadid);
+
+ if( !$thread )
+ return FALSE;
+
+ if( $thread['istate'] == $state_closed )
+ return FALSE;
+
+ if( $thread['istate'] != $state_chatting && $thread['istate'] != $state_queue ) {
+ $link = connect();
+ commit_thread( $threadid,
+ array("istate" => $state_waiting ), $link);
+ mysql_close($link);
+ }
+
+ post_message($thread['threadid'], $kind_events, getstring_("chat.status.user.reopenedthread", $thread['locale']));
+ return $thread;
+}
+
+function take_thread($thread,$operator) {
+ global $state_queue, $state_waiting, $state_chatting, $kind_events, $home_locale;
+
+ $state = $thread['istate'];
+ $threadid = $thread['threadid'];
+ $message_to_post = "";
+
+ $operatorName = ($thread['locale'] == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
+
+ if( $state == $state_queue || $state == $state_waiting) {
+ do_take_thread($threadid, $operator['operatorid'], $operatorName);
+
+ if( $state == $state_waiting ) {
+ $message_to_post = getstring2_("chat.status.operator.changed", array($operatorName,$thread['agentName']), $thread['locale']);
+ } else {
+ $message_to_post = getstring2_("chat.status.operator.joined", array($operatorName), $thread['locale']);
+ }
+ } else if( $state == $state_chatting ) {
+ if( $operator['operatorid'] != $thread['agentId'] ) {
+ do_take_thread($threadid, $operator['operatorid'], $operatorName);
+ $message_to_post = getstring2_("chat.status.operator.changed", array($operatorName, $thread['agentName']), $thread['locale']);
+ }
+ } else {
+ die("cannot take thread");
+ }
+
+ if( $message_to_post ) {
+ post_message($threadid,$kind_events,$message_to_post);
+ }
+}
+
+function check_for_reassign($thread,$operator) {
+ global $state_waiting, $home_locale, $kind_events;
+ $operatorName = ($thread['locale'] == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
+ if( $thread['istate'] == $state_waiting &&
+ ( $thread['agentId'] == $operator['operatorid'] )) {
+ do_take_thread($thread['threadid'], $operator['operatorid'], $operatorName);
+ $message_to_post = getstring2_("chat.status.operator.changed", array($operatorName,$thread['agentName']), $thread['locale']);
+ post_message($thread['threadid'],$kind_events,$message_to_post);
+ }
+}
+
+function thread_by_id($id) {
+ $link = connect();
+ $thread = select_one_row("select * from chatthread where threadid = ". $id, $link );
+ mysql_close($link);
+ return $thread;
+}
+
+function visitor_from_request() {
+ global $namecookie;
+ $userName = isset($_COOKIE[$namecookie]) ? $_COOKIE[$namecookie] : getstring("chat.default.username");
+
+ return array( 'name' => $userName );
+}
+
+?>
diff --git a/src/webim/libs/common.php b/src/webim/libs/common.php
index db11676e..c9931e26 100644
--- a/src/webim/libs/common.php
+++ b/src/webim/libs/common.php
@@ -1,293 +1,335 @@
-Wrong parameter used or absent: ".$name."