/*
AjaxExplorer Copyright (C) 2007-2008 Syed Mohammad Sidque Tahir Al-Habshi

This program is free software: you can redistribute it and/or modify
it under the terms of the GNU General Public License as published by
the Free Software Foundation, either version 3 of the License, or
(at your option) any later version.

This program is distributed in the hope that it will be useful,
but WITHOUT ANY WARRANTY; without even the implied warranty of
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. Head to
GNU site http://www.gnu.org/licenses/ for license copy.
*/

function userAccess(flag)
{
  menuGenerate('P');
  writeAt('desktop', '');
  writeAt('sign-fail', '');
  display('door', flag? 0:1);
  display('canvas', halt=flag? 0:1);

  if(flag)
  {
    userSystemHide();
    get('user-icon').src=get('sign-icon').src;
    ajaxRequest('record', '');
  }
}

function userAgent()
{
  var navi=navigator.userAgent;
  var a=new Array('MSIE', 'Firefox', 'Opera', 'Safari');
  var b=new Array('Internet Explorer', 'Mozilla Firefox', 'Opera', 'Safari');

  for(var i=0; i<4; i++)
  {
    if((p=navi.indexOf(a[i]))!=-1) return b[i]+' '+navi.substr((p+1+a[i].length), 3);
  }

  return 'Unsupported';
}

function userCheckDone(flag)
{
  writeAt('H10', '<img alt="" src="images/'+(flag? 'yes':'no')+'.gif" />')
}

function userCheckPath()
{
  ajaxRequest('dirpath', 'path='+get('H11').value);
}

function userCreate(obj, evt)
{
  var name='';
  evt=evt || event;

  if(evt.keyCode!=13 || !(name=obj.value)) return;

  display('H1', 0);
  display('H2', 0);
  obj.value='';

  if((','+userList.toString().toLowerCase()+',').indexOf(','+name.toLowerCase()+',')==-1)
  {
    ajaxRequest('ucreate', 'name='+name);
  }
}

function userCreateDone(data)
{
  userList.push(data.split(':'));
  userGenerate();
}

function userDelete(id)
{
  display('H1', 0);
  display('H2', 0);

  if(confirm('Do you want to delete '+userList[id][0]+'?')) ajaxRequest('udelete', 'user='+id);
}

function userDeleteDone(data)
{
  userList[data]='';
  userGenerate();
}

function userError(msg, url, line)
{
  if(get('error').innerHTML.indexOf(msg)==-1)
  {
    fail++;
    url=url.split('/');
    get('fail').title='System Failure ('+fail+')';
    if(fail<2) get('fail').src='images/failure.gif';
    writeAt('error', '<br />- '+msg+'<br />in '+url[(url.length-1)]+' on line '+line, 1);
  }
}

function userErrorReset()
{
  get('fail').title='System Failure';
  get('fail').src='images/failoff.gif';
  writeAt('error', '');
  fail=0;
}

function userErrorSend()
{
  var text=('Browser: '+userAgent()+get('error').innerHTML).replace(/<br>/g, '\n');

  if(what=prompt('Do you want to send error report to smsid.hyperphp.com?\nOnly below information will be send to the site, nothing else!\n\n'+text, 'How does the error take place?'))
  {
    window.open('http://smsid.hyperphp.com/error/?occur='+what.replace(/&/g, '*')+'&error='+text.replace(/&/g, '*'));
    userErrorReset();
  }
}

function userExit()
{
  halt=1;
  if(load) opener.subs=0;
}

function userField(obj, flag)
{
  if(obj.value.indexOf('|')==-1)
  {
    dirs=0;
    userTips(3);
    if(flag) userFieldList(obj);
    flag || !list? display('list', edit=flag):obj.focus();
  }
  else obj.blur();
}

