// VSPageAJAXCall.js AJAX Request maker
// ------------------------------------------------------------
// namespace Viasoft
// Written by Viasoft Ltd. (viasoft.com.ua)
// Free permission to use granted under BSD licence

// Request send engine
// - - - - - - - - - - - - - - -

function AJAXMakeXMLHttpRequestObject()
 {
  var req = null;

  if (window.XMLHttpRequest)		// normal browser
   {
    req = new XMLHttpRequest(); 
   }
  else if (window.ActiveXObject) //IE
   {
    try { req = new ActiveXObject("Msxml2.XMLHTTP"); } 
    catch (e)
     {
      try { req = new ActiveXObject("Microsoft.XMLHTTP"); } 
      catch (e2) { req = null; }   
     }
   }
   
  return(req);
 }
 
var AJAXRequestProcDelay = 0; // Debug only: Delay in ms to simulate slow connection (Must be 0 in production)

function AJAXRequestSimpleLow(locationURL,postData,onLoadHandler,onErrorHandler,isAsync)
 {
  if (isAsync == null)
   {
    isAsync = true;
   }
  
  var req = AJAXMakeXMLHttpRequestObject();

  if (req == null)
   {
    return(null);
   }
   
  req.onreadystatechange = function() 
   {
    if (req.readyState == 4 && req.status == 200)
     { 
      if (onLoadHandler)
       {
        onLoadHandler(req); 
       }
     }
    else if (req.readyState == 4)
     {
      if (onErrorHandler)
       {
        onErrorHandler(req); 
       }
     }
   };
   
  if (postData != null)
   {
    req.open("POST", locationURL, isAsync);
    req.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    
    if (AJAXRequestProcDelay > 0)
     {
      setTimeout(function() { req.send(postData) } , AJAXRequestProcDelay);
     }
    else
     {
      req.send(postData);
     }
   }
  else
   {
    req.open("GET", locationURL, isAsync);

    if (AJAXRequestProcDelay > 0)
     {
      setTimeout(function() { req.send(null) } , AJAXRequestProcDelay);
     }
    else
     {
      req.send(null);
     }
   }
   
  return(req);
 }

var AJAXMessErrorNotSupported = '';
AJAXMessErrorNotSupported += 'AJAX not supported. Please upgrade your browser.';
AJAXMessErrorNotSupported += '\n';
AJAXMessErrorNotSupported += 'Режим AJAX не поддерживается. К сожалению, Вам необходим более современный броузер для работы с этим ресурсом.';
 
function AJAXRequestSimple(locationURL,postData,onLoadHandler,onErrorHandler,isAsync)
 {
  var result = AJAXRequestSimpleLow(locationURL,postData,onLoadHandler,onErrorHandler,isAsync);
  
  if (result == null)
   {
    alert(AJAXMessErrorNotSupported);
   }
   
  return(result);
 }

// Request/Responce utilities
// - - - - - - - - - - - - - - -

function AJAXXMLGetDomByRequest(req)
 {
  if (req == null)
   {
    return(null);
   }

  if (req.responseXML == null)
   {
    return(null);
   }
   
  if (req.responseXML.documentElement == null)
   {
    return(null);
   }
   
  return(req.responseXML);
 }

function AJAXXMLGetJSONRootByRequest(req)
 {
  if (req == null)
   {
    return(null);
   }

  if (req.responseText == null)
   {
    return(null);
   }

  try
   {
    eval('var result = '+req.responseText+';');
    return(result);
   }
  catch(e)
   {
    return(null);
   }
 }

function AJAXPostDataAddArg(postData,paramName,paramValue)
 {
  if (paramName == null)
   {
    return(postData);
   }
   
  if (paramValue == null)
   {
    return(postData);
   }
   
  if (postData == null)
   {
    postData = '';
   }
  else if (postData != '')
   {
    postData += '&';
   }
   
  postData += ''+paramName;
  postData += '=';
  postData += StrUrlEscape(''+paramValue);
  
  return(postData);
 }

// XML Node values support
// - - - - - - - - - - - - - - -

function AJAXXMLNodeGetText(xmlNode)
 {
  var node = xmlNode; 
 
  if (node == null)
   {
    return(null);
   }
   
  if (node.text != null)
   {
    return(node.text); // IE
   }
  else
   {
    // Note FF has a bug, after return from this fun, 
    // "node" will deleted and textContent will be dropped also
    return(node.textContent+''); // FF
   }
 }
 
// XML Tree support
// - - - - - - - - - - - - - - -

