﻿var boz = {

	array_merge : function(master, slave)
	{ 
		var tempArray = master;
		for(key in slave)
			tempArray[key] = slave[key];
		return tempArray;
	},
	
	days_in_month : function (iYear,iMonth) { return 32 - new Date(iYear, iMonth, 32).getDate(); },
	
	keep_same_height : function(settings)
	{
	
		var defaults = {
			selector : '.ThreePanelEvents'
		}; 
		
		var localSettings = boz.array_merge(defaults, settings);
		$A($$(localSettings.selector)).each(function(ele){ele.localSettings = localSettings});
	
		var resize_event = function(event){
			var ele = event.element();
			
			var targetHeight = 0;
			
			$A($$(ele.localSettings.selector)).each(function(ele){
				var dimentions = ele.getDimensions();
				targetHeight = Math.max(dimentions.height, targetHeight);
			});	
			
			$A($$(ele.localSettings.selector)).each(function(ele){
				ele.setStyle({height:targetHeight+'px'});
			});	
			
			//alert(targetHeight);
		
		};
		
		var last = null;
		$A($$(localSettings.selector)).each(function(ele){
			ele.resize = resize_event
			ele.observe('resize', resize_event);
			last = ele;
		});
		
		resize_event({element : function(){ return last; }});
		
	},

	is_same_day : function(date1,date2)
	{
		if(
			date1.getFullYear() == date2.getFullYear() &&
			date1.getMonth() == date2.getMonth() &&
			date1.getDate() == date2.getDate()
		)
			return true;
		return false;
	},
	
	anchor_image_overlay : function(settings){
		var defaults = {
			selector : 'a[href$=.jpg],a[href$=.jpeg],a[href$=.gif],a[href$=.png]',
			decoration: (function(element){ 
				element.addClassName('question'); 
			})
		};
		
		var localSettings = boz.array_merge(defaults, settings);
		
		$A($$(localSettings.selector)).each(function(ele){
			ele.localSettings = localSettings;
			ele.localSettings.decoration(ele);
			ele.observe('click', function(event){
				ele = event.findElement('a');
				if(!ele.localSettings) event.stop();
				var modalLayer = boz.overlay_foreground();	
				
				var container = new Element('div',{id:'boz_modal_container'});
				
				var frame = new Element('div',{id:'boz_modal_frame'});
				var under_element= new Element('div',{className:'boz_modal_under_element'});

				var prev = new Element('div',{className:'boz_modal_under_element boz_model_prev'});
				var next = new Element('div',{className:'boz_modal_under_element boz_model_next'});
				
				frame.insert(new Element('img',{src:ele.href}));
				frame.insert(under_element)
				
				under_element.insert(prev);
				under_element.insert(next);
				
				container.insert(frame);

				modalLayer.insert(container);
				event.stop();
			});
		});

	},
	
	/*****************************/
	overlay_background : function(settings){
		
		var defaults = {
			callback_closing: function(ele){ return true; },
			create : true
		};
		
		var localSettings = boz.array_merge(defaults, settings);
		
		var overlay = null;
		
		if(!(overlay = $$('#boz_overlay_background').first()) && localSettings.create){
		
			overlay = new Element('div', { id: "boz_overlay_background"});
			overlay.localSettings = localSettings;				
			overlay.close = function(event){
				if(!(ele = $$('#boz_overlay_background').first()))
					ele = event.element();
				localSettings = ele.localSettings;
				if(localSettings.callback_closing(ele))
					ele.remove();
			};

			if(foreground = $$('#boz_overlay_foreground').first())
				Element.insert(foreground, {'before':overlay});
			else
				document.body.appendChild(overlay);
			
			$$('#boz_overlay_background').first().observe('click', overlay.close);
		}
		return overlay;
	},
	
	/*****************************/
	overlay_foreground : function(settings){
		
		var defaults = {
			callback_closing: function(ele){ return true; },
			create : true,
			createBackground : true,
			closeBackground : true
		};
		
		var localSettings = boz.array_merge(defaults, settings);
		
		var overlay = null;
		
		if(!(overlay = $$('#boz_overlay_foreground').first()) && localSettings.create){

			overlay = document.createElement('div');

			overlay.close = function(event){
				if(!(ele = $$('#boz_overlay_foreground').first()))
					ele = event.element();
				localSettings = ele.localSettings;
				if(localSettings.callback_closing(ele))
					ele.remove();
				if(localSettings.closeBackground)
					boz.overlay_background({create:false}).close();
			};

			overlay.localSettings = localSettings;				
			overlay.setAttribute("id","boz_overlay_foreground");
			document.body.appendChild(overlay);

			if(localSettings.createBackground)
				boz.overlay_background();
			$$('#boz_overlay_foreground').first().observe('click', overlay.close);
		}
		return overlay;
	},
	
	scriptaculous : { 
		
		/******************************/
		dateWidget : function(settings){
			var defaults = {
				elementNextMonth: '.CalendarNext',
				elementLastMonth: '.CalendarPrevious',
				elementCaption: '.CalendarMonth',
				dateCellPrefix : '#bozCal_dateCell_',
				cssClassToday: 'DayToday',
				cssClassSelectedDay: 'DayAlert',
				cssClassActiveMonth: 'DayActive',
				cssClassInactiveMonth: 'DayInactive',
				targetPathPrefix : '/events',
				todaysDate:new Date(),
				targetPathSuffix:''
			};
			
			var localSettings = boz.array_merge(defaults, settings);
			
			var bozCal_date = new Date(localSettings.date.getFullYear(),localSettings.date.getMonth());
			var drawCal = function(localSettings){
				try{
				var m_names = new Array("Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec");

				$$(localSettings.elementCaption).first().update(m_names[bozCal_date.getMonth()] + " '" +bozCal_date.getFullYear().toString().substring(2,4));
				
				var bozCal_tempDate = new Date(bozCal_date.getTime());
				var bozCal_offset = (bozCal_tempDate.getDay()+6) % 7;
				var max_days = boz.days_in_month(bozCal_tempDate.getYear(), bozCal_tempDate.getMonth());
				bozCal_tempDate.setDate(bozCal_tempDate.getDate() - bozCal_offset);

				$A($R(0, 41)).each(function(i){
				try{
					
					$$(localSettings.dateCellPrefix+i).first().down().writeAttribute('href', localSettings.targetPathPrefix + '/' + bozCal_tempDate.getFullYear() + '/' + (bozCal_tempDate.getMonth()+1) + '/' + bozCal_tempDate.getDate() + localSettings.targetPathSuffix);
					$$(localSettings.dateCellPrefix+i).first().down().update(bozCal_tempDate.getDate());
					
					$$(localSettings.dateCellPrefix+i).first()
						.removeClassName(localSettings.cssClassActiveMonth)
						.removeClassName(localSettings.cssClassInactiveMonth)
						.removeClassName(localSettings.cssClassToday)
						.removeClassName(localSettings.cssClassSelectedDay);
					
					if(boz.is_same_day(bozCal_tempDate, localSettings.todaysDate))
						$$(localSettings.dateCellPrefix+i).first().addClassName(localSettings.cssClassToday);
						
					if(boz.is_same_day(bozCal_tempDate, localSettings.date))
						$$(localSettings.dateCellPrefix+i).first().addClassName(localSettings.cssClassSelectedDay);
					else if(bozCal_tempDate.getMonth() === bozCal_date.getMonth())
						$$(localSettings.dateCellPrefix+i).first().addClassName(localSettings.cssClassActiveMonth);
					else
						$$(localSettings.dateCellPrefix+i).first().addClassName(localSettings.cssClassInactiveMonth);

						
					bozCal_tempDate.setDate(bozCal_tempDate.getDate() + 1);
					}catch(ex){
						//console.log(ex);
					}

				});
				}catch(ex){
					//console.log(ex);
				}

			}
			drawCal(localSettings);
			$$(settings.elementLastMonth).first().localSettings = localSettings;
			$$(settings.elementLastMonth).first().observe('click', function(event){
				bozCal_date.setMonth(bozCal_date.getMonth()-1);
				drawCal(event.element().localSettings);
			});

			$$(settings.elementNextMonth).first().localSettings = localSettings;
			$$(settings.elementNextMonth).first().observe('click', function(event){
				bozCal_date.setMonth(bozCal_date.getMonth()+1);
				drawCal(event.element().localSettings);
			});			
		
		},	
	
		/*****************************/
		accordion : function(settings){
		
			var defaults = {
				selector:'.AccordionPanel',
				openSpeed : 1,
				closeSpeed : 1,
				initCloseSpeed : 0.0,
				autoOpen : 1
			};
			
			var localSettings = boz.array_merge(defaults, settings);

			var event_accordion= function(event){
				
				var curElement = event.element().next();
				//var curElement = Evetevent.findElement('h2').next();
				
				if(curElement.busy)
					return;
					
				if(curElement.isOpen)
				{
					curElement.busy=true;
					curElement.isOpen = false;
					Effect.BlindUp(curElement,{ duration: localSettings.openSpeed , afterFinish: function(){ curElement.busy=false; }});
					curElement.up().addClassName('AccordionPanelClosed').removeClassName('AccordionPanelOpen');
					return;
				}

				
				if(curElement.isOpen)
					return;
					
				curElement.busy = true;
				curElement.isOpen = true;

				Effect.BlindDown(curElement,{ duration: event.element().up().localSettings.openSpeed , afterFinish: function(){ curElement.busy=false; }});
				curElement.up().addClassName('AccordionPanelOpen').removeClassName('AccordionPanelClosed');
				
				$A( $$(event.element().up().localSettings.selector) ).each(function(ele){
				
					var remoteElement = ele.down(1);
					
					if(remoteElement.busy)
						return;
					
					//ele.removeClassName('AccordionPanelOpen').removeClassName('AccordionPanelClosed');
					ele.addClassName('AccordionPanelClosed').removeClassName('AccordionPanelOpen');
					remoteElement.busy=true;
				
					if(remoteElement != curElement){
						Effect.BlindUp( remoteElement , { duration: ele.localSettings.closeSpeed, afterFinish: function(){ remoteElement.busy=false; } });
						remoteElement.isOpen = false;
					}
						
				});				
			}

			$A( $$(localSettings.selector) ).each(function(ele){
				
				ele.localSettings = localSettings;
				
				
				if(!ele.select('.selected').length){
					Effect.BlindUp( ele.down(1) , { duration: localSettings.initCloseSpeed });
					ele.down(1).isOpen = false
					ele.addClassName('AccordionPanelClosed')
				}
				else{
					ele.down(1).isOpen = true;
					ele.addClassName('AccordionPanelOpen');
				}
					
				ele.down(0).observe('click', event_accordion );
				
			});
			/*$A( $$(localSettings.selector) ).each(function(ele){
				ele.localSettings = localSettings;
				Effect.BlindUp( ele.down(1) , { duration: localSettings.initCloseSpeed });
				ele.down(1).isOpen = false
				ele.addClassName('AccordionPanelClosed')
				ele.down(0).observe('click', event_accordion );
			});*/
		},
		
		tabbedContainer : function(settings){
		
			var defaults = {
				selector:'.TabbedPanels',
				fadein:0.25,
				fadeout:0.25
			};
			
			var localSettings = boz.array_merge(defaults, settings);

			$A($$(localSettings.selector)).each(function(e,i){
				
				e.localSettings = localSettings;
				
				var tabs = e.getElementsBySelector('.TabbedPanelsTab');
				var containers = e.getElementsBySelector('.TabbedPanelsContent');
				
				var cooldown = new Date();
				
				for(var j = 0; j < Math.min(tabs.length, containers.length); j++)
				{
					var tab = tabs[j];
					var container = containers[j];
					
					var selectTab = function(ev)
					{
						var e=ev.element();
						if(this.cooldown >= new Date().getTime()-(1000 * (e.localSettings.fadeout+e.localSettings.fadein)))
							return;
						this.cooldown.setTime(new Date().getTime());
					

						tabs.each(function(e,i){
							e.removeClassName('TabbedPanelsTabSelected');
							e.removeClassName('TabbedPanelsTabFocused');
						});
						var container = this.container;
						var localSettings = this.localSettings;
						this.containers.each(function(e,i){
							if(container!=e)
								e.fade({duration:localSettings.fadeout,queue: 'end'});
							//e.hide();
						});
						
						//this.container.show();
						this.container.appear({duration:this.localSettings.fadein,queue: 'end'});
						
						this.addClassName('TabbedPanelsTabSelected');
						this.addClassName('TabbedPanelsTabFocused');
					}
					
					var mouseoverTab = function(ev)
					{
						var e=ev.element();
						e.addClassName('TabbedPanelsTabHover')
					}
					
					var mouseoutTab = function(ev)
					{
						var e=ev.element();
						e.removeClassName('TabbedPanelsTabHover')
					}
					
					tab.localSettings = localSettings;
					tab.cooldown = cooldown;
					tab.tabs = tabs;
					tab.containers = containers;
					tab.container = container;
					tab.observe('click', selectTab);
					tab.observe('mouseover', mouseoverTab);
					tab.observe('mouseout', mouseoutTab);
					
					if(j===0)
					{
						tab.addClassName('TabbedPanelsTabSelected');
						tab.addClassName('TabbedPanelsTabFocused');
					}
					else
					{
						container.hide();
					}
				}
				
			});
		}

	},
	
	motionOn : function(e){ e = e.element ? e.element : e; e.inMotion=true; },
	motionOff : function(e){ e = e.element ? e.element : e; e.inMotion=false; },

	eventsSlider : function(settings){
		var defaults = {
			
			autoScroll:false,
			timedEventID:0,
			
			left : function(){
				var test = parseInt($($$(this.sliderTarget)[0]).getStyle('margin-left')); 
				return isNaN(test) ? 0 : test ; 
			},
			
			itemsToMove:3,
			
			lastFuncStartMove : function(ev){
				Event.stop(ev);
				if(this.localSettings.inMotion()) return;
				$$(this.localSettings.sliderTarget).each(this.localSettings.motionOn);
				if(this.localSettings.left()>=0){
					var myMotionOff = this.localSettings.motionOff;

					var moveBy = ($($$(this.localSettings.sliderTarget)[0]).childElements().length*this.localSettings.singleEventWidth) - 
						(this.localSettings.singleEventWidth * this.localSettings.itemsToMove);
					var myEffect = this.localSettings.effect;
					$($$(this.localSettings.sliderTarget)[0]).fade({ 
						duration: 0.5,
						from: 1, to: 0,
						afterFinish:function(e)
						{

							$(e.element).morph(
								'margin-left:' + (-moveBy) + 'px',
								{
									afterFinish:function(e){
										myMotionOff(e.element);
										$(e.element).appear({ 
											duration: 0.5,

											from: 0, to: 1,
											afterFinish:function(){	
											}

										})
									},
									duration: 0,
									transition: myEffect 
								}
							)
						}
					});
					return false;
				}
				try{ 
					/*$($$(this.localSettings.sliderTarget)[0]).morph(
						'margin-left:' + (this.localSettings.left()+(this.localSettings.singleEventWidth*this.localSettings.itemsToMove)) + 'px',
						{
							afterFinish:this.localSettings.motionOff,
							duration: 1.0,
							transition: this.localSettings.effect 
						}
					);*/
					var myMotionOff = this.localSettings.motionOff;
					var moveBy = (this.localSettings.left()+(this.localSettings.singleEventWidth*this.localSettings.itemsToMove));
					var myEffect = this.localSettings.effect;
					$($$(this.localSettings.sliderTarget)[0]).fade({ 
						duration: 0.5,
						from: 1, to: 0,
						afterFinish:function(e)
						{

							$(e.element).morph(
								'margin-left:' + moveBy + 'px',
								{
									afterFinish:function(e){


										myMotionOff(e.element);
										$(e.element).appear({ 
											duration: 0.5,
											from: 0, to: 1,
											afterFinish:function(){	

											}
										})
									},
									duration: 0,
									transition: myEffect 
								}
							)
						}
					});
				}
				catch(e){ 

				}
			},

			nextFuncStartMove : function(ev){
				Event.stop(ev);
				if(this.localSettings.inMotion()) return;
				$$(this.localSettings.sliderTarget).each(this.localSettings.motionOn);
				if(
					Math.abs(this.localSettings.left())>=
						($($$(this.localSettings.sliderTarget)[0]).childElements().length*this.localSettings.singleEventWidth) - 
						(this.localSettings.singleEventWidth * this.localSettings.itemsToMove)
				) {
					if(ev.eventName = "click:DOM"){
						// Reset if auto'ed at end.


						/*$($$(this.localSettings.sliderTarget)[0]).morph(
							'margin-left:0px',
							{
								afterFinish:this.localSettings.motionOff,
								duration: 2.5,
								transition: this.localSettings.effect 
							}

						);*/
						var myMotionOff = this.localSettings.motionOff;
						var moveBy = (this.localSettings.left()-(this.localSettings.singleEventWidth*this.localSettings.itemsToMove));
						var myEffect = this.localSettings.effect;
						
						$($$(this.localSettings.sliderTarget)[0]).fade({ 
							duration: 0.5,
							from: 1, to: 0,
							afterFinish:function(e)
							{
								$(e.element).morph(
									'margin-left:0px',
									{
										afterFinish:function(e){
											myMotionOff(e.element);
											$(e.element).appear({ 
												duration: 0.5,
												from: 0, to: 1,
												afterFinish:function(){	
												}
											})
										},
										duration: 0,
										transition: myEffect 
									}
								)
							}
						});
						
						 
						
					}
					else{
						// Shake if you pressed it
						$($$(this.localSettings.sliderTarget)[0]).morph(
							//'margin-left:-15px',
							'margin-left:' + (this.localSettings.left()+(15)) + 'px',
							{
								afterFinish:this.localSettings.motionOff,
								duration: 1.0,
								transition: this.localSettings.shake
							}
						);
					}
					return;
				}
				try{
					/*$($$(this.localSettings.sliderTarget)[0]).morph(
						'margin-left:' + (this.localSettings.left()-(this.localSettings.singleEventWidth*this.localSettings.itemsToMove)) + 'px',
						{
							afterFinish:this.localSettings.motionOff,
							duration: 1.0,
							transition: this.localSettings.effect 
						}
					);*/
					
					var myMotionOff = this.localSettings.motionOff;
					var moveBy = (this.localSettings.left()-(this.localSettings.singleEventWidth*this.localSettings.itemsToMove));
					var myEffect = this.localSettings.effect;
					
										$($$(this.localSettings.sliderTarget)[0]).fade({ 
						duration: 0.5,
						from: 1, to: 0,
						afterFinish:function(e)
						{

							$(e.element).morph(
								'margin-left:' + moveBy + 'px',
								{
									afterFinish:function(e){


										myMotionOff(e.element);
										$(e.element).appear({ 
											duration: 0.5,
											from: 0, to: 1,
											afterFinish:function(){	

											}
										})
									},
									duration: 0,
									transition: myEffect 
								}
							)
						}
					});
				}
				catch(e){ 
					alert(e); 
				}
			},
			
			//effect : function(pos){ return (pos-=1)*pos*((1.70158+1)*pos + 1.70158) + 1; },
			effect : function(pos){ return Math.sin((pos*Math.PI)/2); },
			shake : function(pos){ 	return Math.sin((pos*Math.PI))*2*Math.sin((pos*Math.PI*7)); },

			//THIS SHOULD BE CALLED FROM FROM THE OBJECT, NOT AS AN EVENT, this. MUST BE THIS LITTERAL OBJECT//
			inMotion : function(){ 
				return $($$(this.sliderTarget)[0]).inMotion; 
			},
			//motionOffInternal : function(){ $($$(this.sliderTarget)[0]).inMotion = false; },
			
			motionOn : function(e){ e = e.element ? e.element : e; e.inMotion=true; },
			motionOff : function(e){ e = e.element ? e.element : e; e.inMotion=false; },
			
			nextOverride: false,
			lastOverride: false,
			
			decorate : function(lastAnchor, nextAnchor, lastImg, nextImg){
				lastImg.writeAttribute('src','images/buttons/Previous-Button.jpg');
				lastImg.addClassName('FloatLeft');
				lastImg.writeAttribute('alt','Click here for the previous feature');
				lastImg.setStyle({ width: '45px', height: '13px' });
	
				nextImg.writeAttribute('src','images/buttons/Next-Button.jpg');
				nextImg.addClassName('FloatRight');
				nextImg.writeAttribute('alt','Click here for the next feature');
				nextImg.setStyle({ width: '43px', height: '13px' });
				
				lastAnchor.writeAttribute('href','javascript:void(0);');
				//lastAmchor.addClassName('');
				
				nextAnchor.writeAttribute('href','javascript:void(0);');
				//lastAmchor.addClassName('');
			
			},

			sliderTarget:'#EventsItems',
			controlTarget:'.Buttons',
			singleEventWidth : 229
		};
		
		var localSettings = boz.array_merge(defaults, settings);

		if(localSettings.controlTarget){
			$($$(localSettings.controlTarget)[0]).localSettings = localSettings;
			$$(localSettings.controlTarget + ' > *').each(Element.remove);
		}
		$$(localSettings.sliderTarget).each(localSettings.motionOff);
		
		var lastAnchor = 	Element.extend(document.createElement('a'));
		var lastImg = 		Element.extend(document.createElement('img'));
		lastAnchor.appendChild(lastImg);
		
		var nextAnchor = 	Element.extend(document.createElement('a'));
		var nextImg = 		Element.extend(document.createElement('img'));
		nextAnchor.appendChild(nextImg);

		if(localSettings.lastOverride)
			lastAnchor = localSettings.lastOverride;
		if(localSettings.nextOverride)
			nextAnchor = localSettings.nextOverride;
		
		nextAnchor.observe('click',			localSettings.nextFuncStartMove);
		lastAnchor.observe('click',			localSettings.lastFuncStartMove);
		
		nextAnchor.observe('click:DOM',			localSettings.nextFuncStartMove);
		lastAnchor.observe('click:DOM',			localSettings.lastFuncStartMove);
				
		nextAnchor.observe('click',	function(){ clearTimeout(localSettings.timedEventID); });
		lastAnchor.observe('click',	function(){ clearTimeout(localSettings.timedEventID); });

		lastAnchor.localSettings=localSettings;
		nextAnchor.localSettings=localSettings;
		
		localSettings.decorate(lastAnchor, nextAnchor, lastImg, nextImg);
		
		//$$(localSettings.controlTarget).each(function(e){Element.insert(e,lastAnchor);});
		//$$(localSettings.controlTarget).each(function(e){Element.insert(e,nextAnchor);});
		
		$$(localSettings.controlTarget).each(function(e){e.appendChild(lastAnchor);});
		$$(localSettings.controlTarget).each(function(e){e.appendChild(nextAnchor);});

		if(localSettings.autoScroll){
			localSettings.timedEventID = setInterval(function(){ 
				try{
					$(nextAnchor).fire('click:DOM') ;
				}catch(ex){}
			},4000);
		}
	},
	
	BuildGalleryList:function(settings){
		defaults = {
			perPage:9,
			galleryTarget:$$('.GalleryTab .WidgetSubCat ul'),
			data:null,
			currentPage:0,
			hideNextGallery : function(){},
			showNextGallery : function(){},
			hidePrevGallery : function(){},
			showPrevGallery : function(){},
			decorate:function(e){
				
			},
			validate:function(){
				if(this.currentPage<0)
					this.currentPage=0;
				else if(this.currentPage>Math.floor(this.data.length/this.perPage))
					this.currentPage=Math.floor(this.data.length/this.perPage);
					
				if(this.currentPage==0)
					this.hidePrevGallery();
				else
					this.showPrevGallery();

				if(this.currentPage==Math.floor(this.data.length/this.perPage))
					this.hideNextGallery();
				else
					this.showNextGallery();
			},
			drawGalleryList:function(){
				this.validate();
				conf = this;
				this.galleryTarget.each(function(e,i){
					e.update();
					var startIndex = conf.perPage * conf.currentPage;
					var endIndex = Math.min(startIndex+conf.perPage,conf.data.length);
					for(var i=startIndex; i<endIndex; i++){
						var a = document.createElement('a');
						a.innerHTML = conf.data[i].title;
						$(a).addClassName('changeGallery');
						$(a).writeAttribute('href',conf.data[i].uid);
						conf.decorate(a);
						var li = document.createElement('li');
						li.appendChild(a);
						e.appendChild(li);
					}
				});
			}
		};
		
		var localSettings = boz.array_merge(defaults, settings);
		
		localSettings.drawGalleryList();
		
		return localSettings;
	},
	
	BuildGallery:function(settings){
		
		defaults = {
				thumbTargets : $$('#gallery > ul > li'),
				gallery_uid : 1,
				displayTarget : $$('#GalleryWidget > img'),
				titleTarget : $$('#gallery > .image > .info > h3'),
				data : null,
				page:0,
				selectedIndex:-1,
				thumbsPage:0,
				targetSize:'venueHomePage',
				
				hideNextThumbs : function(){},
				showNextThumbs : function(){},
				hidePrevThumbs : function(){},
				showPrevThumbs : function(){},
				
				hideNextImage : function(){},
				showNextImage : function(){},
				hidePrevImage : function(){},
				showPrevImage : function(){},
				
				thumbsPerPage:function(){
					return this.thumbTargets.length;
				},
				thumbsPageMax:function(){
					return Math.ceil(this.data.length / this.thumbsPerPage()) - 1;
				},
				validate:function(){
					//img 
					if(this.data.length<=this.selectedIndex)
						this.selectedIndex = this.data.length-1;
					else if(this.selectedIndex < 0)
						this.selectedIndex = 0;
					
					if(this.data.length-1==this.selectedIndex)
						this.hideNextImage();
					else this.showNextImage();
					
					if(this.selectedIndex == 0)
						this.hidePrevImage();
					else this.showPrevImage();
					
					// thumb
					if(this.thumbsPage<0) this.thumbsPage = 0;
					else if(this.thumbsPage>this.thumbsPageMax())
						this.thumbsPage = this.thumbsPageMax();
					
					if(this.thumbsPage==0) this.hidePrevThumbs();
					else this.showPrevThumbs();
						
					if(this.thumbsPage == this.thumbsPageMax()) this.hideNextThumbs();
					else this.showNextThumbs();
					
				},
				setData:function(transport){
					this.data = transport.responseText.evalJSON(true);
					this.drawThumbs();
					this.drawPicture();
				},
				drawThumbs: function(){
					this.validate();
					var settings = this;
					this.thumbTargets.each(function(el,i){
						i += (settings.thumbsPage*settings.thumbsPerPage());
						el.stopObserving();
							
						if(i>=settings.data.length){ 						
							el.writeAttribute({src:'/images/placeholder.gif'});	
							return;
						}
						
						//alert(el.tagName);

						el.fade({
							duration:0.2, 
							queue: { position: 'end', scope: 'galleryQueue'+i },
							afterFinish :	function(){
								el.observe('load',function(){ 
									el.appear({duration:0.2, queue: { position: 'end', scope: 'galleryQueue'+i }});
								});
								el.observe('click',function(event){
									event.stop();
									settings.selectedIndex=i;
									settings.drawPicture();
								});
								el.writeAttribute({src:settings.data[i].GalleryThumb});
								el.up().writeAttribute({href:settings.data[i].GalleryImage});
							}
						});
					});
				},
				lastSelectedIndex:-1,
				drawPicture: function(){
					var atPre = this.selectedIndex;
					this.validate();
					var atPost = this.selectedIndex;
					if(atPre!=atPost || this.lastSelectedIndex == this.selectedIndex) return;
					this.lastSelectedIndex = this.selectedIndex;
					var settings = this;
					this.displayTarget.each(function(el,i){
						el.fade({
							duration:0.2, 
							queue: { position: 'end', scope: 'galleryQueue' },
							afterFinish :	function(){
								el.writeAttribute({src:settings.data[settings.selectedIndex].GalleryImage});
							}
						});
						
					});
					settings.titleTarget.each(function(el,i){
						el.update(settings.data[settings.selectedIndex].label);
					});
				}
		};
		
		var localSettings = boz.array_merge(defaults, settings);
		
		localSettings.displayTarget.each(function(el,i){
			el.stopObserving();
			el.observe('load',function(){ 
				el.writeAttribute('width',false);
				el.appear({duration:0.2, queue: { position: 'end', scope: 'galleryQueue' }});
			});
		});

		
		new Ajax.Request('http://www.drinkinbrighton.co.uk/ajax/vendor-gallery.php?gallery='+localSettings.gallery_uid+'&size='+localSettings.targetSize, {
			method:'get',
			onSuccess: function(transport){ 
				localSettings.setData(transport); 
			}
		});
		return localSettings;

		
	},
	
	BuildTabbedContainer: function(settings){
		
		defaults = {
			tabs: $$('.TabHandle'),
			containers: $$('.WidgetTab'),
			activeTab:'Selected',
			tabSelectedCallback:function(index){}
		};
		
		var localSettings = boz.array_merge(defaults, settings);

		//if(localSettings.tabs.length!=localSettings.containers.length) console.log('BuildTabbedContainer: tabs / containers count missmatch. Assure there are the same number of each. '+localSettings.tabs.length+','+localSettings.containers.length);
		
		localSettings.containers.each(function(e,i){
			if(i) e.hide();
		})
		
		localSettings.tabs.each(function(e,i){
			var targetContainer = localSettings.containers[i];
			e.observe('click',function(event){
				event.stop();
				localSettings.tabs.each(function(e2,i2){
					if(i==i2) e2.addClassName(localSettings.activeTab);
					else e2.removeClassName(localSettings.activeTab);
				});

				localSettings.containers.each(function(e2,i2){
					if(i!=i2) e2.hide();
				});
				targetContainer.show();
				localSettings.tabSelectedCallback(i);
			});
			e.observe('boz:click',function(event){
				event.stop();
				localSettings.tabs.each(function(e2,i2){
					if(i==i2) e2.addClassName(localSettings.activeTab);
					else e2.removeClassName(localSettings.activeTab);
				});

				localSettings.containers.each(function(e2,i2){
					if(i==i2) return;
					e2.hide();
				});
				targetContainer.show();
				localSettings.tabSelectedCallback(i);
			});
		});
		
		return localSettings;
	},
	
	LinkifyString : function(inputText) {
		var replacedText = inputText.replace(/(\b(https?|ftp):\/\/[-A-Z0-9+&@#\/%?=~_|!:,.;]*[-A-Z0-9+&@#\/%=~_|])/gim, '<a href="$1" rel="nofollow" target="_blank">$1</a>');
		var replacedText = replacedText.replace(/(^|[^\/])(www\.[\S]+(\b|$))/gim, '$1<a href="http://$2" rel="nofollow" target="_blank">$2</a>');
		var replacedText = replacedText.replace(/(\w+@[a-zA-Z_]+?\.[a-zA-Z]{2,6})/gim, '<a href="mailto:$1" rel="nofollow">$1</a>');
		return replacedText;
	},
	
	TwitterIDStore : -1,

	DrawTwitter : function (data){
		 
		data.each(function(message,index){

			var s = message.created_at;
			var date = new Date(s.replace(/^\w+ (\w+) (\d+) ([\d:]+) \+0000 (\d+)$/,"$1 $2 $4 $3 UTC"));	

			var day = (date.getDate());
			day = day < 10 ? '0'+day : day;
			
			var month = (date.getMonth()+1);
			month = month < 10 ? '0'+month : month;
			
			var year = ''+date.getUTCFullYear();
			year = year.substring(2,4);
			
			
			date = day+'/'+month+'/'+year + ' @ ' + date.getHours() + ':' + date.getMinutes();
			
			if(index>=2) return;
			$$('.TweetPadding').each(function(e,i){
				e.insert(
					'<div class="TweetItem">' +
						'<p class="TwitterText">'+
						( message.user.id!=277402015 ?'<span class="TwitterName">'+message.user.name+'</span>' : '')+
						' '+boz.LinkifyString(message.text)+'</p>' +
						'<span class="TweetTime">'+date+/*' via '+message.source+*/'</span>' +
						'<a rel="nofollow" target="_blank" class="TwitterReply" href="http://twitter.com/?status=' + 
							boz.TwitterIDStore +
							'%20&in_reply_to_status_id=' +
							message.id +
							'&in_reply_to=' +
							boz.TwitterIDStore +
							'">reply' +
						'</a>' +
					'</div>'
				);
			});
		});
	},
	
	BuildTwitter: function(settings){
		var defaults = {
			twitterId: 171132009
		};
		
		
		var localSettings = boz.array_merge(defaults, settings);
		
		boz.TwitterIDStore = localSettings.twitterId;
		
		var url = "https://twitter.com/statuses/user_timeline/"+localSettings.twitterId+".json?callback=boz.DrawTwitter";

		var script = $(document.createElement('script'));
		script.writeAttribute({src:url,type:"text/javascript"});
		$$('.TweetPadding').each(function(e,i){ e.insert(script); });

		//return localSettings;
	},
	
	DrawModalBox : function(href)
	{
	
		new Ajax.Request(href, {
			method:'get',
			onSuccess: function(transport){ 
				try{
					$('modalBackground').remove();
				}
				catch(ex){}
				$(document.body).insert(
					{
						after:'<div id="modalBackground"><div id="modalContent">'+transport.responseText+'</div></div>'
					}
				);
				
				var height = $('modalContent').getHeight();
				//var width = $('modalContent').getWidth();
				var width = '236';
				
				var marginLeft = -(width/2);
				var marginTop = -(height/2);
				
				$('modalContent').setStyle({
					'display':'block',
					'width':width+'px',
					'height':height+'px',
					'marginLeft':marginLeft+'px',
					'marginTop':marginTop+'px'
				});
				
				$('modalBackground').observe('click',function(ev){
					if(ev.element()==$('modalBackground'))
						$('modalBackground').remove();
				});
				
				$$('#modalContent form').each(function(ele){
					ele.observe('submit',function(ev){
						ev.stop();
						ele.request({
							onComplete:function(transport)
							{
								$$('#modalContent *').invoke('remove');
								$('modalContent').insert(transport.responseText);
							}
						});
						return false;
					});
				});
				
			}
		});
	
		
	}
	
}