function userFieldKey(obj, evt)
{
  evt=evt || event;
  switch(evt.keyCode)
  {
    case 13:
	obj.blur();
	return;
    case 38:
	if(fileTemp.length==1) return; else dirs--;
	obj.value=fileTemp[dirs=dirs<1? 1:dirs];
	break;
    case 40:
	if(fileTemp.length==1) return; else dirs++;
	obj.value=fileTemp[dirs=dirs>=fileTemp.length? fileTemp.length-1:dirs];
	break;
    default: userFieldList(obj);
  }
}

function userFieldList(obj)
{
  var text='';
  fileDirs.sort();
  fileTemp=Array('0');

  for(var i=0; i<fileDirs.length; i++)
  {
    var name=fileDirs[i];
    if(name!=dvrt+obj.value && name.indexOf(obj.value)!=-1)
    {
      name=name.substr(dvrt.length);
      text+='<div class="glow" onmousedown="fileCaller(\''+name+'\', dvrt)">'+name+'</div>';
      fileTemp.push(name);
    }
  }

  writeAt('list', text);
}

function userGenerate()
{
  var name='', text='';

  for(var i=1; i<userList.length; i++)
  {
    if(name=userList[i][0]) text+=(i==1? '':'<span class="right"><img alt="" src="images/lock.gif" title="Set Permission" onclick="userSetPerm('+i+')" /> <img alt="" src="images/keys.gif" title="Set Password" onclick="userSetPass('+i+')" /> <img alt="" src="images/delete.gif" title="Delete" onclick="userDelete('+i+')" /></span>')+'<img alt="" src="user/'+name+'/My Profile/icon.jpg" class="user" onerror="this.src=\'images/noicon.png\'" /> '+name+'<br /><br />';
  }

  writeAt('S18', text);
}

function userGoBack()
{
  if(cdir>0)
  {
    strd=0;
    cdir--;
    get('dirc').value=fileDirc[cdir];
    fileBrowse(0);
  }
}

function userGoForward()
{
  if(fileDirc.length>(cdir+1))
  {
    strd=0;
    cdir++;
    get('dirc').value=fileDirc[cdir];
    fileBrowse(0);
  }
}

function userIcon(obj)
{
  get('sign-icon').src=obj? 'user/'+obj.value.toLowerCase()+'/My Profile/icon.jpg':'images/noicon.png';
}

function userKeyArrow(data)
{
  if(maxs==1) return;
  if(!keys) fileSelectNone();

  switch(data)
  {
    case 1: var c=1;	if(park>c) park-=c; break;
    case 2: var c=rows;	if(park>c) park-=c; break;
    case 3: var c=-1;	if(maxs>(park-c)) park-=c; break;
    case 4: var c=-rows;if(maxs>(park-c)) park-=c; break;
  }

  fileSelect(park);
  menuGenerate('P');
}

function userKeyDown(evt)
{
  evt=evt || event;

  switch(evt.keyCode)
  {
    case 13:
	if(!halt)
	{
	  if(edit==0) fileOpen();
	  if(edit==1) fileBrowse(0);
	  if(edit==2) fileSearch();
	  if(edit==3) fileRenaming();
	  if(edit==4) break;
	}
	else if(halt==1) userSignIn();
	break;

    case 16: if(!halt) keys=1; break;
    case 17: if(!halt) keys=2; break;

    case 27: halt? (halt==2? userSystemSave(0):0):userSignOut(); return false;
    case 37: if(!halt && !edit && !menu){ userKeyArrow(1); return false; } break;
    case 38: if(!halt && !edit && !menu){ userKeyArrow(2); return false; } break;
    case 39: if(!halt && !edit && !menu){ userKeyArrow(3); return false; } break;
    case 40: if(!halt && !edit && !menu){ userKeyArrow(4); return false; } break;
    case 46: if(!halt && !edit) fileDelete(); break;

    case 65: if(!halt && !edit && keys==2){ fileSelectAll(); return false; } break;
    case 67: if(!halt && keys==2) fileCopy(0); break;
    case 68: if(!halt && keys==2) filDelete(); break;
    case 81: if(!halt && keys==2) fileProperty(); break;
    case 86: if(!halt && keys==2) filePaste(0); break;
    case 88: if(!halt && keys==2) fileCopy(1); break;

    case 112: window.open('readme.htm'); return false;
    case 113: if(halt!=1) userSystem(1); return false;
    case 114: if(halt!=1) userSystem(2); return false;
    case 115: if(halt!=1) userSystem(3); return false;
    case 116: if(halt!=1 && !mode) fileBrowse(0); return false;
    case 117: if(halt!=1) fileFolder(); return false;
    case 118: if(halt!=1) userSystem(4); return false;
  }
}

