﻿/* <gslb_version version="V0.0.0/BL0001" /> */
/* Copyright © GalaSoft Laurent Bugnion 2006 - 2007 */
/* Last base level: BL0001 */

// TODO Implement POST
// TODO Check escape/unescape with spaces, etc...
// TODO Texts as constants

if ( !window.gslb )
{
  window.gslb = function()
  {
  }
}

// strUrl is optional
gslb.CAjaxPox = function( strUrl )
{
  this.m_strUrl = strUrl;
  
  if ( !this.m_strUrl
    || this.m_strUrl.length == 0 )
  {
	  throw "Invalid URL";
  }
}

gslb.CAjaxPox.EMode = new Object();
gslb.CAjaxPox.EMode.eHead = 0;
gslb.CAjaxPox.EMode.eGet = 1;
gslb.CAjaxPox.EMode.ePost = 2;

gslb.CAjaxPox.HTTP_READY_STATE = 4;

gslb.CAjaxPox.prototype.send = function( eMode, htParameters, fnCallback )
{
  var oHttp = null;
  if ( window.XMLHttpRequest )
  {
    oHttp = new window.XMLHttpRequest();
  }
  else
  {
    if ( window.ActiveXObject )
    {
      oHttp = new window.ActiveXObject( "Microsoft.XMLHTTP" );
    }
    else
    {
      throw "UNSUPPORTED PLATFORM";
    }
  }
  if ( !oHttp )
  {
	  throw "Cannot create XmlHttpRequest";
  }

  switch ( eMode )
  {
    case gslb.CAjaxPox.EMode.eHead:
      var strQuery = gslb.CAjaxPox.getQueryString( htParameters );
      oHttp.open( "HEAD", this.m_strUrl + strQuery, ( fnCallback != null ) ); // true = async, false = sync
      break;
      
    case gslb.CAjaxPox.EMode.eGet:
      var strQuery = gslb.CAjaxPox.getQueryString( htParameters );
      oHttp.open( "GET", this.m_strUrl + strQuery, ( fnCallback != null ) ); // true = async, false = sync
      break;

    case gslb.CAjaxPox.EMode.ePost:
      throw "POST not supported yet";
      break;
      
    default:
      throw "Invalid mode";
  }

  if ( fnCallback )
  {
    oHttp.onreadystatechange = function()
    {
      if ( oHttp.readyState == gslb.CAjaxPox.HTTP_READY_STATE )
      {
        // TODO Add status, error
        var oResult = new gslb.CAjaxPox.CResult( oHttp );
        oHttp = null;
        fnCallback( oResult );
      }
    }
    oHttp.send( null );
  }
  else
  {
    oHttp.send( null );
    var oResult = new gslb.CAjaxPox.CResult( oHttp );
    oHttp = null;
    return oResult;
  }  
}

gslb.CAjaxPox.getQueryString = function( htParameters )
{
  var strQuery = "";
  if ( htParameters )
  {
    for ( var strKey in htParameters )
    {
      if ( strQuery.length > 0 )
      {
        strQuery += "&";
      }
      else
      {
        strQuery += "?";
      }
      
      strQuery += strKey
        + "="
        + unescape( htParameters[ strKey ] );
    }
  }
  return strQuery;
}

gslb.CAjaxPox.CResult = function( oHttp )
{
  this.m_docXml = oHttp.responseXML;
  this.m_strText = oHttp.responseText;
  
  // TODO Status, Error
  this.m_iStatus = oHttp.status;
  this.m_strStatus = oHttp.statusText;
}