/*

HTMLHttpRequest v1.0 beta3 (rev. 6, 07.02.2007)
(c) 2001-2006 Angus Turnbull, TwinHelix Designs http://www.twinhelix.com

*/

if (typeof addEvent != 'function')
{
 var addEvent = function(o, t, f, l)
 {
  var d = 'addEventListener', n = 'on' + t, rO = o, rT = t, rF = f, rL = l;
  if (o[d] && !l) return o[d](t, f, false);
  if (!o._evts) o._evts = {};
  if (!o._evts[t])
  {
   o._evts[t] = o[n] ? { b: o[n] } : {};
   o[n] = new Function('e',
    'var r = true, o = this, a = o._evts["' + t + '"], i; for (i in a) {' +
     'o._f = a[i]; r = o._f(e||window.event) != false && r; o._f = null;' +
     '} return r');
   if (t != 'unload') addEvent(window, 'unload', function() {
    removeEvent(rO, rT, rF, rL);
   });
  }
  if (!f._i) f._i = addEvent._i++;
  o._evts[t][f._i] = f;
 };
 addEvent._i = 1;
 var removeEvent = function(o, t, f, l)
 {
  var d = 'removeEventListener';
  if (o[d] && !l) return o[d](t, f, false);
  if (o._evts && o._evts[t] && f._i) delete o._evts[t][f._i];
 };
}

function cancelEvent(e, c)
{
 e.returnValue = false;
 if (e.preventDefault) e.preventDefault();
 if (c)
 {
  e.cancelBubble = true;
  if (e.stopPropagation) e.stopPropagation();
 }
};


function HTMLHttpRequest(myName, callback, allowCache) { with (this)
{
 this.myName = myName;
 this.callback = callback;

 this.xmlhttp = null;
 this.iframe = null;
 window._ifr_buf_count |= 0;
 this.iframeID = 'iframebuffer' + window._ifr_buf_count++;
 this.loadingURI = '';
 this.allowCache = allowCache;

 if (window.ActiveXObject) {
  xmlhttp = new ActiveXObject('Msxml2.XMLHTTP');
  if (!xmlhttp) xmlhttp = new ActiveXObject('Microsoft.XMLHTTP');
 }
 if (window.XMLHttpRequest && !xmlhttp) xmlhttp = new XMLHttpRequest();

 if (!xmlhttp)
 {
  if (document.createElement && document.documentElement &&
   (window.opera || navigator.userAgent.indexOf('MSIE 5.0') == -1))
  {
   var ifr = document.createElement('iframe');
   ifr.setAttribute('id', iframeID);
   ifr.setAttribute('name', iframeID);
   ifr.style.visibility = 'hidden';
   ifr.style.position = 'absolute';
   ifr.style.width = ifr.style.height = ifr.borderWidth = '0px';
   iframe = document.getElementsByTagName('body')[0].appendChild(ifr);
  }
  else if (document.body && document.body.insertAdjacentHTML)
  {
   document.body.insertAdjacentHTML('beforeEnd', '<iframe name="' + iframeID +
    '" id="' + iframeID + '" style="display: none"></iframe>');
  }
  if (window.frames && window.frames[iframeID]) iframe = window.frames[iframeID];
  iframe.name = iframeID;
 }

 return this;
}};



HTMLHttpRequest.prototype.parseForm = function(form) { with (this)
{

 var str = '', gE = 'getElementsByTagName', inputs = [
  (form[gE] ? form[gE]('input') : form.all ? form.all.tags('input') : []),
  (form[gE] ? form[gE]('select') : form.all ? form.all.tags('select') : []),
  (form[gE] ? form[gE]('textarea') : form.all ? form.all.tags('textarea') : [])
 ];

 var plus = '++'.substring(0,1); // CodeTrim fix.
 for (var i = 0; i < inputs.length; i++) {
  for (var j = 0; j < inputs[i].length; j++) {
   var inp = inputs[i][j];
   if (inp && inp.getAttribute('name')) {
    var type = inp.getAttribute('type');
    if ((type != 'checkbox' && type != 'radio') || inp.checked) {
     str += escape(inp.getAttribute('name')).replace(plus, '%2B') +
      '=' + escape(inp.value).replace(plus, '%2B') + '&';
    }
   }
  }
 }
 return str.substring(0, str.length - 1);
}};



HTMLHttpRequest.prototype.xmlhttpSend = function(uri, formStr) { with (this)
{

 xmlhttp.open(formStr ? 'POST' : 'GET', uri, true);
 xmlhttp.onreadystatechange = function() {
  if (xmlhttp.readyState == 4)
  {
   if (callback) callback(xmlhttp.responseXML, xmlhttp.responseText, loadingURI);
   loadingURI = '';
  }
 };
 if ('setRequestHeader' in xmlhttp) {
  if (formStr)
   xmlhttp.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
  if (!allowCache) {
   xmlhttp.setRequestHeader('Cache-Control', 'no-cache');
   xmlhttp.setRequestHeader('Pragma', 'no-cache');
   xmlhttp.setRequestHeader('If-Modified-Since', 'Sat, 1 Jan 1990 00:00:00 GMT');
  }
 }
 if (xmlhttp.overrideMimeType)
  xmlhttp.overrideMimeType((/\.txt/i).test(uri) ? 'text/plain' : 'text/xml');
 xmlhttp.send(formStr);
 loadingURI = uri;
 return true;
}};


