/* 
	Affiniscape Creative Services jQuery Plugins
-----------------------------------------------------
	GLOBAL JAVASCRIPT INCLUDE FUNCTIONS
	AUTHOR:	Marcus Ellis
	DATE:	26 May 2010
*/

var j = jQuery.noConflict();
j(document).ready(function($){

	$('body').detectOS().detectBrowser();
	$('body.ie').ie6warning(false);
	$('#maincontenttable, #contentwrappersubtable').adjustModule();
	$('.module').fixCalendar();
	$('#nobackground').adjustNobackground();
	$('#structuraltable').fixLoginScreen();
	$('#returnlinktable').fixReturnLink();
	$('#navleft').fixNavleft().fixLeftFlyouts();
	$('#navtop1, #navtop1list, #navtop2, #navtop2list').fixNavtop();
	$('#navtop1, #navtop1list, #navtop2, #navtop2list, #navleft').addNavHoverClass().addNavCurrentClass();
		
	// Overwrite fixieflyouts.js
	hideBoxes = function() { return false };
   	showBoxes = function() { return false };
   	prepFlyoutLinks = function() { return false };

});

(function ($) {
	$.fn.extend({

/* Automatic Utility Plugins
-------------------------------------------------*/

	// Identify Operating System
	detectOS: function(){
		return this.each(function(){
			var u = 'unknown';
			var os = (/(win|mac|linux|sunos|solaris|iphone|ipad|android)/.exec(navigator.platform.toLowerCase()) || [u])[0];
			os = os.replace('sunos','solaris');
			$(this).addClass(os);
		});
	},
			
	// Identify Browser
	detectBrowser: function(){
		return this.each(function(){
			var b = 'other';
			if ($.browser.msie) { b = 'ie'; }
			else if ($.browser.mozilla) { b = 'mozilla'; }	
			else if ($.browser.webkit) { b = 'webkit'; }
			else if ($.browser.opera) { b = 'opera'; }
			$(this).addClass(b);
		});
	},
			
	// Adjust Module Pages Function
	adjustModule: function() {
		return this.each(function(){
			if ($('#stucturaltable').length == 0 && $('body > table:first').attr('id') == ''){
				$('body > table:first').attr('id','structuraltable');
			}
			if ($(this).length != 0 && $('#maincontentsubcell').length == 0){
				if ($('#content').length != 0) {
					$(this).addClass('m360');
				} else {
					$(this).addClass('module');
					if ($('ul[id^=nav]').length == 0){
						$(this).addClass('login');
					}
				}
			}
		});
	},
	
	// Navigation Hover Class
	addNavHoverClass: function(){
		return this.each(function(){
			var obj = $(this);
			obj.children('li').children('a').hover(
				function(){ $(this).addClass('hover'); },
				function(){ $(this).removeClass('hover'); }
			);
			obj.children('li').children('ul').hover(
				function(){ $(this).prev().addClass('hover').mouseover(); },
				function(){ $(this).prev().removeClass('hover').mouseout(); }
			);
		});
	},

	// Navigation Current Class
	addNavCurrentClass: function(){
		return this.each(function(){
			var obj = $(this);
			var c = window.location.href;
			obj.children('li').children('a').each(
				function(){
					var h = $(this).attr("href");
					if(h && c == this) {
						$(this).parent().addClass("current");
					}
				}
			);
		});
	},

	// Top Navigation Flyout Fix Function
	fixNavtop: function(){
		return this.each(function(){
			$('#navtop1list, #navtop2list').children('li:first-child').addClass('first');
			$('#navtop1list, #navtop2list').children('li:last-child').addClass('last');
			
			// Add class to first flyout
			if ($(this).children('li:first').children('a').length){
				$(this).children('li:first').children('ul').addClass('first');
			// Account for left spacer image
			} else {
				$(this).children('li:first').next('li').children('ul').addClass('first');
			}
			
			// Add class to last flyout
			if ($(this).children('li:last').children('a').length){
				$(this).children('li:last').children('ul').addClass('last');					
			// Account for right spacer image
			} else {
				$(this).children('li:last').prev('li').children('ul').addClass('last');					
			}			
		});
	},

	// Left Navigation Fix Function
	fixNavleft: function(){
		return this.each(function(){
			var i = 0;
			$(this).children('li').each(function (){
				$(this).addClass("nav-left-sub_"+i);
				i++;
			});
		});
	},
			
	// Left Navigation Flyouts
	fixLeftFlyouts: function(){
		return this.each(function() {
			var obj = $(this);
			obj.children('li').children('a').hover(
				function (){ $(this).siblings('ul').show(); },
				function (){ $(this).siblings('ul').hide(); }
			);
			obj.children('li').children('ul').hover(
				function (){ $(this).show(); },
				function (){ $(this).hide(); }
			);
		});
	},

	// Fix Login Screen
	fixLoginScreen: function(){
		return this.each(function(){
			var obj = $(this).children('tbody').children('tr:eq(1)').children('td').children('table:eq(1)');
			if(obj.attr('width') == '80%'){
				obj.attr('width','100%')
					.attr('border',0)
					.attr('bgcolor','')
					.css('display','table')
					.attr('id',function(){
						if ($(this).attr('id') == ""){
							$(this).attr('id','pageheadertable');
						}
					});
				obj.prev('table')
					.attr('id','pageheadertable')
					.attr('bgcolor','')
					.css('display','table');
			}
		});
	},
	
	// Return Link Table Fix
	fixReturnLink: function(){
		return this.each(function(){
			$(this).children('td:first').addClass('first');
			$(this).children('td:last').addClass('last');
		});
	},
	
	// Calendar Table Fix
	fixCalendar: function(){
		return this.each(function(){
			if (window.location.href.indexOf('calendar.cfm') != -1) {
				$('#maincontentcell table').each(function(){
					if ($(this).attr('border') == 1){
						$(this).attr('border',0).attr('cellspacing',1).addClass('calendar');
						$('center center .calendar').addClass('mini');
					}
				});
			} 
		});
	},
	
	// Display Warning for IE6 Users
	ie6warning: function(override){
		return this.each(function(){
			if (($.browser.msie && $.browser.version=="6.0") || override){
				var obj = this;
				$.get('/global/ie6-warning.html', function(data) {
					$(obj).prepend(data);
					$('#ie6warning').slideDown('fast')
					$('#ie6close').click(function(e){
						e.preventDefault();
						$('#ie6warning').slideUp('fast');
					});
				});
			}
		});
	},	


/* On-Demand Utility Methods
-------------------------------------------------*/

	// Clickable Logo
	addClickableLogo: function(s){
		var defaults = {  
			name: 'Association',
			url: '/'
		};
		var s = $.extend(defaults, s);
		return this.each(function() {
			var obj = $(this);
			if ($('#structuraltable').length) {
				obj.append('<div id="logo-click"><a href="'+ s.url +'"><h1>' + s.name + '</h1></a></div>');
			}
		});
	},
	
	// Mega Footer
	addMegaFooter: function(s){
		var defaults = {  
			columns: 24
		};
		var s = $.extend(defaults, s);
		return this.each(function() {
			var obj = $(this);
			var ftr = $('#assnfootercell, #footertablecell').html();
			if (ftr){
				obj.append('<div id="assnfooter"></div>');
				$('#assnfooter').html('<div class="container_'+ s.columns +'">'+ ftr +'<div class="clear" /></div>');
				$('#assnfooterrow, #footertable').remove();
				$('#powered_by').addClass('grid_'+ s.columns);
				$('body > #powered_by').appendTo($('#assnfooter .container_'+ s.columns));
			}
		});
	},
	
	// Nav Accordion
	// Adds a sliding effect to the Flyouts for the Brando theme
	addNavAccordion: function(s){
		var defaults = { 
			openClass: 'open',
			currentClass: 'current'
		};
		var s = $.extend(defaults, s);
		return this.each(function() {
			var obj = $(this);
			obj.children('ul').addClass('nav-accordion-widget').children('li').each(function(){
				$(this).wrapInner('<span></span>');
				$('ul',this).appendTo($(this));
				$('span',this).click(function(e){
					$(this).parent().toggleClass(s.openClass);
					$(this).next('ul').slideToggle();
					e.preventDefault();
				});
			});
			var curr = window.location.href;
			$('ul ul a',obj).each(function(){
				var href = $(this).attr("href");
				if (href && curr == this) {
					$(this).parent('li').addClass(s.currentClass).parent('ul').show().parent('li').addClass(s.openClass);
				}
			});
		});
	},

	// Sliding Flyouts
	// Adds a sliding effect to the Flyouts for the Brando theme
	addSlidingFlyouts: function(s){
		var defaults = { 
			speedDown: 200,
			speedUp: 600, 
			delay: 200
		};  
		var s = $.extend(defaults, s);
		return this.each(function() {
			var obj = $(this);
			obj.children('li').children('ul').hide().bind('mouseover',function(){
				$(this).stop(true, true).slideDown(s.speedDown);
			});
			obj.children('li').hover(
				function(){
					$(this).children('ul').delay(s.delay).stop(true,true).slideDown(s.speedDown);
				},
				function(){
					$(this).children('ul').delay(s.delay).stop(true,true).slideUp(s.speedUp);
				}        
			);
		});
	},
			
	// Fix Invalid Hex Colors (LEGACY - DO NOT DELETE!!!)
	fixHexColors: function() {
		return true;
	},
			
	// Adjust Nobackground Table Function
	// Sets cellpadding and cellspacing to zero for the nobackground table
	adjustNobackground: function() {
		return this.each(function() {
			var obj = $(this);
			obj.children('#miniheadercontenttable').attr('cellpadding','0').attr('cellspacing','0').attr('width','100%');
		});
	},
	
	// Adjust Board of Directors Page Function
	// Hides the hyoerlink table at the top of the Board of Directors page
	adjustBoard: function() {
		return this.each(function() {
			var u = window.location.href;
			var b = "displayboard.cfm";
			if (u.indexOf(b) != -1) {
				$('table:first', this).hide();
			}
		});
	},
	

/* Add-On Widgets
-------------------------------------------------*/
	
	// Rotating Sponsor Box Widget
	// Takes a <ul> and turns it into a simple, random slideshow.
	incSponsorBox: function(s) {
		var defaults = {  
			time: 6,
			shuffle: true,
			caption: false,
			rotate: true
		};  
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
			var i = obj.attr('id');
			var t = s.time * 1000;
			var r = s.shuffle ? 1 : 0;
			var c = s.caption;
			var h = 0;
			
			// Get height of tallest image
			obj.children().each(function(){
				var ht = $(this).children('a').children('img').height() || $(this).children('img').height();
				if (h < ht) {
					h = ht;
				}
			});
			
			// Add caption element
			if (c) { obj.after('<span id="'+ i +'-caption" class="sponsorBox-caption"></span>'); }
			
			if (s.rotate) {
				
				// Call "Cycle" plugin
				obj.addClass('imageRotation')
					.cycle({
						fx: 'fade',
						random: r,
						timeout: t,
						cleartype: 1,
						before: function(){
							if (c){
								$('#'+ i +'-caption').fadeTo(250, 0.01);
							}
						},
						after: function(){
							if (c && $('img', this).attr('alt') != ''){
								$('#'+ i +'-caption').html($('img', this).attr('alt')).fadeTo(100,1,function(){
									if (this.style.removeAttribute) {
										this.style.removeAttribute('filter');
									} else {
										this.style.removeProperty('filter');
									}
								});
							}
						}
					})
					.attr('style', function(){
						if (h > 0) {
							return 'height:'+ h +'px';
						}
					});
				
			// Static Sponsor
			} else {
				var l = $('li',obj).length;
				var i = Math.floor(Math.random() * l);
				$('li',obj).hide().eq(i).show();
				obj.addClass('imageRotation').fadeIn();
			}
			
		});  
	},

	// Rotating Sponsor Carousel Widget
	// Takes a <ul> and turns it into a carousel slideshow.
	incSponsorCarousel: function(s) {
		var defaults = {  
			items: 3,
            showButtons: true,
			speed: 0.5,
			timer: true,
			time: 6,
			width: 285
		};
		var s = $.extend(defaults, s);
		
		return this.each(function(){
			var obj = $(this);
			var pg = 1;
			var t = null;
			
			// Add HTML elements
			obj.wrap('<div class="carousel-widget" style="width:'+s.width+'px"><div style="width:100%"></div></div>');
			
			// Add empty items
			var items = $('li', obj).length;
			var e = s.items - (items % s.items);
			if (e != 0 && e != s.items){
				for (var n=0; n<e; n++){
	         		obj.append('<li class="empty" />');
				}
        	}
			
			// Clone items
        	$('li',obj).filter(':first').before($('li',obj).slice(- s.items).clone().addClass('cloned'));
    	    $('li',obj).filter(':last').after($('li',obj).slice(s.items, s.items*2).clone().addClass('cloned'));
	        
			// Scroll behavior
			obj.parent().scrollLeft(s.width);
			var pages = Math.ceil(items / s.items);            
			function gotoPage(p){
				var dir = p < pg ? -1 : 1;
				var n = Math.abs(pg - p);
				var left = s.width * dir * n;
				
				obj.parent().filter(':not(:animated)').animate({
					scrollLeft : '+=' + left
				}, s.speed * 1000, function () {
					if (p == 0) {
						obj.parent().scrollLeft(s.width * pages);
						p = pages;
					} else if (p > pages) {
						obj.parent().scrollLeft(s.width);
						p = 1;
					} 
					pg = p;
				});
				if (s.timer){
					clearTimeout(t);
					t = setTimeout("j('.carousel-widget #sc-next-btn').click();", s.time * 1000);
				}
				return false;
			}
			if (s.timer){
				t = setTimeout("j('.carousel-widget #sc-next-btn').click();", s.time * 1000);
			}
			
			// Create and Bind the buttons
            obj.after('<a id="sc-prev-btn" class="carousel-btn">Previous</a><a id="sc-next-btn" class="carousel-btn">Next</a>');
            $('.carousel-widget #sc-prev-btn').click(function(){
                gotoPage(pg - 1);                
            });		
            $('.carousel-widget #sc-next-btn').click(function(){
                gotoPage(pg + 1);
            });

			// Hide Buttons
			if (s.showButtons == false){
				$('.carousel-btn').hide();
            }
		});  
	},

	// Rotating Marketing Banner Widget
	// Takes a <ul> and turns it into a complex slideshow.
	incMarketingBanner: function(s) {
		var defaults = {  
			transition: 'fade',
			easing: null,
			time: 6,					// in seconds
			speed: 1,					// in seconds
			activeClass: 'activeSlide',
			showPager: false,
			pagerText: 'numbers',
			showButtons: false,
			buttonText: {
				prevText: 'Previous',
				nextText: 'Next'
			},
			showPauseBtn: false,
			pauseBtnText: {
				playText: 'Play',
				pauseText: 'Pause'
			},
			showCaptions: false,
			captionEvent: 'static',		// hover, change, static
			captionEffect: 'fadeIn',	// fadeIn, fadeOut, slideIn, slideOut
			captionSpeed: 0.4			// in seconds
		};
		var s = $.extend(defaults, s);
		
		return this.hide().each(function() {
			var obj = $(this);
			var cs = s.captionSpeed * 1000;
			var delay = (s.time - (s.captionSpeed * 3)) * 1000;
			
			// Get height of tallest image
			var h = 0;
			obj.children('li').each(function(){
				var ht = $(this).children('a').children('img').height() || $(this).children('img').height();
				if (h < ht) { h = ht; }
			});
						
			// Add Pager Buttons
			if (s.showPager){ obj.after('<div id="pager-btns"></div>'); }
			
			// Add Prev/Next Buttons
			if (s.showButtons){ obj.after('<a id="prev-btn" class="banner-btn" title="'+ s.buttonText.prevText +'">'+ s.buttonText.prevText +'</a><a id="next-btn" class="banner-btn" title="'+ s.buttonText.nextText +'">'+ s.buttonText.nextText +'</a>'); }
			
			// Add Play/Pause Buttons
			if (s.showPauseBtn){ obj.after('<a id="pause-btn" href="#" title="'+ s.pauseBtnText.pauseText +'">'+ s.pauseBtnText.pauseText +'</a><a id="play-btn" href="#" title="'+ s.pauseBtnText.playText +'">'+ s.pauseBtnText.playText +'</a>'); }
			
			// Add Captions
			if (s.showCaptions) {
				$('li', obj).each(function(){
					var alt = $('img',this).attr('alt');
					if (alt){
						$(this).append('<div class="caption"><span>'+alt+'</span></div>');
					}
				
					// Caption Effects
					if (s.captionEvent == 'hover'){
						
						if (s.captionEffect == 'fadeIn'){
							$('.caption',this).hide();
							$(this).hover(
								function(){ $('.caption',this).fadeIn(cs); },
								function(){ $('.caption',this).fadeOut(cs); }
							);
						
						} else if (s.captionEffect == 'fadeOut'){
							$('.caption',this).show();
							$(this).hover(
								function(){ $('.caption',this).fadeOut(cs); },
								function(){ $('.caption',this).fadeIn(cs); }
							);
						
						} else if (s.captionEffect == 'slideIn'){
							$('.caption',this).hide();
							$(this).hover(
								function(){ $('.caption',this).slideDown(cs); },
								function(){ $('.caption',this).slideUp(cs); }
							);
						
						} else if (s.captionEffect == 'slideOut'){
							$('.caption',this).show();
							$(this).hover(
								function(){ $('.caption',this).slideUp(cs); },
								function(){ $('.caption',this).slideDown(cs); }
							);
						}
						
					}
				});
			}
			
			// Call "Cycle" plugin
			var sc ='';
			obj.parent().addClass('mktg-banner-widget');
			obj.addClass('imageRotation').cycle({
				fx: s.transition,
				easing: s.easing,
				timeout: s.time * 1000,
				speed: s.speed * 1000,
				pager: '#pager-btns',
				next: '#next-btn',
				prev: '#prev-btn',
				activePagerClass: s.activeClass,
				before: function(){
					if (s.captionEvent == 'change'){
						$('.caption',this).hide();
					}
				},
				after: function(){
					if (s.captionEvent == 'change'){
						if (s.captionEffect == 'fadeIn' || s.captionEffect == 'fadeOut'){
							$('.caption',this).fadeIn(cs);
							clearTimeout(sc);
							sc = setTimeout("j('.caption').fadeOut("+cs+");", delay);
							
						} else if (s.captionEffect == 'slideIn' || s.captionEffect == 'slideOut'){
							$('.caption',this).slideDown(cs);
							clearTimeout(sc);
							sc = setTimeout("j('.caption').slideUp("+cs+");", delay);
						}
					}
				}
			}).attr('style', function(){
				if (h > 0) {
					return 'height:'+ h +'px';
				}
			});
			
			// Change Pager Buttons Text
			if (s.showPager){
				if (s.pagerText == 'imgAlt'){
					var p = 0;
					$('#pager-btns a').each(function(){
						var alt = $('li:eq('+p+') img',obj).attr('alt');
						$(this).text(alt);
						p++;
					});
				}
			}
			
			// Bind Play/Pause Buttons
			if (s.showPauseBtn){
				$('#pause-btn').click(function(e){
					e.preventDefault();
					obj.cycle('pause');
					$(this).hide();
					$('#play-btn').show();
				});
				$('#play-btn').click(function(e){
					e.preventDefault();
					obj.cycle('resume').cycle('next');
					$(this).hide();
					$('#pause-btn').show();
				});
				$('#play-btn').hide();
			}
		
		}).fadeIn();  
	},

	// Header Banner Widget
	// Takes a <ul> with a passed id and turns it into a simple slideshow for use in the header of the website.
	incHeaderBanner: function(s) {
		var defaults = {  
			time: 6,
			shuffle: false,
			rotate: true
		};
		var s = $.extend(defaults, s);
		
		return this.hide().each(function() {
			var obj = $(this);
			var t = s.time * 1000;
			var r = s.shuffle ? 1 : 0;
			var h = 0;
			
			// Get height of tallest image
			obj.children().each(function(){
				var ht = $(this).children('a').children('img').height() || $(this).children('img').height();
				if (h < ht) {
					h = ht;
				}
			});
			
			// Rotating Header Banner
			if (s.rotate) {
				obj.addClass('imageRotation').cycle({
					fx: 'fade',
					random: r,
					timeout: t
				})
				.attr('style', function(){
					if (h > 0) {
						return 'height:'+ h +'px';
					}
				}).wrap('<div id="header-banner-widget" class="rotating header-banner-widget"></div>').fadeIn();
				
			// Static Header Banner
			} else {
				var l = $('li',obj).length;
				var i = Math.floor(Math.random() * l);
				$('li',obj).hide().eq(i).show();
				obj.addClass('imageRotation').wrap('<div id="header-banner-widget" class="static header-banner-widget"></div>').show();
			}
		});  
	},

	// Login Widget
	// Adds iframe to cafe.cfm, which in turn replaces the contents of the loginform element
	incLoginWidget: function(s) {
		var defaults = {
			url: '/cafe.cfm',
			showLabels: true,
			showAutoLogout: true,
			showForgotUser: true,
			showForgotPass: true,
			forgotUserText: 'Forgot your username?',
			forgotPassText: 'Forgot your password?',
			buttonType: 'image',
			buttonText: 'Login',
			buttonImage: '/global/imgs/btn-login.png',
			hoverImage: '/global/imgs/btn-login-hover.png'
		};
		var s = $.extend(defaults, s);
		
		return this.addClass('loading').each(function() {
			var obj = $(this);
						
			$.ajax({
				url: s.url + '?act=member.showlogin',
				type: 'GET',
				dataType: 'html',
				success: function(data) {
					
					// Get Server Response & insert into document
					if (typeof data == 'string'){
						var content = data.replace(/<!doctype.*?>/gi, '').replace(/window\.parent\.document\.getElementById\(\'a1\'\)\.innerHTML = \'.*?\'/gim, '');
					} else {
						var content = data.responseText.replace(/<!doctype.*?>/gi, '').replace(/window\.parent\.document\.getElementById\(\'a1\'\)\.innerHTML = \'.*?\'/gim, '');
					}
					obj.hide().html(content);
					obj.removeClass('loading').show();
					
					// Toggle Login Button Image on Hover
					if (s.buttonType == 'image'){
						$('#loginbutton', obj)
							.attr('src', s.buttonImage)
							.bind('mouseover mouseout', function(event) {
							if (event.type == 'mouseover') {
								$(this).attr('src',s.hoverImage);
							} else {
								$(this).attr('src',s.buttonImage);
							}
						});
					} else {
						$('#loginbutton', obj).remove();
						$('.forgotpass', obj).after('<input type="submit" name="loginbutton" id="loginbutton" value="'+ s.buttonText + '" />');
					}
					
					// Labels
					if (s.showLabels == false) {
						$('.login-label', obj).remove();
					}

					// Auto-logout
					if (s.showAutoLogout == false) {
						$('#auto-logout', obj).remove();
					}

					// Forgot Username Link
					if (s.showForgotUser == false) {
						$('.forgotuser', obj).remove();
					} else {
						$('.forgotuser', obj).html(s.forgotUserText);
					}

					// Forgot Password Link
					if (s.showForgotPass == false) {
						$('.forgotpass', obj).remove();
					} else {
						$('.forgotpass', obj).html(s.forgotPassText);
					}

					// Toggle background text for username & password input fields
					var c = 'login-bkgd';
					$('.qlogin-input', obj).addClass(c);
					$('.qlogin-input', obj).bind('focus', function(){
						$(this).removeClass(c);
					}).bind('blur', function(){
						if (!$(this).val()) {
							$(this).addClass(c);
						} else {
							$(this).removeClass(c);
						}
					});
					
					// Do callback function
					if (typeof s.callback == 'function'){ s.callback.call(this, data); }
				}
			});
		});  
	},

	// Search Widget
	// Inserts a simple form into an element with the id of Search-widget
	incSearchWidget: function(s) {
		var defaults = {
			formAction: '/searchsite.cfm',
			placeholder: '',
			showLabel: true,
			labelText: 'Search', 
			showButton: true,
			buttonType: 'image',
			buttonText: 'Search',
			buttonImage: '/global/imgs/btn-search.png',
			hoverImage: '/global/imgs/btn-search-hover.png'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
						
			// Test for placeholder support
			var p = document.createElement('input');
			var placehold = !! (p.placeholder === "") && !!(p.placeholder !== "undefined");
			
			// Append HTML
			obj.append('<form action="' +s.formAction +'" method="get" name="searchsite" id="search-form"></form>');
			if (s.showLabel){
				obj.children('#search-form').append('<label for="search-field">' + s.labelText +'</label>');
			}
			var phText = s.placeholder ? 'placeholder="'+s.placeholder+'"' : '';
			obj.children('#search-form').append('<input type="text" name="searchvalue" id="search-field" '+ phText +' />');
			if (s.showButton){
				if (s.buttonType == 'image'){
					obj.children('#search-form').append('<input type="image" name="submit" id="search-button" src="'+ s.buttonImage +'" />');
					$('#search-button').hover(
						function(){
							$(this).attr('src',s.hoverImage);
						},
						function(){
							$(this).attr('src',s.buttonImage);
						}
					);
				} else {
					obj.children('#search-form').append('<input type="submit" name="submit" id="search-button" value="'+ s.buttonText +'" />');
				}
			}
			obj.addClass('loaded');

			// Toggle placeholder text (for IE) and background class for search field
			var c = 'search-bkgd';
			$('#search-field', obj).addClass(c);
			if (!placehold && s.placeholder) {
				$('#search-field', obj).val($('#search-field', obj).attr('placeholder'));
			}
			$('#search-field', obj).bind('focus', function(){
				$(this).removeClass(c);
				if (!placehold && s.placeholder && $(this).val() == $(this).attr('placeholder')) {
					$(this).val('');
				}
			});
			$('#search-field', obj).bind('blur', function(){
				if (!$(this).val()) {
					$(this).addClass(c);
					if (!placehold && s.placeholder) {
						$(this).val($(this).attr('placeholder'));
					}
				} else {
					$(this).removeClass(c);
				}
			});
		});
	},

	// 24x7 Calendar Widget
	// Inserts the 24x7 Calendar Feed.
	inc247events: function(s) {
		var defaults = {  
			url: '/feeds/getEvent.cfm',
			style: 'compact',
			items: 4,
			sortBy: 'eventDate',
			sortDir: 'asc',
			minDate: 'today',
			showDesc: false,
			dateFormat: 'parts',
			showLink: true,
			linkUrl: '/calendar.cfm',
			linkText: 'View All Events'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
			
			obj.addClass('events-widget').addClass('loading');
			var data = 	'perPage='+ s.items +'&sortBy='+ s.sortBy +'&sortDir='+ s.sortDir +'&minDate='+ s.minDate +'&showDesc='+ s.showDesc +'&formatOfDates='+ s.dateFormat;
			$.ajax({
				url: s.url,
				data: data,
				type: 'GET',
				dataType: 'html',
				success: function(data) {
					
					// Get Server Response & insert into document
					data = data.replace(/document.write\(\'/gi, '').replace(/\'\)\;/gi, '').replace(/\\\'/gi, '\'').replace(/\\n/gi, '').replace(/\\t/gi, '').replace(/\\"/gi, '"');
					obj.hide().html(data);
					$('h3', obj).remove();
					obj.addClass(s.style).removeClass('loading').show();
					
					// Show Link
					if (s.showLink){ obj.append('<div id="view-calendar"><a href="'+ s.linkUrl +'">'+ s.linkText +'</a></div>'); }
					
					// Do callback function
					if (typeof s.callback == 'function'){ s.callback.call(this, data); }
				}
			});
		});  
	},
	
	// 360 Calendar Widget
	// Inserts the 360 Calendar.  Requires some server side configuration. See Twiki documentation.
	inc360events: function(s) {
		var defaults = {  
			url: 'http://internal.affiniscape.com/calendar.aspx',  
			style: 'full',  
			items: 4,
            cache: true,
			showLink: true,
			linkText: 'View All Events'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
			var num = s.items - 1;

			var pro = s.url.split(/\/+/g)[0];
			var dom = s.url.split(/\/+/g)[1];
			var base = pro +'//'+ dom;
            
			obj.addClass('events-widget').addClass('loading');
            
			// Load from Session Cache
            if (s.cache && window.sessionStorage && sessionStorage.cache360events) {
                $(obj).removeClass('loading').addClass(s.style).html(sessionStorage.cache360events);
                return true;
            }
            
			$.ajax({
				url: s.url,
				type: 'GET',
				dataType: 'html',
				error: function(){
					obj.html('<strong style="color:#E00">Failed to load events.</strong>').removeClass('loading');
				},
				success: function(data){
					
					// Get Server Response & insert into document
					var content = $(data.responseText).find('#content').html();
					obj.hide().html(content);
					
					// Remove unnecessary HTML elements
					$('script, .filter, *:empty, h3, #page_title_area, #ctl00_phUserMessage, .event_table', obj).remove();

					// Move rows into first table
					$('.event_list:first-child', obj).attr('id', 'calendar-list');
					$('#calendar-list', obj)
						.append($('.event_list tr', obj))
						.removeAttr('class')
						.parent()
							.before('<ul id="events-list"></ul>');
							
					// View Calendar Link
					if (s.showLink){
						var viewLink = '<div id="view-calendar"><a href="' + s.url + '">'+ s.linkText +'</a></div>';
						obj.append(viewLink);
					}
					
					// Limit number of rows 
					$('#calendar-list tr:gt('+ num +')', obj).remove();
											
					// Add sequential & odd/even ids & classes
					$('#calendar-list tr', obj).each(function(i){
						i++;
						$('#events-list', obj).append('<li id="row-' + i + '"></li>');
						$(this).children('td').each(function(n){
							var c = $(this).attr('class') || 'event_details';
							$('#row-' + i).append('<div class="' + c + '"></div>');
							$(this).children().each(function(){
								$('#row-' + i).children('div').eq(n).append($(this));
							});
							n++;
						});
					});
					$('#events-list li:odd', obj).addClass('even_row');
					$('#events-list li:even', obj).addClass('odd_row');
					
					// Update Hyperlinks
					var c = location.href;
					var p = c.split(/\/+/g)[0];
					var d = c.split(/\/+/g)[1];
					var curr = p +'//'+ d;
					var l = 0;
					$('#events-list li a').each(function(){
						var ref = $(this).attr('href');
						if (ref.indexOf('://') == -1) {
							if (ref.indexOf('/') != 0) {
								ref = "/" + ref;
							}
							ref = base + ref;
							$(this).attr('href', ref);
							l++;
						} else if (ref.indexOf(curr) != -1) {
							var i = curr.length;
							ref = base + ref.slice(i);
							$(this).attr('href', ref);
							l++;
						}
					});
					
					// Remove old/unused tables & show Calendar
					$('#calendar-list', obj).parent().remove();
					obj.addClass(s.style).removeClass('loading').show();

					// Do callback function
					if (typeof s.callback == 'function'){ s.callback.call(this, data); }
					
                    // Cache server response
                    if(s.cache && window.sessionStorage){
                        sessionStorage.setItem('cache360events',$(obj).html());
                    }
				}
			});
		});  
	},
	
	// 360 Calendar Widget (using Yahoo! Pipes)
	// Inserts the 360 Calendar.  See Twiki documentation.
	new360events: function(s) {
		var defaults = {  
			url: 'http://internal.affiniscape.com/calendar.aspx',  
			style: 'full',  
			items: 4,
			cache: true,
			showLink: true,
			linkText: 'View All Events',
			selector: $(this).selector
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var id = $(this).attr('id');
			s.cacheId = 'cache360'+ id.replace(/\W/g,'');
			settings_360events[id] = s;

			$(this).addClass('events-widget loading').hide();
			
			// Load from Session Cache
			if (s.cache && window.sessionStorage && sessionStorage[s.cacheId]) {
				$(this).removeClass('loading').addClass(s.style).html(sessionStorage[s.cacheId]).show();
				return true;
	
			// Load from Yahoo Pipes
			} else {	
				var newScript = document.createElement('script');
				newScript.type = 'text/javascript';
				newScript.src = 'http://pipes.yahoo.com/pipes/pipe.run?_id=d8ea1c73c99599dfb6c386b43d28a8eb&_render=json&_callback=pipe360events&uid='+ id +'&url='+ escape(s.url.replace(/https/,'http'));
				document.getElementsByTagName("head")[0].appendChild(newScript);
			}
		});
	},

	// YouTube Video Gallery Widget
	// Gets a feed of videos from the YouTube API for a specified user, and then loads the first video into a player.
	incYouTubeWidget: function(s) {
		var defaults = {  
			user: 'affiniscape',  
			pager: 'text',
			items: 4,
			height: 320,
			width: 480,
			autoPlay: false,
			selector: $(this).selector
		};
		var s = $.extend(defaults, s);
		settings_youtubeWidget = s;
		
		return this.each(function() {
			$(this).addClass('youtube-widget loading').hide();
			
			// Call Feed API
			/*var newScript = document.createElement('script');
			newScript.type = 'text/javascript';
			newScript.src = 'http://gdata.youtube.com/feeds/api/users/'+ s.user +'/uploads?alt=json&max-results='+ s.items +'&callback=loadYouTubeWidget';
			document.getElementsByTagName("head")[0].appendChild(newScript);
			*/
			$.getScript('http://gdata.youtube.com/feeds/api/users/'+ s.user +'/uploads?alt=json&max-results='+ s.items +'&callback=loadYouTubeWidget');

		});
	},

	// RSS Feed Widget
	// Gets an RSS feed from the specified URL and creates a <ul> using the default callback function.
	incFeedWidget: function(s) {
		var defaults = {  
			url: 'http://www.affiniscapeblog.com/feed/',  
			items: 4,
			showDesc: false,
			descLength: false,
			showDate: false,
			showTime: false,
			dateFormat: 'long',
			linkTarget: '_blank',
			callbackName: 'pipeRssFeed',
			selector: $(this).selector
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var id = $(this).attr('id');
			settings_rssFeed[id] = s;
			$(this).html('<p style="text-align: center;">Loading Feed&hellip;</p>').addClass('rss-feed-widget loading');
			$.getScript('http://pipes.yahoo.com/pipes/pipe.run?_id=364d2d77dcdab52fcd1cda8508e2c203&_render=json&_callback='+ s.callbackName + '&url=' + escape(s.url) + '&items=' + s.items + '&uid=' + id);
		});
	},

	// Featured Jobs Widget
	// Inserts featured jobs from Career Center.
	incFeaturedJobs: function(s){
		var defaults = {
			baseUrl: 'http://pipes.yahoo.com/pipes/pipe.run?_id=d74eeb77877fdd49c4a73221a10c055f&_render=json&_callback=pipeFeaturedJobs&url=',
			url: 'tpta.associationcareernetwork.com',
			ccID: 'PT.TX',
			items: 5,
			showLocation: true,
			showDescription: false,
			showAllIndustryJobs: false,
			showSearchJobs: true,
			showPostJobs: true,
			searchJobsText: 'Search Jobs',
			postJobsText: 'Post Jobs',
			selector: $(this).selector
		};
		var s = $.extend(defaults, s);
		settings_featuredJobs = s;

		var loc = s.showLocation ? 'y' : 'n';
		var desc = s.showDescription ? 'y' : 'n';
		var all = s.showAllIndustryJobs ? 'y' : 'n';

		return this.each(function(){
			$(this).addClass('featured-jobs-widget loading').hide();

			//Load jobs from Yahoo Pipes.
			var newScript = document.createElement('script');
			newScript.type = 'text/javascript';
			newScript.src = s.baseUrl + escape('http://'+ s.url +'/Common/featuredjobs.aspx?abbr='+ s.ccID +'&count='+ s.items +'&loc='+ loc +'&desc='+ desc +'&order=random&link=popup&allgroup='+ all);
			document.getElementsByTagName("head")[0].appendChild(newScript);
		});							
	},
	
	// Tabbed Content Widget
	// Turns a section of HTML content into a tabbed content widget.
	incTabsWidget: function(s){
		var defaults = {  
			key: 'h3',
			start: 1,
			sameHeight: false,
			selectedClass: 'selected'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
			var i = s.start - 1;
			
			// Construct HTML
			$(obj).addClass('tab-widget').prepend('<ul id="tab-menu"></ul>');
			var n = 0;
			$(s.key, obj).each(function(){
				n++;
				$(this).nextUntil(s.key).wrapAll('<div class="tab-content" id="tab'+n+'" style="display:none;"></div>');
				$('#tab-menu').append('<li><a href="#tab'+n+'"><span>'+$(this).text()+'</span></a></li>');
			}).remove();
			$('#tab-menu li:first').addClass('first');
			$('#tab-menu li:last').addClass('last');
			
			// Show starting tab
			$('#tab-menu li:eq('+i+')', obj).addClass(s.selectedClass);
			$('.tab-content:eq('+i+')', obj).addClass(s.selectedClass).show();
			
			// Make same height
			if (s.sameHeight){
				var h = 0;
				$('.tab-content',obj).each(function(){
					var ht = $(this).height();
					if (ht > h){ h = ht; }
				}).height(h);
			}
			
			// Bind the Click event
			$('#tab-menu a', obj).click(function(){
				$('#tab-menu li', obj).removeClass(s.selectedClass);
				$('.tab-content', obj).removeClass(s.selectedClass).hide();
				$(this).parent().addClass(s.selectedClass);
				var href = $(this).attr('href');
				var h = href.lastIndexOf('#');
				var id = href.slice(h);
				$(id, obj).addClass(s.selectedClass).show();
				return false;
			});

		});  
	},

	// Accordion Helper Widget
	// Turns a section of HTML content into a vertical accordion content widget.
	incAccordionWidget: function(s){
		var defaults = {  
			key: 'h3',
			autoHeight: true,
			collapsible: false
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);

			$(s.key, obj).each(function(){
				$(this).wrapInner('<a href="#"></a>').nextUntil(s.key+', .end').wrapAll('<div class="panel"></div>');
			});
			var func = "j('#"+ obj.attr('id') +"').accordion({";
				func += "header:'"+ s.key +"',autoHeight:"+ s.autoHeight +",collapsible:"+ s.collapsible;
				func += "});"
			setTimeout(func,100);
		});  
	},

	// News Ticker Widget
	// Takes a <ul> of text or links and turns it into a simple slideshow.
	incNewsWidget: function(s) {
		var defaults = {  
			time: 6,
			charLimit: 100,
			shuffle: false,
			effect: 'slide',
			direction: 'up'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
			var t = s.time * 1000;
			var r = s.shuffle ? 1 : 0;
			var f = s.effect;
			var d = s.direction;
			var l = s.charLimit;
			
			// Truncate text
			obj.children('li').children('a').each(function(){
				var text = $(this).text();
				if (text.length > l) {
					text = text.substr(0, l-3);
					text += '...';
					$(this).text(text);
				}
			});
			
			// Set direction for slide
			if (f == 'slide') {
				d = d.charAt(0).toUpperCase() + d.substr(1);
				f = 'scroll' + d;
			}

			// Call "Cycle" plugin
			obj.cycle({
				fx: f,
				random: r,
				timeout: t
			});
			
		});  
	},

	// Contact Form Widget
	// Sends an email to the specified email address.
	incContactWidget: function(s) {
		var defaults = {
			template: '/global/widgets/contact-template.html',
			sendto: 'marcus@affiniscape.com',
			showLabels: true,
			buttonType: 'html',
			buttonText: 'Submit',
			buttonImage: '/global/imgs/btn-submit.png',
			hoverImage: '/global/imgs/btn-submit-hover.png'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
			
			obj.addClass('contact-widget').addClass('loading');
			obj.load(s.template,function(){
				
				// Manipulate Template
				$('#cf-sendto',obj).val(s.sendto);
				$('#cf-subject',obj).val(s.subject);
				if (!s.showLabels){
					$('label',obj).remove();
				}
								
				// Change Button Type
				if (s.buttonType == 'html'){
					$('#cf-submit',obj).val(s.buttonText);
				} else {
					$('#cf-submit',obj).remove();
					$('form',obj).append('<input type="image" name="submit" id="cf-submit" src="'+ s.buttonImage +'" />');
					$('#cf-submit',obj).attr('src',s.buttonImage).hover(function(){
						$(this).attr('src',s.hoverImage);
					},function(){
						$(this).attr('src',s.buttonImage);
					});
				}
				
				// Ajax Form Submission
				$('form',obj).submit(function(e){
					e.preventDefault();
					$('#cf-progress',obj).show();
					$('#cf-error,#cf-submit',obj).hide();
					$('#cf-error',obj).html('');
					var valid = true;
					var error = '';
					
					// Require Fields
					$('.require',obj).each(function(){
						if ($(this).val() == ''){
							$(this).addClass('required');
							error += '"'+ $(this).prev('label').html() +'" is required.<br>';
							valid = false;
						}
					});
					
					// Validate Email
					$('.validate',obj).each(function(){				
						if (!validateEmail($(this).val())){
							$(this).addClass('required');
							error += 'Please enter a valid email address.';
							valid = false;
						}
					});
					
					// Block Nikki
					if ($('#cf-email').val() == 'njeske@affiniscape.com') {
						error = 'Anti-Nikki filter is in place.  Sorry. :P';
						valid = false;
					}
					
					// Submit Form
					if (valid){
						$.post($('form',obj).attr('action'), $('form',obj).serialize(), function(data){
							obj.html(data);
						});
					} else {
						$('#cf-error',obj).html(error).fadeIn();
						$('#cf-progress',obj).hide();
						$('#cf-submit',obj).show();
					}
					
				});
				
				// Remove Required Class on Change
				$('input[type="text"],textarea', obj).change(function(){
					$(this).removeClass('required');
				});
	
				// Toggle class for input fields
				var c = 'cf-bkgd';
				$('input[type="text"],textarea', obj)
					.addClass(c)
					.bind('focus', function(){
						$(this).removeClass(c);
					})
					.bind('blur', function(){
						if (!$(this).val()) {
							$(this).addClass(c);
						} else {
							$(this).removeClass(c);
						}
					});
			}).removeClass('loading');
		});
	},
	
	// Newsletter Subscription Widget
	// Sends an email to add/remove email addresses from the mailing list.
	incNewsletterWidget: function(s) {
		var defaults = {  
			sendto: 'marcus@affiniscape.com',
			subject: 'Newsletter Subscription Submission',
			action: 'Add',
			confirmation: false,
			showAction: false,
			showName: true,
			showLabels: true,
			buttonType: 'html',
			buttonText: 'Submit',
			buttonImage: '/global/imgs/btn-submit.png',
			hoverImage: '/global/imgs/btn-submit-hover.png'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
			
			obj.addClass('newsletter-widget').addClass('loading');
			obj.load('/global/widgets/newsletter-template.html',function(){
				
				// Manipulate Template
				$('#ns-sendto',obj).val(s.sendto);
				$('#ns-subject',obj).val(s.subject);
				if (!s.showLabels){
					$('label',obj).remove();
				}
				if (!s.showName){
					$('#signup-name',obj).remove();
				}
				
				// Send Confirmation Email
				if (s.confirmation){
					$('#ns-confirm',obj).attr('value','true');
				} else {
					$('#ns-confirm',obj).attr('value','false');
				}
				
				// Change Action Type & Display
				if (s.showAction){
					$('#ns-action option[value="'+s.action+'"]',obj).attr('selected','selected');
				} else {
					$('#signup-action',obj).remove();
					$('form',obj).append('<input type="hidden" name="action" value="'+ s.action +'" />');
				}
				
				// Change Button Type
				if (s.buttonType == 'html'){
					$('#ns-submit',obj).val(s.buttonText);
				} else {
					$('#ns-submit',obj).remove();
					$('form',obj).append('<input type="image" name="submit" id="ns-submit" src="'+ s.buttonImage +'" />');
					$('#ns-submit',obj).attr('src',s.buttonImage).hover(function(){
						$(this).attr('src',s.hoverImage);
					},function(){
						$(this).attr('src',s.buttonImage);
					});
				}
				
				// Ajax Form Submission
				$('form',obj).submit(function(e){
					e.preventDefault();
					$('#ns-progress',obj).show();
					$('#ns-error,#ns-submit',obj).hide();
					$('#ns-error',obj).html('');
					var valid = true;
					
					// Validate Name
					if (s.showName && $('#ns-name',obj).val() == ''){
						$('#ns-name',obj).addClass('required');
						$('#ns-error',obj).html('Please enter your name.<br>');
						valid = false;
					}
					
					// Validate Email
					var email = $('#ns-email',obj).val();
					if (email == '' || !validateEmail(email)){
						$('#ns-email',obj).addClass('required');
						$('#ns-error',obj).html($('#ns-error',obj).html() + 'Please enter a valid email address.');
						valid = false;
					}
					
					// Submit Form
					if (valid){
						$.post($('form',obj).attr('action'), $('form',obj).serialize(), function(data){
							obj.html(data);
						});
					} else {
						$('#ns-error',obj).fadeIn();
						$('#ns-progress',obj).hide();
						$('#ns-submit',obj).show();
					}
					
				});
				
				// Remove Required Class on Change
				$('#ns-name, #ns-email', obj).change(function(){
					$(this).removeClass('required');
				});
	
				// Toggle class for input fields
				var c = 'ns-bkgd';
				$('#ns-name, #ns-email', obj).addClass(c);
				$('#ns-name, #ns-email', obj).bind('focus', function(){
					$(this).removeClass(c);
				});
				$('#ns-name, #ns-email', obj).bind('blur', function(){
					if (!$(this).val()) {
						$(this).addClass(c);
					} else {
						$(this).removeClass(c);
					}
				});
			}).removeClass('loading');
		});
	},

	// Survey Widget
	incSurveyWidget: function(s) {
		var defaults = {
			errorText: 'Please Answer All Questions!'
		};
		var s = $.extend(defaults, s);
		var sw_id = 0;
		
		return this.each(function() {
			var obj = $(this);
			
			var st = $(obj).addClass('survey-widget').addClass('loading').text();
			sw_id = st.match(/\d+/);
			
			// Load Poll
			if (sw_id){
				var url = '/poll.cfm?pollnbr='+ sw_id;
				$.get(url, function(data){
					$(obj).removeClass('loading').html($(data).find('#pollForm'));
					
					// Remove Javascript & Styles
					$('#pollForm', obj).removeAttr('onsubmit');
					$('#pollForm input', obj).removeAttr('onclick');
					$('.pollCont', obj).removeAttr('style');
					$('.pollCont td', obj).removeAttr('bgcolor').removeAttr('bgColor');
					$('.pollComment textarea', obj).removeAttr('onBlur').removeAttr('onchange').removeAttr('onkeypress').removeAttr('onkeyup');
					
					// Move content around
					$('#pollForm', obj).append('<h3>'+ $('.pollHead').html() +'</h3>');
					$('#pollForm', obj).append($('.pollIntro').html());
					$('#pollForm', obj).append($('.pollCont > tbody > tr > td > table'));
					
					// Comments
					$('.pollComment textarea', obj).keypress(function(event){
						var k = event.which;
						var c = String.fromCharCode(k);
						if ((k == 0 || k == 8) || ($(this).val().length <= 500 && (c != '>' && c != '<'))){
							$('#ComCt').text($(this).val().length);
						} else {
							return false;
						}
					});
					
					// Remove Container
					$('.pollCont').remove();
					
					// Bind Submit
					$('#pollForm').live('submit',function(event){
						event.preventDefault();
						$(obj).addClass('loading');
						var url = $(this).attr('action');
						var data = $(this).serialize();
						$.ajax({
							type: 'POST',
							url: url,
							data: data,
							success: function(data) {
								if ($(data).find('#pollForm').length){
									alert(s.errorText);
									$(obj).html('Loading Survey #'+ sw_id).incSurveyWidget();
								} else {
									$(obj).removeClass('loading').addClass('results');
									if ($(data).find('table:eq(1)').length){
										$(obj).html($(data).find('table:eq(1)'));
										$('.survey-widget > table > tbody > tr:first > td > font').wrapInner('<h3></h3>').children('h3').prependTo('#survey-widget');
										$('.survey-widget > table > tbody > tr:first').remove();
										$('.survey-widget > table > tbody > tr:last').remove();
										$('td[valign="top"]', obj).attr('align','right').attr('width','20');
									} else {
										$(obj).html($(data).find('font').first());	
									}
								}
							}
						});
					});
				});
				
			} else {
				$(obj).html('<h2>No Survey Specified</h2>');
			}
		});  
	},

	// Job Search Widget
	// Displays a "quick search" form to search jobs in Career Center.
	incJobSearch: function(s) {
		var defaults = {
			url: 'http://www.associationcareernetwork.com',
			showLocation: true,
			showKeywords: true,
			showZipCode: true,
			showRadius: true,
			buttonType: 'html',
			buttonText: 'Search',
			buttonImage: '/global/imgs/btn-search.png',
			hoverImage: '/global/imgs/btn-search-hover.png'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
						
			var h = '<form action="' +s.url +'/JobSeeker/JobList.aspx?cabbr=PHARM.TX" method="post" name="Form1" id="jobSearch-form">';
			if (s.showLocation){
				h += '<p><label for="job-location">Location</label> <input type="text" name="txtLocation" value="" id="job-location" /></p>';
			}
			if (s.showKeywords){
				h += '<p><label for="job-keywords">Keywords</label> <input type="text" name="txtKeywords" value="" id="job-keywords" /> <input type="hidden" name="KeyMatch" value="btnAny" /></p>';
			}
			if (s.showZipCode){
				h += '<p><label for="job-zipcode">Zip Code</label> <input type="text" name="txtZipCode" value="" id="job-zipcode" size="5" />';
				if (s.showRadius){
					h += ' within <input type="text" name="txtZipMiles" value="" id="job-radius" size="2" /> miles';
				}
				h += '</p><p>';
			}
			if (s.buttonType == 'image') {
				h += '<input type="image" src="'+ s.buttonImage +'" id="job-submit" name="btnSearchJobs" />';
			} else {
				h += '<input type="submit" value="'+ s.buttonText +'" id="job-submit" name="btnSearchJobs" />';
			}
			h += '</p></form>';
			obj.html(h);
			
			if (s.buttonType == 'image'){
				$('#job-submit').hover(
					function(){
						$(this).attr('src',s.hoverImage);
					},
					function(){
						$(this).attr('src',s.buttonImage);
					}
				);
			}
			obj.addClass('loaded');

			// Toggle background text for search field
			var c = 'bkgd';
			$('input[type=text]', obj).addClass(c);
			$('input[type=text]', obj).bind('focus', function(){
				$(this).removeClass(c);
			});
			$('input[type=text]', obj).bind('blur', function(){
				if (!$(this).val()) {
					$(this).addClass(c);
				} else {
					$(this).removeClass(c);
				}
			});
			
		});  
	},
	
	// Google Translate Widget
	// Creates a list of links to Google Translate
	incTranslationWidget: function(s) {
		var defaults = {  
			languages: 'all',
			buttonType: 'text',
			buttonText: 'Translate',
			buttonImage: '/global/imgs/btn-translate.png',
			hoverImage: '/global/imgs/btn-translate-hover.png'
		};
		var s = $.extend(defaults, s);
		
		return this.each(function() {
			var obj = $(this);
				
			// Setup language array
			var langs = new Array();
				langs['sq'] = "Albanian";
				langs['ar'] = "Arabic";
				langs['bg'] = "Bulgarian";
				langs['ca'] = "Catalan";
				langs['zh'] = "Chinese";
				langs['hr'] = "Croatian";
				langs['cs'] = "Czech";
				langs['da'] = "Danish";
				langs['nl'] = "Dutch";
				langs['en'] = "English";
				langs['et'] = "Estonian";
				langs['tl'] = "Filipino";
				langs['fi'] = "Finnish";
				langs['fr'] = "French";
				langs['gl'] = "Galician";
				langs['de'] = "German";
				langs['el'] = "Greek";
				langs['iw'] = "Hebrew";
				langs['hi'] = "Hindi";
				langs['hu'] = "Hungarian";
				langs['id'] = "Indonesian";
				langs['it'] = "Italian";
				langs['ja'] = "Japanese";
				langs['ko'] = "Korean";
				langs['lv'] = "Latvian";
				langs['lt'] = "Lithuanian";
				langs['mt'] = "Maltese";
				langs['no'] = "Norwegian";
				langs['fa'] = "Persian";
				langs['pl'] = "Polish";
				langs['pt-PT'] = "Portuguese";
				langs['ro'] = "Romanian";
				langs['ru'] = "Russian";
				langs['sr'] = "Serbian";
				langs['sk'] = "Slovak";
				langs['sl'] = "Slovenian";
				langs['es'] = "Spanish";
				langs['sv'] = "Swedish";
				langs['th'] = "Thai";
				langs['tr'] = "Turkish";
				langs['uk'] = "Ukrainian";
				langs['vi'] = "Vietnamese";
	
			// Construct translation URL
			var new_url = 'http://www.google.com/translate?u=';
			var url = location.href;
			var u_idx = url.indexOf('&u=');
			if (u_idx == -1) {
				new_url += encodeURIComponent(url);
			} else {
				var b = u_idx + 3;
				url = url.slice(b);
				var e = url.indexOf('&');
				url = url.slice(0,e);
				new_url += url;
			}
			new_url += '&sl=en&tl=';
			
			// Create list of languages
			var n = 0;
			var list = '';
			for (var l in langs) {
				if (n < 42) {
					if (s.languages == 'all' || s.languages.indexOf(langs[l]) != -1){
						list += '<li><a href="'+ new_url + l +'" target="_top" title="Translate to '+ langs[l] +'">'+ langs[l] +'</a></li>\n';
					}
				}
				n++;
			}

			// Create widget HTML & add to document
			var str = '';
			if (s.buttonType == 'image'){
				str += '<img id="translate-button" src="'+ s.buttonImage +'" border="0"/>';
			} else {
				str += '<span id="translate-button">'+ s.buttonText +'</span>';
			}
			str += '<ul id="translate-links">\n'+ list +'</ul>';
			if ($('nav, #navtop1, #navtop2, #navtop1list, #navtop2list').length){
				obj.html(str);
			}
			
			// Bind hover triggers
			$('#translate-button', obj).hover(
				function(){ 
					$('#translate-links').show();
					if (s.buttonType == 'image'){ $(this).attr('src',s.hoverImage); }
				},
				function(){ 
					$('#translate-links').hide();
					if (s.buttonType == 'image'){ $(this).attr('src',s.buttonImage); }
				}
			);
			$('#translate-links', obj).hover(
				function(){ $(this).show(); },
				function(){ $(this).hide(); }
			);
			
		});
	}

});  

