// -- PROTOTYPE EXTENSIONS
// - GET TextNode CONTENT
Element.addMethods({  
  getInnerText: function(element) {
    element = $(element);
    return element.innerText && !window.opera ? element.innerText
      : element.innerHTML.stripScripts().unescapeHTML().replace(/[\n\r\s]+/g, ' ');
  }
});

// -- /PROTOTYPE EXTENSIONS

var bb_message = Class.create();
bb_message.prototype = {
	initialize: function(msg, options) {
		this.mw = $('bb-message-wrapper');
		this.m = $('bb-message');
		this.content = msg;
		this.m.innerHTML = this.content;
		this.parse_options(options);
		this.highlight();
	},
	options: {
		centered: true,
		startcolor: '#666666',
		endcolor: '#333333',
		restorecolor: '#ffffff',
		duration: 1.5
	},
	parse_options: function(options) {
		if(options != null) {
			this.options.centered = options.centered ? options.centered : this.options.centered;
			this.options.startcolor = options.startcolor ? options.startcolor : this.options.startcolor;
			this.options.endcolor = options.endcolor ? options.endcolor : this.options.endcolor;
			this.options.restorecolor = options.restorecolor ? options.restorecolor : this.options.restorecolor;
			this.options.duration = options.duration ? options.duration : this.options.duration;
		};
	},
	center: function() {
		var dims = Element.getDimensions(this.m);
	  var winSize = document.viewport.getDimensions()
	  var winWidth = winSize.width;
	  var winHeight = winSize.height;
	  var scrollOffsets = document.viewport.getScrollOffsets();
	  var offTop = Math.floor((winHeight-dims.height)/2) + scrollOffsets.top;
	  var offLeft = Math.floor((winWidth-dims.width)/2) + scrollOffsets.left;
		this.m.style.position = 'absolute';
		this.m.style.top = ((offTop != null && offTop > 0) ? offTop : '0')+ 'px';
		this.m.style.left = ((offLeft != null && offLeft > 0) ? offLeft : '0')+ 'px';
	},
	highlight: function() {
		this.mw.show();
		if (this.options.centered == true) this.center();
		new Effect.Highlight(this.m, {
			startcolor: this.options.startcolor,
			endcolor: this.options.endcolor,
			restorecolor: this.options.restorecolor,
			duration: this.options.duration,
			afterFinish: function(){
				this.mw.hide();
			}.bind(this)
		});
	}
};


// Returns the text after '#' in an <a href> tag (for various data)
function get_anchor_value(a_tag) {
	return  a_tag.href.substring(a_tag.href.indexOf('#') + 1);
};


// -- EVENT REGISTRATION CLASS
//  These functions are needed to re-register generic handlers on elements that are created after
//  the window has loaded (ie, by AJAX calls). For example, if you get a swappable text area from
//  an AJAX call, run bb_register_swap_textarea() on it.
var bbBehaviors = {
	walk_and_register: 	function(from) {
		from = Element.extend(from);
		from.identify(); // id's are used below for a CSS selector

		// alert($H(bbBehaviors._behaviors).inspect());
	 	$H(this._behaviors).each( function(h) {
	 		// this = from
	 		var b = $H(h.value);

			// does the parent element match the event CSS selector?
			if (this.match(b.get('css'))) {
				// this = top-level element
				Event.observe(this, b.get('eventName'), b.get('handler').bindAsEventListener(this));
			}
			// then get all child elements that match and register events
			$$('#' + this.id + ' ' + b.get('css')).each( function(elem) {
				// this = behavior
				var subhash = $H(this);
				Event.observe(elem, subhash.get('eventName'), subhash.get('handler').curry(elem));
			}.bind(b));		// each matching child element
		}.bind(from));  // each behavior
	}, // walk_and_register
	
	onload_register:	function () {
		if ($('bb-container')!=null) {//bbook
			bbBehaviors.walk_and_register($('bb-container'));
		} else if ($('bb-container-guides')!=null) {//?
			bbBehaviors.walk_and_register($('bb-container-guides'));
		}
		else if ($('container-guides')!=null) {//Evan
			bbBehaviors.walk_and_register($('container-guides'));
		} else { //whitelabel
			bbBehaviors.walk_and_register($('bb-guides'));
		}
	},
	
	add_behavior:		function(add_css, add_eventName, add_handler) {
		this._n++;
		this._behaviors.set(this._n, $H({css:add_css, eventName:add_eventName, handler: add_handler}));
	}, // add_behavior
	
	_behaviors: 	new Hash(), 	// { { css: 'selector', eventName: 'event', handler: function(evt) }}
	_n:				0
}
// -- /EVENT REGISTRATION CLASS


// -- ONLOAD 
Event.observe(window, 'load', function () {
	// call the page's on-load function first, to get any additional default behaviors
	if (typeof window['bb_onload'] == 'function') {
		bb_onload();
	}
	
	// register global behaviors
	bbBehaviors.onload_register();
}); // observe window load
// -- /ONLOAD