
/*emg.js.php*/
/* 2:29 PM 11/6/2009
/*
Copyright © 2008 Eckx Media Group, LLC. All rights reserved.
Eckx Media Group respects the intellectual property of others, and we ask our users to do the same.
*/
/*<script>*/

// Show / Hide object
function toggle(obj) {
	var el = $(obj);
	el.style.display = (el.style.display != 'block' ? 'block' : 'none' );
	el.blur();
}
function toggle2(obj) {
	var el = $(obj);
	el.style.display = (el.style.display != 'block' ? 'block' : 'none' );
	el.blur();
}

// Reset form fields
function clearForm(id, skipType) {
	var form = document.getElementById(id);;
	for (var i = 0; i < form.length; i++) {
		if(form[i].type == skipType || form[i].type == 'submit' || form[i].type == 'button' || form[i].type == 'hidden'){
			continue;
		}
		if(form[i].type == 'checkbox' || form[i].type == 'radio') {
			form[i].checked = false;	
		}
		else {
			form[i].value = '';
		}
	}
}

function popUpA(URL) { //allow all features
day = new Date();
id = "aboutUS";
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=1,scrollbars=1,location=1,statusbar=1,menubar=1,resizable=1,width=900,height=400,left = 240,top = 212');");
}

function popUpB(URL) { // disable all features
day = new Date();
id = "aboutUS";
eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=300,height=300,left = 240,top = 212');");
}

function isset(obj){
	if(typeof obj == 'undefined'){
		return false;
	}
	else{
		return true;	
	}
}


function getMousePos(e) {
	var IE = document.all?true:false
	var scrollXY = getScrollXY();
	var mousePos = new Array();
	if (IE) { // grab the x-y pos.s if browser is IE
		tempX = e.x;
		tempY = e.y;
	} 
	else {  // grab the x-y pos.s if browser is NS
		tempX = e.clientX;
		tempY = e.clientY;
	}
	// catch possible negative values in NS4
	if (tempX < 0){tempX = 0}
	if (tempY < 0){tempY = 0}  
	mousePos['x'] = tempX + scrollXY[0];
	mousePos['y'] = tempY + scrollXY[1];
	return mousePos;
}


function getScrollXY() {
  var scrOfX = 0, scrOfY = 0;
  if( typeof( window.pageYOffset ) == 'number' ) {
    //Netscape compliant
    scrOfY = window.pageYOffset;
    scrOfX = window.pageXOffset;
  } else if( document.body && ( document.body.scrollLeft || document.body.scrollTop ) ) {
    //DOM compliant
    scrOfY = document.body.scrollTop;
    scrOfX = document.body.scrollLeft;
  } else if( document.documentElement && ( document.documentElement.scrollLeft || document.documentElement.scrollTop ) ) {
    //IE6 standards compliant mode
    scrOfY = document.documentElement.scrollTop;
    scrOfX = document.documentElement.scrollLeft;
  }
  return [ scrOfX, scrOfY ];
}

function getPageDim(){
	if(document.all?true:false){ // IE
		if(document.body.clientHeight > document.body.scrollHeight){
			var height = document.body.clientHeight;
			var width = document.body.clientWidth;
		}
		else{
			var height = document.body.scrollHeight;
			var width = document.body.scrollWidth;
		}
	}
	else{
		var height = document.height;
		var width = document.weidth;
	}
	var viewPortHeight = document.viewport.getHeight();
	if(height < viewPortHeight){
		height = viewPortHeight;
	}
	return [ width, height ];
}

function getVisibleDim(){ alert('function getVisibleDim() decremented, use prototype viewport');
	if(!$('getTopLeft-fake-body')){ //generate fake div to get screen size
		var fakeDiv = document.createElement('div');
		fakeDiv.id = 'getTopLeft-fake-body';
		fakeDiv.style.visibility = 'hidden';
		fakeDiv.style.margin = '0';
		fakeDiv.style.padding = '0';
		fakeDiv.style.position = 'absolute';
		fakeDiv.style.top = '0';
		fakeDiv.style.bottom = '0';
		fakeDiv.style.left = '0';
		fakeDiv.style.right = '0';
		fakeDiv.style.width = '100%';
		fakeDiv.style.height = '100%';
		fakeDiv.style.zIndex = '-1';
		document.body.appendChild(fakeDiv);
	}
	
	var fakeDiv = $('getTopLeft-fake-body');
	var width = fakeDiv.getWidth();
	var height = fakeDiv.getHeight();
	return [ width, height ];
}

function alert2(text, dim, alertTime, className){ 
	//check if alert 2 already exist
	var i=0;
	while($('alert2_'+i)){
		i++;
	}
	var alert2 = document.createElement('div');
	alert2.id = 'alert2_'+i;
	alert2.style.visibility = 'hidden';
	document.body.appendChild(alert2);
	
	alert2 = $('alert2_'+i);
	if (className === undefined) {
		alert2.addClassName('alert2');
	}
	else {
		alert2.addClassName(className);	
	}
	
	alert2.innerHTML = text;
	if(dim){
		width = dim[0];
		height = dim[1];
		alert2.style.width = width+'px';
		alert2.style.height = height+'px';
	}
	else{
		width = alert2.getWidth();
		height = alert2.getHeight();
	}
	if(isNaN(width) || isNaN(height)){
		alert('Alert2() error, width or height isNaN');	
	}
	
	var xy = getScrollXY(); 
	var topLeft = getTopLeft(width, height);
	alert2.style.top = topLeft[0]+'%';
	alert2.style.left = topLeft[1]+'%';
	alert2.style.visibility = 'visible';
	if(!alertTime){
		alertTime = 2000;	
	}
	setTimeout("document.body.removeChild(document.getElementById('alert2_"+i+"'))", alertTime);
}


//return the top left percentage for an absolute centered layer, req 100% body height
function getTopLeft(width, height){
	//var visibleDim = getVisibleDim();
	//var windowWidth = visibleDim[0];
	//var windowHeight = visibleDim[1];
	document.viewport.getWidth()
	var windowWidth = document.viewport.getWidth();
	var windowHeight = document.viewport.getHeight();
	var ie = getIEVerNum();
	
	//compensate for scroll
	var xy = getScrollXY();
	
	//get %
	var top = (windowHeight/2 + xy[1] - (height/2)) / windowHeight;
	var left = (windowWidth/2 + xy[0] - (width/2)) / windowWidth;

	if(top < 0){
		top = 0;	
	}
	if(left <0){
		left = 0;	
	}
	
	//compensate for ie 6 usage of %, the entire document not just what u see is 100%
	if(ie == 6){ // ie 6
		var pxHeight = windowHeight * top; //get pixel height
		top = pxHeight/document.body.clientHeight; // get decimal height
	}
	
	top  = Math.round(top * 100); 
	left  = Math.round(left * 100);
			
	return [ top, left ];
}

function money(num){
	var formated = Math.round(num*100)/100;
	formated = formated.toString();
	if(formated.indexOf('.') == -1){
		formated += '.00';
	}
	else{
		var parts = formated.split('.');
		if(parts[1].length == 1){
			formated += '0';	
		}
	}
	return formated;
}

function urlencode(str) {
	str = escape(str);
	str = str.replace('+', '%2B');
	str = str.replace('%20', '+');
	str = str.replace('*', '%2A');
	str = str.replace('/', '%2F');
	str = str.replace('@', '%40');
	return str;
}

function urldecode(str) {
	str = str.replace('+', ' ');
	str = unescape(str);
	return str;
}

function htmlentities(html) {
	html = html.replace('<','&lt;');
	html = html.replace('>','&gt;');
	html = html.replace('"','&quot;');
	return html;
} 

function getJs(url){
	if(url.indexOf('?')==-1) {
		url += '?';	
	}
	var jsel = document.createElement('SCRIPT');
	jsel.type = 'text/javascript';
	jsel.src = url+'&klioe='+Math.random()*10000;
	document.body.appendChild(jsel);
}

//Get IE Version Number
function getIEVerNum() {
    var ua = navigator.userAgent;
    var MSIEOffset = ua.indexOf("MSIE ");
    
    if (MSIEOffset == -1) {
        return 0;
    } else {
        return parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";", MSIEOffset)));
    }
}

function confirm2(e, title, yesEval, noEval){
	var delConfirm = document.createElement('div');
	delConfirm.id = 'confirm2';
	document.body.appendChild(delConfirm);
	curtain.load();
	curtain.content('<p><strong>'+title+'</strong></p><ul class="tools confirm"><li class="yes"><a href="#" id="confirm2-yes">Yes</a></li><li class="no"><a href="#" id="confirm2-no">No</a></li></ul>');
	//delConfirm = $('confirm2');
	//delConfirm.addClassName('confirm2');
	//delConfirm.innerHTML = '<div>'+title+'</div><input type="button" id="confirm2_yes" value="Yes"/><br/><input type="button" id="confirm2_no" value="No" />';
	
	//var mousePos = getMousePos(e);
	//delConfirm.style.left=mousePos['x']+'px';
	//delConfirm.style.top=mousePos['y']+'px';
	$('confirm2-yes').onclick= function(){ 
		//document.body.removeChild($('confirm2'));
		eval(yesEval);
		curtain.close();
		return false;
	}
	$('confirm2-no').onclick= function(){ 
		//document.body.removeChild($('confirm2'));
		eval(noEval); 
		curtain.close();
		return false;
	}
}

function checkAll(name, trueFalse){
	var checkBoxes = document.getElementsByName(name);
	var len = checkBoxes.length;
	for(var i=0; i<len; i++){
		checkBoxes[i].checked = trueFalse;
	}
}

/*function externalLinks(container) {
	if(container){
		var anchors = container.select('a[rel*="external"]');
	}
	else{
		var anchors = $$('a[rel*="external"]');
	}
	for (var i=0; i<anchors.length; i++) {
		anchors[i].target = "_blank";
	}
}

function autoCompleteOff(){
	var inputs = $$('input.autocomplete-off');
	for (var i=0; i<inputs.length; i++) {
		inputs[i].setAttribute("autocomplete", "off");
	}
}

function defaultClear(){
	var inputs = $$('input.default-clear');
	for (var i=0; i<inputs.length; i++) {
		inputs[i].onfocus = function(){
			if(this.value == this.defaultValue){
				this.value = ''; 
			}
		}
		inputs[i].onblur = function(){
			if(this.value == ''){
				this.value = this.defaultValue;
			}
		}
	}
}*/

function emgInit(){
	/*externalLinks();
	autoCompleteOff();
	defaultClear();*/
	if(typeof(BrowserDetect) == 'object'){
		BrowserDetect.init();
	}
	if(typeof(loginTimer) == 'object'){
		loginTimer.init();	
	}
	if(typeof(curtain) == 'object'){
		curtain.init();	
	}
	if(typeof(valForm) == 'object'){
		valForm.init();	
	}
	if(typeof(cart) == 'object'){
		cart.init('cart-headline');	
	}
	if(typeof(slideshow) == 'object'){
		slideshow.init(false, true);
	}
	ie6Check();
	
	EmgAjax.init($$('body').first());
	modal.init();
	
	//setTimeout('scrollHomelessFacts();', 10000);
	if($('logo')){
		showFlash(window.CR+'/flash/header.swf?CR=/&xmlPath='+window.CR+'/xml/slideshow.php?CR='+window.CR, 785, 152, 'logo');	
	}
	$('emg-link').style.display = 'none';
	//homelessFactsScroll();
	
	markupInit();
}

//function to run initial function that changes markup
function markupInit(){
	var bodyElement = $$('body')[0]; // cant use document.body because error in IE7, no .select
	confirmInit(bodyElement);
	externalLinks(bodyElement);
	autoCompleteOff(bodyElement);
	defaultClear(bodyElement);
}

//Event.observe(window, 'load', emgInit);
document.observe('dom:loaded', emgInit);

function confirmInit(container){
	var anchors = container.select('a[rel~="confirm"]');
	for(var i = 0; i < anchors.length; i++){
		anchors[i].href  = 'javascript:confirm2(null, \'' + anchors[i].title + '\', \'window.location=\\\'' + anchors[i].href + '\\\'\', \'\')';
	}
}

function externalLinks(container) {
	var anchors = container.select('a[rel~="external"]');
	
	for (var i=0; i<anchors.length; i++) {
		anchors[i].target = "_blank";
	}
}

function autoCompleteOff(container){
	var inputs = container.select('input[class~="autocomplete-off"]');
	for (var i=0; i<inputs.length; i++) {
		inputs[i].setAttribute("autocomplete", "off");
	}
}

function defaultClear(container){
	var inputs = container.select('input[class~="default-clear"]');
	
	var defaultClassName = 'default';
	
	for (var i=0; i<inputs.length; i++) {
		inputs[i].onfocus = function(){
			if(this.value == this.defaultValue){
				this.value = '';
				this.removeClassName(defaultClassName);
			}
		}
		inputs[i].onblur = function(){
			if(this.value == ''){
				this.value = this.defaultValue;
				this.addClassName(defaultClassName);
			}
		}
	}
}

