Refactor JavaScript invitation and tracking code

This commit is contained in:
Dmitriy Simushev 2013-05-17 13:59:15 +00:00
parent 52f00cbe59
commit c64c1a441d
9 changed files with 429 additions and 258 deletions

View File

@ -1,10 +0,0 @@
/*
Copyright 2005-2013 the original author or authors.
Licensed under the Apache License, Version 2.0 (the "License").
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
*/
var style=document.createElement("style");document.getElementsByTagName("head")[0].appendChild(style);window.createPopup||(style.appendChild(document.createTextNode("")),style.setAttribute("type","text/css"));var sheet=document.styleSheets[document.styleSheets.length-1];if(window.createPopup)sheet.cssText=mibewInviteStyle;else{var node=document.createTextNode(mibewInviteStyle);style.appendChild(node)}
function mibewInviteOnResponse(a){var c=a.invitation.message,b=a.invitation.operator,d=a.invitation.avatar;a='<div id="mibewinvitationpopup"><div id="mibewinvitationclose"><a href="javascript:void(0);" onclick="mibewHideInvitation();">&times;</a></div>';b&&(a+='<h1 onclick="mibewOpenAgent();">'+b+"</h1>");d&&(a+='<img id="mibewinvitationavatar" src="'+d+'" title="'+b+'" alt="'+b+'" onclick="mibewOpenAgent();" />');a=a+('<p onclick="mibewOpenAgent();">'+c+"</p>")+'<div style="clear: both;"></div></div>';
if(c=document.getElementById("mibewinvitation"))c.innerHTML=a}function mibewHideInvitation(){document.getElementById("mibewinvitationpopup")&&(document.getElementById("mibewinvitationpopup").style.display="none")}function mibewOpenAgent(){document.getElementById("mibewAgentButton")&&(document.getElementById("mibewAgentButton").onclick(),mibewHideInvitation())};

View File

@ -1,13 +0,0 @@
/*
Copyright 2005-2013 the original author or authors.
Licensed under the Apache License, Version 2.0 (the "License").
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
*/
var mibewRequestedScripts=[],mibewHandlers=[],mibewHandlersDependences=[];function mibewMakeRequest(){var a=mibewReadCookie(mibewVisitorCookieName);mibewDoLoadScript(mibewRequestUrl+"&rnd="+Math.random()+(!1!==a?"&user_id="+a:""),"responseScript")}
function mibewOnResponse(a){var b=a.load,c=a.handlers,d=a.data;a=a.dependences;for(id in b)b[id]in mibewRequestedScripts||(mibewRequestedScripts[id]=[],mibewRequestedScripts[id].url=b[id],mibewRequestedScripts[id].status="loading",mibewLoadScript(id));for(handler in a)handler in mibewHandlersDependences||(mibewHandlersDependences[handler]=a[handler]);for(b=0;b<c.length;b++){var e=c[b];if(mibewCanRunHandler(c[b]))window[e](d);else c[b]in mibewHandlers||(mibewHandlers[e]=function(){window[e](d)})}mibewCleanUpAfterRequest();
window.setTimeout(mibewMakeRequest,mibewRequestTimeout)}function mibewCleanUpAfterRequest(){document.getElementsByTagName("head")[0].removeChild(document.getElementById("responseScript"))}function mibewDoLoadScript(a,b){var c=document.createElement("script");c.setAttribute("type","text/javascript");c.setAttribute("src",a);c.setAttribute("id",b);document.getElementsByTagName("head")[0].appendChild(c);return c}
function mibewLoadScript(a){var b=mibewDoLoadScript(mibewRequestedScripts[a].url,a);b.onload=function(){mibewScriptReady(a)};b.onreadystatechange=function(){("complete"==this.readyState||"loaded"==this.readyState)&&mibewScriptReady(a)}}function mibewScriptReady(a){mibewRequestedScripts[a].status="ready";for(handlerName in mibewHandlers)mibewCanRunHandler(handlerName)&&(mibewHandlers[handlerName](),delete mibewHandlers[handlerName])}
function mibewCanRunHandler(a){a=mibewHandlersDependences[a];for(var b=0;b<a.length;b++)if("ready"!=mibewRequestedScripts[a[b]].status)return!1;return!0}function mibewCreateCookie(a,b){var c=/([^\.]+\.[^\.]+)$/.exec(document.location.hostname)[1];document.cookie=""+a+"="+b+"; path=/; "+(c?"domain="+c+";":"")}function mibewReadCookie(a){var b=document.cookie.split("; ");a+="=";for(var c=!1,d=0;d<b.length;d++)if(-1!=b[d].indexOf(a)){c=b[d].substr(a.length);break}return c}
function mibewUpdateUserId(a){mibewCreateCookie(mibewVisitorCookieName,a.user.id)};

