document.observe('dom:loaded', function(){

	scrollKeeper();
	Event.observe(window, 'resize', scrollKeeper);
	
	// sets the opacity of the footer
	$('footer').setOpacity(0.8);
	
	$$('div#content', 'div#links').invoke('observe', 'click', handler);
	$('popupClose').observe('click', popupContentClose);

	var firstTab = $$('a.tab').first();
	if(firstTab) showTab(firstTab);
	// Runs some page code
	canned();
	
});

function scrollKeeper(){
	var keeper = $('scrollKeeper'), h = document.viewport.getHeight() + 50;
	if(!keeper){
		keeper = new Element('div', {id:'scrollKeeper'});	
		$$('body').first().insert(keeper);
	}
	keeper.setStyle({height: h+'px'});
}

function canned(){

	/* Account Login */
	if($('frm_login')){
		
		$('UserID').select();
		
		$('submit').observe('click', function(ev){
			
			if($F('UserID').empty() || $F('Password').empty()){
				ev.stop();
				alert('Username and Password are required!');
			}
			
		});
		
		$('forgot-password').observe('click', function(ev){
			
			if($F('UserID').empty()){
				ev.stop();
				alert('You must enter a Username!');
			}
			
		});
	}
	
	// launch faqs() if the div is found
	if($$('div.toggleInfo').length > 0) toggleInfo();
}

/*
 * Can be changed depending on the cleanup needed at the end of popupContentClose
 * Usually to get rid of observers
 */
var cleanup = Prototype.emptyFunction;

/**
 * Handles the observe from dom:loaded
 * @param ev 
 * @return void
 */
function handler(ev){

	var elem = ev.element();
	if(elem.nodeName.toUpperCase() === 'A'){		
		if(elem.hasClassName('ajax')){
			ev.stop();
			popupContent(elem.readAttribute('href'));
		}
	}
	
	// for image popups
	if(elem.nodeName.toUpperCase() === 'IMG' && elem.up('a') && elem.up('a').readAttribute('rel') === 'new'){
		ev.stop();
		var loc = elem.up('a').readAttribute('href'), img = new Image(); 
		img.src = loc;
		var width = img.width + 25, height = img.height + 25;
		window.open(loc, null, "toolbar=0,location=0,status=0,menubar=0,scrollbars=0,width="+width+",height="+height+'"');
	}
	
	if(elem.hasClassName('tab')){
		ev.stop();
		showTab(elem);
	}
}

/**
 * Toggle: uses p tag as control, p + div as toggled
 * @return void
 */
function toggleInfo(){
	$$('div.toggleInfo p + div').invoke('hide');
	var divs = $$('div.toggleInfo');
	cleanup = function(){
		divs.invoke('stopObserving');
	};
	divs.invoke('observe', 'click', toggler);	
}

function toggler(ev){

	var elem = ev.findElement('a');
	
	if(!elem) return;
	
	if(elem.hasClassName('goto')){
		var link = elem.readAttribute('rel');
		elem = $(link);
		elem.scrollTo();
		if(elem.up('p').next('div').hasClassName('openToggle')){
			ev.stop();
			return;
		}
	}
	
	
	var div = elem.up('p').next('div');
	if(div){
		div.addClassName('toggledInfo')
		.toggleClassName('openToggle')
		.toggle();
		ev.stop();					
	}
	
}

/**
 * Uses an Ajax Request to pull page content into the tabContent div
 * @param elem passed in from the click event
 * @return void
 */
function showTab(elem){
	var elem = $(elem);
	var url = elem.readAttribute('href');
	var tab_id = elem.readAttribute('rel');
	var request;
	
	if(!content){
		window.location = url;
	}
	
	$$('a.tab[rel='+tab_id+']').invoke('removeClassName', 'activeTab');
	elem.addClassName('activeTab');
	
	request = new Ajax.Updater(tab_id, url, {
		onStart: function(){
			cleanup();
		},
		onComplete: function(){
			canned();
		}
	});
}

/**
 * Shows a page in a popup div using Ajax.Updater
 * @param url str to url
 * @return void
 */
function popupContent(url){
	
	// find the largest height
	var docHeight = document.viewport.getHeight();
	var bodHeight = $$('body').first().getHeight();
	var height = (docHeight > bodHeight) ? docHeight : bodHeight; 
	
	$('shade').setStyle({
		height: height + 'px'
	}).show().setOpacity(.5);
	$('popupContent').writeAttribute('class', '')
		.addClassName(url.sub('/', '').sub('.html', ''))
		.update('Loading...');
	$('popup').show().center();
	var request = new Ajax.Updater('popupContent', url, {
		onComplete: function(t){
			canned.defer();
			$('popupContent').scrollTop = 0;
		}
	});
	
}

/**
 * Triggered from the close tag on popupContent
 * @return void
 */
function popupContentClose(ev){
	ev.stop();
	$('shade').hide();
	$('popup').hide();	
	$('popupContent').update();
	cleanup();
}

/**
 * Methods for extending Prototype
 */
var Position = {
	/**
	 * Centers an element against the parent or body
	 * parent should be display: relative
	 */
	center: function(elem, parent){
		
		var elem = $(elem);
		var parent;
		var dims = elem.getDimensions();	
		var scroll = document.viewport.getScrollOffsets();
		var bgDims;
		
		if(parent){
			bgDims = $(parent).getDimensions();
		} else {
			bgDims = document.viewport.getDimensions();
		} 

		var t = parseInt( ( ( ( bgDims.height ) - dims.height) / 2 ), 10);
		var l = parseInt( ( ( ( bgDims.width ) - dims.width) / 2 ), 10 );

		elem.setStyle({
			position: 'absolute',
			top:  t + scroll.top + 'px',
			left: l + scroll.left + 'px'
		});
		return elem;
	},
	
	/**
	 * Used to keep ensure an element stays within a scrollable div
	 */
	keepWithin: function(elem, parent, padding){
		elem = $(elem);
		parent = $(parent);
		padding = padding || 0;
		
		// return if no scrollbars
		if(parent.scrollHeight < 1) return elem;
		
		var elemViewportBottom = elem.getBoundingClientRect().bottom.ceil();
		var parentViewportBottom = parent.viewportOffset().top + parent.getHeight();

		if(parentViewportBottom < elemViewportBottom) 
			parent.scrollTop = elemViewportBottom - parentViewportBottom + padding;  

		return elem;
	}
};

Element.addMethods(Position);
Element.addMethods('DIV', {
  /**
   * Element#scrollMeTo(child) -> Self
   * - child (Element): The child element to be scrolled into view.
   * 
   * Description
   *
   * <h5>Examples</h5>
  **/
  scrollMeTo: function(el, child, pad) {
    // Init
    var offset = 0, isChildAndPositioned = false;
    el = $(el);
    child = $(child);
    pad = pad || 0;
    
    // Sanity checks
    //if (el.getStyle('overflow') != 'hidden') return el;
    if (el.scrollHeight <= el.getHeight()) return el;

    // Daaaaaamn homie
    positioned_el = child;
    do {
      offset += positioned_el.offsetTop || 0;
      positioned_el = positioned_el.offsetParent;
      if (positioned_el == el) {
        isChildAndPositioned = true;
        break;
      }
    } while (positioned_el);

    // Scroll
    /*if (isChildAndPositioned)*/ el.scrollTop = offset - pad;
    return el;
  }
});