/*-------- Deprecated Plugins (minified) --------*/
$.fn.clickableLogo=function(t,u){var s='<div id="logo-click"><h1>'+t+'</h1></div>';$('#structuraltable').after(s);$("#logo-click h1").click(function(){if(u){window.location=u;}else{window.location="/";}});};
$.fn.slideshow = function(i){var ht=0;$('#'+i).addClass('imageRotation').children().each(function(){var h=$(this).children('a').children('img').height()||$(this).children('img').height();if(ht<h){ht=h;}});var e=$('#'+i).attr('effect')||'fade';var t=($('#'+i).attr('time')||6)*1000;var r=$('#'+i).attr('random')||false;if(r==true){r=1;}else{r=0;}return $('#'+i).cycle({fx:e,random:r,timeout:t}).attr('style',function(){if(ht>0){return 'height:'+ht+'px';}});};
$.fn.incLogin = function(){var t='<iframe id="iflogin" src="/cafe.cfm?act=member.showlogin&spanid=loginform" frameborder="0" width="0" height="0"></iframe>';var i=null;$('#loginbutton').live('mouseover',function(){var b=$('#loginbutton').attr('src');var s=b.indexOf('associations')+13;var e=b.indexOf('imgs')-1;var l=e-s;i=b.substr(s,l);$(this).attr('src','/associations/'+i+'/imgs/btn_login-over.png');});$('#loginbutton').live('mouseout',function(){$(this).attr('src','/associations/'+i+'/imgs/btn_login.png');});return $('#loginform').after(t);};
$.fn.sponsorBox = function(i){if(!i){i='sponsors';}var ht=0;$('#'+i).children().each(function(){var h=$(this).children('a').children('img').height()||$(this).children('img').height();if(ht<h){ht=h;}});$('#'+i).addClass('imageRotation').after('<span id="'+i+'-caption"></span>')	.cycle({fx:'fade',random:1,timeout:6000,before:function(){$('#'+i+'-caption').fadeTo(250,0.01);},after:function(){if($('img',this).attr('alt')!=''){$('#'+i+'-caption').html($('img',this).attr('alt')).fadeTo(100,1);}}}).attr('style',function(){if(ht>0){return'height:'+ht+'px';}});};
$.fn.incSearch = function(a){var s='<form action="searchsite.cfm" method="get" name="searchsite" id="search-form"><label for="search-field">Search</label><input type="text" name="searchvalue" id="search-field" /><input type="image" name="submit" id="search-button" src="/associations/'+a+'/imgs/btn_search.png" /></form>';$('#search-widget').html(s).addClass('loaded');$('#search-button').hover(function(){$(this).attr('src','/associations/'+a+'/imgs/btn_search-over.png');},function(){$(this).attr('src','/associations/'+a+'/imgs/btn_search.png');});return $('#search-widget');};
$.fn.inc360calendar = function(a,l){var s='<iframe id="if360cal" name="if360cal" src="/associations/'+a+'/cafe/widget-360calendar.cfm?container=calendar360&limit='+l+'" frameborder="0" width="0" height="0"></iframe>';$('#calendar360').addClass('loading').html('Loading Calendar Events...').after(s);};
/*-----------------------------------------------*/

})(jQuery);

