if(typeof alvine != 'object') alvine = new Object();
alvine_object_createObjectPath(alvine, 'data.mouse.positions.document');

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

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

  obj.alvine_ID = (typeof obj.id != 'undefined')?obj.id:obj.nodeName.toString().substr(1).toLowerCase();

  if(typeof alvine.data.mouse.positions[obj.alvine_ID] == 'undefined') alvine.data.mouse.positions[obj.alvine_ID] = {x:0,y:0};

  obj.alvine_getMousePosition = function(includeScrollPosition, relative){
    includeScrollPosition = (includeScrollPosition===false)?false:true;
    relative = (relative===true)?true:false;
    
    var ret = alvine.data.mouse.positions[this.alvine_ID];

    if(!includeScrollPosition){
      var scrollPos = element_getScrollPosition();
      ret.x -= scrollPos.x;
      ret.y -= scrollPos.y;
    }

    if(!relative) return {x:parseInt(ret.x),y:parseInt(ret.y)};
    
    var pos = element_getPosition(this, true);

    var newPos = {};
    newPos.x = parseInt(ret.x);
    newPos.y = parseInt(ret.y);

    newPos.x -= parseInt(pos.x);
    newPos.y -= parseInt(pos.y);

    return {x:newPos.x,y:newPos.y};
  };

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

  return true;
}

function mouse_getPos(ev){
  if(!ev) ev = window.event;

  if(typeof this.alvine_ID == 'undefined') {
	if(this.nodeName == 'undefined') return object_preventDefaultEventBehaviour(ev);
	this.alvine_ID = (typeof this.id != 'undefined')?this.id:this.nodeName.toString().substr(1).toLowerCase();
  }
  if(typeof alvine.data.mouse.positions[this.alvine_ID] == 'undefined') alvine.data.mouse.positions[this.alvine_ID] = {x:0,y:0};

  //firefox, etc
  if(ev.pageX || ev.pageY){
    alvine.data.mouse.positions[this.alvine_ID] = {x:ev.pageX,y:ev.pageY};
  } else { //IE
    var scrollPos = element_getScrollPosition();
    var ret = {x:ev.clientX,y:ev.clientY};
    ret.x += scrollPos.x;
    ret.y += scrollPos.y;
    alvine.data.mouse.positions[this.alvine_ID] = ret;
  }

  return object_preventDefaultEventBehaviour(ev);
}

page_onLoad(mouse_init, true);

/* deprecated */
var mousePositions = new Object();

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

  var pos = mouse_calcPosition(ev);

  mousePositions[this.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;
  
  if(typeof mousePositions[obj.id] == 'undefined') return alvine.data.mouse.positions.document;
  
  var xpos = mousePositions[obj.id].x;
  var ypos = mousePositions[obj.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)};
}



