/**
* Common JS functions for LatPro
* so far
* 1. addLoadListener
* 2. trim
* 3. appendOptionToSelect
* 4. removeLastOptionFromSelect
* 5. attachEventListener
* 6. getEventTarget
* 7. getScrollingPosition
* 8. getViewportSize
* 9. getPageDimensions
**/


function addLoadListener(fn) {
  if (typeof window.addEventListener != 'undefined') {
		window.addEventListener('load', fn, false);
  }
  else if (typeof document.addEventListener != 'undefined') {
		document.addEventListener('load', fn, false);
  }
  else if (typeof window.attachEvent != 'undefined') {
		window.attachEvent('onload', fn);
  }
  else {
		var oldfn = window.onload;
		if (typeof window.onload != 'function') {
		  window.onload = fn;
		}
		else {
		  window.onload = function() {
				oldfn();
				fn();
		  };
		}
  }
}

/**
* Trim function
**/
function trim(value) {
	var re = RegExp(String.fromCharCode(160),"g") ;
   var temp = value.replace(re, '');
   var obj = /^(\s*)([\W\w]*)(\b\s*$)/;
   if (obj.test(temp)) { temp = temp.replace(obj, '$2'); }
   var obj = /  /g;
   while (temp.match(obj)) { temp = temp.replace(obj, " "); }
   return temp;
}

// create many overloaded versions of this
/**
* This is a wrapper for the DOM Level 1 to add elements in HTMLSelectElement
* and PECULIARLY! IE does NOT conform to the specification so here we add some 
* workaround to deal with it
**/
function appendOptionToSelect(selectRef, element) {
	try {
  	selectRef.add(element, null);
  }
  catch(ex) {
    selectRef.add(element); // IE only
  }
}

/**
* Remove Last option based on DOM Lv 1
**/
function removeLastOptionFromSelect(selectRef) {
	if (selectRef.length > 0)
		selectRef.remove(selectRef.length - 1);
}

/**
* Remove all the options for the refereced select
**/
function clearAllOptions(selectRef) {
	while (selectRef.length > 0)
		selectRef.remove(selectRef.length - 1);
}

function attachEventListener(target, eventType, functionRef, capture) {
  if (typeof target.addEventListener != "undefined") {
    target.addEventListener(eventType, functionRef, capture);
  }
  else if (typeof target.attachEvent != "undefined") {
    target.attachEvent("on" + eventType, functionRef);
  }
  else {
    eventType = "on" + eventType;

    if (typeof target[eventType] == "function") {
      var oldListener = target[eventType];

      target[eventType] = function() {
        oldListener();

        return functionRef();
      }
    }
    else {
      target[eventType] = functionRef;
    }
  }

  return true;
}
	
function getEventTarget(event) {
  var targetElement = null;

  if (typeof event.target != "undefined") {
    targetElement = event.target;
  }
  else {
    targetElement = event.srcElement;
  }

  while (targetElement.nodeType == 3 && targetElement.parentNode != null) {
    targetElement = targetElement.parentNode;
  }

  return targetElement;
}

function getScrollingPosition() {
  //array for X and Y scroll position
  var position = [0, 0];

  //if the window.pageYOffset property is supported
  if (typeof window.pageYOffset != 'undefined') {
    //store position values
    position = [
        window.pageXOffset,
        window.pageYOffset
    ];
  }

  //if the documentElement.scrollTop property is supported
  //and the value is greater than zero
  if (typeof document.documentElement.scrollTop != 'undefined'
      && document.documentElement.scrollTop > 0) {
    //store position values
    position = [
        document.documentElement.scrollLeft,
        document.documentElement.scrollTop
    ];
  }

  //if the body.scrollTop property is supported
  else if(typeof document.body.scrollTop != 'undefined') {
    //store position values
    position = [
        document.body.scrollLeft,
        document.body.scrollTop
    ];
  }

  //return the array
  return position;
}

function getViewportSize() {
  var size = [0,0];

  if (typeof window.innerWidth != 'undefined') {
    size = [
        window.innerWidth,
        window.innerHeight
    ];
  }
  else if (typeof document.documentElement != 'undefined'
      && typeof document.documentElement.clientWidth != 'undefined'
      && document.documentElement.clientWidth != 0) {
    size = [
        document.documentElement.clientWidth,
        document.documentElement.clientHeight
    ];
  }
  else {
    size = [
        document.getElementsByTagName('body')[0].clientWidth,
        document.getElementsByTagName('body')[0].clientHeight
    ];
  }

  return size;
}

function getPageDimensions() {
  var body = document.getElementsByTagName("body")[0];
  var bodyOffsetWidth = 0;
  var bodyOffsetHeight = 0;
  var bodyScrollWidth = 0;
  var bodyScrollHeight = 0;
  var pageDimensions = [0, 0];

  if (typeof document.documentElement != "undefined" &&
      typeof document.documentElement.scrollWidth != "undefined") {
    pageDimensions[0] = document.documentElement.scrollWidth;
    pageDimensions[1] = document.documentElement.scrollHeight;
  }

  bodyOffsetWidth = body.offsetWidth;
  bodyOffsetHeight = body.offsetHeight;
  bodyScrollWidth = body.scrollWidth;
  bodyScrollHeight = body.scrollHeight;

  if (bodyOffsetWidth > pageDimensions[0]) {
    pageDimensions[0] = bodyOffsetWidth;
  }

  if (bodyOffsetHeight > pageDimensions[1]) {
    pageDimensions[1] = bodyOffsetHeight;
  }

  if (bodyScrollWidth > pageDimensions[0]) {
    pageDimensions[0] = bodyScrollWidth;
  }

  if (bodyScrollHeight > pageDimensions[1]) {
    pageDimensions[1] = bodyScrollHeight;
  }

  return pageDimensions;
}

// Finds the absolute X position of the given object
function findPosX(obj) {
	var curleft = 0;
    if(obj.offsetParent)
        while(1) {
          curleft += obj.offsetLeft;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.x)
        curleft += obj.x;
    return curleft;
}

// Finds the absolute Y position of the given object
function findPosY(obj) {
    var curtop = 0;
    if(obj.offsetParent)
        while(1) {
          curtop += obj.offsetTop;
          if(!obj.offsetParent)
            break;
          obj = obj.offsetParent;
        }
    else if(obj.y)
        curtop += obj.y;
    return curtop;
}