/* Validate Email Address */
function validateEmail(emailAddress){
   var emailPattern = /^[a-zA-Z0-9._-]+@[a-zA-Z0-9._-]+\.[a-zA-Z]{2,4}$/;
   return emailPattern.test(emailAddress);
}

/* Add OnLoad Event Handler Function */
function addLoadEvent(func){
  var oldonload = window.onload;
  if (typeof window.onload != 'function'){
    window.onload = func;
  } else {
    window.onload = function(){
      oldonload();
      func();
    }
  }
}
function addOnLoadEvent(func){
  var oldonload = window.onload;
  if (typeof window.onload != 'function'){
    window.onload = func;
  } else {
    window.onload = function(){
      oldonload();
      func();
    }
  }
}

/* Wrapper for console.log errors */
if (typeof console === "undefined") {
	console = { log: function () { } };
}


/*-----------------------------------------------
	BEGIN - 360 Events Widget using Yahoo! Pipes 
-----------------------------------------------*/

// Global Settings Variable
var settings_360events = new Object;

// Callback Function to Pipe Events
function pipe360events(data) {
	var $ = j,
		uid = data.value.items[0].uid,
		s = settings_360events[uid];
	
	// Error Handling for Null Results
	if (data.count < 2){
		$(s.selector).html('<h4>Sorry. There was a problem loading events.</h4><p><a href="'+ s.url +'">Click here to view all events.</a></p>').removeClass('loading').addClass('error').show();
		
	// Process Piped Data
	} else {
		var obj = s.selector,
			html = data.value.items[1].content;
			html = html.replace(/&lt;/g,'<').replace(/&gt;/g,'>').replace(/&amp;/g,'&');
		$(obj).html(html);
						
		// Remove unnecessary HTML elements
		$('script, .filter, *:empty, h3, #page_title_area, #ctl00_phUserMessage, .event_table',obj).remove();
	
		// Move rows into first table
		$('.event_list:first-child', obj).attr('id', 'calendar-list');
		$('#calendar-list', obj)
			.append($('.event_list tr', obj))
			.removeAttr('class')
			.parent()
			.before('<ul id="events-list"></ul>');
				
		// View Calendar Link
		if (s.showLink) {
			var viewLink = '<div id="view-calendar"><a href="'+ s.url +'">'+ s.linkText +'</a></div>';
			$(obj).append(viewLink);
		}
		
		// Limit number of rows 
		$('#calendar-list tr:gt('+ (s.items-1) +')', obj).remove();
								
		// Add sequential & odd/even ids & classes
		$('#calendar-list tr',obj).each(function(i){
			i++;
			$('#events-list', obj).append('<li id="row-' + i + '"></li>');
			$(this).children('td').each(function(n){
				var c = $(this).attr('class') || 'event_details';
				$('#row-' + i,obj).append('<div class="'+ c +'"></div>');
				$(this).children().each(function(){
					$('#row-' + i,obj).children('div').eq(n).append($(this));
				});
				n++;
			});
		});
		$('#events-list li:odd',obj).addClass('even_row');
		$('#events-list li:even',obj).addClass('odd_row');
		
		// Update Hyperlinks
		var c = location.href;
		var p = c.split(/\/+/g)[0];
		var d = c.split(/\/+/g)[1];
		var curr = p +'//'+ d;
		var l = 0;
		$('#events-list li a',obj).each(function(){
			var ref = $(this).attr('href');
			$(this).removeAttr('style').removeAttr('target');
			if (ref.indexOf('://') == -1) {
				if (ref.indexOf('/') != 0) {
					ref = "/" + ref;
				}
				ref = base + ref;
				$(this).attr('href', ref);
				l++;
			} else if (ref.indexOf(curr) != -1) {
				var i = curr.length;
				ref = curr + ref.slice(i);
				$(this).attr('href', ref);
				l++;
			}
		});
		
		// Remove old/unused tables & show Calendar
		$('#calendar-list',obj).parent().remove();
		$(obj).prepend($('#events-list',obj));
		$('form',obj).remove();
		$(obj).addClass(s.style).removeClass('loading').show();
		
		// Do callback function
		if (typeof s.callback == 'function'){ s.callback.call(this, data); }
		
		// Cache server response
		if(s.cache && window.sessionStorage){
			sessionStorage.setItem(s.cacheId,$(obj).html());
		}
	}
}
/*-----------------------------------------------
	END - 360 Events Widget using Yahoo! Pipes
-----------------------------------------------*/