View File

@ -0,0 +1,16 @@
/*
Copyright 2005-2013 the original author or authors.
Licensed under the Apache License, Version 2.0 (the "License").
You may obtain a copy of the License at
http://www.apache.org/licenses/LICENSE-2.0
*/
var Mibew={};
(function(b){b.Objects={};b.Widget=function(a){this.requestedScripts={};this.handlers=[];this.handlersDependences={};this.requestURL=a.requestURL;this.requestTimeout=a.requestTimeout;this.visitorCookieName=a.visitorCookieName;this.inviteStyle=a.inviteStyle;this.locale=a.locale;var c=document.createElement("link");c.setAttribute("rel","stylesheet");c.setAttribute("type","text/css");c.setAttribute("href",a.inviteStyle);document.getElementsByTagName("head")[0].appendChild(c)};b.Widget.prototype.makeRequest=function(){var a=
b.Utils.readCookie(this.visitorCookieName);this.doLoadScript(this.requestURL+"?entry="+escape(document.referrer)+"&locale="+this.locale+"&rnd="+Math.random()+(!1!==a?"&user_id="+a:""),"responseScript")};b.Widget.prototype.onResponse=function(a){var c=a.load,d=a.handlers,e=a.data;a=a.dependences;var j=this,f;for(f in c)c.hasOwnProperty(f)&&!(c[f]in this.requestedScripts)&&(this.requestedScripts[f]={},this.requestedScripts[f].url=c[f],this.requestedScripts[f].status="loading",this.loadScript(f));for(var h in a)a.hasOwnProperty(h)&&
(h in this.handlersDependences||(this.handlersDependences[h]=a[h]));for(c=0;c<d.length;c++){var g=d[c];if(this.canRunHandler(g))b.APIFunctions[g](e);else g in this.handlers||(this.handlers[g]=function(){b.APIFunctions[g](e)})}this.cleanUpAfterRequest();window.setTimeout(function(){j.makeRequest()},this.requestTimeout)};b.Widget.prototype.cleanUpAfterRequest=function(){document.getElementsByTagName("head")[0].removeChild(document.getElementById("responseScript"))};b.Widget.prototype.loadScript=function(a){var c=
this,b=this.doLoadScript(this.requestedScripts[a].url,a);b.onload=function(){c.scriptReady(a)};b.onreadystatechange=function(){("complete"==this.readyState||"loaded"==this.readyState)&&c.scriptReady(a)}};b.Widget.prototype.doLoadScript=function(a,c){var b=document.createElement("script");b.setAttribute("type","text/javascript");b.setAttribute("src",a);b.setAttribute("id",c);document.getElementsByTagName("head")[0].appendChild(b);return b};b.Widget.prototype.scriptReady=function(a){this.requestedScripts[a].status=
"ready";for(var b in this.handlers)this.handlers.hasOwnProperty(b)&&this.canRunHandler(b)&&(this.handlers[b](),delete this.handlers[b])};b.Widget.prototype.canRunHandler=function(a){a=this.handlersDependences[a];for(var b=0;b<a.length;b++)if("ready"!=this.requestedScripts[a[b]].status)return!1;return!0};b.Widget.init=function(a){b.Objects.widget=new b.Widget(a);b.Objects.widget.makeRequest()};b.Utils={};b.Utils.createCookie=function(a,b){var d=/([^\.]+\.[^\.]+)$/.exec(document.location.hostname)[1];
document.cookie=""+a+"="+b+"; path=/; "+(d?"domain="+d+";":"")};b.Utils.readCookie=function(a){var b=document.cookie.split("; ");a+="=";for(var d=!1,e=0;e<b.length;e++)if(-1!=b[e].indexOf(a)){d=b[e].substr(a.length);break}return d};b.APIFunctions={};b.APIFunctions.updateUserId=function(a){b.Utils.createCookie(b.Objects.widget.visitorCookieName,a.user.id)};b.APIFunctions.inviteOnResponse=function(a){var b=a.invitation.message,d=a.invitation.operator,e=a.invitation.avatar;a='<div id="mibewinvitationpopup"><div id="mibewinvitationclose"><a href="javascript:void(0);" onclick="Mibew.Invitation.hide();">&times;</a></div>';
d&&(a+='<h1 onclick="Mibew.Invitation.accept();">'+d+"</h1>");e&&(a+='<img id="mibewinvitationavatar" src="'+e+'" title="'+d+'" alt="'+d+'" onclick="Mibew.Invitation.accept();" />');a=a+('<p onclick="Mibew.Invitation.accept();">'+b+"</p>")+'<div style="clear: both;"></div></div>';if(b=document.getElementById("mibewinvitation"))b.innerHTML=a};b.Invitation={};b.Invitation.hide=function(){var a=document.getElementById("mibewinvitationpopup");a&&(a.style.display="none")};b.Invitation.accept=function(){document.getElementById("mibewAgentButton")&&
(document.getElementById("mibewAgentButton").onclick(),b.Invitation.hide())}})(Mibew);

