/* Copyright (C) The MoreMotion Organization. http://www.moremotion.org
 * All rights reserved. This software is published under the terms of the GPL.
 */
function hasmmprop() {
  try {
    eval('var x = mmprop');
  } catch(e) {
    return false;
  }
  return true;
}
function BusyImage(node) {
  this.node = node;
  this.init = function() {
    this.node.style.visibility = "hidden";
  };
};
function TargetArea(node) {
  this.base = MoreMotionObject;
  this.base(node);
};
function MoreMotionAjaxManager() {
  this.getElementsArray = function(elmidsStr) {
    var elms = new Array();
    var elmids = elmidsStr.split(",");
    for (var i = 0; i < elmids.length; i++) {
      elms[i] = document.getElementById(elmids[i]);
    }
    return elms;
  }
  this.refreshOptions = function(prm) {
    var props = new Object();
    var params = new RequestParameterAccumulator(prm.requestParams);
    params.add("_cfg",prm.actionName);
    props.optionField = prm.optionField;
    props.valueField = prm.valueField;
    props.targetElement = prm.targetElement.after ? document.getElementById(prm.targetElement) : prm.targetElement;
    props.staticOptionsQty = prm.staticOptionsQty;
    props.callbackFunc = prm.callbackFunc;
    props.userData = prm.userData;
    request = new AjaxRequest(params,null,props);
    request.service = "RefreshOptions.doms";
    request.pageInfo = OMgr.getPageInfo( props.targetElement );
    request.errorHandler = prm.errorHandler;
    request.busyImage = prm.busyImage;
    request.waitForResponse = (prm.waitForResponse == true);
    request.send();
  };
  this.clearOptions = function(elmid, soq) {
    var box = elmid.after ? document.getElementById(elmid) : elmid;
    if (box == null) {
      return;
    }
    if (soq) {
      box.options.length = soq;
    } else {
      box.options.length = 0;
    }
    box.selectedIndex = 0;
  };
  this.refreshOptionsResponseHandler = function(response) {
    var request = response.request;
    var staticOptionsQty = null;
    var targetElement = null;
    var optionField = null;
    var valueField = null;
    if (response.isProcessResponse()) {
      staticOptionsQty = response.props.staticOptionsQty;
      targetElement = document.getElementById(response.props.targetElement);
      optionField = response.props.optionField;
      valueField = response.props.valueField;
    } else {
      staticOptionsQty = request.props.staticOptionsQty;
      targetElement = request.props.targetElement;
      optionField = request.props.optionField;
      valueField = request.props.valueField;
    }
    AjaxMgr.clearOptions(targetElement,staticOptionsQty);
    var select = targetElement;
    if (!select) {
      var ex = new Exception("REFRESH_OPTIONS_ELEMENT_MISSING");
      if (request.errorHandler) {
        var handler = new ErrorHandler(request.errorHandler,"Ajax Request Error Handler");
        handler.run(ex, request);
      } else throw ex;
    }
    var j = staticOptionsQty;
    while (response.hasMore()) {
      var rec = response.next();
      select.options[j++] = new Option( rec.get(optionField), rec.get(valueField) );
    }
  };
  this.refreshFields = function(prm) {
    var props = new Object();
    var params = new RequestParameterAccumulator(prm.requestParams);
    params.add("_cfg",prm.actionName);
    props.dataNodes = prm.dataNodes;
    props.targetElements = prm.targetElements;
    if (props.targetElements.after) {
      props.targetElements = this.getElementsArray(props.targetElements);
    }
    props.targetElementAttrs = prm.targetElementAttrs;
    props.callbackFunc = prm.callbackFunc;
    props.userData = prm.userData;
    var request = new AjaxRequest(params,null,props);
    request.service = "RefreshFields.doms";
    request.errorHandler = prm.errorHandler;
    request.busyImage = prm.busyImage;
    request.pageInfo = OMgr.getPageInfo( props.targetElements[0] );
    request.waitForResponse = (prm.waitForResponse == true);
    request.send();
  };
  this.refreshFieldsResponseHandler = function(response) {
    var request = response.request;
    var rec = response.get(0);
    var props = response.request.props;
    var dataNodes = null;
    var targetElements = null;
    var targetElementAttrs = null;
    if (response.isProcessResponse()) {
      dataNodes = response.props.dataNodes;
      targetElements = AjaxMgr.getElementsArray(response.props.targetElements);
      targetElementAttrs = (response.props.targetElementAttrs || "").split(",");
    } else {
      dataNodes = request.props.dataNodes;
      targetElements = request.props.targetElements;
      targetElementAttrs = (request.props.targetElementAttrs || "").split(",");
    }
    if (dataNodes) dataNodes = dataNodes.split(",");
    for (var i = 0; i < targetElements.length; i++ ) {
      var node = dataNodes ? dataNodes[i] : null;
      var elm = targetElements[i];
      var attr = "value";
      if (i < targetElementAttrs.length) {
        attr = targetElementAttrs[i];
        if (attr == "") attr = "value";
      }
      if (!elm) {
        var ex = new Exception("REFRESH_FIELDS_ELEMENT_MISSING",i);
        if (request.errorHandler) {
          var handler = new ErrorHandler(request.errorHandler,"Ajax Request Error Handler");
          handler.run(ex, response);
        } else throw ex;
      }
      var o = OMgr.getObject(elm);
      if (o) {
        if (o.ajaxRefreshHandler) {
          try {
            o.ajaxRefreshHandler(rec,node,attr);
          } catch (e) {
            if (request.errorHandler) {
              var handler = new ErrorHandler(request.errorHandler,"Ajax Request Error Handler");
              handler.run(e, response);
            } else throw e;
          }
          continue;
        }
        if (!node) node = o.name;
      }
      if (!node) node = elm.name;
      var value = "";
      if (rec) {
        if (!response.hasField(node)) {
          var ex = new Exception("RESPONSE_FIELD_MISSING",i,node);
          if (request.errorHandler) {
            var handler = new ErrorHandler(request.errorHandler,"Ajax Request Error Handler");
            handler.run(ex, response);
          } else throw ex;
        }
        value = rec.get(node);
      }
      if (o && o.setValue) {
        o.setValue(value);
        continue;
      }
      if ((attr == "checked") || (attr == "readOnly")) {
        eval("elm." + attr + " = " + value);
      } else if (attr == "value") {
        if (elm.type == "checkbox") {
            elm.checked = value.toBool();
        } else if (elm.type == "radio") {
          if (elm.value == value) elm.checked = true; else elm.checked = false;
        } else {
          elm.value = value;
        }
      } else {
        eval("elm." + attr + " = value");
      }
    }
  };
  this.refreshBlocks = function(prm) {
    var props = new Object();
    try {
      props.targetBlocks = prm.targetBlocks.after ? this.getBlocksArray(prm.targetBlocks,true) : prm.targetBlocks;
    } catch (ex){
      if (ex.alert) ex.alert(); else alert(ex.message);
    }
    if (prm.callbackFunc) props.callbackFunc = prm.callbackFunc;
    if (prm.userData) props.userData = prm.userData;
    if (prm.fieldMap) props.fieldMap = prm.fieldMap;
    var params = new RequestParameterAccumulator(prm.requestParams);
    params.add("_cfg",prm.actionName);
    request = new AjaxRequest(params,null,props);
    request.service = "RefreshBlocks.doms";
    request.errorHandler = prm.errorHandler;
    request.busyImage = prm.busyImage;
    var blocks = this.getBlocksArray(prm.targetBlocks);
    request.pageInfo = OMgr.getPageInfo( blocks ? blocks[0] : null);
    request.waitForResponse = (prm.waitForResponse == true);
    request.send();
  };
  this.getFieldMap = function(fieldMapStr) {
    if (!fieldMapStr) return null;
    var map = new Array();
    var defs = fieldMapStr.split(";");
    for (var i = 0; i < defs.length; i++) {
    	var def = defs[i];
    	var pfname = def.before(":",def).trim(); 
    	var dnname = def.after(":",def).trim();  
    	map[pfname] = dnname;
    }
    return map;
  };
  this.getBlocksArray = function(targetBlocks, validate) {
    var blocks = new Array();
    var defs = targetBlocks.split(",");
    for (var i = 0; i < defs.length; i++) {
      var def = defs[i].trim();
      var formName = def.before(".");
      var blockName = def.after(".");
      var block = null;
      try {
        block = PMgr.getForm(formName).getBlock(blockName);
      } catch (e) {};
      if (block) {
        blocks[blocks.length] = block;
      } else {
        if (validate) {
          throw new Exception("PROCESS_BLOCK_MISSING",prm.blockName, prm.formName);
        }
      }
    }
    return blocks;
   }
  this.refreshBlocksResponseHandler = function(response) {
    var targetBlocks = null;
    var fieldMap = null;
    if (response.isProcessResponse()) {
      targetBlocks = AjaxMgr.getBlocksArray(response.props.targetBlock);
      fieldMap = AjaxMgr.getFieldMap(response.props.fieldMap);
    } else  {
      targetBlocks = request.props.targetBlocks;
      fieldMap = AjaxMgr.getFieldMap(request.props.fieldMap);
    }
    var b = targetBlocks[response.props.blockSeq];
    b.removeAllRecords();
    while (response.hasMore()) {
      var rec = response.next();
      var r = b.addRecord().clear();
      var fields = r.getFields();
      for (var i = 0; i < fields.length; i++) {
        var f = fields[i];
        try {
          AjaxMgr.setFieldValue(f,rec,fieldMap);
        } catch (ex) {
          if (ex.code && ex.code == "RESPONSE_FIELD_MISSING") {
            throw new Exception("REFRESH_BLOCKS_RESPONSE_FIELD_MISSING",ex.arg1,i);
          }
          throw ex;
        }
      }
    }
  };
  this.setFieldValue = function(f, rec, fieldMap) {
    var fieldName = f.name;
    if (fieldMap != null && fieldMap[f.name] != null) {
    	fieldName = fieldMap[f.name];
    }
    if (f.ajaxRefreshHandler) {
      f.ajaxRefreshHandler(rec, fieldName);
    } else {
      var value = "";
      if (!rec.owner.hasField(fieldName)) {
        throw new Exception("RESPONSE_FIELD_MISSING",fieldName);
      }
      value = rec.get(fieldName);
      if (f.setValue) {
        f.setValue(value);
      }
    }
    if (f.setRecordNumber) {
      f.setRecordNumber(rec.recordIndex);
    }
   };
  this.refreshPanels = function(prm) {
    prm.sourceAreas = prm.sourcePanels;
    prm.targetAreas = prm.targetPanels;
    this.refreshAreas(prm);
  };
  this.alreadyUsedSourceAreas = new Array();
  this.getAlreadyUsedSourceAreas = function() {
    var acc = new Accumulator(",");
    for (var p in AjaxMgr.alreadyUsedSourceAreas) {
      var pv = AjaxMgr.alreadyUsedSourceAreas[p];
      if (pv) {
        acc.add(p + ":" + AjaxMgr.alreadyUsedSourceAreas[p]);
      }
    }
    return acc.toString();
  };
  this.addNewSourceArea = function(area) {
    var areaName = area.before(":");
    var sequence = area.after(":");
    if (AjaxMgr.alreadyUsedSourceAreas[areaName] == null) {
      AjaxMgr.alreadyUsedSourceAreas[areaName] = sequence;
    }
  };
  this.refreshAreas = function(prm) {
    var props = new Object();
    var params = new RequestParameterAccumulator(prm.requestParams);
    params.add("_cfg",prm.actionName);
    params.add("_usedsourceareas",this.getAlreadyUsedSourceAreas());
    props.targetAreas = prm.targetAreas;
    if (props.targetAreas.after) {
      props.targetAreas = this.getElementsArray(props.targetAreas);
    }
    props.callbackFunc = prm.callbackFunc;
    props.userData = prm.userData;
    var request = new AjaxRequest(params,null,props);
    request.service = "RefreshAreas.doms";
    request.errorHandler = prm.errorHandler;
    request.busyImage = prm.busyImage;
    request.pageInfo = OMgr.getPageInfo(prm.originNode);
    request.waitForResponse = (prm.waitForResponse == true);
    request.send();
  };
  this.refreshAreasResponseHandler = function(response) {
    AjaxMgr.setScripts(response);
    if (!response.pendingJSLoading) {
    	AjaxMgr.refreshAreasContinue(response);
    }
  };
  this.refreshAreasContinue = function(response,loadIndex) {
  	if (loadIndex != null) {
  		response.pendingJSLoading[loadIndex] = "loaded";
    	for (var i = 0; i < response.pendingJSLoading.length; i++) {
    		if (response.pendingJSLoading[i] == "pending") {
    			return;
    		}
    	}
  	}
    var request = response.request;
    var targetAreas = null;
    if (response.isProcessResponse()) {
      targetAreas = response.props.targetAreas;
      if (targetAreas.after) targetAreas = AjaxMgr.getElementsArray(targetAreas);
    } else {
      targetAreas = request.props.targetAreas;
    }
    if (response.json.html) {
      for (var i = 0; i < response.json.html.length; i++ ) {
        var target = OMgr.getObject(targetAreas[i]);
        if (!target) {
          var ex = new Exception("TARGET_AREA_MISSING",i+1);
          if (request.errorHandler) {
            var handler = new ErrorHandler(request.errorHandler,"Ajax Request Error Handler");
            handler.run(ex, request);
          } else throw ex;
        } else {
          target.node.innerHTML = response.json.html[i];
          OMgr.initialize(target.node);
        }
      }
    }
    var tas = target.node.getElementsByTagName("textarea");
    for (var i = 0; i < tas.length; i++) {
      var ta = tas[i];
      if (ta.value == "$remove-this-from-textarea$") {
      	ta.value = "";
      }
    }
    if (response.json.newSourceAreas) {
      for (var i = 0; i < response.json.newSourceAreas.length; i++ ) {
        var newSourceArea = response.json.newSourceAreas[i];
        AjaxMgr.addNewSourceArea(newSourceArea);
      }
    }
    if (response.json.styles) {
      AjaxMgr.addStyles(response.json.styles);
    }
  };
  this.addStyles = function(styles) {
    var head = document.getElementsByTagName("head")[0];
    var styleElement = document.createElement('style');
    styleElement.type = "text/css";
    head.insertBefore(styleElement,head.childNodes[0]);
    if (WinMgr.isIE) {
      var styleSheet = document.styleSheets[0];
      styleSheet.cssText = styles;
    } else {
      styleElement.innerHTML = styles;
    }
  };
  this.setScripts = function(response) {
    var externals = response.json.extjs;
    var embeddeds = response.json.embjs;
    var extcss = response.json.extcss;
    if (!externals && !embeddeds && !extcss) return false;
    var head = document.getElementsByTagName("head")[0];
    if (externals) {
      for (var i = 0; i < externals.length; i++) {
        var src = externals[i];
        if (!AjaxMgr.scriptAlreadyExists(head,src,null)) {
          AjaxMgr.appendScript(head,src,null,response);
        }
      }
    }
    if (embeddeds) {
      for (var i = 0; i < embeddeds.length; i++) {
        var text = embeddeds[i];
        if (!AjaxMgr.scriptAlreadyExists(head,null,text)) {
          AjaxMgr.appendScript(head,null,text,response);
        }
      }
    }
    if (extcss) {
      for (var i = 0; i < extcss.length; i++) {
        var css = extcss[i];
        if (!AjaxMgr.cssAlreadyExists(head,css)) {
          AjaxMgr.appendExternalCss(head,css);
        }
      }
    }
  };
  this.scriptAlreadyExists = function(head,src,text) {
    for (var i = 0; i < head.childNodes.length; i++) {
      var node = head.childNodes[i];
      if (node.nodeType == 1) {
        if (src && node.src && node.src.endsWith(src)) return true;
        if (text && node.text && node.text.endsWith(text)) return true;
      }
    }
  };
  this.cssAlreadyExists = function(head,css) {
    for (var i = 0; i < head.childNodes.length; i++) {
      var node = head.childNodes[i];
      if (node.nodeType == 1) {
        if (node.href && node.href.endsWith(css)) return true;
      }
    }
  };
  this.appendScript = function(head,src,text,response) {
    var script = document.createElement('script');
    script.type = 'text/javascript';
    if (text) {
      script.text = text;
      head.appendChild(script);
    }
    if (src) {
      script.src = src;
      head.appendChild(script);
      if (!response.pendingJSLoading) response.pendingJSLoading = new Array();
      response.pendingJSLoading[response.pendingJSLoading.length] = "pending";
      var x = response.pendingJSLoading.length;
      if (!WinMgr.isIE) script.onload = function() {AjaxMgr.refreshAreasContinue(response,x-1)};
      else script.onreadystatechange = function() {
        if (script.readyState == "loaded" || script.readyState == "complete") {
          AjaxMgr.refreshAreasContinue(response,x-1);
        }
      }
    }
  };
  this.appendExternalCss = function(head,css) {
    var link = document.createElement('link');
    link.rel = "stylesheet";
    link.type = 'text/css';
    link.href = css;
    head.appendChild(link);
  };
  this.customRefresh = function(prm) {
    var props = new Object();
    var params = new RequestParameterAccumulator(prm.requestParams);
    params.add("_cfg",prm.actionName);
    props.userData = prm.userData;
    request = new AjaxRequest(params,null,props);
    request.service = "AjaxActionService.doms";
    request.pageInfo = OMgr.getPageInfo(prm.originNode);
    request.errorHandler = prm.errorHandler;
    request.busyImage = prm.busyImage;
    request.waitForResponse = (prm.waitForResponse == true);
    request.send();
  };
  this.multiPartResponseHandler = function(mpar) {
    for (var i = 0; i < mpar.responseCount(); i++) {
      var response = mpar.getResponse(i);
      var handler = response.request.responseHandler;
      if (!handler) handler = eval(response.json.handler);
      if (handler.after) handler = eval(handler);
      handler(response);
    }
    var callbackFunc = mpar.request.props.callbackFunc;
    if (callbackFunc) {
      callbackFunc(mpar);
    }
  };
  this.cancelRequest = function(controlId) {
    if (controlId) {
      var rs = ajaxRequestSequences[controlId];
      if (rs) {
        rs++;
        ajaxRequestSequences[controlId] = rs;
      }
    }
  };
  this.submitProcessForm = function(prm) {
    return PMgr.getForm(prm.formName).ajaxSubmit(prm);
  };
  this.executeProcessTemplate = function(prm) {
    var props = new Object();
    props.callbackFunc = prm.callbackFunc;
    props.userData = prm.userData;
    if (prm.confirmMessage && !confirm(prm.confirmMessage)) {
      return false;
    }
    var params = new RequestParameterAccumulator(prm.requestParams);
    params.add("_cmd",prm.commandName);
    params.add("_usedsourceareas",AjaxMgr.getAlreadyUsedSourceAreas());
    var func = prm.beforeSubmitFunc;
    if (func) {
      try {
        if (func.after) func = eval(func);
        if (func(this, prm.commandName) == false) return false;
      } catch (e) {
        alert(OMgr.resource("INVALID_BEFORE_SUBMIT_FUNCTION_DEFINITION",func + " : " + e.message));
        return false;
      }
    }
    var request = new AjaxRequest(params,null,props);
    request.service = "AjaxProcessManager.doms";
    request.errorHandler = prm.errorHandler;
    request.busyImage = prm.busyImage;
    request.pageInfo = OMgr.getPageInfo(prm.currentNode); 
    request.waitForResponse = (prm.waitForResponse == true);
    request.send();
  };
};
var AjaxMgr = new MoreMotionAjaxManager();
function AjaxProcessCommand(node) {
  this.props = null;
  this.base = ProcessCommand;
  this.base(node);
};
function RefreshOptions(elmid, dsname, params, soq, valueField, optionField, callbackFunc, customData, waitForResponse) {
  AjaxMgr.refreshOptions({
    targetElement     : elmid
    ,dataSource       : dsname
    ,requestParams    : params
    ,staticOptionsQty : soq
    ,valueField       : valueField
    ,optionField      : optionField
    ,callbackFunc     : callbackFunc
    ,userData         : customData
    ,waitForResponse  : waitForResponse
  });
};
function ClearOptions(elmid, soq) {
  AjaxMgr.clearOptions(elmid, soq);
};
function RefreshFields(dsname, params, fields, elmids, attrs, callbackFunc, customData, waitForResponse) {
  AjaxMgr.refreshFields({
    dataSource          : dsname
    ,requestParams      : params
    ,targetElements     : elmids
    ,targetElementAttrs : attrs
    ,callbackFunc       : callbackFunc
    ,userData           : customData
    ,waitForResponse    : waitForResponse
  });
};
function RefreshArea(targetAreaIds, sourceAreas, sourcePage, params, callbackFunc, customData, waitForResponse) {
  AjaxMgr.refreshAreas({
    targetAreas      : targetAreaIds
    ,sourceAreas     : sourcePage + '.' + sourceAreas
    ,requestParams   : params
    ,callbackFunc    : callbackFunc
    ,userData        : customData
    ,waitForResponse : waitForResponse
  });
};
var ajaxRequestSequences = new Array();
function AjaxRequest(requestParams, responseHandler, props) {
  this.xmlHttpRequest = null;
  this.requestParams = requestParams.addObject ? requestParams : new RequestParameterAccumulator(requestParams);
  this.responseHandler = responseHandler;
  this.errorHandler = null;
  this.props = props || new Object();
  this.busyImage = null;
  this.requestEncoding = null;
  this.responseEncoding = null;
  this.waitForResponse = false;
  this.service = "AjaxActionService.doms";
  this.method = "GET";
  this.pageInfo = null;
  this.setBusy = function() {
    if (this.busyImage) {
      var elm = this.busyImage.after ? document.getElementById(this.busyImage) : this.busyImage;
      if (elm) elm.style.visibility = "visible";
    }
  };
  this.getUrl = function() {
    return this.service;
  };
  this.getParams = function(method) {
    if (this.pageInfo) {
      if (this.pageInfo.after) this.pageInfo = new PageInfo(this.pageInfo);
    } else this.pageInfo = OMgr.getPageInfo(null);
    var params = this.requestParams;
    if (this.pageInfo.name) params.add("_originpage", this.pageInfo.name);
    if (this.pageInfo.variant) params.add("_variant", this.pageInfo.variant);
    if (this.pageInfo.lang && this.pageInfo.lang != "ml") params.add("_lang",this.pageInfo.lang);
    var respenc = this.responseEncoding;
    if (respenc == null) {
      respenc = this.pageInfo.charset;
      this.responseEncoding = respenc;
    }
    params.add("_resp_enc",respenc);
    var reqenc = "utf-8";
    if (method != "POST") {
	    reqenc = this.requestEncoding;
	    if (reqenc == null) {
	      if (WinMgr.isIE) {
	        reqenc = this.pageInfo.charset;
	        if (reqenc.toLowerCase() == "utf-8") {
	          if (this.pageInfo.clang == "tr") reqenc = "iso-8859-9";
	          else reqenc = "iso-8859-1";
	        }
	      } else if (WinMgr.isGecko) {
	        reqenc = this.pageInfo.charset;
	      } else {
	        reqenc = "utf-8";
	      }
	      this.reqEncoding = reqenc;
	    }
    }
    params.add("_enc",reqenc);
    params.add("_rand",(new Date()).getTime());
    return params.toString();
  };
  this.send = function(controlId) {
    this.controlId = controlId;
    SendAjaxRequest(this);
  };
};
function SendAjaxRequest(request) {
  if (request.controlId) {
    var rs = ajaxRequestSequences[request.controlId];
    if (!rs) rs = 1; else rs++;
    request.requestSequence = rs;
    ajaxRequestSequences[request.controlId] = rs;
  }
  request.xmlHttpRequest = AjaxRequest.getXmlHttpRequest();
  request.xmlHttpRequest.onreadystatechange = function() {
    if (request == null || request.xmlHttpRequest == null) { return; }
    if (request.xmlHttpRequest.readyState == 4) { AjaxRequestStatusChange(request); }
  };
  var async = !(request.waitForResponse && WinMgr.isIE);
  request.setBusy();
  if (request.method.toUpperCase() == "GET") {
	  request.xmlHttpRequest.open("GET", request.getUrl() + "?" + request.getParams("GET"), async);
	  request.xmlHttpRequest.setRequestHeader("Content-Type","text/plain; charset=" + request.requestEncoding);
	  request.xmlHttpRequest.send(null);
  } else if (request.method.toUpperCase() == "POST") {
  	var params = request.getParams("POST");
	  request.xmlHttpRequest.open("POST", request.getUrl(), async);
    request.xmlHttpRequest.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    request.xmlHttpRequest.setRequestHeader("Content-Length", params.length);
    request.xmlHttpRequest.setRequestHeader("Connection", "close");
	  request.xmlHttpRequest.send(params);
  } else {
  	alert("Invalid method!" + request.method);
  }
};
function AjaxRequestStatusChange(request) {
  var status = "No Response!";
  try {
    status = request.xmlHttpRequest.status;
  } catch(e) {}
  if (status == 200) {
    try {
      var responseText = request.xmlHttpRequest.responseText;
      if (responseText.startsWith("!ERROR:")) {
        var ex = new Exception("AJAX_SERVICE_ERROR", responseText.after("!ERROR:"));
        if (request.errorHandler) {
          var handler = new ErrorHandler(request.errorHandler,"Ajax Request Error Handler");
          handler.run(ex, request);
        } else throw ex;
      }
      if (request.elmid) {
        var rs = ajaxRequestSequences[request.elmid];
        if (request.requestSequence < rs) return;
      }
      var resp = GetMultiPartAjaxResponse(responseText, request);
      AjaxMgr.multiPartResponseHandler(resp);
    } catch(e) {
      if (e.alert) e.alert();
      else throw e; 
    } finally {
      if (request.busyImage) {
        var elm = request.busyImage.after ? document.getElementById(request.busyImage) : request.busyImage;
        if (elm) elm.style.visibility = "hidden";
        else alert( OMgr.resource("BUSY_IMAGE_MISSING") );
      }
    }
  } else {
  }
};
function GetAjaxResponse(responseText, request) {
  var dlm = "$_T_E_X_T_$";
  var x = responseText.indexOf(dlm);
  var response = null;
  if (x == -1) {
    response = new AjaxResponse(responseText);
  } else {
    response = new AjaxResponse(responseText.substring(0,x));
    response.setText(responseText.substring(x + dlm.length+1));
  }
  response.request = request;
  return response;
};
function GetMultiPartAjaxResponse(responseText, request) {
  var mpar = new MultiPartAjaxResponse();
  mpar.request = request;
  var responseParts = responseText.split("$_RESPONSE_SEPARATOR_$");
  for (var i = 0; i < responseParts.length; i++) {
    var responsePart = responseParts[i];
    if (responsePart.trim().length > 0) {
      var response = GetAjaxResponse(responsePart,request);
      response.owner = mpar;
      if (response.json && response.json.type == "*ResultFields") {
        mpar.setResultFields(response);
      } else if (response.json && response.json.type == "*PagingInfo") {
        mpar.setPagingInfo(response);
      } else {
        mpar.addResponse(response);
      }
    }
  }
  return mpar;
};
function tme() {
  return (new Date()).getTime();
};
AjaxRequest.getXmlHttpRequest = function() {
 if (window.XMLHttpRequest) {
   return new XMLHttpRequest();
 }
 else if (window.ActiveXObject) {
   try {
     return new ActiveXObject("Msxml2.XMLHTTP");
   } catch (e) {
     try {
       return new ActiveXObject("Microsoft.XMLHTTP");
     } catch (e) {
       return null;
     }
   }
 }
 else {
   return null;
 }
};
function ShowDropDowns(div) {
  if (!WinMgr.isIE) return;
  var s = document.getElementsByTagName("SELECT");
  for (var i = 0; i < s.length; i++) {
    var dd = s[i];
    var zIndex = dd.style.zIndex;
    if (zIndex > 9000) {
      dd.style.visibility = "";
      dd.style.zIndex = zIndex - 10000;
    }
  }
};
function HideDropDowns(div, divL, divT) {
  if (!WinMgr.isIE) return;
  var divR = 0 + divL + div.childNodes[0].offsetWidth;
  var divB = 0 + divT + div.childNodes[0].offsetHeight;
  var s = document.getElementsByTagName("SELECT");
  for (var i = 0; i < s.length; i++) {
    var dd = s[i];
    if (dd.style.visibility == "" || dd.style.visibility == "visible")
    {
      var ddL = findPosX(dd);
      var ddT = findPosY(dd);
      var ddR = ddL + dd.offsetWidth;
      var ddB = ddT + dd.offsetHeight;
      if ((ddL >= divL && ddL <= divR) || (ddR >= divL && ddR <= divR) || (ddL < divL && ddR > divR) )
        if ((ddT >= divT && ddT <= divB) || (ddB >= divT && ddB <= divB) || (ddT < divT && ddB > divB) ) {
          dd.style.zIndex += 10000;
          dd.style.visibility = "hidden";
        }
    }
  }
};
function findPosX(obj) {
  var curleft = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      curleft += obj.offsetLeft;
      obj = obj.offsetParent;
    }
  } else if (obj.x) {
    curleft += obj.x;
  }
  return curleft - 1;
};
function findPosY(obj) {
  var ie = WinMgr.isIE;
  var curtop = 0;
  if (obj.offsetParent) {
    while (obj.offsetParent) {
      var top = ie && obj.tagName == "DIV" && obj.offsetTop % 2 == 0 ? obj.offsetTop / 2 : obj.offsetTop;
      curtop += top;
      obj = obj.offsetParent;
    }
  } else if (obj.y) {
    curtop += obj.y;
  }
  return curtop;
};
function ResponseRecord(owner, recordIndex) {
  this.owner = owner;
  this.recordIndex = recordIndex;
  this.fields = function() {
    var flds = null;
    try {
      flds = this.owner.json.item[this.recordIndex];
    } catch (e) {}
    return flds;
  };
  this.hasField = function(fld) {
    return this.owner.hasField(fld);
  };
  this.getFieldValue = function(fieldName) {
    var s = null;
    try {
      var fidx = -1;
      if (!isNaN(fieldName)) {
        fidx = fieldName + 0;
      } else {
        var meta = this.owner.json.meta;
        for (var i = 0; i < meta.length; i++) {
          if (meta[i] == fieldName) {
            fidx = i;
            break;
          }
        }
      }
      if (fidx == -1) return null;
      s = this.owner.json.item[this.recordIndex][fidx];
    } catch (e) {}
    return s;
  };
  this.get = function(fld) {
    return this.getFieldValue(fld);
  };
};
function JsonResponse() {
  this.type = null;
  this.props = null;
  this.meta = null;
  this.item = null;
}
function AjaxResponse(responseText) {
  this.owner = null;
  this.request = null;
  this.getResultField = function(fieldName) {
    return this.owner ? this.owner.getResultField(fieldName) : null;
  };
  this.getPagingInfo = function(dsname) {
    return this.owner ? this.owner.getPagingInfo(dsname) : null;
  };
  this.recordIndex = -1;
  this.itemCount = 0;
  this.recordCount = 0;
  this.props = null;
  this.json = null;
  try {
    this.json = eval("(" + responseText + ")");
    if (this.json.item) {
    	this.recordCount = this.json.item.length;
    	this.itemCount = this.json.item.length; 
    }
    this.props = this.json.props;
  } catch (e) {alert(e.message)};
  this.isProcessResponse = function() {
    return this.json.name && this.json.name != ""  ;
  };
  this.text = null;
  this.setText = function(text) {
    this.text = text;
  };
  this.getText = function() {
    return this.text;
  };
  this.hasMore = function() {
    return this.recordIndex+1 < this.itemCount;
  };
  this.next = function() {
    this.recordIndex++;
    if (this.recordIndex == this.itemCount) {
      this.recordIndex--;
      return null;
    }
    return new ResponseRecord(this, this.recordIndex);
  };
  this.getResponseRecord = function(recordIndex) {
    if (recordIndex >= this.itemCount) {
      return null;
    }
    return new ResponseRecord(this, recordIndex);
  };
  this.get = function(recordIndex) {
    return this.getResponseRecord(recordIndex);
  };
  this.top = function() {
    this.recordIndex = -1;
  };
  this.fieldNames = function() {
    return this.json.meta;
  };
  this.hasField = function(fld) {
    var meta = this.json.meta;
    for (var i = 0; i < meta.length; i++) {
      if (meta[i] == fld) {
        return true;
      }
    }
    return false;
  };
};
function MultiPartAjaxResponse() {
  this.request = null;
  this.resultFields = null;
  this.setResultFields = function(response) {
    this.resultFields = response.json.props;
  };
  this.getResultField = function(fieldName) {
    return this.resultFields[fieldName];
  }
  this.pagingInfo = null;
  this.setPagingInfo = function(response) {
    this.pagingInfo = response.json.props;
  };
  this.getPagingInfo = function(dsname) {
    return this.pagingInfo[dsname];
  };
  this.responses = new Array();
  this.addResponse = function(response) {
    this.responses[this.responses.length] = response;
  }
  this.responseCount = function() {
    return this.responses.length;
  };
  this.getResponse = function(indexOrName) {
    if (!indexOrName) return this.responses[0];
    if (indexOrName.after) {
      for (var i = 0; i < this.responses.length; i++) {
        var response = this.responses[i];
        if (response.name = indexOrName) {
          return response;
        }
      }
      return null;
    } else {
      return this.responses[indexOrName];
    }
  };
  this.getRequest = function() {
    return this.responses.length > 0 ? this.responses[0].request : null;
  };
};

