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) {
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);
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) {
GLoader = new Loader(dispError, mainWindow);
}
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 = "";
else sResult = "";
}
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 = "";
else sResult = "";
}
return sResult;
}
function UMC_GetListResultTable(oData) {
var sResult = "";
sResult += "";
sResult += "";
sResult += " | "
oData[0].each(function(oVal, oKey) {
sResult += ""+AXML.EscapeEntities(String(oVal))+" | ";
});
sResult += "
";
for (var i = 1; i < oData.length; i++) {
var rowclass="lrrow";
if (i%2==0) rowclass="lrrow_even";
sResult += "";
sResult += ""+i+" | "
oData[i].each(function(oVal, oKey) {
var sContent;
if (typeof(oVal) == "object") {
if (oVal && oVal.toString) sResult += ""+oVal.toString()+" | ";
else sResult += "NULL | ";
} else {
var sContent = AXML.EscapeEntities(String(oVal));
if (!sContent) sContent = " ";
sResult += ""+sContent+" | ";
}
});
sResult += "
";
}
sResult += "
";
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);
}
*/