
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;
}

function Utils() {
  throw "Utils is a static js class.";
}

Utils.arrayToCSV = function(a) {

  var s = "";
  for(var i=0; i<a.length; i++) {
    s = s + a[i] + ",";
  }

  s = s.substring(0, s.length-1); // drop last comma
  return s;
} // arrayToCSV()

Utils.stringToJSON = function(s) {
  return eval("(" + response + ")");
}

Utils.ajaxCreate = function() {
  var xmlHttp = null

  try {
    // Firefox, Opera 8.0+, Safari
    xmlHttp = new XMLHttpRequest();
  }  catch (e) {
    // Internet Explorer
    try {
      xmlHttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      xmlHttp = new ActiveXObject("Microsoft.XMLHTTP");
    } // try
  } // try

  return xmlHttp;

} // ajaxCreate()

/**
 * Ajax GET
 * callback is a function like "function(status, response) { }".
 * Example Usage:
 *    Utils.ajaxCreateCallback("http://someurl/x.pl", function(status, response) {
 *     alert(status + ", " + response);
 *   });
 */
Utils.ajaxCreateCallback = function(url, callback) {
  var ajax = Utils.ajaxCreate();

  ajax.onreadystatechange = function() {
  	  if (ajax.readyState==4) {
        statusCode = ajax.status;
        response = ajax.responseText;
        ajax = null;
        callback(statusCode, response);
      } // if
    }; // onreadystate

    ajax.open("GET", url, true);
		ajax.send(null);

} // ajaxCreateCallback()


Utils.trim = function(str) {

	str = str.replace(/^\s+/, '');
	for (var i = str.length - 1; i >= 0; i--) {
		if (/\S/.test(str.charAt(i))) {
			str = str.substring(0, i + 1);
			break;
		}
	}
	return str;

} // trim()


Utils.getCookie = function(name) {
	var start = document.cookie.indexOf( name + "=" );
	var len = start + name.length + 1;
	if ( ( !start ) && ( name != document.cookie.substring( 0, name.length ) ) ) {
		return null;
	}
	if ( start == -1 ) return null;
	var end = document.cookie.indexOf( ';', len );
	if ( end == -1 ) end = document.cookie.length;
	return unescape( document.cookie.substring( len, end ) );
}

Utils.setCookie = function( name, value, expires, path, domain, secure ) {
	var today = new Date();
	today.setTime( today.getTime() );
	if ( expires ) {
		expires = expires * 1000 * 60 * 60 * 24;
	}
	var expires_date = new Date( today.getTime() + (expires) );
	document.cookie = name+'='+escape( value ) +
		( ( expires ) ? ';expires='+expires_date.toGMTString() : '' ) + //expires.toGMTString()
		( ( path ) ? ';path=' + path : '' ) +
		( ( domain ) ? ';domain=' + domain : '' ) +
		( ( secure ) ? ';secure' : '' );
}

Utils.deleteCookie = function( name, path, domain ) {
	if ( getCookie( name ) ) document.cookie = name + '=' +
			( ( path ) ? ';path=' + path : '') +
			( ( domain ) ? ';domain=' + domain : '' ) +
			';expires=Thu, 01-Jan-1970 00:00:01 GMT';
}

