function BLITZ() {
	/* Constants used throughout class */
	var constants = {
		selected: "-selected",
		on: "-on",
		off: "-off",
		maxWidth: 1800
	};

	// public methods
	
	this.init = function() {
		setupLeftNavTree();
		setupLeftNavParentHighlight();
		positionTweetSidebar();
		ourApproachTaglines();
		legalPopups();
		Twitter.swfName = "flashTweet";
		Twitter.getLatest();
		$(window).resize(function() {onResizeHandler();});
		initInternalPage();
	};
	
	// typically called when an internal page for our work section is loaded
	this.initInternalPage = function() {
		initInternalPage();
	};

	this.initHide = function() {
	    if ($(".projectSet").length) { $(".projectSet").hide(); }
	    if ($(".glow").length) { $(".glow").hide(); }
	    if ($("#resumator-wrapper").length) { $("#resumator-wrapper").find("div:last").hide(); }
	    if ($(".resumator-field-wrapper").length) { $(".resumator-field-wrapper").find("a").hide(); }
	    if ($("#OurApproach").length) { $(".weCollaborateTagline, .weConquerTagline").hide(); }

	};
		
	// private methods
	
	// typically called when an internal page for our work section is loaded
	function initInternalPage() {
		rollovers();
		voidLinks();
		initializeAwardTimeline();		
		rotator(".quote");
		ourApproachTaglines();
		inlineScroller(".awards", ".awardsInner");
		caseStudyRollovers();
		positionFlashCaseStudy();
	}
	
	// called when window is resize
	// handles positioning and any resizing for site
	function onResizeHandler() {
		positionFlashCaseStudy();
		onResizeTimelineHandler();
		positionTweetSidebar();
	};
	
	function voidLinks() {
		var href;
		$("a").each(function() {
			href = $(this).attr("href");
			if(href == "#")
			{
				$(this).attr("href","javascript:void(0);");
			}
		});
	};

	// hightlight parent element of when a child is selected
	function setupLeftNavParentHighlight() {
		var curSubNavItem = $(".subNavItem.currentPage");
		if(curSubNavItem.length)
		{
			$($(curSubNavItem).prevAll(".navItem")[0]).addClass("currentPage");
		}	
	}
	
	function setupLeftNavTree() {
		var i, siblings, siblingsLen;
		var collapsedClass = "collapsed";
		var parentEltClass = "navItem";
		var childElts = "div";
				
		$(".navItem a").click(function() {			
			var parentDiv = $(this).parent(); // get parent
			siblings = parentDiv.nextAll(childElts); // get all sibilings below elt
			siblingsLen = siblings.length;
	
			var isCollapsing = false;
	
			if($(parentDiv).hasClass(collapsedClass))
			{
				Oreo.setCookie($(parentDiv).find("a").attr("title"), "expanded");
				$(parentDiv).removeClass(collapsedClass);
				isCollapsing = false;
				
			}
			else
			{
				Oreo.setCookie($(parentDiv).find("a").attr("title"), collapsedClass);
				$(parentDiv).addClass(collapsedClass);
				isCollapsing = true;
			}
			
			// iterate through siblings till we hit the next parent elt
			for(var i = 0; i < siblingsLen; i++)
			{
				if($(siblings[i]).hasClass(parentEltClass))
				{
					break;
				}

				if(isCollapsing)
				{
					$(siblings[i]).fadeOut();
				}
				else
				{
					$(siblings[i]).removeClass("hide").fadeIn();
					
				}
			}
		});	
	};		
	
	function rollovers() {		
		$(".rollover img").hover(function() {
			if(!(Utils.hasSelected($(this), $(this).data("pngImg"))))
			{			
				Utils.addOn($(this), $(this).data("pngImg"));				
			}
		}, function() {
			if(!(Utils.hasSelected($(this), $(this).data("pngImg"))))
			{
				Utils.removeOn($(this), $(this).data("pngImg"));
			}
		});
	};
			
	function caseStudyRollovers() {	
		$(".thumb").mouseenter(function() {
			$(".rolloverView").hide(); // hide all
			var thumb = $(this);			
			var rolloverView = thumb.parent().find(".rolloverView");
			rolloverView.fadeIn("fast");
		});
		
		$(".rolloverView").mouseleave(function() {
			var thumb = $(this);
			var rolloverView = thumb.parent().find(".rolloverView");
			rolloverView.fadeOut("fast");
		}); 
		
		
		$(".rolloverView img.rollover").hover(function() {
			var imgSrc = $(this).attr("src");
			if (imgSrc.indexOf(constants.off) != -1) {
				var img_off = imgSrc.replace(constants.off, constants.on);
			}		
			$(this).attr("src", img_off);
		}, function() {
			var imgSrc = $(this).attr("src");
			if (imgSrc.indexOf(constants.on) != -1) {
				var img_on = imgSrc.replace(constants.on, constants.off);
			}
			$(this).attr("src", img_on);
		});
	};


	function positionFlashCaseStudy() {};
	
	function rotator(elt) {
		var len = $(elt).length;
		if(len > 1)
		{		
			$(elt).each(function(i) {
				if(i > 0) {
					$(this).hide();
				}				
			});			
			var r = new Rotator(elt);
			r.fadeIn();				
		}
	};
	
	function initializeAwardTimeline() {
		$(".projectSet").hide();
		$(".year_2010").show();
		$(".glow").hide();
		positionTimeline();
		setglow();
		$(".glow").show();
		registerTimelineEvents();
		// add 'last' class to last ul in projectSet (removes dotted line border) 
		$(".projectSet").each(function() {
			$(this).find("ul:last").addClass("last");}
		);
	};
	
	function positionTimeline() {};
		
	function onResizeTimelineHandler() {
		positionTimeline();
		setglow();
	};
	
	function setglow() {		
		if($("#ourWork .yearTimeline").length)
		{
			$(".yearTimeline img").each(function(i) {
				if(Utils.hasSelected($(this), $(this).data("pngImg")))
				{
					// get a stable element position
					var pos = $(".tagline").position();
					// pivot point: 2009 position
					var leftOffset = 110;
					
					if(Utils.isIE6()) 
					{
						leftOffset = 170;
					}
					
					var xpos = pos.left - leftOffset;
					var ypos = 100; 
		
		
					if($(this).attr("src").indexOf("2003") != -1 || ($(this).data("pngImg") && $(this).data("pngImg").indexOf("2003") != -1))
					{
						xpos += 35;
					}

					$(".glow").css({
						left: xpos + (i * 97),
						top: ypos
					});
				}
			});
		}
	};

	function registerTimelineEvents() 
	{
	    var timelineImages = $(".yearTimeline img");
	    var lastYear = 0;
	    
	    // find the last year before NaN
	    $(timelineImages).each(function() 
	    {
	        var src = $(this).data("pngImg") ? $(this).data("pngImg") : $(this).attr("src");
	        var year = src.substr(src.lastIndexOf("20"), 4);
	        
	        if (isNaN(parseInt(year))) 
	        {
	            lastYear = lastYear - 1;
	        }
	        else 
	        {
	            lastYear = year;
	        }
	    });

	    $(timelineImages).click(function() {
	        var newSelected = $(this).data("pngImg") ? $(this).data("pngImg") : $(this).attr("src");
	        // find previous selected image
	        $(timelineImages).each(function() {
	            if (Utils.hasSelected($(this), $(this).data("pngImg")) &&
				  (newSelected != $(this).attr("src") || ($(this).data("pngImg") && newSelected != $(this).data("pngImg")))) {
	                Utils.removeSelected($(this), $(this).data("pngImg"));
	                var src = $(this).data("pngImg") ? $(this).data("pngImg") : $(this).attr("src");
	                var year = src.substr(src.lastIndexOf("20"), 4);
	                if (isNaN(parseInt(year))) 
	                {
	                    year = lastYear;
	                }
	                // hide
	                $(".year_" + year).hide();
	            }
	        });

	        // new selected year
	        var src = newSelected;
	        if (src.lastIndexOf(constants.on) != -1) {
	            Utils.removeOn($(this), $(this).data("pngImg"));
	            Utils.addSelected($(this), $(this).data("pngImg"));
	            setglow(false);
	            var year = src.substr(src.lastIndexOf("20"), 4);

	            if (isNaN(parseInt(year))) 
	            {
	                year = lastYear;
	            }
	            
	            // show
	            $(".year_" + year).fadeIn(500);
	        }
	    });
	};
	
	function positionTweetSidebar() {
		if($("#tweetSidebar").length)
		{
			var tweetSidebar = $("#tweetSidebar");
			var winWidth = $(window).width();
			var tweetSidebarWidth = tweetSidebar.width();
			
			var maxWidth = 1280;
			// when window.innerWidth is smaller than 1280 then hide tweet sidebar and icon link text			
			if((jQuery.browser.msie && document.body.offsetWidth < maxWidth) || window.innerWidth < maxWidth)
			{
				// move max tweet sidebar off screen			
				$("#maxTweetSidebar").css({
					"margin-left": -9999
				});
				// show min tweet sidebar
				$("#minTweetSidebar").show();
				winWidth = (jQuery.browser.msie) ? document.body.offsetWidth : window.innerWidth;
				tweetSidebarWidth -= 40;					
			}
			else
			{		
				// show max tweet sidebar
				$("#maxTweetSidebar").css({
					"margin-left": 0
				});
				// hide min tweet sidebar
				$("#minTweetSidebar").hide();
				// position tweet sidebar
				
				if(winWidth > constants.maxWidth)
				{
					var pos = $("#flashBG").position();
					winWidth = pos.left + (constants.maxWidth * 0.5);
					//alert(pos.left);
                }
                Twitter.getLatest();
								
			}			
			// fix ie 1px bug
			if(jQuery.browser.msie)
			{
				winWidth += 1;
			}	
			
			tweetSidebar.css({
				left:	winWidth - tweetSidebarWidth
			});			
		}
	};
	
	
	function ourApproachTaglines() {
		if($("#OurApproach").length)		
		{	
			$(".weCollaborateTagline, .weConquerTagline").hide();
			var speed = 300;
			$(".approach a").click(function() {
				var clickedApproach = $(this);
				
				var curSelected = null;
				var isNew = false;
				$(".approach img").each(function() {
					if($(this).attr("src").indexOf(constants.selected) != -1 || ($(this).data("pngImg") && $(this).data("pngImg").indexOf(constants.selected) != -1))
					{
						if(curSelected != $(this) || curSelected == null)
						{				
							Utils.removeSelected($(this), $(this).data("pngImg"));							
							curSelected = $(this);
							isNew = true;
						}
					}
				});
	
				if(isNew)
				{
					var approachClass = clickedApproach.attr("class");
					var src = ($($(clickedApproach).find("img")).data("pngImg")) ? $($(clickedApproach).find("img")).data("pngImg") : clickedApproach.find("img").attr("src");
					
					// change approach color
					Utils.removeOn(clickedApproach.find("img"), $($(clickedApproach).find("img")).data("pngImg"));
					Utils.addSelected(clickedApproach.find("img"), $($(clickedApproach).find("img")).data("pngImg"));
					
					if(Utils.isIE6()) // just show/hide
					{
						$(".approachTagline img:visible").hide();
						var tagline = approachClass.substr(0, approachClass.lastIndexOf("Approach")) + "Tagline";
						$("." + tagline).show();	
					}
					else // fadeout then fadein
					{									
						$(".approachTagline img:visible").fadeOut(speed, function() {
							// update tagline
							var tagline = approachClass.substr(0, approachClass.lastIndexOf("Approach")) + "Tagline";				
							$("." + tagline).fadeIn(speed);				
						});	
					}					
				}			
			});
		}
	};
	
	
	function legalPopups() {
		var privacyPolicy = $(".links a.privacyPolicy");
		var termsOfUse = $(".links a.termsOfUse");
	
		var width  = 945;
		var height = 600;
	
		if(privacyPolicy.length)
		{
			privacyPolicy.click(function() {
				popup("legal/privacy.htm", width, height);
			});
		}
		
		if(termsOfUse.length) 
		{
			termsOfUse.click(function() {
				popup("legal/terms.htm", width, height);
			});
		}
	};
	
	function popup(url, width, height) {
		var left = 0;
		var top  = 0;
	
		window.open(url, "BLITZ_popup", "width=" + width + ", height=" + height + ", scrollbars=1, top=" + top + ", left=" + left);
	};
	
	function inlineScroller(scrollable, wrapper) {
		var scrollable = $(scrollable);
		var wrapper = $(wrapper);
		  // height of area at the top at bottom, that don't respond to mousemove
		  var inactiveMargin = scrollable.find("li").height();
		  // Cache for performance
		  var wrapperWidth = wrapper.width();
		  var wrapperHeight = 180; //wrapper.height();
		  // Using outer height to include padding too
		  var scrollableHeight = scrollable.outerHeight() + 2*inactiveMargin;
		  // Do not cache wrapperOffset, because it can change when user resizes window
		  // We could use onresize event, but it's just not worth doing that
		  // var wrapperOffset = wrapper.offset();

		  //When user move mouse over menu
		  wrapper.mousemove(function(e){
			var wrapperOffset = wrapper.offset();
			// Scroll menu
			var top = (e.pageY -  wrapperOffset.top) * (scrollableHeight - wrapperHeight) / wrapperHeight  - inactiveMargin;

			if (top < 0) {
			  top = 0;
			}
			scrollable.scrollTop(top);			
		  });
	};	
	
	// utilities
	// used for swapping images between static, on, and selected states
	// also used in determining if we are in IE6
	var Utils = {
		addSelected: function(img, imgSrc) {
			var src = (imgSrc) ? imgSrc : Utils.getSrc(img);
			if(src.lastIndexOf(constants.selected) == -1)
			{
				var dotDex = src.lastIndexOf(".");
				img.attr("src", src.substr(0, dotDex) + constants.selected + src.substr(dotDex));
			}
		},
		removeSelected: function(img, imgSrc) {
			var src = (imgSrc) ? imgSrc : Utils.getSrc(img);
			if(Utils.hasSelected(img) || imgSrc)
			{	
				var selectedDex = src.lastIndexOf(constants.selected);
				img.attr("src", src.substr(0, selectedDex) + src.substr(selectedDex + constants.selected.length));
			}
		},
		hasSelected: function(img, imgSrc) {
			var src = (imgSrc) ? imgSrc : Utils.getSrc(img);
			return (src.lastIndexOf(constants.selected) != -1);
		},		
		addOn: function(img, imgSrc) {
			var src = (imgSrc) ? imgSrc : Utils.getSrc(img);
			if(src.lastIndexOf(constants.on) == -1)
			{
				var dotDex = src.lastIndexOf(".");
				img.attr("src", src.substr(0, dotDex) + constants.on + src.substr(dotDex));
			}
		},
		removeOn: function(img, imgSrc) {
			var src = (imgSrc) ? imgSrc : Utils.getSrc(img);
			if(src.lastIndexOf(constants.on) != -1)
			{						
				var selectedDex = src.lastIndexOf(constants.on);
				img.attr("src", src.substr(0, selectedDex) + src.substr(selectedDex + constants.on.length));
			}
			else
			{
				img.attr("src", imgSrc);
			}
		},
		getSrc: function(img, imgSrc) {
			return img.attr("src");
		},
		isIE6: function() {
			return (jQuery.browser.msie && jQuery.browser.version == "6.0");
		}
	};
};

