539 lines
18 KiB
JavaScript
539 lines
18 KiB
JavaScript
|
||
class DBMSUser
|
||
{
|
||
constructor(){
|
||
this.divsh=null;
|
||
this.id=null;
|
||
this.name='';
|
||
this.surname='';
|
||
this.patronymic='';
|
||
this.temp=false;
|
||
this.role='';
|
||
this.m_ls=new Array(); //Listeners called OnLogin function.
|
||
|
||
//Запрашиваю данные о текущем пользователе с сервера
|
||
//this.LoadData();
|
||
}
|
||
|
||
applyReq(req,fn,node)
|
||
{
|
||
//alert(getXMLNodeSerialisation(node));
|
||
this.showShadow(false);
|
||
if (fn==-1)
|
||
{
|
||
alert(findFirstNode(node,'#cdata-section').nodeValue);
|
||
}else
|
||
if(fn==7)
|
||
{
|
||
var nCmd=findFirstNode(node, "cmd");
|
||
if(nCmd!=null)
|
||
{
|
||
if(findFirstNode(nCmd,'#cdata-section').nodeValue=="1") //Logout
|
||
{
|
||
location.reload();
|
||
//window.location.href = '../';
|
||
}else if(findFirstNode(nCmd,'#cdata-section').nodeValue=="2") //Check if user not logged
|
||
{
|
||
if(findNode(node,'#cdata-section').nodeValue=="0") //if not logged
|
||
{
|
||
this.showLoginForm();
|
||
}else
|
||
{
|
||
this.name=getCdataValue(findNode(node,'name'));
|
||
this.surname=getCdataValue(findNode(node,'surname'));
|
||
this.patronymic=getCdataValue(findNode(node,'patronymic'));
|
||
|
||
if (typeof this.onUpdateName !== 'undefined') {
|
||
this.onUpdateName(this.name,this.surname,this.patronymic);
|
||
}
|
||
//configGUIbyAccessLevel();
|
||
//var shadow=document.getElementById("shadow");
|
||
//if(shadow.parentNode!=null) shadow.parentNode.removeChild(shadow);
|
||
|
||
//Информируем слушатеелй о логине
|
||
for(i=0;i<this.m_ls.length;i++){
|
||
if(this.m_ls[i]!==null){
|
||
this.m_ls[i].OnLogin(true); //0 - authorized, 1 - an incorrect username or password, 2 - left.
|
||
}
|
||
}
|
||
}
|
||
}else if(findFirstNode(nCmd,'#cdata-section').nodeValue=="3") //Login
|
||
{
|
||
if(findNode(node,'#cdata-section').nodeValue=="0") //if not logged
|
||
{
|
||
alert(trt('Invalid_username_and_or_password'));
|
||
}else
|
||
{
|
||
//location.reload();
|
||
//Информируем слушатеелй о логине
|
||
for(i=0;i<this.m_ls.length;i++){
|
||
if(this.m_ls[i]!==null){
|
||
this.m_ls[i].OnLogin(true); //0 - authorized, 1 - an incorrect username or password, 2 - left.
|
||
}
|
||
}
|
||
}
|
||
}else if(findFirstNode(nCmd,'#cdata-section').nodeValue=="4") //Register
|
||
{
|
||
//if(findNode(node,'#cdata-section').nodeValue=="1") //if register
|
||
//{
|
||
// alert(trt('New_user_is_registered')+'\n'+trt('The_password_has_been_sent_to_you_by_Email'));
|
||
// location.reload();
|
||
//}
|
||
}
|
||
}
|
||
}
|
||
|
||
};
|
||
//Display login and registration form
|
||
showLoginForm()
|
||
{
|
||
if(this.win==null || this.win.closed)
|
||
{
|
||
this.win=new TWin(true);
|
||
this.win.BuildGUI(10,10);
|
||
this.win.setCaption(trt('Authorization'));
|
||
|
||
this.win.setSize("350px","200px");
|
||
|
||
var str='<div style="width: 100%; height: 100%; padding: 3px; text-align: left;">\n\
|
||
<table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%;">\n\
|
||
<tbody>\n\
|
||
<tr><td>\n\
|
||
<table border="0" style="width: 100%; height: 100%;">\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px; width: 30%; white-space: nowrap"><b>'+trt('Login')+' (E-mail):</b></td>\n\
|
||
<td style="padding: 2px;"><input type="text" maxlength="50" style="width: 100%; padding: 2px; display: inline;" id="tcLogin'+this.uid+'" name="login"><br></td>\n\
|
||
</tr>\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px;"><b>Password:</b></td>\n\
|
||
<td style="padding: 2px;"><input type="password" maxlength="33" style="width: 100%; padding: 2px; display: inline;" id="tcPassword'+this.uid+'" name="password"><br></td>\n\
|
||
</tr>\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px;" colspan="2"><table cellspacing="0" cellpadding="0" border="0" style="width: 100%;"><tr><td><label for="save0" style="white-space: nowrap;"><input id="save_'+this.uid+'" type="checkbox" style="display: inline;" checked/> Remember (<a href="#" onclick="showRestoreForm();">Forgot your password?</a>)</label></td></tr></table></td>\n\
|
||
</tr>\n\
|
||
<tr><td colspan="2" style="text-align: right;"><input class="button-secondary" id="TLogin_E'+this.uid+'" type="button" style="display: inline;" value="'+trt('Log_in')+'"></td></tr>\n\
|
||
</table>\n\
|
||
</td></tr>\n\
|
||
</tbody>\n\
|
||
</table>\n\
|
||
</div>';
|
||
|
||
this.win.setContent(str);
|
||
|
||
//Center the window and display the shadow
|
||
//if(this.win.tbl.offsetHeight>this.win.div.offsetHeight) this.win.div.style.height=this.win.tbl.offsetHeight+"px";
|
||
//if(this.win.tbl.offsetWidth>this.win.div.offsetWidth) this.win.div.style.width=this.win.tbl.offsetWidth+"px";
|
||
this.win.setCenter();
|
||
this.win.shadow=true;
|
||
this.win.hide(false);
|
||
|
||
//Нажатие на кнопку авторизоваться
|
||
var obj=null;
|
||
obj=document.getElementById('TLogin_E'+this.uid);
|
||
if(obj!==null)
|
||
{
|
||
obj.onclick=function(thiz)
|
||
{
|
||
return function()
|
||
{
|
||
var xs='<?xml version="1.0" encoding="utf-8"?>\
|
||
<metadata fn="7">\
|
||
<cmd><![CDATA[3]]></cmd>\n\
|
||
<login><![CDATA['+document.getElementById('tcLogin'+thiz.uid).value+']]></login>\
|
||
<password><![CDATA['+document.getElementById('tcPassword'+thiz.uid).value+']]></password>\
|
||
</metadata>';
|
||
|
||
var request=new TRequest(thiz);
|
||
if(request.callServer(ScriptName,xs))
|
||
{
|
||
thiz.win.showProgressBar();
|
||
}
|
||
};
|
||
}(this);
|
||
}
|
||
}
|
||
};
|
||
//logout current user
|
||
Logout()
|
||
{
|
||
xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[1]]></cmd></metadata>';
|
||
var request=new TRequest(this);
|
||
if(request.callServer(ScriptName,xs))
|
||
{
|
||
this.showShadow();
|
||
}
|
||
};
|
||
|
||
//Checking the session without its extension, if it is completed, we display the authorization window.
|
||
checkSession()
|
||
{
|
||
$.getJSON('../session',{},function(thiz){return function(data){ if(data.result=='ERROR'){thiz.showLoginForm();} };}(this));
|
||
setTimeout(function(thiz){return function(){thiz.checkSession();};}(this), 10000);
|
||
};
|
||
|
||
showShadow(visible)
|
||
{
|
||
if(visible)
|
||
{
|
||
this.divsh=document.createElement('div'); //Тень для модального окна
|
||
this.divsh.style.cssText="display: block; position: fixed; z-index:9999; top:0; left:0; height: 100%; width: 100%; background: rgba(0,0,0,0.3);";
|
||
document.body.appendChild( this.divsh );
|
||
}else
|
||
{
|
||
deleteHTML(this.divsh);
|
||
}
|
||
};
|
||
|
||
//Функция запрашивает информацию о текущем пользователе с сервера
|
||
LoadData()
|
||
{
|
||
var r = new TRequest(this);
|
||
var xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[2]]></cmd></metadata>';
|
||
if(r.callServer(ScriptName,xs))
|
||
{
|
||
this.showShadow(true);
|
||
}
|
||
};
|
||
//Check whether the already authorized (+ attempt to log in through "hash").
|
||
isLogined()
|
||
{
|
||
var xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[2]]></cmd></metadata>';
|
||
var request=new TRequest(this);
|
||
if(request.callServer(ScriptName,xs))
|
||
{
|
||
this.showShadow(true);
|
||
|
||
alert(ScriptName+" = "+xs);
|
||
|
||
//m_winPP.showProgressBar();
|
||
}
|
||
};
|
||
|
||
addListener(l)
|
||
{ if(l.OnLogin==null) alert('Object does not have the function "OnLogin()"!');
|
||
this.m_ls[this.m_ls.length]=l;
|
||
};
|
||
|
||
remListener(l){
|
||
for(let i=0;i<this.m_ls.length;i++){
|
||
if(this.m_ls[i]==l)
|
||
this.m_ls[i]=null;
|
||
}
|
||
};
|
||
}
|
||
|
||
|
||
/*
|
||
* Login form (not cross-source).
|
||
* [^\x00-\x7F]+
|
||
*/
|
||
/*function TLogin()
|
||
{
|
||
this.showLoginForm = function()
|
||
{
|
||
this.win.BuildGUI(10,10);
|
||
this.win.shadow=true;
|
||
this.win.setCaption(document.createTextNode("Enter"));
|
||
|
||
var str='<div style="width: 100%; height: 100%; padding: 3px; text-align: left;">\n\
|
||
<table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%;">\n\
|
||
<tbody>\n\
|
||
<tr><td>\n\
|
||
<table border="0" style="width: 100%; height: 100%;">\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px; width: 30%; white-space: nowrap"><b>'+trt('Login')+' (E-mail):</b></td>\n\
|
||
<td style="padding: 2px;"><input type="text" maxlength="50" style="width: 100%; padding: 2px; display: inline;" id="tcLogin'+this.uid+'" name="login"><br></td>\n\
|
||
</tr>\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px;"><b>Password:</b></td>\n\
|
||
<td style="padding: 2px;"><input type="password" maxlength="33" style="width: 100%; padding: 2px; display: inline;" id="tcPassword'+this.uid+'" name="password"><br></td>\n\
|
||
</tr>\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px;" colspan="2"><table cellspacing="0" cellpadding="0" border="0" style="width: 100%;"><tr><td><label for="save0" style="white-space: nowrap;"><input id="save_'+this.uid+'" type="checkbox" style="display: inline;" checked/> Remember (<a href="#" onclick="showRestoreForm();">Forgot your password?</a>)</label></td></tr></table></td>\n\
|
||
</tr>\n\
|
||
<tr><td colspan="2" style="text-align: right;"><input class="button-secondary" id="TLogin_E'+this.uid+'" type="button" style="display: inline;" value="'+trt('Log_in')+'"></td></tr>\n\
|
||
</table>\n\
|
||
</td></tr>\n\
|
||
</tbody>\n\
|
||
</table>\n\
|
||
</div>';
|
||
|
||
this.win.setContent(str);
|
||
|
||
var e=document.getElementById('TLogin_E'+this.uid);
|
||
e.onclick=function(obj){ return function(){obj.onEnter(); };}(this);
|
||
e=document.getElementById('tcLogin'+this.uid);
|
||
e.onkeydown=function(obj){ return function(e){ if(e.which==13) obj.onEnter(); return true; };}(this);
|
||
e=document.getElementById('tcPassword'+this.uid);
|
||
e.onkeydown=function(obj){ return function(e){ if(e.which==13) obj.onEnter(); return true; };}(this);
|
||
|
||
this.win.setSize("300px","155px");
|
||
this.win.setCenter();
|
||
this.win.obj=this;
|
||
|
||
this.win.hide(false);
|
||
};
|
||
|
||
|
||
this.onEnter=function()
|
||
{
|
||
var login=document.getElementById('tcLogin'+this.uid).value;
|
||
var password=document.getElementById('tcPassword'+this.uid).value;
|
||
if(login=='' || password=='')
|
||
{ str="Not filled in the required fields: ";
|
||
if(login=='') str+='"'+trt('Login')+' (E-mail)"';
|
||
if(login=='' && password=='') str+=', ';
|
||
if(password=='') str+='"Password"';
|
||
str+='!';
|
||
alert(str);
|
||
}else
|
||
this.Login(login,password,document.getElementById('save_'+this.uid).checked);
|
||
};
|
||
|
||
this.applyReq=function(req,fn,node)
|
||
{
|
||
// alert(getXMLNodeSerialisation(node));
|
||
|
||
if (fn==-1)
|
||
{
|
||
alert(findFirstNode(node,'#cdata-section').nodeValue);
|
||
}else if (fn==4)
|
||
{
|
||
//nodeToTable(node);
|
||
}else if (fn==7)
|
||
{
|
||
var cmd=getCdataValue(findFirstNode(node,"cmd"));
|
||
//alert('cmd='+cmd);
|
||
if(cmd==='0')
|
||
{
|
||
this.m_lo=getCdataValue(findFirstNode(node,"login")) == '0' ? false : true;
|
||
if(!this.m_lo)
|
||
{ this.showLoginForm();
|
||
}else
|
||
{
|
||
var name=getCdataValue(findFirstNode(node,"name"));
|
||
var user_name=document.getElementById('user_name');
|
||
if(user_name!=null) user_name.innerHTML=name;
|
||
|
||
//Информируем слушатеелй о логине
|
||
for(i=0;i<this.m_ls.length;i++)
|
||
if(this.m_ls[i]!==null)
|
||
this.m_ls[i].OnLogin(true); //0 - authorized, 1 - an incorrect username or password, 2 - left.
|
||
}
|
||
}else if(cmd==='1')
|
||
{
|
||
location.reload();
|
||
}else if(cmd==='2')
|
||
{
|
||
var login=getCdataValue(findFirstNode(node,"login")) == '0' ? false : true;
|
||
if(!login)
|
||
{ alert('Не удалось авторизоваться.\nНеверный логин и/или пароль.');
|
||
}else
|
||
{
|
||
this.m_lo=true;
|
||
this.win.Close();
|
||
|
||
var name=getCdataValue(findFirstNode(node,"name"));
|
||
var user_name=document.getElementById('user_name');
|
||
if(user_name!=null) user_name.innerHTML=name;
|
||
//Информируем слушатеелй о логине
|
||
for(i=0;i<this.m_ls.length;i++)
|
||
if(this.m_ls[i]!==null)
|
||
this.m_ls[i].OnLogin(true); //0 - authorized, 1 - an incorrect username or password, 2 - left.
|
||
}
|
||
}
|
||
|
||
//this.m_lo=getCdataValue(findFirstNode(node,"login")) == '0' ? true : false;
|
||
//if(this.m_lo && this.win.div!==null) this.win.hide(true);
|
||
//this.m_UserName=getCdataValue(findFirstNode(node,"name"));
|
||
|
||
}else
|
||
alert("Not known function! fn=\""+fn+"\"" );
|
||
|
||
this.win.hideProgressBar();
|
||
};
|
||
|
||
//l - login, p - password, s - allow or disallow auto-login!
|
||
this.Login=function(login,password,save)
|
||
{
|
||
if(save)
|
||
{ setCookie('GUID', guid(), 60, '/','','');
|
||
}else
|
||
{ setCookie('GUID', '', 60, '/','','');
|
||
}
|
||
|
||
|
||
|
||
var xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7">\n\
|
||
<cmd><![CDATA[2]]></cmd>\n\
|
||
<login><![CDATA['+login+']]></login>\n\
|
||
<password><![CDATA['+password+']]></password>\n\
|
||
</metadata>';
|
||
|
||
//alert(xs);
|
||
|
||
if(this.request.callServer(ScriptName,xs))
|
||
{
|
||
this.win.showProgressBar();
|
||
}
|
||
};
|
||
|
||
//logout current user
|
||
this.Exit=function()
|
||
{
|
||
if(this.request.callServer(ScriptName,'<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[1]]></cmd></metadata>'))
|
||
{
|
||
setCookie('GUID', '', 60, '/','','');
|
||
showProgressBar(document.body);
|
||
}
|
||
};
|
||
|
||
this.addListener=function(l)
|
||
{ if(l.OnLogin==null) alert('Object does not have the function "OnLogin()"!');
|
||
this.m_ls[this.m_ls.length]=l;
|
||
};
|
||
|
||
this.remListener=function(l)
|
||
{ for(i=0;i<this.m_ls.length;i++)
|
||
{ if(this.m_ls[i]==l)
|
||
this.m_ls[i]=null;
|
||
}
|
||
};
|
||
|
||
//Check whether the already authorized (+ attempt to log in through "hash").
|
||
this.LoadData=function()
|
||
{
|
||
var xs='<?xml version="1.0" encoding="utf-8"?><metadata fn="7"><cmd><![CDATA[2]]></cmd></metadata>';
|
||
|
||
//alert('xs='+xs);
|
||
|
||
this.request.callServer(ScriptName,xs);
|
||
};
|
||
|
||
TLogin.LoginIsOk=0; //login in
|
||
TLogin.LoginIsError=1; //Invalid password and / or login.
|
||
TLogin.LoginIsExit=2; //Exit
|
||
|
||
this.m_lo=false; //login in?
|
||
this.name='Login';
|
||
this.uid=getUID();
|
||
this.win=new TWin();
|
||
this.win.shadow=true;
|
||
|
||
this.m_ls=new Array(); //Listeners called OnLogin function.
|
||
this.guid='';
|
||
this.m_UserName=''; //Member Name
|
||
|
||
this.m_html=false;
|
||
|
||
this.request = new TRequest(this);
|
||
}*/
|
||
|
||
//Display password recovery form
|
||
function showRestoreForm()
|
||
{
|
||
var win=new TWin(true);
|
||
win.BuildGUI(10,10);
|
||
win.setCaption(trt("Password_recovery"));
|
||
|
||
str='<div id="TWin_DT_'+win.tWinId+'" style="width: 100%; height: 100%; padding: 4px; text-align: left;">\n\
|
||
<table border="0" cellpadding="0" cellspacing="0" style="width: 100%; height: 100%; padding: 0px;">\n\
|
||
<tr>\n\
|
||
<td style="padding: 2px; white-space: nowrap"><b>'+trt('Login')+' (E-mail)</b></td>\n\
|
||
<td style="padding: 2px;"><input type="text" maxlength="40" style="width: 100%; display: inline;" id="'+win.uid+'_email" name="login">\n\
|
||
<table id="'+win.uid+'_phone" style="width: 100%; display: none;" cellpadding="0" cellspacing="0"><tr><td style="white-space: nowrap;"><b>+7 ( </b><input type="text" maxlength="3" onkeydown="this.value = this.value.replace(/[^0-9]/g, \'\')" onkeyup="this.value = this.value.replace(/[^0-9]/g, \'\')" style="width: 35px; display: inline;" id="'+win.uid+'_phone0" value=""><b> ) </b></td><td style="width: 90%;"><input type="text" onkeydown="this.value = this.value.replace(/[^0-9]/g, \'\')" onkeyup="this.value = this.value.replace(/[^0-9]/g, \'\')" maxlength="7" style="width: 100%;display: inline;" id="'+win.uid+'_phone1" value=""></td></tr></table><br></td>\n\
|
||
</tr>\n\
|
||
<tr><td colspan="2" style="text-align: right; padding: 2px;"><input class="button-secondary" id="'+win.uid+'_restore" type="button" style="display: inline;" value="'+trt('Restore')+'"></td></tr>\n\
|
||
</table>\n\
|
||
</td></tr>\n\
|
||
</div>';
|
||
document.getElementById('TWin_Co_'+win.tWinId).innerHTML=str;
|
||
|
||
win.setSize("300px","100px");
|
||
|
||
//Центрируем окно и отображаем тень
|
||
if(win.tbl.offsetHeight>win.div.offsetHeight) win.div.style.height=win.tbl.offsetHeight+"px";
|
||
if(win.tbl.offsetWidth>win.div.offsetWidth) win.div.style.width=win.tbl.offsetWidth+"px";
|
||
win.setCenter();
|
||
win.shadow=true;
|
||
win.hide(false);
|
||
|
||
//Click on restore button
|
||
var obj=null;
|
||
obj=document.getElementById(win.uid+'_restore');
|
||
if(obj!=null)
|
||
{
|
||
obj.onclick=function(win)
|
||
{ return function()
|
||
{
|
||
win.showProgressBar();
|
||
//showProgressBar(document.getElementById('TWin_DT_'+win.tWinId),win.uid);
|
||
|
||
var em=document.getElementById(win.uid+'_email').value;
|
||
|
||
if(em==''){ document.getElementById(win.uid+'_email').select(); alert(trt('Not_filled_Email_address')); win.hideProgressBar(); return; }
|
||
if(! isEmail(em)){ document.getElementById(win.uid+'_email').select(); alert(trt('Please_enter_a_valid_email_address')); win.hideProgressBar(); return; }
|
||
|
||
//Send AJAX reqwest to server
|
||
var xml='<?xml version="1.0" encoding="utf-8"?>\
|
||
<metadata fn="7">\
|
||
<cmd><![CDATA[0]]></cmd>\
|
||
<login><![CDATA['+em+']]></login>\
|
||
<captcha><![CDATA[]]></captcha>\
|
||
</metadata>';
|
||
|
||
//Anonymous object
|
||
obj=new function(win)
|
||
{
|
||
this.processReqChange = function(xmlHttpRequest, url, xmlString)
|
||
{
|
||
if(typeof(xmlHttpRequest.status)=='undefined' || xmlHttpRequest.status == 200)
|
||
{
|
||
if(typeof(xmlHttpRequest.responseXML)=='undefined' && xmlHttpRequest.contentType.match(/\/xml/)) //For IE XDomainRequest
|
||
xmlHttpRequest.responseXML=CreateXMLDOC(xmlHttpRequest.responseText);
|
||
|
||
//загрузился xml документ начинаем его разбирать (по id функции в документе)
|
||
var xmldoc = xmlHttpRequest.responseXML
|
||
if(xmldoc==null) {
|
||
alert2(trt('Alert'), trt('Wrong_XML_document') + "!\n" + xmlHttpRequest.responseText);
|
||
return;
|
||
}
|
||
|
||
var node = xmldoc.documentElement;
|
||
if((node==null)||(node.getAttribute("fn")==null)) alert(trt('Error')+"\n "+trt("No_data")+"!\n"+xmlHttpRequest.responseText);
|
||
else
|
||
{
|
||
//alert("Принятый браузером XML=\n"+getXMLNodeSerialisation(node));
|
||
var fn = node.getAttribute("fn");
|
||
if (fn==-1)
|
||
{
|
||
alert(findFirstNode(node,'#cdata-section').nodeValue);
|
||
this.win.hideProgressBar();
|
||
}else
|
||
if(fn==7)
|
||
{
|
||
alert(findFirstNode(node,'#cdata-section').nodeValue);
|
||
this.win.Close();
|
||
}
|
||
}
|
||
}else
|
||
{
|
||
if(confirm(trt('Failed_to_get_data')+"\n URL: "+url+"\n"+xmlHttpRequest.statusText+"\nRedo the request?"))
|
||
{
|
||
var call=new myXMLHttpRequest(this);
|
||
call.callServer(url,xmlString);
|
||
}
|
||
}
|
||
return null;
|
||
};
|
||
this.win=win; //For close after showing message.
|
||
}
|
||
(win);
|
||
|
||
var call=new myXMLHttpRequest(obj);
|
||
call.callServer(ScriptName,xml);
|
||
|
||
};
|
||
}(win);
|
||
}
|
||
} |