//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------

  /**
   * Constants For addLimitCharsListener()
   */
  EventUtils.CharsAZaz = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ";
  EventUtils.Chars09 = "0123456789";

  function EventUtils() {
    throw "EventUtils is a static js class.";
  }

  EventUtils.getMouseCoordinates = function(evt) {
    e = evt || window.event;
    //mouseX = e.clientX;
    //mouseY = e.clientY;
    //mouseX = e.pageX; // FF ok
    //mouseY = e.pageY; // FF ok

    if (e.pageX || e.pageY) 	{
    	mouseX = e.pageX; // FF
    	mouseY = e.pageY; // FF
   	} else if (e.clientX || e.clientY) 	{
      // IE
    	mouseX = e.clientX + document.body.scrollLeft + document.documentElement.scrollLeft;
    	mouseY = e.clientY + document.body.scrollTop + document.documentElement.scrollTop;
    }

    return [mouseX, mouseY];

  } // getMouseCoordinates

  EventUtils.getSource = function(event) {
    src = event.srcElement ? event.srcElement : event.target;
    return src;
  } // getSource()


  EventUtils.attachEventListener = function(target, type, callback, captures) {

    if (target.addEventListener) {
      // EOMB
      target.addEventListener(type, callback, captures);
    } else if (target.attachEvent) {
      // IE
      target.attachEvent('on' + type, callback, captures);
    } else {
      // IE 5 Mac and some others
      target['on' + type] = callback;
    }

  } // attachEventListener()


  EventUtils.removeEventListener = function(target, type, callback, captures) {

    if (target.removeEventListener) {
      // EOMB
      target.removeEventListener(type, callback, captures);
    } else if (target.detachEvent) {
      // IE
      target.detachEvent('on' + type, callback, captures);
    } else {
      // IE 5 Mac and some others
      target['on' + type] = null;
    }

  } // removeEventListener()


  EventUtils.addLimitCharCountListener = function(target, limit, statusField) {
    EventUtils.attachEventListener(target, "keyup",
      function() {
        if (target.value.length > limit) {
      		target.value = target.value.substring(0, limit);
      	} else {
          if (statusField != null) {
            l = $(statusField);
      	    l.innerHTML = limit - target.value.length;
      	  }
      	}
      },
    false);

    if (statusField != null) {
      $(statusField).innerHTML = limit - target.value.length; // initial value based on input.
    }
  } // addLimitCharCountListener


  EventUtils.addLimitCharsListener = function(target, allowedCharsStr) {

    EventUtils.attachEventListener(target, "keyup",
      function(event) {

        if ((event.keyCode == 37) || (event.keyCode == 39)) {
          // allow left and right cursors.
          return;
        }

        var cpos = UIUtils.getCaretPos(target);

        var w = "";
        for (i=0; i < target.value.length; i++) {
          x = target.value.charAt(i);
          if (allowedCharsStr.indexOf(x,0) != -1)
          w += x;
        }

        target.value = w;
        UIUtils.setCaretPos(target, cpos);
      },
    false);
  } // addLimitCharsListener


  EventUtils.addCheckBoxToggleListener = function(masterCB, slaveCBName) {

    EventUtils.attachEventListener(masterCB, "click",
      function(event) {

        var sel = masterCB.checked;

        var e = document.getElementsByName(slaveCBName);

        if (e) {
          for (var i=0; i<e.length; i++) {
            e[i].checked = sel;

          } // for
        } // if

      }, false);
  } // addCheckBoxToggleListener()

