/*Copyright blabla, Ezra */

/*Variabelen enzo */
var mailstorage = createXmlParser('<?xml version="1.0" encoding="UTF-8"?><mailstorage><user><server><![CDATA[]]></server><port><![CDATA[]]></port><username><![CDATA[]]></username><password><![CDATA[]]></password></user><emails nr="0"></emails></mailstorage>');

var user = new user_class();

/* Functies */
function new_session(){
  startWork();
  user.server = document.forms.serverprops.server.value;
  user.port = document.forms.serverprops.port.value;
  user.username = document.forms.serverprops.username.value;
  user.password = document.forms.serverprops.password.value;
  
  user.prefs = parse_prefs_bitmask();
  
  var conObj = createXmlHttp();
  var postString = "method=new_session&server=" + user.server + "&port=" + user.port + "&username=" + user.username + "&password=" + user.password + "&prefs=" + user.prefs;
  conObj.open("POST", "popper.php?rid=" + Math.random()*1000);
  conObj.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  conObj.setRequestHeader('Content-length', postString.length);
  //conObj.setRequestHeader('Connection', 'close');
  conObj.send(postString);
  conObj.onreadystatechange = function () {onEvent_new_session(conObj);};
}

function number_of_mails(){
  var conObj = createXmlHttp();
  var postString = "method=number_of_mails";
  conObj.open("POST", "popper.php?rid=" + Math.random() * 1000);
  conObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  conObj.setRequestHeader('Content-length', postString.length);
  //conObj.setRequestHeader('Connection', 'close');
  conObj.send(postString);
  conObj.onreadystatechange = function() {onEvent_number_of_mails(conObj);};
}

function get_mails(){
  number_of_mails();
  
  //rest of function will get called when number_of_mails is done;
}

function download_mails(){
  var mails = mailstorage.getElementsByTagName('emails')[0].attributes.getNamedItem("nr").value;
  if (mails > 0){
    download_mail(1);
  }
  else
  {
    stopWork();
  }
}

function download_mail(id){  
  var conObj = createXmlHttp();
  var postString = "method=get_mail&id=" + id;
  conObj.open("POST", "popper.php?rid=" + Math.random() * 1000);
  conObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  conObj.setRequestHeader('Content-length', postString.length);
  //conObj.setRequestHeader('Connection', 'close');
  conObj.send(postString);
  conObj.onreadystatechange = function() {onEvent_download_mail(conObj, id);}
}

function show_mail(){
  var mails = mailstorage.getElementsByTagName('emails')[0].attributes.getNamedItem("nr").value;
  var overzichtstr = "";
  var email = mailstorage.getElementsByTagName("email");
  var overzicht = document.getElementById("overzicht");
  for (i=0;i<mails;i++){  
    overzichtstr += "<div class='subjectselect' id='subj-" + email[i].attributes.getNamedItem("id").value + "' onclick='read_mail(" + email[i].attributes.getNamedItem("id").value + ");'>" + email[i].childNodes[0].childNodes[1].childNodes[0].data.substring(0,40) + "...</div>";
  }
  overzicht.innerHTML = overzichtstr;
  stopWork();
}

function clear_session(){
  var conObj = createXmlHttp();
  var postString = "method=clear_session";
  conObj.open("POST", "popper.php?rid=" + Math.random() * 1000);
  conObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
  conObj.setRequestHeader('Content-length', postString.length);
  //conObj.setRequestHeader('Connection', 'close');
  conObj.send(postString);
  conObj.onreadystatechange = function() {onEvent_clear_session(conObj);}
}

function read_mail(id){
  document.getElementById('mailbody').innerHTML = "";
  /*var email = mailstorage.getElementsByTagName('email');
  
  for(i=0;i<email.length;i++){
    if((blah = email[i].attributes.getNamedItem("id")).value == id){
      blah.style = "background: #def;"
      document.getElementById('mailbody').innerHTML = email[i].childNodes[1].childNodes[0].data;
      user.currentmail = i;
    }
  }*/
  
  var email = getMail(id);
  document.getElementById('mailbody').innerHTML = email.childNodes[1].childNodes[0].data;
  user.currentmail = id;
}

function delete_mail(){
  if (user.currentmail != 0) {
    startWork();
    var conObj = createXmlHttp();
    var postString = "method=delete_mail&id=" + user.currentmail;
    conObj.open("POST", "popper.php?rid=" + Math.random() * 1000);
    conObj.setRequestHeader('Content-Type','application/x-www-form-urlencoded');
    conObj.setRequestHeader('Content-length', postString.length);
    //conObj.setRequestHeader('Connection', 'close');
    conObj.send(postString);
    conObj.onreadystatechange = function() {onEvent_delete_mail(conObj);}
  }
}

/* Event Handlers */
function onEvent_new_session(conObj){  
  if (conObj.readyState == 4 && conObj.status == 200){
    var xmlObj = createXmlParser(conObj.responseText);
    if (xmlObj.getElementsByTagName('status')[0].childNodes[0].data == "SUCCESS"){
      get_mails();
    }
    else if(xmlObj.getElementsByTagName('status')[0].childNodes[0].data == "ERROR"){
      document.getElementById("overlay").style.visibility = "visible";
      document.getElementById("popup").style.visibility = "visible";
      document.getElementById("popuptekst").innerHTML = xmlObj.getElementsByTagName('errormsg')[0].childNodes[0].data;
      stopWork();
    }
  }
}

function btn_Close(){
  document.getElementById("overlay").style.visibility = "hidden";
  document.getElementById("popup").style.visibility = "hidden";
}

