var pageOptions = {};
var accordionOptions = {};
if (typeof window.HOST === 'undefined') { var HOST = window.location.hostname; }
if (typeof window.PATH === 'undefined') { var PATH = location.protocol + '//' + HOST; }
if (typeof window.CDN_PATH === 'undefined') { var CDN_PATH = location.protocol + '//cdn.boatus.com/'; }
if (typeof window.API_PATH === 'undefined') { var API_PATH = PATH + '/API/2.0/'; }
if (typeof window.PUBLIC_API_KEY === 'undefined') { var PUBLIC_API_KEY = 'ABCDEF12345'; }
if (typeof window.FB_APP_ID === 'undefined') { var FB_APP_ID = ''; }

// Create the Global BoatUS object.
var BoatUS = {
	version: '0.1',
	optsDefaults: {
		debug: false,		// Set to false in production environments.
		ads: {
			disableAds: false,
			personalizeAds: true
		},
		Overlay: {
			fixedWidth: true,
			destroyOnUnload: false
		},
		social: false,
		socialOpts: {
			title: $('title:first').html() || "BoatUS",
			description: $("meta[name~='description']").attr("content") || "",
			url: location.href,
			FB: true,
			TW: true,
			GP: false,
			DG: true,
			SU: true,
			EM: true,
			caller: '',
			extras: {}
		},
		UI: {
			tabs: {
				save: true,					// Should the most recent tab be saved?
				selected: 1,				// 1-based index of the tab to select by default.
				onChange: null,				// Callback function for the change event.
				onCreate: null				// Callback for after the tabs have been created.
			},
			text: {
				startSize: 0,
				curSize: 0,
				defTarget: '#content',
				minSize: -2,
				maxSize: 5
			}
		}
	},
	Options: {},
	pageReady: false,
	Queue: {
		data: [],
		addToQueue: function(fn)
		{
			// Add the ability to queue up events before the page has loaded.
			if (typeof fn !== "function") { return; }
			this.data.push(fn);
			BoatUS.log("Method called before page ready: ");
			BoatUS.log(fn);
		},
		fireQueue: function()
		{
			// Loop through all the events in the queue once an event has passed.
			var i;
			for (i = 0, l = this.data.length; i < l; i++)
			{
				this.data[i]();
			}
		}
	},
	Events: {},
	EventLog: [],		// An array to hold the index of all the event objects.
	// Initialize everything.
	init: function(opts) {
		BoatUS.Options = $.extend({}, BoatUS.optsDefaults, opts);
		BoatUS.log(BoatUS.Options);
		if (typeof(JSON) !== 'object') { BoatUS.require_once('/assets/js/json.js'); }
		this.pageReady = true;
		this.Queue.fireQueue();
		var initAds = function() { BoatUS.Ads.init(); };
		this.adLoadTimeout = setTimeout(initAds, 3000);
		if (BoatUS.Options.social === true) { this.Social.loadFBAPI(); }
		// Bootstrap the page.
		this.Member.init();
		this.Browser.init();
		this.Overlay.init();
	},
	// Adds the ability to create a popup window.
	Popup: function(strURL, strName, objOpts) {
		objOpts = objOpts || {};
		strOpts = [];
		if (objOpts.status) { strOpts.push('status=1'); } else { strOpts.push('status=0'); }
		if (objOpts.toolbar) { strOpts.push('toolbar=1'); } else { strOpts.push('toolbar=0'); }
		if (objOpts.location) { strOpts.push('location=1'); } else { strOpts.push('location=0'); }
		if (objOpts.resizeable) { strOpts.push('resizeable=1'); } else { strOpts.push('resizeable=0'); }
		if (objOpts.scrollbars) { strOpts.push('scrollbars=1'); } else { strOpts.push('scrollbars=0'); }
		if (objOpts.height !== '') { strOpts.push('height=' + parseInt(objOpts.height, 10)); } else { strOpts.push('height=250'); }
		if (objOpts.width !== '') { strOpts.push('width=' + parseInt(objOpts.width, 10)); } else { strOpts.push('width=350'); }
		return window.open(strURL, strName, strOpts.join(','));
	},
	
	// Adds the ability to create dynamically loading overlays.
	Overlay: {
		init: function()
		{
			this.createDOM();
		},
		initialized: false,
		overlay: function(ovID, ovPath, ovOpts)
		{
			this.ID = ovID;
			this.div = null;
			this.path = ovPath;
			this.opts = $.extend({}, BoatUS.Options.Overlay, ovOpts);
			
			this.onLoad = function(e)
			{
				BoatUS.Overlay.curOverlay = this;
				if (typeof window[this.ID + '_load'] == 'function') window[this.ID + '_load'](e);
			};
			
			this.onOpen = function(e)
			{
				BoatUS.Overlay.curOverlay = this;
				this.position();
				if (typeof window[this.ID + '_open'] == 'function') window[this.ID + '_open'](e);
			};
			
			this.onClose = function(e)
			{
				if (typeof window[this.ID + '_close'] == 'function') window[this.ID + '_close'](e);
				if (this.opts.destroyOnUnload === true) this.destroy();
			};
			
			this.onDestroy = function()
			{
				if (typeof window[this.ID + '_destroy'] == 'function') window[this.ID + '_destroy'](e);
				try
				{
					if (typeof window[this.ID + '_load'] == 'function') window[this.ID + '_load'] = null;
					if (typeof window[this.ID + '_open'] == 'function') window[this.ID + '_open'] = null;
					if (typeof window[this.ID + '_close'] == 'function') window[this.ID + '_close'] = null;
					if (typeof window[this.ID + '_destroy'] == 'function') window[this.ID + '_destroy'] = null;
				}
				catch (ex)
				{
					
				}
			};
			
			this.position = function()
			{
				$(BoatUS.Overlay.overlayDiv).center(window);
			};
			
			this.load = function()
			{
				BoatUS.log('Load Overlay');
				if (BoatUS.Overlay.overlays[this.ID] == null) {
					BoatUS.Overlay.registerOverlay(id, PATH + '/assets/overlay/' + this.ID + '.asp');
				} else {
					this.opts = $.extend({}, this.opts, BoatUS.Overlay.overlays[this.ID].opts);
				}
				var overlayLoadPath = this.path;
				BoatUS.log('Overlay Path: ' + overlayLoadPath);
				var me = this;
				var onHTMLLoaded = function(c, t, s, x, m_opts)
				{
					if(x.status !== 200)
					{
						c = $('<div style="top: 312px; left: 356px;" class="content_container" id="' + this.ID + '"><div onclick="BoatUS.closeOverlay(\'' + this.ID + '\');return false;" class="overlay_close" title="Click to Close"></div><div class="overlay_bdy"><h3>Error</h3></div><p>There was a problem loading the desired content. Please try again later.</p><div class="clear"></div></div>');
					}
					$('.overlay_bdy', BoatUS.Overlay.overlayDiv).empty().append(c.show());
					$(BoatUS.Overlay.overlayDiv).show();
					me.position();
					me.onOpen({ opts: m_opts });
				};
				
				var o_html = '';
				if (!this.opts.params) this.opts.params = {};
				this.opts.params._r = BoatUS.randomString(5);		// Prevent caching.
				
				o_html += '<div style="top: 312px; left: 356px;" class="content_container" id="' + this.ID + '"><div onclick="BoatUS.Overlay.closeOverlay();return false;" class="overlay_close" title="Click to Close"></div><div class="overlay_bdy"><h3>Loading...</h3></div><div class="clear"></div></div>';
				$(BoatUS.Overlay.overlayDiv).html(o_html);
				$(BoatUS.Overlay.overlayDiv).show();
				if ($('#boatus_overlayContent_' + this.ID).length === 0)
				{
					BoatUS.log('Load It!');
					this.div = $('<div />', { id: 'boatus_overlayContent_' + this.ID }).appendTo(BoatUS.Overlay.overlayContainerDiv).hide();
					this.div.load(overlayLoadPath, this.opts.params, function(t, s, x) {
						// If the call failed, remove and destroy the new overlay content container so we can try again.
						if (x.status !== 200)
						{
							me.div.detach();
						} else {
							// On the first open, fire the Load event.
							me.onLoad({ opts: me.opts });
						}
						onHTMLLoaded(me.div, t, s, x, me.opts);
					});
				} else {
					BoatUS.log('Already Exists');
					this.div = $('#boatus_overlayContent_' + this.ID);
					onHTMLLoaded(this.div, null, null, { status: 200 });
					// On subsequent opens, fire the Open event.
					this.onOpen({opts: this.opts });
				}
			};
			
			this.show = function(opts)
			{
				BoatUS.log(opts);
				if (opts) this.opts = opts;
				BoatUS.Overlay.dimmerDiv.show();
				if (this.opts.fixedWidth !== false) { BoatUS.Overlay.overlayDiv.css('width', '600px'); }
				this.load();
			};
			
			this.hide = function()
			{
				BoatUS.Overlay.dimmerDiv.hide();
				BoatUS.Overlay.overlayDiv.find('.overlay_bdy').children('div').detach().appendTo(BoatUS.Overlay.overlayContainerDiv);
				BoatUS.Overlay.overlayDiv.hide();
				this.onClose();
				if (this.opts.destroyOnUnload) this.destroy();
			};
			
			this.destroy = function()
			{
				BoatUS.Overlay.dimmerDiv.hide();
				this.div.remove();
				BoatUS.Overlay.overlayDiv.hide();
				this.onDestroy();
			};
		},
		curOverlay: null,		// A reference to the currently visible overlay.
		overlays: {},			// A hash map storing all of the overlays.
		dimmerDiv: null,			// This holds the dimmer.
		overlayDiv: null,			// This holds the currently visible overlay.
		overlayContainerDiv: null,	// This holds all the loaded overlays.
		registerOverlay: function(ovID, ovPath, opts)
		{
			if (BoatUS.Overlay.overlays[ovID]) return;
			BoatUS.Overlay.overlays[ovID] = new BoatUS.Overlay.overlay(ovID, ovPath, opts);
		},
		destroyOverlay: function(ovID)
		{
			
		},
		createDOM: function()
		{
			if (this.initialized) return false;
			this.overlayContainerDiv = $('<div />', { 'id': 'boatus_overlay_container', css: { 'display': 'none' }}).appendTo('body');
			this.dimmerDiv = $('<div />', { 'id': 'boatus_overlayDimmer', css: { 'background-color': '#000', 'position': 'fixed', 'z-index': 102003403, 'top': 0, 'left': 0, 'right': 0, 'bottom': 0, 'opacity': 0.5, 'display': 'none' }}).appendTo('body').click(function() { BoatUS.Overlay.closeOverlay(); });
			this.overlayDiv = $('<div />', { 'id': 'boatus_overlay', css: { 'background-color': '#FFF', 'z-index': 102003408, 'display': 'none' }}).appendTo('body');
			this.initialized = true;
		},
		closeOverlay: function()
		{
			this.curOverlay.hide();
			this.curOverlay = null;
		}
	},
	
	handleOverlay: function(strOVName, objOpts)
	{
		if (typeof BoatUS.Overlay.overlays[strOVName] == 'undefined') {
			BoatUS.Overlay.registerOverlay(strOVName, PATH + '/assets/overlay/' + strOVName + '.asp');
		}
		BoatUS.Overlay.overlays[strOVName].show(objOpts);
	},
	
	closeOverlay: function()
	{
		BoatUS.Overlay.closeOverlay();
	},
	
	// The Member object allows us to store and access information pertaining to the member if they are logged in to my.boatus.com.
	Member: {
		loggedIn: false,
		info: {
			memberNumber: 0,
			lastVisit: new Date(),
			realName: {
				first: '',
				last: ''
			},
			emailAddress: '',
			zipCode: '',
			hasTowing: false,
			hasInsurance: false
		},
		optInAdPersonalization: false,	// Allows us to turn off personalized ads.
		init: function()
		{
			// Load up information about the current user from the API. Once that information is loaded, we can use that information on the page.
			// In production, this information would be obtained from the services API, and then returned as a JSON object.
			//this.onDataLoaded({ loggedIn: true, realName: { first: 'Andrew' }, boatType: 'power'})
		},
		getAdMember: function()
		{
			// Return an object containing certain data that we can use to personalize ads.
			if (! this.optInAdPersonalization) { return { memberNumber: 0, towing: false, insurance: false }; }
			return { memberNumber: this.info.memberNumber, towing: this.info.hasTowing, insurance: this.info.hasInsurance };
		},
		onDataLoaded: function(r)
		{
			// Data has returned from the API.
			clearTimeout(BoatUS.adLoadTimeout);
			BoatUS.Ads.init();
			var v;
			for (v in r) {
				if (typeof this.info[v] !== 'function') { this.info[v] = r[v]; }	// Copy all of the response variables in, but don't overwrite functions.
			}
			// This code could turn the log in to my.boatus.com link into a goto boatus.com link if they are logged in.
			if (this.loggedIn) {
				$('.myBoatUSLogin').attr('onclick', '').attr('href', 'http://my.boatus.com/memberpage.asp').html('Go To my.BoatUS.com');
			}
			BoatUS.triggerEvent('Member.Load', { member: this.info.memberNumber });
		}
	},
	
	// The BoatUS Ads object allows us to embed advertising in the page in a non-blocking way.
	Ads :{
		adZones: [],
		initialized: false,
		strAdZoneSelector: 'busa',
		init: function()
		{
			if (this.initialized === true || BoatUS.Options.ads.disableAds === true) { return; }	// Make sure that we only initialize the advertising object once.
			this.initialized = true;



			$('.' + this.strAdZoneSelector).each(function(i){
				BoatUS.Ads.adZones.push($(this).attr('id'));
			});
			// IE gives errors if the API is on a different domain, so disable it.
			//$.post(API_PATH, { zones: BoatUS.Ads.adZones, member: BoatUS.Member.getAdMember() }, function(d,s,x) { BoatUS.Ads.onDataLoaded(d, s, x); });
		},
		onDataLoaded: function(d, s, x)
		{
			// The ad information has been retrieved from the server, lets do something with it.
			BoatUS.triggerEvent('Ads.Load', { });
		},
		renderImageAd: function(ad)
		{
			// Generate an image ad on the page.
		},
		renderFlashAd: function(ad)
		{
			// Generate a swf ad on the page.
		},
		renderTextAd: function(ad)
		{
			// Generate a text ad on the page.
		}
	},
	
	SWF: {
		expressInstallSwfUrl: '/assets/swf/expressInstall.swf',
		videos: {},
		styles: {
			playButton_Default: 'videoPreviewButton',
			playButton_Hover: ''
		},
		videoPlayerSwfUrl: 'http://www.boatus.com/membership/latitudes.swf',
		flashPlayerVersion: '9.0.0',
		flashVarDefs: {},
		flashParamDefs: {
			menu: 'false',
			quality: 'high',
			scale: 'noscale',
			loop: 'false',
			wmode: 'transparent',
			allowScriptAccess: 'sameDomain'
		},
		flashAttrDefaults: {},
		embed: function(swfUrl, id, width, height, flashvars, params, attributes, callbackFn)
		{
			params = $.extend({}, this.flashParamDefs, params);
			flashvars = $.extend({}, this.flashVarDefs, flashvars);
			if (!BoatUS.pageReady) {
				BoatUS.Queue.addToQueue(function() {
					BoatUS.SWF.embed(swfUrl, id, width, height, flashvars, params, attributes, callbackFn);
				});
				return;
			}
			var targetDiv = $('#' + id);
			//BoatUS.require_once('/assets/js/swfobject/swfobject.js');
			swfobject.embedSWF(swfUrl, id, width, height, BoatUS.SWF.flashPlayerVersion, this.expressInstallSwfUrl, flashvars, params, attributes, callbackFn);
			BoatUS.triggerEvent("SWF.Load", { swf: swfUrl });
		},
		// Embed a video with a preview frame in it.
		embedVideo: function(id, width, height, videoSrc, firstFrameSrc, flashVars, params, attributes)
		{
			params = $.extend({}, this.flashParamDefs, params);
			if (!BoatUS.pageReady) {
				BoatUS.Queue.addToQueue(function() {
					BoatUS.SWF.embedVideo(id, width, height, videoSrc, firstFrameSrc, flashVars, params, attributes);
				});
				return;
			}
			//BoatUS.require_once('/assets/js/swfobject/swfobject.js');
			var videoID = BoatUS.uniqueID();
			this.videos[videoID] = { src: videoSrc, firstFrame: firstFrameSrc, id: id, width: width, height: height, flashVars: flashVars, params: params, attributes: attributes };
			var targetDiv = $('#' + id).css('position', 'relative');
			targetDiv.empty();
			//	create a holder div to load the preview into.
			var embedDiv = $('<div/>', { css: { width: width, height: height, margin: '0 0 8px 0' } }).addClass('videoEmbed').appendTo(targetDiv);
			var thumbLink = $('<a/>', { css: { position: 'absolute', height: height, width: width }, title: 'Click to Play Video', href: '#', click: function() { BoatUS.SWF.playVideo(videoID); return false; } }).addClass('noHover').addClass('noLine').appendTo(embedDiv);
			thumbLink.append($('<img/>', { css: { margin: 0 }, src: firstFrameSrc, width: parseFloat(width), height: parseFloat(height)}));
			var playBtn = $('<span/>', { css: { height: '75px', width: '75px' } }).addClass('playBtn').appendTo(thumbLink);
		},
		playVideo: function(id)
		{
			var curVideo = this.videos[id];
			this.embed(this.videoPlayerSwfUrl, curVideo.id, curVideo.width, curVideo.height, curVideo.flashVars, curVideo.params, curVideo.attributes);
		}
	},
	
	Validate: {
		email: function(strEmail)
		{
			var reg = /^([A-Za-z0-9_\-\.])+\@([A-Za-z0-9_\-\.])+\.([A-Za-z]{2,4})$/;
			return reg.test(strEmail);
		}
	},
	
	Social: {
		loadFBAPI: function()
		{
			window.fbAsyncInit = function() {
				FB.init({appId: FB_APP_ID, status: true, cookie: true, xfbml: true});
			};
			if ($('#fb-root').length === 0) { $('body').prepend($('<div id="fb-root"></div>')); }		// The Facebook API needs a div to attach it's scripts to.
			var e = document.createElement('script'); e.async = true;
			e.src = document.location.protocol + '//connect.facebook.net/en_US/all.js';
			document.getElementById('fb-root').appendChild(e);
		},
		share: function(args)
		{
			args = BoatUS.Social.parseOpts(args);
			BoatUS.handleOverlay('share', args);
		},
		parseOpts: function(args)
		{
			// go through the options the the args hash and return the set to use.
			var shareDefs = BoatUS.Options.socialOpts;
			args = $.extend({}, shareDefs, args);
			args.title = unescape(args.title);
			return args;
		},
		shareFB: function(args)
		{
			args = BoatUS.Social.parseOpts(args);
			args.url = BoatUS.Utils.addQueryParameter(args.url, 'WT.src', 'share_FB');
			strShareLink = 'http://www.facebook.com/sharer.php?u=' + encodeURIComponent(args.url) + '&t=' + encodeURIComponent(args.title);
			BoatUS.Popup(strShareLink, 'facebookShare', { width: 650, height: 300 });
			BoatUS.Social.wtTrackShare('Facebook', args.title, args.url);
			return false;
		},
		shareTW: function(args)
		{
			args = BoatUS.Social.parseOpts(args);
			args.url = BoatUS.Utils.addQueryParameter(args.url, 'WT.src', 'share_TW');
			strShareLink = 'http://twitter.com/share?url=' + encodeURIComponent(args.url) + '&text=' + encodeURIComponent(args.title) + '&via=BoatUS';
			BoatUS.Popup(strShareLink, 'twitterShare', { width: 650, height: 200 });
			BoatUS.Social.wtTrackShare('Twitter', args.title, args.url);
			return false;
		},
		shareGP: function(opts)
		{
			args = BoatUS.Social.parseOpts(args);
			args.url = BoatUS.Utils.addQueryParameter(args.url, 'WT.src', 'share_GP');
			strShareLink = '';
			BoatUS.Popup(strShareLink, 'googlePlusShare', { width: 650, height: 300 });
			BoatUS.Social.wtTrackShare('Google Plus', args.title, args.url);
			return false;
		},
		shareDG: function(args)
		{
			args = BoatUS.Social.parseOpts(args);
			args.url = BoatUS.Utils.addQueryParameter(args.url, 'WT.src', 'share_DG');
			strShareLink = 'http://digg.com/submit?url=' + encodeURIComponent(args.url) + '&title=' + encodeURIComponent(args.title) + '&bodytext=' + encodeURIComponent(args.description);
			BoatUS.Popup(strShareLink, 'diggShare', { width: 1050, height: 655 });
			BoatUS.Social.wtTrackShare('Digg', args.title, args.url);
			return false;
		},
		shareSU: function(args)
		{
			args = BoatUS.Social.parseOpts(args);
			args.url = BoatUS.Utils.addQueryParameter(args.url, 'WT.src', 'share_SU');
			strShareLink = 'http://www.stumbleupon.com/submit?url=' + encodeURIComponent(args.url) + '&title=' + encodeURIComponent(args.title);
			BoatUS.Popup(strShareLink, 'stumbleShare', { width: 720, height: 500});
			BoatUS.Social.wtTrackShare('Stumble Upon', args.title, args.url);
			return false;
		},
		shareEM: function(args)
		{
			args = BoatUS.Social.parseOpts(args);
			args.url = BoatUS.Utils.addQueryParameter(args.url, 'WT.src', 'share_EM');
			BoatUS.log(args);
			BoatUS.handleOverlay('sendToFriend', args);
		},
		wtTrackShare: function(strService, strTitle, strURL)
		{
			try {
				dcsMultiTrack('WT.ria_a', 'Social', 'WT.ria_ev', 'Share', 'DCSext.smService', strService, 'WT.ria_c', strTitle + ' (' + strURL + ')', 'DCSext.url', strURL);
			} catch (e) {
		
			}
		},
		Comments: {
			comment_template: '<li id="cmt-{{identifier}}" class="cmt-row nest-level-{{nest}}"><h3> {{authorname}} </h3><p>{{text}}</p></li>',
			getComments: function (threadID, settings)
			{
				var defs = {
					comment_count: 100,
					comment_order: 'newest',
					thread_identifier: threadID,
					thread_url: document.location.href,
					thread_title: BoatUS.Options.socialOpts.title,
					template: BoatUS.Social.Comments.comment_template,
					comment_target: '#comment-thread'
				};
				var settings = $.extend({}, settings, defs);
				if ($(settings.comment_target).length < 1) { return; }		// If the placeholder for the comments doesn't exist, don't bother loading them.
				BoatUS.Social.Comments.template = new BoatUS.UI.Template(settings.template);
				$.ajax({
					url: API_PATH + 'comments/',
					data: settings,
					cache: true,
					error: function(h, s, e) {
						// Something went wrong.
						BoatUS.log(e);
					},
					success: function(d, t, x) {
						// Everything went OK and data was returned from the server.
						var cmts_html = '';
						if (d.comments.length > 0) {
							for (var ci = 0; ci < d.comments.length; ci++) {
								cmts_html += BoatUS.Social.Comments.printComment(d.comments[ci], 0);
							}
							$(d.target).html(cmts_html);
						}
					},
					type: 'POST'
				});
			},
			printComment: function(oComment, iNest)
			{
				var cmt_data = {
					identifier: oComment.id,
					authorname: oComment.author.username,
					text: oComment.text,
					nest: iNest
				};
				BoatUS.log(cmt_data);
				var cmt_html = BoatUS.Social.Comments.template.render(cmt_data);
				var cmt_replies = '';
				if (oComment.replies.length > 0) {
					for (var rpi = 0; rpi < oComment.replies.length; rpi++) {
						cmt_replies += BoatUS.Social.Comments.printComment(oComment.replies[rpi], iNest+1);
					}
				}
				return cmt_html + cmt_replies;
			},
			leaveComment: function()
			{
				
			},
			printCommentForm: function(strTarget)
			{
				
			}
		}
	},
	// The Geo API contains all of the methods to allow us to load and manipulate geographic data.
	Geo: {
		appState: {
			NOT_LOADED: -1,
			INITIALIZING: 0,
			READY: 1,
			LOADING_DATA: 2,
			DATA_LOADED: 3,
			RENDERING: 4
		},
		mapSize: {
			SMALL: 0,
			MEDIUM: 1,
			LARGE: 2,
			XLARGE: 3
		}
	},
	// The UI API allows us to build rich UI interactions.
	UI: {
		Template: function(str_tmpl)
		{
			this.template_src = str_tmpl;
			this.render = function(d) {
				var rT = this.template_src;
				var re = new RegExp ("\{\{(.*?)\}\}","gm");		// @TODO: Fix RegEx pattern to not freak out about > brackets in front of the matching pattern.
				var m;
				while (m = re.exec(rT)) {
					rT = rT.replace(m[0], d[m[1]]);
				}
				return rT;
			}
		},
		// Create a tabbed interface.
		tabs: {
			init: function(strContainerID, objOpts)
			{
				var oOpts = {};
				if (!BoatUS.pageReady) {
					// The UI call was too early. Defer until the page has fully loaded.
					BoatUS.Queue.addToQueue(function() {
						BoatUS.UI.tabs.init(strContainerID, objOpts);
					});
					return;
				}
				oOpts = $.extend({}, BoatUS.Options.UI.tabs, objOpts);
				if ($(strContainerID).length > 1) {
					// The tabs function must only be called on a single element. If more than one element is passed, loop through them.
					$(strContainerID).each(function(i, e) {
						BoatUS.UI.tabs.init(this, oOpts);
					});
					return;
				}
				var container, tabsID, curTab;
				if ($(strContainerID).length !== 1) { return; }
				container = $(strContainerID);
				$(container).addClass('tabbed-module');
				tabsID = container.attr('id');
				if (oOpts.save) { curTab = BoatUS.Data.get('tabs_' + tabsID); } else { BoatUS.Data.remove('tabs_' + tabsID); }
				if (curTab !== '') {
					if ($('#' + curTab).length < 1) { curTab = ''; }
				}
				//if (oOpts.selected - 1 >= container.children('div').length) { oOpts.selected = 1; }
				if (curTab === '' || curTab === null || curTab === undefined) { curTab = container.children('div.tab').eq(oOpts.selected - 1); } else { curTab = '#' + curTab; }
				container.find('div.tab').not(curTab).hide();
				$('ul.tabs > li', container).each(function(i, e) {
					$('a', this).click(function(e) {
						BoatUS.UI.tabs.changeTab(this);
						return false;
					});
				});
				curTab = $(curTab, container);
				curTab.addClass('current').show();
				$('a[rel="' + curTab.attr('id') + '"]').parent().addClass('current');
				if (typeof oOpts.onChange === "function") {
					$(container).data('onChange', oOpts.onChange);
					oOpts.onChange({ target: curTab, type: 'click', tabID: $(curTab).attr('rel') }, container);
				}
				if (typeof oOpts.onCreate === "function") {
					oOpts.onCreate(container, oOpts);
				}
			},
			// Change to the given tab.
			changeTab: function(arg0, arg1)
			{
				var objTab, clickedTab, clickTabGroup, targetTab;
				if (arg1 === undefined) {
					// if only 1 argument was passed, that argument must be the jquery pointer to the tab to show.
					objTab = arg0;
				} else {
					// otherwise arg0 is the container, and arg1 is the tab index.
					objTab = $('li', arg0).eq(arg1).find('a');
				}
				clickedTab = $(objTab).parent();
				clickedTabGroup = $(objTab).closest('.tabbed-module');
				targetTab = $('#' + $(objTab).attr('rel'));
				clickedTabGroup.find('li').removeClass('current');
				clickedTab.addClass('current');
				BoatUS.Data.set('tabs_' + clickedTabGroup.attr('id'), $(objTab).attr('rel'));
				clickedTabGroup.find('div.tab').removeClass('current').hide();
				$(targetTab).show();
				if (typeof clickedTabGroup.data('onChange') === "function") {
					clickedTabGroup.data('onChange')({ target: objTab, type: 'click', tabID: $(objTab).attr('rel') }, clickedTabGroup);
				}
			}
		},
		// work with text
		text: {
			initialized: false,
			init: function()
			{
				// maybe have some bootstrap code when it's first called.
			},
			// Make the text larger or smaller.
			resize: function(strTarget, amt, nest)
			{
				BoatUS.log(amt);
				if (!this.initialized) { this.init(); }
				if ($(strTarget).hasClass('noResize')) { return false; }
				if (amt === 0) { $(strTarget).css('font-size', ''); }
				if (amt < 0) {
					if (BoatUS.Options.UI.text.curSize - Math.abs(amt) < BoatUS.Options.UI.text.minSize) { return false; }
				} else {
					if (BoatUS.Options.UI.text.curSize + Math.abs(amt) > BoatUS.Options.UI.text.maxSize) { return false; }
				}
				if (amt === 0) { BoatUS.Options.UI.text.curSize = 0; }
				if (nest !== true) {
					BoatUS.Options.UI.text.curSize += amt;
				}
				$('*', strTarget).contents().css('font-size',((1 + (BoatUS.Options.UI.text.curSize * .1)) * 100) + '%');
				return false;
			}
		},
		paginator: function(target, opts) {
			var defs = {
				showFirstLast: false,		// Should we show first / last links?
				pageVariable: "page",		// What variable should hold the page number?
				baseQS: "",				// The base QueryString that will be the same for all links.
				dividerText: "&hellip;",		// The text to be rendered in between the buttons.
				showMax: 4,				// How many links should be shown at once?
				pages: 0,
				curPage: 0,
				style: {					// Style properties.
					buttonClass: "paginatorButton",
					currentClass: "selected",
					nextClass: "next",
					prevClass: "prev",
					firstClass: "first",
					lastClass: "last",
					dividerClass: "break",
					holderClass: "paginator"
				},
				onChange: null				// Function that gets passed the page changed event.
			};
			this.options = $.extend({}, defs, opts);
			BoatUS.log(this.options);
			this.target = $(target);
			this.pages = this.options.pages;
			this.curPage = this.options.curPage;
			var links = [];
			var firstLink = null, lastLink = null;
			var holder = null;
			// Create the necessary html to display the pagination.
			this.init = function()
			{
				links = [];
				this.firstLink = null;
				this.lastLink = null;
				holder = null;
			};
			this.generate = function()
			{
				this.init();
				holder = $('<div />', { });
				var me = this;
				BoatUS.log("PAGE COUNT: " + this.pages);
				if (this.pages <= 1) return;
				var cS = 1;
				this.firstLink = $('<a />', { html: 'First' }).attr({ 'href': this.getPageLink(0), title: 'Go to First Page' }).addClass(this.options.style.firstClass).click(function() { return me.changePage(0); }).hide();
				if (this.options.showFirstLast) this.firstLink.appendTo(holder).css('display', 'inline');
				$('<span />', { html: this.options.dividerText }).addClass(this.options.style.dividerClass + ' page-divider-front').appendTo(holder).hide();
				for (var i = 0; i < this.pages; i++) {
					links.push($('<a />', { html: i + 1 }).attr({ 'href': this.getPageLink(i), title: 'Page ' + i }).addClass(this.options.style.buttonClass + ' page-' + i).click(function() { return me.changePage($(this).data('msl-page')); }).data('msl-page', i));
					links[i].appendTo(holder);
				}
				$('<span />', { html: this.options.dividerText }).addClass(this.options.style.dividerClass + ' page-divider-back').appendTo(holder).hide();
				this.lastLink = $('<a />', { html: 'Last' }).attr({ 'href': this.getPageLink(this.pages - 1), title: 'Go to Last Page' }).addClass(this.options.style.lastClass).click(function() { return me.changePage(me.pages - 1); }).hide();
				if (this.options.showFirstLast) this.lastLink.appendTo(holder).css('display', 'inline');
					
				$('.page-' + this.curPage, holder).addClass('selected');
				this.changePage(0);
				return holder;
			};
			// Change the page that we are on.
			this.changePage = function(i, prevent)
			{
				this.curPage = i;
				var cnt = false;
				if (i < 0 || i > this.pages) return false;
				if (this.options.onChange && prevent != false) {
					cnt = this.options.onChange(i);		// If the onChange callback returns true, allow the link to function as normal.
				}
				if (cnt) return true;
				this.updateUI();
				return false;
			};
			// Change the UI to reflect the new page number.
			this.updateUI = function(returnHTML)
			{
				var cS = 0;
				if (this.curPage > 4) cS = this.curPage - 4;
				
				var showStart = cS;			// Which page link should we start displayings?
				var showStop = cS + 10;		// Which page link should we end displaying?
				if (showStart > 0 && this.firstLink) {
					this.firstLink.css('display', 'inline');
					$('.page-divider-front').show();
				} else if (this.firstLink) {
					this.firstLink.css('display', 'none');
					$('.page-divider-front').hide();
				}
				if (showStop < this.pages && this.lastLink) {
					this.lastLink.css('display', 'inline');
				} else if (this.lastLink) {
					this.lastLink.css('display', 'none');
				}
				var cL = null;
				for (var i = 0, j = links.length; i < j; i++) {
					cL = links[i];
					cL.removeClass('selected');
					if (i >= showStart && i < showStop) {
						cL.show();
						if (i === this.curPage) cL.addClass('selected');
					} else {
						cL.hide();
					}
				}
				if (returnHTML) return holder;
				//return this.generate(true);
			};
			// Return the link to a given page.
			this.getPageLink = function(p)
			{
				if (this.options.baseQS != "") {
					var oQS = BoatUS.Utils.qsToObject(this.options.baseQS);
					oQS['page'] = p;
					var sQS = BoatUS.Utils.objectToQS(oQS);
					return '?' + sQS;
				} else {
					return '?' + this.options.pageVariable + '=' + p;
				}
			};
		}
	},
	// The data API gives us high-level access to any available browser storage APIs.
	Data: {
		get: function(strKey)
		{
			if (typeof(JSON) !== 'object') { return; }		// We can only retrieve data if the JSON methiods are available.
			if (strKey === "" || strKey === undefined || strKey === null) { return ""; }
			var varVal = '';
			if (window.sessionStorage) {
				if (sessionStorage.getItem(strKey) !== "") {
					varVal = JSON.parse(sessionStorage.getItem(strKey));
				}
				BoatUS.log("DATA.GET: " + strKey + " = " + varVal);
			} else {
				// provide some sort of fallback. (Cookies, maybe).
				
			}
			return varVal;
		},
		set: function(strKey, varVal)
		{
			if (typeof(JSON) !== 'object') { return; }		// We can only store data if the JSON methiods are available.
			if (window.sessionStorage) {
				sessionStorage.setItem(strKey, JSON.stringify(varVal));
			} else {
				// provide some sort of fallback. (Cookies, maybe).
				
			}
			BoatUS.log("DATA.SET: " + strKey + " = " + varVal);
		},
		remove: function(strKey)
		{
			if (window.sessionStorage) {
				sessionStorage.removeItem(strKey);
			} else {
				// provide some sort of fallback. (Cookies, maybe).
				
			}
			BoatUS.log("DATA_REMOVE: " + strKey);
		}
	},
	Utils: {
		// Given a QueryString-formatted string, return an object.
		qsToObject: function(qs)
		{
			var retO = {}, qsO = qs.split("&"), val = "";
			for (var i = 0, j = qsO.length; i < j; i++)
			{
				val = qsO[i].split("=");
				if (retO[val[0]]) {
					// There is already a key with this name, so we need to store an array of the info.
					if (!typeof retO[val[0]] == "array") { 
						var bakV = retO[val[0]];
						retO[val[0]] = [];
						retO[val[0]].push(bakV);
					}
					retO[val[0]].push(val[1]);
				} else {
					retO[val[0]] = val[1];
				}
			}
			return retO;
		},
		// Given a JavaScript object, return a QueryString-formatted string.
		objectToQS: function(obj)
		{
			var qsRet = [];
			for (var p in obj) {
				if (obj[p] == undefined) continue;
				qsRet.push(p + '=' + obj[p]);
			}
			return qsRet.join("&");
		},
		addQueryParameter: function(strURL, param, value)
		{
			var strQS = BoatUS.Utils.qsOnly(strURL);
			var strURL = BoatUS.Utils.urlOnly(strURL);
			var qs = BoatUS.Utils.qsToObject(strQS);
			if (typeof param == "object") {
				for (var k in param) {
					if (k == undefined || param[k] == undefined) continue;
					qs[k] = encodeURIComponent(param[k]);
				}
			} else {
				qs[param] = value;
			}
			var ret = strURL + '?' + BoatUS.Utils.objectToQS(qs);
			return ret;
		},
		qsOnly: function(strURL)
		{
			strURL = unescape(strURL);
			if (strURL.indexOf('?') > 0) {
				return strURL.split('?')[1];
			} else {
				return '';
			}
		},
		urlOnly: function(strURL)
		{
			strURL = unescape(strURL);
			if (strURL.indexOf('?') > 0) {
				return strURL.split('?')[0];
			} else {
				return strURL;
			}
		}
	},
	// Store information about the current user agent. Useful for page debugging.
	Browser: {
		properties: {
			type: "",
			version: "",
			cookies: "",
			platform: "",
			agent: "",
			flash: ""
		},
		init: function(opts)
		{
			this.properties.type = navigator.appName;
			this.properties.version = navigator.appVersion;
			this.properties.cookies = navigator.cookieEnabled;
			this.properties.platform = navigator.platform;
			this.properties.agent = navigator.userAgent;
			this.properties.flash = navigator.mimeTypes && navigator.mimeTypes["application/x-shockwave-flash"];
		}
	},
	// Triggers a previously bound event.
	triggerEvent: function(eventType, eventArgs)
	{
		if (typeof this.Events[eventType] === 'object') {
			var f;
			for (f in this.Events[eventType]) {
				if (typeof this.Events[eventType][f] === 'function') { 
					eventArgs.eventType = eventType;
					this.Events[eventType][f](eventArgs);
				}
			}
		}
	},
	// Adds an event to the BoatUS object. The event may later be triggered with BoatUS.triggerEvent( ... ). Event names should be in the format [Module].[Action] (i.e. Overlay.Open)
	addEventListener: function(eventType, objFunc)
	{
		if (this.Events[eventType] === undefined) { this.Events[eventType] = []; }
		this.Events[eventType].push(objFunc);
		this.EventLog.push([eventType, this.Events[eventType].length]);
		return this.EventLog.length;	// A numeric identifier representing the array index where this event is stored.
	},
	removeEventListener: function(identifier)
	{
		var evt = this.EventLog[identifier - 1];
		this.Events[evt[0]][evt[1]] = null;
	},
	// Include a JavaScript file into the page.
	require: function(url, type, callback)
	{
		if (this.Includes === undefined) { this.Includes = {}; }
		if (type == undefined || type == "script") {
			$.getScript(url, callback);
			//$('<script>', { type: 'text/javascript', src: url }).appendTo($('head').first());
		} else if (type == "stylesheet") {
			$('<link>', { rel: 'stylesheet', href: url }).appendTo($('head').first());
		}
		return;
	},
	// Include a JavaScript file into the page exactly once.
	require_once: function(url, type)
	{
		if (this.Includes === undefined) { this.Includes = {}; }
		if (this.Includes[url]) { return; }
		this.require(url, type);
		this.Includes[url] = true;
		return;
	},
	// Abstracts the logging interface so that we can log from any browser.
	log: function(strMsg)
	{
		if (BoatUS.Options.debug === false || BoatUS.Options.debug === null) { return; }
		if (typeof console !== "undefined") {
			console.log(strMsg);
		}
	},
	warn: function(strMsg)
	{
		if (BoatUS.Options.debug === false || BoatUS.Options.debug === null) { return; }
		if (typeof console !== "undefined") {
			console.warn(strMsg);
		}
	},
	randomString: function(string_length)
	{
		if (string_length === undefined) { string_length = 8; }
		var chars = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXTZabcdefghiklmnopqrstuvwxyz';
		var randomstring = '';
		var i;
		for (i = 0; i < string_length; i++) {
			var rnum = Math.floor(Math.random() * chars.length);
			randomstring += chars.substring(rnum,rnum+1);
		}
		return randomstring;
	},
	uniqueID: function()
	{
		if (typeof BoatUS.incrementID === 'undefined') { BoatUS.incrementID = 0; }
		BoatUS.incrementID++;
		return BoatUS.incrementID;
	}
};
BoatUS.addEventListener('Ads.Load', function(e) { console.log('ads loaded'); });
// Call the Bootstrap function when everything is ready. Events should be bound before this init function is called.
$(document).ready(function() { 
	BoatUS.init((typeof pageOptions !== 'undefined') ? pageOptions : {});
	$('.leftNav').accordionMenu((typeof accordionOptions !== 'undefined') ? accordionOptions : {});
	$('.zebra').jqStripe();
	$('ul.hero-gallery').BoatUSGallery((typeof galleryOptions !== 'undefined') ? galleryOptions : {});
});
 