/*-----------------------------------------------
	BEGIN - YouTube Video Widget
-----------------------------------------------*/

// Global Settings Variable
var settings_youtubeWidget = new Object;
var player;

function loadYouTubeWidget(data){
	var $ = j;
	var s = settings_youtubeWidget;
	
	// Add DOM Elements
	$(s.selector).html('<div id="player"></div><ul class="pager '+ s.pager +'"></ul>');
	
	for (i=0;i<s.items;i++){
		if (data.feed.entry[i]) {
			var url = data.feed.entry[i].id.$t;
			var title = data.feed.entry[i].title.$t;
			var id = url.substr(url.lastIndexOf('/')+1);
			var html = '<li class="yt-thumb-'+ i +'"><a href="http://www.youtube.com/embed/'+ id +'?enablejsapi=1&wmode=transparent" target="player" title="'+ title +'" onclick="player.loadVideoById(\''+ id +'\'); player.playVideo(); return false;">';
			if (s.pager == 'image') {
				html += '<img src="http://img.youtube.com/vi/'+ id +'/2.jpg" alt="'+ title +'" border="0" />';
			} else {
				html += title;
			}
			html += '</a></li>';
			$('.pager',s.selector).append(html);
			if (i==0){ settings_youtubeWidget.videoId = id; }
		}
	}
	$('.pager li:first',s.selector).addClass('active');
	$('.pager li a',s.selector).click(function(){
		$('.pager li',s.selector).removeClass('active');
		$(this).parent().addClass('active');
	});
	
	// Call Player API
	var tag = document.createElement('script');
	tag.src = "http://www.youtube.com/player_api";
	var firstScriptTag = document.getElementsByTagName('script')[0];
	firstScriptTag.parentNode.insertBefore(tag, firstScriptTag);			
	
	$(s.selector).removeClass('loading').show();					
}