function bookMark(url, title){
	if(document.all?true:false){ // IE
		window.external.AddFavorite(url, title);
	}
	else{
		window.sidebar.addPanel(title, url, '')
	}
}

function ajaxFill(url, container, callback){
	$(container).innerHTML = '<div style="text-align:center"><img src="'+window.CR+'/images/library/loading.gif" /></div>';
	new Ajax.Request(url, { method: 'get', onSuccess: function(ajaxReturn) {
		if(ajaxReturn.responseText == 'died'){
			window.location = window.CR+'/action/died';
			return;
		}
		$(container).innerHTML = ajaxReturn.responseText;
		eval(callback);
	}}); 
}

function ie6Check() {
	if (BrowserDetect.browser == 'Explorer' && BrowserDetect.version < 7) {
		var ie6Notice = document.createElement('div');
		ie6Notice.id = 'ie6-notice';
		ie6Notice.innerHTML = '<p class="title">It seems like you are using Internet Explorer 6 or lower.</p><p>IE6 is an outdated web browser that cannot provide the rich web experience that a modern web browser is able to.  This site may not display and function correctly as a result.</p><p>You may want to upgrade to one of these newer web browsers:</p><ul class="browsers"><li><a href="http://www.microsoft.com/windows/downloads/ie/getitnow.mspx" title="Download Internet Explorer 8">Download Internet Explorer 8</a></li><li><a href="http://www.mozilla.com/en-US/firefox/" title="Download Mozilla Firefox">Download Mozilla Firefox</a></li><li><a href="http://www.google.com/chrome" title="Download Google Chrome">Download Google Chrome</a></li></ul><p class="hide-notice"><a href="#" onclick="document.getElementById(\'ie6-notice\').style.display = \'none\'; return false;" title="Hide this notice" rel="external">Hide this notice</a></p>';
		document.body.appendChild(ie6Notice);
	}
}
// verify the captcha
function verifyCaptcha(captchaFieldid){
	var url = window.CR + "/action/verify-captcha?area=" + captchaFieldid + "&captcha=" + $(captchaFieldid).value + "&k=" + Math.round(100000*Math.random());
	valForm.ajaxRunning[captchaFieldid] = true;
	new Ajax.Request(url, { method: 'get',  onSuccess: function(verifyCaptcha2) {
			if(verifyCaptcha2.responseText == '0'){
				var error = ' is incorrect.'; //error
			}
			else{
				 var error = false; // no errror
			}
			valForm.errorHandler($(captchaFieldid), error);
			valForm.ajaxRunning[captchaFieldid] = false;
		}
	});
}


function refreshImg(id){
	var img = $(id);
	if(img.src.include('?')){
		img.src = img.src + '&k='+Math.random();
	}
	else{
		img.src = img.src + '?k='+Math.random();
	}
}

function captchaRefresh(area) {
	$(area + '-img').src = '/js/minify.php/ajax/show-captcha?area=' + area + '&'+Math.random();
}

function showFlash(src, w, h, container){
	var s1 = new SWFObject(src,"mediaplayer",w, h,"7");
	s1.addParam("wmode", "transparent");
	if(!s1.write(container)){
		$(container).innerHTML = '<a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Click here to get the flash player.</a>';
	}
}

function textAreaExp(id){
	var html = '<textarea rows="50" cols="100" id="'+id+'-expanded">'+$(id).value+'</textarea><br /><button onclick="$(\''+id+'\').value = $(\''+id+'-expanded\').value; curtain.close();">update</button>';
	curtain.load();
	curtain.content(html);
}

