if (!michigirl) var michigirl = {};

michigirl.newsletter = function() {

	var dialogpadding = 20,
		spinnerwidth = 32,
		dom = global.dom,
		event = global.event,
		domdone = false,
		imgdetail = {},
		tweendialog,tweendialogimage,
		dialogshown = false,
		dialogimgshown = false,
		maskEl,dialogEl,spinnerEl;

	function showimage() {

		// exit if dialog image currently shown
		if (dialogimgshown) return;

		// load image in background, setup dialog and mask in dom
		if (!imgdetail.node) loadimage();
		if (!dialogEl || !maskEl) builddialogandmask();

		// hide image before fade up
		dom.setnodecss(imgdetail.node,{ display: 'none', opacity: 0 });

		// setup mask, dialog and spinner placements
		var vp = dom.getviewportdim(),
			pg = dom.getpagedim(),
			ctr = function(w1,w2,offset) { return Math.max(0,Math.floor((w1 / 2) - (w2 / 2)) + offset) + 'px'; };

		dom.setnodecss(maskEl,{
			display: 'block',
			width: Math.max(vp.width,pg.width) + 'px',
			height: Math.max(vp.height,pg.height) + 'px',
			opacity: 0
		});

		dom.setnodecss(dialogEl,{
			display: 'block',
			left: ctr(vp.width,imgdetail.width,-dialogpadding),
			top: ctr(vp.height,imgdetail.height,-dialogpadding + dom.getpagescroll()),
			width: (imgdetail.width + (dialogpadding * 2)) + 'px',
			height: (imgdetail.height + (dialogpadding * 3)) + 'px',
			opacity: 0
		});

		dom.setnodecss(spinnerEl,{
			left: ctr(imgdetail.width,spinnerwidth,dialogpadding),
			top: ctr(imgdetail.height,spinnerwidth,dialogpadding)
		});

		// start dialog fadeup
		if (!tweendialog) tweendialog = new dom.animation.tween(
			{
				handler: dialogfadehandler,
				finish: function() {

					dialogshown = !dialogshown;
					if (dialogshown) dialogdisplayimage();
					else {
						// dialog hidden - hide dom mask and dialog
						maskEl.style.display = 'none';
						dialogEl.style.display = 'none';
					}
				}
			},
			0,100,0.3,'none'
		);

		tweendialog.reset();
		tweendialog.start();
	}

	function loadimage() {

		// must attach event before setting source or event won't fire for IE6/7
		var img = dom.node('img',{ width: imgdetail.width, height: imgdetail.height, alt: '' });
		event.add(img,'load',function() { imgdetail.loaded = true; dialogdisplayimage(); });
		img.src = '/res/newsletter/' + imgdetail.name;

		imgdetail.node = img;
	}

	function builddialogandmask() {

		// build dialog & mask
		var docbody = document.body;

		dialogEl = dom.node('div',{ id: 'newsletterdialog' },[
			imgdetail.node,spinnerEl,
			dom.node('a',{ id: 'newsletterdialogclose', href: '#' },['Close window'])
		]);
		docbody.appendChild(dialogEl);

		// build mask
		maskEl = dom.node('div',{ id: 'newslettermask' });
		docbody.appendChild(maskEl);

		// attach close dialog click handler
		event.add($('newsletterdialogclose'),'click',hideimage);
	}

	function hideimage(e) {

		event.preventdefault(e);

		// exit if dialog image not currently shown
		if (!dialogimgshown) return;

		dialogimgshown = false;
		tweendialog.start();
	}

	function dialogfadehandler(level) {

		var opacity = level / 100;
		dom.setopacity(maskEl,(opacity > 0.7) ? 0.7 : opacity);
		dom.setopacity(dialogEl,opacity);
	}

	function dialogdisplayimage() {

		// if dialog is shown, but not image - present spinner
		if (dialogshown && !imgdetail.loaded) spinnerEl.style.display = 'block';

		// dont display if image not loaded or dialog not yet shown
		if (!imgdetail.loaded || !dialogshown) return;

		// hide spinner and start dialog image fadeup
		var img = imgdetail.node;
		img.style.display = 'block';
		spinnerEl.style.display = 'none';

		if (!tweendialogimage) tweendialogimage = new dom.animation.tween(
			{
				el: img,
				css: 'opacity',
				finish: function() { dialogimgshown = true; }
			},
			0,1,0.3,'none'
		);

		tweendialogimage.reset();
		tweendialogimage.start();
	}

	function init() {

		var img = $('newsletterimage'),
			imgparts;

		if (!img || !img.nextSibling) {
			// reset timeout to try again later - unless window.onload fired then bail
			if (!domdone) window.setTimeout(init,20);
			return;
		}

		// check for full size image
		if (!img.className) return;

		// check image fullsize pattern is valid and get data from it
		if (imgparts = /^([^_]+)_([0-9]+)_([0-9]+)$/.exec(img.className)) {
			imgdetail = { name: imgparts[1], width: Number(imgparts[2]), height: Number(imgparts[3]) };
			img.className = 'click';
			event.add(img,'click',showimage);

			// load spinner graphic now so its ready when the user pops up the image
			spinnerEl = dom.node('img', { id: 'newsletterdialogspinner', src: '/img/imageloader.gif', width: spinnerwidth, height: spinnerwidth });
		}
	}

	init();
	event.add(window,'load',function() { domdone = true; });
}();