//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------
//-------------------------------------------------------------------------------


  function UIUtils() {
    throw "UIUtils is a static js class.";
  }

  UIUtils.getSelectedRadioValue = function(eName) {

    var inputs = document.getElementsByName(eName);

    if ((!inputs) || (inputs.length == 0)) {
      return null;
    }

    for (var i = 0; i < inputs.length; i++) {
      if (inputs[i].checked) {
          return inputs[i].value;
          break;
       }
    }

    return null;
  } // getSelectedRadioValue()

  UIUtils.getSelectedValuesAsArray = function(eName) {
    var e = document.getElementsByName(eName);

    var selectedValues = new Array();

    for (var i=0; i<e.length; i++) {
      if (e[i].checked) {
        selectedValues[selectedValues.length++] = e[i].value;
      }
    }

    return selectedValues;

 } // getSelectedAsArray()

 /**
  * If objOrId is a string it is resolved to an object with that id
  * and that object returned. It objOrId is a non-string it is assumed to be an
  * object that is returned.
  */
 UIUtils.resolveObject = function(objOrId) {
   var e = null;
   if (typeof objOrId == "string") {
     e = document.getElementById(objOrId);
   } else {
     e = objOrId;
   }

   return e;
 } // resolveObject()

 /**
  * Centre an Object to the browser client window
  * Style position:absolute is needed.
  */
 UIUtils.centreToBrowser = function(obj) {

   var e = UIUtils.resolveObject(obj);

   e.style.position = "absolute";

	 var sl = document.body.scrollLeft;
   var st = document.body.scrollTop;

   var cw = document.body.clientWidth;
   var ch = document.body.clientHeight;

   var oh = e.offsetHeight;
   var ow = e.offsetWidth;

   
   e.style.top = st + ((ch/2) - (oh/2)) + "px";
   e.style.left = sl + ((cw/2) - (ow/2)) + "px";

 } // centreToBrowser()

 /**
  * Centre an Object to the browser client window
  * Style position:absolute is needed.
  */
 UIUtils.centreToElement = function(sourceObj, targetToObj, adjX, adjY) {
   var s = UIUtils.resolveObject(sourceObj);
   var t = UIUtils.resolveObject(targetToObj);

   if (!adjX) adjX = 0;
   if (!adjY) adjY = 0;

   s.style.position = "absolute";

   var tmp = UIUtils.findXY(t);

   var tx = tmp[0];
   var ty = tmp[1];
   var tw = t.offsetWidth;
   var th = t.offsetHeight;

   var tmp = UIUtils.findXY(s);

   var sx = tmp[0];
   var sy = tmp[1];
   var sw = s.offsetWidth;
   var sh = s.offsetHeight;

   var sourceNewX = tx - (sw / 2) + (tw / 2) + adjX;
   var sourceNewY = ty - (sh / 2) + (th / 2) + adjY;

   s.style.top  = sourceNewY + "px";
   s.style.left = sourceNewX + "px";

 } // centreToElement()

 /**
  * Centre an Object to the browser client window
  * Style position:absolute is needed.
  */
 UIUtils.centreAt = function(sourceObj, x, y) {
   var s = UIUtils.resolveObject(sourceObj);

   s.style.position = "absolute";

   var tmp = UIUtils.findXY(s);

   var sx = tmp[0];
   var sy = tmp[1];
   var sw = s.offsetWidth;
   var sh = s.offsetHeight;

   var sourceNewX = x - (sw / 2);
   var sourceNewY = y - (sh / 2);

   s.style.top  = sourceNewY + "px";
   s.style.left = sourceNewX + "px";

 } // centreToElement()

 /**
   * Toggle Show/Hide element. Element needs layout: eg style='position:absolute; top:10px; left:10px'
   * @return true if object shown, false if hidden.
   */
  UIUtils.toggleShowHide = function(obj) {
    var e = UIUtils.resolveObject(obj);

    current = e.style.display;

    if (current == "none") {
      current = e.style.display = "block";
      return true;
    } else {
      current = e.style.display = "none";
      return false;
    }
  }


 /**
   *  Show element. Element needs layout: eg style='position:absolute; top:10px; left:10px'
   */
  UIUtils.show = function(obj) {
    var e = UIUtils.resolveObject(obj);
    e.style.display = "block";
  }

  /**
   *  Hide element
   */
  UIUtils.hide = function(obj) {
    var e = UIUtils.resolveObject(obj);
    e.style.display = "none";
  }

  /**
   * Find x,y for element.
   * returns array [x,y]
   */
  UIUtils.findXY = function(obj) {
    obj = UIUtils.resolveObject(obj);

    var curleft = curtop = 0;

    if (obj.offsetParent) {
      do {
  	    curleft += obj.offsetLeft;
  	    curtop += obj.offsetTop;
      } while (obj == obj.offsetParent);

      return [curleft,curtop]; // x,y
    }
  } // findXY()

  UIUtils.getCaretPos = function(obj) {
    var e = UIUtils.resolveObject(obj);

    var pos = 0;

    if(obj.createTextRange) {
      // IE
      obj.focus();
		  var sel = document.selection.createRange();
		  sel.moveStart('character', -obj.value.length);
		  pos = sel.text.length;

    } else if(obj.selectionStart) {
        // Gecko
        obj.focus();
        pos = obj.selectionStart;
    }

    return pos;
  } // getCaretPos()

  UIUtils.setCaretPos = function(obj, pos) {
    var e = UIUtils.resolveObject(obj);

    if(obj.createTextRange) {
        /* IE Create a TextRange, set the internal pointer to
           a specified position and show the cursor at this
           position
        */
        var range = obj.createTextRange();
        range.move("character", pos);
        range.select();
    } else if(obj.selectionStart) {
        /* Gecko */
        obj.focus();
        obj.setSelectionRange(pos, pos);
    }
  } // setCaretPos()