function onYouTubePlayerAPIReady() {
	var s = settings_youtubeWidget;
	player = new YT.Player('player', {
		height: s.height,
		width: s.width,
		videoId: s.videoId,
		events: {
			'onReady': function (event) {
				if (s.autoPlay) {
					event.target.playVideo();
				}
			}
		}
	});
}
/*-----------------------------------------------
	END - YouTube Video Widget
-----------------------------------------------*/


/*-----------------------------------------------
	BEGIN - Featured Jobs Widget
-----------------------------------------------*/
// Global Settings Variable
var settings_featuredJobs = new Object;

// Callback Function to Pipe Jobs
function pipeFeaturedJobs(data){
	var $ = j;
	var s = settings_featuredJobs;
	
	// Error Handling for Null Results
	if (data.count == 0){
		$(s.selector).html('<h4>Sorry. There were no jobs found.</h4>').addClass('error');
		
	// Process Piped Data
	} else {
	
		var jobs = data.value.items[0].content;
		$(s.selector).html(jobs);
	
		// Remove extra table cells, line breaks and classes.
		$('table.ffFeaturedJob tr td:first-child, table.ffFeaturedJob br', s.selector).remove();
		$('a.ffFeaturedJob', s.selector).removeAttr('class').removeAttr('rel');

		// Change table to list
		var joblist = $('<ul></ul>');
		$('tr td.ffFeaturedJob', s.selector).each(function(){
			var job = $(this).html();
			joblist.append('<li>' + job + '</li>');
		});
		$(s.selector).html(joblist);

		// Extract necessary part of URL and add google analytics tags.
		$('ul li a', s.selector).each(function(){
			var url = unescape($(this).attr('href'));
			$(this).attr('href',url.replace(/Common\/javascript\:open_FF_FeaturedJobs\(\'http\:\/\/www\.associationcareernetwork\.com\//g,'').replace(/\'\,\d+?\)/g,''));
		});
	}
	
	// Show Search Jobs and Post Jobs links.
	if (s.showSearchJobs || s.showPostJobs){
		$(s.selector).append('<div class="jobs-buttons"></div>');
		if (s.showSearchJobs){
			var searchLink = '<a href="http://' + s.url + '/JobSeeker/Jobs.aspx?abbr=' + s.ccID + '&utm_source=Association-Website&utm_medium=Widget&utm_content=SearchJobs&utm_campaign=FeaturedJobsWidget" target="_blank" class="search-jobs">' + s.searchJobsText + '</a>';
			$('.jobs-buttons',s.selector).append(searchLink);
		}
		if (s.showPostJobs){
			var postLink = '<a href="http://' + s.url + '/Employer/EmpHome.aspx?abbr=' + s.ccID + '&utm_source=Association-Website&utm_medium=Widget&utm_content=PostJobs&utm_campaign=FeaturedJobsWidget" target="_blank" class="post-jobs">' + s.postJobsText + '</a>';
			$('.jobs-buttons',s.selector).append(postLink);
		}

	}
	
	// Unhide Widget
	$(s.selector).removeClass('loading').show();
}
/*-----------------------------------------------
	END - Featured Jobs Widget
-----------------------------------------------*/


/*-----------------------------------------------
	BEGIN - RSS Feed Widget
-----------------------------------------------*/
// Global Settings Variable
var settings_rssFeed = new Object;

// Callback Function to Pipe Jobs
function pipeRssFeed(data){
	var $ = j;
	
	// Error Handling for Null Results
	if (data.count == 1){
		var uid = data.value.items[0].uid,
			s = settings_rssFeed[uid];
			
		$(s.selector).html('<h4>Sorry. There was a problem with this feed.</h4>').addClass('error');
		
	// Process Piped Data
	} else {
		var uid = data.value.items[0].uid,
			s = settings_rssFeed[uid],
			lis = '',
			items = (s.items > data.count-1) ? data.count-1 : s.items;
			
		$(s.selector).hide();
		for (var i=1; i<=items; i++) {
			var title = data.value.items[i].title,
				link = data.value.items[i].link,
				html;
				
			if (title){
				html = '<a href="'+ link +'" title="'+ title +'" target="'+ s.linkTarget +'">'+ title +'</a>';
			} else {
				html = data.value.items[i].description;
			}
			lis += '<li class="rss-item-'+ i +'">';
			
			// Include Date/Time
			if (s.showDate){
				var date = new Date(data.value.items[i].pubDate);

				// Get Published Date
				var months = ['January','February','March','April','May','June','July','August','September','October','November','December'],
					days = ['Sunday','Monday','Tuesday','Wednesday','Thursday','Friday','Saturday'],
					day = date.getDate(),
					wday = date.getDay(),
					mon = date.getMonth(),
					year = date.getFullYear(),
					datef = date;
				
				// Format Date
				if (s.dateFormat == 'full'){
					datef = days[wday] +', '+ months[mon] +' '+ day +', '+ year;
				} else if (s.dateFormat == 'long'){
					datef = months[mon] +' '+ day +', '+ year;
				} else if (s.dateFormat == 'medium'){
					datef = months[mon].substr(0,3) +' '+ day +', '+ year;
				} else if (s.dateFormat == 'parts'){
					datef = '<span class="month">'+ months[mon].substr(0,3) +'</span> <span class="day">'+ day +'</span>';
				} else {
					datef = mon+1 +'/'+ day +'/'+ year;
				}
				
				// Add HTML
				if (s.dateFormat == 'parts'){
					html = '<span class="date">'+ datef +'</span>' + html;
				} else {
					html += '<br><span class="date">'+ datef +'</span>';
				}

				// Include Time
				if (s.showTime){
					var hrs = date.getHours(),
						min = date.getMinutes(),
						ampm;
						
					ampm = (hrs > 11) ? 'PM' : 'AM';
					hrs = (hrs == 0) ? 12 : hrs-12;
					if (min < 10){ min = '0' + min; }
					var time = hrs +':'+ min +' '+ ampm;
					html += ' <span class="time">'+ time +'</span>';
				}
			}
			
			// Include Description
			if (s.showDesc){
				var desc = data.value.items[i].description;
				if (s.descLength && desc.length > s.descLength){
					desc = desc.substr(0,s.descLength).replace(/[\s\.]+$/,'') + '&hellip;';					
				}
				html += '<br><span class="desc">'+ desc +'</span>';
			}
			lis += html + '</li>';
		}
		$(s.selector).html('<ul class="rss-list">' + lis+ '</ul>');

	}
	
	// Callback Function within a Callback Function - Check for Leo DiCaprio
	if (typeof s.callback == 'function'){ s.callback.call(this, data); }

	// Unhide Widget
	$(s.selector).removeClass('loading').show();
}
/*-----------------------------------------------
	END - RSS Feed Widget
-----------------------------------------------*/