function userKeyUp(evt)
{
  if(halt) return;
  evt=evt || event;

  switch(evt.keyCode)
  {
    case 16: keys=0;
    case 17: keys=0;
  }
}

function userLoad(flag)
{
  var temp='';
  ajaxRequest('record', '');
  document.title='File Manager - AjaxExplorer';

  fileDirc.push(dirc);
  fileDirs=((temp=getData('storage'))? temp:setData('storage', '')).split(',');

  safe=(temp=parseInt(getData('safemode')))? temp:0;
  set1=(temp=parseInt(getData('setting1')))? temp:400;
  
  fileImageDir((temp=parseInt(getData('section')))? temp:0);

  switch(window.self.name)
  {
    case 'mini':
	for(var i=1; i<5; i++) menuToogle('B'+i, 1);
	load=1;
	tips=0;
	break;
    default:
	for(var i=1; i<6; i++) menuToogle('B'+i, 2);
	break;
  }

  obj=get('body');
  obj.style.backgroundImage='url('+getData('wallpaper')+')';
  obj.style.display='block';
  obj.focus();

  userScreen();
  userAccess(flag);
}

function userMouseDown(evt)
{
  if(halt || stop) return;
  if(mode) evt=evt || event;
  var tX=cX+sX, tY=cY+sY;

  if(skip && !keys && !menu && evt.button!=2)
  {
    fileDetail(0);
    fileSelectNone();
    userSystemHide();
  }

  if(over && !move)
  {
    fileSelect();
    hold=over;
    skip? 0:fileRename();
  } else {
    hX=tX;
    hY=tY;
  }
}

function userMouseMenu()
{
  if(!halt && !load && !menu && !stop) menuShow();
  return false;
}

function userMouseMove(evt)
{
  if(mode)
  {
    evt=evt || event;
    evt.target=evt.target || evt.srcElement;
  }

  cX=evt.clientX;
  cY=evt.clientY;

  var name=evt.target.className;
  over=name=='drag' || name=='over'? evt.target.id:0;

  if(!over) skip=1;
  if(hold && !drag) filePick();
  if(drag) fileDrag((dX+=cX+sX-gX), (dY+=cY+sY-gY));
  if(rtmr && (drag || menu || move || skip)) clearTimeout(rtmr);
  if(!drag && !edit && !halt && !menu && hX>nX && hY>nY && hX<mX && hY<mY) fileSelectBox();

  gX=cX+sX;
  gY=cY+sY;

  return false;
}

function userMouseUp(evt)
{
  if(halt || stop) return;
  if(mode)
  {
    evt=evt || event;
    evt.target=evt.target || evt.srcElement;
  }

  mrk1=mrk2='';
  if(drag) fileDrop();
  menu? menuExecute(evt.target.id):menuHide();

  var temp=0;
  time=new Date();
  temp=time.getTime();
  dly1=dly2? dly2:temp+set1;
  dly2=temp;

  if(move)
  {
    for(var i=1; i<=maxs; i++)
    {
      if(obj=get('item'+i))
      {
	if(obj.className=='mark') mrk2+=':'+i+':';
      }
    }
  }
  else if(!skip && over==sver && evt.button!=2 && dly2-dly1<set1) fileOpen();

  if(over) sver=over;
  hX=hY=hold=move=skip=0;
  display('select', 0);
  menuGenerate('P');
}