(function($) {
	$.fn.accordionMenu = function(options) {
		var defaults = {
			startCollapsed: true,
			current: '',
			onlyOne: false		// If set to true, only one sub-menu will be open at once.
		};
		var opts = $.extend({}, defaults, options);
		$(opts.current).addClass('current');
		$('#topNav ul.subNav').each(function(i, e) {
			$(this).parent().addClass('hasSub');
		});
		return this.each(function(i) {
			buildMenu(this, opts);
		});
	};
	
	var buildMenu = function(el, opts)
	{
		var parent = $(el);
		var startCollapsed = opts.startCollapsed || false;
		$(parent).children('li').each(function(i, e) {
			if ($('ul.subNav', e).length > 0) {
				startCollapsed = true;
				if ($(e).has('.expanded').length <= 0) { startCollapsed = true; } else { startCollapsed = false; }
				if ($(opts.current, e).length > 0) { startCollapsed = false; }
				if (startCollapsed)
				{
					$(e).addClass('closed').children('ul').not('.expanded').slideUp('fast');
				} else {
					$(e).addClass('open').children('ul').slideDown('fast');
				}
				$(e).children('.expanded').slideDown('fast').parent().removeClass('closed').addClass('open');
				if (!$(e).hasClass('hasSub')) {
					$(e).addClass('hasSub').find('a:first').attr('title', 'Click to Expand Menu').click(function(){
						var justChanged = false;
						if (opts.onlyOne) {
							$(this).parent().parent().parent().find('ul.subNav').not($(this).parent().next('ul.subNav')).slideUp('fast');
							$(this).parent().parent().parent().find('li').removeClass('open').addClass('closed');
							justChanged = true;
						}
						$(this).parent().next('ul.subNav').slideToggle('fast', function(e) {
							if ($(this).css('display') === 'none')
							{
								$(this).parent().removeClass('open').addClass('closed');
							} else {
								$(this).parent().removeClass('closed').addClass('open');
							}
						});
						return false;
					}).wrap('<div />');
				}
				if ($('ul.subNav', e).length > 0) {
					$('ul.subNav', e).accordionMenu(opts);
				}
			}
		});
	};
})(jQuery);