View File

@ -1,58 +0,0 @@
/**
* @preserve Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*/
var style = document.createElement('style');
document.getElementsByTagName('head')[0].appendChild(style);
if (!window.createPopup) {
style.appendChild(document.createTextNode(''));
style.setAttribute("type", "text/css");
}
var sheet = document.styleSheets[document.styleSheets.length - 1];
if (!window.createPopup) {
var node = document.createTextNode(mibewInviteStyle);
style.appendChild(node);
} else {
sheet.cssText = mibewInviteStyle;
}
function mibewInviteOnResponse(response)
{
var message = response.invitation.message;
var operator = response.invitation.operator;
var avatar = response.invitation.avatar;
var popuptext = '<div id="mibewinvitationpopup">';
popuptext += '<div id="mibewinvitationclose"><a href="javascript:void(0);" onclick="mibewHideInvitation();">&times;</a></div>';
if (operator) {
popuptext += '<h1 onclick="mibewOpenAgent();">' + operator + '</h1>';
}
if (avatar) {
popuptext += '<img id="mibewinvitationavatar" src="' + avatar + '" title="' + operator + '" alt="' + operator + '" onclick="mibewOpenAgent();" />';
}
popuptext += '<p onclick="mibewOpenAgent();">' + message + '</p>';
popuptext += '<div style="clear: both;"></div></div>';
var invitationdiv = document.getElementById("mibewinvitation");
if (invitationdiv) {
invitationdiv.innerHTML = popuptext;
}
}
function mibewHideInvitation() {
if (document.getElementById('mibewinvitationpopup')) {
document.getElementById('mibewinvitationpopup').style.display='none';
}
}
function mibewOpenAgent() {
if (document.getElementById('mibewAgentButton')) {
document.getElementById('mibewAgentButton').onclick();
mibewHideInvitation();
}
}

View File

