/* Copyright © Sevenseas Srl (www.sevenseas.ro). All rights reserved. */

/* Browser, OS Detection 
------------------------------------------------ */
var detect = navigator.userAgent.toLowerCase();
var OS,browser,version,total,thestring;

if (checkIt('konqueror'))
{
	browser = "Konqueror";
	OS = "Linux";
}
else if (checkIt('safari')) 	browser = "safari"
else if (checkIt('omniweb')) 	browser = "omniweb"
else if (checkIt('opera')) 		browser = "opera"
else if (checkIt('webtv')) 		browser = "webtV";
else if (checkIt('icab')) 		browser = "icab"
else if (checkIt('msie')) 		browser = "ie"
else if (!checkIt('compatible'))
{
	browser = "Netscape Navigator"
	version = detect.charAt(8);
}
else browser = "An unknown browser";

if (!version) version = detect.charAt(place + thestring.length);

if (!OS)
{
	if (checkIt('linux')) 		OS = "Linux";
	else if (checkIt('x11')) 	OS = "Unix";
	else if (checkIt('mac')) 	OS = "Mac"
	else if (checkIt('win')) 	OS = "Windows"
	else OS = "an unknown operating system";
}

function checkIt(string)
{
	place = detect.indexOf(string) + 1;
	thestring = string;
	return place;
}
/* Finished Browser Detection */


Function.prototype.bind = function(object) {
  var __method = this;
  return function() {
    return __method.apply(object, arguments);
  }
}

Function.prototype.bindAsEventListener = function(object) {
  var __method = this;
  return function(event) {
    return __method.call(object, event || window.event);
  }
}

terminateEvent = function(e) {
	if ( e.stopPropagation != undefined )
		 e.stopPropagation();
	else if ( e.cancelBubble != undefined )
		 e.cancelBubble = true;
	
	if ( e.preventDefault != undefined )
		 e.preventDefault();
	else
		 e.returnValue = false;
}


/**
 * Library functions *
 */
function $() {
  var elements = new Array();

  for (var i = 0; i < arguments.length; i++) {
    var element = arguments[i];
    if (typeof element == 'string')
      element = document.getElementById(element);

    if (arguments.length == 1)
      return element;

    elements.push(element);
  }

  return elements;
}

/* UTIL functions 
--------------------------------*/
var Util = {

   getElementsComputedStyle: function ( htmlElement, cssProperty, mozillaEquivalentCSS) {	   
      if ( arguments.length == 2 )
         mozillaEquivalentCSS = cssProperty;

      var el = $(htmlElement);
      if ( el.currentStyle )
         return el.currentStyle[cssProperty];
      else
         return document.defaultView.getComputedStyle(el, null).getPropertyValue(mozillaEquivalentCSS);
   },
	 
		// added by Levi
   getPageXY: function(element) {
	   if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 ) {
			var x = 0;
			var y = 0;
			var parent = element;
			while ( parent ) {
			
			 var borderXOffset = 0;
			 var borderYOffset = 0;
			 if ( parent != element ) {
				var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" ));
				var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" ));
				borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset;
				borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset;
			 }
			
			 x += parent.offsetLeft - parent.scrollLeft + borderXOffset;
			 y += parent.offsetTop - parent.scrollTop + borderYOffset;
			 parent = parent.offsetParent || null;
			}	
	   }
	   else {
			var x = 0;
			var y = 0;
			var parent = element;
			while ( parent ) {
			 x += parent.offsetLeft;
			 y += parent.offsetTop;
			 parent = parent.offsetParent;
			}
			
			parent = element;
			while ( parent &&
				  parent != document.body &&
				  parent != document.documentElement ) {
			 if ( parent.scrollLeft  )
				x -= parent.scrollLeft;
			 if ( parent.scrollTop )
				y -= parent.scrollTop;
			 parent = parent.parentNode;
			}		   
	   }
	   
		return { x:x, y:y };
   },	 

   toViewportPosition: function(element) {
      return this._toAbsolute(element,true);
   },

   toDocumentPosition: function(element) {
      return this._toAbsolute(element,false);
   },   
   
   /**
    *  Compute the elements position in terms of the window viewport
    *  so that it can be compared to the position of the mouse (dnd)
    *  This is additions of all the offsetTop,offsetLeft values up the
    *  offsetParent hierarchy, ...taking into account any scrollTop,
    *  scrollLeft values along the way...
    *
    * IE has a bug reporting a correct offsetLeft of elements within a
    * a relatively positioned parent!!!
    **/
   _toAbsolute: function(element,accountForDocScroll) {

      if ( navigator.userAgent.toLowerCase().indexOf("msie") == -1 )
         return this._toAbsoluteMozilla(element,accountForDocScroll);

      var x = 0;
      var y = 0;
      var parent = element;
      while ( parent ) {

         var borderXOffset = 0;
         var borderYOffset = 0;
         if ( parent != element ) {
            var borderXOffset = parseInt(this.getElementsComputedStyle(parent, "borderLeftWidth" ));
            var borderYOffset = parseInt(this.getElementsComputedStyle(parent, "borderTopWidth" ));
            borderXOffset = isNaN(borderXOffset) ? 0 : borderXOffset;
            borderYOffset = isNaN(borderYOffset) ? 0 : borderYOffset;
         }

         x += parent.offsetLeft - parent.scrollLeft + borderXOffset;
         y += parent.offsetTop - parent.scrollTop + borderYOffset;
         parent = parent.offsetParent;
      }

	 /* Added by Levi */
	  if (this.getElementsComputedStyle(element, 'position') == 'absolute' && !accountForDocScroll) {
	     x += this.docScrollLeft();
	     y += this.docScrollTop();			
	  }
	  /* ------------ */

      if ( accountForDocScroll ) {
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   /**
    *  Mozilla did not report all of the parents up the hierarchy via the
    *  offsetParent property that IE did.  So for the calculation of the
    *  offsets we use the offsetParent property, but for the calculation of
    *  the scrollTop/scrollLeft adjustments we navigate up via the parentNode
    *  property instead so as to get the scroll offsets...
    *
    **/
   _toAbsoluteMozilla: function(element,accountForDocScroll) {
      var x = 0;
      var y = 0;
      var parent = element;
      while ( parent ) {
         x += parent.offsetLeft;
         y += parent.offsetTop;
         parent = parent.offsetParent;
      }

      parent = element;
      while ( parent &&
              parent != document.body &&
              parent != document.documentElement ) {
         if ( parent.scrollLeft  )
            x -= parent.scrollLeft;
         if ( parent.scrollTop )
            y -= parent.scrollTop;
         parent = parent.parentNode;
      }

      if ( accountForDocScroll ) {
         x -= this.docScrollLeft();
         y -= this.docScrollTop();
      }

      return { x:x, y:y };
   },

   docScrollLeft: function() {
      if ( window.pageXOffset )
         return window.pageXOffset;
      else if ( document.documentElement && document.documentElement.scrollLeft )
         return document.documentElement.scrollLeft;
      else if ( document.body )
         return document.body.scrollLeft;
      else
         return 0;
   },

   docScrollTop: function() {
      if ( window.pageYOffset )
         return window.pageYOffset;
      else if ( document.documentElement && document.documentElement.scrollTop )
         return document.documentElement.scrollTop;
      else if ( document.body )
         return document.body.scrollTop;
      else
         return 0;
   }

};