(function($){$.fn.collapseMenu=function(options){var defaults={onlyOne:true,linkSelector:'li > a',toggleSelector:'div.section'};var opts=$.extend({},defaults,options);$(opts.current).addClass('current');return this.each(function(i){buildCollapse(this,opts)})};var buildCollapse=function(el,opts){var parent=$(el);var slides=$(opts.toggleSelector,parent);slides.slideUp();$(opts.linkSelector,parent).each(function(){$(this).click(function(){var tgt=$($(this).attr('rel'));if(tgt.hasClass('expanded')){tgt.slideUp().removeClass('expanded');$(this).removeClass('expanded')}else{if(opts.onlyOne){$(opts.linkSelector,parent).not($(this)).removeClass('expanded');slides.not(tgt).slideUp().removeClass('expanded')}tgt.slideDown().addClass('expanded');$(this).addClass('expanded')}return false})})}})(jQuery);
 
(function($){$.fn.extend({center:function(options){var opts=$.extend({inside:window,transition:0,minX:0,minY:0,vertical:true,withScrolling:true,horizontal:true},options);return this.each(function(){var props={position:'absolute'};if(opts.vertical){var top=($(opts.inside).height()-$(this).outerHeight())/2;if(opts.withScrolling){top+=$(opts.inside).scrollTop()||0}top=(top>opts.minY?top:opts.minY);$.extend(props,{top:top+'px'})}if(opts.horizontal){var left=($(opts.inside).width()-$(this).outerWidth())/2;if(opts.withScrolling){left+=$(opts.inside).scrollLeft()||0}left=(left>opts.minX?left:opts.minX);$.extend(props,{left:left+'px'})}if(opts.transition>0){$(this).animate(props,opts.transition)}else{$(this).css(props)}return $(this)})}})})(jQuery); 