@ -1,155 +0,0 @@
/**
* @preserve Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*/
var mibewRequestedScripts = new Array();
var mibewHandlers = new Array();
var mibewHandlersDependences = new Array();
function mibewMakeRequest()
{
// Try to get user id from local cookie
var userId = mibewReadCookie(mibewVisitorCookieName);
mibewDoLoadScript(
mibewRequestUrl + '&rnd=' + Math.random()
+ ((userId !== false) ? '&user_id=' + userId : ''),
'responseScript'
);
}
function mibewOnResponse(response)
{
var load = response.load;
var handlers = response.handlers;
var data = response.data;
var dependences = response.dependences;
for(id in load){
if(! (load[id] in mibewRequestedScripts)){
mibewRequestedScripts[id] = new Array();
mibewRequestedScripts[id]['url'] = load[id];
mibewRequestedScripts[id]['status'] = 'loading';
mibewLoadScript(id);
}
}
for(handler in dependences){
if(! (handler in mibewHandlersDependences)){
mibewHandlersDependences[handler] = dependences[handler];
}
}
for(var i = 0; i < handlers.length; i++){
var handlerName = handlers[i];
if(mibewCanRunHandler(handlers[i])){
window[handlerName](data);
}else{
if(! (handlers[i] in mibewHandlers)){
mibewHandlers[handlerName] = function(){
window[handlerName](data);
};
}
}
}
mibewCleanUpAfterRequest();
window.setTimeout(mibewMakeRequest,mibewRequestTimeout);
}
function mibewCleanUpAfterRequest()
{
document.getElementsByTagName('head')[0].removeChild(document.getElementById('responseScript'));
}
function mibewDoLoadScript(url, id)
{
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', url);
script.setAttribute('id', id);
document.getElementsByTagName('head')[0].appendChild(script);
return script;
}
function mibewLoadScript(id)
{
var script = mibewDoLoadScript(mibewRequestedScripts[id]['url'], id);
script.onload = function(){
mibewScriptReady(id);
}
script.onreadystatechange = function(){
if (this.readyState == 'complete' || this.readyState == 'loaded') {
mibewScriptReady(id);
}
}
}
function mibewScriptReady(id)
{
mibewRequestedScripts[id]['status'] = 'ready';
for(handlerName in mibewHandlers){
if(mibewCanRunHandler(handlerName)){
mibewHandlers[handlerName]();
delete mibewHandlers[handlerName];
}
}
}
function mibewCanRunHandler(handlerName)
{
var dependences = mibewHandlersDependences[handlerName];
for(var i = 0; i < dependences.length; i++){
if(mibewRequestedScripts[dependences[i]]['status'] != 'ready'){
return false;
}
}
return true;
}
/**
* Create session cookie for top level domain with path equals to '/'.
*
* @param {String} name Cookie name
* @param {String} value Cookie value
*/
function mibewCreateCookie(name, value) {
var domainParts = /([^\.]+\.[^\.]+)$/.exec(document.location.hostname);
var domain = domainParts[1];
document.cookie = "" + name + "=" + value + "; "
+ "path=/; "
+ (domain ? ("domain=" + domain + ";") : '');
}
/**
* Try to read cookie.
*
* @param {String} name Cookie name
* @returns {String|Boolean} Cookie value or boolean false if cookie with
* specified name does not exist
*/
function mibewReadCookie(name) {
var cookies = document.cookie.split('; ');
var nameForSearch = name + '=';
var value = false;
for (var i = 0; i < cookies.length; i++) {
if (cookies[i].indexOf(nameForSearch) != -1) {
value = cookies[i].substr(nameForSearch.length);
break;
}
}
return value;
}
/**
* Update user id. API function
* @param {Object} response Data object from server
*/
function mibewUpdateUserId(response) {
mibewCreateCookie(mibewVisitorCookieName, response.user.id);
}

View File