function userRecordLoad(data)
{
  var q=location.href.split('?'), a=data.split(':'), b=q[0].split('/'), c=a[2].split('/');
  href='/';

  usid=a[0];
  usnm=a[1];
  root=a[2];
  path=a[3];
  for(var i=3; i<(c.length+2); i++) href+=b[i]+'/';

  dirc=q[1]? q[1]+'/':getData('address');
  dvrt=(temp=getData('reroute'))? temp:path;

  getDirc();
  if(usid!='0') fileBrowse(0);
}

function userResize()
{
  wX=mode? document.body.clientWidth:self.innerWidth;
  wY=mode? document.body.clientHeight:self.innerHeight;

  fileSort();
}

function userScreen()
{
  mX=document.body.scrollWidth-3;
  mY=document.body.scrollHeight-5;
  wX=mode? document.body.clientWidth:self.innerWidth;
  wY=mode? document.body.clientHeight:self.innerHeight;
}

function userScroll()
{
  sX=document.body.scrollLeft;
  sY=document.body.scrollTop;
}

function userSetPass(id)
{
  user=id;
  userSystemSet(2);
}

function userSetPassSave()
{
  obj1=get('H20');
  obj2=get('H21');
  txt1=obj1.value;
  txt2=obj2.value;
  obj1.value=obj2.value='';

  if(txt2.length>4)
  {
    if(txt1==txt2)
    {
      userSystemHide(2);
      ajaxRequest('setuser', 'user='+user+'&save=2&pass='+MD5(txt2));
    }
    else alert('Your password does not match!');
  }
  else alert('Your password must be at least 5 characters long!');
}

function userSetPerm(id)
{
  user=id;
  writeAt('H10', '');
  get('H11').value=userList[id][1];
  get('H12').checked=userList[id][2] & 0x0001? 'checked':'';
  get('H13').checked=userList[id][2] & 0x0002? 'checked':'';
  get('H14').checked=userList[id][2] & 0x0004? 'checked':'';
  get('H15').checked=userList[id][2] & 0x0008? 'checked':'';

  userSystemSet(1);
}

function userSetPermSave()
{
  var numb=0;

  for(var i=2; i<6; i++)
  {
    obj=get('H1'+i);
    numb-=obj.checked? -obj.value:0;
  }

  userSystemHide(1);
  ajaxRequest('setuser', 'user='+user+'&save=1&path='+getSwap(userList[user][1]=get('H11').value)+'&perm='+(userList[user][2]=numb));
}

function userSignIn()
{
  ajaxRequest('access', 'user='+get('user').value+'&pass='+MD5(get('pass').value));
  get('pass').value='';
}

function userSignOut()
{
  if(confirm('Do you want to sign out?'))
  {
    setData('address', '');
    setData('reroute', '');
    ajaxRequest('logout', '');
  }
}

function userSignReply(flag)
{
  flag? userAccess(1):writeAt('sign-fail', 'Your login combination does not match!');
}

function userSystem(id)
{
  if(load) return;
  menuHide();
  syst=id;

  id!=1 && id!=3? userSystemLoad():ajaxRequest('system', 'load='+id);
}

function userSystemDone(data)
{
  data? writeAt('E11', data):userSystemHide();
}

function userSystemHide(id)
{
  if(!id)
  {
    display('system', syst=0);
    writeAt('E11', '');
    display('H1', 0);
    display('H2', 0);
  }
  else display('H'+id, 0);
}

