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] = new Object();

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

    if(includeScrollPosition && !_ALVINE_FIREFOX) {
      var scrollPos = element_getScrollPosition();
      ret.x += scrollPos.x;
      ret.y += scrollPos.y;
    }
    return ret;
  };

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

  return true;
}

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

  if(typeof this.alvine_ID == 'undefined') 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] = new Object();

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

  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)};
}



