// ***************************************************************************************
/* BEGIN    Ajax library to deal with Ajax stuff...
            Andres Mercader June 2006

            Based on the AJAX Framework created by Phil O'Dwyer
// ****************************************************************************************/

var m_request = null;
var m_fieldID = "";
var m_returnVal = "";


// *** Entry procedure *****************************************************************
function CallAjaxURL( url, _receivingmethod, sendmethod ){

//    we use a javascript feature here called "inner functions" using these means
//    the local variables retain their values after the outer function has returned.
//    this is useful for thread safety, so reassigning the onreadystatechange
//    function doesn't stomp over earlier requests.

//    receivingmethod is the name of the js function that will receive the response.
//    If no method is passed, uses the default ProcessAjaxReturnedData(). This method MUST BE CODED IN THE SAME .JS UNIT THAT CALLED CallAjaxUrl().

          function ajaxBindCallback(){

                // Fired whenever something happens: 0=Uninitialized, 1=Loading, 2=Loaded, 3=Interactive, 4=Complete
                if ( ajaxRequest.readyState == 4 )
                {
                      if ( ajaxRequest.status == 200 )                      //  Everything is OK
                      {
                            if ( ajaxCallback )
                            {
                                  var l_responseData = trimSpacesFromRequest( ajaxRequest.responseText );

                                  if ( _receivingmethod ) {
                                    _receivingmethod(l_responseData);
                                  }
                                  else {
                                    ProcessAjaxReturnedData( l_responseData );
                                  }
                            }
                      }
                      else
                      {
                        // An error has occur. Most likely the session expired. Return to index page
                          window.location = "/"; // alert("There was a problem retrieving the data:\n" + ajaxRequest.status + ":\t" + ajaxRequest.statusText + "\n" + ajaxRequest.responseText);
                      }
                }
          }


  var ajaxRequest = null;                                           // use a local variable to hold our request and
  var ajaxCallback = true;                                          //  callback until the inner function is called...
  
  if (!sendmethod)
      sendmethod = 'POST';

  // Make http request
  // Mozilla
  if ( window.XMLHttpRequest )                                     // bind callback then hit the server...
  {
        ajaxRequest = new XMLHttpRequest();
        ajaxRequest.onreadystatechange = ajaxBindCallback;         // To be executed when the request has been answered by the server. Independent methods for each call to respond to each request independently.
        ajaxRequest.open(sendmethod, url, true);                     //true: asynchronous by default, so whenever the request has been answered it will execute checkReadyState
        ajaxRequest.send( null );
  }
  // IE
  else
  {
        if ( window.ActiveXObject )
        {
              ajaxRequest = new ActiveXObject( "Microsoft.XMLHTTP" );

              if ( ajaxRequest )
              {
                    ajaxRequest.onreadystatechange = ajaxBindCallback;
                    ajaxRequest.open(sendmethod, url, true);
                    ajaxRequest.send();
              }
        }
  }
}


// ***************************************************************************************
function trimSpacesFromRequest( a_value ){

      var l_length = a_value.length;
      var l_returnValue = "";
      var l_char = "";
      var l_spaceChar = ' ';
      var repVal = /\r/gi;

      a_value = a_value.replace(repVal, "");

      repVal = /\n/gi;

      a_value = a_value.replace(repVal, "");

      return a_value;
}
// ***************************************************************************************
function ProcessAjaxReturnedData(data){

  alert(data);  // Shouldn't be used. Use _receivingmethod instead.
}
// ***************************************************************************************
function EncodeHtml(text) {

    var Result = text;
    
    Result = EncodeHtmlItem(Result, '&', "&amp;");
    Result = EncodeHtmlItem(Result, '<', "&lt;");
    Result = EncodeHtmlItem(Result, '>', "&gt;");
    /*
    Result = encodeitem(Result, /\r\n/, "<br/>");
    Result = encodeitem(Result, /\n/, "<br/>");
    Result = encodeitem(Result, /\r/, "<br/>");
    */
        
    return (Result);
}

function EncodeHtmlItem(sometext, item, replacewith) {

    if (sometext && item && replacewith) {
        var myRegExp = new RegExp(item, "g");  // "g"=all occurrences

        return sometext.replace(myRegExp, replacewith);
    }
} 


// ***************************************************************************************
/* END    Ajax library to deal with Ajax stuff... */
// ***************************************************************************************



// ***************************************************************************************
/* BEGIN DotNetRemoting JavaScript Serializer/Deserializer */
// ***************************************************************************************
var isIE = navigator.userAgent.toLowerCase().indexOf("msie") > -1;
var isMoz = document.implementation && document.implementation.createDocument;

