function StaticPromo( constructorOpts ) {
	function DUMMYopts() {}
	DUMMYopts.prototype = {
		promoSelector: '#staticPromo',
		headSelector: '.staticPromoHead',
		bodySelector: '.staticPromoBody',
		openCb: function() {},
		closeCb: function() {},
		userOpenCb: function() {},
		userCloseCb: function() {}
	};
	
	var SLIDE_SPEED = 600,
	TEASE_SPEED = 200,
	TEASE_HEIGHT = 3,
	EVT_NAMESPACE = '.staticPromo',
	OPEN_CLASS = 'staticPromoIsOpen',
	CLOSED_CLASS = 'staticPromoIsClosed',
	instance = this,
	opts = new DUMMYopts(),
	promoObj, headObj, bodyObj,
	isOpen = true,
	isTeasing = false,
	openHeight = 'auto';
	
	function setConfig( configOpts ) {
		if (!!configOpts) {
			$.each(opts, function( key ){
				if (typeof configOpts[key] != 'undefined') {
					opts[key] = configOpts[key];
				}
			});
		}
	}
	
	function teasePromo() {
		isTeasing = true;
		if (!isOpen) {
			bodyObj.stop();
			bodyObj.animate({height: TEASE_HEIGHT}, TEASE_SPEED);
		}
	}
	
	function unTeasePromo() {
		isTeasing = false;
		if (!isOpen) {
			bodyObj.stop();
			bodyObj.animate({height: 0}, TEASE_SPEED);
		}
	}
	
	function closePromo() {
		isOpen = false;
		bodyObj.stop();
		promoObj.removeClass(OPEN_CLASS);
		promoObj.addClass(CLOSED_CLASS);
		bodyObj.animate({height: 0}, SLIDE_SPEED, function() {
			if (typeof opts.closeCb == 'function') {
				opts.closeCb.call(instance);
			}
		});
	}
	
	function openPromo() {
		isOpen = true;
		bodyObj.stop();
		promoObj.addClass(OPEN_CLASS);
		promoObj.removeClass(CLOSED_CLASS);
		bodyObj.animate({height: openHeight}, SLIDE_SPEED, function() {
			if (typeof opts.openCb == 'function') {
				opts.openCb.call(instance);
			}
		});
	}
	
	function build() {
		promoObj = $(opts.promoSelector);
		if (!!promoObj.length) {
			headObj = promoObj.find(opts.headSelector);
			bodyObj = promoObj.find(opts.bodySelector);
		}
		
		if (!!promoObj.length && !!headObj.length && !!bodyObj.length) {
			openHeight = bodyObj.height();
			var stateCookie = $.getCookie('staticPromoState');
			switch (stateCookie) {
				case 'closed':
					isOpen = false;
					bodyObj.css({overflow: 'hidden', height: 0});
					promoObj.addClass(CLOSED_CLASS);
					break;
				case 'open':
					isOpen = true;
					bodyObj.css({overflow: 'hidden'});
					promoObj.addClass(OPEN_CLASS);
					break;
				default:
					isOpen = false;
					bodyObj.css({overflow: 'hidden', height: 0});
					promoObj.addClass(CLOSED_CLASS);
					$(window).unbind('load' + EVT_NAMESPACE).bind('load' + EVT_NAMESPACE, function( evt ) {
						openPromo();
					});
			}
			
			$.setCookie({
				name: 'staticPromoState',
				val: 'closed',
				path: '/' + jsContextRoot + '/',
				expireMins: 15
			});
			
			promoObj.unbind('click' + EVT_NAMESPACE).bind('click' + EVT_NAMESPACE, function( evt ) {
				setTimeout(function() {
					if (isOpen) {
						if (typeof opts.userCloseCb == 'function') {
							opts.userCloseCb.call(instance);
						}
						
						closePromo();
					} else {
						if (typeof opts.userOpenCb == 'function') {
							opts.userOpenCb.call(instance);
						}
						
						openPromo();
					}
				}, 0);
			});
			
			bodyObj.unbind('click' + EVT_NAMESPACE).bind('click' + EVT_NAMESPACE, function( evt ) {
				evt.stopPropagation();
			});
		} else {
			promoObj = headObj = bodyObj = null;
		}
	}
	
	function destroy() {
		if (!!promoObj) {
			promoObj.unbind('mouseover' + EVT_NAMESPACE).unbind('mouseout' + EVT_NAMESPACE).unbind('click' + EVT_NAMESPACE);
			bodyObj.show();
		}
	}
	
	instance.open = function() {
		openPromo;
	};
	
	instance.close = function() {
		closePromo;
	};
	
	instance.toggle = function() {
		if (isOpen) {
			closePromo();
		} else {
			openPromo();
		}
	};
	
	instance.init = function( initOpts ) {
		if (!!initOpts) {
			destroy();
			setConfig(initOpts);
			build();
		}
	};
	instance.init(constructorOpts);
}