var PushdownAd = jax.createClass("PushdownAd",function() {
	
	function PushdownAd(bannerId) {
		this.bannerId = bannerId;
		this.elm = {};
		this.init();
	}
	
	function init() {
		this.elm.banner = dom.id(this.bannerId);
			
		this.expandH = 0;
		var s = '';
		for (var i=0;i<this.elm.banner.childNodes.length;i++) {
			var c = this.elm.banner.childNodes[i];
			s += c.tagName+" "+i+"\n";
			if (c.tagName=='OBJECT') {
				this.expandH = c.height;
				break;
			}
		}
		if (this.expandH==0) return alert('PushdownAdBanner error: could not determine height of expanded banner');
		
		this.bannerH = dom.dimensions(this.elm.banner).h;
		
		if (this.bannerH==0) return alert('PushdownAdBanner error: could not determine height of un-expanded banner');
		
		if (dom.hasClass(this.elm.banner,'PushdownAd-countdown')) {
			this.bindEvent(this.elm.banner,"mouseover","countdownover",false);
			this.bindEvent(this.elm.banner,"mouseout","countdownout",false);
		}
		else {
			if (dom.hasClass(this.elm.banner,'PushdownAd-rollover')) {
				this.bindEvent(this.elm.banner,"mouseover","open");
				this.bindEvent(this.elm.banner,"mouseout","close");
			}
			
			if (dom.hasClass(this.elm.banner,'PushdownAd-autoopen')) {
				var me = this;
				setTimeout(function() {
					me.open();
				},500);
			}
		}
	}
	
	function countdownout(e) {
		
		var src = dom.eventTarget(e);
		var rel = dom.relatedTarget(e);

		
		var r = (typeof rel!='undefined')?rel.nodeName:""
		echo('mouse out '+src.nodeName+' '+r);
		
		if (rel && (rel.nodeName=='EMBED'||rel.nodeName=='OBJECT') && src.nodeName=='DIV') {
			echo('cancel this one');
			return;
		}
		
		if (rel && rel.nodeName=='DIV' && (src.nodeName=='EMBED'||src.nodeName=='OBJECT')) {
			//echo('cancel this one too');
			//return;
		}
		
		if (this.countingDown) {
			var swf = self.PushdownAd.getFlash(this.bannerId+'_movie');
			if (isFunction(swf.cancelCountdown)) {
				swf.cancelCountdown();
				echo('cancel countdown');
			}
			else alert('no cancelCountdown');
			this.countingDown = false;
		}
		
		if (this.isOpen) this.close();
	}
	
	function countdownover(e) {
		
		var src = dom.eventTarget(e);
		var rel = dom.relatedTarget(e);
		
		var r = (typeof rel!='undefined')?rel.nodeName:""
		
		if (src.nodeName=='EMBED' || src.nodeName=='OBJECT') {		
			echo('countdown begins '+src.nodeName+' '+r);
			if (!this.countingDown) {
				var swf = self.PushdownAd.getFlash(this.bannerId+'_movie');
				if (isFunction(swf.startCountdown)) {
					this.countingDown = true;
					swf.startCountdown();
				}
			}
		}
	}
	
	function open() {
		echo('open()');
		var h = dom.dimensions(this.elm.banner).h;
		//	if (!this.resizing || !this.opening) {
		if (!this.resizing && !this.opening) {
			var swf = this.getFlash();
			
			//alert('swf = '+swf.bannerOpenFrame);
			
			var p = this;
			this.resizeTo(this.elm.banner, null, this.expandH, function() {
				p.isOpen = true;
				if (isFunction(swf.bannerOpenFrame)) swf.bannerOpenFrame();
				else echo('Pushdown Banners Error:\nSWF file does not have "bannerOpenFrame" function assigned');
			});
		}
	}
	
	function close() {
		echo('close()');
		var h = dom.dimensions(this.elm.banner).h;
		if (!this.resizing && !this.closing) {
			var swf = this.getFlash();
			var p = this;
			this.resizeTo(this.elm.banner, null, this.bannerH, function() {
				p.isOpen = false;
				if (isFunction(swf.bannerCloseFrame)) swf.bannerCloseFrame();
				else echo('Pushdown Banners Error:\nSWF file does not have "bannerCloseFrame" function assigned');
			});
		}
	}
	
	function resizeTo(elm,w,h,fn) {
		var dim = dom.dimensions(elm);
		if (h==dim.h) {
			return;
		}
		//else echo('resizeTo h='+h+' dim.h='+dim.h);
		
		clearInterval(this.timer);
		var me = this;
		echo('start '+(new Date().valueOf()));
		var speed = 20;
		var time = 500;
		var steps = parseInt(time/speed);
		var distanceH = h - dom.dimensions(elm).h;
		var dy = distanceH/steps;
		var opening = h > dom.dimensions(elm).h;
		
		this.opening = opening;
		this.closing = !opening;
		
		this.resizing = true;
		
		me.timer = setInterval(function() {
			var ch = dom.dimensions(elm).h;
			var nh = ch + dy;
			if (h>ch && nh>h || h<ch && nh<h) nh = h;
			if (opening & nh>h) nh = h;
			if (!opening & nh<h) nh = h;
			style.height(elm, nh);
			if (nh==h) {
				//echo('end timer='+me.timer);
				clearInterval(me.timer);
				me.resizing = false;
				fn();
			}
			
		},speed);
	}
	
	function getFlash() {
		return self.PushdownAd.getFlash(this.bannerId+'_movie');
	}
		
	return {
		getFlash : getFlash,
		PushdownAd : PushdownAd,
		init : init,
		resizeTo : resizeTo,
		countdownover : countdownover,
		countdownout : countdownout,
		open : open,
		close : close
	}
	
});

PushdownAd.getFileName = function(swf) {
	if (swf.nodeName=='EMBED') return swf.src;
	else {
		for (var i=0;i<swf.childNodes.length;i++) {
			if (swf.childNodes[i].nodeName=='PARAM' && swf.childNodes[i].name=='movie') {
				return swf.childNodes[i].value;
			}
		}
	}
};
PushdownAd.instances = {};
PushdownAd.get = function(id) {
	if (PushdownAd.instances[id]) return PushdownAd.instances[id];
};
PushdownAd.getFlash = function(movieName) {
	return client.features('activex')? window[movieName] : document[movieName];
};

jax.run(function() {
	var div = document.getElementsByTagName('div');
	for (var i=0;i<div.length;i++) {
		if (dom.hasClass(div[i],'PushdownAd')) {
			PushdownAd.instances[div[i].id] = new PushdownAd(div[i].id);
		}
	}
});

function getTextFromFlash(str) {
	document.htmlForm.receivedField.value = "From Flash: " + str;
	return str + " received";
}

function PushdownAd_jsOpen(n) {
	var p = PushdownAd.get(n);
	if (p) {
		p.countingDown = false;
		p.open();
	}
}