function onEvent_number_of_mails(conObj){
  if (conObj.readyState == 4 && conObj.status == 200){
    xmlObj = createXmlParser(conObj.responseText);
    if(xmlObj.getElementsByTagName('status')[0].childNodes[0].data == "ERROR"){
      document.getElementById("overlay").style.visibility = "visible";
      document.getElementById("popup").style.visibility = "visible";
      document.getElementById("popuptekst").innerHTML = xmlObj.getElementsByTagName('errormsg')[0].childNodes[0].data;
      stopWork();
    }else{
      var mails = xmlObj.getElementsByTagName('mailsnr')[0].childNodes[0].data;
      document.getElementById('overzichtmenu').innerHTML = "<b>" + mails + "</b> mails found in Inbox";
      mailstorage.getElementsByTagName('emails')[0].attributes.getNamedItem("nr").value = mails;
      download_mails();
    }
  }
}

function onEvent_download_mail(conObj, id)
{
  if (conObj.readyState == 4 && conObj.status == 200){
    var xmlObj = createXmlParser(conObj.responseText);
    
    var temp;
    
    /* ---------------------------------------------  */
    if(mailstorage.importNode){      
      temp = mailstorage.importNode(xmlObj.getElementsByTagName("email")[0], true);
    }else if(mailstorage.adoptNode){
      temp = mailstorage.adoptNode(xmlObj.getElementsByTagName("email")[0]);
    }else{
      temp = xmlObj.getElementsByTagName("email")[0];
    }
     /* --------------------------------------------- */
    
    try{
      mailstorage.getElementsByTagName("emails")[0].appendChild(temp);
    }catch(e){
      alert("An Error Occurred");
      var errorstring = ""
      for (i in e){
        errorstring += i + "::" + e[i] + "\n";  
      }
      alert(errorstring);
      delete errorstring;
    }
    //Start downloading the next mail over here...  
    var mails = mailstorage.getElementsByTagName('emails')[0].attributes.getNamedItem("nr").value;
    if ((id+1) <= mails){
      download_mail(id+1);
    }else{
      show_mail();
    }
  }  
}

function onEvent_clear_session(conObj){
  if (conObj.readyState == 4 && conObj.status == 200){
    var xmlObj = createXmlParser(conObj.responseText);
    var status = xmlObj.getElementsByTagName("status")[0]
 
    if (status.childNodes[0].data == "SUCCESS") {
    //Als gelukt:
    user.clear();
    
    document.getElementById("overzichtmenu").innerHTML = "";
    document.getElementById("mailbody").innerHTML = "";
    document.getElementById("overzicht").innerHTML = "";
      
    }else{
      document.getElementById("mailbody").innerHTML = xmlObj.getElementsByTagName("errormsg")[0].childnodes[0].data;
    }
  }
}

function onEvent_delete_mail(conObj) {
  if (conObj.readyState == 4 && conObj.status == 200){
    var xmlObj = createXmlParser(conObj.responseText);
    var status = xmlObj.getElementsByTagName("status")[0];
    if (status.childNodes[0].data == "SUCCESS"){
      //clear all maildata
      document.getElementById("overzichtmenu").innerHTML = "";
      document.getElementById("mailbody").innerHTML = "";
      document.getElementById("overzicht").innerHTML = "";
      //download new mails;
      get_mail();
    }
  }
}

/* Hulp Functies */
function createXmlHttp(){
  if (window.XMLHttpRequest){         // code for Mozilla, etc.
    try{
      return new XMLHttpRequest();
    }catch(e){
      return false;
    }
  }
  else if (window.ActiveXObject){     // code for IE
    try{
      return new ActiveXObject("Microsoft.XMLHTTP");
    }catch(E){
      return false;
    }
  }
  else if(window.createRequest){
    try{
      return window.createRequest();
    }catch(e){
      return false;
    }
  }
}

function createXmlParser(inputxml){
  if (window.ActiveXObject){          // code for IE
    var xml = new ActiveXObject("Microsoft.XMLDOM");
    xml.async = "false";
    if (inputxml){
      xml.loadXML(inputxml);
      return xml;
    }
  }
  else{                                 // code for Mozilla, Firefox, Opera, etc.
    var xml = new DOMParser();
    if (inputxml){
      return xml.parseFromString(inputxml, "text/xml");      
    }
  }
}

function onKeyDownEvent(e){
  if(window.event){       //IE
    return window.event.keyCode;
  }
  else if(e.which){       // Netscape/Firefox/Opera
    return e.which;
  }
}

function startWork(){
  document.getElementById('LoadingImg').style.display = "";
}
function stopWork(){
  document.getElementById('LoadingImg').style.display = "none";
}

function getMail(id){
  var email = mailstorage.getElementsByTagName('email');
  
  for(i=0;i<email.length;i++){
    if((blah = email[i].attributes.getNamedItem("id")).value == id){      
      return email[i];     
    }
  }
}

function parse_prefs_bitmask(){
  var value = 0;
  if (document.forms.serverprops.ssl.checked) value = value | 1;
  if (document.forms.serverprops.tls.checked) value = value | 2;
  if (document.forms.serverprops.gmail.checked) value = value | 4; 
  return value;
}

/* Classes */
function user_class(){
/* Properties */
  this.server = "";
  this.port = 110;
  this.username = "";
  this.password = "";
  this.currentmail = 0;
  
  this.prefs = 0;
  
/* methods */
  this.clear = function(){
                          this.server = "";
                          this.port = 110;
                          this.username = "";
                          this.password = ""
                          this.currentmail = 0;
                        };
  
}