ABrowser = {}; (function() { function uaMatch(ua) { ua = ua.toLowerCase(); var match = /(chrome)[ \/]([\w.]+)/.exec( ua ) || /(webkit)[ \/]([\w.]+)/.exec( ua ) || /(opera)(?:.*version|)[ \/]([\w.]+)/.exec( ua ) || /(msie) ([\w.]+)/.exec( ua ) || ua.indexOf("compatible") < 0 && /(mozilla)(?:.*? rv:([\w.]+)|)/.exec( ua ) || []; return { browser: match[ 1 ] || "", version: match[ 2 ] || "0" }; } var matched = uaMatch(navigator.userAgent); if (matched.browser) { ABrowser[matched.browser] = true; ABrowser.version = matched.version; } if (ABrowser.msie && ABrowser.version == "9.0") { ABrowser.IE9 = true; } })(); function Include(src) { var fileref = document.createElement('script'); fileref.setAttribute("type","text/javascript"); fileref.setAttribute("src", src); document.getElementsByTagName("head")[0].appendChild(fileref); } function LoadCssFile(src) { var fileref=document.createElement("link"); fileref.setAttribute("rel", "stylesheet"); fileref.setAttribute("type", "text/css"); fileref.setAttribute("href", src); document.getElementsByTagName("head")[0].appendChild(fileref); } var prevLogin; var prevPassword; function RescheduleUpdateTenantList(delay) { window.clearTimeout(UpdateTenantListDelay); UpdateTenantListDelay = null; UpdateTenantListDelay = UpdateTenantList.delay(delay || 0.5); } function UpdateTenantList() { window.clearTimeout(UpdateTenantListDelay); UpdateTenantListDelay = null; var login = $('login').value; var pw = $('password').value; if (login == prevLogin && pw == prevPassword) { RescheduleUpdateTenantList(); return; } prevLogin = login; prevPassword = pw; $('login_button').disabled = true; $('tenant_row').hide(); if (!login) { RescheduleUpdateTenantList(); return; } var tenantList = []; new ServerCall("/nologin/srv/Authorizer/Users/GetMyTenants", {Login: login, Password: pw}, { onSuccess: function(oPacket) { tenantList = oPacket.Data(); } }, false); var tl = $('tenant'); tl.update(); if (!tenantList) { RescheduleUpdateTenantList(); return; } for (var i = 0; i < tenantList.length; ++i) { var e = new Element('option', { value: tenantList[i].TenantID }); e.innerHTML = tenantList[i].TenantDesc; if (!i) e.writeAttribute('selected', 'yes'); tl.appendChild(e); } if (tenantList.length > 1) $('tenant_row').show(); if (tenantList.length > 0) $('login_button').disabled = false; RescheduleUpdateTenantList(); } var UpdateTenantListDelay; var Login = function(login, password, language, skin) { var ret = new Object(); var params={}; params.Login=String(login); params.Password=String(password); var t = $('tenant'); var tenant = (t ? t.value : null); if (t && !tenant) { } if (language) params.Lang=String(language); if (skin) params.Skin=String(skin); if (tenant) params.TenantID = int64(tenant); var date=new Date(); params.TimeZone=date.getTimezoneOffset(); var sParams=URLSerializeVS(params); new AjaxRequest("post", "/auth/login", sParams, { onException: function(oAjaxRequest) { ret.Error = oAjaxRequest.Error(); ret.ErrCode = oAjaxRequest.ErrorCode(); }, onSuccess: function(oAjaxRequest) { var xml = oAjaxRequest.XML(); var root = xml.documentElement; var n = AXML.SelectNode(root, "//language"); if (n) ret.Lang = n.text; } }, false); return ret; } function Logout(evt) { if(evt && evt.Emitter().ID()!="logout-link") return; var doc = document.location.pathname.replace(/^\/.._[^\/]*/, ''); new AjaxRequest("get", "/auth/logout", "", {}, false); document.location.assign(doc) } function PerformLogin(login, password, language, skin) { var ret = Login(login, password, language, skin); if (!ret.Error) { if(skin) document.cookie="Skin="+skin+"; path=/"; if(language) document.cookie="Lang="+language+"; path=/"; document.cookie="Login="+login+"; path=/"; var url = document.location.pathname.replace(/^\/.._[^\/]*/, ''); var hash = document.location.hash.replace(/error=[^\/\&]*/, ''); if(hash=='#') hash=''; // IE workaround document.location.assign("/" + ret.Lang + url + hash); if (hash.length > 0 && hash != "#") document.location.reload(); // page is not getting reloaded automatically with hash } else GLoader.ErrorCallback(ret.Error, ret.ErrCode); } var SkinPrefix; var LocalizedSkinPrefix; function GetSessionInfo() { var ret = new Object(); new ServerCall("/srv/WWW/WWWWorker/GetSessionInfo", "", { onSuccess: function(oPacket) { ret.Lang = oPacket.Data().Lang; ret.Skin = oPacket.Data().Skin; } }, false); return ret; } var Loader = Class.create({ initialize: function(dispError, mainWindow, container) { this.LoginMainWindow = mainWindow; this.ErrorCallback = dispError; if (!this.ParseArgs()) return; try { var ifo = GetSessionInfo(); this.SessionInfo = ifo; this.SessionActivated = ifo.Lang != undefined && ifo.Skin != undefined; if(ifo.Skin==undefined) { // dispError("`Cannot acquire session info. Please try again. `"+ document.location.pathname); return; } if (document.location.pathname.match(/^\/.._/)) { SkinPrefix=(ifo.Skin=="default") ? "" : "/skins/"+ifo.Skin; LocalizedSkinPrefix=document.location.pathname.replace(/[^\/]*$/, '') + "skins/" + ifo.Skin + "/"; Include(LocalizedSkinPrefix + "init.js"); $(document).fire('st:logindone', ifo); GDocumentInstance.Subscribe("RELOGIN", this.OnRelogin, this); GWindowManager.Start(this.LoginMainWindow, container); return; } RescheduleUpdateTenantList(0); if (ifo.Lang) { document.location.assign("/" + ifo.Lang + document.location.pathname); } } catch(e) { alert(e.message); } }, ParseArgs: function() { var loc = document.location.hash; if (loc.substr(0, 7) == "#error=") { if (document.location.pathname.match(/^\/.._/)) { var doc = document.location.pathname.replace(/^\/.._[^\/]*/, '') + document.location.hash; document.location.assign(doc); return false; } this.ErrorCallback(loc.substr(7)); return false; } if (loc.substr(0, 7) == "#logout") { Logout(); return false; } if (loc.substr(0, 2) == "#/") { this.StartWindow = loc.substr(1); GDocumentInstance.Subscribe("WM_LINKOPENER", this.OnLinkOpener, this); } else if (loc != "") { document.location.href = '#'; } return true; }, RedirectOnError: function(sError) { // cut locale info from URL and redirect var doc = document.location.pathname.replace(/^\/.._[^\/]*/, '') + '#error=' + sError; document.location.assign(doc); }, CheckFatalError: function(errCode) { if (errCode == NO_SESSION_EXCEPTION) { var args={}; args.modal=true; args.canResize=false; args.autoSize=true; args.bFitToScreen=true; args.sURL="/nologin/act/BASE/relogin?Login=s:"+GetCookie('Login'); args.sParent=$('wMain').JSControl.InstanceID(); this.oPopup = new APopupWindow(args); } else if (errCode == MUST_LOGIN_EXCEPTION) { this.RedirectOnError("`You must first login into system.`"); } else return false; return true; }, OnRelogin: function(evt) { var params={}; params.Login=evt.Data().login; params.Password=evt.Data().password; var date=new Date(); params.TimeZone=date.getTimezoneOffset(); var sParams=URLSerializeVS(params); var oMessage=evt.Emitter().Control("Message").JSControl; new AjaxRequest("post", "/auth/relogin", sParams, { onException: function(oAjaxRequest) { message = oAjaxRequest.Error(); oMessage.SetValue("`Password_is_incorrect`"); new AEvent("CHANGE", {}, evt.EmitterID()+"_Message"); }, onSuccess: function() { evt.Emitter().oPopup.Close(); new AEvent("RELOGIN_COMPLETE", {}); } }, false); }, OnLinkOpener: function(evt) { evt.Data().Callback({ src: this.StartWindow }); GDocumentInstance.Unsubscribe("WM_LINKOPENER", this.OnLinkOpener, this); } }); var GLoader = null; function Main(dispError, mainWindow, container) { GLoader = new Loader(dispError, mainWindow, container); } var aTypeNames = new Array("int", "int64_t", "double", "string", "Value"); function addParam() { var eParams = document.getElementById("divParams"); var eParamCount = document.getElementById("idParamCount"); var nParamCount = parseInt(String(eParamCount.value)); nParamCount = nParamCount+1; //alert(nParamCount); var eNameInp = document.createElement("input"); eNameInp.setAttribute("type", "text"); eNameInp.setAttribute("size", "20"); eNameInp.setAttribute("value", ""); eNameInp.setAttribute("id", "paramName" + String(nParamCount)); eParams.insertBefore(eNameInp, null); var eValueInp = document.createElement("input"); eValueInp.setAttribute("type", "text"); eValueInp.setAttribute("size", "20"); eValueInp.setAttribute("value", ""); eValueInp.setAttribute("id", "paramValue" + String(nParamCount)); eParams.insertBefore(eValueInp, null); var eTypeInp = document.createElement("select"); eTypeInp.setAttribute("id", "paramType" + String(nParamCount)); for (var i = 0; i < aTypeNames.length; i++) { var sType = aTypeNames[i]; //if (typeof(sType) != "string") continue; var eOptType = document.createElement("option"); eOptType.setAttribute("value", sType); eOptType.text = sType; eTypeInp.insertBefore(eOptType, null) } eParams.insertBefore(eTypeInp, null); eParamCount.readonly = false; eParamCount.setAttribute("value", String(nParamCount)); eParamCount.readonly = true; var eBR = document.createElement("br"); eParams.insertBefore(eBR, null); // for (var i = 0; i < eParams.childNodes.length; ++i) { // var elem = eParams.childNodes[i]; // alert(elem.nodeName); //} } function delParam() { var eParams = document.getElementById("divParams"); var eParamCount = document.getElementById("idParamCount"); var nParamCount = parseInt(String(eParamCount.value)); if (nParamCount <= 0) return; var n = String(nParamCount); nParamCount = nParamCount-1; var eNameInp = document.getElementById("paramName"+n); var eValueInp = document.getElementById("paramValue"+n); var eTypeInp = document.getElementById("paramType"+n); eParams.removeChild(eParams.lastChild); eParams.removeChild(eNameInp); eParams.removeChild(eValueInp); eParams.removeChild(eTypeInp); eParamCount.readonly = false; eParamCount.setAttribute("value", String(nParamCount)); eParamCount.readonly = true; } function validateNumericInput(e) { var v = String($(e).value); if (!v) return true; var nV = NaN; if (v.match(/^(\d|\.)+$/)) { nV = parseFloat(v); if (nV != NaN) return true; } return false; } function validateIntegerInput(e) { var v = String($(e).value); if (!v) return true; var nV = NaN; if (v.match(/^(\d)+$/)) { nV = parseInt(v); if (nV != NaN) return true; } return false; } function inputOnKeyPress(e, event) { var key = $(event).which || $(event).keyCode; if (key >= 48 && key <= 57) { elementClearError(e); return true; } if ($(event).shiftKey == 1 || $(event).ctrlKey == 1) return true; switch (key) { case 8: // backspace case 9: // tab case 13: // enter case 27: // escape return true; } if (event.charCode == 0) { switch (key) { case 35: // end case 36: // home case 37: // left arrow case 39: // right arrow case 46: // delete return true; } } elementRaiseError(e); return false; } function elementRaiseError(e) { var oBlinkRaise = new Animation($(e)); // TODO: get background color from current control style oBlinkRaise.chainedAnimation = new Animation($(e)); oBlinkRaise.addAnimation('backgroundColor', '#ffffff', '#ff0000'); oBlinkRaise.chainedAnimation.addAnimation('backgroundColor', '#ff0000', '#ffffff'); oBlinkRaise.speed = 12; oBlinkRaise.onfinish = function() { if (this.chainedAnimation) this.chainedAnimation.run(); } oBlinkRaise.run(); } function elementClearError(e) { // TODO: restore to kosher background color (according to CSS) var oBlinkRaise = new Animation($(e)); $(e).setStyle({'backgroundColor': '#ffffff'}); } function setCaretTo(obj, pos) { if(obj.createTextRange) { /* Create a TextRange, set the internal pointer to a specified position and show the cursor at this position */ var range = obj.createTextRange(); range.move("character", pos-1); range.select(); } else if(obj.selectionStart) { /* Gecko is a little bit shorter on that. Simply focus the element and set the selection to a specified position */ obj.focus(); if (Prototype.Browser.Safari) { obj.setSelectionRange(pos, pos); } else { obj.setSelectionRange(pos-1, pos-1); } } } function UMC_CallServer() { var nParamCount = parseInt(document.getElementById("idParamCount").value); var aNames = Array(); var aValues = Array(); var aTypes = Array(); for (var i = 0; i < nParamCount; i++) { var n = String(i+1); aNames[i] = $("paramName"+n).value; aValues[i] = $("paramValue"+n).value; aTypes[i] = $("paramType"+n).value; } var sContName = document.getElementById("idContName").value; var sObjectName = document.getElementById("idObjectName").value; var sMethodName = document.getElementById("idMethodName").value; var oData = new Object(); for (var i = 0; i < nParamCount; i++) { var key = aNames[i]; var val = aValues[i]; if (aTypes[i] == "int") oData[key] = int(val); else if (aTypes[i] == "int64_t") oData[key] = int64(val); else if (aTypes[i] == "double") oData[key] = double(val); else if (aTypes[i] == "string") oData[key] = val; else { LogL("UMC: Unknown data type: "+aTypes[i]); continue; } } var sParams = URLSerializeVS(oData); new AjaxRequest("POST", "/srv/" + sContName + "/" + sObjectName + "/" + sMethodName, sParams, { onSuccess: UMC_UpdatePage, thisObject: document }); } function UMC_GetValueTable(oData) { var sResult = ""; if (oData instanceof Array) { var nCount = 0; oData.each(function(oVal, oKey) { var nKey = oKey+1; var sContent = getValueTable(oVal); if (!sContent) sContent = " "; sResult += ""+nKey+""+sContent+""; nCount++; }); if (nCount) sResult = ""+sResult+"
"; else sResult = "
NULL
"; } else if (typeof(oData) != "object") { var sContent = AXML.EscapeEntities(String(oData)); if (!sContent) sContent = " "; sResult += sContent; } else { var nCount = 0; for (var oKey in oData) { var oVal = oData[oKey]; if (typeof(oVal) == "function") continue; var sContent = ""; if (oVal instanceof Optional) sContent = oVal.toString(); else sContent = UMC_GetValueTable(oData[oKey]); if (!sContent) sContent = " "; sResult += ""+oKey+""+sContent+""; nCount++; } if (nCount) sResult = ""+sResult+"
"; else sResult = "
NULL
"; } return sResult; } function UMC_GetListResultTable(oData) { var sResult = ""; sResult += ""; sResult += ""; sResult += "" oData[0].each(function(oVal, oKey) { sResult += ""; }); sResult += ""; for (var i = 1; i < oData.length; i++) { var rowclass="lrrow"; if (i%2==0) rowclass="lrrow_even"; sResult += ""; sResult += "" oData[i].each(function(oVal, oKey) { var sContent; if (typeof(oVal) == "object") { if (oVal && oVal.toString) sResult += ""; else sResult += ""; } else { var sContent = AXML.EscapeEntities(String(oVal)); if (!sContent) sContent = " "; sResult += ""; } }); sResult += ""; } sResult += "
 "+AXML.EscapeEntities(String(oVal))+"
"+i+""+oVal.toString()+"NULL"+sContent+"
"; return sResult; } function UMC_UpdatePage(oAjaxRequest) { //alert(this.documentElement.nodeName); // Optimization :) //var oAPResponse = XMLRestore(oAjaxRequest.XML().xml); var oAPResponse = XMLRestore(oAjaxRequest.XML()); var oData = oAPResponse.Data(); var elResult = document.getElementById("result"); var sResult = ""; if (oData["ExceptionText"]) { sResult += "

ERROR: "+AXML.EscapeEntities(String(oData["ExceptionText"]))+"

"; } else if (oData instanceof Array) { sResult += UMC_GetListResultTable(oData); } else { sResult += UMC_GetValueTable(oData); } elResult.innerHTML = sResult; } /* // hope this code is a pre-historic popup implementation and is not used. TODO: wipe away function down(event) { var element = event.element(); //alert(this.nodeName); //alert("count: "+arguments.length+", "+arguments[1]+","+arguments[2]+","+arguments[3]); var popupId = arguments[1]; if (!$(popupId)) { alert("Event down() called on non-existent popupId!"); return; } window.status="mousedown"; var pX = $(popupId).getStyle('left'); var pY = $(popupId).getStyle('top'); pX = pX.replace('px', ''); pY = pY.replace('px', ''); var dX = parseInt(pX)-event.pointerX(); var dY = parseInt(pY)-event.pointerY(); $(popupId).diffX = dX; $(popupId).diffY = dY; var nW = $(popupId).getStyle('width'); var nH = $(popupId).getStyle('height'); nW = parseInt(nW.replace('px', '')); nH = parseInt(nH.replace('px', '')); var moveType = 1; if (Math.abs(nW+dX) < 5 && Math.abs(nH+dY) < 5) moveType = 2; //window.status = "moveType = "+moveType; //alert('click done!'); // $(popupId).setStyle({ // 'left': event.pointerX().toString()+"px", //'top': event.pointerY().toString()+"px" // }); var refMove; var refStop; var refSelect; $(document).onmousemove = null; $(document).onmouseup = null; $(document).onmousedown = function(e) { //var e = Event(e); //alert(e.pointerX()); // if (e.pointerX() >= pX && e.pointerX() <= pX+nW && // e.pointerY() >= pY && e.pointerY() <= pY+nH) { // window.status = "testonDOWN"; // this is on-window click // } else { if (!Prototype.Browser.IE) { e.preventDefault(); e.stopPropagation(); } else { // TODO: handle something in IE } // } }; $(document).observe('mousemove', refMove = move.bindAsEventListener(this,popupId)); $(document).observe('mouseup', refStop = stop.bindAsEventListener(this,popupId)); //$(document).observe('select', refSelect = eselect.bindAsEventListener(this,popupId)); $(document).refMove = refMove; $(document).refStop = refStop; $(document).refSelect = refSelect; $(document).moveType = moveType; } function stop(event) { var element = event.element(); var popupId = arguments[1]; if (!$(popupId)) { alert("Event stop() called on non-existent popupId!"); return; } window.status = "stop!!!"; // DEBUG // handle in WindowManager Event.stopObserving(document, "mousemove", document.refMove); Event.stopObserving(document, "mouseup", document.refStop); $(document).onmousedown = null; } function closewin(event) { var element = event.element(); var popupId = arguments[1]; if (!$(popupId)) { alert("Event closewin[click]() called on non-existent popupId!"); return; } window.status = "close!!!"; // DEBUG $(document).body.removeChild($(popupId)); // handle in WindowManager //Event.stopObserving(document, "dblclick", document.refMove); //Event.stopObserving(document, "mouseup", document.refStop); } */