var fajaxHost = false;
var fajaxProxyScript = false;
var fajaxFAC = false;
var fajaxFAC_EXPIRE = false;
var fajaxAuthor2CustomerIdentifier = new Array();
var fajaxCustomerIdentifier2Author = new Array();
var fajaxCustomerIdentifier2CustomerName = new Array();


function FAjax()
{
  // SetUserMapping
  this.SetUserMapping = function (mapping)
  {
    fajaxCustomerIdentifier2CustomerName = new Array();
    var m = mapping.split(",");
    for (var i = 0; i < m.length; i++)
    {
      p = m[i].split("=");
      fajaxCustomerIdentifier2CustomerName[p[0]] = p[1];
    }
  }

  // Init
  this.Init = function ()
  {
    var xml = this.SendSyncRequest("/authenticate.xml.php");
    if (xml)
    {
      fajaxFAC = xml.getElementsByTagName('FAC')[0].firstChild.data;
      fajaxFAC_EXPIRE = new Date(Date.parse(xml.getElementsByTagName('DATE_EXPIRE')[0].firstChild.data));
    }

    // Create user-id mapping
    xml = this.SendSyncRequest("/authors/author_list.xml.php");
    if (xml)
    {
      var l = xml.getElementsByTagName("AUTHOR");
      for (var i = 0; i < l.length; i++)
      {
        var idAuthor = l[i].getElementsByTagName('ID_AUTHOR')[0].firstChild.data;
        var clientIdentifier = l[i].getElementsByTagName('CLIENT_IDENTIFIER')[0].firstChild;
        
        fajaxAuthor2CustomerIdentifier[idAuthor] = clientIdentifier ? clientIdentifier.data : false;
        if (clientIdentifier) fajaxCustomerIdentifier2Author[clientIdentifier.data] = idAuthor;
      }
    }
  }

  // SendAsyncRequest
  this.SendAsyncRequest = function (Request, CB)
  {
    var far = new FAjaxRequest();
    far.AsyncRequest(Request, CB);
  }

  // SendSyncRequest
  this.SendSyncRequest = function (Request)
  {
    var far = new FAjaxRequest();
    return far.SyncRequest(Request);
  }

  // GetAuthorByClientIdentifier
  this.GetAuthorByClientIdentifier = function (ClientIdentifier)
  {
    return (fajaxCustomerIdentifier2Author[ClientIdentifier]) ? fajaxCustomerIdentifier2Author[ClientIdentifier] : false;
  }

  // GetClientIdentifierByAuthor
  this.GetClientIdentifierByAuthor = function (Author)
  {
    return (fajaxAuthor2CustomerIdentifier[Author]) ? fajaxAuthor2CustomerIdentifier[Author] : false;
  }

  // GetClientNameByAuthor
  this.GetClientNameByAuthor = function (Author)
  {
    var id = this.GetClientIdentifierByAuthor(Author);
    return (fajaxCustomerIdentifier2CustomerName[id]) ? fajaxCustomerIdentifier2CustomerName[id] : 'n.a.';
  }

  // ReadFanworkFile
  this.ReadFanworkFile = function (Fanwork)
  {
    var ret = this.SendSyncRequest("/fanworks/fanwork_file.xml.php?ID_FANWORK=" + Fanwork);
   
    return ret;
  }
}


function FAjaxRequest()
{
  this.Callback = null;
  this.req = null;

  this.AsyncRequest = function (URL, CB)
  {
    this.Callback = CB;
    
    this.req = getXMLHttpRequest();
  	if(this.req) 
  	{
  	  URL = fajaxHost + URL;
  	  
  	  if (fajaxFAC)
  	  {
  	    URL += ((URL.indexOf("?") > -1) ? "&FAC=" + fajaxFAC : "?FAC=" + fajaxFAC);
  	  }

  	  if (fajaxProxyScript)
  	  {
  	    URL = fajaxProxyScript + "?url=" + encodeURIComponent(URL);
  	  }
  	  
  	  var obj = this;
  		this.req.onreadystatechange = function(){StateCallback(obj);};
  		this.req.open("GET", URL, true);
  		this.req.send("");
  	}
  }
 
  // SyncRequest
  this.SyncRequest = function (URL, CB)
  {
    this.Callback = CB;
    
    this.req = getXMLHttpRequest();
  	if(this.req) 
  	{
  	  URL = fajaxHost + URL;
  	  
  	  if (fajaxFAC)
  	  {
  	    URL += ((URL.indexOf("?") > -1) ? "&FAC=" + fajaxFAC : "?FAC=" + fajaxFAC);
  	  }

  	  if (fajaxProxyScript)
  	  {
  	    URL = fajaxProxyScript + "?url=" + encodeURIComponent(URL);
  	  }
 
  		this.req.open("GET", URL, false);
  		this.req.send("");
  		var obj = this;
      //alert(obj.req.responseText);
  		
  	  return obj.req.responseXML;
  	}
  	return false;
  }
}


function StateCallback(obj)
{
  if (obj.req.readyState == 4)
  {
    if (obj.req.status == 200)
    {
      if (obj.Callback) 
      {
        //alert(obj.req.responseText);
        obj.Callback(obj.req.responseXML);
      }
    }
    else
    {
      alert("There was a problem retrieving the XML data:\n" + obj.req.statusText);
    }
  }
}


function getXMLHttpRequest()
{
	var req = false;
  if(window.XMLHttpRequest) 
  {
    try 
    {
		  req = new XMLHttpRequest();
		  if (!document.all) req.overrideMimeType("text/xml");
    } 
    catch(e) 
    {
		  req = false;
    }
  }
  else if(window.ActiveXObject) 
  {
    try
    {
      req = new ActiveXObject("Msxml2.XMLHTTP");
    } catch(e) {
      try 
      {
        req = new ActiveXObject("Microsoft.XMLHTTP");
      } catch(e) {
        req = false;
      }
		}
  }
  return req;
}