//use to show all the properties of an object;
function objProperties(obj, objName){
	var output = '';
	for (var prop in obj ) {
		output += objName + "." + prop + " = " + obj[prop] + "\n" ;
	}
	alert(output);
}
/*modal-v1.js.php*/
 /*
12:13 PM 11/24/2010
10:48 AM 10/15/2010
3:51 PM 10/7/2010
*/
/*
Copyright © 2010 Eckx Media Group, LLC. All rights reserved.
Eckx Media Group respects the intellectual property of others, and we ask our users to do the same.
*/
/*<script>*/

 var modal = { index: -1, expandLink: false, expandView: false, hideSelects: new Array(),
 closeCallBacks: new Array(), 
 init: function(){ modal.index = -1; var blinds = document.createElement('div');
blinds.id = 'modal-blinds'; document.body.appendChild(blinds); }, urlToClassStr: function (url) {
 var cr = window.CR; var classStr = url; 
 if (cr.length > 0) { classStr = classStr.split(cr)[1];
} classStr = classStr.split('?')[0].replace('ajax/', '').replace('action/', '').replace(/\//g, ' ').strip();
 return classStr; }, load: function(){ this.openBlinds(); }, content: function(html, classStr, sameLayer, width, height, noPadding, closeCallBack){
 if(closeCallBack){ this.closeCallBacks[this.index] = closeCallBack; } if(sameLayer == true){ if(!$('modal-popUp' + this.index)){
 alert('modal error: samelayer is set, but theres no modal layer yet'); } document.body.removeChild($('modal-popUp' + this.index));
 
 } 
 var popUp = document.createElement('div'); var closeLayer = document.createElement('div'); 
 var contentLayer = document.createElement('div'); var bodyLayer = document.createElement('div'); 
 popUp.id = 'modal-popUp' + this.index; closeLayer.id = 'modal-closeLayer' + this.index; contentLayer.id = 'modal-contentLayer' + this.index;
bodyLayer.id = 'modal-bodyLayer' + this.index; 
 popUp.appendChild(closeLayer); popUp.appendChild(contentLayer);
contentLayer.appendChild(bodyLayer); document.body.appendChild(popUp); 
 popUp = $('modal-popUp' + this.index);
closeLayer = $('modal-closeLayer' + this.index); contentLayer = $('modal-contentLayer' + this.index);
bodyLayer = $('modal-bodyLayer' + this.index); popUp.style.visibility = 'hidden'; popUp.addClassName('modal-popUp' + (classStr ? ' ' + classStr : ''));
closeLayer.addClassName('modal-close'); bodyLayer.addClassName('modal-body'); 
 if (noPadding) {
 contentLayer.addClassName('no-padding'); } 
 if (this.expandLink) { closeLayerHtml = '<a href="javascript:modal.expand()" id="modal_expand' + this.index + '" class="expand" title="Expand / Contract"></a>';
closeLayerHtml += '<a href="javascript:modal.close()" class="close" title="Close"></a>'; } else { closeLayerHtml = '<a href="javascript:modal.close()" class="close" title="Close"></a>';
} closeLayer.innerHTML = closeLayerHtml; bodyLayer.innerHTML = html; 
 var scripts = html.match(/<script.*>([\s\S]*)<\/script>/gi);
if(scripts != null){ var headTag = document.getElementsByTagName("head")[0]; for(var i = 0; i < scripts.length; i++){
 var newScript = document.createElement("script"); newScript.type = 'text/javascript'; headTag.appendChild(newScript);
newScript.text = scripts[i].replace(/<script.*>/i, '').replace(/<\/script>/i, ''); } } contentLayer.addClassName('modal-content');
 if(this.expandView){ this.expand(); } else if(parseFloat(width) != width || parseFloat(height) != height){ 
 this.autoSize(); } else{ this.resizeContent(width, height); } popUp.style.zIndex = this.index + 1;
popUp.style.visibility = 'visible'; }, autoSize: function(){ 
 var popUp = $('modal-popUp' + this.index);
var contentLayer = $('modal-contentLayer' + this.index); var contentInner = contentLayer.firstDescendant();
var closeLayer = $('modal-closeLayer' + this.index); width = contentInner.getWidth(); height = contentInner.getHeight(); 
 maxW = document.viewport.getWidth(); maxH = document.viewport.getHeight(); if(height >= (maxH - 25)){
 height = maxH - 50; } if(width >= (maxW - 25)){ width = maxW - 25; } contentLayer.style.height = height + 'px';
height += closeLayer.getHeight(); width += 18; var topLeft = getTopLeft(width, height); popUp.style.width = width + 'px';
popUp.style.height = height + 'px'; popUp.style.top = topLeft[0] + '%'; popUp.style.left = topLeft[1] + '%';
}, resizeContent: function(width, height){ var popUp = $('modal-popUp' + this.index); var contentLayer = $('modal-contentLayer' + this.index);
var closeLayer = $('modal-closeLayer' + this.index); var topLeft = getTopLeft(width, height); popUp.style.width = width + 'px';
popUp.style.height = height + 'px'; popUp.style.top = topLeft[0] + '%'; popUp.style.left = topLeft[1] + '%';
contentLayer.style.height = (height - closeLayer.getHeight()) + 'px'; }, close: function(){
 if(this.closeCallBacks[this.index]){
 eval(this.closeCallBacks[this.index]); } document.body.removeChild($('modal-popUp' + this.index));
this.closeBlinds(); }, resize: function(){ var modal_blinds = $('modal-blinds'); var pageDim = getPageDim();
modal_blinds.style.width = pageDim[0] + 'px'; modal_blinds.style.height = pageDim[1] + 'px'; }, expand: function(){
 this.expandView = true; var width = document.viewport.getWidth() - 25; var height = document.viewport.getHeight() - 50;
this.resizeContent(width, height); $('modal-expand' + this.index).href = 'javascript:modal.shrink()';
 }, shrink: function(){ this.expandView = false; $('modal-expand' + this.index).href = 'javascript:modal.expand()';
this.autoSize(); }, openBlinds: function(){ if( getIEVerNum() == 6){ this.hideSelects(); } var modal_blinds = $('modal-blinds');
this.index +=2; modal_blinds.style.zIndex = this.index; modal_blinds.style.display='block'; var pageDim = getPageDim();
modal_blinds.style.width = pageDim[0] + 'px'; modal_blinds.style.height = pageDim[1] + 'px'; modal_blinds.onclick = function (){
 modal.close(); }; Event.observe(window, 'resize', this.resize); }, closeBlinds: function(){ var modal_blinds = $('modal-blinds');
this.index -= 2; modal_blinds.style.zIndex = this.index; if(this.index == -1){ modal_blinds.style.display='none';
Event.stopObserving(window, 'resize', this.resize); } if( getIEVerNum() == 6){ this.showSelects(); 
 } }, hideSelects: function(){ this.hideSelects[this.index] = new Array(); if(this.index != -1){ 
 var allSel = $('modal-popUp' + this.index).select('select'); } else{ var allSel = $$('select'); }
for(var i=0; i < allSel.length; i++){ if(allSel[i].style.visibility != 'hidden'){ allSel[i].style.visibility = 'hidden';
this.hideSelects[this.index][i] = allSel[i]; } } }, showSelects: function(){ var selects = this.hideSelects[this.index];
for(var i=0; i < selects.length; i++){ selects[i].style.visibility = 'visible'; } } }; 
/*lightbox.js.php*/
// -----------------------------------------------------------------------------------
//
//	Lightbox v2.04
//	by Lokesh Dhakar - http://www.lokeshdhakar.com
//	Last Modification: 2/9/08
//
//	For more information, visit:
//	http://lokeshdhakar.com/projects/lightbox2/
//
//	Licensed under the Creative Commons Attribution 2.5 License - http://creativecommons.org/licenses/by/2.5/
//  	- Free for use in both personal and commercial projects
//		- Attribution requires leaving author name, author link, and the license info intact.
//	
//  Thanks: Scott Upton(uptonic.com), Peter-Paul Koch(quirksmode.com), and Thomas Fuchs(mir.aculo.us) for ideas, libs, and snippets.
//  		Artemy Tregubenko (arty.name) for cleanup and help in updating to latest ver of proto-aculous.
//
// -----------------------------------------------------------------------------------
/*

    Table of Contents
    -----------------
    Configuration

    Lightbox Class Declaration
    - initialize()
    - updateImageList()
    - start()
    - changeImage()
    - resizeImageContainer()
    - showImage()
    - updateDetails()
    - updateNav()
    - enableKeyboardNav()
    - disableKeyboardNav()
    - keyboardAction()
    - preloadNeighborImages()
    - end()
    
    Function Calls
    - document.observe()
   
*/
// -----------------------------------------------------------------------------------

//
//  Configurationl
//
LightboxOptions = Object.extend({
    fileLoadingImage:        window.CR+'/images/lightbox/loading.gif',     
    fileBottomNavCloseImage: window.CR+'/images/lightbox/closelabel.gif',

    overlayOpacity: 0.8,   // controls transparency of shadow overlay

    animate: true,         // toggles resizing animations
    resizeSpeed: 7,        // controls the speed of the image resizing animations (1=slowest and 10=fastest)

    borderSize: 10,         //if you adjust the padding in the CSS, you will need to update this variable

	// When grouping images this is used to write: Image # of #.
	// Change it for non-english localization
	labelImage: "Image",
	labelOf: "of"
}, window.LightboxOptions || {});

// -----------------------------------------------------------------------------------

var Lightbox = Class.create();

Lightbox.prototype = {
    imageArray: [],
    activeImage: undefined,
    
    // initialize()
    // Constructor runs on completion of the DOM loading. Calls updateImageList and then
    // the function inserts html at the bottom of the page which is used to display the shadow 
    // overlay and the image container.
    //
    initialize: function() {    
        
        this.updateImageList();
        
        this.keyboardAction = this.keyboardAction.bindAsEventListener(this);

        if (LightboxOptions.resizeSpeed > 10) LightboxOptions.resizeSpeed = 10;
        if (LightboxOptions.resizeSpeed < 1)  LightboxOptions.resizeSpeed = 1;

	    this.resizeDuration = LightboxOptions.animate ? ((11 - LightboxOptions.resizeSpeed) * 0.15) : 0;
	    this.overlayDuration = LightboxOptions.animate ? 0.2 : 0;  // shadow fade in/out duration

        // When Lightbox starts it will resize itself from 250 by 250 to the current image dimension.
        // If animations are turned off, it will be hidden as to prevent a flicker of a
        // white 250 by 250 box.
        var size = (LightboxOptions.animate ? 250 : 1) + 'px';
        

        // Code inserts html at the bottom of the page that looks similar to this:
        //
        //  <div id="overlay"></div>
        //  <div id="lightbox">
        //      <div id="outerImageContainer">
        //          <div id="imageContainer">
        //              <img id="lightboxImage">
        //              <div style="" id="hoverNav">
        //                  <a href="#" id="prevLink"></a>
        //                  <a href="#" id="nextLink"></a>
        //              </div>
        //              <div id="loading">
        //                  <a href="#" id="loadingLink">
        //                      <img src="images/loading.gif">
        //                  </a>
        //              </div>
        //          </div>
        //      </div>
        //      <div id="imageDataContainer">
        //          <div id="imageData">
        //              <div id="imageDetails">
        //                  <span id="caption"></span>
        //                  <span id="numberDisplay"></span>
        //              </div>
        //              <div id="bottomNav">
        //                  <a href="#" id="bottomNavClose">
        //                      <img src="images/close.gif">
        //                  </a>
        //              </div>
        //          </div>
        //      </div>
        //  </div>


        var objBody = $$('body')[0];

		objBody.appendChild(Builder.node('div',{id:'overlay'}));
	
        objBody.appendChild(Builder.node('div',{id:'lightbox'}, [
            Builder.node('div',{id:'outerImageContainer'}, 
                Builder.node('div',{id:'imageContainer'}, [
                    Builder.node('img',{id:'lightboxImage'}), 
                    Builder.node('div',{id:'hoverNav'}, [
                        Builder.node('a',{id:'prevLink', href: '#' }),
                        Builder.node('a',{id:'nextLink', href: '#' })
                    ]),
                    Builder.node('div',{id:'loading'}, 
                        Builder.node('a',{id:'loadingLink', href: '#' }, 
                            Builder.node('img', {src: LightboxOptions.fileLoadingImage})
                        )
                    )
                ])
            ),
            Builder.node('div', {id:'imageDataContainer'},
                Builder.node('div',{id:'imageData'}, [
                    Builder.node('div',{id:'imageDetails'}, [
                        Builder.node('span',{id:'caption'}),
                        Builder.node('span',{id:'numberDisplay'})
                    ]),
                    Builder.node('div',{id:'bottomNav'},
                        Builder.node('a',{id:'bottomNavClose', href: '#' },
                            Builder.node('img', { src: LightboxOptions.fileBottomNavCloseImage })
                        )
                    )
                ])
            )
        ]));


		$('overlay').hide().observe('click', (function() { this.end(); }).bind(this));
		$('lightbox').hide().observe('click', (function(event) { if (event.element().id == 'lightbox') this.end(); }).bind(this));
		$('outerImageContainer').setStyle({ width: size, height: size });
		$('prevLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage - 1); }).bindAsEventListener(this));
		$('nextLink').observe('click', (function(event) { event.stop(); this.changeImage(this.activeImage + 1); }).bindAsEventListener(this));
		$('loadingLink').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));
		$('bottomNavClose').observe('click', (function(event) { event.stop(); this.end(); }).bind(this));

        var th = this;
        (function(){
            var ids = 
                'overlay lightbox outerImageContainer imageContainer lightboxImage hoverNav prevLink nextLink loading loadingLink ' + 
                'imageDataContainer imageData imageDetails caption numberDisplay bottomNav bottomNavClose';   
            $w(ids).each(function(id){ th[id] = $(id); });
        }).defer();
    },

    //
    // updateImageList()
    // Loops through anchor tags looking for 'lightbox' references and applies onclick
    // events to appropriate links. You can rerun after dynamically adding images w/ajax.
    //
    updateImageList: function() {   
        this.updateImageList = Prototype.emptyFunction;

        document.observe('click', (function(event){
            var target = event.findElement('a[rel^=lightbox]') || event.findElement('area[rel^=lightbox]');
            if (target) {
                event.stop();
                this.start(target);
            }
        }).bind(this));
    },
    
    //
    //  start()
    //  Display overlay and lightbox. If image is part of a set, add siblings to imageArray.
    //
    start: function(imageLink) {    

        $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'hidden' });

        // stretch overlay to fill page and fade in
        var arrayPageSize = this.getPageSize();
        $('overlay').setStyle({ width: arrayPageSize[0] + 'px', height: arrayPageSize[1] + 'px' });

        new Effect.Appear(this.overlay, { duration: this.overlayDuration, from: 0.0, to: LightboxOptions.overlayOpacity });

        this.imageArray = [];
        var imageNum = 0;       

        if ((imageLink.rel == 'lightbox')){
            // if image is NOT part of a set, add single image to imageArray
            this.imageArray.push([imageLink.href, imageLink.title]);         
        } else {
            // if image is part of a set..
            this.imageArray = 
                $$(imageLink.tagName + '[href][rel="' + imageLink.rel + '"]').
                collect(function(anchor){ return [anchor.href, anchor.title]; }).
                uniq();
            
            while (this.imageArray[imageNum][0] != imageLink.href) { imageNum++; }
        }

        // calculate top and left offset for the lightbox 
        var arrayPageScroll = document.viewport.getScrollOffsets();
        var lightboxTop = arrayPageScroll[1] + (document.viewport.getHeight() / 10);
        var lightboxLeft = arrayPageScroll[0];
        this.lightbox.setStyle({ top: lightboxTop + 'px', left: lightboxLeft + 'px' }).show();
        
        this.changeImage(imageNum);
    },

    //
    //  changeImage()
    //  Hide most elements and preload image in preparation for resizing image container.
    //
    changeImage: function(imageNum) {   
        
        this.activeImage = imageNum; // update global var

        // hide elements during transition
        if (LightboxOptions.animate) this.loading.show();
        this.lightboxImage.hide();
        this.hoverNav.hide();
        this.prevLink.hide();
        this.nextLink.hide();
		// HACK: Opera9 does not currently support scriptaculous opacity and appear fx
        this.imageDataContainer.setStyle({opacity: .0001});
        this.numberDisplay.hide();      
        
        var imgPreloader = new Image();
        
        // once image is preloaded, resize image container


        imgPreloader.onload = (function(){
            this.lightboxImage.src = this.imageArray[this.activeImage][0];
            this.resizeImageContainer(imgPreloader.width, imgPreloader.height);
        }).bind(this);
        imgPreloader.src = this.imageArray[this.activeImage][0];
    },

    //
    //  resizeImageContainer()
    //
    resizeImageContainer: function(imgWidth, imgHeight) {

        // get current width and height
        var widthCurrent  = this.outerImageContainer.getWidth();
        var heightCurrent = this.outerImageContainer.getHeight();

        // get new width and height
        var widthNew  = (imgWidth  + LightboxOptions.borderSize * 2);
        var heightNew = (imgHeight + LightboxOptions.borderSize * 2);

        // scalars based on change from old to new
        var xScale = (widthNew  / widthCurrent)  * 100;
        var yScale = (heightNew / heightCurrent) * 100;

        // calculate size difference between new and old image, and resize if necessary
        var wDiff = widthCurrent - widthNew;
        var hDiff = heightCurrent - heightNew;

        if (hDiff != 0) new Effect.Scale(this.outerImageContainer, yScale, {scaleX: false, duration: this.resizeDuration, queue: 'front'}); 
        if (wDiff != 0) new Effect.Scale(this.outerImageContainer, xScale, {scaleY: false, duration: this.resizeDuration, delay: this.resizeDuration}); 

        // if new and old image are same size and no scaling transition is necessary, 
        // do a quick pause to prevent image flicker.
        var timeout = 0;
        if ((hDiff == 0) && (wDiff == 0)){
            timeout = 100;
            if (Prototype.Browser.IE) timeout = 250;   
        }

        (function(){
            this.prevLink.setStyle({ height: imgHeight + 'px' });
            this.nextLink.setStyle({ height: imgHeight + 'px' });
            this.imageDataContainer.setStyle({ width: widthNew + 'px' });

            this.showImage();
        }).bind(this).delay(timeout / 1000);
    },
    
    //
    //  showImage()
    //  Display image and begin preloading neighbors.
    //
    showImage: function(){
        this.loading.hide();
        new Effect.Appear(this.lightboxImage, { 
            duration: this.resizeDuration, 
            queue: 'end', 
            afterFinish: (function(){ this.updateDetails(); }).bind(this) 
        });
        this.preloadNeighborImages();
    },

    //
    //  updateDetails()
    //  Display caption, image number, and bottom nav.
    //
    updateDetails: function() {
    
        // if caption is not null
        if (this.imageArray[this.activeImage][1] != ""){
            this.caption.update(this.imageArray[this.activeImage][1]).show();
        }
        
        // if image is part of set display 'Image x of x' 
        if (this.imageArray.length > 1){
            this.numberDisplay.update( LightboxOptions.labelImage + ' ' + (this.activeImage + 1) + ' ' + LightboxOptions.labelOf + '  ' + this.imageArray.length).show();
        }

        new Effect.Parallel(
            [ 
                new Effect.SlideDown(this.imageDataContainer, { sync: true, duration: this.resizeDuration, from: 0.0, to: 1.0 }), 
                new Effect.Appear(this.imageDataContainer, { sync: true, duration: this.resizeDuration }) 
            ], 
            { 
                duration: this.resizeDuration, 
                afterFinish: (function() {
	                // update overlay size and update nav
	                var arrayPageSize = this.getPageSize();
	                this.overlay.setStyle({ height: arrayPageSize[1] + 'px' });
	                this.updateNav();
                }).bind(this)
            } 
        );
    },

    //
    //  updateNav()
    //  Display appropriate previous and next hover navigation.
    //
    updateNav: function() {

        this.hoverNav.show();               

        // if not first image in set, display prev image button
        if (this.activeImage > 0) this.prevLink.show();

        // if not last image in set, display next image button
        if (this.activeImage < (this.imageArray.length - 1)) this.nextLink.show();
        
        this.enableKeyboardNav();
    },

    //
    //  enableKeyboardNav()
    //
    enableKeyboardNav: function() {
        document.observe('keydown', this.keyboardAction); 
    },

    //
    //  disableKeyboardNav()
    //
    disableKeyboardNav: function() {
        document.stopObserving('keydown', this.keyboardAction); 
    },

    //
    //  keyboardAction()
    //
    keyboardAction: function(event) {
        var keycode = event.keyCode;

        var escapeKey;
        if (event.DOM_VK_ESCAPE) {  // mozilla
            escapeKey = event.DOM_VK_ESCAPE;
        } else { // ie
            escapeKey = 27;
        }

        var key = String.fromCharCode(keycode).toLowerCase();
        
        if (key.match(/x|o|c/) || (keycode == escapeKey)){ // close lightbox
            this.end();
        } else if ((key == 'p') || (keycode == 37)){ // display previous image
            if (this.activeImage != 0){
                this.disableKeyboardNav();
                this.changeImage(this.activeImage - 1);
            }
        } else if ((key == 'n') || (keycode == 39)){ // display next image
            if (this.activeImage != (this.imageArray.length - 1)){
                this.disableKeyboardNav();
                this.changeImage(this.activeImage + 1);
            }
        }
    },

    //
    //  preloadNeighborImages()
    //  Preload previous and next images.
    //
    preloadNeighborImages: function(){
        var preloadNextImage, preloadPrevImage;
        if (this.imageArray.length > this.activeImage + 1){
            preloadNextImage = new Image();
            preloadNextImage.src = this.imageArray[this.activeImage + 1][0];
        }
        if (this.activeImage > 0){
            preloadPrevImage = new Image();
            preloadPrevImage.src = this.imageArray[this.activeImage - 1][0];
        }
    
    },

    //
    //  end()
    //
    end: function() {
        this.disableKeyboardNav();
        this.lightbox.hide();
        new Effect.Fade(this.overlay, { duration: this.overlayDuration });
        $$('select', 'object', 'embed').each(function(node){ node.style.visibility = 'visible' });
    },

    //
    //  getPageSize()
    //
    getPageSize: function() {
	        
	     var xScroll, yScroll;
		
		if (window.innerHeight && window.scrollMaxY) {	
			xScroll = window.innerWidth + window.scrollMaxX;
			yScroll = window.innerHeight + window.scrollMaxY;
		} else if (document.body.scrollHeight > document.body.offsetHeight){ // all but Explorer Mac
			xScroll = document.body.scrollWidth;
			yScroll = document.body.scrollHeight;
		} else { // Explorer Mac...would also work in Explorer 6 Strict, Mozilla and Safari
			xScroll = document.body.offsetWidth;
			yScroll = document.body.offsetHeight;
		}
		
		var windowWidth, windowHeight;
		
		if (self.innerHeight) {	// all except Explorer
			if(document.documentElement.clientWidth){
				windowWidth = document.documentElement.clientWidth; 
			} else {
				windowWidth = self.innerWidth;
			}
			windowHeight = self.innerHeight;
		} else if (document.documentElement && document.documentElement.clientHeight) { // Explorer 6 Strict Mode
			windowWidth = document.documentElement.clientWidth;
			windowHeight = document.documentElement.clientHeight;
		} else if (document.body) { // other Explorers
			windowWidth = document.body.clientWidth;
			windowHeight = document.body.clientHeight;
		}	
		
		// for small pages with total height less then height of the viewport
		if(yScroll < windowHeight){
			pageHeight = windowHeight;
		} else { 
			pageHeight = yScroll;
		}
	
		// for small pages with total width less then width of the viewport
		if(xScroll < windowWidth){	
			pageWidth = xScroll;		
		} else {
			pageWidth = windowWidth;
		}

		return [pageWidth,pageHeight];
	}
}