(function($){$.fn.jqStripe=function(params){var _params={stripeClasses:['odd','even'],rowSelector:'tbody > tr:visible'};params=$.extend(_params,params);var stripes=params.stripeClasses.length;var classes=params.stripeClasses.join(' ');return this.each(function(){$(params.rowSelector,this).each(function(i){$(this).not('.noStripe').removeClass(classes).addClass(params.stripeClasses[i%stripes]).hover(function(){$(this).addClass('rowHover')},function(){$(this).removeClass('rowHover')})})})}})(jQuery);

if (swfobject == undefined) {
/*	SWFObject v2.2 <http://code.google.com/p/swfobject/> 
	is released under the MIT License <http://www.opensource.org/licenses/mit-license.php> 
*/
var swfobject=function(){var D="undefined",r="object",S="Shockwave Flash",W="ShockwaveFlash.ShockwaveFlash",q="application/x-shockwave-flash",R="SWFObjectExprInst",x="onreadystatechange",O=window,j=document,t=navigator,T=false,U=[h],o=[],N=[],I=[],l,Q,E,B,J=false,a=false,n,G,m=true,M=function(){var aa=typeof j.getElementById!=D&&typeof j.getElementsByTagName!=D&&typeof j.createElement!=D,ah=t.userAgent.toLowerCase(),Y=t.platform.toLowerCase(),ae=Y?/win/.test(Y):/win/.test(ah),ac=Y?/mac/.test(Y):/mac/.test(ah),af=/webkit/.test(ah)?parseFloat(ah.replace(/^.*webkit\/(\d+(\.\d+)?).*$/,"$1")):false,X=!+"\v1",ag=[0,0,0],ab=null;if(typeof t.plugins!=D&&typeof t.plugins[S]==r){ab=t.plugins[S].description;if(ab&&!(typeof t.mimeTypes!=D&&t.mimeTypes[q]&&!t.mimeTypes[q].enabledPlugin)){T=true;X=false;ab=ab.replace(/^.*\s+(\S+\s+\S+$)/,"$1");ag[0]=parseInt(ab.replace(/^(.*)\..*$/,"$1"),10);ag[1]=parseInt(ab.replace(/^.*\.(.*)\s.*$/,"$1"),10);ag[2]=/[a-zA-Z]/.test(ab)?parseInt(ab.replace(/^.*[a-zA-Z]+(.*)$/,"$1"),10):0}}else{if(typeof O.ActiveXObject!=D){try{var ad=new ActiveXObject(W);if(ad){ab=ad.GetVariable("$version");if(ab){X=true;ab=ab.split(" ")[1].split(",");ag=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}}catch(Z){}}}return{w3:aa,pv:ag,wk:af,ie:X,win:ae,mac:ac}}(),k=function(){if(!M.w3){return}if((typeof j.readyState!=D&&j.readyState=="complete")||(typeof j.readyState==D&&(j.getElementsByTagName("body")[0]||j.body))){f()}if(!J){if(typeof j.addEventListener!=D){j.addEventListener("DOMContentLoaded",f,false)}if(M.ie&&M.win){j.attachEvent(x,function(){if(j.readyState=="complete"){j.detachEvent(x,arguments.callee);f()}});if(O==top){(function(){if(J){return}try{j.documentElement.doScroll("left")}catch(X){setTimeout(arguments.callee,0);return}f()})()}}if(M.wk){(function(){if(J){return}if(!/loaded|complete/.test(j.readyState)){setTimeout(arguments.callee,0);return}f()})()}s(f)}}();function f(){if(J){return}try{var Z=j.getElementsByTagName("body")[0].appendChild(C("span"));Z.parentNode.removeChild(Z)}catch(aa){return}J=true;var X=U.length;for(var Y=0;Y<X;Y++){U[Y]()}}function K(X){if(J){X()}else{U[U.length]=X}}function s(Y){if(typeof O.addEventListener!=D){O.addEventListener("load",Y,false)}else{if(typeof j.addEventListener!=D){j.addEventListener("load",Y,false)}else{if(typeof O.attachEvent!=D){i(O,"onload",Y)}else{if(typeof O.onload=="function"){var X=O.onload;O.onload=function(){X();Y()}}else{O.onload=Y}}}}}function h(){if(T){V()}else{H()}}function V(){var X=j.getElementsByTagName("body")[0];var aa=C(r);aa.setAttribute("type",q);var Z=X.appendChild(aa);if(Z){var Y=0;(function(){if(typeof Z.GetVariable!=D){var ab=Z.GetVariable("$version");if(ab){ab=ab.split(" ")[1].split(",");M.pv=[parseInt(ab[0],10),parseInt(ab[1],10),parseInt(ab[2],10)]}}else{if(Y<10){Y++;setTimeout(arguments.callee,10);return}}X.removeChild(aa);Z=null;H()})()}else{H()}}function H(){var ag=o.length;if(ag>0){for(var af=0;af<ag;af++){var Y=o[af].id;var ab=o[af].callbackFn;var aa={success:false,id:Y};if(M.pv[0]>0){var ae=c(Y);if(ae){if(F(o[af].swfVersion)&&!(M.wk&&M.wk<312)){w(Y,true);if(ab){aa.success=true;aa.ref=z(Y);ab(aa)}}else{if(o[af].expressInstall&&A()){var ai={};ai.data=o[af].expressInstall;ai.width=ae.getAttribute("width")||"0";ai.height=ae.getAttribute("height")||"0";if(ae.getAttribute("class")){ai.styleclass=ae.getAttribute("class")}if(ae.getAttribute("align")){ai.align=ae.getAttribute("align")}var ah={};var X=ae.getElementsByTagName("param");var ac=X.length;for(var ad=0;ad<ac;ad++){if(X[ad].getAttribute("name").toLowerCase()!="movie"){ah[X[ad].getAttribute("name")]=X[ad].getAttribute("value")}}P(ai,ah,Y,ab)}else{p(ae);if(ab){ab(aa)}}}}}else{w(Y,true);if(ab){var Z=z(Y);if(Z&&typeof Z.SetVariable!=D){aa.success=true;aa.ref=Z}ab(aa)}}}}}function z(aa){var X=null;var Y=c(aa);if(Y&&Y.nodeName=="OBJECT"){if(typeof Y.SetVariable!=D){X=Y}else{var Z=Y.getElementsByTagName(r)[0];if(Z){X=Z}}}return X}function A(){return !a&&F("6.0.65")&&(M.win||M.mac)&&!(M.wk&&M.wk<312)}function P(aa,ab,X,Z){a=true;E=Z||null;B={success:false,id:X};var ae=c(X);if(ae){if(ae.nodeName=="OBJECT"){l=g(ae);Q=null}else{l=ae;Q=X}aa.id=R;if(typeof aa.width==D||(!/%$/.test(aa.width)&&parseInt(aa.width,10)<310)){aa.width="310"}if(typeof aa.height==D||(!/%$/.test(aa.height)&&parseInt(aa.height,10)<137)){aa.height="137"}j.title=j.title.slice(0,47)+" - Flash Player Installation";var ad=M.ie&&M.win?"ActiveX":"PlugIn",ac="MMredirectURL="+O.location.toString().replace(/&/g,"%26")+"&MMplayerType="+ad+"&MMdoctitle="+j.title;if(typeof ab.flashvars!=D){ab.flashvars+="&"+ac}else{ab.flashvars=ac}if(M.ie&&M.win&&ae.readyState!=4){var Y=C("div");X+="SWFObjectNew";Y.setAttribute("id",X);ae.parentNode.insertBefore(Y,ae);ae.style.display="none";(function(){if(ae.readyState==4){ae.parentNode.removeChild(ae)}else{setTimeout(arguments.callee,10)}})()}u(aa,ab,X)}}function p(Y){if(M.ie&&M.win&&Y.readyState!=4){var X=C("div");Y.parentNode.insertBefore(X,Y);X.parentNode.replaceChild(g(Y),X);Y.style.display="none";(function(){if(Y.readyState==4){Y.parentNode.removeChild(Y)}else{setTimeout(arguments.callee,10)}})()}else{Y.parentNode.replaceChild(g(Y),Y)}}function g(ab){var aa=C("div");if(M.win&&M.ie){aa.innerHTML=ab.innerHTML}else{var Y=ab.getElementsByTagName(r)[0];if(Y){var ad=Y.childNodes;if(ad){var X=ad.length;for(var Z=0;Z<X;Z++){if(!(ad[Z].nodeType==1&&ad[Z].nodeName=="PARAM")&&!(ad[Z].nodeType==8)){aa.appendChild(ad[Z].cloneNode(true))}}}}}return aa}function u(ai,ag,Y){var X,aa=c(Y);if(M.wk&&M.wk<312){return X}if(aa){if(typeof ai.id==D){ai.id=Y}if(M.ie&&M.win){var ah="";for(var ae in ai){if(ai[ae]!=Object.prototype[ae]){if(ae.toLowerCase()=="data"){ag.movie=ai[ae]}else{if(ae.toLowerCase()=="styleclass"){ah+=' class="'+ai[ae]+'"'}else{if(ae.toLowerCase()!="classid"){ah+=" "+ae+'="'+ai[ae]+'"'}}}}}var af="";for(var ad in ag){if(ag[ad]!=Object.prototype[ad]){af+='<param name="'+ad+'" value="'+ag[ad]+'" />'}}aa.outerHTML='<object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000"'+ah+">"+af+"</object>";N[N.length]=ai.id;X=c(ai.id)}else{var Z=C(r);Z.setAttribute("type",q);for(var ac in ai){if(ai[ac]!=Object.prototype[ac]){if(ac.toLowerCase()=="styleclass"){Z.setAttribute("class",ai[ac])}else{if(ac.toLowerCase()!="classid"){Z.setAttribute(ac,ai[ac])}}}}for(var ab in ag){if(ag[ab]!=Object.prototype[ab]&&ab.toLowerCase()!="movie"){e(Z,ab,ag[ab])}}aa.parentNode.replaceChild(Z,aa);X=Z}}return X}function e(Z,X,Y){var aa=C("param");aa.setAttribute("name",X);aa.setAttribute("value",Y);Z.appendChild(aa)}function y(Y){var X=c(Y);if(X&&X.nodeName=="OBJECT"){if(M.ie&&M.win){X.style.display="none";(function(){if(X.readyState==4){b(Y)}else{setTimeout(arguments.callee,10)}})()}else{X.parentNode.removeChild(X)}}}function b(Z){var Y=c(Z);if(Y){for(var X in Y){if(typeof Y[X]=="function"){Y[X]=null}}Y.parentNode.removeChild(Y)}}function c(Z){var X=null;try{X=j.getElementById(Z)}catch(Y){}return X}function C(X){return j.createElement(X)}function i(Z,X,Y){Z.attachEvent(X,Y);I[I.length]=[Z,X,Y]}function F(Z){var Y=M.pv,X=Z.split(".");X[0]=parseInt(X[0],10);X[1]=parseInt(X[1],10)||0;X[2]=parseInt(X[2],10)||0;return(Y[0]>X[0]||(Y[0]==X[0]&&Y[1]>X[1])||(Y[0]==X[0]&&Y[1]==X[1]&&Y[2]>=X[2]))?true:false}function v(ac,Y,ad,ab){if(M.ie&&M.mac){return}var aa=j.getElementsByTagName("head")[0];if(!aa){return}var X=(ad&&typeof ad=="string")?ad:"screen";if(ab){n=null;G=null}if(!n||G!=X){var Z=C("style");Z.setAttribute("type","text/css");Z.setAttribute("media",X);n=aa.appendChild(Z);if(M.ie&&M.win&&typeof j.styleSheets!=D&&j.styleSheets.length>0){n=j.styleSheets[j.styleSheets.length-1]}G=X}if(M.ie&&M.win){if(n&&typeof n.addRule==r){n.addRule(ac,Y)}}else{if(n&&typeof j.createTextNode!=D){n.appendChild(j.createTextNode(ac+" {"+Y+"}"))}}}function w(Z,X){if(!m){return}var Y=X?"visible":"hidden";if(J&&c(Z)){c(Z).style.visibility=Y}else{v("#"+Z,"visibility:"+Y)}}function L(Y){var Z=/[\\\"<>\.;]/;var X=Z.exec(Y)!=null;return X&&typeof encodeURIComponent!=D?encodeURIComponent(Y):Y}var d=function(){if(M.ie&&M.win){window.attachEvent("onunload",function(){var ac=I.length;for(var ab=0;ab<ac;ab++){I[ab][0].detachEvent(I[ab][1],I[ab][2])}var Z=N.length;for(var aa=0;aa<Z;aa++){y(N[aa])}for(var Y in M){M[Y]=null}M=null;for(var X in swfobject){swfobject[X]=null}swfobject=null})}}();return{registerObject:function(ab,X,aa,Z){if(M.w3&&ab&&X){var Y={};Y.id=ab;Y.swfVersion=X;Y.expressInstall=aa;Y.callbackFn=Z;o[o.length]=Y;w(ab,false)}else{if(Z){Z({success:false,id:ab})}}},getObjectById:function(X){if(M.w3){return z(X)}},embedSWF:function(ab,ah,ae,ag,Y,aa,Z,ad,af,ac){var X={success:false,id:ah};if(M.w3&&!(M.wk&&M.wk<312)&&ab&&ah&&ae&&ag&&Y){w(ah,false);K(function(){ae+="";ag+="";var aj={};if(af&&typeof af===r){for(var al in af){aj[al]=af[al]}}aj.data=ab;aj.width=ae;aj.height=ag;var am={};if(ad&&typeof ad===r){for(var ak in ad){am[ak]=ad[ak]}}if(Z&&typeof Z===r){for(var ai in Z){if(typeof am.flashvars!=D){am.flashvars+="&"+ai+"="+Z[ai]}else{am.flashvars=ai+"="+Z[ai]}}}if(F(Y)){var an=u(aj,am,ah);if(aj.id==ah){w(ah,true)}X.success=true;X.ref=an}else{if(aa&&A()){aj.data=aa;P(aj,am,ah,ac);return}else{w(ah,true)}}if(ac){ac(X)}})}else{if(ac){ac(X)}}},switchOffAutoHideShow:function(){m=false},ua:M,getFlashPlayerVersion:function(){return{major:M.pv[0],minor:M.pv[1],release:M.pv[2]}},hasFlashPlayerVersion:F,createSWF:function(Z,Y,X){if(M.w3){return u(Z,Y,X)}else{return undefined}},showExpressInstall:function(Z,aa,X,Y){if(M.w3&&A()){P(Z,aa,X,Y)}},removeSWF:function(X){if(M.w3){y(X)}},createCSS:function(aa,Z,Y,X){if(M.w3){v(aa,Z,Y,X)}},addDomLoadEvent:K,addLoadEvent:s,getQueryParamValue:function(aa){var Z=j.location.search||j.location.hash;if(Z){if(/\?/.test(Z)){Z=Z.split("?")[1]}if(aa==null){return L(Z)}var Y=Z.split("&");for(var X=0;X<Y.length;X++){if(Y[X].substring(0,Y[X].indexOf("="))==aa){return L(Y[X].substring((Y[X].indexOf("=")+1)))}}}return""},expressInstallCallback:function(){if(a){var X=c(R);if(X&&l){X.parentNode.replaceChild(l,X);if(Q){w(Q,true);if(M.ie&&M.win){l.style.display="block"}}if(E){E(B)}}a=false}}}}();}

// BoatUS Gallery Function
(function($){
	$.extend($.fn,{
	BoatUSGallery:function(options){
	var settings = {
		start:0,
		transition: {
			type:'fade',H_Blocks:10,V_Blocks:4,duration:0.5,direction:'fwd'
		},
		slideDuration:5,
		nav:true
	};
	if (options) { $.extend(true,settings,options) }
	return $(this).each(function(){
		var gallery = $(this),slides = gallery.find('li'),transBlocksWidth = 0,curSlideIndex = settings.start,nextSlideIndex = curSlideIndex+1,transBlocksHeight = 0,galleryWidth = gallery.width(),galleryHeight = gallery.height(),trans_completed = 0,tCount = 0,slide_timeout,playing = false,navMarkers = null,slideTimer,elapsedInterval = 0,tickInterval = 100,transitions,transBlockWidth,transBlockHeight;
		gallery.css({ overflow:'hidden',position:'relative'});
		slides.css('position','absolute');
		if (nextSlideIndex>slides.length){ nextSlideIndex = 0 }
		transitions = {
			diag_block:function(c,n,d){
				trans_completed = 0;
				var slideBG = $(slides[n]).find('img').attr('src'),delay,tb,x,y,xu,yu,tB;
				gallery.find('.tBlock').css({ width:transBlockWidth * 0.5, height:transBlockHeight * 0.5, opacity:0, display:'block', 'background-image':'url('+slideBG+')' });
				for(y = 0; y<settings.transition.V_Blocks; y++) {
					for(x = 0; x<settings.transition.H_Blocks; x++) {
						xu = x;
						yu = y;
						if(settings.transition.direction === 'rev') {
							xu = settings.transition.H_Blocks-x-1;
							yu = settings.transition.V_Blocks-y-1;
						}
						tB = $('.trans_'+xu+'_'+yu,gallery);
						delay = (30*x)+(30*y);
						tB.delay(delay).animate({ width:transBlockWidth, height:transBlockHeight, opacity:1 }, d, function(){ transition_complete() });
					}
				}
			},
			horiz_block:function(c, n, d){
				trans_completed = 0;
				var slideBG = $(slides[n]).find('img').attr('src'), delay, tb, i, j, iu, sT = $('.tBlock',gallery);
				gallery.find('.tBlock').css({ width:transBlockWidth * 0.5, height:transBlockHeight * 0.5, opacity:0, display:'block','background-image':'url('+slideBG+')' });
				for(i = 0,j = sT.length; i <= j; i++){
					iu = i;
					if(settings.transition.direction === 'rev') { iu = j-i }
					delay = (30*i);
					$(sT[iu]).delay(delay).animate({ width:transBlockWidth, height:transBlockHeight, opacity:1 }, d, function(){ transition_complete() });
				}
			},
			rand_block:function(c, n, d){
				trans_completed = 0;
				var slideBG = $(slides[n]).find('img').attr('src'), delay = 0, tb, i, j, sT = $('.tBlock',gallery), randomSort = function(a,b){ return(Math.round(Math.random())-0.5)};
				gallery.find('.tBlock').css({ width:transBlockWidth * 0.5, height:transBlockHeight * 0.5, opacity:0, display:'block', 'background-image':'url('+slideBG+')' });
				sT = sT.sort(randomSort).sort(randomSort);
				for(i = 0,j = sT.length; i<= j; i++){
					delay = ((Math.floor(Math.random()*20)+Math.floor(Math.random()*20))*i)-d/tCount;
					$(sT[i]).delay(delay).animate({ width:transBlockWidth, height:transBlockHeight, opacity:1}, d, function(){transition_complete()});
				}
			},
			drop_curtain:function(c, n, d){
				trans_completed = 0;
				var slideBG = $(slides[n]).find('img').attr('src'), delay, tb, x, y, xu, yu, tB;
				gallery.find('.tBlock').css({ width:transBlockWidth, height:transBlockHeight, opacity:0, display:'block', 'background-image':'url('+slideBG+')' });
				for(y = 0; y<settings.transition.V_Blocks; y++){
					for(x = 0; x<settings.transition.H_Blocks; x++){
						xu = x;
						yu = y;
						if(settings.transition.direction === 'rev'){
							xu = settings.transition.H_Blocks - x - 1;
							yu = settings.transition.V_Blocks - y - 1;
						}
						tB = $('.trans_'+xu+'_'+yu, gallery);
						delay = (80 * x) + (50 * y);
						tB.delay(delay).animate({ opacity:1 }, d, function(){ transition_complete()} );
					}
				}
			},
			fade_curtain: function(c, n, d){
				trans_completed = 0;
				var slideBG = $(slides[n]).find('img').attr('src'), delay, tb, x, y, xu, yu, tB;
				gallery.find('.tBlock').css({ width:transBlockWidth, height:transBlockHeight, opacity:0, display:'block', 'background-image':'url('+slideBG+')' } );
				for(y = 0; y<settings.transition.V_Blocks; y++){
					for(x = 0; x<settings.transition.H_Blocks; x++){
						xu = x;
						yu = y;
						if(settings.transition.direction === 'rev') {
							xu = settings.transition.H_Blocks-x - 1;
							yu = settings.transition.V_Blocks-y - 1;
						}
						tB = $('.trans_'+xu+'_'+yu,gallery);
						delay = (80*x);
						tB.delay(delay).animate({ opacity:1 }, d, function(){ transition_complete() });
					}
				}
			},
			horiz_curtain:function(c, n, d){
				trans_completed = 0;
				var slideBG = $(slides[n]).find('img').attr('src'), delay, tb, x, y, xu, yu, tB;
				gallery.find('.tBlock').css({ width:transBlockWidth, height:transBlockHeight, opacity:0, display:'block', 'background-image':'url('+slideBG+')' });
				for(y = 0; y<settings.transition.V_Blocks; y++){
					for(x = 0; x<settings.transition.H_Blocks; x++){
						xu = x;
						yu = y;
						if(settings.transition.direction === 'rev'){
							xu = settings.transition.H_Blocks-x-1;
							yu = settings.transition.V_Blocks-y-1;
						}
						tB = $('.trans_'+xu+'_'+yu,gallery);
						delay = (80*y);
						tB.delay(delay).animate({ opacity:1 }, d, function(){ transition_complete() });
					}
				}
			},
			fade:function (c, n, d){
				trans_completed = (settings.transition.H_Blocks*settings.transition.V_Blocks) - 1;
				$(slides[c]).fadeOut(d, function(){
					transition_complete()}
				);
				$(slides[n]).fadeIn(d, function(){
					transition_complete()}
				)
			},
			slide:function (c, n, d){
				trans_completed = (settings.transition.H_Blocks*settings.transition.V_Blocks) - 1;
				var curStart = 0, curEnd = 0, nextStart = 0, nextEnd = 0;
				if (n - c > 0){
					nextStart = gallery.width();
					curEnd = -1 * gallery.width()
				} else {
					nextStart = -1 * gallery.width();
					curEnd = gallery.width()
				}
					$(slides[c]).animate({ left:curEnd },d,function(){ $(slides[c]).hide(); transition_complete(); });
					$(slides[n]).css('left', nextStart).show().animate({ left:nextEnd },d,function(){ transition_complete() });
			}
		};
		if (typeof transitions[settings.transition.type] !== 'function'){
			settings.transition.type = 'diag_block'
		}
		function startTimer(){
			elapsedInterval = 0;
			slideTimer = setInterval(timerTick,tickInterval);
			playing = true;
		}
		function stopTimer(){
			clearInterval(slideTimer);
			playing = false;
		}
		function currentSlideDuration(){
			if ($(slides[curSlideIndex]).attr('data-duration')){
				return parseFloat($(slides[curSlideIndex]).attr('data-duration'))
			} else {
				return settings.slideDuration;
			}
		}
		function nextSlide(){
			gotoSlide(nextSlideIndex);
		}
		function timerTick(){
			elapsedInterval += tickInterval;
			var tm = currentSlideDuration();
			if (elapsedInterval/1000 >= tm){
				stopTimer();
				nextSlide()
			} else {
				var pct = (elapsedInterval/(tm*1000))*16;
				if (settings.nav) { var cN = $(navMarkers[curSlideIndex]).find('.slide-nav-progress').css('height',pct); }
			}
		}
		function createGallery(t){
			if (curSlideIndex<0||curSlideIndex>slides.length)curSlideIndex = 0;
			slides.hide();
			$(slides[curSlideIndex]).css('display','block');
			createTransition();
			createNav();
			if (settings.nav) { navMarkers.filter(':eq('+curSlideIndex+')').addClass('slide-nav-current'); }
			startTimer()
		}
		function createNav(){
			if (settings.nav !== true) { return; }
			var navContainer = $('<ul />',{html:''}).addClass('slide-nav-holder'),tmpNav,tmpProgress,tmpFrame;
			for (var i = 0; i < slides.length; i++) {
				tmpNav = $('<li />',{}).addClass('slide-nav-item nav-' + i);
				tmpNav.hover(function(){ $(this).addClass('slide-nav-hover'); }, function(){ $(this).removeClass('slide-nav-hover'); });
				tmpProgress = $('<div />',{}).css({height:0}).addClass('slide-nav-progress');
				tmpFrame = $('<div />',{}).addClass('slide-nav-frame');
				tmpNav.append(tmpProgress).append(tmpFrame).data('slide',i).click(function(){ gotoSlide($(this).data('slide')); }
			);
			navContainer.append(tmpNav)}
			navContainer.appendTo(gallery);
			navMarkers = $('.slide-nav-item', gallery);
		}
		function updateNav(){
			if (settings.nav != true) { return; }
			navMarkers.find('.slide-nav-progress').css('height',0);
			navMarkers.removeClass('slide-nav-current').filter(':eq('+curSlideIndex+')').addClass('slide-nav-current');
		}
		function incrementCurrentSlide(){
			curSlideIndex = nextSlideIndex;
			if (curSlideIndex>slides.length-1) { curSlideIndex = 0; }
			nextSlideIndex = curSlideIndex+1;
			if (nextSlideIndex>slides.length-1) { nextSlideIndex = 0; }
		}
		function set_next_slide_index(i){
			nextSlideIndex = i;
			if (nextSlideIndex>slides.length-1) { nextSlideIndex = 0; }
		}
		function createTransition(){
			if (settings.transition.H_Blocks>40)settings.transition.H_Blocks = 40;
			if (settings.transition.V_Blocks>20)settings.transition.V_Blocks = 20;
			transBlockWidth = (galleryWidth/settings.transition.H_Blocks).toFixed(3);
			transBlockHeight = (galleryHeight/settings.transition.V_Blocks).toFixed(3);
			var transBlocks = '';
			var slideBG = $(slides[curSlideIndex]).find('img').attr('src');
			var tCount = gallery.find('.tBlock').length;
			for(var y = 0;y<settings.transition.V_Blocks;y++){
				yPos = y*transBlockHeight;
				xBPos = 0;
				yBPos = 0;
				for(var x = 0;x<settings.transition.H_Blocks;x++) {
					xPos = x*transBlockWidth;
					transBlocks += '<div class = "tBlock trans_'+x+'_'+y+'" style = "z-index: 20;position: absolute; top: '+yPos+'px; left: '+xPos+'px; width: '+(transBlockWidth)+'px; height: '+(transBlockHeight)+'px; background-position: '+(galleryWidth-xPos)+'px '+(galleryHeight-yPos+1)+'px; background-image: url('+slideBG+'); display: none;"></div>'
				}
			}
			gallery.append(transBlocks)
		}
		function gotoSlide(i){
			if(i == curSlideIndex&&playing === true){
				stopTimer();
				return
			} else if (i == curSlideIndex&&playing === false){
				startTimer();
				return;
			} else{
				stopTimer();
			}
			set_next_slide_index(i);
			transition_slides(curSlideIndex,nextSlideIndex,300)
		}
		function transition_slides(c,n,d){
			transitions[settings.transition.type](c,n,d)
		}
		function transition_complete(){
			trans_completed++;
			if(trans_completed >= settings.transition.H_Blocks*settings.transition.V_Blocks) {
				trans_completed = 0;
				$(slides[nextSlideIndex]).css('display','block');
				$(slides[curSlideIndex]).css('display','none');
				incrementCurrentSlide();
				updateNav();
				startTimer();
				gallery.find('.tBlock').css('display','none')
			}
		}
		createGallery($(this))}
		)}
		}
	)}
)(jQuery);

