/** * Библиотека Glib * @author geni * @version 0.1 */ Glib = {}; Glib.Settings = {}; Glib.Settings.webEncoding = 'koi8-r'; Glib.Settings.setWebEncoding = function (newEncoding) { Glib.Settings.webEncoding = newEncoding; } Glib.Settings.getWebEncoding = function () { return Glib.Settings.webEncoding; } function showMessage(sText, sTarget) { var d = new Date(); var sDatePref = "[" + d.toLocaleString() + "] "; if(typeof(sTarget) == "undefined") { sTarget = "debugbox"; } //if (!$(sTarget)) { // var debugConsole = document.createElement("div"); // debugConsole.id = sTarget; // document.appendChild(debugConsole); //} //var obNewMessage = document.createElement("p"); //obNewMessage.innerHTML = sDatePref + sText; //$(sTarget).appendChild(obNewMessage); if ($(sTarget)) { $(sTarget).innerHTML += "

" + sDatePref + sText + "

"; touchFooter(); } } function handleErr(msg,url,l) { var txt=""; txt="There was an error on this page.\n\n" txt+="Error: " + msg + "\n" txt+="URL: " + url + "\n" txt+="Line: " + l + "\n\n" txt+="Click OK to continue.\n\n" showMessage(txt) return false } onerror=handleErr; function alertExeption(e) { showMessage("Exeption " + e.name + "(" + e.message + ")"); } /** * Возвращает элемент по его ID * @param {Object} sID */ function $(sID) { return document.getElementById(sID); } /** * Расширения класса Array */ /** * Функция поиска элемента в массиве * Если obValue содержится в массиве возвращает его индекс, иначе число -1 * * @param {Object} obValue * @return {Integer} */ if ('undefined' == typeof Array.prototype.indexOf) { Array.prototype.indexOf = function (obValue) { for(var i = 0; i < this.length; i++) { if (this[i] == obValue) return i; } return -1; } } if ('undefined' == typeof String.prototype.ltrim) { String.prototype.ltrim = function() { return this.replace(/^\s+/, ''); } } if ('undefined' == typeof String.prototype.rtrim) { String.prototype.rtrim = function() { return this.replace(/\s+$/, ''); } } if ('undefined' == typeof String.prototype.trim) { String.prototype.trim = function() { return this.replace(/^\s+/, '').replace(/\s+$/, ''); } } Glib.Dom = {}; Glib.Dom.insertAfter = function(newElement, targetElement) { var parent = targetElement.parentNode; if (parent.lastChild == targetElement) { parent.appendChild(newElement); } else { parent.insertBefore(newElement,targetElement.nextSibling); } } Glib.Dom.removeChildren = function (el) { while (el.hasChildNodes()) { el.removeChild(el.lastChild); } } Glib.Dom.findPosX = function(obj) { var curleft = 0; if (obj.offsetParent) { while (obj.offsetParent) { curleft += obj.offsetLeft; obj = obj.offsetParent; } } else if (obj.x) { curleft += obj.x; } return curleft; } Glib.Dom.findPosY = function(obj) { var curtop = 0; if (obj.offsetParent) { while (obj.offsetParent) { curtop += obj.offsetTop; obj = obj.offsetParent; } } else if (obj.y) { curtop += obj.y; } return curtop; } Glib.Dom.getClientSize = function() { var nWidth = 0, nHeight = 0, arResult = {}; if (typeof(window.innerWidth) == 'number' ) { nWidth = window.innerWidth; nHeight = window.innerHeight; } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { nWidth = document.documentElement.clientWidth; nHeight = document.documentElement.clientHeight; } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) { nWidth = document.body.clientWidth; nHeight = document.body.clientHeight; } arResult.nWidth = nWidth; arResult.nHeight = nHeight; return arResult; } /** * Добавляет класс sClassName к классам элемента * @param {Object} sClassName */ Glib.Dom.addClassName = function(elElement, sClassName) { if(!Glib.Dom.hasClassName(elElement, sClassName)) elElement.className += " " + sClassName; } /** * Удаляет класс sClassName из списка классов элемента * @param {Object} sClassName */ Glib.Dom.removeClassName = function(elElement, sClassName) { // var arClassNames = elElement.className.split(" "); // var i = -1; // if((i = arClassNames.indexOf(sClassName)) >= 0) { // arClassNames.splice(i, 1); // elElement.className = arClassNames.join(" "); // } elElement.className = (" " + elElement.className + " ").replace(" " + sClassName + " ", " ").trim(); } /** * Проверяет наличие класса sClassName у элемента. * @param {Object} sClassName * @return {Bool} true если класс есть, иначе false. */ Glib.Dom.hasClassName = function(elElement, sClassName) { return (" " + elElement.className + " ").indexOf(" " + sClassName + " ") != -1; //return elElement.className.split(" ").indexOf(sClassName) >= 0; } /** * Устанавливает класс sClassName для элемента elElement. * @param {Object} sClassName * @return {Bool} true если класс есть, иначе false. */ Glib.Dom.setClassName = function(elElement, sClassName) { elElement.className = sClassName; return elElement.className; } Glib.Dom.getElementWidth = function(sID) { var nWidth; if (document.layers) { nWidth = document.layers[sID].clip.width; } else if (document.all && !document.getElementById) { nWidth = document.all[sID].offsetWidth; } else if(document.getElementById) { nWidth = document.getElementById(sID).offsetWidth; } return nWidth; } Glib.Dom.getElementHeight = function(sID) { var nHeight; if (document.layers) { nHeight = document.layers[sID].clip.height; } else if (document.all && !document.getElementById) { nHeight = document.all[sID].offsetHeight; } else if(document.getElementById) { nHeight = document.getElementById(sID).offsetHeight; } return nHeight; } Glib.Utils = {}; Glib.Utils.swapArrayKeysAndValues = function(arSource) { var arResult = {}; for (var key in arSource) { arResult[arSource[key]] = key; } return arResult; } Glib.Utils.quoteMeta = function(sSource) { return sSource.replace(/([^A-Za-z0-9])/g, "\\$1"); } Glib.Utils.uniqueArray = function(arSource) { var l = arSource.length; var arUnique = {}; for (var i = 0; i < l; i++) { arUnique[arSource[i]] = arSource[i]; } var arResult = new Array(); for (var key in arUnique) { arResult.push(arUnique[key]); } return arResult; } Glib.Utils.checkIntValueInRange = function(sValue, nLowRange, nHighRange, nDefaultValue) { var nResult = isNaN(sValue) ? nDefaultValue : parseInt(sValue); if ((nResult < nLowRange) || (nResult > nHighRange)) { nResult = nDefaultValue; } return nResult; } Glib.Utils.addLeadZero = function(nValue) { return (nValue < 10) ? '0' + nValue : nValue; } Glib.Utils.trimString = function (stringToTrim) { return stringToTrim.replace(/^\s+|\s+$/g,""); } Glib.Debug = {}; Glib.Debug.dumpVar = function(obj) { var sRes = ""; for (var el in obj) { sRes = el + " = " + obj[el] + "
"; } return sRes; } Glib.Debug.showMessage = function(sMessage) { if (!$("debugbox")) { var elDebugbox = document.createElement("div"); elDebugbox.id = "debugbox"; document.body.appendChild(elDebugbox); } var obNewMessage = document.createElement("p"); obNewMessage.innerHTML = sMessage; $("debugbox").appendChild(obNewMessage); } Glib.DateTimeUtils = {}; Glib.DateTimeUtils.isLeapYear = function(nYear) { return (((nYear % 4)==0) && ((nYear % 100)!=0) || ((nYear % 400)==0)); } Glib.DateTimeUtils.getDaysInMonth = function(nMonth, nYear) { var nDays = 0; switch (nMonth) { case 1:case 3:case 5:case 7:case 8:case 10:case 12: nDays = 31; break; case 4:case 6:case 9:case 11: nDays = 30; break; case 2: nDays = Glib.DateTimeUtils.isLeapYear(nYear)? 29 : 28; break; } return nDays; } Glib.DateTimeUtils.arMonthNames = "Январь Февраль Март Апрель Май Июнь Июль Август Сентябрь Октябрь Ноябрь Декабрь".split(" "); Glib.DateTimeUtils.getMonthName = function(nMonth) { return Glib.DateTimeUtils.arMonthNames[nMonth-1]; } Glib.DateTimeUtils.arWeekDaysNames = "Пн Вт Ср Чт Пт Сб Вс".split(" "); // For week start from sunday //Glib.DateTimeUtils.arWeekDaysMapping = {0:0,1:1,2:2,3:3,4:4,5:5,6:6} // For week start from monday //Glib.DateTimeUtils.arWeekDaysMapping = {0:6,1:0,2:1,3:2,4:3,5:4,6:5} //Glib.DateTimeUtils.arWeekDaysReverseMapping = Glib.Utils.swapArrayKeysAndValues(Glib.DateTimeUtils.arWeekDaysMapping); //Glib.DateTimeUtils.getWeekDayFromDate = function(obDate) { // return Glib.DateTimeUtils.arWeekDaysMapping[obDate.getDay()]; //} //Glib.DateTimeUtils.getWeekDayName = function(nDay) { // return Glib.DateTimeUtils.arWeekDaysNames[Glib.DateTimeUtils.arWeekDaysReverseMapping[nDay]]; //} Glib.DateTimeUtils.getWeekDayFromDate = function(obDate, bSundayFirst) { if (bSundayFirst === true) { return obDate.getDay(); } else { var nDayNum = obDate.getDay() - 1; if (nDayNum < 0) nDayNum = 6; return nDayNum; } } Glib.DateTimeUtils.getWeekDayName = function(nDay, bSundayFirst) { if (bSundayFirst === true) { var nDayNum = nDay + 1; if (nDayNum == 7) nDayNum = 0; return Glib.DateTimeUtils.arWeekDaysNames[nDayNum]; } else { return Glib.DateTimeUtils.arWeekDaysNames[nDay]; } return Glib.DateTimeUtils.arWeekDaysNames[Glib.DateTimeUtils.arWeekDaysReverseMapping[nDay]]; } Glib.DateTimeUtils.checkDate = function(nDay, nMonth, nYear) { if ((nMonth < 1) || (nMonth > 12)) return false; if (nYear < 0) return false; if ((nDay < 0) || (nDay > Glib.DateTimeUtils.getDaysInMonth(nMonth, nYear))) return false; return true; } Glib.DateTimeUtils.checkTime = function(nHour, nMinute, nSecond) { if ((nHour < 0) || (nHour > 23)) return false; if ((nMinute < 0) || (nMinute > 59)) return false; if ((nSecond < 0) || (nSecond > 59)) return false; return true; } Glib.DateTimeUtils.parseDate = function(sDate, sPattern) { arCharacters = [ 'd', // day 'm', // month 'y', // year, 2 digits 'Y', // year, 4 digits 'H', // hours 'i', // minutes 's' // seconds ]; // transform the characters array to a string sCharacters = arCharacters.join(""); // splits up the pattern by the date characters to get an array of the delimiters between the date characters arDelimiters = sPattern.split(new RegExp("[" + sCharacters + "]", "")); // transform the delimiters array to a string sDelimiters = Glib.Utils.quoteMeta((Glib.Utils.uniqueArray(arDelimiters)).join('')); // splits up the date by the delimiters to get an array of the declaration arDate = sDate.split(new RegExp("[" + sDelimiters + "]", "")); // splits up the pattern by the delimiters to get an array of the used characters arPattern = sPattern.split(new RegExp("[" + sDelimiters + "]", "")); // if the numbers of the two array are not the same, return false, because the cannot belong together if (arDate.length !== arPattern.length) { return false; } // creates a new array which has the keys from the $arrPattern array and the values from the $arrStr array arParsedDate = {}; var sParseLog = ""; for (var l = arDate.length, i = 0; i < l; i++) { if (isNaN(arDate[i])) return false; sParseLog += "["+arPattern[i] +"] = {" + arDate[i] +"} parsed: {"+parseInt(arDate[i],10) +"}
"; arParsedDate[arPattern[i]] = parseInt(arDate[i],10); } //Glib.Debug.showMessage(sParseLog); //Glib.Debug.showMessage("Day: "+ arParsedDate['d']); // gernerates a 4 digit year declaration of a 2 digit one by using the current year if ((typeof(arParsedDate['y']) != "undefined") && (typeof(arParsedDate['Y']) == "undefined")) { arParsedDate['Y'] = (arParsedDate['y'] < 38) ? 2000 + arParsedDate['y'] : 1900 + arParsedDate['y']; } //Glib.Debug.showMessage("Day: "+ arParsedDate['d']); if (typeof(arParsedDate['Y']) == "undefined") arParsedDate['Y'] = (new Date()).getFullYear(); if (typeof(arParsedDate['m']) == "undefined") arParsedDate['m'] = (new Date()).getMonth() + 1; if (typeof(arParsedDate['d']) == "undefined") arParsedDate['d'] = (new Date()).getDate(); if (typeof(arParsedDate['H']) == "undefined") arParsedDate['H'] = 0; if (typeof(arParsedDate['i']) == "undefined") arParsedDate['i'] = 0; if (typeof(arParsedDate['s']) == "undefined") arParsedDate['s'] = 0; //Glib.Debug.showMessage("Day: "+ arParsedDate['d']); if (!Glib.DateTimeUtils.checkDate(arParsedDate['d'], arParsedDate['m'], arParsedDate['Y'])) { return false; } else { //alert ("checkDate is ok " + arParsedDate['d'] + "." + arParsedDate['m'] + "." + arParsedDate['Y']); } //Glib.Debug.showMessage("Day: "+ arParsedDate['d']); if(!Glib.DateTimeUtils.checkTime(arParsedDate['H'], arParsedDate['i'], arParsedDate['s'])) return false; //Glib.Debug.showMessage("Day: "+ arParsedDate['d']); obDate = new Date(); obDate.setDate(arParsedDate['d']); obDate.setMonth(arParsedDate['m'] - 1); obDate.setFullYear(arParsedDate['Y']); obDate.setHours(arParsedDate['H']); obDate.setMinutes(arParsedDate['i']); obDate.setSeconds(arParsedDate['s']); obDate.setMilliseconds(0); /*Glib.Debug.showMessage("Source: [" + sDate + "]" + "Intermediate : ["+ arParsedDate['d'] + "." + arParsedDate['m'] + "." + arParsedDate['Y'] + " " +arParsedDate['H'] + ":" + arParsedDate['i'] + ":" + arParsedDate['s']+"] Result: [" + obDate.getDate() + "." + (obDate.getMonth()+1) + "." + obDate.getFullYear() + " " +obDate.getHours() + ":" + obDate.getMinutes() + ":" + obDate.getSeconds()+"]");*/ return obDate; } Glib.DateTimeUtils.formatDate = function(obDate, sPattern) { sResult = ""; for (var l = sPattern.length, i = 0; i < l; i++) { switch (sPattern.charAt(i)) { case 'd': sResult += Glib.Utils.addLeadZero(obDate.getDate()); break; case 'm': sResult += Glib.Utils.addLeadZero(obDate.getMonth() + 1); break; case 'y': sResult += String(obDate.getFullYear()).substr(2, 2); break; case 'Y': sResult += obDate.getFullYear(); break; case 'H': sResult += Glib.Utils.addLeadZero(obDate.getHours()); break; case 'i': sResult += Glib.Utils.addLeadZero(obDate.getMinutes()); break; case 's': sResult += Glib.Utils.addLeadZero(obDate.getSeconds()); break; default: sResult += sPattern.charAt(i); } } return sResult; } Glib.Event = {}; Glib.bStopFlag = false; Glib.Event.stop = function(event) { Glib.bStopFlag = true; // if (event.preventDefault) { // event.preventDefault(); // event.stopPropagation(); // } else { // event.returnValue = false; // event.cancelBubble = true; // } } Glib.Event.stopEvent = function(event) { // if (event.preventDefault) { // event.preventDefault(); // event.stopPropagation(); // } else { // event.returnValue = false; // event.cancelBubble = true; // } try { event.preventDefault(); event.stopPropagation(); } catch (ex) { try { event.returnValue = false; event.cancelBubble = true; } catch (ex) { } } } /** * */ TableControl2 = function() {} TableControl2.prototype.nSystemColumns = 3; TableControl2.prototype.elTable = null; TableControl2.prototype.elTBody = null; TableControl2.prototype.sModel = ""; TableControl2.prototype.sPeriod = ""; TableControl2.prototype.nLoaderID = ""; TableControl2.prototype.initFromTable = function(elTable) { this.elTable = elTable; this.elTable.obTableControl = this; this.elTBody = elTable.getElementsByTagName("tbody")[0]; this.sModel = this.elTable.tHead.id; this.sPeriod = this.elTable.tHead.getAttribute('rel'); this.nLoaderID = this.elTable.getAttribute('rel'); var nRows = this.getNumRows(); for(y = 0; y < nRows; y++) { this.getRow(y).obTableControl = this; this.getRow(y).nY = y; this.getRow(y).onclick = function() {this.obTableControl.switchRow(this.nY);} } } TableControl2.prototype.getNumRows = function (){ return this.elTBody.rows.length; } TableControl2.prototype.getRow = function(y) { return this.elTBody.rows[y]; } TableControl2.prototype.switchRow = function(y) { this.setRowSelected(y, !this.isRowSelected(y)); this.refreshRowsCounter(); } TableControl2.prototype.isRowSelected = function(y) { //return this.getRow(y).className == "selected"; return Glib.Dom.hasClassName(this.getRow(y), "selected"); } TableControl2.prototype.setRowSelected = function(y, bSelect) { var elRow = this.getRow(y); var bSwitched = this.isRowSelected(y) != bSelect; if(bSwitched) { if(bSelect) { Glib.Dom.addClassName(elRow, "selected"); this.updateRowsCounter(1); } else { Glib.Dom.removeClassName(elRow, "selected"); this.updateRowsCounter(-1); } } } TableControl2.prototype.switchAllSelection = function(elButton) { if (typeof elButton.bSwitched == 'undefined') { elButton.bSwitched = false; } elButton.bSwitched = !elButton.bSwitched; var nNumRows = this.getNumRows(); for(y = 0; y < nNumRows; y++) { if (this.isRowSelected(y) != elButton.bSwitched) { this.setRowSelected(y, elButton.bSwitched); } } elButton.innerHTML = elButton.bSwitched ? 'Отменить выбор' : 'Выбрать все'; this.refreshRowsCounter(); } TableControl2.prototype.nSelectedRowsCounter = 0; TableControl2.prototype.updateRowsCounter = function(nRows) { this.nSelectedRowsCounter += nRows; } TableControl2.prototype.getSelectedRowsCount = function() { return this.nSelectedRowsCounter; } TableControl2.prototype.refreshRowsCounter = function() { $("selectedrowscounter").innerHTML = this.nSelectedRowsCounter; } TableControl2.prototype.requireOneOrMoreRowsSelected = function() { if (this.getSelectedRowsCount() <= 0) { alert("Не выбрано ни одной строки"); return false; } return true; } TableControl2.prototype.onRepeatProcessingButton = function(elButton) { if(!this.requireOneOrMoreRowsSelected()) return false; var arIDs = new Array(); var arRowsIDsList = new Array(); var nNumRows = this.getNumRows(); for(y = 0; y < nNumRows; y++) { if (this.isRowSelected(y)) { elRow = this.getRow(y); arIDs.push(elRow.id); arRowsIDsList.push(elRow.id); this.setRowSelected(y, false); } } this.refreshRowsCounter(); var sOldText = elButton.innerHTML; elButton.innerHTML = "Выполняется..."; elButton.disabled = "disabled"; this.performAction(arIDs, {"tablecontrol":this, "button":elButton, "oldbuttontext":sOldText}, arRowsIDsList); } TableControl2.prototype.onDoActionButton = function(elButton) { if (!this.requireOneOrMoreRowsSelected()) return false; var arIDs = new Array(); var arRowsIDsList = new Array(); var nNumRows = this.getNumRows(); for(y = 0; y < nNumRows; y++) { if (this.isRowSelected(y)) { elRow = this.getRow(y); if (elRow.getAttribute('rel')) { arIDs.push(elRow.getAttribute('rel')); arRowsIDsList.push(elRow.id); } this.setRowSelected(y, false); } } this.refreshRowsCounter(); var sOldText = elButton.innerHTML; elButton.innerHTML = "Выполняется..."; elButton.disabled = "disabled"; this.performAction(arIDs, {"tablecontrol":this, "button":elButton, "oldbuttontext":sOldText}, arRowsIDsList); } TableControl2.prototype.onSetHidButton = function(elButton) { if (!this.requireOneOrMoreRowsSelected()) return false; var arIDs = new Array(); var arRowsIDsList = new Array(); var nNumRows = this.getNumRows(); if ($("new_hid") && $("new_hid").value && !isNaN($("new_hid").value) && ($("new_hid").value >= 0)) { var sAdditionalParams = "&new_hid=" + parseInt($("new_hid").value); for(y = 0; y < nNumRows; y++) { if (this.isRowSelected(y)) { elRow = this.getRow(y); arIDs.push("shid"+elRow.id.substr(2)); arRowsIDsList.push(elRow.id); this.setRowSelected(y, false); } } this.refreshRowsCounter(); var sOldText = elButton.innerHTML; elButton.innerHTML = "Выполняется..."; elButton.disabled = "disabled"; this.performAction(arIDs, {"tablecontrol":this, "button":elButton, "oldbuttontext":sOldText}, arRowsIDsList, sAdditionalParams); } else { alert("Некорректный house_id"); return false; } } TableControl2.prototype.performAction = function(arIDList, arParams, arRowsIDsList, sAdditionalParams) { var sIDsList = arIDList.join("+"); var sRowIDsList = arRowsIDsList.join("+"); Glib.Net.doQuery({ sMethod : "POST", bAsync : true, sUrl : "/nks/action.htms", sRequestBody : "sModel=" + this.sModel + "&sPeriod=" + this.sPeriod + "&nLoaderID=" + this.nLoaderID + "&sIDsList=" + Glib.Net.escapeString(sIDsList) + "&sRowsIDsList=" + Glib.Net.escapeString(sRowIDsList) + ((typeof sAdditionalParams != 'undefined') ? sAdditionalParams : ""), fHandler : this.responseAction, arHandlerParams : arParams }); showMessage("Идёт обработка запроса...", "operatorconsole"); } TableControl2.prototype.arColsBuffer = null; TableControl2.prototype.getRowColByHeadCode = function(elRow, sHeadCode) { if (!this.arColsBuffer) { this.arColsBuffer = new Array(); var nCols = this.elTable.tHead.rows[0].cells.length; for (var i = 0; i < nCols; i++) { this.arColsBuffer[this.elTable.tHead.rows[0].cells[i].getAttribute("rel")] = i; } } if (typeof this.arColsBuffer[sHeadCode] != 'undefined') { return elRow.cells[this.arColsBuffer[sHeadCode]]; } } TableControl2.prototype.responseAction = function(arResponse, arParams, bStatus) { arParams["button"].disabled = ""; arParams["button"].innerHTML = arParams["oldbuttontext"]; if(!bStatus) { showMessage("Во время обработки запроса произошла ошибка.", "operatorconsole"); } else { var s = "Response: \n"; s += arResponse["status"] + " : " + arResponse["parsedIDs"]; //showMessage(arResponse["status"], "operatorconsole"); showMessage(s); if ("debug" in arResponse) { s = "Debug info: " + arResponse["debug"]; showMessage(s); } if (typeof arResponse["arNewData"] != 'undefined') { for (var sRowID in arResponse["arNewData"]) { var elRow = $(sRowID); elRow.setAttribute("rel", "ls_" + arResponse["arNewData"][sRowID]["ls_id"] + "_" + arResponse["arNewData"][sRowID]["id"]); var elLSName = arParams["tablecontrol"].getRowColByHeadCode(elRow, "ls_name"); if (elLSName) { elLSName.innerHTML = arResponse["arNewData"][sRowID]["ls_name"]; } var elASName = arParams["tablecontrol"].getRowColByHeadCode(elRow, "as_name"); if (elASName) { elASName.innerHTML = arResponse["arNewData"][sRowID]["as_name"]; } var elRemark = arParams["tablecontrol"].getRowColByHeadCode(elRow, "remark"); if (elRemark) { elRemark.innerHTML = arResponse["arNewData"][sRowID]["remark"]; } var elHouseID = arParams["tablecontrol"].getRowColByHeadCode(elRow, "house_id"); if (elHouseID) { elHouseID.innerHTML = arResponse["arNewData"][sRowID]["house_id"]; } } } showMessage(arResponse["status"] + " Данные обновлены.", "operatorconsole"); } } /** * Функции для поддержки интерфейса начислений */ TableControl2.prototype.getSelectedRowsIDsList = function() { if (!this.requireOneOrMoreRowsSelected()) return false; var arRowsIDsList = new Array(); var nNumRows = this.getNumRows(); for(y = 0; y < nNumRows; y++) { if (this.isRowSelected(y)) { arRowsIDsList.push(this.getRow(y).id); this.setRowSelected(y, false); } } this.refreshRowsCounter(); return arRowsIDsList; } TableControl2.prototype.onRefreshAbonsDataButton = function(elButton) { var sAction = "do_find_abons_check_sum"; var sAdditionalParams = ""; var elForm = elButton.form; for (var i = 0; i < elForm.length; i++) { if (elForm.elements[i].name == "action_period") { sAdditionalParams += "&action_period=" + elForm.elements[i].value; } } return this.performActionCheckSums(sAction, elButton, sAdditionalParams); } TableControl2.prototype.onPayCheckSumButton = function(elButton) { var sAction = "do_pay_check_sum"; var sAdditionalParams = ""; var elForm = elButton.form; for (var i = 0; i < elForm.length; i++) { if (elForm.elements[i].name == "action_period") { sAdditionalParams += "&action_period=" + elForm.elements[i].value; } } return this.performActionCheckSums(sAction, elButton, sAdditionalParams); } TableControl2.prototype.performActionCheckSums = function(sAction, elButton, sAdditionalParams) { var arIDs = this.getSelectedRowsIDsList(); if (!arIDs) return false; var sOldText = elButton.innerHTML; elButton.innerHTML = "Выполняется..."; elButton.disabled = "disabled"; arParams = {"tablecontrol":this, "button":elButton, "oldbuttontext":sOldText}; var sIDsList = arIDs.join("+"); Glib.Net.doQuery({ sMethod : "POST", bAsync : true, sUrl : "/nks/moncharge.htms", sRequestBody : "model=" + this.sModel + "&do_async_action=true" + "&proc_id=" + sAction + "&sIDsList=" + Glib.Net.escapeString(sIDsList) + ((typeof sAdditionalParams != 'undefined') ? sAdditionalParams : ""), fHandler : this.responseActionCheckSums, arHandlerParams : arParams }); showMessage("Идёт обработка запроса...", "operatorconsole"); return true; } TableControl2.prototype.responseActionCheckSums = function(arResponse, arParams, bStatus) { arParams["button"].disabled = ""; arParams["button"].innerHTML = arParams["oldbuttontext"]; if(!bStatus) { showMessage("Во время обработки запроса произошла ошибка.", "operatorconsole"); } else { var s = ""; s += arResponse["result"]; showMessage(s, "operatorconsole"); if ("debug" in arResponse) { s = "Debug info: " + arResponse["debug"]; showMessage(s); } if ("errors" in arResponse) { s = "" + arResponse["errors"].join("
"); showMessage(s, "operatorconsole"); } if ("arNewData" in arResponse) { for (var sRowID in arResponse["arNewData"]) { var elRow = $(sRowID); for (var sFieldID in arResponse["arNewData"][sRowID]) { var elColumn = arParams["tablecontrol"].getRowColByHeadCode(elRow, sFieldID); if (elColumn) { elColumn.innerHTML = arResponse["arNewData"][sRowID][sFieldID]; } } /*elRow.setAttribute("rel", "ls_" + arResponse["arNewData"][sRowID]["ls_id"] + "_" + arResponse["arNewData"][sRowID]["id"]); var elLSName = arParams["tablecontrol"].getRowColByHeadCode(elRow, "ls_name"); if (elLSName) { elLSName.innerHTML = arResponse["arNewData"][sRowID]["ls_name"]; } var elASName = arParams["tablecontrol"].getRowColByHeadCode(elRow, "as_name"); if (elASName) { elASName.innerHTML = arResponse["arNewData"][sRowID]["as_name"]; } var elRemark = arParams["tablecontrol"].getRowColByHeadCode(elRow, "remark"); if (elRemark) { elRemark.innerHTML = arResponse["arNewData"][sRowID]["remark"]; } var elHouseID = arParams["tablecontrol"].getRowColByHeadCode(elRow, "house_id"); if (elHouseID) { elHouseID.innerHTML = arResponse["arNewData"][sRowID]["house_id"]; }*/ } } } } /** * Класс, реализующий поддержку элемента TableControl */ TableControl = function() {} TableControl.prototype.nSystemColumns = 3; TableControl.prototype.arStatuses = new Array(); TableControl.prototype.sModel = ""; TableControl.prototype.sPeriod = ""; TableControl.prototype.nLoaderID = ""; /** * Инициализирует элемент управления из существующего элемента таблицы * @param {Object} elTable */ TableControl.prototype.initFromTable = function(elTable) { this.elTable = elTable; this.elTable.obTableControl = this; this.elTBody = elTable.getElementsByTagName("tbody")[0]; this.sModel = this.elTable.tHead.id; this.sPeriod = this.elTable.tHead.getAttribute('rel'); this.nLoaderID = this.elTable.tFoot.getAttribute('rel'); var nCols = this.getNumCols(); var nRows = this.getNumRows(); for(y = 0; y < nRows; y++) { for(x = 0; x < nCols; x++) { if (x > (this.nSystemColumns - 1)) { this.getCell(x, y).obTableControl = this; this.getCell(x, y).nX = x; this.getCell(x, y).nY = y; this.getCell(x, y).onclick = function() {this.obTableControl.switchCell(this.nX, this.nY);} } else { this.getCell(x, y).obTableControl = this; this.getCell(x, y).nY = y; this.getCell(x, y).onclick = function() {if(!Glib.bStopFlag){this.obTableControl.switchRow(this.nY);}else{Glib.bStopFlag = false;}} } } } for(x = 0; x < nCols; x++) { this.arAreaLockCounters[x] = 0; if (x > (this.nSystemColumns - 1)) { this.getHeadCell(x).obTableControl = this; this.getHeadCell(x).nX = x; this.getHeadCell(x).onclick = function() {if(!Glib.bStopFlag){this.obTableControl.switchCol(this.nX);}else{Glib.bStopFlag = false;}} // формируем массив идентификаторов статусов для обрабатываемой таблицы this.arStatuses.push(this.getHeadCell(x).id); this.getFootCell(x).innerHTML = "0" + this.getFootCell(x).innerHTML + "Загрузка"; this.getFootCell(x).getElementsByTagName("button")[0].obTableControl = this; this.getFootCell(x).getElementsByTagName("button")[0].nX = x; this.getFootCell(x).getElementsByTagName("button")[0].onclick = function() {this.obTableControl.onActionButton(this.nX);} if ((this.getHeadCell(x).id == "ls_2") || (this.getHeadCell(x).id == "ls_3") || (this.getHeadCell(x).id == "cls_0") || (this.getHeadCell(x).id == "cls_2")) { } else { this.getFootCell(x).getElementsByTagName("button")[0].style.visibility = "hidden"; } this.setCounterValue(x, 0); } else { if(x == 0) { this.getFootCell(x).innerHTML = "0Загрузка"; this.getFootCell(x).getElementsByTagName("button")[0].obTableControl = this; this.getFootCell(x).getElementsByTagName("button")[0].onclick = function() {this.obTableControl.onAllActionButton();} this.setCounterValue(x, 0); } } } } TableControl.prototype.hideEmptyColsAndRows = function(bHide) { var nCols = this.getNumCols(); var nRows = this.getNumRows(); for (x = 0; x < nCols; x++) { if (x > (this.nSystemColumns - 1)) { if (bHide) { var bEmpty = true; for (y = 0; y < nRows; y++) { if (parseInt(this.getCell(x, y).innerHTML) > 0) { bEmpty = false; break; } } if (bEmpty) { Glib.Dom.addClassName(this.getHeadCell(x, y), "hidden"); Glib.Dom.addClassName(this.getFootCell(x, y), "hidden"); for (y = 0; y < nRows; y++) { Glib.Dom.addClassName(this.getCell(x, y), "hidden"); } } else { Glib.Dom.removeClassName(this.getHeadCell(x, y), "hidden"); Glib.Dom.removeClassName(this.getFootCell(x, y), "hidden"); for (y = 0; y < nRows; y++) { Glib.Dom.removeClassName(this.getCell(x, y), "hidden"); } } } else { Glib.Dom.removeClassName(this.getHeadCell(x, y), "hidden"); Glib.Dom.removeClassName(this.getFootCell(x, y), "hidden"); for (y = 0; y < nRows; y++) { Glib.Dom.removeClassName(this.getCell(x, y), "hidden"); } } } } for (y = 0; y < nRows; y++) { if (bHide) { var bEmpty = true; for (x = 0; x < nCols; x++) { if (x > (this.nSystemColumns - 1)) { if (parseInt(this.getCell(x, y).innerHTML) > 0) { bEmpty = false; break; } } } if (bEmpty) { Glib.Dom.addClassName(this.getRow(y), "hidden"); } else { Glib.Dom.removeClassName(this.getRow(y), "hidden"); } } else { Glib.Dom.removeClassName(this.getRow(y), "hidden"); } } } TableControl.prototype.getCounterValue = function(nX) { return this.getFootCell(nX).getElementsByTagName("span")[0].innerCounter; } TableControl.prototype.setCounterValue = function(nX, nValue) { this.getFootCell(nX).getElementsByTagName("span")[0].innerCounter = nValue; } TableControl.prototype.deltaCounterValue = function(nX, nValue) { this.getFootCell(nX).getElementsByTagName("span")[0].innerCounter += nValue; if(nX != 0) { this.deltaCounterValue(0, nValue); //this.updateCounterValue(0); } } TableControl.prototype.updateCounterValue = function(nX) { var elCounter = this.getFootCell(nX).getElementsByTagName("span")[0]; elCounter.innerHTML = elCounter.innerCounter; if(nX != 0) { this.updateCounterValue(0); } } TableControl.prototype.getNumRows = function (){ return this.elTBody.rows.length; } TableControl.prototype.getNumCols = function (){ return this.elTBody.rows[0].cells.length; } TableControl.prototype.getCell = function(x, y) { return this.elTBody.rows[y].cells[x]; } TableControl.prototype.getRow = function(y) { return this.elTBody.rows[y]; } TableControl.prototype.getHeadCell = function(x) { return this.elTable.tHead.rows[0].cells[x]; } TableControl.prototype.getFootCell = function(x) { return this.elTable.tFoot.rows[0].cells[x]; } TableControl.prototype.isCellSelected = function(x, y) { if (this.getCell(x,y).className == "locked") { return false; } else { return this.getCell(x,y).className == "selected"; } //return Glib.Dom.hasClassName(this.getCell(x,y), "selected"); } TableControl.prototype.setCellSelected = function(x, y, bSelect) { if (x > (this.nSystemColumns - 1)) { var elCell = this.getCell(x, y); var nValue = parseInt(elCell.innerHTML); switch(bSelect) { case "unlock": Glib.Dom.setClassName(elCell, ""); break case "lock": this.deltaCounterValue(x, -nValue); Glib.Dom.setClassName(elCell, "locked"); break case true: case false: if(this.getCell(x,y).className == "locked") { } else { var bSwitched = this.isCellSelected(x, y) != bSelect; if(bSwitched) { if(bSelect) { this.deltaCounterValue(x, nValue); Glib.Dom.setClassName(elCell, "selected"); } else { this.deltaCounterValue(x, -nValue); Glib.Dom.setClassName(elCell, ""); } } } break default: } } } TableControl.prototype.switchCell = function(x, y) { this.setCellSelected(x, y, !this.isCellSelected(x, y)); this.updateCounterValue(x); } TableControl.prototype.switchRow = function(y) { if(typeof(this.getCell(0, y).bRowSelected) == "undefined") { this.getCell(0, y).bRowSelected = false; } this.getCell(0, y).bRowSelected = !this.getCell(0, y).bRowSelected; for(i = 0; i < this.getNumCols(); i++) { if (i > (this.nSystemColumns - 1)) { this.setCellSelected(i, y, this.getCell(0, y).bRowSelected); this.updateCounterValue(i); } } } TableControl.prototype.switchCol = function(x) { if(typeof(this.getHeadCell(x).bColSelected) == "undefined") { this.getHeadCell(x).bColSelected = false; } this.getHeadCell(x).bColSelected = !this.getHeadCell(x).bColSelected; for(j = 0; j < this.getNumRows(); j++) { this.setCellSelected(x, j, this.getHeadCell(x).bColSelected); } this.updateCounterValue(x); } TableControl.prototype.arAreaLockCounters = new Array(); TableControl.prototype.lockArea = function(x) { this.arAreaLockCounters[x]++; if(this.arAreaLockCounters[x] > 0) { this.getFootCell(x).getElementsByTagName("img")[0].style.display = "inline"; // this.getFootCell(x).getElementsByTagName("button")[0].disabled = true; } } TableControl.prototype.unlockArea = function(x) { this.arAreaLockCounters[x]--; if(this.arAreaLockCounters[x] <= 0) { // this.getFootCell(x).getElementsByTagName("button")[0].disabled = false; this.getFootCell(x).getElementsByTagName("img")[0].style.display = "none"; this.arAreaLockCounters[x] = 0; } } TableControl.prototype.onActionButton = function(nColToSelect) { this.lockArea(nColToSelect); var arIDs = new Array(); var nNumRows = this.getNumRows(); for(j = 0; j < nNumRows; j++) { elCell = this.getCell(nColToSelect, j); if(Glib.Dom.hasClassName(elCell, "selected")) { arIDs.push(elCell.id); this.setCellSelected(nColToSelect, j, false/*"lock"*/); } this.updateCounterValue(nColToSelect); } this.performAction(arIDs, {"area":nColToSelect, "tablecontrol":this}); } TableControl.prototype.onAllActionButton = function() { this.lockArea(0); var arIDs = new Array(); var nNumCols = this.getNumCols(); var nNumRows = this.getNumRows(); for(x = 0; x < nNumCols; x++) { if (x > (this.nSystemColumns - 1)) { for(j = 0; j < nNumRows; j++) { elCell = this.getCell(x, j); if(Glib.Dom.hasClassName(elCell, "selected")) { arIDs.push(elCell.id); this.setCellSelected(x, j, false/*"lock"*/); } } this.updateCounterValue(x); } } this.performAction(arIDs, {"area":0, "tablecontrol":this}); } TableControl.prototype.onRepeatProcessingButton = function() { this.lockArea(0); var arIDs = new Array(); var nNumCols = this.getNumCols(); var nNumRows = this.getNumRows(); for(y = 0; y < nNumRows; y++) { elRow = this.getRow(y); arIDs.push(elRow.id); for(x = 0; x < nNumCols; x++) { elCell = this.getCell(x, y); this.setCellSelected(x, y, false/*"lock"*/); } } this.performAction(arIDs, {"area":0, "tablecontrol":this}); } TableControl.prototype.performAction = function(arIDList, arParams) { var sIDsList = arIDList.join("+"); var sStatusesList = this.arStatuses.join("+"); Glib.Net.doQuery({ sMethod : "POST", bAsync : true, sUrl : "/nks/action.htms", sRequestBody : "sModel=" + this.sModel + "&sPeriod=" + this.sPeriod + "&nLoaderID=" + this.nLoaderID + "&sIDsList=" + Glib.Net.escapeString(sIDsList) + "&sStatusesList=" + Glib.Net.escapeString(sStatusesList), fHandler : this.responseAction, arHandlerParams : arParams }); showMessage("Идёт обработка запроса...", "operatorconsole"); } TableControl.prototype.updateTableData = function(arNewData, arStatusesList) { for(var nID in arNewData) { var n = arNewData[nID].length; for (var i = 0; i < n; i++) { var sStatus = arStatusesList[i]; if (el = $(sStatus + "_" + nID)) { el.innerHTML = arNewData[nID][i]; //el.className += "updated"; } else { showMessage("Warning: cannot find element with id " + sStatus + "_" + nID + ". Cannot assign it value " + arNewData[nID][i]); } } } } TableControl.prototype.responseAction = function(arResponse, arParams, bStatus) { //showMessage("try unlock area " + arParams["area"]); arParams["tablecontrol"].unlockArea(arParams["area"]); if(!bStatus) { showMessage("Во время обработки запроса произошла ошибка.", "operatorconsole"); } else { var s = "Response: \n"; s += arResponse["status"] + " : " + arResponse["parsedIDs"]; //showMessage(arResponse["status"], "operatorconsole"); showMessage(s); if ("debug" in arResponse) { s = "Debug info: " + arResponse["debug"]; showMessage(s); } if (arResponse["arNewData"] && arResponse["arStatusesList"]) { arParams["tablecontrol"].updateTableData(arResponse["arNewData"], arResponse["arStatusesList"]); } showMessage(arResponse["status"] + " Данные обновлены.", "operatorconsole"); } } //function Observer() {} //Observer.prototype.addEventListener = function(sObjectsEvent, fListener, arListenerParams) { // //} //function addEventListener(event, fListener) { // //} Glib.Net = {}; Glib.Net.bIsFree = true; Glib.Net.arRequestsQueue = new Array(); Glib.Net.nIntervalID = -1; Glib.Net.xmlReq = null; Glib.Net.nQueueProcessingInterval = 5; Glib.Net.processQueue = function() { if (this.bIsFree) { if (arQueryParams = this.arRequestsQueue.shift()) { this.doQuery(arQueryParams); } } } Glib.Net.doQuery = function(arQueryParams) { if (this.bIsFree) { this.bIsFree = false; this.makeXMLReq(arQueryParams); if (this.arRequestsQueue.length == 0) { clearInterval(this.intervalID); this.intervalID = -1; } } else { this.arRequestsQueue.push(arQueryParams); if (this.intervalID == -1) { this.intervalID = setInterval('Glib.Net.processQueue()', this.nQueueProcessingInterval); } } } Glib.Net.makeXMLReq = function(arQueryParams) { this.xmlReq = null; if (window.XMLHttpRequest) { try { this.xmlReq = new XMLHttpRequest(); } catch(e) {} } else if (window.ActiveXObject) { try { this.xmlReq = new ActiveXObject("Microsoft.XMLHTTP"); } catch(e) {} if (!this.xmlReq) { try { this.xmlReq = new ActiveXObject("Msxml2.XMLHTTP"); } catch (e) {} } } if (this.xmlReq) { this.xmlReq.onreadystatechange = function () {Glib.Net.requestHandler(arQueryParams.fHandler, arQueryParams.arHandlerParams);} this.xmlReq.open(arQueryParams.sMethod, arQueryParams.sUrl, arQueryParams.bAsync); this.xmlReq.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded;'); this.xmlReq.setRequestHeader('Charset', Glib.Settings.getWebEncoding()); //this.xmlReq.setRequestHeader('Accept-Language', 'ru, en'); this.xmlReq.setRequestHeader('Accept-Charset', Glib.Settings.getWebEncoding()); this.xmlReq.send(arQueryParams.sRequestBody); } } Glib.Net.escapeString = function(sString) { return encodeURIComponent(sString).replace(new RegExp('\\+','g'), '%2B'); } Glib.Net.parseJSON = function(sString) { try { if (/^("(\\.|[^"\\\n\r])*?"|[,:{}\[\]0-9.\-+Eaeflnr-u \n\r\t])+?$/.test(sString)) { var j = eval('(' + sString + ')'); return j; } } catch (e) { } throw new SyntaxError("parseJSON"); } Glib.Net.requestHandler = function(fHandler, arHandlerParams) { if (this.xmlReq) { if (this.xmlReq.readyState == 4) { if (this.xmlReq.status == 200) { var arResponse = null; var bParseError = false; try { //showMessage("Incoming ajax message message:
\n"+this.xmlReq.responseText); arResponse = this.parseJSON(this.xmlReq.responseText); } catch(e) { bParseError = true; showMessage("Error parsing JSON Response - exeption " + e.name + "(" + e.message + ")" + "
\nOriginal message:
\n"+this.xmlReq.responseText); } finally { this.bIsFree = true; fHandler(arResponse, arHandlerParams, bStatus = !bParseError); } //if(!bParseError) { //} } } } } var bExtPopupInited = false; var obWndDiv = false; var bExtPopupActive = false; function HideExtPopup() { bExtPopupActive = false; obWndDiv.style.visibility = "hidden"; } function InitExtPopup() { bExtPopupInited = true; obWndDiv = document.createElement("div"); obWndDiv.setAttribute("id", "wnddiv"); document.body.appendChild(obWndDiv); obWndDiv.style.visibility = "hidden"; obWndDiv.innerHTML = "
Закрыть
"; obWndDiv.style.display = "none"; obWndDiv.lastChild.onclick = function(){HideExtPopup()}; } function ShowExtPopup(nLeft, nTop, nWidth, nHeight, sContent) { if(!bExtPopupInited){InitExtPopup();} if(bExtPopupActive){HideExtPopup();} bExtPopupActive = true; obWndDiv.style.visibility = "hidden"; obWndDiv.style.left = nLeft + "px"; obWndDiv.style.top = nTop + "px"; if (String(nWidth).indexOf("%") >= 0) { obWndDiv.firstChild.style.width = parseInt(nWidth) + "%"; } else { obWndDiv.firstChild.style.width = parseInt(nWidth) + "px"; } if (String(nHeight).indexOf("%") >= 0) { obWndDiv.firstChild.style.height = parseInt(nHeight) + "%"; } else { obWndDiv.firstChild.style.height = parseInt(nHeight) + "px"; } //obWndDiv.style.width = "50%"; //obWndDiv.style.height = "auto"; obWndDiv.firstChild.innerHTML = sContent; obWndDiv.style.visibility = "visible"; obWndDiv.style.display = "block"; } Glib.Dom.getClientSize = function() { var nWidth = 0, nHeight = 0, arResult = {}; if (typeof(window.innerWidth) == 'number' ) { //Non-IE nWidth = window.innerWidth; nHeight = window.innerHeight; } else if (document.documentElement && (document.documentElement.clientWidth || document.documentElement.clientHeight)) { //IE 6+ in 'standards compliant mode' nWidth = document.documentElement.clientWidth; nHeight = document.documentElement.clientHeight; } else if (document.body && (document.body.clientWidth || document.body.clientHeight)) { //IE 4 compatible nWidth = document.body.clientWidth; nHeight = document.body.clientHeight; } arResult.nWidth = nWidth; arResult.nHeight = nHeight; return arResult; } Glib.Dom.getScreenOffset = function() { var nScrOffX = 0, nScrOffY = 0, arResult = {}; if (typeof(window.pageYOffset) == 'number') { //Netscape compliant nScrOffY = window.pageYOffset; nScrOffX = window.pageXOffset; } else if(document.body && (document.body.scrollLeft || document.body.scrollTop)) { //DOM compliant nScrOffY = document.body.scrollTop; nScrOffX = document.body.scrollLeft; } else if(document.documentElement && (document.documentElement.scrollLeft || document.documentElement.scrollTop)) { //IE6 standards compliant mode nScrOffY = document.documentElement.scrollTop; nScrOffX = document.documentElement.scrollLeft; } arResult.nScrOffX = nScrOffX; arResult.nScrOffY = nScrOffY; return arResult; } // // getPageSize() // Returns array with page width, height and window width, height // Glib.Dom.getPageSize = function(){ var xScroll, yScroll; if (window.innerHeight && window.scrollMaxY) { xScroll = document.body.scrollWidth; yScroll = window.innerHeight + window.scrollMaxY; } else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac xScroll = document.body.scrollWidth; yScroll = document.body.scrollHeight; } else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari xScroll = document.body.offsetWidth; yScroll = document.body.offsetHeight; } var windowWidth, windowHeight; if (self.innerHeight) { // all except Explorer windowWidth = self.innerWidth; windowHeight = self.innerHeight; } else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode windowWidth = document.documentElement.clientWidth; windowHeight = document.documentElement.clientHeight; } else if (document.body) { // other Explorers windowWidth = document.body.clientWidth; windowHeight = document.body.clientHeight; } // for small pages with total height less then height of the viewport if(yScroll < windowHeight){ pageHeight = windowHeight; } else { pageHeight = yScroll; } // for small pages with total width less then width of the viewport if(xScroll < windowWidth){ pageWidth = windowWidth; } else { pageWidth = xScroll; } arrayPageSize = new Array(pageWidth,pageHeight,windowWidth,windowHeight) return arrayPageSize; } // // getPageScroll() // Returns array with x,y page scroll values. // Core code from - quirksmode.org // function getPageScroll(){ var yScroll; if (self.pageYOffset) { yScroll = self.pageYOffset; } else if (document.documentElement && document.documentElement.scrollTop){ // Explorer 6 Strict yScroll = document.documentElement.scrollTop; } else if (document.body) {// all other Explorers yScroll = document.body.scrollTop; } arrayPageScroll = new Array('',yScroll) return arrayPageScroll; } Glib.Dom.showSelectBoxes = function() { selects = document.getElementsByTagName("select"); for (i = 0; i != selects.length; i++) { selects[i].style.visibility = "visible"; } } Glib.Dom.hideSelectBoxes = function() { selects = document.getElementsByTagName("select"); for (i = 0; i != selects.length; i++) { selects[i].style.visibility = "hidden"; } } function doShowPopup(sMessage, w, h) { var myWidth = 0, myHeight = 0; if( typeof( window.innerWidth ) == 'number' ) { //Non-IE myWidth = window.innerWidth; myHeight = window.innerHeight; } else if( document.documentElement && ( document.documentElement.clientWidth || document.documentElement.clientHeight ) ) { //IE 6+ in 'standards compliant mode' myWidth = document.documentElement.clientWidth; myHeight = document.documentElement.clientHeight; } else if( document.body && ( document.body.clientWidth || document.body.clientHeight ) ) { //IE 4 compatible myWidth = document.body.clientWidth; myHeight = document.body.clientHeight; } var scrOfX = 0, scrOfY = 0; if( typeof( window.pageYOffset ) == 'number' ) { //Netscape compliant scrOfY = window.pageYOffset; scrOfX = window.pageXOffset; } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) { //DOM compliant scrOfY = document.body.scrollTop; scrOfX = document.body.scrollLeft; } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) { //IE6 standards compliant mode scrOfY = document.documentElement.scrollTop; scrOfX = document.documentElement.scrollLeft; } var cw = myWidth; var ch = myHeight; var sx = scrOfX; var sy = scrOfY; var ix = 0; var iy = 0; if(w>(cw-50)){ix= sx + 10}else{ix=sx+(cw-w)/2;} if(h>(ch-50)){iy= sy + 10}else{iy=sy+(ch-h)/2;} sContent = sMessage; //alert("Popup at (x:"+ix+"px, y:"+iy+"px) scroll: (x"+sx+"px, y:"+sy+"px) wndwidth (x:"+cw+"px, y:"+ch+"px)"); ShowExtPopup(ix, iy, w, h, sContent); } //function doSetCheckboxesGroup(sName, bCheck) { // var arBoxesList = window.document.getElementsByName(sName); // for (var i = 0; i < arBoxesList.length; i++) { // arBoxesList[i].checked = bCheck ? "checked" : ""; // } //} function doSetCheckboxesGroup(elControl, sName) { bCheck = elControl.checked != ""; var arBoxesList = window.document.getElementsByName(sName); for (var i = 0; i < arBoxesList.length; i++) { arBoxesList[i].checked = bCheck ? "checked" : ""; } elControl.checked = bCheck ? "checked" : ""; elControl.title = bCheck ? "Отменить выбор" : "Выбрать все"; elControl.parentNode.getElementsByTagName("span")[0].innerHTML = bCheck ? "Отменить выбор" : "Выбрать все"; } InlineEditor = function() {}; InlineEditor.bEditingMode = false; InlineEditor.sClassName = "inline-editor"; InlineEditor.sActionUrl = "changeremark.htms"; InlineEditor.attachEditor = function(elSource) { Glib.Dom.addClassName(elSource, InlineEditor.sClassName); elSource.onclick = function(){InlineEditor.startEdit(this);} } InlineEditor.startEdit = function(elSource) { if((!InlineEditor.bEditingMode)&&(LoadsList.isRefreshLocked)) { LoadsList.lockRefresh(); InlineEditor.bEditingMode = true; var nWidth = Glib.Dom.getElementWidth(elSource.id) + 30; var nHeight = Glib.Dom.getElementHeight(elSource.id) + 6; if (nWidth < 100) { nWidth = 150; } var sValue = elSource.innerHTML.replace(">",">").replace("<","<").replace("&","&"); Glib.Dom.removeClassName(elSource, InlineEditor.sClassName); if (nHeight < 40) { elSource.innerHTML = ""; elSource.firstChild.value = sValue; } else { elSource.innerHTML = ""; //text = text.replace(/\&/g,"&"); //text = text.replace(/\/g,">"); //text = text.replace(/\[/g,"<"); //text = text.replace(/\]/g,">"); elSource.firstChild.innerHTML = sValue; } elSource.firstChild.focus(); } } InlineEditor.responseChangeAction = function(arResponse, arParams, bStatus) { var bError = false; arParams["elSource"].style.whiteSpace = "normal"; Glib.Dom.addClassName(arParams["elSource"], InlineEditor.sClassName); if(!bStatus) { bError = true; showMessage("При попытке изменения примечания возникла ошибка связи с сервером.", "operatorconsole"); } else { if (arResponse["debugtext"]) { showMessage("Debug info: " + arResponse["debugtext"]); } if (arResponse["berror"]) { showMessage("Во время изменения примечания произошла ошибка: " + arResponse["serror"], "operatorconsole"); doShowPopupEx("Во время изменения примечания произошла ошибка: " + arResponse["serror"]); bError = true; } else { bError = false; } } if (bError) { arParams["elSource"].innerHTML = "Ошибка изменения"; } else { arParams["elSource"].innerHTML = arResponse["sNewRemarkValue"]; } InlineEditor.bEditingMode = false; LoadsList.unlockRefresh(); } InlineEditor.doChangeAction = function(sID, sNewValue, elSource) { elSource.style.whiteSpace = "nowrap"; elSource.innerHTML += ""; var sRequest = "elementid=" + Glib.Net.escapeString(sID) + "&newvalue=" + Glib.Net.escapeString(sNewValue); Glib.Net.doQuery({ sMethod : "post", bAsync : true, sUrl : InlineEditor.sActionUrl, sRequestBody : sRequest, fHandler : InlineEditor.responseChangeAction, arHandlerParams : {"elSource" : elSource} }); } InlineEditor.onBlur = function(elInput, sSourceID) { var elSource = $(sSourceID); InlineEditor.doChangeAction(elSource.id, elInput.value, elSource); return false; } InlineEditor.onEnter = function(elInput, event, sSourceID) { event = (event) ? event : window.event; if (event.keyCode == 13) { var elSource = $(sSourceID); InlineEditor.doChangeAction(elSource.id, elInput.value, elSource); return false; } else { return true; } } /** * Smartselectcontrol */ SmartselectControl = function() {} /** * Адрес скрипта, через который получаем данные */ SmartselectControl.sActionUrl = '/new_dropdown/async_gateway.htms'; /** * Количиство вызовов unobtrusiveInit */ SmartselectControl.nInits = 0; SmartselectControl.prototype.numPages = 0; SmartselectControl.prototype.selectedPage = 0; SmartselectControl.prototype.numShowedPages = 2; SmartselectControl.prototype.initPagesBox = function() { this.elPagesBox = document.createElement('div'); this.elPagesBox.obControl = this; Glib.Dom.insertAfter(this.elPagesBox, this.elSelect); this.elPagesBox.style.fontSize = "11px"; this.elPagesBox.style.lineHeight = "1.4em"; } SmartselectControl.prototype.fillPagesBox = function(numPages, selectedPage) { this.numPages = parseInt(numPages); this.selectedPage = parseInt(selectedPage); var pagesBoxHTML = ""; if (numPages > 1) { var bDotsAdded = false; for (var i = 1; i <= this.numPages; i++) { if ((i <= this.numShowedPages) || (i > this.numPages - this.numShowedPages) || ((i >= this.selectedPage - this.numShowedPages) && (i <= this.selectedPage + this.numShowedPages))) { if (i == this.selectedPage) { pagesBoxHTML += " " + i; } else { pagesBoxHTML += " " + '' + i + ''; } bDotsAdded = false; } else { if (!bDotsAdded) { pagesBoxHTML += " ... "; bDotsAdded = true; } } } } this.elPagesBox.innerHTML = pagesBoxHTML; } SmartselectControl.prototype.changePage= function(selectedPage) { if (selectedPage < 1 || selectedPage > this.numPages) return false; this.selectedPage = selectedPage; this.fillPagesBox(this.numPages, this.selectedPage); this.runSearch(); } SmartselectControl.prototype.nextPage= function() { this.changePage(this.selectedPage + 1); } SmartselectControl.prototype.prevPage= function() { this.changePage(this.selectedPage - 1); } /** * Инициализирует контрол для всех select на странице с классом sClassname * @param string sClassname имя класса, для которого производить инициализацию */ SmartselectControl.unobtrusiveInit = function(sClassname) { SmartselectControl.nInits++; // Получаем все select на странице arSelects = document.getElementsByTagName('select'); // Проходим по всем селектам for (var i in arSelects) { // Текущий селект var elSelect = arSelects[i]; // Если имя класса селекта, совпадает с искомым именем класса, // и на селект ещё не повесили контрол - вешаем контрол на селект if (Glib.Dom.hasClassName(elSelect, sClassname) && (typeof elSelect.obControl == 'undefined')) { obControl = new SmartselectControl(); elSelect.obControl = obControl; obControl.elSelect = elSelect; obControl.elSelect.onchange = function(){this.obControl.onChange();} //onControl.onChange(); // Вешаем событие, получающее список опций elSelect.onmousedown = obControl.onGetOptionsAsync; elSelect.onkeydown = obControl.onGetOptionsAsync; // Рисуем окошко со страницами obControl.initPagesBox(); // Рисуем окошко поиска obControl.elSearchBox = document.createElement('div'); obControl.elSearchBox.innerHTML = ''; obControl.elSearchBoxTextbox = obControl.elSearchBox.firstChild; obControl.elSearchBoxButtonGo = obControl.elSearchBox.lastChild; //obControl.elSearchBox.firstChild.obSelf = obControl; //obControl.elSearchBox.firstChild.onclick = obControl.showSearchBox; obControl.elSearchBoxButtonGo.obControl = obControl; obControl.elSearchBoxButtonGo.onclick = obControl.doSearch; obControl.elSearchBox.style.display = 'none'; Glib.Dom.insertAfter(obControl.elSearchBox, elSelect); // Рисуем кнопку поиска obControl.elSearchButton = document.createElement('span'); obControl.elSearchButton.innerHTML = 'Поиск'; obControl.elSearchButton.firstChild.obControl = obControl; obControl.elSearchButton.firstChild.onclick = obControl.showSearchBox; Glib.Dom.insertAfter(obControl.elSearchButton, elSelect); // Создаём индикатор прогресса и помещаем его сразу после контрола elSelect.elProgressIndicator = document.createElement('span'); elSelect.elProgressIndicator.innerHTML = ''; elSelect.elProgressIndicator.style.display = 'none'; Glib.Dom.insertAfter(elSelect.elProgressIndicator, elSelect); // Сохраняем информацию о текущей опции // var nCurrentOptionIndex = elSelect.selectedIndex; // var elCurrentOption = elSelect.options[nCurrentOptionIndex]; // obControl.currentOption = new Object(); // obControl.currentOption.text = elCurrentOption.text; // obControl.currentOption.value = elCurrentOption.value; // obControl.currentOption.isError = elCurrentOption.className == 'error'; // obControl.currentOption.haveFocus = true; obControl.updateCurrentOption(); var elDummyField = document.createElement('span'); //elDummyField.style = 'border:1px solid black;padding:2px;'; elDummyField.style.width = '100px'; elDummyField.style.border = '1px solid black'; elDummyField.style.background = 'white'; elDummyField.style.padding = '2px'; elDummyField.innerHTML = obControl.currentOption.text; //elDummyField.disabled = true; Glib.Dom.insertAfter(elDummyField, elSelect); obControl.elDummyField = elDummyField; var elDummyButton = document.createElement('button'); elDummyButton.innerHTML = 'Получить все опции'; elDummyButton.obControl = obControl; obControl.elDummyButton = elDummyButton; elDummyButton.onclick = function (event) {Glib.Event.stopEvent(event);this.obControl.getOptionsAsync(); return false;}; Glib.Dom.insertAfter(elDummyButton, elDummyField); elSelect.style.display = 'none'; } } } SmartselectControl.prototype.updateCurrentOption = function() { var obControl = this; var elSelect = obControl.elSelect; var nCurrentOptionIndex = elSelect.selectedIndex; var elCurrentOption = elSelect.options[nCurrentOptionIndex]; obControl.currentOption = new Object(); obControl.currentOption.text = elCurrentOption.text; obControl.currentOption.value = elCurrentOption.value; obControl.currentOption.isError = elCurrentOption.className == 'error'; obControl.currentOption.haveFocus = true; } SmartselectControl.prototype.showSearchBox = function() { this.obControl.elSearchBox.style.display = (this.obControl.elSearchBox.style.display == 'none') ? 'block' : 'none'; } /** * Происходит ли сейчас получение данных */ SmartselectControl.prototype.bDataGetStarted = false; /** * Получены ли данные контрола (произведено ли заполнение контрола опциями */ SmartselectControl.prototype.bAllDataRecived = false; /** * Проверяет датастамп, получены ли данные, * и если данных нет и корректный датастамп - запускает асинхронный запрос. * Является обработчиком события onclick и onkeydown для селектбокса */ SmartselectControl.prototype.onGetOptionsAsync = function() { this.obControl.getOptionsAsync(); } SmartselectControl.prototype.getOptionsAsync = function() { var obControl = this; var elSelect = obControl.elSelect; if (!obControl.bAllDataRecived && (obControl.bDataGetStarted == false)) { obControl.bDataGetStarted = true; var sDatastamp = null; if (!(sDatastamp = elSelect.getAttribute('datastamp'))) { // @todo add normal error handling alert('No datastamp!'); return false; } obControl.doGetOptionsAsync(sDatastamp, elSelect, null); return false; } } SmartselectControl.prototype.getDatastamp = function() { var sDatastamp = null; if (!(sDatastamp = this.obControl.elSelect.getAttribute('datastamp'))) { // @todo add normal error handling alert('No datastamp!'); return null; } return sDatastamp; } SmartselectControl.prototype.onChange = function() { var obControl = this; obControl.updateCurrentOption(); var elSelect = obControl.elSelect; var selectedOption = elSelect.options[elSelect.selectedIndex]; var navAction = selectedOption.getAttribute('navAction'); if (navAction) { if (navAction == 'prev') { obControl.prevPage(); } else if (navAction == 'next') { obControl.nextPage(); } } } SmartselectControl.prototype.doSearch = function() { return this.obControl.runSearch(); } SmartselectControl.prototype.runSearch = function() { if (this.bDataGetStarted == false) { this.bDataGetStarted = true; var sDatastamp = null; if (!(sDatastamp = this.elSelect.getAttribute('datastamp'))) { // @todo add normal error handling alert('No datastamp!'); return false; } var searchQuery = this.elSearchBoxTextbox.value; this.doGetOptionsAsync(sDatastamp, this.elSelect, searchQuery); return false; } } /** * Делает асинхронный запрос, получающий опции селекта * @param string sDatastamp * @param {Element} elSelect */ SmartselectControl.prototype.doGetOptionsAsync = function(sDatastamp, elSelect, searchQuery, pageNumber) { elSelect.elProgressIndicator.style.display = 'inline'; var sAsyncComponent = 'smartselectcontrol'; var sRequest = 'component=' + sAsyncComponent + '&datastamp=' + sDatastamp; var arParams = {'elSelect' : elSelect}; arParams['search'] = false; if (searchQuery !== null) { sRequest += '&search=' + Glib.Net.escapeString(searchQuery); arParams['search'] = true; } sRequest += '&page=' + this.selectedPage; Glib.Net.doQuery({ sMethod : 'post', bAsync : true, sUrl : SmartselectControl.sActionUrl, sRequestBody : sRequest, fHandler : this.responseGetOptionsAsync, arHandlerParams : arParams }); } Glib.Dom.addSelectOptionQuick = function(elSelect, name, value) { var elOption = document.createElement("option"); elOption.value = value; elOption.text = name; try { elSelect.add(elOption, null); } catch (ex) { elSelect.add(elOption); } return elOption; } Glib.Dom.SelectUtils = { } SmartselectControl.prototype.switchSelectBox = function(oldSelect, newSelect) { Glib.Dom.insertAfter(newSelect, oldSelect); this.elSelect = newSelect; newSelect.obControl = this; newSelect.setAttribute('datastamp', oldSelect.getAttribute('datastamp')); newSelect.elProgressIndicator = oldSelect.elProgressIndicator; newSelect.onchange = oldSelect.onchange; newSelect.name = oldSelect.name; oldSelect.parentNode.removeChild(oldSelect); } SmartselectControl.prototype.createOption = function(elSelect, text, value) { var elOption = document.createElement("option"); elOption.value = value; elOption.innerHTML = text; elSelect.appendChild(elOption); return elOption; } function ord(mixed_var) { // Переменная, получает ASCII-значение первого символа строки var result = ""; // Получение скан-кода if(mixed_var.length != 0) { result = mixed_var.charCodeAt(0); } // Если пришёл пустой символ строки, тогда выдаём просто ошибку if(result == "") { result = "None"; } // Возвращаем результат return result; } SmartselectControl.prototype.responseGetOptionsAsync2 = function(arResponse, arParams, bStatus) { // Прячем индикатор прогресса var elSelect = arParams['elSelect']; var obControl = elSelect.obControl; elSelect.elProgressIndicator.style.display = 'none'; if (!bStatus) { // Делаем что-нибудь при ошибке alert('При попытке получения значений возникла ошибка связи с сервером.'); } else { // Количество опций в ответе var numOptions = arResponse['newdata'].length; var newSelect = document.createElement("select"); //var dataOptGroup = document.createElement("optgroup"); dataOptGroup = newSelect; //while (elSelect.length > 0) { // elSelect.remove(elSelect.length-1); //} if (obControl.currentOption.isError) { var errorOption = obControl.createOption(dataOptGroup, obControl.currentOption.text, obControl.currentOption.value); errorOption.className = "error"; } else if (obControl.currentOption.haveFocus) { var currentOptionInResponse = false; for (var ix = 0; ix < numOptions; ix++) { if (arResponse['newdata'][ix]["id"] == obControl.currentOption.value) { currentOptionInResponse = true; break; } } if (!currentOptionInResponse) { var currentOption = obControl.createOption(dataOptGroup, obControl.currentOption.text, obControl.currentOption.value); currentOption.style.fontWeight = "bold"; } //obControl.currentOption.haveFocus = false; } // Количество опций в ответе // // Если у текущей опции установлен класс error, то это означает, // что когда рисовался этот контрол, значение этого поле ссылалось на // несуществующую запись, и поэтому считаем, что текущего значения у контрола нет //var bValueExists = elCurrentOption.className != 'error'; //var bHaveErrorOption= elCurrentOption.className == 'error'; // Добавляем пустую опцию, если у нас нет текущей пустой опции в фокусе, // если такая опция есть - снимаем с неё фокус // При проверке опции на пустоту обрезаем пустые символы по бокам //alert("+" + Glib.Utils.trimString(obControl.currentOption.text) + "+"); //alert(ord(Glib.Utils.trimString(obControl.currentOption.text))); //alert(ord(' ')); //alert(Glib.Utils.trimString(obControl.currentOption.value) == ''); //alert(Glib.Utils.trimString(obControl.currentOption.text) == ''); //alert(Glib.Utils.trimString(obControl.currentOption.text) == String.fromCharCode(160)); //alert(obControl.currentOption.haveFocus == true); if (!((obControl.currentOption.haveFocus == true) && (Glib.Utils.trimString(obControl.currentOption.value) == '') && (Glib.Utils.trimString(obControl.currentOption.text) == '') || Glib.Utils.trimString(obControl.currentOption.text) == String.fromCharCode(160))) { var dummyOption = obControl.createOption(dataOptGroup, '', ''); } else { //---obControl.currentOption.haveFocus = false; } if (obControl.currentOption.haveFocus && !obControl.currentOption.isError) { //obControl.currentOption.haveFocus = false; } for (var ix = 0; ix < numOptions; ix++) { // Получаем данные очередной опции из ответа сервера arOption = arResponse['newdata'][ix]; // Если текущего значения у контрола нет (но при этом у нас всё равно // есть id ссылающееся на несуществующую запись), но в ответе вдруг появляется // запись с этим id, то мы пропускаем добавление этой записи. // Зачем так сделано - не очень понятно, думаю, это можно опустить //if (!bValueExists && (elCurrentOption.value == arOption["id"])) { // continue; //} //sNewData += ''; // Добавляем новую опцию к списку elOption = obControl.createOption(dataOptGroup, arOption["name"], arOption["id"]); elOption.style.whiteSpace = 'pre'; // Если у нас установлено текущее значение, // и мы добавляем новую опцию с этим же значением, // убираем текущую опцию и делаем выбранной добавленную //if (bValueExists && (elCurrentOption.value == arOption["id"])) { // //arParams['elSelect'].remove(nCurrentOptionIndex); // bValueExists = false; // elOption.selected = true; //} if (obControl.currentOption.value == arOption["id"]) { elOption.selected = true; } } //if (!bHaveErrorOption) { // elSelect.remove(nCurrentOptionIndex); //} //elSelect.style.whiteSpace = 'pre'; obControl.fillPagesBox(arResponse["numPages"], arResponse["page"]); var bShowPrevPageLink = obControl.selectedPage > 1; var bShowNextPageLink = obControl.selectedPage < obControl.numPages; if (bShowPrevPageLink || bShowNextPageLink) { //var navGroup = document.createElement("optgroup"); //navGroup.label = "Навигация"; //elSelect.appendChild(navGroup); if (bShowPrevPageLink) { var prevOption = obControl.createOption(dataOptGroup, 'Предыдущая страница', ''); prevOption.className = 'nav'; //prevOption.style.fontWeight = 'bold'; prevOption.obControl = obControl; prevOption.setAttribute('navAction', 'prev'); //prevOption.onclick = function() {this.obControl.prevPage()} } if (bShowNextPageLink) { var nextOption = obControl.createOption(dataOptGroup, 'Следующая страница', ''); nextOption.className = 'nav'; //nextOption.style.fontWeight = 'bold'; nextOption.obControl = obControl; nextOption.setAttribute('navAction', 'next'); //nextOption.onclick = function() {this.obControl.nextPage()} } } this.switchSelectBox(elSelect, newSelect); //for (var ix in elSelect.childNodes) { // elSelect.removeChild(elSelect.childNodes[0]); //} //elSelect.appendChild(dataOptGroup); //newSelect.click(); newSelect.focus(); //newSelect.size=5; if (!obControl.bAllDataRecived) { obControl.elDummyField.style.display = 'none'; obControl.elDummyButton.style.display = 'none'; } obControl.bAllDataRecived = true; } obControl.bDataGetStarted = false; } /** * Обрабатывает ответ асинхронного запроса на опции и добавляет опции в контрол * @param {Object} arResponse * @param {Object} arParams * @param {Object} bStatus */ SmartselectControl.prototype.responseGetOptionsAsync = function(arResponse, arParams, bStatus) { var elSelect = arParams['elSelect']; var obControl = elSelect.obControl; obControl.responseGetOptionsAsync2(arResponse, arParams, bStatus); return; // Прячем индикатор прогресса elSelect.elProgressIndicator.style.display = 'none'; if (!bStatus) { // Делаем что-нибудь при ошибке alert('При попытке получения значений возникла ошибка связи с сервером.'); } else { // Количество опций в ответе var numOptions = arResponse['newdata'].length; // Генерим список опций из данных ответа //var sNewData = ""; // Индекс текущей выбранной опции //var nCurrentOptionIndex = elSelect.selectedIndex; // Получаем элемент текущей опции по её индексу //var elCurrentOption = elSelect.options[nCurrentOptionIndex]; //var currentOptionValue = elCurrentOption.value; //var currentOptionText = elCurrentOption.text; //if (arParams["search"]) { while (elSelect.length > 0) { elSelect.remove(elSelect.length-1); } //var elOption = document.createElement("option"); //elOption.value = currentOptionValue; //elOption.text = currentOptionText; //elOption.style.whiteSpace = 'pre'; // В ие у add один параметр, так что в случае ошибки // пробуем вызвать add с одним параметром //try { // elSelect.add(elOption, null); //} catch (ex) { // elSelect.add(elOption); //} //} if (obControl.currentOption.isError) { var errorOption = Glib.Dom.addSelectOptionQuick(elSelect, obControl.currentOption.text, obControl.currentOption.value); errorOption.className = "error"; } else if (obControl.currentOption.haveFocus) { var currentOptionInResponse = false; for (var ix = 0; ix < numOptions; ix++) { if (arResponse['newdata'][ix]["id"] == obControl.currentOption.value) { currentOptionInResponse = true; break; } } if (!currentOptionInResponse) { var currentOption = Glib.Dom.addSelectOptionQuick(elSelect, obControl.currentOption.text, obControl.currentOption.value); currentOption.style.fontWeight = "bold"; } //obControl.currentOption.haveFocus = false; } // Количество опций в ответе // // Если у текущей опции установлен класс error, то это означает, // что когда рисовался этот контрол, значение этого поле ссылалось на // несуществующую запись, и поэтому считаем, что текущего значения у контрола нет //var bValueExists = elCurrentOption.className != 'error'; //var bHaveErrorOption= elCurrentOption.className == 'error'; // Добавляем пустую опцию, если у нас нет текущей пустой опции в фокусе, // если такая опция есть - снимаем с неё фокус // При проверке опции на пустоту обрезаем пустые символы по бокам //alert("+" + Glib.Utils.trimString(obControl.currentOption.text) + "+"); //alert(Glib.Utils.trimString(obControl.currentOption.value) == ''); //alert(Glib.Utils.trimString(obControl.currentOption.text) == ''); //alert(obControl.currentOption.haveFocus == true); if (!((obControl.currentOption.haveFocus == true) && (Glib.Utils.trimString(obControl.currentOption.value) == '') && (Glib.Utils.trimString(obControl.currentOption.text) == ''))) { var dummyOption = Glib.Dom.addSelectOptionQuick(elSelect, '', ''); } else { //obControl.currentOption.haveFocus = false; } if (obControl.currentOption.haveFocus && !obControl.currentOption.isError) { obControl.currentOption.haveFocus = false; } for (var ix = 0; ix < numOptions; ix++) { // Получаем данные очередной опции из ответа сервера arOption = arResponse['newdata'][ix]; // Если текущего значения у контрола нет (но при этом у нас всё равно // есть id ссылающееся на несуществующую запись), но в ответе вдруг появляется // запись с этим id, то мы пропускаем добавление этой записи. // Зачем так сделано - не очень понятно, думаю, это можно опустить //if (!bValueExists && (elCurrentOption.value == arOption["id"])) { // continue; //} //sNewData += ''; // Добавляем новую опцию к списку elOption = document.createElement("option"); elOption.value = arOption["id"]; elOption.text = arOption["name"]; elOption.style.whiteSpace = 'pre'; // В ие у add один параметр, так что в случае ошибки // пробуем вызвать add с одним параметром try { elSelect.add(elOption, null); } catch (ex) { elSelect.add(elOption); } // Если у нас установлено текущее значение, // и мы добавляем новую опцию с этим же значением, // убираем текущую опцию и делаем выбранной добавленную //if (bValueExists && (elCurrentOption.value == arOption["id"])) { // //arParams['elSelect'].remove(nCurrentOptionIndex); // bValueExists = false; // elOption.selected = true; //} if (obControl.currentOption.value == arOption["id"]) { elOption.selected = true; } } //if (!bHaveErrorOption) { // elSelect.remove(nCurrentOptionIndex); //} //elSelect.style.whiteSpace = 'pre'; obControl.fillPagesBox(arResponse["numPages"], arResponse["page"]); var bShowPrevPageLink = obControl.selectedPage > 1; var bShowNextPageLink = obControl.selectedPage < obControl.numPages; if (bShowPrevPageLink || bShowNextPageLink) { //var navGroup = document.createElement("optgroup"); //navGroup.label = "Навигация"; //elSelect.appendChild(navGroup); if (bShowPrevPageLink) { var prevOption = Glib.Dom.addSelectOptionQuick(elSelect, 'Предыдущая страница', ''); prevOption.className = 'nav'; //prevOption.style.fontWeight = 'bold'; prevOption.obControl = obControl; prevOption.setAttribute('navAction') = 'prev'; prevOption.onclick = function() {this.obControl.prevPage()} } if (bShowNextPageLink) { var nextOption = Glib.Dom.addSelectOptionQuick(elSelect, 'Следующая страница', ''); nextOption.className = 'nav'; //nextOption.style.fontWeight = 'bold'; nextOption.obControl = obControl; nextOption.setAttribute('navAction') = 'next'; nextOption.onclick = function() {this.obControl.nextPage()} } } obControl.bAllDataRecived = true; } obControl.bDataGetStarted = false; } /* Glib.LoadManager = function() {} Glib.LoadManager.arHandlers = new Array(); Glib.LoadManager.addOnReadyHandler = function (newHandlerFunction) { Glib.LoadManager.arHandlers.push(newHandlerFunction); } Glib.LoadManager.doOnReady = function() { //alert("ready"); for (var ix in Glib.LoadManager.arHandlers) { var fn = Glib.LoadManager.arHandlers[ix]; fn(); } }*/ /* if (window.onload) { Glib.LoadManager.addOnReadyHandler(window.onload); } window.onload = Glib.LoadManager.doOnReady; */ //Glib.LoadManager.addOnReadyHandler(function() {SmartselectControl.unobtrusiveInit('smartselectcontrol')}); //Glib.LoadManager.addOnReadyHandler(Ext.onReady); function touchFooter() { if($("footer")) { $("footer").style.position="relative"; $("footer").style.position="absolute"; } } //************ if (typeof Ext != 'undefined') { Ext.BLANK_IMAGE_URL = '/core/media/images/s.gif'; Ext.namespace('Ext.ox'); Ext.ox.SmartPagingToolbar = function(config) { // call parent constructor this.noAllPages = false; Ext.ox.SmartPagingToolbar.superclass.constructor.call(this, config); } // extend Ext.extend(Ext.ox.SmartPagingToolbar, Ext.PagingToolbar, { onRender : function(ct, position){ Ext.PagingToolbar.superclass.onRender.call(this, ct, position); this.first = this.addButton({ tooltip: this.firstText, iconCls: "x-tbar-page-first", disabled: true, handler: this.onClick.createDelegate(this, ["first"]) }); this.prev = this.addButton({ tooltip: this.prevText, iconCls: "x-tbar-page-prev", disabled: true, handler: this.onClick.createDelegate(this, ["prev"]) }); if (!this.noAllPages) { this.addSeparator(); this.add(this.beforePageText); } this.field = Ext.get(this.addDom({ tag: "input", type: "text", size: "3", value: "1", cls: "x-tbar-page-number" }).el); if (this.noAllPages) { this.field.hide(); } else { this.field.on("keydown", this.onPagingKeydown, this); this.field.on("focus", function(){this.dom.select();}); } this.afterTextEl = this.addText(String.format(this.afterPageText, 1)); if (this.noAllPages) { this.afterTextEl.hide(); } else { this.field.setHeight(18); this.addSeparator(); } this.next = this.addButton({ tooltip: this.nextText, iconCls: "x-tbar-page-next", disabled: true, handler: this.onClick.createDelegate(this, ["next"]) }); this.last = this.addButton({ tooltip: this.lastText, iconCls: "x-tbar-page-last", disabled: true, handler: this.onClick.createDelegate(this, ["last"]) }); if (this.noAllPages) { this.last.hide(); } this.addSeparator(); this.loading = this.addButton({ tooltip: this.refreshText, iconCls: "x-tbar-loading", handler: this.onClick.createDelegate(this, ["refresh"]) }); if(this.displayInfo){ this.displayEl = Ext.fly(this.el.dom).createChild({cls:'x-paging-info'}); } if(this.dsLoaded){ this.onLoad.apply(this, this.dsLoaded); } } }); Ext.ox.SmartCombo = function(config) { // call parent constructor this.noAllPages = false; this.oldStyle = 'normal'; this.curStyle = 'normal'; Ext.ox.SmartCombo.superclass.constructor.call(this, config); this.on({ render:{scope:this, fn:function() { var wrap = this.el.up('div.x-form-field-wrap'); this.wrap.applyStyles({position:'relative'}); this.el.addClass('x-icon-combo-input'); this.flag = Ext.DomHelper.append(wrap, { tag: 'div', style:'position:absolute' }); }} }); } // end of Ext.ux.IconCombo constructor // extend Ext.extend(Ext.ox.SmartCombo, Ext.form.ComboBox, { setErrorStyle : function() { this.oldStyle = 'error'; this.setInputStyle('error'); }, setSearchStyle : function() { //alert(this.curStyle); //this.oldStyle = this.curStyle; this.setInputStyle('search'); }, setNormalStyle : function() { this.oldStyle = 'normal'; this.setInputStyle('normal'); }, restoreStyleAfterSearch : function() { //alert(this.oldStyle); this.setInputStyle(this.oldStyle); }, setInputStyle : function(style) { switch (style) { case 'error': this.curStyle = 'error'; this.el.applyStyles({color:'#f33', 'font-style':'normal'}); break; case 'search': this.curStyle = 'search'; this.el.applyStyles({color:'#333', 'font-style':'italic'}); break; case 'normal': default: this.curStyle = 'normal'; this.el.applyStyles({color:'#333', 'font-style':'normal'}); } }, setValue : function(v){ var text = v; if(this.valueField){ var r = this.findRecord(this.valueField, v); if(r){ text = r.data[this.displayField]; // Remove   from string and trim it text = text.replace(/ /g, ' ').trim(); }else if(this.valueNotFoundText !== undefined){ text = this.valueNotFoundText; } } this.lastSelectionText = text; if(this.hiddenField){ this.hiddenField.value = v; } this.setNormalStyle(); Ext.form.ComboBox.superclass.setValue.call(this, text); this.value = v; }, // private onKeyUp : function(e){ if(this.editable !== false && !e.isSpecialKey()){ this.lastKey = e.getKey(); this.dqTask.delay(this.queryDelay); this.setSearchStyle(); } }, doForce : function(){ if(this.el.dom.value.length > 0){ this.el.dom.value = this.lastSelectionText === undefined ? '' : this.lastSelectionText; this.applyEmptyText(); this.restoreStyleAfterSearch(); } }, setDefaultValue : function(v, displayValue, isError){ if (typeof isError == 'undefined') isError = false; var text = displayValue; this.lastSelectionText = text; if(this.hiddenField){ this.hiddenField.value = v; } Ext.form.ComboBox.superclass.setValue.call(this, text); this.value = v; if (isError) { this.setErrorStyle(); } else { this.setNormalStyle(); } }, doQuery : function(q, forceAll){ if(q === undefined || q === null){ q = ''; } var qe = { query: q, forceAll: forceAll, combo: this, cancel:false }; if(this.fireEvent('beforequery', qe)===false || qe.cancel){ return false; } q = qe.query; forceAll = qe.forceAll; if(forceAll === true || (q.length >= this.minChars)){ if(this.lastQuery !== q){ this.lastQuery = q; if(this.mode == 'local'){ this.selectedIndex = -1; if(forceAll){ this.store.clearFilter(); }else{ // Filter loacal store with *query* this.store.filter(this.displayField, q, true); } this.onLoad(); }else{ this.store.baseParams[this.queryParam] = q; this.store.load({ params: this.getParams(q) }); this.expand(); } }else{ this.selectedIndex = -1; this.onLoad(); } } }, initList : function(){ if(!this.list){ var cls = 'x-combo-list'; this.list = new Ext.Layer({ shadow: this.shadow, cls: [cls, this.listClass].join(' '), constrain:false }); var lw = this.listWidth || Math.max(this.wrap.getWidth(), this.minListWidth); this.list.setWidth(lw); this.list.swallowEvent('mousewheel'); this.assetHeight = 0; if(this.title){ this.header = this.list.createChild({cls:cls+'-hd', html: this.title}); this.assetHeight += this.header.getHeight(); } this.innerList = this.list.createChild({cls:cls+'-inner'}); this.innerList.on('mouseover', this.onViewOver, this); this.innerList.on('mousemove', this.onViewMove, this); this.innerList.setWidth(lw - this.list.getFrameWidth('lr')) if(this.pageSize){ this.footer = this.list.createChild({cls:cls+'-ft'}); this.pageTb = new Ext.ox.SmartPagingToolbar({ store:this.store, pageSize: this.pageSize, renderTo:this.footer, noAllPages:this.noAllPages }); this.assetHeight += this.footer.getHeight(); } if(!this.tpl){ /** * @cfg {String/Ext.XTemplate} tpl The template string, or {@link Ext.XTemplate} * instance to use to display each item in the dropdown list. Use * this to create custom UI layouts for items in the list. *

* If you wish to preserve the default visual look of list items, add the CSS * class name

x-combo-list-item
to the template's container element. *

* The template must contain one or more substitution parameters using field * names from the Combo's {@link #store Store}. An example of a custom template * would be adding an

ext:qtip
attribute which might display other fields * from the Store. *

* The dropdown list is displayed in a DataView. See {@link Ext.DataView} for details. */ this.tpl = '

{' + this.displayField + '}
'; } /** * The {@link Ext.DataView DataView} used to display the ComboBox's options. * @type Ext.DataView */ this.view = new Ext.DataView({ applyTo: this.innerList, tpl: this.tpl, singleSelect: true, selectedClass: this.selectedClass, itemSelector: this.itemSelector || '.' + cls + '-item' }); this.view.on('click', this.onViewClick, this); this.bindStore(this.store, true); if(this.resizable){ this.resizer = new Ext.Resizable(this.list, { pinned:true, handles:'se' }); this.resizer.on('resize', function(r, w, h){ this.maxHeight = h-this.handleHeight-this.list.getFrameWidth('tb')-this.assetHeight; this.listWidth = w; this.innerList.setWidth(w - this.list.getFrameWidth('lr')); this.restrictHeight(); }, this); this[this.pageSize?'footer':'innerList'].setStyle('margin-bottom', this.handleHeight+'px'); } } } }); // end of extend // end of file SmartselectControl.createSelect = function(sId) { var select = Ext.getDom(sId); var name = select.name; var sDatastamp = select.getAttribute('datastamp'); var title = select.getAttribute('title'); var params = select.getAttribute('params'); var useLocalStorage = select.getAttribute('localstorage') == 'localstorage'; var disablePaging = select.getAttribute('nopaging') == 'nopaging' || useLocalStorage; var noAllPages = select.getAttribute('noallpages') == 'noallpages'; var selectWidth = select.getAttribute('selectwidth'); var value = ''; var sText = ''; var isError = false; if (!useLocalStorage) { if (select.selectedIndex >= 0) { var currentOption = select.options[select.selectedIndex]; value = currentOption.value; sText = currentOption.text; isError = currentOption.className == 'error'; } } //FormSubmitter.attachToForm(select.form); var ds = new Ext.data.Store({ baseParams: { component: 'smartselectcontrol2', datastamp: sDatastamp, noallpages: noAllPages, params: params }, proxy: new Ext.data.ScriptTagProxy({ url: '/core/async/smartselectcontrol/' }), reader: new Ext.data.JsonReader({ root: 'data', totalProperty: disablePaging ? null : 'itemsCount', id: 'id' }, [ {name: 'name'}, {name: 'id'} ]) }); if (selectWidth) selectWidth = parseInt(selectWidth); var search = new Ext.ox.SmartCombo({ store: useLocalStorage ? null : ds, displayField : 'name', valueField : 'id', //typeAhead : true, //editable : false, autocomplete : false, pageSize : disablePaging ? 0 : 100, noAllPages : noAllPages, width : selectWidth ? selectWidth : 180, listWidth : 240, loadingText : 'Searching...', triggerAction : 'all', resizable : true, forceSelection : true, minChars : 0, transform : sId, title : title, listeners : { select : { fn : ((typeof(select.onchange) != undefined) && select.onchange) ? select.onchange : function(){} } } }); //search.render('ssearch'); if (!useLocalStorage) { search.setDefaultValue(value, sText, isError); } } SmartselectControl.unobtrusiveInit2 = function(sClassname) { var arSelects = document.getElementsByTagName('select'); var nSelects = arSelects.length; var arSelectsToTransform = new Array(); for (var i = 0; i < nSelects; i++) { var elSelect = arSelects[i]; if (elSelect.className == sClassname) { arSelectsToTransform.push(elSelect); } } var nSelectsToTransform = arSelectsToTransform.length; for (var i = 0; i < nSelectsToTransform; i++) { var elSelect = arSelectsToTransform[i]; SmartselectControl.createSelect(elSelect); } } Ext.onReady(function(){ SmartselectControl.unobtrusiveInit2('smartselectcontrolext'); }); }