HTMLHttpRequest.prototype.iframeSend = function(uri, formRef) { with (this)
{

 if (!document.readyState) return false;

 if (document.getElementById) var o = document.getElementById(iframeID).offsetWidth;

 if (formRef) formRef.setAttribute('target', iframeID);
 else
 {
  var ifrDoc = iframe.contentDocument || iframe.document;

  if (!window.opera && ifrDoc.location &&
   ifrDoc.location.href != location.href) ifrDoc.location.replace(uri);
  else iframe.src = uri;
 }

 loadingURI = uri;
 setTimeout(myName + '.iframeCheck()', (window.opera ? 250 : 100));
 return true;
}};


HTMLHttpRequest.prototype.iframeCheck = function() { with (this)
{

 doc = iframe.contentDocument || iframe.document;
 var il = iframe.location, dr = doc.readyState;
 if ((il && il.href ? il.href.match(loadingURI.replace("\?", "\\?")) : 1) &&
     (dr == 'complete' || (!document.getElementById && dr == 'interactive')))
 {
  var cbDoc = doc.documentElement || doc;
  if (callback) callback(cbDoc,
   (cbDoc.innerHTML || (cbDoc.body ? cbDoc.body.innerHTML : '')), loadingURI);
  loadingURI = '';
 }
 else setTimeout(myName + '.iframeCheck()', 50);
}};



HTMLHttpRequest.prototype.load = function(uri) { with (this)
{

 if (!uri || (!xmlhttp && !iframe)) return false;
 if (xmlhttp) return xmlhttpSend(uri, '');
 else if (iframe) return iframeSend(uri, null);
 else return false;
}};


HTMLHttpRequest.prototype.submit = function(formRef, evt) { with (this)
{

 evt = evt || window.event;
 if (!formRef || (!xmlhttp && !iframe)) return false;

 var method = formRef.getAttribute('method'),
     uri = formRef.getAttribute('action') || location.search || location.pathname;

 if (method && method.toLowerCase() == 'post')
 {
  if (xmlhttp) { cancelEvent(evt); return xmlhttpSend(uri, parseForm(formRef)) }
  else if (iframe) return iframeSend(uri, formRef);
  else return false;
 }
 else
 {
  cancelEvent(evt);
  return load(uri + (uri.indexOf('?') == -1 ? '?' : '&') + parseForm(formRef));
 }
}};

function RemoteFileLoader(myName)
{
 this.myName = myName;
 this.threads = [];
 this.loadingIDs = {};
 this.onload = null;
 this.allowCache = false;
};


RemoteFileLoader.prototype.getThread = function(destId) { with (this)
{

 var thr = -1;

 for (var id in loadingIDs)
 {
  if (id == destId)
  {
   thr = loadingIDs[id];
   break;
  }
 }
 if (thr == -1) for (var t = 0; t < threads.length; t++)
 {
  if (!threads[t].loadingURI)
  {
   thr = t;
   break;
  }
 }
 if (thr == -1)
 {
  thr = threads.length;
  threads[thr] = new HTMLHttpRequest(myName + '.threads[' + thr + ']', null, allowCache);
  loadingIDs[destId] = thr;
 }

 threads[thr].callback = new Function('doc', 'text', 'uri', 'with (' + myName + ') { ' +
  'copyContent(doc, text, "' + destId + '"); if (onload) onload(doc, uri, "' + destId + '") }');

 return threads[thr];
}};


RemoteFileLoader.prototype.loadInto = function(uri, destId)
{
 return this.getThread(destId).load(uri);
};


RemoteFileLoader.prototype.submitInto = function(formRef, destId, event)
{
 return this.getThread(destId).submit(formRef, event);
};


RemoteFileLoader.prototype.copyContent = function(docDOM, docText, destId)
{
 if (this.onCopyContent && this.onCopyContent(docDOM, docText, destId)) return;

 var src = null;
 try {
  if (docDOM) {
   if ('getElementsByTagName' in docDOM) {
    var list = docDOM.getElementsByTagName('body');
    if (list && (0 in list)) src = list[0];
   }
   if (!src && ('body' in docDOM)) src = docDOM.body;
  }
 } catch(err) { }
   
 var dest = document.getElementById ? document.getElementById(destId) :
  (document.all ? document.all[destId] : null);
 if (!dest || (!src && !docText)) return;
 if (src && src.innerHTML) dest.innerHTML = src.innerHTML;
 else if (src && document.importNode)
 {
  while (dest.firstChild) dest.removeChild(dest.firstChild);
  for (var i = 0; i < src.childNodes.length; i++)
   dest.appendChild(document.importNode(src.childNodes.item(i), true));
 }
	else if (docText)
	{
	 if (docText.match(/(<body>)(.*)(<\/body>)/i)) docText = RegExp.$2;
		dest.innerHTML = docText;
	}
};

var docClickLoader = new RemoteFileLoader('docClickLoader');
function docLoader(destId, url){
 var ok = docClickLoader.loadInto(url, destId);
}

