// file xhrArray.js
/////////////////////////////////
// Fire on formfield change example
// Set initial value, then:
// 1. check for change at regular intervals
// <span onfocus="xhrArray('set', 'myId', formname.id.value);
// myInterval = window.setInterval(function(a,b) {
//  if (xhrArray('reset', 'myId', formname.id.value)) { GetData( [config] )} },3000)"; 
//  onblur="clearTimeout(myInterval)">
// 2. check for change on keyUp
// onkeyup="xhrArray('set', 'myId', formname.id.value);
// if (xhrArray('reset', 'myId', formname.id.value)) {
//  document.getElementById('busyindicator').innerHTML='&nbsp;<IMG SRC=\/images\/hourglass.gif  height=14 width=9>';
//  GetData( [config] )">
/////////

var myInterval; // initialise before window.setInterval call

////////

/*
Usage
<span onMouseDown="xhrProcess(
'set',				// myCommand 	set|read|delreset|unshift|shift|push|pop
'a.b.c.1',			// myArrayName 	object, up to 5 names or numbers
['1', '2', '3']			// myValue	'string' or ['array', 'of', 'strings'] 
);

xhrArray is an interface to an arbitrary javascript data structure.


1. myCommand.

2. myArrayName
Reference to an object.

3. 


Thus:
('set', 'a.b', 'ab')			set a.b to 'ab'
('set', 'a.b.c', 'abc')			set a.b.c to 'abc'		convert a.b to object, lose value
('set', 'a.b.c', ['this', 'array'])	set a.b.c to ['this', 'array']	overwrite previous value with array
('reset', 'a.b.c', 'abc')		reset a.b.c to 'abc'		true if changed
('del', 'a.b') 				delete a.b and all child objects.
('set', 'a.b.c.1', ['1','2','3','4'])	set a.b.c.1 to ['1','2','3','4']
('set', 'a.b.c.1.0', 'MM')		set a.b.c.1.0 to 'MM'
('set', 'a.b.c.2', 'WOO')		set a.b.c.2 to 'WOO'
('push', 'a.b.c', 'pushed')		push a.b.c 'pushed'		set a.b.c[next] to new value
('push', 'a.b.c', ['pushed', 'array'])	push a.b.c ['pushed', 'array']	set a.b.c[next] to new array
('pop', 'a.b.c')			pop a.b.c			fetch and remove a.b.c[last]
('pop', 'a.b.c.1')			pop a.b.c.1
('unshift', 'a.b.c', 'shifted')		unshift a.b.c 'unshifted'	insert as array[0]
('shift', 'a.b.c')			shift a.b.c			fetch and remove a.b.c[0]
GetDate('','','my.hidden.panel', 'hello world') is thus equivalent to xhr('set', 'my.hidden.panel', 'hello world') 
GetDate('','','maintablepanel', xhr('read', 'my.hidden.panel')) to place onto screen
*/


