var Prototype = {
   Browser: {
    IE:     !!(window.attachEvent && !window.opera),
    Opera:  !!window.opera,
    WebKit: navigator.userAgent.indexOf('AppleWebKit/') > -1,
    Gecko:  navigator.userAgent.indexOf('Gecko') > -1 && navigator.userAgent.indexOf('KHTML') == -1,
    MobileSafari: !!navigator.userAgent.match(/Apple.*Mobile.*Safari/)
  }
};

/*
*------Selection--------------------------------------------------
*/
function id(id) {
	
	return (typeof(id) == "string") ? document.getElementById(id) : id;
}

/*
*------Object--------------------------------------------------
*/
Object.extend = function(destination, source) {
  for (var property in source)
    destination[property] = source[property];
  return destination;
};
/*
*------Fonction--------------------------------------------------
*/
Object.extend(Function.prototype, {
   bind : function() {
      var __method = this, args = Array.prototype.slice.call(arguments,0), object = args.shift();
      return function() {
         return __method.apply(object, args.concat(Array.prototype.slice.call(arguments,0)));
      }
   },
   bindAsEventListener : function() {
      var __method = this, args = Array.prototype.slice.call(arguments,0), object = args.shift();
      return function(event) {
         return __method.apply(object, [( event || window.event)].concat(args).concat(Array.prototype.slice.call(arguments,0)));
      }
   }
});
/*
*------Evenement--------------------------------------------------
*/
var Event = {
   observe : function() {
      if(window.addEventListener){
	     return function(elementDefilant, eventName, handler) {			 
		    id(elementDefilant).addEventListener(eventName, handler, false);
		 };
	  }else if(window.attachEvent){
		 return function(elementDefilant, eventName, handler) {
			id(elementDefilant).attachEvent("on"+eventName, handler);
		 };
	   }else{
          return function(elementDefilant, eventName, handler) {};
       }
   }(),
   stopObserving : function() {
      if(window.removeEventListener){
	     return function(elementDefilant, eventName, handler) {
			id(elementDefilant).removeEventListener(eventName, handler, false);
		 };
	  }else if(window.detachEvent){		
	     return function(elementDefilant, eventName, handler) {
		    id(elementDefilant).detachEvent("on"+eventName, handler);	
		 };		
	  }else{
		 return function(elementDefilant, eventName, handler) {};
	  }				
   }(),
   pointer: function(event) {
      return {
        x: event.pageX || (event.clientX +
          (document.documentElement.scrollLeft || document.body.scrollLeft)),
        y: event.pageY || (event.clientY +
          (document.documentElement.scrollTop || document.body.scrollTop))
      };
    }
};


/*
*------Element--------------------------------------------------
*/
var ElementDefilant = new Object();
Object.extend(ElementDefilant,  {
  viewportOffset: function(forElementDefilant) { 
    var forElementDefilant=id(forElementDefilant);
    var elementDefilant = forElementDefilant;
    var value = [0,0];
    do {
       value[0]+=elementDefilant.offsetLeft || 0;
       value[1]+=elementDefilant.offsetTop || 0;
       elementDefilant = elementDefilant.offsetParent;
    } while (elementDefilant);
    elementDefilant = forElementDefilant;
    do {
       if( elementDefilant.tagName != 'HTML'){
          value[1]-=elementDefilant.scrollTop || 0;
          value[0]-=elementDefilant.scrollLeft || 0;
       }
    } while (elementDefilant = elementDefilant.parentNode);
    
    return value;
  }
});
