var SB;			// Save button
var ST;			// status bar
var D;			// Debug message box
var MT = null;
var ta = 0;
var Pd = 0;
var Wait = 0;
var data;		// POST data

var Debug = 0;
var NoS = 1;

// Wait for save
function Ws(s) {
	if (Wait && NoS) 
		switch (s) {
			case 1: Cancel(); break;
			case 2: alert("Sorry, your changes could not be saved."); break;
		}
}

//----------------------------------------------------------------------
// DOM Functions

function ce(e,h) {
	var o = document.createElement(e);
	if (h) o.innerHTML = h;
	return o;
}
function rc(o) { o.parentNode.removeChild(o); }
function ci(c,o) {
	c.appendChild(o);
}


//----------------------------------------------------------------------
// XMLHttpRequest

function gr2() {
  var xmlhttp = false;
  try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
  } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (E) {
        xmlhttp = false;
      }
  }
  if (!xmlhttp && typeof XMLHttpRequest != 'undefined') {
    try {
      xmlhttp = new XMLHttpRequest();
    } catch (e) {
      xmlhttp = false;
    }
  }
  return xmlhttp;
}

function gr() {
      return new XMLHttpRequest();
}

//--------------------------------------------------------
// Data functions

function md2(v,k,i,n) {
	//alert(v+':'+k+':'+i+':'+n);
	var d = document.getElementById(n+i).value;
	mdx(v,k,d);
}
function mdx(v,i,x) {
	data += mdk(v,i,x);
}
function md3(v,x) {
	data += '&'+v+'='+encodeURI(x);	
}

function mdk(v,i,x) {
	return '&'+v+'['+i+']='+encodeURI(x);	
}


// HACK: refine this
function dbg(t) {
	if (D) D.innerHTML = t;
}
function dbg2(t) {
	if (D) D.innerHTML = D.innerHTML + t + '<br>';
}

// BOZO:  be able to specify a function on error
//  use something like Prototype:  an Object for this ...

// specify :  method, timeout, onerror, status stuff, url, function, args
//  cross-browser ...

// BOZO:  method if obj is null
function makeReq(url,fname) {
	var Q = gr2();
	if (Q) {
		Q.onreadystatechange = function () {
			if (Q.readyState == 4) { 
				try {
					if (Q.status == 200) eval(fname+'(Q.responseText)');
				} catch(e) {
					alert(e);
				}
			} 
		}
		Q.open('GET',url);
		Q.send(null);
	}
}
function makeReq2(url,data) {
	var Q = gr2();
	if (Q) {
		Q.onreadystatechange = function () {
			if (Q.readyState == 4) { 
				try {
					if (Q.status == 200) dbg2(Q.responseText);
				} catch(e) {
					alert(e);
				}
			} 
		}
		Q.open('POST',url);
		Q.send(data);
	}
}

//----------------------------------------------------------------------
// Update function
function update() {
	var Q = gr2();
	Wait = 1;

	if(!Q) {
		status(3,2);
		// BOZO:  message, not here on incompatible browsers
		// better: check that we can create this object when first loading page ...
		// better: use alternate save method with iFrame or Java for Opera 7.3
		Wait = 0;
		return;
	}
	// Disable save and reset buttons
	if (SB) SB.disabled = 1;
	status(5);

	data = 'save=1';
	getData();

	if (Debug) { dbg2(data); if (Debug==1) return; }
	//alert(data);

	// BOZO: save specified vars


	// Send request
	if (Q) {
		Q.onreadystatechange = function () {
			if (Q.readyState == 4) { 
				try {
				if (Q.status == 200) 
					if (Debug) dbg2(Q.responseText); 
					if (Q.responseText=='1') {
						status(2);
						clear();
					} else {
						status(3,2);
						Wait = 0;
						SB.disabled = 0;
					}
				} catch(e) {
					status(3,2);
					Wait = 0;
					SB.disabled = 0;
				}
			} 
		}
		//alert(sURL);
		Q.open('POST',sURL);
		Q.send(data);
		//ReqN[rn++] = 1;
		setTimeout('saveChk()',15000);	// 15 seconds
	}

}

/*
function clear() {
}
*/

function saveChk() {
	if (Wait) {
		status(4,2);

		// Save failed: restore saved variables

		// clear locks

		// enable Save button
		Wait = 0;
		SB.disabled = 0;
	}
}

function addLoadEvent(func) {
  var oldonload = window.onload;
  if (typeof window.onload != 'function') {
    window.onload = func;
  } else {
    window.onload = function() {
      oldonload();
      func();
    }
  }
}


// Init debug box if required
// BOZO:  need addLoadEvent
addLoadEvent(function() {
	if (Debug) {
		D = ce('div'); 
		ci(document.body,D);
		// BOZO: broken in IE!
		if (!document.all) D.style.border='2px solid red; padding: 4px;';
	}
	ST = $('sts');
	SB = $('updbtn');
});

var Req = {};
function doreq(v,u,f) {
	if (typeof v != 'undefined') try { eval(f+'(null)') } catch(err) { alert(err); }
	else {
		if (Req[u]) return;
		Req[u] = 1;
		var Q = gr2();
		Q.onreadystatechange = function () {
			if (Q.readyState == 4) { 
				try {
				if (Q.status == 200) 
					try { 
						try { eval(f+'(Q.responseText)'); } catch(e) { alert(e); }
					} catch(err) {
						alert(err);
					}
				} catch(e) {
					//status(3,2);
					if (SB) SB.disabled = 0;
				}
			} 
		}
		Q.open('GET',u);
		Q.send(null);
	}
}

//=======================================================================
// From prototype.js

function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1)
      return element;

    elements.push(element);
  }

  return elements;
}

