/**
 * @returns A string which specifies which is the current browser in which we
 *          are running.
 * 
 * Currently-supported browser detection and codes: * 'opera' -- Opera * 'msie' --
 * Internet Explorer * 'safari' -- Safari * 'firefox' -- FireFox * 'mozilla' --
 * Mozilla
 * 
 * If we are unable to property identify the browser, we return an empty string.
 * 
 * @type String
 */
function broserName() {
  var browserName = "";

  var ua = navigator.userAgent.toLowerCase();
  if (ua.indexOf("opera") != -1) {
    browserName = "opera";
  } else if (ua.indexOf("msie") != -1) {
    browserName = "msie";
  } else if (ua.indexOf("chrome") != -1) {
    browserName = "chrome";
  } else if (ua.indexOf("safari") != -1) {
    browserName = "safari";
  } else if (ua.indexOf("mozilla") != -1) {
    if (ua.indexOf("firefox") != -1) {
      browserName = "firefox";
    } else {
      browserName = "mozilla";
    }
  }

  return browserName;
}

function findPos(obj) {
  if (!obj) {
    printStackTrace();
  }
  var curleft = curtop = 0;
  if (obj.offsetParent) {
    do {
      curleft += obj.offsetLeft;
      curtop += obj.offsetTop;
    } while (obj = obj.offsetParent);
  }
  return [ curleft, curtop ];
}

function mousePos(evt, winEvt) {
  if (evt)
    return [ evt.clientX, evt.clientY ];
  else if (winEvt)
    return [ winEvt.x, winEvt.y ];
  else
    return [ event.x, event.y ];
}

function cancelSystemEvent(evt) {
  if (evt.stopPropagation)
    evt.stopPropagation();
  else
    evt.cancelBubble = true;
  if (evt.preventDefault)
    evt.preventDefault();
  else
    evt.returnValue = false;
}

function printStackTrace() {
  var output;
  if (browserName=="msie") { // IE and Safari
    var currentFunction = arguments.callee.caller;
    while (currentFunction) {
      var fn = currentFunction.toString();
      var fname = fn.substring(fn.indexOf("function") + 8, fn.indexOf('{')) || 'anonymous';
      output = output+fname+"\n";
      currentFunction = currentFunction.caller;
    }
  } else  {
    try {
      i.dont.exist+=0; // doesn't exist- that's the point
    } catch(e) {
      if (e.stack) { // Firefox
        output = e.stack;
      } else if (window.opera && e.message) { // Opera
        output = e.message;
      }
    }
  }
  alert(output+"\n\n");
}


function clickCheckBox(fieldId, linkImgId, checkedImg, blankImg) {
  var field = document.getElementById(fieldId);
  var linkImg = document.getElementById(linkImgId);
  if (field.value == "true") {
    field.value = "false";
    linkImg.src = blankImg;
  } else {
    field.value = "true";
    linkImg.src = checkedImg;
  }
}

function clickRadioButton(fieldId, linkImg1Id, linkImg2Id, value, checkedImg, blankImg) {
  var linkImg1 = document.getElementById(linkImg1Id);
  var linkImg2 = document.getElementById(linkImg2Id);
  if (value) {
    linkImg1.src = checkedImg;
    linkImg2.src = blankImg;
  } else {
    linkImg1.src = blankImg;
    linkImg2.src = checkedImg;
  }

  var field = document.getElementById(fieldId);
  field.value = value;
}

function clearFieldDefault(fieldId, defaultValue) {
  var field = document.getElementById(fieldId);
  if (field.value == defaultValue) {
    field.value = '';
  }
}

/**
 * Event handler for mouse wheel event.
 */
function handleWheelEvent(event, step, callbackFunction) {
  var delta = 0;
  if (!event) /* For IE. */
    event = window.event;
  if (event.wheelDelta) { /* IE/Opera. */
    delta = event.wheelDelta / 120;
    /**
     * In Opera 9, delta differs in sign as compared to IE.
     */
    if (window.opera)
      delta = -delta;
  } else if (event.detail) {
    /** Mozilla case. */
    /**
     * In Mozilla, sign of delta is different than in IE. Also, delta is
     * multiple of 3.
     */
    delta = -event.detail / 3;
  }
  delta *= step;
  delta = -delta;
  /**
   * Prevent default actions caused by mouse wheel. That might be ugly, but we
   * handle scrolls somehow anyway, so don't bother here..
   */
  if (event.preventDefault)
    event.preventDefault();
  event.returnValue = false;
  callbackFunction(delta);
}

function addWheelEventHandler(component, step, callbackFunction) {
  wheelHandler = function(event) {
    handleWheelEvent(event, step, callbackFunction)
  };
  /**
   * Initialization code. If you use your own event management code, change it
   * as required.
   */
  if (window.addEventListener)
    /** DOMMouseScroll is for mozilla. */
    component.addEventListener('DOMMouseScroll', wheelHandler, false);
  /** IE/Opera. */
  component.onmousewheel = wheelHandler;
}

function onMouseUp(evt) {
  for ( var globalMouseUp in globalMouseUps) {
    globalMouseUps[globalMouseUp].run(evt);
  }
}

function onMouseMove(evt) {
  for ( var globalMouseMove in globalMouseMoves) {
    globalMouseMoves[globalMouseMove].run(evt);
  }
}

function addMouseMoveHandler(obj,name) {
  obj.name=name;
  for (i in globalMouseMoves) {
    if (globalMouseMoves[i].name==obj.name) {
      globalMouseMoves.splice(i,1);
      break;
    }
  }
  globalMouseMoves.push(obj);
}

function addMouseUpHandler(obj,name) {
  obj.name=name;
  for (i in globalMouseUps) {
    if (globalMouseUps[i].name==obj.name) {
      globalMouseUps.splice(i,1);
      break;
    }
  }
  globalMouseUps.push(obj);
}

function openWindow(actionUrl, w, h, popupId) {
  if (!popupId) {
    popupId="";
  }
  window
    .open(
        actionUrl,
        popupId,
        "width="+w+",height="+h+",top=100,left=100,directories=no,status=no,toolbar=no,menubar=no,location=no,scrollbars=yes,resizable=yes,resize=1");
}

var browserName = broserName();
var globalMouseUps = [];
var globalMouseMoves = [];

document.onmouseup = onMouseUp;
document.onmousemove = onMouseMove;