function AJAXXMLDomGetNodeListByXPath(xmlNode, xPath)
 {
  if (xmlNode == null)
   {
    return(null);
   }

  if ((isNavigatorIE != null) && (isNavigatorIE()))
   {
    return(xmlNode.selectNodes(xPath));
   }
  else if (xmlNode.selectNodes)
   {
    return(xmlNode.selectNodes(xPath));
   }
  else
   {
    var xPathTags = xPath.split('/');
    var i;
    
    var xmlNodeTagList = new Array();

    for (i = 0; i < xPathTags.length; i++)
     {
      xmlNodeTagList = xmlNode.getElementsByTagName(xPathTags[i]);

      if (xmlNodeTagList == null)
       {
        return(null);
       }
      else if (xmlNodeTagList.length <= 0)
       {
        return(null);
       }
      else
       {
        xmlNode = xmlNodeTagList[0];
       }
     }
     
    return(xmlNodeTagList);
   }
 }

function AJAXXMLDomGetSingleNodeByXPath(xmlNode, xPath)
 {
  if (xmlNode == null)
   {
    return(null);
   }
   
  if (xPath == null)
   {
    return(xmlNode);
   }

  if ((isNavigatorIE != null) && (isNavigatorIE()))
   {
    return(xmlNode.selectSingleNode(xPath));
   }
  else if (xmlNode.selectSingleNode)
   {
    return(xmlNode.selectSingleNode(xPath));
   }
  else
   {
    var Nodes = AJAXXMLDomGetNodeListByXPath(xmlNode, xPath);
    
    if (Nodes == null)
     {
      return(null);
     }
    else if (Nodes.length <= 0)
     {
      return(null);
     }
    else
     {
      return(Nodes[0]);
     }
   }
 }

function AJAXXMLDomGetSingleNodeTextByXPath(xmlNode, xPath)
 {
  return(AJAXXMLNodeGetText(AJAXXMLDomGetSingleNodeByXPath(xmlNode, xPath)));
 }

function AJAXXMLDomGetSingleNodeByTagName(xmlNode, tagName)
 {
  var nodes = xmlNode.getElementsByTagName(tagName);
  
  if (nodes == null)
   {
    return(null);
   }
   
  if (nodes.length == null)
   {
    return(null);
   }
   
  if (nodes.length < 1)
   {
    return(null);
   }
   
  return(nodes[0]);
 }
 
function AJAXXMLDomGetSingleNodeTextByTagName(xmlNode, tagName)
 {
  return(AJAXXMLNodeGetText(AJAXXMLDomGetSingleNodeByTagName(xmlNode, tagName)));
 }
 
// Advanced Node DeSerialzation
// - - - - - - - - - - - - - - -

function AJAXXMLNodeGetVarValue(xmlNode)
 {
  // Restores value serialized by PageWriter.WriteXMLTagValue
  
  var node = xmlNode; 
 
  if (node == null)
   {
    return(null);
   }
   
  var nodeNullAttr = node.getAttribute('isNull');
  
  if ((nodeNullAttr != null) && (nodeNullAttr.toLowerCase() == 'true'))
   {
    return(null);
   }
  
  var nodeText = '';

  if (node.text != null)
   {
    nodeText = node.text; // IE
   }
  else
   {
    // Note FF has a bug, after return from this fun, 
    // "node" will deleted and textContent will be dropped also
    nodeText = node.textContent+''; // FF
   }
  
  var nodeTypeAttr = node.getAttribute('type');

  if (nodeTypeAttr == null)
   {
    return(nodeText);
   }
   
  nodeTypeAttr = nodeTypeAttr.toLowerCase();
   
  var result = nodeText;
   
  if (nodeTypeAttr == 'int')
   {
    result = parseInt(nodeText,10);
    
    if (isNaN(result))
     {
      result = null; // Invalid int format
     }
   }
  else if (nodeTypeAttr == 'bool')
   {
    nodeText = nodeText.toLowerCase();

    if (nodeText == 'true')
     {
      result = true;
     }
    else if (nodeText == 'false')
     {
      result = false;
     }
    else
     {
      result = null; // Invalid bool format
     }
   }
  else if (nodeTypeAttr == 'datetime')
   {
    if (DateTimeParseFixedString == null)
     {
      // Conversion function not exist -- return as is (text)
     }
    else
     {
      result = DateTimeParseFixedString(result);
     } 
   }
  else
   {
    // Return as-is (string)
   }
   
  return(result);
 }