Event.observe(window, 'load', function () { new Lightbox(); });
//document.observe('dom:loaded', function () { new Lightbox(); });
/*scroller.js.php*/
/*<script>*/
/*
Class: Scroller
    Adds a scrollbar to a specific div. The scrollbar is implemented using a Script.aculo.us slider.
    The class reparents the original div, creates a slider and ties the reparented div to the slider,
    setting any properties necessary on the divs to make it all work. The scrollbar can be styled using
    CSS. The track of the scrollbar has class 'scroll-track', 'scroll-track-top' and 'scroll-track-bot',
    the thumb has class 'scroll-handle', 'scroll-handle-top' and 'scroll-handle-bot'.
    
properties:
    myIndex - an integer used to generate a unique ID for use in, for example, div ids.
    outerBox - the div that holds the scrollpane + scrollbar
    innerBox - the div that holds the scrollpane
    innerHeight - the height of the inner box.
    viewportHeight - the height of the view onto the scrolled div.
    track - a div that holds the script.aculo.us slider (the scrollbar)
    trackHeight - the height of the slider
    handle - the div for the 'thumb' of the scrollbar
    handleHeight - the height of the thumb
    slider - the script.aculo.us slider itself
    ieDecreaseBy - a fudge factor used when calculating the width of innerBox
    
*/
var Scroller = Class.create();

/*
property: Scroller.ids
    A cache of Scrollers indexed by the ID of the original div.
 */
Scroller.ids = new Object();

/*
property: Scroller.i
    A unique ID generator.
 */
Scroller.i = 0;

Scroller.prototype = {
    /*
    constructor: initialize 
        Wrap the passed div in a scrollpane.
    
    parameters: 
        el - the div to add a scrollbar to.
     */
  initialize: function(el) {
    this.outerBox = el;
    this.decorate();
  },
  
  /*
  function: decorate  
    create the necessary elements to implement the scrollbar and wire up events.
   */
  decorate: function() {
    $(this.outerBox).makePositioned(); // Fix IE
    
    // Seed a unique ID
    Scroller.i = Scroller.i + 1;
    this.myIndex = Scroller.i;
    
    //wrap the existing content in an intermediate inner box
    this.innerBox = document.createElement("DIV");
    this.innerBox.className="scroll-innerBox";
    $(this.innerBox).makePositioned();  // Fix IE
    this.innerBox.style.cssFloat=this.innerBox.style.styleFloat='left'; // Need the scrollbar to appear next to the scrollpane
    this.innerBox.id="scroll-innerBox-"+Scroller.i;
    this.innerBox.style.top = "0px";
    
    //Transfer the contents of Outer Box to Inner Box
    while (this.outerBox.hasChildNodes()) {
        this.innerBox.appendChild(this.outerBox.firstChild);
    }
    this.innerBox.style.overflow="hidden";
    //turn off scrolling on the outer div
    this.outerBox.style.overflow="hidden";

    // create a track
    this.track=document.createElement('div');
    this.track.className="scroll-track";
    $(this.track).makePositioned();
    this.track.style.cssFloat=this.track.style.styleFloat='left';
    this.track.id="scroll-track-"+Scroller.i;
    // Fix IE line-height bug. Sigh.
    this.track.appendChild(document.createComment(''));

    // Create the top button
    this.tracktop=document.createElement('div');
    this.tracktop.className="scroll-track-top";
    $(this.tracktop).makePositioned();
    this.tracktop.style.cssFloat=this.tracktop.style.styleFloat='left';
    this.tracktop.id="scroll-track-top-"+Scroller.i;
    // Fix IE line-height bug. Sigh.
    this.tracktop.appendChild(document.createComment(''));
    
    // Create the bottom button
    this.trackbot=document.createElement('div');
    this.trackbot.className="scroll-track-bot";
    $(this.trackbot).makePositioned();
    this.trackbot.style.cssFloat=this.trackbot.style.styleFloat='left';
    this.trackbot.id="scroll-track-bot-"+Scroller.i;
    // Fix IE line-height bug. Sigh.
    this.trackbot.appendChild(document.createComment(''));

    // Create the handle
    this.handle=document.createElement('div');
    this.handle.className="scroll-handle-container";
    this.handle.id="scroll-handle-container"+Scroller.i;

    // Create the handle middle
    this.handle_middle=document.createElement('div');
    this.handle_middle.className="scroll-handle";
    $(this.handle_middle).makePositioned();
    this.handle_middle.id="scroll-handle-"+Scroller.i;
    // Fix IE line-height bug. Sigh.
    this.handle_middle.appendChild(document.createComment(''));

    // Create the handle top cap
    this.handletop=document.createElement('div');
    this.handletop.className="scroll-handle-top";
    $(this.handletop).makePositioned();
    this.handletop.id="scroll-handle-top-"+Scroller.i;
    // Fix IE line-height bug. Sigh.
    this.handletop.appendChild(document.createComment(''));

    // Create the handle bottom cap
    this.handlebot=document.createElement('div');
    this.handlebot.className="scroll-handle-bot";
    $(this.handlebot).makePositioned();
    this.handlebot.id="scroll-handle-bot-"+Scroller.i;
    // Fix IE line-height bug. Sigh.
    this.handlebot.appendChild(document.createComment(''));

    this.track.hide();
    this.tracktop.hide();
    this.trackbot.hide();

    this.outerBox.appendChild(this.innerBox);
    this.outerBox.appendChild(this.tracktop);
    this.handle.appendChild(this.handletop);
    this.handle.appendChild(this.handle_middle);
    this.handle.appendChild(this.handlebot);
    this.track.appendChild(this.handle);
    this.outerBox.appendChild(this.track);
    this.outerBox.appendChild(this.trackbot);

    this.slider = new Control.Slider($(this.handle).id, $(this.track).id, {axis:'vertical',
                                     minimum: 0,
                                     maximum: $(this.outerBox).clientHeight});
    this.slider.options.onSlide = this.slider.options.onChange = this.onChange.bind(this);
    setTimeout(this.resetScrollbar.bind(this, false), 10);

    this.domMouseCB = this.MouseWheelEvent.bindAsEventListener(this, this.slider);
    this.mouseWheelCB = this.MouseWheelEvent.bindAsEventListener(this, this.slider);
    this.trackTopCB = this.tracktopEvent.bindAsEventListener(this, this.slider);
    this.trackBotCB = this.trackbotEvent.bindAsEventListener(this, this.slider);
    
    //Events control
    $(this.outerBox).observe('DOMMouseScroll', this.domMouseCB); // Mozilla
    $(this.outerBox).observe('mousewheel', this.mouseWheelCB);// IE/Opera
    $(this.tracktop).observe('mousedown', this.trackTopCB);
    $(this.trackbot).observe('mousedown', this.trackBotCB);
  },
  
  release: function() {
    $(this.outerBox).stopObserving('DOMMouseScroll', this.domMouseCB);
    $(this.outerBox).stopObserving('mousewheel', this.mouseWheelCB);// IE/Opera
    $(this.tracktop).stopObserving('mousedown', this.trackTopCB);
    $(this.trackbot).stopObserving('mousedown', this.trackBotCB);
  },
  
  /*
  function: resetScrollbar  
    Re-calculate the geometry of the scrollbar. Typically called from an event handler.
    
    args:   
        repeat - if true, set timer to re-calculate to fix IE bug on resize window.
   */
  resetScrollbar: function(repeat) {
	  	this.borderWidth = 1;
	  
        this.track.hide();
        this.tracktop.hide();
        this.trackbot.hide();
        this.enableScroll = false;
        this.innerHeight = $(this.outerBox).clientHeight;
        this.innerBox.style.height = this.innerHeight + "px";
        var newWidth = $(this.outerBox).clientWidth;

        var tth = Element.getStyle(this.tracktop,"height");
        if (tth)
           tth = tth.replace("px","");
        else
           tth = 0;
    
        var hth = Element.getStyle(this.handletop,"height");
        if (hth)
           hth = hth.replace("px","");
        else
           hth = 0;
    
        if (this.innerHeight < this.innerBox.scrollHeight) {
            this.viewportHeight = this.innerHeight - tth*2 - (this.borderWidth * 2);
            this.slider.trackLength = this.viewportHeight;
            this.track.style.height = this.viewportHeight + "px";    
            this.handleHeight = Math.round(this.viewportHeight * this.innerHeight / this.innerBox.scrollHeight);    
            if(this.handleHeight < (hth*2))
                this.handleHeight = (hth*2);
            if (this.handleHeight < 10)
                 this.handleHeight = 10;
            this.handle.style.height = this.handleHeight + "px";
            this.handle_middle.style.height = this.handleHeight - hth*2 + "px";
            this.handletop.style.height = hth + "px";
            this.slider.handleLength = this.handleHeight;
            this.track.style.display = 'inline';
            this.tracktop.style.display = 'inline';
            this.trackbot.style.display = 'inline';
            this.ieDecreaseBy = 1;   // Firefox seems to have an off-by one error, so allow for it.
            if (this.outerBox.currentStyle) {
                var borderWidth = this.outerBox.currentStyle["borderWidth"].replace("px","");
                if(!isNaN(borderWidth)) {
                    this.ieDecreaseBy = (borderWidth) * 2;
                }
            }
            newWidth = ($(this.outerBox).clientWidth - $(this.track).clientWidth - this.ieDecreaseBy);
            this.enableScroll = true;
        }
        //Set the width of of the scrollpane (aka innerBox).
        this.innerBox.style.width = newWidth + "px";
        //Fix IE resize event Bug 
        if(repeat) {
            setTimeout(this.resetScrollbar.bind(this, false), 10);
        }
  },
  
    //Mouse wheel code from http://adomas.org/javascript-mouse-wheel/
    MouseWheelEvent: function(event, slider) {
        var delta = 0;
        if (!event) //For IE.
            event = window.event;
        if (event.wheelDelta) { //IE/Opera.
            delta = event.wheelDelta / 120;
            /*if (window.opera) //In Opera 9, delta differs in sign as compared to IE
                delta = -delta;   But it isn't necessary with Opera v9.51*/
        } else if (event.detail) { //Mozilla case
            delta = -event.detail / 3;
        }
        if (delta)
            slider.setValueBy(-delta / 10);
        Event.stop(event);
    },

    trackbotEvent: function(event, slider) {
        if (Event.isLeftClick(event)) { 
            slider.setValueBy(0.2);
            Event.stop(event);
        }
    },

    tracktopEvent: function(event, slider) {
        if (Event.isLeftClick(event)) {
            slider.setValueBy(-0.2);
            Event.stop(event);
        }
    },

  /*
  function: onChange  
    Called when the script.aculo.us slider has changed (i.e. when it has been dragged). Scroll the inner box.
    
    args:   
        val - not used.
   */
    onChange: function(val) {
        if(this.enableScroll)
            this.innerBox.scrollTop = Math.round (val * (this.innerBox.scrollHeight-this.innerBox.offsetHeight));
    }
}

