Index: openacs-4/packages/xowiki/tcl/chat-procs.tcl =================================================================== RCS file: /usr/local/cvsroot/openacs-4/packages/xowiki/tcl/chat-procs.tcl,v diff -u -r1.29 -r1.30 --- openacs-4/packages/xowiki/tcl/chat-procs.tcl 20 Sep 2018 13:12:27 -0000 1.29 +++ openacs-4/packages/xowiki/tcl/chat-procs.tcl 28 Sep 2018 11:44:23 -0000 1.30 @@ -5,27 +5,46 @@ @author Gustaf Neumann @cvs-id $Id$ } + namespace eval ::xowiki { ::xo::ChatClass create Chat -superclass ::xo::Chat - Chat proc login {-chat_id -package_id {-mode ""} {-path ""}} { + ::xo::ChatClass instproc login {-chat_id -package_id {-mode ""} {-path ""}} { #:log "--chat" if {![ns_conn isconnected]} return auth::require_login - if {![info exists package_id]} {set package_id [ad_conn package_id] } - if {![info exists chat_id]} {set chat_id $package_id } - set session_id [ad_conn session_id].[clock seconds] - set context id=$chat_id&s=$session_id - set base_url ${path}ajax/chat?${context} + if {[ad_conn package_key] eq "xowiki"} { + set xowiki_package_id [ad_conn package_id] + } else { + set main_node_id [site_node::get_node_id -url "/"] + set xowiki_package_id [lindex [site_node::get_children -all \ + -package_key xowiki \ + -element object_id \ + -node_id $main_node_id] 0] + } + if {![info exists package_id]} { + set package_id $xowiki_package_id + } + #:log "chat_id=$chat_id, path=$path" if {$path eq ""} { - set path [lindex [site_node::get_url_from_object_id -object_id $package_id] 0] + set path [lindex [site_node::get_url_from_object_id \ + -object_id $package_id] 0] } elseif {[string index $path end] ne "/"} { append path / } + set xowiki_path [lindex [site_node::get_url_from_object_id \ + -object_id $xowiki_package_id] 0] + + if {![info exists chat_id]} {set chat_id $package_id} + + set session_id [ad_conn session_id].[clock seconds] + set context id=$chat_id&s=$session_id + set base_url ${path}ajax/chat?${context} + if {$mode eq ""} { # # The parameter "mode" was not specified, we try to guess the @@ -74,118 +93,110 @@ :log "--chat mode $mode" } - # small JavaScript library to obtain a portable ajax request object - ::xo::Page requireJS urn:ad:js:get-http-object - switch -- $mode { polling { - set jspath ${path}ajax/chat.js - set login_url ${base_url}&m=login - set get_update "chatSendCmd(\"${base_url}&m=get_new\",chatReceiver)" - set get_all "chatSendCmd(\"${base_url}&m=get_all\",chatReceiver)" + set jspath ${xowiki_path}ajax/chat.js + set subscribe_url ${base_url}&m=get_new } streaming { - set jspath ${path}ajax/streaming-chat.js + set jspath ${xowiki_path}ajax/streaming-chat.js set subscribe_url ${base_url}&m=subscribe } scripted-streaming { - set jspath ${path}ajax/scripted-streaming-chat.js + set jspath ${xowiki_path}ajax/scripted-streaming-chat.js set subscribe_url ${base_url}&m=subscribe&mode=scripted } default { error "mode $mode unknown, valid are: polling, streaming and scripted-streaming" } } - ::xo::Page requireJS $jspath - set users_url [ns_quotehtml ${base_url}&m=get_users] + # small JavaScript library to obtain a portable ajax request object + template::head::add_javascript -src urn:ad:js:get-http-object -order 10 + template::head::add_javascript -src ${xowiki_path}ajax/chat-common.js -order 20 + template::head::add_javascript -src $jspath -order 30 + set send_url ${base_url}&m=add_msg&msg= :log "--CHAT mode=$mode" - # TODO: styling should happen in some template - # set style { - # margin:1.5em 0 1.5em 0; - # padding:1em 0 1em 1em; - # background-color: #f9f9f9; - # border:1px solid #dedede; - # height:150px; - # font-size:.95em; - # line-height:.7em; - # color:#333; - # overflow:auto; - # } - template::add_body_script -script { - document.getElementById('chatMsg').focus(); + document.getElementById('xowiki-chat-send').focus(); } - if {$mode ne "polling"} { - ::xowiki::Chat create c1 \ + set html "" + + if {[apm_package_installed_p chat]} { + set message_label [_ chat.message] + set send_label [_ chat.Send_Refresh] + } else { + set message_label "Message" + set send_label "Send" + } + + # TODO: it is currently not possible to embed multiple chats in + # the same page. + append html [subst { +
+
+
+
+
+ $message_label + +
+ }] + + [self] create c1 \ -destroy_on_cleanup \ -chat_id $chat_id \ -session_id $session_id \ -mode $mode + + set data [c1 login] + if {$data ne ""} { + append html [subst { + + }] } - set html "" switch -- $mode { "polling" { - set r [subst { - - }] - template::add_event_listener \ - -id "messages-form" \ - -event "submit" \ - -script [subst { - chatSendMsg('$send_url',chatReceiver); - }] append html [subst -nocommands { }] + set send_msg_handler pollingSendMsgHandler } "streaming" { - set r [ns_urldecode [c1 get_all]] - template::add_event_listener \ - -id "messages-form" -event "submit" \ - -script {chatSendMsg();} append html [subst { }] + set send_msg_handler streamingSendMsgHandler } "scripted-streaming" { - set r [ns_urldecode [c1 get_all]] - template::add_event_listener \ - -id "messages-form" -event "submit" \ - -script {chatSendMsg();} append html [subst { - }] + set send_msg_handler scriptedStreamingSendMsgHandler } } - append html [subst { -
$r
-
- -
- }] + template::add_event_listener \ + -id "xowiki-chat-messages-form" -event "submit" \ + -script [subst {chatSendMsg('${send_url}', ${send_msg_handler});}] return $html }