var myCommand;
var myArrayName;
var myValue;
var register = new Array();
function xhrArray(myCommand, myArrayName, myValue) {
 var iValue;
 if (myCommand == 'reset') {
  iValue = xhrArray('read', myArrayName);
 }
 var thisArray0 = new Array();
 var thisArray1 = new Array();
 var thisArray2 = new Array();
 var thisArray3 = new Array();
 var thisArray4 = new Array();
 var arrayRef = new Array();
 var keyRef = '';
 var arrayElements = myArrayName.split(".");
//if ((arrayElements[1]) && (myArrayName)) {
// var arrayElements = new Array();
// arrayElements[0] = myArrayName;
//}
 if (arrayElements) {
  if (typeof(register) != 'object') {
   register = new Array();
  }
  if (typeof(register[arrayElements[0]]) != 'object') {
   if ((myCommand == 'read') || (myCommand == 'pop') || (myCommand == 'shift')) { return ''; }
   register[arrayElements[0]] = new Array();
  }                                                        // arrayRefName = 'register';
  if ((typeof(register[arrayElements[0]]) == 'string') && (typeof(myValue) != 'undefined') && (arrayElements[1])) {
   register[arrayElements[0]] = new Array();               // overwriting r.a0 value with r.a0.a1 object/value         
  }
  thisArray0 = register[arrayElements[0]];
  if (arrayElements[1]) {
   if ((typeof(thisArray0[arrayElements[1]]) != 'object') && (typeof(thisArray0[arrayElements[1]]) != 'string')) {
    if ((myCommand == 'read') || (myCommand == 'pop') || (myCommand == 'shift')) { return ''; }
    thisArray0[arrayElements[1]] = new Array();
   }
   if ((typeof(thisArray0[arrayElements[1]]) == 'string') && (typeof(myValue) != 'undefined') && (arrayElements[2])) {
    thisArray0[arrayElements[1]] = new Array();
   }
   thisArray1 = thisArray0[arrayElements[1]];
   if (arrayElements[2]) {                           // arrayRefName = 'register.' + arrayElements[0] + '.' + arrayElements[1];
    if ((typeof(thisArray1[arrayElements[2]]) != 'object') && (typeof(thisArray1[arrayElements[2]]) != 'string')) {
     if ((myCommand == 'read') || (myCommand == 'pop') || (myCommand == 'shift')) { return ''; }
     thisArray1[arrayElements[2]] = new Array();
    }
    if ((typeof(thisArray1[arrayElements[2]]) == 'string') && (typeof(myValue) != 'undefined') && (arrayElements[3])) {
     thisArray1[arrayElements[2]] = new Array();
    }
    thisArray2 = thisArray1[arrayElements[2]];
    if (arrayElements[3]) {
     if ((typeof(thisArray2[arrayElements[3]]) != 'object') && (typeof(thisArray2[arrayElements[3]]) != 'string')) {
      if ((myCommand == 'read') || (myCommand == 'pop') || (myCommand == 'shift')) { return ''; }
      thisArray2[arrayElements[3]] = new Array();
     }
     if ((typeof(thisArray2[arrayElements[3]]) == 'string') && (typeof(myValue) != 'undefined') && (arrayElements[4])) {
      thisArray2[arrayElements[3]] = new Array();          // overwriting r.a0.a1.a2.a3 value with r.a0.a1.a2.a3.a4 object/value
     }
     thisArray3 = thisArray2[arrayElements[3]];
     if (arrayElements[4]) {
      if ((typeof(thisArray3[arrayElements[4]]) != 'object') && (typeof(thisArray3[arrayElements[4]]) != 'string')) { 
      if ((myCommand == 'read') || (myCommand == 'pop') || (myCommand == 'shift')) { return ''; }
       thisArray3[arrayElements[4]] = new Array();
      }
      thisArray4 = thisArray3[arrayElements[4]];
      arrayRef = thisArray3;
      keyRef = arrayElements[4];
     } else {
      arrayRef = thisArray2;
      keyRef = arrayElements[3];
     } 
    } else {
     arrayRef = thisArray1;
     keyRef = arrayElements[2];
    } 
   } else {
    arrayRef = thisArray0;
    keyRef = arrayElements[1];
   }
  } else {
   arrayRef = register;
   keyRef = arrayElements[0];
  }
// now the action
  if (myCommand == 'read') {
   if (arrayRef[keyRef].value) {
// alert('returning value' + arrayRef[keyRef].value);
    return arrayRef[keyRef].value;
   } else if (arrayRef[keyRef] != '') {
// alert('returning obj' + arrayRef[keyRef]);
    return arrayRef[keyRef];	
   } else {
// alert('not returning obj' + arrayRef[keyRef]);
    return '';
   }
  }

  if (myCommand == 'set') {
   if (typeof(myValue) == 'string') {
    arrayRef[keyRef] = myValue;
    return myValue;
   } else {
    arrayRef[keyRef] = myValue;
    return myValue.length;
   }
  }

  if (myCommand == 'reset') {
   if (iValue == myValue) {
    return false;
   } else {
    if (typeof(myValue) == 'string') {
     arrayRef[keyRef] = myValue;
     return true;
    } else {
     arrayRef[keyRef] = myValue;
     return true;
    }
   }
  }

  if (myCommand == 'del') {
if (typeof(arrayRef[keyRef])) {
   delete arrayRef[keyRef];
}
   return true;
  }

  if (myCommand == 'push') {
   if (typeof(arrayRef[keyRef]) != 'object') {
    var stringVal;
    if (arrayRef[keyRef].value) {
     stringVal = arrayRef[keyRef].value;
    } else if (arrayRef[keyRef]) {
     stringVal = arrayRef[keyRef];
    }
    arrayRef[keyRef] = new Array(stringVal);
   }
   return arrayRef[keyRef].push(myValue);
  }

  if (myCommand == 'pop') {
   if (typeof(arrayRef[keyRef]) == 'object') {
    return arrayRef[keyRef].pop();
   }else {                                 // pseudo pop a string
    if (arrayRef[keyRef].value) {  
     var poppedvalue = arrayRef[keyRef].value;
     delete arrayRef[keyRef];
     return poppedvalue;
    } else if (arrayRef[keyRef]) {
     var poppedvalue = arrayRef[keyRef];
     delete arrayRef[keyRef];
     return poppedvalue;
    } else {
     return '';
    }
   }
  }

  if (myCommand == 'unshift') {
   if (typeof(arrayRef[keyRef]) != 'object') {
    var stringVal;
    if (arrayRef[keyRef].value) {
     stringVal = arrayRef[keyRef].value;
    } else if (arrayRef[keyRef]) {
     stringVal = arrayRef[keyRef];
    }
    arrayRef[keyRef] = new Array(stringVal);
   }
   return arrayRef[keyRef].unshift(myValue);
  }

  if (myCommand == 'shift') {
   if (typeof(arrayRef[keyRef]) == 'object') {
    return arrayRef[keyRef].shift();
   }else {                              // pseudo shift a string
    if (arrayRef[keyRef].value) {
     var poppedvalue = arrayRef[keyRef].value;
     delete arrayRef[keyRef];
     return poppedvalue;
    } else if (arrayRef[keyRef]) {
     var poppedvalue = arrayRef[keyRef];
     delete arrayRef[keyRef];
     return poppedvalue;
    } else {
     return '';
    }
   }

  }
 }
 return false;
}
/// emulate functions for IE5.0
function Array_push() {
  var A_p = 0
  for (A_p = 0; A_p < arguments.length; A_p++) {
   this[this.length] = arguments[A_p]
   }
  return this.length
}