/*
function: Scroller.setAll
    Search for divs of the class 'makeScroll' and wrap them in a Scroller.
 */
Scroller.setAll = function () {
    $$('.makeScroll').each(function(item) {
        Scroller.ids[item.id] = new Scroller(item);
    });
}

/*
function: Scroller.reset
    If the passed element has class 'makeScroll', wrap it in a Scroller.
 */
Scroller.reset = function (body_id) {
    if ($(body_id).className.match(new RegExp("(^|\\s)makeScroll(\\s|$)"))) {
       if (Scroller.ids[body_id])
           Scroller.ids[body_id].release();
           
        Scroller.ids[body_id] = new Scroller($(body_id));
    }
}

/*
property: Scroller.updateAll
    Reset all of the scrollbars.
 */
Scroller.updateAll = function () {
    $H(Scroller.ids).each(function(pair) {
        Scroller.ids[pair.key].resetScrollbar(true);
    });
}

/*
    Hook up some global event handlers.
 */
Event.observe(window, "load", Scroller.setAll);
Event.observe(window, "resize", Scroller.updateAll);
/*browser-detect.js.php*/
/*<script>*/
// Browser name:	BrowserDetect.browser
// Browser version:	BrowserDetect.version
// OS name:			BrowserDetect.OS
/* July 16 09 */ 
/*
Copyright Â© 2008 Eckx Media Group, LLC. All rights reserved.
Eckx Media Group respects the intellectual property of others, and we ask our users to do the same.
*/

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			string: navigator.userAgent,
			subString: "iPhone",
			identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
/*val-form.js.php*/
/*07/16/09: remove html tags in labels */
/*
Copyright © 2008 Eckx Media Group, LLC. All rights reserved.
Eckx Media Group respects the intellectual property of others, and we ask our users to do the same.
*/
/*<script>*/
/*
PACK:
	replace JS Variables: formClasses submitBtns waitFlag errorStr locate errorField labelFor errorMsg
	after pack, need to replace $Vxxxxxx with $w
*/
/*key words

validators
==========
val_req
val_checked (int)(checkboxes only)
val_checked_min (int) (checkboxes only)
val_checked_max (int) (checkboxes only)
val_min(int)
val_max(int)
val_maxNum(int)
val_minNum(int)
val_alpha
val_alpha_num
val_alpha_space
val_alpha_num_space
val_num
val_int
val_email
val_len
val_same(input id)
val_notSame(input id); // id of input(hidden) containing ids of fields to check
val_url
val_ajax(function)
val_func(function)

key words
=========
val_combo(input id): combine multiple elements to a single output error base on input id, elements should have a single name to allow access to lable name
	usage: label for should match with first input id, val_comboe (id of last input)
	ie:
		<label for="register-birthdate-month">Birthdate:</label>
		<select id="register-birthdate-month" name="dob[]" class="month val_req val_combo register-birthdate-year"></select>
		<select id="register-birthdate-day" name="dob[]" class="day val_req val_combo register-birthdate-year"></select>
		<select id="register-birthdate-year" name="dob[]" class="year val_req val_combo register-birthdate-year"></select>
		
val_money: turn into money format
val_errorAfter(element id): errors would be displayed after a html element
val_skipifis(input id): ignore validations if the value is the same as the provided input 
*/

/* bugs
	- error appears then disappears, try placing val_ajax check at the end.


*/