// main entry for serialization  
// JavaScript object as an input
// usage: JSerialize(MyObject);
// other parameters objectName, indentSpace may be omitted
function JSerialize(ObjectToSerilize, objectName, indentSpace) {
    indentSpace = indentSpace ? indentSpace : '';

    var Type = GetTypeName(ObjectToSerilize);

    var s = indentSpace + '<' + objectName + ' type="' + Type + '">';

    switch (Type) {
        case "number":
        case "string":
        case "boolean":
            {
                s += ObjectToSerilize;
            }

            break;

        case "date":
            {
                s += ObjectToSerilize.toLocaleString();
            }
            break;

        case "array":
            {
                s += "\n";

                for (var name in ObjectToSerilize) {
                    s += JSerialize(ObjectToSerilize[name], ('index' + name), indentSpace + "   ");
                };

                s += indentSpace;
            }
            break;

        default:
            {
                s += "\n";

                for (var name in ObjectToSerilize) {
                    s += JSerialize(ObjectToSerilize[name], name, indentSpace + "   ");
                };

                s += indentSpace;
            }
            break;

    }

    s += "</" + objectName + ">\n";

    return s;
};

// main entry for deserialization
// XML string as an input
function JDeserialize(XmlText) {
    var _doc = GetDom(XmlText);
    return Deserial(_doc.childNodes[0]);
}

// get dom object . IE or Mozilla
function GetDom(strXml) {
    var _doc = null;

    if (isIE) {
        _doc = new ActiveXObject("Msxml2.DOMDocument.3.0");
        _doc.loadXML(strXml);
    }
    else {
        var parser = new DOMParser();
        _doc = parser.parseFromString(strXml, "text/xml");
    }

    return _doc;
}

// internal deserialization
function Deserial(xn) {
    var RetObj;

    var NodeType = "object";

    if (xn.attributes != null && xn.attributes.length != 0) {
        var tmp = xn.attributes.getNamedItem("type");
        if (tmp != null) {
            NodeType = xn.attributes.getNamedItem("type").nodeValue;
        }
    }

    if (IsSimpleVar(NodeType)) {
        if (isIE) {
            return StringToObject(xn.text, NodeType);
        }
        else {
            return StringToObject(xn.textContent, NodeType);
        }
    }

    switch (NodeType) {
        case "array":
            {
                RetObj = [];
                for (var i = 0; i < xn.childNodes.length; i++) {
                    var Node = xn.childNodes[i];
                    RetObj[i] = Deserial(Node);
                }

                return RetObj;
            }

        case "object":
        default:
            {
                try {
                    RetObj = eval("new " + NodeType + "()");
                }
                catch (e) {
                    // create generic class
                    RetObj = new Object();
                }
            }
            break;
    }

    for (var i = 0; i < xn.childNodes.length; i++) {
        var Node = xn.childNodes[i];
        RetObj[Node.nodeName] = Deserial(Node);
    }

    return RetObj;
}

function IsSimpleVar(type) {
    switch (type) {
        case "int":
        case "string":
        case "String":
        case "Number":
        case "number":
        case "Boolean":
        case "boolean":
        case "bool":
        case "dateTime":
        case "Date":
        case "date":
        case "float":
            return true;
    }

    return false;
}

function StringToObject(Text, Type) {
    var RetObj = null;

    switch (Type) {
        case "int":
            return parseInt(Text);

        case "number":
            {
                var outNum;

                if (Text.indexOf(".") > 0) {
                    return parseFloat(Text);
                }
                else {
                    return parseInt(Text);
                }
            }

        case "string":
        case "String":
            return Text;

        case "dateTime":
        case "date":
        case "Date":
            return new Date(Text);

        case "float":
            return parseFloat(Text, 10);

        case "bool":
            {
                if (Text == "true" || Text == "True") {
                    return true;
                }
                else {
                    return false;
                }
            }
            return parseBool(Text);
    }

    return RetObj;
}

function GetClassName(obj) {
    try {
        var ClassName = obj.constructor.toString();
        ClassName = ClassName.substring(ClassName.indexOf("function") + 8, ClassName.indexOf('(')).replace(/ /g, '');
        return ClassName;
    }
    catch (e) {
        return "NULL";
    }
}

function GetTypeName(ObjectToSerilize) {
    if (ObjectToSerilize instanceof Array)
        return "array";

    if (ObjectToSerilize instanceof Date)
        return "date";

    var Type = typeof (ObjectToSerilize);

    if (IsSimpleVar(Type)) {
        return Type;
    }

    Type = GetClassName(ObjectToSerilize);

    return Type;
}

// ***************************************************************************************
/* END DotNetRemoting JavaScript Serializer/Deserializer */
// ***************************************************************************************

 