if (typeof(Array.prototype.push) == "undefined") {
 Array.prototype.push = Array_push
}

function Array_pop() {
  var response = this[this.length - 1]
  this.length--
  return response
}

if (typeof(Array.prototype.pop) == "undefined") {
  Array.prototype.pop = Array_pop
}

function Array_shift() {
  var A_s = 0
  var response = this[0]
  for (A_s = 0; A_s < this.length-1; A_s++) {
   this[A_s] = this[A_s + 1]
   }
  this.length--
  return response
}

if (typeof(Array.prototype.shift) == "undefined") {
  Array.prototype.shift = Array_shift
}

function Array_unshift() {
  var A_u = 0
  for (A_u = this.length-1; A_u >= 0; A_u--) {
   this[A_u + arguments.length] = this[A_u]
   }
  for (A_u = 0; A_u < arguments.length; A_u++) {
   this[A_u] = arguments[A_u]
   }
  return this.length
}

if (typeof(Array.prototype.unshift) == "undefined") {
  Array.prototype.unshift = Array_unshift
}
///
function OLDtoggle(target,toggle,on,off) {
 if (document.getElementById(toggle).innerHTML == on) {
  xhrArray('set','hidden.' + target, document.getElementById(target).innerHTML);
  document.getElementById(target).innerHTML='';
  document.getElementById(toggle).innerHTML=off;
 } else {
  document.getElementById(target).innerHTML=xhrArray('pop','hidden.' + target);
 document.getElementById(toggle).innerHTML=on;
 }
};
function TESTINGtoggle(target) {
 if (document.getElementById(target).innerHTML == '') {
  document.getElementById(target).innerHTML=xhrArray('pop','hidden.' + target);
 } else {
  xhrArray('set','hidden.' + target, document.getElementById(target).innerHTML);
  document.getElementById(target).innerHTML='';
 }
};
// next new 2006-11-11, optional 'toggle/on/off' values, return false for virgin field
function toggle(target,toggle,on,off) {
 if (document.getElementById(target).innerHTML == '') {
  if (xhrArray('read', 'hidden.' + target) == '') {
   return false;
  }
  document.getElementById(target).innerHTML=xhrArray('pop','hidden.' + target);
  if ((toggle) && (on) && (off)) {
   document.getElementById(toggle).innerHTML=on;
  }
 } else {
  xhrArray('set','hidden.' + target, document.getElementById(target).innerHTML);
  document.getElementById(target).innerHTML='';
  if ((toggle) && (on) && (off)) {
   document.getElementById(toggle).innerHTML=off;
  }
 }
// return true;
};