var valForm = { 
	//config
	errorTag: 'div',
	errorClass: 'val_error',
	//!config
	
	//all validator and key words
	classList: new Array('val_req', 'val_min', 'val_max', 'val_maxNum', 'val_minNum', 'val_alpha', 'val_alpha_num', 'val_alpha_num_sym', 'val_alpha_space', 'val_alpha_num_space', 'val_num', 'val_int', 'val_email', 'val_len', 'val_same', 'val_notSame', 'val_url', 'val_ajax', 'val_money', 'val_func',  'val_checked', 'val_checked_min', 'val_checked_max'),
	//key words that are dependent on next class
	dependents: new Array('val_len', 'val_min', 'val_max', 'val_maxNum', 'val_minNum', 'val_same', 'val_notSame', 'val_ajax', 'val_func', 'val_checked', 'val_checked_min', 'val_checked_max'), 
	failed: true, // flag for submitting
	form: null,	// form obj
	formObsFunc: null, //holds event observer function to stop observing
	
	submitBtn: null, //button object for submitting form
	ajaxRunning: new Object(), //flag to signal if ajax check is running
	alertErrorsFlag: false, //flag to alert errors when submitting
	hideErrorsFlag: false, // flag to not display errors next to field
	errors: new Object(),
	errorFocusedFlag: false, //flag to focus on first error field only when submitting
	inputs: null, //holds all the form inputs that will be validated
	inputObsFuncs: null, //holds event observer function to stop observing
	
	originalSubmit: null, //the onsubmit of the form before its overwritten, will run before valform submits
	stopSubmit: false, //stops for custom onsubmit functions
	//arg[0]: form id, arg[1]: options
	//options: ae - alert errors on submit, he = dont display errors next to field
	init: function(){
		
		//get the form object
		if(Object.isString(arguments[0])){ //form id was specified
			valForm.form = $(arguments[0]);
		}
		else{ //get form by class
			var formClasses = $$('form[class*="val-form"]');
			if(formClasses.length > 0){
				valForm.form = formClasses[0];
			}
			else{ // no forms
				return;	
			}
		}
		
		if(arguments[1]){ //handle options
			if(arguments[1].include('ae')){
				valForm.alertErrorsFlag = true;
			}
			if(arguments[1].include('he')){
				valForm.hideErrorsFlag = true;
			}
		}
		
		//reset member variables
		valForm.failed = true;
		valForm.stopSubmit = false;
		valForm.ajaxRunning = new Object();
		if(valForm.inputs){ // been init alredy, have to unset observation functions
			for(var i=0; i<valForm.inputs.length; i++){
				Event.stopObserving(valForm.inputs[i], 'blur', valForm.inputObsFuncs[i]); // stop input obs
			}
			Event.stopObserving(valForm.form, 'submit', valForm.formObsFunc); //stop submit obs
		}
		valForm.inputs = new Array();
		valForm.inputObsFuncs = new Array();
		
		if(!valForm.form){
			alert('setupFormVal, form id dosnt exist');
			return false;
		}
		
		//get submit btn
		var submitBtns = valForm.form.select('input[type="submit"]');
		if(submitBtns.length == 0){
			alert('valForm init error: no submit button');	
		}
		else{
			valForm.submitBtn = submitBtns[0];
			valForm.submitBtn.disabled = false; //make sure the button is enabled
		}
		
		//get inputs
		valForm.inputs = document.getElementById(valForm.form.id).elements;
		
		//set event for inputs
		var focusThisFlag = false;
		if(valForm.form.hasClassName('auto-focus-off')){
			focusThisFlag = true;
		}
		
		var validNodes = new Array('INPUT', 'TEXTAREA', 'SELECT');
		for(var i=0; i<valForm.inputs.length; i++){
			if(valForm.inputs[i].disabled || validNodes.indexOf(valForm.inputs[i].nodeName) == -1){ //no point of checking if disabled or if not valid tag;
				continue;	
			}
			var inputType = valForm.inputs[i].type.toLowerCase();
			if(!focusThisFlag && valForm.inputs[i].name && inputType != 'hidden'){
				focusThisFlag = true;
				if( inputType != 'radio' && inputType != 'checkbox'){ //radio & checkbox causes blur event to occurw when selecting options
					valForm.inputs[i].focus();
				}
			}
			valForm.inputObsFuncs[i] = valForm.fieldCheck.bindAsEventListener(valForm.inputs[i]); //save even function to stop obs later
			Event.observe(valForm.inputs[i], 'blur', valForm.inputObsFuncs[i]); //set event
			//get all ajax check and initialize the running flag
			if($w(valForm.inputs[i].className).indexOf('val_ajax') != -1 ){
				valForm.ajaxRunning[valForm.inputs[i].id] = false;
			}
		}
		
		//set submit event
		valForm.originalSubmit = valForm.form.readAttribute('onsubmit'); //save original onsubmit js
		valForm.form.onsubmit = null; // remove it
		valForm.formObsFunc = valForm.submitCheck.bindAsEventListener(valForm.form); //save even function to stop obs later
		Event.observe(valForm.form, 'submit', valForm.formObsFunc); //set event
	},

	submitCheck: function(event){
		
		valForm.errorFocusedFlag = false; //not focused on any errors yet
		valForm.submitBtn.disabled = true; //prevent double click
		valForm.errors = new Object(); // clean error list
		
		valForm.failed = false;
		for(var fieldID in valForm.ajaxRunning){
			valForm.ajaxRunning[fieldID] = true;	
		}
		
		for(var i=0; i<valForm.inputs.length; i++){
			valForm.fieldCheckSubmit(valForm.inputs[i]);
			if(valForm.errors[valForm.inputs[i].id] && !valForm.errorFocusedFlag){ // focusing on error input
				valForm.inputs[i].focus();
				valForm.errorFocusedFlag = true;
			}
		}
		
		setTimeout('valForm.submitAjaxChk()', 1);
		
		Event.stop(event); 
		return false;
		
	},
	
	//make sure ajax function is complete
	submitAjaxChk: function(){
		var waitFlag = false;
		for(var fieldID in valForm.ajaxRunning){
			if(valForm.ajaxRunning[fieldID]){
				waitFlag = true;
			}
			else{
				if(valForm.errors[fieldID] && !valForm.errorFocusedFlag){ // focusing on error fields
					$(fieldID).focus();
					valForm.errorFocusedFlag = true;
				}
			}
		}
		if(waitFlag){
			setTimeout('valForm.submitAjaxChk()', 100);
		}
		else if(!valForm.failed){
			eval(valForm.originalSubmit);
			if(!valForm.stopSubmit){
				valForm.form.submit();
			}
			else{
				valForm.submitBtn.disabled = false;
			} 
		}
		else{ //failed
			if(valForm.alertErrorsFlag){
				var errorStr = '';
				for(var fieldID in valForm.errors){
					errorStr += valForm.errors[fieldID] + "\n";
				}
				alert(errorStr);
			}
			
			valForm.submitBtn.disabled = false; //enable submit button
		}
	},
	
	fieldCheck: function(){ //check event
		var classes = $w(this.className);
		//handle combo
		var index = classes.indexOf('val_combo');
		if(index != -1){ // found key word
			if(index+1 == classes.length){ // dosnt have combo id
				alert('val_combo id required');
				return;
			}
			var comboID = classes[index + 1];
			if($(valForm.comboID+'_error')){ //clear combo error
				$(valForm.comboID+'_error').remove();
			}
			if(valForm.errors[comboID]){ //clear combo error
				valForm.errors[comboID] = false;
			}
			var comboFields = valForm.form.select('.' + comboID); //get all fields with combo id in class
			for(var i=0; i<comboFields.length; i++){
				valForm.validate(comboFields[i], comboID);
				if(valForm.errors[comboID]){
					return;	
				}
			}
			return;
		}
		
		valForm.validate(this);
		return;
	},
	
	fieldCheckSubmit: function(field){ //check event
		var classes = $w(field.className);
		//handle combo
		var index = classes.indexOf('val_combo');
		if(index != -1){ // found key word
			if(index+1 == classes.length){ // dosnt have combo id
				alert('val_combo id required');
				return;
			}
			var comboID = classes[index + 1];
			if($(valForm.comboID+'_error')){ //clear combo error
				$(valForm.comboID+'_error').remove();
			}
			if(valForm.errors[comboID]){ //clear combo error
				valForm.errors[comboID] = false;
			}
			var comboFields = valForm.form.select('.' + comboID); //get all fields with combo id in class
			for(var i=0; i<comboFields.length; i++){
				valForm.validate(comboFields[i], comboID);
				if(valForm.errors[comboID]){
					return;	
				}
			}
			return;
		}
		
		valForm.validate(field);
		return;
	},
	
	validate: function(field, comboID){ // validate function
		var classes = $w(field.className);
		
		//check for val_skipifis
		var locate = classes.indexOf('val_skipifis');
		if(locate != -1 && locate != (classes.length - 1)){ // exist and not the last class name
			var ifisInput = $(classes[locate + 1]);
			if( ifisInput.value != '' && field.value.strip() == ifisInput.value){
				if(classes.indexOf('val_ajax') !=-1 ){ // top ajax running, because of submit check
					valForm.ajaxRunning[field.id] = false;
				}
				valForm.errorHandler(field, false)
				return;	
			}
		}
		
		for(var i=0; i<classes.length; i++){
			if(valForm.classList.indexOf(classes[i]) == -1){ //not a keyword
				continue;
			}
			if(valForm.dependents.indexOf(classes[i]) == -1){ //not a dependant
				var run = 'var error = valForm.'+classes[i]+'(field);';
			}
			else{ //dependent on next class
				if(i+1 == classes.length){
					alert('valForm dependent required');
					return false;
				}
				var run = 'var error = valForm.'+classes[i]+'(field, "'+classes[i+1]+'");';
			}
			eval(run); //alert(run);
			if(classes[i] == 'val_ajax'){
				continue;	
			}
			var errorField = field;
			if(comboID){ // display error for combo 
				errorField = $(comboID);
			}
			if(valForm.errorHandler(errorField, error)){
				break;	
			}
		}
	},
	
	errorHandler: function(field, error){ // function to display error	
		/*if(field.name.indexOf('[') != -1 ){ //name is an array, get label for base on first index id 
			var labelFor = valForm.form.select('[name="'+field.name+'"]')[0].id;
		}
		else{*/
			var labelFor = field.id;
		//}
		var label = valForm.form.select('label[for=' + labelFor  + ']');
		
		if($(field.id+'_error')){
			$(field.id+'_error').remove();
			label[0].removeClassName('val-error');
		}
		
		if(!error){ // no error
			return false;	
		}
		valForm.failed = true;
		
		 //when submiting, ajax running are set, but there is an error, so ajax function will not start, therefore ajax running will never be unset
		if(valForm.ajaxRunning[field.id]){
			valForm.ajaxRunning[field.id] = false;
		}
		if(!label[0]){
			alert(field.id+' label is missing, check label id');
			return;
		}
		//remove html between label tags or remove a colon and after
		var errorMsg = label[0].innerHTML;
		var colonPos = label[0].innerHTML.indexOf(':');
		if(colonPos == -1){ //cant find colon, check for html
			var htmlOpenPos = label[0].innerHTML.indexOf('<');
			if(htmlOpenPos != -1){
				var errorMsg = label[0].innerHTML.substring(0, htmlOpenPos-1);
			}
		}
		else{
			var errorMsg = label[0].innerHTML.substring(0, colonPos);
		}
		errorMsg = errorMsg.gsub(/:|<em>\*<\/em>|<EM>\*<\/EM>/, '') + ' ' + error;
		//var errorMsg = label[0].innerHTML.gsub(/:|<em>\*<\/em>|<EM>\*<\/EM>/, '')+' '+error;
		
		if(!valForm.hideErrorsFlag){
			//check to place error after a diferent element
			var classNames = $w(field.className);
			var findKeyword = classNames.indexOf('val_errorAfter');
			if( findKeyword != -1){
				if(findKeyword == (classNames.length - 1)){ //missing id for error element
					alert('val_form: val_errorAfter is missing an id');
				}
				else{
					new Insertion.After($(classNames[findKeyword+1]), '<'+valForm.errorTag+' id="'+field.id+'_error" class="'+valForm.errorClass+'">'+errorMsg+'</'+valForm.errorTag+'>');
					label[0].addClassName('val-error');
				}
			}
			else{ //place error after field element
				new Insertion.After(field, '<'+valForm.errorTag+' id="'+field.id+'_error" class="'+valForm.errorClass+'">'+errorMsg+'</'+valForm.errorTag+'>');
				label[0].addClassName('val-error');
				
			}
		}
		
		valForm.errors[field.id] = errorMsg;
		
		return true;
	},
	
	
	//-------------- VALIDATORS
	
	val_num : function(field) {
		if(field.value.match(/(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/) || field.value == '') {
			return false;
		} 
		else {
			return 'needs to be a number.';
		}
	},
	
	val_req : function(field) {
		var fieldType = field.type.toLowerCase();
		if(fieldType == 'checkbox' || fieldType == 'radio'){
			var values = valForm.form.select('[name="'+field.name+'"]');
			for(var i=0; i<values.length; i++){
				if(values[i].checked){
					return false;	
				}
			}
		}  
		else if(field.value.strip().length != 0) {
			return false;
		} 
		
		return 'is required.';
	},
	
	val_min : function(field, minLen) {
		if(field.value.length < parseFloat(minLen) && field.value != ''){
			return 'must be at least '+minLen+' characters long.';
		}
		else{
			return false;	
		}
	},
	
	val_max : function(field, maxLen) {
		if(field.value.length > parseFloat(maxLen) && field.value != ''){
			return 'must be at most '+maxLen+' characters long.';
		}
		else{
			return false;	
		}
	},
	
	val_maxNum : function(field, maxNum){
		if( !isNaN(field.value) && field.value > parseFloat(maxNum)){ 
			return 'must be '+maxNum+' or less.';
		}
		else{
			return false;	
		}
	},
	
	val_minNum : function(field, minNum){
		if(!isNaN(field.value) && (field.value < parseFloat(minNum))){
			return 'must be '+minNum+' or greater.';
		}
		else{
			return false;	
		}
	},
	
	val_len : function(field, len) {
		if(field.value.length != parseFloat(len) && field.value != ''){
			return 'must be '+len+' characters long.';
		}
		else{
			return false;	
		}
	},
	
	val_same : function(field, field2){
		var field2Obj = $(field2);
		if(!field2Obj){
			alert('val_same: '+field2+' is not defined');
			return true;
		}
		if(field.value != field2Obj.value && field2Obj.value != ''){
			var label = valForm.form.select('label[for=' + field2Obj.id + ']');
			return 'does not match '+label[0].innerHTML.gsub(/:|<em>\*<\/em>|<EM>\*<\/EM>/, '')+'.';
		}
		return false;
	},
	
	val_notSame : function(field, field2){
		if(!$(field2)){
			alert('val_notSame: '+field2+' is not defined');
			return 'error';
		}
		if(field.value.strip().length == 0){ //blank
			return false;	
		}
		var checkFields = $(field2).value.split(' ');
		for(var i=0; i<checkFields.length; i++){
			if(checkFields[i] == field.id){ //same fields
				continue;	
			}
			if(!$(checkFields[i])){
				alert('val_notSame: '+checkFields[i]+' is not defined');
				return 'error';
			}
			if(field.value == $(checkFields[i]).value){
				return ' has already been entered.';	
			}
		}
		return false;
	},
	
	val_email : function(field){
		if(field.value.match(/^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/) || field.value == '') {
			return false;
		} 
		else {
			return 'is not a valid email address.';
		}
	},
	
	val_alpha : function(field) {
		if(field.value.match(/^[a-zA-Z]+$/) || field.value == '') {
			return false;
		} 
		else {
			return 'should contain only letters.';
		}
	},
	
	val_alpha_space : function(field) {
		if(field.value.match(/^[a-zA-Z\s]*$/) || field.value == '') {
			return false;
		} 
		else {
			return 'should contain only letters and spaces.';
		}
	},
	
	val_alpha_num : function(field) {
		if(field.value.match(/^[a-zA-Z0-9]*$/) || field.value == '') {
			return false;
		} 
		else {
			return 'should contain only letters and numbers.';
		}
	},
	
	val_alpha_num_space : function(field) {
			if(field.value.match(/^[a-zA-Z0-9\s]*$/) || field.value == '') {
				return false;
			} 
			else {
				return 'value should contain only letters, numbers, and spaces.';
			}
		},
	
	val_alpha_num_sym : function(field) {
		if(field.value.match(/^[a-zA-Z0-9_\-.]*$/) || field.value == '') {
			return false;
		} 
		else {
			return 'should contain only letters, numbers, and "-", "_", or ".".';
		}
	},
	
	val_int : function(field) {
		if(field.value.match(/(^-?\d\d*$)/) || field.value == '') {
			return false;
		} 
		else {
			return 'needs to be a whole number.';
		}
	},
	
	val_url : function(field) {
		if(field.value.match(/^(http|https|ftp):\/\/(([A-Z0-9][A-Z0-9_-]*)(\.[A-Z0-9][A-Z0-9_-]*)+)(:(\d+))?\/?/i) || field.value == '') {
			return false;
		} 
		else {
			return 'needs to be a valid url.';
		}
	},
	
	val_checked : function(field, len){
		var checked = 0;
		var values = valForm.form.select('[name="'+field.name+'"]');
		for(var i=0; i<values.length; i++){
			if(values[i].checked){
				checked++;
			}
		}
		if(checked != len){
			return 'requires '+len+' selections.';
		}
		return false;
	},
	
	val_checked_min : function(field, len){
		var checked = 0;
		var values = valForm.form.select('[name="'+field.name+'"]');
		for(var i=0; i<values.length; i++){
			if(values[i].checked){
				checked++;
			}
		}
		if(checked < len){
			return 'requires at least '+len+' selections.';
		}
		return false;
	},

	val_checked_max : function(field, len){
		var checked = 0;
		var values = valForm.form.select('[name="'+field.name+'"]');
		for(var i=0; i<values.length; i++){
			if(values[i].checked){
				checked++;
			}
		}
		if(checked > len){
			return 'requires at most '+len+' selections.';
		}
		return false;
	},

	val_ajax: function(field, func){
		eval(func + "('"+field.id+"')");
		return true;
	},
	
	val_func: function(field, func){
		eval('var valForm_error = '+func + "('"+field.id+"')");
		if(valForm_error){
			return valForm_error;
		}
		else{
			return false;	
		}
	},
	
	//action key words	
	val_money : function(field){
		field.value = field.value.replace(/[^0-9\.]/g, '');
		if(isNaN(field.value)){
			formated = '0.00';
		}
		else{
			var formated = Math.round(field.value*100)/100;
			formated = formated.toString();
			if(formated.indexOf('.') == -1){
				formated += '.00';
			}
			else{
				var parts = formated.split('.');
				if(parts[1].length == 1){
					formated += '0';	
				}
			}
		}
		field.value = formated;
	}
};

//Event.observe(window, 'load', valForm.init);
/*swf-obj.js.php*/
/**
 * SWFObject v1.5: Flash Player detection and embed - http://blog.deconcept.com/swfobject/
 *
 * SWFObject is (c) 2007 Geoff Stearns and is released under the MIT License:
 * http://www.opensource.org/licenses/mit-license.php
 *
 */
if(typeof deconcept=="undefined"){var deconcept=new Object();}if(typeof deconcept.util=="undefined"){deconcept.util=new Object();}if(typeof deconcept.SWFObjectUtil=="undefined"){deconcept.SWFObjectUtil=new Object();}deconcept.SWFObject=function(_1,id,w,h,_5,c,_7,_8,_9,_a){if(!document.getElementById){return;}this.DETECT_KEY=_a?_a:"detectflash";this.skipDetect=deconcept.util.getRequestParameter(this.DETECT_KEY);this.params=new Object();this.variables=new Object();this.attributes=new Array();if(_1){this.setAttribute("swf",_1);}if(id){this.setAttribute("id",id);}if(w){this.setAttribute("width",w);}if(h){this.setAttribute("height",h);}if(_5){this.setAttribute("version",new deconcept.PlayerVersion(_5.toString().split(".")));}this.installedVer=deconcept.SWFObjectUtil.getPlayerVersion();if(!window.opera&&document.all&&this.installedVer.major>7){deconcept.SWFObject.doPrepUnload=true;}if(c){this.addParam("bgcolor",c);}var q=_7?_7:"high";this.addParam("quality",q);this.setAttribute("useExpressInstall",false);this.setAttribute("doExpressInstall",false);var _c=(_8)?_8:window.location;this.setAttribute("xiRedirectUrl",_c);this.setAttribute("redirectUrl","");if(_9){this.setAttribute("redirectUrl",_9);}};deconcept.SWFObject.prototype={useExpressInstall:function(_d){this.xiSWFPath=!_d?"expressinstall.swf":_d;this.setAttribute("useExpressInstall",true);},setAttribute:function(_e,_f){this.attributes[_e]=_f;},getAttribute:function(_10){return this.attributes[_10];},addParam:function(_11,_12){this.params[_11]=_12;},getParams:function(){return this.params;},addVariable:function(_13,_14){this.variables[_13]=_14;},getVariable:function(_15){return this.variables[_15];},getVariables:function(){return this.variables;},getVariablePairs:function(){var _16=new Array();var key;var _18=this.getVariables();for(key in _18){_16[_16.length]=key+"="+_18[key];}return _16;},getSWFHTML:function(){var _19="";if(navigator.plugins&&navigator.mimeTypes&&navigator.mimeTypes.length){if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","PlugIn");this.setAttribute("swf",this.xiSWFPath);}_19="<embed type=\"application/x-shockwave-flash\" src=\""+this.getAttribute("swf")+"\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\"";_19+=" id=\""+this.getAttribute("id")+"\" name=\""+this.getAttribute("id")+"\" ";var _1a=this.getParams();for(var key in _1a){_19+=[key]+"=\""+_1a[key]+"\" ";}var _1c=this.getVariablePairs().join("&");if(_1c.length>0){_19+="flashvars=\""+_1c+"\"";}_19+="/>";}else{if(this.getAttribute("doExpressInstall")){this.addVariable("MMplayerType","ActiveX");this.setAttribute("swf",this.xiSWFPath);}_19="<object id=\""+this.getAttribute("id")+"\" classid=\"clsid:D27CDB6E-AE6D-11cf-96B8-444553540000\" width=\""+this.getAttribute("width")+"\" height=\""+this.getAttribute("height")+"\" style=\""+this.getAttribute("style")+"\">";_19+="<param name=\"movie\" value=\""+this.getAttribute("swf")+"\" />";var _1d=this.getParams();for(var key in _1d){_19+="<param name=\""+key+"\" value=\""+_1d[key]+"\" />";}var _1f=this.getVariablePairs().join("&");if(_1f.length>0){_19+="<param name=\"flashvars\" value=\""+_1f+"\" />";}_19+="</object>";}return _19;},write:function(_20){if(this.getAttribute("useExpressInstall")){var _21=new deconcept.PlayerVersion([6,0,65]);if(this.installedVer.versionIsValid(_21)&&!this.installedVer.versionIsValid(this.getAttribute("version"))){this.setAttribute("doExpressInstall",true);this.addVariable("MMredirectURL",escape(this.getAttribute("xiRedirectUrl")));document.title=document.title.slice(0,47)+" - Flash Player Installation";this.addVariable("MMdoctitle",document.title);}}if(this.skipDetect||this.getAttribute("doExpressInstall")||this.installedVer.versionIsValid(this.getAttribute("version"))){var n=(typeof _20=="string")?document.getElementById(_20):_20;n.innerHTML=this.getSWFHTML();return true;}else{if(this.getAttribute("redirectUrl")!=""){document.location.replace(this.getAttribute("redirectUrl"));}}return false;}};deconcept.SWFObjectUtil.getPlayerVersion=function(){var _23=new deconcept.PlayerVersion([0,0,0]);if(navigator.plugins&&navigator.mimeTypes.length){var x=navigator.plugins["Shockwave Flash"];if(x&&x.description){_23=new deconcept.PlayerVersion(x.description.replace(/([a-zA-Z]|\s)+/,"").replace(/(\s+r|\s+b[0-9]+)/,".").split("."));}}else{if(navigator.userAgent&&navigator.userAgent.indexOf("Windows CE")>=0){var axo=1;var _26=3;while(axo){try{_26++;axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash."+_26);_23=new deconcept.PlayerVersion([_26,0,0]);}catch(e){axo=null;}}}else{try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.7");}catch(e){try{var axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash.6");_23=new deconcept.PlayerVersion([6,0,21]);axo.AllowScriptAccess="always";}catch(e){if(_23.major==6){return _23;}}try{axo=new ActiveXObject("ShockwaveFlash.ShockwaveFlash");}catch(e){}}if(axo!=null){_23=new deconcept.PlayerVersion(axo.GetVariable("$version").split(" ")[1].split(","));}}}return _23;};deconcept.PlayerVersion=function(_29){this.major=_29[0]!=null?parseInt(_29[0]):0;this.minor=_29[1]!=null?parseInt(_29[1]):0;this.rev=_29[2]!=null?parseInt(_29[2]):0;};deconcept.PlayerVersion.prototype.versionIsValid=function(fv){if(this.major<fv.major){return false;}if(this.major>fv.major){return true;}if(this.minor<fv.minor){return false;}if(this.minor>fv.minor){return true;}if(this.rev<fv.rev){return false;}return true;};deconcept.util={getRequestParameter:function(_2b){var q=document.location.search||document.location.hash;if(_2b==null){return q;}if(q){var _2d=q.substring(1).split("&");for(var i=0;i<_2d.length;i++){if(_2d[i].substring(0,_2d[i].indexOf("="))==_2b){return _2d[i].substring((_2d[i].indexOf("=")+1));}}}return "";}};deconcept.SWFObjectUtil.cleanupSWFs=function(){var _2f=document.getElementsByTagName("OBJECT");for(var i=_2f.length-1;i>=0;i--){_2f[i].style.display="none";for(var x in _2f[i]){if(typeof _2f[i][x]=="function"){_2f[i][x]=function(){};}}}};if(deconcept.SWFObject.doPrepUnload){if(!deconcept.unloadSet){deconcept.SWFObjectUtil.prepUnload=function(){__flash_unloadHandler=function(){};__flash_savedUnloadHandler=function(){};window.attachEvent("onunload",deconcept.SWFObjectUtil.cleanupSWFs);};window.attachEvent("onbeforeunload",deconcept.SWFObjectUtil.prepUnload);deconcept.unloadSet=true;}}if(!document.getElementById&&document.all){document.getElementById=function(id){return document.all[id];};}var getQueryParamValue=deconcept.util.getRequestParameter;var FlashObject=deconcept.SWFObject;var SWFObject=deconcept.SWFObject;
/*emg-ajax-v1.js.php*/
 /*
12:13 PM 11/24/2010
6:19 PM 10/25/2010
2:04 PM 10/14/2010
2:14 PM 9/7/2010
*/
/*
Copyright Â© 2010 Eckx Media Group, LLC. All rights reserved.
Eckx Media Group respects the intellectual property of others, and we ask our users to do the same.
*/
/*<script>*/

 var EmgAjax = { 
 urls: new Array(), flags: new Array(), forms: new Object(), init: function(container){
 if(!container){ alert('EmgAjax.init(): container is null'); }
 var anchors = container.select('a[rel~="ajax"]');
for(var i = 0; i < anchors.length; i++){ anchors[i].href = 'javascript:EmgAjax.call(\'' + EmgAjax.normalizeUrl(anchors[i].href) + '\', \'' + anchors[i].readAttribute('rel') + '\')';
} 
 var forms = container.select('form[class~="ajax"]'); for(var i = 0; i < forms.length; i++){ forms[i].onsubmit = function(){
 EmgAjax.call(EmgAjax.normalizeUrl(this.action), this.readAttribute('class'), this); return false };
} 
 var V57bcbf1d = container.select('[class~="ajax-autofill"]'); for(var i = 0; i < V57bcbf1d.length; i++){
 if(V57bcbf1d[i].id.length == 0){ alert('ajax-container missing id'); } var url = EmgAjax.normalizeUrl(V57bcbf1d[i].select('a')[0].href);
if(url.indexOf('?') == -1){ url += '?'; } EmgAjax.call(url + '&ajax-container=' + V57bcbf1d[i].id, 'ajax container ' + V57bcbf1d[i].id + ' ' + V57bcbf1d[i].readAttribute('class'));
} }, 
 normalizeUrl: function (url){ url = url.replace('%27', '\\%27'); url = url.replace(document.location.protocol+'//'+document.domain, ''); 
 return url; }, 
 getFlags : function(flagstr){ var flags = { modal : false, samemodal: false, callback:false, modalCloseCallback: false, skipRewrite: false, container: false, containerid: false }; 
 var V8b32e648 = flagstr.split(' '); flags.modal = V8b32e648.include('modal'); flags.samemodal = V8b32e648.include('same');
flags.skipRewrite = V8b32e648.include('skip-rewrite'); flags.container = V8b32e648.indexOf('container');
if(flags.container != -1){ flags.containerid = V8b32e648[flags.container + 1]; if($(flags.containerid)){ 
 flags.container = true; flags.modal = false; } else{ flags.container = false; flags.containerid = false;
} } else{ flags.container = false; flags.containerid = false; } flags.callback = V8b32e648.indexOf('callback');
if(flags.callback != -1){ flags.callback = V8b32e648[flags.callback + 1];
 if(flags.containerid){
 flags.callback += '(\'' + flags.containerid + '\')'; } else{ flags.callback += '()'; } } else{ flags.callback = false; 
 } flags.modalCloseCallback = V8b32e648.indexOf('modal-close-callback'); if(flags.modalCloseCallback != -1){
 flags.modalCloseCallback = V8b32e648[flags.modalCloseCallback + 1]; if(flags.containerid){ flags.modalCloseCallback += '(\'' + flags.containerid + '\')';
} else{ flags.modalCloseCallback += '()'; } } else{ flags.modalCloseCallback = false; } return flags;
}, refresh: function(V03614551, callback){ if(!this.urls[V03614551]){ alert('V03614551:' + V03614551 + ' does not exist'); 
 return; } if(!callback){ var callback = false; } this.call(this.urls[V03614551], this.flags[V03614551], this.forms[V03614551], false, callback);
}, refreshModal: function(prev){ if(prev){ var V7f54f96b = modal.index - 2; } else{ var V7f54f96b = modal.index;
} var V03614551 = 'modal-' + V7f54f96b; this.flags[V03614551] += ' same'; this.refresh(V03614551); 
 }, 
 call : function(url, flagstr, form, post, callback){ if(!form){ form = false; } else{ var formParameters = form.serialize(true);} if(!post){
 post = false; } var flags = this.getFlags(flagstr); 
 var loading = document.createElement('p'); 
 loading.innerHTML = '<img src="' + window.CR + '/images/library/loading.gif" />'; 
 if(flags.containerid){ 
 var container = $(flags.containerid); var containerHeight = container.getHeight(); container.setStyle({height : containerHeight + 'px'}); 
 container.innerHTML = '';
 loading.addClassName('ajax-container-loading'); container.appendChild(loading);
var ajaxid = flags.containerid; loading.id = ajaxid + '-loading'; } else{ if(!flags.samemodal){ modal.openBlinds(); 
 } var ajaxid = 'modal-' + modal.index; 
 loading.id = ajaxid + '-loading'; document.body.appendChild(loading); 
 
 loading.addClassName('modal-load'); topLeft = getTopLeft(loading.getWidth(), loading.getHeight());
loading.style.top = topLeft[0] + '%'; loading.style.left = topLeft[1] + '%'; loading.style.zIndex = modal.index + 1;
} 
 this.urls[ajaxid] = url; this.flags[ajaxid] = flagstr; this.forms[ajaxid] = form;
 if(!flags.skipRewrite){
 
 if(window.CR.length > 0){ var crpos = url.indexOf(window.CR); var urla = url.substring(0, crpos);
var urlb = url.substring(crpos + window.CR.length); url = urla + window.CR + '/ajax' + urlb; } else{
 url = '/ajax' + url; } } var rand = Math.round(100000*Math.random()); if(!url.include('?')){ url += '?';
} url += '&k='+rand; if(flags.containerid){ url += '&ajax-container=' + flags.containerid; } else{
 url += '&ajax-modal=true'; } 
 
 var callBackComplete = function(ajaxReturn) { 
 var loading = $(ajaxid + '-loading');
var loadingParent = loading.up(); if(loadingParent){ loadingParent.removeChild(loading); } if(ajaxReturn.responseText == 'died'){ 
 window.location = window.CR+'/action/died'; return; } if(flags.modal){ var classStr = modal.urlToClassStr(url);
modal.content(ajaxReturn.responseText, classStr, flags.samemodal, false, false, false, flags.modalCloseCallback);
var container = $('modal-contentLayer' + modal.index); } else{ var container = $(flags.containerid);
if(!container){ alert('EmgAjax.call(): error, `' + flags.containerid + '` container id dosnt exist'); 
 } container.innerHTML = ajaxReturn.responseText; container.setStyle({height : null}); } EmgAjax.init(container);
markupInit(container); if(window.initValForm){ initValForm($(container)); } 
 if(callback){ eval(callback); 
 }
 if(flags.callback){ eval(flags.callback); } }; var callBackFailed = function(ajaxReturn){ 
 return false; alert('callBackFailed() ' + url); }; var callBackSuccess = function(ajaxReturn){ };
 if(form){ form.action = url;form.request({parameters: formParameters, onComplete: callBackComplete, onFailure: callBackFailed}); 
 } else{ var method = post ? 'post' : 'get'; var postBody = post ? post : ''; new Ajax.Request(url, { method: method, postBody: postBody, onComplete: callBackComplete, onFailure: callBackFailed}); 
 } } }
/*functions.js.php*/
/*<script>*/
function scrollHomelessFacts(){
	var facts = $('homeless-facts');
	
	if (facts) {
		new Effect.Scroll(facts, {duration:5, yOffset: 120});
		setTimeout('scrollHomelessFacts()', 12000);
	}
}


function newsletter(){
	//window.location = window.CR+'/pdf/newsletter/'+$('monthly-newsletter').value+'.pdf';
	window.open(window.CR+'/pdf/newsletter/'+$('monthly-newsletter').value+'.pdf', '_blank');
}

// Guest inputs for RSVP
/*function showGuestInputs(containerid, num) {
	if (parseFloat(num) != num) { //nan
		return;
	}
	
	var guestCont = $(containerid);
	if(guestCont.select('input[name="' + containerid + '[]"]').length + 1 == num){
		return;	
	}
	
	guestCont.innerHTML = '';
	for(var i = 1; i < num; i++){
		guestCont.innerHTML += '<label for="' + containerid + '-' + i + '"><em>*</em> Guest Full Name:</label><input type="text" id="' + containerid + '-name-' + i + '" name="' + containerid + '[]" class="val_req" /><br />';	
	}
	valForm.init();
}*/

// Guest inputs for RSVP
function showGuestInputs(containerid, num) {
	if (parseFloat(num) != num) { //nan
		num = 0;
	}
	
	//check if there is already enough fields from previous generation
	var guestCont = $(containerid);
	if(guestCont.select('input[name="' + containerid + '[]"]').length == num){
		return;	
	}
	
	guestCont.innerHTML = '';
	for(var i = 0; i < num; i++){
		guestCont.innerHTML += '<label for="' + containerid + '-name-' + i + '"><em>*</em> Guest Full Name:</label><input type="text" id="' + containerid + '-name-' + i + '" name="' + containerid + '[]" class="val_req" /><br />';	
	}
	valForm.init();
}

// Check guest inputs on page load (user uses Back button)
document.observe('dom:loaded', checkGuestInputs);
function checkGuestInputs() {
	var rsvpFormId = 'rsvp-form';
	var rsvpForm = $(rsvpFormId);
	if (rsvpForm) {
		clearForm(rsvpFormId);
		$('sponsorship-opportunity-none').checked = true;
		$('silent-auction-donate-no').checked = true;
	}
}

// Addition with NaN = 0
function nanAdd($num1, $num2) {
	$int1 = parseInt($num1);
	$int2 = parseInt($num2);
	
	$int1 = isNaN($int1) ? 0 : $int1;
	$int2 = isNaN($int2) ? 0 : $int2;
	return $int1 + $int2;
}


var carousel = {
	navId: '',
	containerId: '',
	
	scrollDistance: 10,
	currentScrollDistance: 0,
	
	timeout: 50,
	
	init: function(navId, containerId) {
		this.navId = navId;
		this.containerId = containerId;
		
		$$('#sponsors-nav-previous').invoke('observe', 'mouseover', (function(event) {
			this.scrollStart(-this.scrollDistance);
		}).bind(this));
		$$('#sponsors-nav-next').invoke('observe', 'mouseover', (function(event) {
			this.scrollStart(this.scrollDistance);
		}).bind(this));
		$$('#' + this.navId + ' ul.nav > li').invoke('observe', 'mouseout', (function(event) {
			this.scrollStop();
		}).bind(this));
	},
	
	scrollStart: function(scrollDistance){
		this.currentScrollDistance = scrollDistance;
		this.scrolling();
	},
	
	scrollStop: function(){
		this.currentScrollDistance = 0;
	},
	
	scrolling: function(){
		if(this.currentScrollDistance != 0) {
			$(this.containerId).scrollLeft += this.currentScrollDistance;
			// ie bug
			//setTimeout(function(thisObj) { thisObj.scrolling(); }, this.timeout, this);
			//setTimeout(function() { carousel.scrolling(); }, this.timeout);
			setTimeout("carousel.scrolling()", this.timeout);
		}
	}
}
document.observe('dom:loaded', siteInit);

function siteInit() {
	//carousel.init('home-sponsors', 'home-sponsors-list');
	
	// Select expand in sidebar
	if (Prototype.Browser.IE) {
		$$('select.ie-expand').each(function(el) {
			el.observe('mousedown', function() {
				this.addClassName('expanded');
			}).observe('change', function() {
				this.removeClassName('expanded');
			}).observe('blur', function() {
				this.removeClassName('expanded');
			});
		});
	}
	
	var newsletterSelect = $('monthly-newsletter');
	if (newsletterSelect) {
		newsletterSelect.observe('change', function() {
			if (this.value == '') {
				window.location = window.CR + '/news-events/newsletters-archive';
			}
		});
	}
}

function showFlash2(src, w, h, container, parameters, variables){
	var s1 = new SWFObject(src, 'mediaplayer', w, h,'7');
	if(parameters){
		parameters = parameters.split('&');
		for(var i = 0; i < parameters.length; i++){
			var parts = parameters[i].split('=');
			s1.addParam(parts[0], parts[1]);
		}
	}
	if(variables){
		s1.addParam('flashvars', variables);
	} 
	if(!s1.write(container)){
		$(container).innerHTML = '<a href="http://www.adobe.com/shockwave/download/download.cgi?P1_Prod_Version=ShockwaveFlash">Click here to get the flash player.</a>';
	}
}

function modalVideo(video, width, height) {
	EmgAjax.call(window.CR + '/video', 'ajax modal', false, false, 'showFlash2(\'' + window.CR + '/swf/player.swf\', ' + width + ', ' + height + ', \'video-container\', \'wmode=transparent\', \'file=' + window.CR + '/videos/' + video + '&amp;controlbar=over&amp;autostart=true&amp;&amp;skin=' + window.CR + '/swf/overlay.swf\')');
}

// Give A Day In Lieu Of - Delivery Method fields
function giveADayDeliveryMethod() {
	var selectValue = $('donation-delivery-method').value;
	var emailContainer = $('recipient-email');
	var postalMailContainer = $('recipient-postal-mail');
	
	var emailFields = ['donation-recipient-email'];
	var postalMailFields = ['donation-recipient-address'
									, 'donation-recipient-city'
									, 'donation-recipient-zip'
									];
	
	emailFields.each(function(el) {
		$(el).removeClassName('val_req');
	});
	postalMailFields.each(function(el) {
		$(el).removeClassName('val_req');
	});
	if (selectValue == 'Email' || selectValue == 'Postal Mail') {		
		if (selectValue == 'Email') {
			emailContainer.removeClassName('hidden');
			postalMailContainer.addClassName('hidden');
			
			emailFields.each(function(el) {
				$(el).addClassName('val_req');
			});
		}
		else if (selectValue == 'Postal Mail') {
			postalMailContainer.removeClassName('hidden');
			emailContainer.addClassName('hidden');
			
			postalMailFields.each(function(el) {
				$(el).addClassName('val_req');
			});
		}
	}
	else {
		emailContainer.addClassName('hidden');	
		postalMailContainer.addClassName('hidden');
	}
}

/*scroll.js.php*/
/* <script type="text/javascript"> */
Effect.Scroll = Class.create();
Object.extend(Object.extend(Effect.Scroll.prototype, Effect.Base.prototype), {
	initialize: function(element) {
		this.element = $(element);
		var options = Object.extend({
			x:    0,
			y:    0,
			xOffset: 0,
			yOffset: 0,
			xMaxScroll: 0,
			mode: 'absolute'
			} , arguments[1] || {}  );
		this.start(options);
	},
	setup: function() {
		this.options.x = this.element.scrollLeft + this.options.xOffset;
		this.options.y = this.element.scrollTop + this.options.yOffset;
		
		this.options.xMaxScroll = this.element.firstDescendant().getWidth() - Math.abs(this.options.xOffset);
		
		if (this.options.continuous && !this.element._ext ) {
			this.element.cleanWhitespace();
			this.element._ext=true;
			this.element.appendChild(this.element.firstChild);
		}
	
		this.originalLeft=this.element.scrollLeft;
		this.originalTop=this.element.scrollTop;
		if(this.options.mode == 'absolute') {
			this.options.x -= this.originalLeft;
			this.options.y -= this.originalTop;
		} 
		else {
		
		}
	},
	update: function(position) {
		this.element.scrollLeft = this.options.x * position + this.originalLeft;
		this.element.scrollTop  = this.options.y * position + this.originalTop;
		//custom
	
		if(this.element.scrollLeft == 0){ //from beginning to end
			if(position < .3){ //scroll is more than 30%, something is probaly scrolling to the beginning
				this.originalLeft = this.options.xMaxScroll;
			}
		}
		if(this.element.scrollLeft > this.options.xMaxScroll-1){ //from end to beginning
			this.element.scrollLeft = 0;
		}
		if(position == 1){ // in case if something is off
			if(this.element.scrollLeft % this.options.xOffset != 0){
				this.element.scrollLeft = Math.floor(this.element.scrollLeft/this.options.xOffset) * this.options.xOffset;
			}
		}
	}
});
/*
function moveTo(container, element){
  Position.prepare();
  container_y = Position.cumulativeOffset($(container))[1]
  element_y = Position.cumulativeOffset($(element))[1]
  new Effect.Scroll(container, {x:0, y:(element_y-container_y)});
  return false;
}

function moveToX(container, element){
  Position.prepare();
  container_y = Position.cumulativeOffset($(container))[0];
  element_y = Position.cumulativeOffset($(element))[0]; 
  new Effect.Scroll(container, {x:(element_y-container_y), y:0});
  return false;
}*/
/*slideshow.js.php*/
/*<script>*/
//2:29 PM 11/6/2009
//may require scriptaculous

/*
usage, may need to configure: containerPrefix, imgdir, slideshowid
<script type="text/javascript">
<!--
	slideshow.init(3, true, true);
//-->
</script>
*/

var slideshow = {
	
	interval: 5000, //ms
	
	containerPrefix: 'slide-', //id prefix for slideshows that uses containers and not background images
	hideclass: 'current',
	
	linkPrefix: 'slide-link-', //id prefixes for slideshows that uses links to trasverse
	
	imgdir: 'slides', //assume imgdir is in clientroot/images
	
	usebg: false, // set to true if slideshow dosnt use containers but rather bg images
	slideshowid: 'slideshow', //the container that has the bg for the slideshow
	curclass: 'current',
	curPrevclass: 'current-previous', //allow fading out of current
	
	//private
	current: 1, //current slide #
	autoplayFlag: true,
	cnt: 0,
	loaded: false,
	
	init: function(usebg, autoplay){
		if($(this.containerPrefix + '1') == null){ //slideshow dosnt exist, need to check since init is always called
			return;	
		}
		//determine the number of slides
		this.cnt = 1;
		while(1){
			if($(this.containerPrefix + this.cnt) == null){
				this.cnt--; //compensate for last increment
				break;
			}
			this.cnt++;
		}
		this.usebg = usebg;
		this.autoplayFlag = autoplay;
		this.loaded = true;
		
		setTimeout('slideshow.autoplay()', this.interval);
	},
	
	autoplay: function(){
		if(!this.autoplayFlag){
			return;
		}
		var next = this.current + 1;
		if(next > this.cnt){
			next = 1;
		}
		this.swap(next, true);
		setTimeout('slideshow.autoplay()', this.interval);
	},
	
	swap: function(number, autoplay){
		if(!this.loaded){
			return ;	
		}
		if(!autoplay){
			this.autoplayFlag = false;	
		}
        else{
        	this.autoplayFlag = true;	
        }
		
		if(this.usebg){
			$(this.slideshowid).style.backgroundImage = 'url(' + window.CLIENTROOT + '/images/'+this.imgdir+'/' + number + '.jpg)';
		}
		
		// Clear classes
		for (var i = 1; i <= this.cnt; i++) {
			if(!this.usebg){ //reset all containers
				$(this.containerPrefix + i).removeClassName(this.curclass);
				$(this.containerPrefix + i).removeClassName(this.curPrevclass);
			}
			if($(this.linkPrefix + i) != null){
				$(this.linkPrefix + i).removeClassName(this.curclass);	
			}
		}
		
		// Set new current
		if(!this.usebg){ //show next container
			$(this.containerPrefix + this.current).addClassName(this.curPrevclass); //so we can fade out from it
			$(this.containerPrefix + number).addClassName(this.curclass);
			
			$(this.containerPrefix + number).setStyle({opacity:0 }); // for fade in
			$(this.containerPrefix + number).fade({ duration: .75, from: 0, to: 1 }); //fade in
			// grow
			//$(this.containerPrefix + number).hide();
			//Effect.Grow(this.containerPrefix + number, { duration: 1.0, direction: 'top-left'});
		}
		if($(this.linkPrefix + number) != null){
			$(this.linkPrefix + number).addClassName(this.curclass);
			// Blur anchor, cant figure out
			var anchors = $$('#'+this.linkPrefix+ number + ' a');
			if(anchors[0]){
				anchors[0].blur();
			}
		}
		
		this.current = number;
	},
	
	next: function(){
		var next = this.current + 1;
		if(next > this.cnt){
			next = 1;
		}
		this.swap(next, false);
	},
	
	prev: function(){
		var prev = this.current - 1;
		if(prev < 1){
			prev = this.cnt;
		}
		this.swap(prev, false);
	}
}