// Twitter object literal
var Twitter = {
	swfName: null,
	// retrieves latest tweet from account
	getLatest: function() {
		if(Twitter.swfName && $("#" + Twitter.swfName).length)
		{
			var twitter_JSON = document.createElement("script");
			twitter_JSON.type="text/javascript";
			twitter_JSON.src="http://twitter.com/statuses/user_timeline/blitzagency.json?callback=Twitter.callback&count=1";
			document.getElementsByTagName("head")[0].appendChild(twitter_JSON);
		}
	},
	// called from flash to resize #flashTweet to the height of the textfield containing the tweet in flash
	resizeSWF: function(id, width, height) {
		$("#" + id).height(height - 3);
	},
	// called when the Twitter service response is received
	callback: function(tweet) {
		var isIE = navigator.appName.indexOf("Microsoft") != -1;
		var swf = (isIE) ? window["flashTweet"] : document["flashTweet"];
		// send tweet swf the latest tweet
		swf.sendTextToFlash(tweet[0].text);
		// format the time from latest tweet
		$("#tweetSidebar .timeFromLastTweet").text(Twitter.formatTwitterTimeFromTweet(tweet));
	},
	formatTwitterTimeFromTweet: function(tweet) {
		var twitterTime = tweet[0].created_at.split(" ");
		twitterTime[4] = "UTC" + twitterTime[4];
		return Twitter.msToTimePhrase(new Date().getTime() - new Date(twitterTime.join(" ")).getTime());		
	},
	msToTimePhrase: function(ms) {	
		var seconds = ms / 1000;
		if(seconds < 1) {
			seconds = 1;
		}
		//less than 1 minute
		if(seconds < 60) {
			return "less than " + seconds + " seconds ago";
		}
		//less than 1 hour
		else if(seconds < 3600) {
			var minutes = Math.round(seconds/60);
			if(minutes == 1) {
				return minutes + " minute ago";
			}
			else {
				return minutes + " minutes ago";
			}
		}
		//less than 1 day ago
		else if(seconds < 86400) {
			var hours = Math.round(seconds/3600);
			if(hours == 1) {
				return "about " + hours + " hour ago";
			}
			else {
				return "about " + hours + " hours ago";
			}
		}
		//more than 1 day ago
		else {
			var days = Math.round(seconds/86400);
			if(days == 1) {
				return days + " day ago";
			}
			else {
				return days + " days ago";
			}
		}
	}
};

// used for rotating a series of images
function Rotator(elt, fadeSpeed, msBetweenRotating) {
	var len = $(elt).length;
	var dex = 0;
	var speed = fadeSpeed || 1000;
	var duration = msBetweenRotating || 8000;
	var intervalID = null;
	
	this.fadeOut = function() {
		fadeOut();
	};
	this.fadeIn = function() {
		fadeIn();
	};
	
	function fadeOut() {
		$($(elt).get(dex)).fadeOut(speed, function() {
			clearInterval(intervalID);
			dex = (++dex % len);
			fadeIn();
		});	
	};
	
	function fadeIn() {
		$($(elt).get(dex)).fadeIn(speed, function() {
			intervalID = setInterval(function() {fadeOut();}, duration);
		});
	};
};
