var mousePositions = new Object();

function mouse_init(ev){
  if(!ev) ev = window.event;
  mouse_attachToObject(document);

  return true;
}



function mouse_attachToObject(obj){
  obj = element_isObject(obj);

  obj.alvine_mousePos = new Object();

  //object init  
  event_add(obj, 'mousemove', mouse_getPos);

  return true;
}

function mouse_getPos(ev){
  var mousePos = new Object();

  if(!ev) ev = window.event;

  if(ev.pageX || ev.pageY){
    mousePos = {x:ev.pageX, y:ev.pageY};
  } else {
    mousePos = {
                x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
                y:ev.clientY + document.body.scrollTop  - document.body.clientTop
               };
  }

  this.alvine_mousePos = mousePos;

  /* deprecated */
  if(typeof this.id != 'undefined' && this.id != ''){
    id = this.id;
  } else {
    id = this.type; //element_buildUniqueObjectID(obj);
  }

  if(typeof mousePositions[id] == 'undefined') mousePositions[id] = new Object();
  mousePositions[id]   = mousePos;
  /* deprecated */

  return true;
}


/* deprecated */
function mouse_setPosition(ev){
  
  if(!ev) ev = window.event;
  
  var id = null;
  
  if(typeof this.id != 'undefined' && this.id != ''){
    id = this.id;
  } else {
    id = this.type; //element_buildUniqueObjectID(obj);
  }
  
  if(typeof mousePositions[id] == 'undefined') mousePositions[id] = new Object();

  var pos = mouse_calcPosition(ev);

  mousePositions[id]   = pos;
  this.alvine_mousePos = pos;
  
  return true;
}

/* deprecated */
function mouse_getPosition(obj, relative, position){
  obj = element_isObject(obj);
  if(!obj) return {x:0, y:0};
  
  relative = (relative != true)?false:true;
  
  var id = null;

  if(typeof obj.id != 'undefined' && obj.id != ''){
    id = obj.id;
  } else {
    id = obj.type; //element_buildUniqueObjectID(obj);
  }
  
  if(typeof mousePositions[id] == 'undefined') return {x:0, y:0};
  
  var xpos = mousePositions[id].x;
  var ypos = mousePositions[id].y;
  
  if(typeof position == 'undefined') {
    position = new Object();
    position.x = null;
    position.y = null;
  }
  
  if(relative==true || (position.x != null && position.y != null)){
    var currentObjectPosition =  (position.x != null && position.y != null)?position:element_getPosition(obj, true);

    xpos-= currentObjectPosition.x;
    ypos-= currentObjectPosition.y;
  }
  
  return {x:parseInt(xpos), y:parseInt(ypos)};

}

/* deprecated */
function mouse_calcPosition(ev){

  if(!ev) ev = window.event;
  var xpos;
  var ypos;
  
  if( typeof( ev.pageX ) == 'number' ) {
    //most browsers
    xpos = ev.pageX;
    ypos = ev.pageY;
  } else if( typeof( ev.clientX ) == 'number' ) {
    //Internet Explorer and older browsers
    var windowBorderWidth = 3;
    
    xpos = ev.clientX - windowBorderWidth;
    ypos = ev.clientY - windowBorderWidth;
                     
    if(_ALVINE_IE){
      //Quirks-Modus
      var scrLeft = document.body.scrollLeft;
      var scrTop = document.body.scrollTop;
      
      
      //Standard-Modus
      if(scrLeft==0) scrLeft = document.documentElement.scrollLeft;
      if(scrTop==0) scrTop = document.documentElement.scrollTop;
      xpos+= scrLeft;
      ypos+= scrTop;
    }
  }

  return {x:parseInt(xpos),y:parseInt(ypos)};
}

page_onLoad(mouse_init);
