// extend Element for managing bunch of events
Object.extend(Element, {
	'observers':{},

	observe:function(e,observers,bind) {
		e._observers=observers;
		bind=bind||false;
		for (p in observers||{})
		{
			var f=(bind!=false)?
					observers[p].bindAsEventListener(bind) : observers[p];
			if (p=='ondomready')
				Event.onDOMReady(f);
			else
				Event.observe(e, p, f, false);
		}
	},

	stopObserving:function(e) {
		for (p in e._observers)
		{
			if (p!='ondomready')
				Event.stopObserving(e,p,e._observers[p]);
		}
		e._observers=null;
	},

	// innerText equivalent
	getText:function(e) {
		return e.innerText ||(e.innerHTML.replace(/<[^>]+>/gi, "").replace(/( |&nbsp;)+/g, " "));
	}
});

/* add loading functions */
function UserAgent() {
	Element.observe(window,this._events,this);
}

UserAgent.prototype = {

	getUserAgentClass:function() {
		if (window.opera)
			return "opera";

		if (/MSIE/.test(navigator.userAgent)) {
			if (/Mac/.test(navigator.platform))
				return "ie ie_mac mac";
			else {
				verClass="";
				if (verMatch=/MSIE ?([0-9]+)\.([0-9]+)/.exec(navigator.userAgent))
				{
					version=verMatch[1];
					subversion=verMatch[2];
					verClass="ie"+version+" ie"+version+"."+subversion;
				}
				return "ie ie_win win "+verClass;
			}
		}
		if (/Gecko/.test(navigator.userAgent)) {
			return "mozilla";
		}
		if (/Safari/.test(navigator.userAgent)) {
			return "safari mac";
		}
		return ""
	},

	setBrowserClasses: function() {
		// add user agent to body class
		$(document.body).addClassName(this.getUserAgentClass());
	},

	_events: {
	'ondomready': function() {
		// add user agent to body class
		this.setBrowserClasses();
	}

}};

/* extend events for onDomReady
   see http://www.vivabit.com/bollocks/2006/06/21/a-dom-ready-extension-for-prototype
   Event.onDOMReady(function() {   // Stuff here! });
 */
Object.extend(Event, {
  _domReady : function() {
    if (arguments.callee.done) return;
    arguments.callee.done = true;

    if (this._timer)  clearInterval(this._timer);
    
    this._readyCallbacks.each(function(f) { f() });
    this._readyCallbacks = null;
},
  onDOMReady : function(f) {
    if (!this._readyCallbacks) {
      var domReady = this._domReady.bind(this);
      
      if (document.addEventListener)
        document.addEventListener("DOMContentLoaded", domReady, false);
        
        /*@cc_on @*/
        /*@if (@_win32)
            document.write("<script id=__ie_onload defer src=javascript:void(0)><\/script>");
            document.getElementById("__ie_onload").onreadystatechange = function() {
                if (this.readyState == "complete") domReady(); 
            };
        /*@end @*/
        
        if (/WebKit/i.test(navigator.userAgent)) { 
          this._timer = setInterval(function() {
            if (/loaded|complete/.test(document.readyState)) domReady(); 
          }, 10);
        }
        
        Event.observe(window, 'load', domReady);
        Event._readyCallbacks =  [];
    }
    Event._readyCallbacks.push(f);
  }
});

var ua = new UserAgent();