@ -0,0 +1,374 @@
/**
* @preserve Copyright 2005-2013 the original author or authors.
*
* Licensed under the Apache License, Version 2.0 (the "License").
* You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
*/
/**
* @namespace Holds all Mibew functionality
*/
var Mibew = {};
(function(Mibew){
/**
* @namespace Holds objects instances
*/
Mibew.Objects = {};
/**
* Create new widget
* @constructor
* @todo Add options validation
*/
Mibew.Widget = function(options) {
/**
* Holds all scripts that must be loaded
* @type Object
* @private
*/
this.requestedScripts = {};
/**
* List of handlers that must be called
* @type Array
* @private
*/
this.handlers = [];
/**
* List of dependences between handlers and scripts
* @type Object
* @private
*/
this.handlersDependences = {};
/**
* URL for requests
* @type String
*/
this.requestURL = options.requestURL;
/**
* Timeout between requests to server
* @type Number
*/
this.requestTimeout = options.requestTimeout;
/**
* Name of tracking cookie
* @type String
*/
this.visitorCookieName = options.visitorCookieName;
/**
* URL of file with additional CSS rules for invitation
* @type String
*/
this.inviteStyle = options.inviteStyle;
/**
* Locale of the Widget
* @type String
*/
this.locale = options.locale;
// Load additional styles
var styleSheet = document.createElement('link');
styleSheet.setAttribute('rel', 'stylesheet');
styleSheet.setAttribute('type', 'text/css');
styleSheet.setAttribute('href', options.inviteStyle);
document.getElementsByTagName('head')[0].appendChild(styleSheet);
}
/**
* Make request to the server.
* @private
*/
Mibew.Widget.prototype.makeRequest = function() {
// Try to get user id from local cookie
var userId = Mibew.Utils.readCookie(this.visitorCookieName);
this.doLoadScript(
this.requestURL
+ '?entry=' + escape(document.referrer)
+ '&locale=' + this.locale
+ '&rnd=' + Math.random()
+ ((userId !== false) ? '&user_id=' + userId : ''),
'responseScript'
);
}
/**
* Parse server response. Called as JSONP callback function
* @param {Object} response Data got from server
*/
Mibew.Widget.prototype.onResponse = function(response) {
// Create some shortcuts
var load = response.load;
var handlers = response.handlers;
var data = response.data;
var dependences = response.dependences;
var context = this;
// Update list of scripts that must be loaded
for(var id in load){
if (! load.hasOwnProperty(id)) {
continue;
}
// Check if script already loaded
if (! (load[id] in this.requestedScripts)) {
this.requestedScripts[id] = {};
this.requestedScripts[id].url = load[id];
this.requestedScripts[id].status = 'loading';
this.loadScript(id);
}
}
// Update list of dependences
for(var handler in dependences){
if (! dependences.hasOwnProperty(handler)) {
continue;
}
// Check if dependences for this handler already stored
if (! (handler in this.handlersDependences)) {
this.handlersDependences[handler] = dependences[handler];
}
}
// Process all recieved handlers. Run handler if all dependences loaded
// and add it to handlers list otherwise.
for (var i = 0; i < handlers.length; i++) {
// Create shortcuts
var handlerName = handlers[i];
// TODO: Allow to run objects methods
if (this.canRunHandler(handlerName)) {
Mibew.APIFunctions[handlerName](data);
} else {
if (! (handlerName in this.handlers)) {
this.handlers[handlerName] = function(){
Mibew.APIFunctions[handlerName](data);
};
}
}
}
this.cleanUpAfterRequest();
// Make new request after timeout
window.setTimeout(
function() {
context.makeRequest();
},
this.requestTimeout);
}
/**
* Remove dynamically loaded request script from DOM
* @private
*/
Mibew.Widget.prototype.cleanUpAfterRequest = function() {
document.getElementsByTagName('head')[0]
.removeChild(document.getElementById('responseScript'));
}
/**
* Load script and add handler for script onLoad event
* @param {String} id Identifier of the script to load
* @private
*/
Mibew.Widget.prototype.loadScript = function(id) {
// Store context
var context = this;
// Load script by adding script tag to DOM
var script = this.doLoadScript(this.requestedScripts[id].url, id);
// Check if script loaded
script.onload = function(){
context.scriptReady(id);
}
// Do it in crossbrowser way
script.onreadystatechange = function(){
if (this.readyState == 'complete' || this.readyState == 'loaded') {
context.scriptReady(id);
}
}
}
/**
* Dynamically add script tag to DOM
* @param {String} url URL of the script to load
* @param {String} id Identifier of the script to load
* @private
*/
Mibew.Widget.prototype.doLoadScript = function(url, id) {
var script = document.createElement('script');
script.setAttribute('type', 'text/javascript');
script.setAttribute('src', url);
script.setAttribute('id', id);
document.getElementsByTagName('head')[0].appendChild(script);
return script;
}
/**
* Event listener for script onLoad event. Run handlers which have no
* unload dependences.
* @param {String} id Identifier of the loaded script
*/
Mibew.Widget.prototype.scriptReady = function(id) {
this.requestedScripts[id].status = 'ready';
for (var handlerName in this.handlers) {
if (! this.handlers.hasOwnProperty(handlerName)) {
continue;
}
if(this.canRunHandler(handlerName)){
this.handlers[handlerName]();
delete this.handlers[handlerName];
}
}
}
/**
* Check if handler can be run
*/
Mibew.Widget.prototype.canRunHandler = function(handlerName) {
var dependences = this.handlersDependences[handlerName];
// Check for dependencess
for(var i = 0; i < dependences.length; i++){
if(this.requestedScripts[dependences[i]].status != 'ready'){
return false;
}
}
return true;
}
/**
* Helper function which create new widget object, store it into
* Mibew.Objects.widget and run automatic requests.
*/
Mibew.Widget.init = function(options) {
Mibew.Objects.widget = new Mibew.Widget(options);
Mibew.Objects.widget.makeRequest();
}
/**
* @namespace Holds utility functions
*/
Mibew.Utils = {};
/**
* Create session cookie for top level domain with path equals to '/'.
*
* @param {String} name Cookie name
* @param {String} value Cookie value
*/
Mibew.Utils.createCookie = function(name, value) {
var domainParts = /([^\.]+\.[^\.]+)$/.exec(document.location.hostname);
var domain = domainParts[1];
document.cookie = "" + name + "=" + value + "; "
+ "path=/; "
+ (domain ? ("domain=" + domain + ";") : '');
}
/**
* Try to read cookie.
*
* @param {String} name Cookie name
* @returns {String|Boolean} Cookie value or boolean false if cookie with
* specified name does not exist
*/
Mibew.Utils.readCookie = function(name) {
var cookies = document.cookie.split('; ');
var nameForSearch = name + '=';
var value = false;
for (var i = 0; i < cookies.length; i++) {
if (cookies[i].indexOf(nameForSearch) != -1) {
value = cookies[i].substr(nameForSearch.length);
break;
}
}
return value;
}
/**
* @namespace Holds functions that can be called by the Core
*/
Mibew.APIFunctions = {};
/**
* Update user id. API function
* @param {Object} response Data object from server
*/
Mibew.APIFunctions.updateUserId = function(response) {
Mibew.Utils.createCookie(
Mibew.Objects.widget.visitorCookieName,
response.user.id
);
}
/**
* Show invitation popup
* @param {Object} response Data passed from server
*/
Mibew.APIFunctions.inviteOnResponse = function(response) {
var message = response.invitation.message;
var operator = response.invitation.operator;
var avatar = response.invitation.avatar;
var popuptext = '<div id="mibewinvitationpopup">';
popuptext += '<div id="mibewinvitationclose">'
+ '<a href="javascript:void(0);" onclick="Mibew.Invitation.hide();">'
+ '&times;</a></div>';
if (operator) {
popuptext += '<h1 onclick="Mibew.Invitation.accept();">'
+ operator
+ '</h1>';
}
if (avatar) {
popuptext += '<img id="mibewinvitationavatar" src="' + avatar
+ '" title="' + operator
+ '" alt="' + operator
+ '" onclick="Mibew.Invitation.accept();" />';
}
popuptext += '<p onclick="Mibew.Invitation.accept();">'
+ message
+ '</p>';
popuptext += '<div style="clear: both;"></div></div>';
var invitationdiv = document.getElementById("mibewinvitation");
if (invitationdiv) {
invitationdiv.innerHTML = popuptext;
}
}
/**
* @namespace Holds invitation stuff
*/
Mibew.Invitation = {};
/**
* Hide invitation popup
*/
Mibew.Invitation.hide = function() {
var invitationPopup = document.getElementById('mibewinvitationpopup');
if (invitationPopup) {
invitationPopup.style.display = 'none';
}
}
/**
* Accept invitation and open chat window
*/
Mibew.Invitation.accept = function() {
if (document.getElementById('mibewAgentButton')) {
document.getElementById('mibewAgentButton').onclick();
Mibew.Invitation.hide();
}
}
})(Mibew);