function userSystemLoad(data)
{
  var a=data? data.split('|'):0;

  switch(syst)
  {
    case 1:
	userList=new Array();
	for(var i=0; i<a.length; i++) userList[i]=a[i].split(':')
	if(usid==1) userGenerate();

	writeAt('S10', userList[usid][0]);
	writeAt('S11', userList[usid][1]);
	get('S12').src='images/'+(userList[usid][2] & 0x0001? 'yes':'no')+'.gif';
	get('S13').src='images/'+(userList[usid][2] & 0x0002? 'yes':'no')+'.gif';
	get('S14').src='images/'+(userList[usid][2] & 0x0004? 'yes':'no')+'.gif';
	get('S15').src='images/'+(userList[usid][2] & 0x0008? 'yes':'no')+'.gif';
	get('S16').value=get('S17').value='';
	break;
    case 2:
	get('S21').value=getData('wallpaper');
	get('S22').value=fileDirs.sort().toString().replace(/,/g, '\n');
	get('S23').value=getData('clip_task');
	get('S24').value=getData('clip_from');
	get('S25').value=getData('clip_file').replace(/\|/g, '\n');
	get('S26').checked=safe=='1'? 'checked':'';
	get('S27').value=set1;
	break;
    case 3:
	for(s=1; s<6; s++) get('S3'+s).checked=a[(s-1)]=='1'? 'checked':'';
	get('S36').value=a[5];
	break;
  }

  userSystemShow();
}

function userSystemSave()
{
  var data='';

  switch(syst)
  {
    case 1:
	if(get('T12').style.display=='block')
	{
	  if(get('S16').value.length>4)
	  {
	    ajaxRequest('change', 'pass='+MD5(get('S16').value)+'&rfer='+get('S17').value);
	  }
	  else writeAt('E11', 'Your password must be at least 5 characters long!');
	}
	else userSystemHide();
	break;

    case 2:
	fileWallpaper(get('S21').value, 1);
	setData('storage', fileDirs=get('S22').value.replace(/\r/g, '').split('\n'));
	setData('clip_task', get('S23').value);
	setData('clip_from', get('S24').value);
	setData('clip_file', get('S25').value.replace(/\r/g, '').replace(/\n/g, '|'));
	setData('safemode', safe=get('S26').checked? 1:0);
	setData('setting1', set1=get('S27').value);
	userSystemHide();
	break;

    case 3:
	ajaxRequest('setting', 's1='+(get('S31').checked? 1:0)+'&s2='+(get('S32').checked? 1:0)+'&s3='+(get('S33').checked? 1:0)+'&s4='+(get('S34').checked? 1:0)+'&s5='+(get('S35').checked? 1:0)+'&s6='+get('S36').value);
	userSystemHide();
	break;
  }
}

function userSystemSet(id)
{
  get('H'+(id==1? 2:1)).style.display='none';
  obj=get('H'+id).style;
  obj.top=cY+'px';
  obj.left=cX+'px';
  obj.display='block';
}

function userSystemShow()
{
  if(!userSystemSub(1)) return;
  for(var i=1; i<6; i++) display('S'+i, i==syst? 1:0);

  display('system', 1);
}

function userSystemSub(id)
{
  var c=1;

  display('H1', 0);
  display('H2', 0);

  switch(syst)
  {
    case 1: case 2: c=4; break;
    case 3: case 5: c=3; break;
  }

  if(id==3 && syst==1 && usid!=1)
  {
    alert('You do not have the permission!');
    return 0;
  }

  for(var i=1; i<c; i++) display('T'+syst+i, i==id? 1:0);
  return 1
}

function userTips(what)
{
  if(!tips) return;
  var text='';

  switch(what)
  {
    case 1:
	text='Press \'<b>F6</b>\' to toggle left panel.<br />Click folder\'s icon to open or refresh subfolder tree.';
	break;
    case 2:
	text='Hover any above files to know it\'s origin directory.';
	break;
    case 3:
	text='Press \'<b>Arrow</b>\' key down or up to go through stored address list.';
	break;
    case 4:
	text='You may drop the item to <b>Folders</b> directory to move it.<br />Press \'<b>F6</b>\' key to open <b>Folders</b>.';
	break;
    case 5:
	text='Type in username and press enter to create new user.';
	break;
  }

  writeAt('tipz', text);
  display('tips', what);
}

function textLoadDone(data){ return; }
document.oncontextmenu=userMouseMenu;
document.onmousedown=userMouseDown;
document.onmousemove=userMouseMove;
document.onmouseup=userMouseUp;
document.onkeydown=userKeyDown;
document.onkeyup=userKeyUp;
onresize=userResize;
onscroll=userScroll;
onerror=userError;