// logging

var debugCont = null;

function _log(txt)
{
	if(window.console)
	{
		window.console.log(txt);
	}
	else
	{
		return ;
		if(!debugCont)
		{
			var els = document.getElementsByTagName('body');
			debugCont = document.createElement('div');
			debugCont.style.width = '100%';
			debugCont.style.height = '200px';
			debugCont.style.border = 'red 1px solid';
			els[0].appendChild(debugCont);
		}
		debugCont.innerHTML += txt + '<br />';	
	}
}


Number.prototype.NaN0=function(){return isNaN(this)?0:this;}

Object.extend = function(destination, source) {
  for (var property in source) {
    destination[property] = source[property];
  }
  return destination;
}

var Class = {
  create: function() {
    return function() {
      this.initialize.apply(this, arguments);
    }
  }
};

var $A = Array.from = function(iterable) {
  if (!iterable) return [];
  if (iterable.toArray) {
    return iterable.toArray();
  } else {
    var results = [];
    for (var i = 0, length = iterable.length; i < length; i++)
      results.push(iterable[i]);
    return results;
  }
}

Function.prototype.bind = function() {
  var __method = this, args = $A(arguments), object = args.shift();
  return function() {
    return __method.apply(object, args.concat($A(arguments)));
  }
};

//Function.prototype.bind = function() {
//  var __method = this, args = [], object = arguments[0];
//  for (var i = 1; i < arguments.length; i++)
//    args.push(arguments[i]);
//  return function(moreargs) {
//  	args = []; 
//    for (var i = 0; i < arguments.length; i++)
//      args.push(arguments[i]);
//    return __method.apply(object, args);
//  }
//};

Function.prototype.bindAsEventListener = function(object) {
  var __method = this, args = $A(arguments), object = args.shift();
  return function(event) {
    return __method.apply(object, [event || window.event].concat(args));
  }
};

function getPosition(e){
		var left = 0;
		var top  = 0;
		
		while (e.offsetParent){
			left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
			top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);
			e     = e.offsetParent;
		}

		left += e.offsetLeft + (e.currentStyle?(parseInt(e.currentStyle.borderLeftWidth)).NaN0():0);
		top  += e.offsetTop  + (e.currentStyle?(parseInt(e.currentStyle.borderTopWidth)).NaN0():0);

		return {x:left, y:top};
	}

var Mouse = {
	initialize : function()	{},
	
	getCoords : function(ev)
	{
		if(ev.pageX || ev.pageY){
			return {x:ev.pageX, y:ev.pageY};
		}
		return {
			x:ev.clientX + document.body.scrollLeft - document.body.clientLeft,
			y:ev.clientY + document.body.scrollTop  - document.body.clientTop
		};
	},
	
	getOffset : function(target, ev)
	{
		ev = ev || window.event;

		var docPos    = getPosition(target);
		var mousePos  = this.getCoords(ev);
		return {x:mousePos.x - docPos.x, y:mousePos.y - docPos.y};
	}
};

function cloneObj(obj)
{
    if(obj == null || typeof(obj) != 'object') 
    {
    	return obj;
    }
    
    var temp = {};
    for(var key in obj)
    {
    	temp[key] = cloneObj(obj[key]);
    }
    
    return temp;
}