View File

@ -262,7 +262,7 @@ function build_widget_response($response) {
'dependences' => array(), 'dependences' => array(),
'data' => array() 'data' => array()
); );
return "mibewOnResponse(" . json_encode($result) . ");"; return "Mibew.Objects.widget.onResponse(" . json_encode($result) . ");";
} }
?> ?>

View File

@ -18,7 +18,8 @@
function generate_button($title, $locale, $style, $invitationstyle, $group, $inner, $showhost, $forcesecure, $modsecurity) function generate_button($title, $locale, $style, $invitationstyle, $group, $inner, $showhost, $forcesecure, $modsecurity)
{ {
global $visitorcookie; global $visitorcookie;
$link = get_app_location($showhost, $forcesecure) . "/client.php"; $app_location = get_app_location($showhost, $forcesecure);
$link = $app_location . "/client.php";
if ($locale) if ($locale)
$link = append_query($link, "locale=$locale"); $link = append_query($link, "locale=$locale");
if ($style) if ($style)
@ -31,20 +32,37 @@ function generate_button($title, $locale, $style, $invitationstyle, $group, $inn
$temp = get_popup($link, "$jslink", $temp = get_popup($link, "$jslink",
$inner, $title, "webim", "toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width=640,height=480,resizable=1"); $inner, $title, "webim", "toolbar=0,scrollbars=0,location=0,status=1,menubar=0,width=640,height=480,resizable=1");
if (Settings::get('enabletracking')) { if (Settings::get('enabletracking')) {
$temp = preg_replace('/^(<a )/', '\1id="mibewAgentButton" ', $temp); $widget_data = array();
$temp .= '<div id="mibewinvitation"></div><script type="text/javascript">var mibewInviteStyle = \'@import url(';
$temp .= get_app_location($showhost, $forcesecure); // URL of file with additional CSS rules for invitation popup
$temp .= '/styles/invitations/'; $widget_data['inviteStyle'] = $app_location . '/styles/invitations/' .
$temp .= ($invitationstyle?$invitationstyle:(Settings::get('invitationstyle'))); ($invitationstyle
$temp .= '/invite.css);\'; var mibewRequestTimeout = '; ? $invitationstyle
$temp .= Settings::get('updatefrequency_tracking'); : (Settings::get('invitationstyle'))
$temp .= '*1000; var mibewRequestUrl = \''; ) . '/invite.css';
$temp .= get_app_location($showhost, $forcesecure);
$temp .= '/request.php?entry=\' + escape(document.referrer) + \'&lang=ru\'; '; // Time between requests to the server in milliseconds
$temp .= ' var mibewVisitorCookieName = \''.$visitorcookie.'\''; $widget_data['requestTimeout'] = Settings::get('updatefrequency_tracking')
$temp .= '</script><script type="text/javascript" src="'; * 1000;
$temp .= get_app_location($showhost, $forcesecure);
$temp .= '/js/compiled/request.js"></script><script type="text/javascript">mibewMakeRequest();</script>'; // URL for requests
$widget_data['requestURL'] = $app_location . '/widget.php';
// Locale for invitation
$widget_data['locale'] = $locale;
// Name of the cookie to track user. Use if third-party cookie blocked
$widget_data['visitorCookieName'] = $visitorcookie;
// Build additional button code
$temp = preg_replace('/^(<a )/', '\1id="mibewAgentButton" ', $temp) .
'<div id="mibewinvitation"></div>' .
'<script type="text/javascript" src="' .
$app_location . '/js/compiled/widget.js' .
'"></script>' .
'<script type="text/javascript">' .
'Mibew.Widget.init('.json_encode($widget_data).')' .
'</script>';
} }
return "<!-- mibew button -->" . $temp . "<!-- / mibew button -->"; return "<!-- mibew button -->" . $temp . "<!-- / mibew button -->";
} }

View File

@ -61,18 +61,17 @@ if (Settings::get('enabletracking') == '1') {
if ($user_id !== false) { if ($user_id !== false) {
// Update local cookie value at target site // Update local cookie value at target site
$response['handlers'][] = 'mibewUpdateUserId'; $response['handlers'][] = 'updateUserId';
$response['dependences']['mibewUpdateUserId'] = array(); $response['dependences']['updateUserId'] = array();
$response['data']['user']['id'] = $user_id; $response['data']['user']['id'] = $user_id;
} }
} }
if ($invited !== FALSE) { if ($invited !== FALSE) {
$response['load']['mibewInvitationScript'] = get_app_location(true, is_secure_request()) . '/js/compiled/invite.js'; $response['handlers'][] = 'inviteOnResponse';
$response['handlers'][] = 'mibewInviteOnResponse'; $response['dependences']['inviteOnResponse'] = array();
$response['dependences']['mibewInviteOnResponse'] = array('mibewInvitationScript'); $locale = isset($_GET['locale']) ? $_GET['locale'] : '';
$locale = isset($_GET['lang']) ? $_GET['lang'] : '';
$operatorName = ($locale == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname']; $operatorName = ($locale == $home_locale) ? $operator['vclocalename'] : $operator['vccommonname'];
$response['data']['invitation']['operator'] = htmlspecialchars($operatorName); $response['data']['invitation']['operator'] = htmlspecialchars($operatorName);
$response['data']['invitation']['message'] = getlocal("invitation.message"); $response['data']['invitation']['message'] = getlocal("invitation.message");