Listen = { //ajaxUrl: '/cgi-bin/all_manager2/ajax_manager_listen_test.php', //test ajaxUrl: '/cgi-bin/all_manager2/ajax_manager_listen.php', //production //промежуток времени между запросами в милисекундах delay: 5000, //время подсвечивания нового элемента в спсике (в секундах) timeNewElRed: 180, //id записи в бд id: '', //текущее время переданое с сервера timeNow: 0, //список всех элементов list на предыдщем шаге obIdsListPrev: Array(), //список всех элементов list на текущем шаге obIdsList: Array(), //массив с новыми id элементами получеными в ходе работы arIdNew: Array(), //массив с записем времени в которое был получен новый элемент idNewTimestamp: {}, //кол-во элементов в history historyListCount: 0, //кол-во элементов в фулл-онлайн fullOnlineCount: 0, //массив соответствия id секции и ее названия sectionNames: { 0: "Received", 1: "Delivered", 2: "Verified", 3: "Canceled", 4: "Outsourced", 5: "ReceivedStaging", 6: "Accepted", 7: "ScamInternal", 8: "REQUEST", 12: "NeedsAttention", 13: "ReadyToOutsource", 14: "ResellerTemp", 15: "DeliveredNoPic" }, //##переменные из html //имя пользователя user_name: '', //ip пользователя ip: '', //id заказа (если мы на странцие заказа) order_id: '', //id секции (selection) section_id: '', //тип страницы action_id: '', //url текущей страницы url_this_page: '', //удаляем из массива "новых жлементов" элементы которые обновлены уже более какого-то времени checkNewElTimestamp: function () { var timeAgo = ''; jQuery.each(Listen.arIdNew, function (index, value) { if (value != 0 && value != Listen.id) { //в секундах timeAgo = (parseInt(Math.floor(Date.now())) - parseInt(Listen.idNewTimestamp[value])) / 1000; //console.log(Listen.arIdNew); if (timeAgo > Listen.timeNewElRed) { Listen.arIdNew[index] = 0; } } }); }, //создание html виджета generateBox: function () { jQuery('body').prepend('
' + ' '); }, //обновление вкладки с бзерами-онлайн на текущей странице updateBox: function (list) { var min = ''; var sec = ''; var timeStart = ''; Listen.obIdsList = Array(); var obIdsListPrevLen = Listen.obIdsListPrev.length; //удаляем из массива "новых жлементов" элементы которые обновлены уже более какого-то времени Listen.checkNewElTimestamp(); jQuery('#block-listen-content span').remove(); jQuery.each(list, function () { Listen.obIdsList.push(this.id); min = parseInt(this.time / 60); sec = this.time - min * 60; var newEl = ''; //если пришедший элемент находится в спсике "новых" добавляем ему класс if (parseInt(jQuery.inArray(this.id, Listen.arIdNew)) > -1 && this.id != Listen.id) { newEl = 'new-el-list'; } //приведение времени к читаемум виду timeStart = Listen.convertTimestamp(this.time_start); //console.log(this); jQuery('#block-listen-content').append("" + this.name + " : " + " " + timeStart + " " + " " + min + " min. " + sec + " sec."); }); //на страницу зашел новый user if (obIdsListPrevLen > 0) { var status = false; var timeStamp = Math.floor(Date.now()); jQuery.each(Listen.obIdsList, function (index, value) { //console.log(value); //console.log(Listen.obIdsListPrev); //если элемент из списка пришедшиъх в новом запросе не найден в псике элементво с прошлого шага if (jQuery.inArray(value, Listen.obIdsListPrev) == '-1' && value != Listen.id) { //добавляем его в массив новых элементов Listen.arIdNew.push(value); //добавляем для нового элемента время его добавления Listen.idNewTimestamp[value] = timeStamp; //новый статус: появился новый элемент status = true; } }); //если появился новый пользователь на странице if (status == true) { Listen.newUserCame(); } } //console.log(Listen.obIdsList); //console.log(Listen.obIdsListPrev); //console.log(Listen.arIdNew); //console.log(Listen.idNewTimestamp); Listen.obIdsListPrev = Listen.obIdsList; }, //обновление вкладки с историей посещений текущей страницы updateBoxHistory: function (list) { Listen.historyListCount = 0; var min = ''; var sec = ''; var timeStart = ''; var timeEnd = ''; jQuery('#block-listen-content-stat span').remove(); jQuery.each(list, function () { Listen.historyListCount++; min = parseInt(this.time / 60); sec = this.time - min * 60; timeStart = Listen.convertTimestamp(this.time_start); timeEnd = Listen.convertTimestamp(this.time_end); jQuery('#block-listen-content-stat').append("" + this.name + " : " + " " + timeStart + " " + "- " + timeEnd + " (" + min + "m.)" + ""); }); }, //обновление на вкладке с полным списком пользователей-online updateBoxFullOnline: function (list) { Listen.fullOnlineCount = 0; var min = ''; var sec = ''; var timeStart = ''; var elDescr = ''; var requestUrl = 'order_manager.cgi?'; jQuery('#block-listen-content-all span').remove(); jQuery.each(list, function () { Listen.fullOnlineCount++; min = parseInt(this.time / 60); sec = this.time - min * 60; timeStart = Listen.convertTimestamp(this.time_start); //если страница фильтра if (this.action_page == 'show_orders') { elDescr = ''; requestUrl = "show_orders_test.cgi?" + this.order_id; this.order_id = 'search orders' } //страница редактирования заказа else if (this.action_page == 'edit_order') { elDescr = ''; requestUrl = "edit_order.cgi?" + this.order_id; this.order_id = 'edit order'; } //страница close_order_multilingual.php else if (this.action_page == 'close_order_multilingual') { elDescr = ''; requestUrl = "#" + this.order_id; this.order_id = 'close order multilingual'; } //если action не указан (другие страницы) else { //дефолтные значения для страницы заказа elDescr = 'order'; requestUrl = "order_manager.cgi?order_details=" + this.order_id; //если длина idшника меньше 5 символов значит это не id заказа а id секции if (this.order_id.length < 5) { //меняем значения чтобы сгенерировать ссылку на страницу группы requestUrl = "order_manager.cgi?selection=" + this.order_id; this.order_id = Listen.sectionNames[this.order_id]; elDescr = 'group'; //todo if (this.order_id == 'undefined') { Listen.ip = location.href; } } } jQuery('#block-listen-content-all').append("" + this.name + " : " + " " + timeStart + " " + " " + min + " min. " + sec + " sec. - " + elDescr + ": " + this.order_id + ""); }); }, //обновление данных в панели updateListen: function () { jQuery.ajax({ type: 'get', data: { action: 'update', id: Listen.id, order_id: Listen.order_id, delay: Listen.delay, action_id: Listen.action_id }, url: Listen.ajaxUrl, success: function (result) { //console.log(result); if (result.status) { setTimeout(function () { Listen.updateListen(); }, Listen.delay); Listen.updateBox(result.list); Listen.updateBoxFullOnline(result.fullonline); Listen.addScroll(); } else { console.log('error update'); } } }) }, //первый запрос после захода на страницу createListen: function () { if (Listen.order_id.length > 0) { //edit_orde.cgi (обработка заказа) if (Listen.action_id == 'edit_order') { Listen.order_id = Listen.url_this_page; console.log('страница обработки заказа'); } //страница close_order_multilingual.php else if (Listen.action_id == 'close_order_multilingual') { console.log('close_order_multilingual'); } //заказ else { console.log('страница заказа'); } } //группа else if (Listen.section_id.length > 0) { console.log('страница группы'); Listen.order_id = Listen.section_id; } //show_order (фильтр) else { Listen.order_id = Listen.url_this_page; console.log('страница фильтра show_order') } jQuery.ajax({ type: 'get', data: { action: 'add', user_name: Listen.user_name, ip: Listen.ip, order_id: Listen.order_id, delay: Listen.delay, action_page: Listen.action_id }, url: Listen.ajaxUrl, success: function (result) { //console.log(result); Listen.id = result.id; Listen.timeNow = result.time_now; //console.log(result.list); if (Listen.id != '') { Listen.updateBox(result.list); Listen.updateBoxHistory(result.history); Listen.updateBoxFullOnline(result.fullonline); Listen.addScroll(); setTimeout(function () { Listen.updateListen(); }, Listen.delay) } else { console.log('error start'); } } }); }, //получаем парамтеры из текста страницы при ее загрузке getParams: function () { Listen.user_name = jQuery('#user_name').val(); Listen.ip = jQuery('#user_ip').val(); Listen.order_id = jQuery('#order_id').val(); Listen.section_id = jQuery('#section_id').val(); Listen.action_id = jQuery('#id_action').val(); Listen.url_this_page = jQuery('#url_this_page').val(); }, //единократное получение истории посещений дял текущей страницы и ее отображение в панели getHistoryAndShow: function () { var order_id = jQuery('#order_id').val(); jQuery.ajax({ type: 'get', data: {action: 'gethistory', order_id: order_id, delay: Listen.delay}, url: Listen.ajaxUrl, success: function (result) { if (result.history) { Listen.updateBoxHistory(result.history); } else { console.log('error get history'); } } }); }, //конвертируем timestamp во время для отображения convertTimestamp: function (timestamp) { var d = new Date(timestamp * 1000), // Convert the passed timestamp to milliseconds yyyy = d.getFullYear(), mm = ('0' + (d.getMonth() + 1)).slice(-2), // Months are zero based. Add leading 0. dd = ('0' + d.getDate()).slice(-2), // Add leading 0. hh = d.getHours(), h = hh, min = ('0' + d.getMinutes()).slice(-2), // Add leading 0. ampm = 'AM', time; if (hh > 12) { h = hh - 12; ampm = 'PM'; } else if (hh === 12) { h = 12; ampm = 'PM'; } else if (hh == 0) { h = 12; } // ie: 2013-02-18, 8:35 AM time = yyyy + '-' + mm + '-' + dd + ', ' + h + ':' + min + ' ' + ampm; return time; }, //действия если зашел новый юзер newUserCame: function () { //если находимся на странице редактирования заказа if (Listen.action_id == 'edit_order' || Listen.action_id == 'close_order_multilingual') { //если плашка закрыта if (jQuery('#block-listen-hidden').is(':visible')) { //открываем виджет jQuery('#block-listen-hidden').trigger('click'); } //делаем виджет красным jQuery('#block-listen-manager').addClass('came-new-user'); } else { //если плашка закрыта if (jQuery('#block-listen-hidden').is(':visible')) { jQuery('#block-listen-hidden').addClass('came-new-user'); } } }, //добавляем скролл если необходимо addScroll: function () { var windowHeight = parseInt(jQuery(window).height()); var historyBlockHeight = Listen.historyListCount * 25 + 200; var fullOnlineHeight = Listen.fullOnlineCount * 25 + 200; if (historyBlockHeight > windowHeight || fullOnlineHeight > windowHeight) { jQuery('#block-listen-content-stat , #block-listen-content-all').css({ 'max-height': windowHeight - 200 + 'px', 'overflow-y': 'scroll' }) } else { jQuery('#block-listen-content-stat , #block-listen-content-all').css({ 'max-height': '1500px', 'overflow-y': 'auto' }) } } }; $(function () { //получаем праметры из кода в самом начале Listen.getParams(); jQuery('#block-listen-hidden').show(); //если есть id заказа id группы if (Listen.order_id.length > 0 || Listen.section_id.length > 0 || Listen.action_id.length > 0) { //генерируем панельку для данных Listen.generateBox(); //запускаем синхронизацию setTimeout(function () { Listen.createListen(); }, 500); } //открываем полную панель jQuery('html').delegate('#block-listen-hidden', 'click', function () { jQuery(this).hide(200); jQuery('#block-listen-manager').show(200); //открываем вкладку ХИСТОРИ если на вкладке list нет нвоых пользователей if (!jQuery('#block-listen-hidden').hasClass('came-new-user')) { jQuery('.button-listen-tab').eq(1).trigger('click'); } jQuery(this).removeClass('came-new-user'); }); //закрываем панель jQuery('html').delegate('#block-listen-close', 'click', function () { jQuery('#block-listen-manager').hide(200).removeClass('came-new-user'); jQuery('#block-listen-hidden').show(200); }); //перключаемся между табами на панели jQuery('html').delegate('.button-listen-tab', 'click', function () { var index = jQuery(this).index(); jQuery('.listen-tab').hide(); jQuery('.button-listen-tab').removeClass('span-listen-active'); jQuery('.listen-tab').eq(index).show(); jQuery('.button-listen-tab').eq(index).addClass('span-listen-active'); //history if (index == 1) { Listen.getHistoryAndShow(); } }); //закрываем виджет кликнув в любом месте кроме самого виджета jQuery('html').delegate('body', 'click', function (event) { if (jQuery(event.target).closest('#block-listen-manager').length == 0 && jQuery(event.target).closest('#block-listen-hidden').length == 0) { jQuery('#block-listen-close').trigger('click'); } }); jQuery(window).resize(function () { Listen.addScroll(); }); });