var qnErrs = new Array;

function qn_pattern_check(elem, re1, re2, re3, re4, re5)
{
	var a = new Array(re1, re2, re3, re4, re5);
	var req;
	var i;
	
	req = elem.getAttribute('req');

	for (i = 0; i < a.length && a[i]; i++) {
		if (elem.value.length > 0 && !elem.value.match(a[i]) && (!req || (req && document.getElementById(req).checked == true))) {
			qn_pattern_show_err(elem);
			return false;
		} else {
			qn_pattern_hide_err(elem);
			return true;
		}
	}
}

function qn_validate()
{
	var a;
	var i;
	var x;
	var elemButton;
	var elemSmall;
	var elemP;

	a = document.getElementsByTagName('input');
	x = true;

	for (i = 0; i < a.length; i++)
		if (a[i].onblur && !a[i].onblur())
			x = false;
	
	elemButton	= document.getElementById('qn_submit');

	if (x) {
		if (elemButton.divMsg)
			elemButton.divMsg.parentNode.removeChild(elemButton.divMsg)
	} else {
		if (!elemButton.divMsg) {
			elemDiv		= document.createElement('div');
			elemSmall	= document.createElement('small');
			elemP		= document.createElement('p');

			elemSmall.className			= 'sn_q_msg';
			elemDiv.style.paddingBottom	= '10px';

			elemP.appendChild(document.createTextNode('Please correct the errors in the form above.'));
			elemSmall.appendChild(elemP);
			elemDiv.appendChild(elemSmall);

			elemButton.parentNode.insertBefore(elemDiv, elemButton);

			elemButton.divMsg = elemDiv;
		}
	}

	return x;
}

function qn_show_err()
{
	alert('bad!');
}

function qn_pattern_show_err(elem)
{
	if (elem.qnError)
		return;
	
	qnErrs.push(elem);

	qn_pattern_err_refresh(elem);
	qn_validate();
}

function qn_pattern_hide_err(elem)
{
	var node;
	var i;

	if (!elem.qnError)
		return;

	// find the enclosing form block
	for (node = elem; node && !node.className.match(/^sn_q_form_block(_inv)?$/); node = node.offsetParent);
	node.numErrs--;
	if (node.numErrs == 0) {
		node.className = 'sn_q_form_block';
		node.msgNode.parentNode.removeChild(node.msgNode);
	}

	elem.divMsg.parentNode.removeChild(elem.divMsg);
	elem.imgMsg.parentNode.removeChild(elem.imgMsg);

	elem.qnError	= false;
	elem.className	= elem.className.replace(/_err$/, '');

	for (i = 0; i < qnErrs.length; i++)
		if (qnErrs[i] == elem)
			qnErrs.splice(i, 1);

	qn_validate();
}

function qn_pattern_err_refresh(elem)
{
	var block;
	var node;
	var small;
	var p;
	var div;
	var img;
	var x;
	var y;

	// find the enclosing form block
	for (node = elem; node && !node.className.match(/^sn_q_form_block(_inv)?$/); node = node.offsetParent);
	block = node;

	if (block.className == 'sn_q_form_block') {
		block.className += '_inv';

		small	= document.createElement('small');
		p		= document.createElement('p');

		small.className = 'sn_q_msg';

		p.appendChild(document.createTextNode('Some of the responses in this section are invalid.  For more information, place your mouse cursor over the warning icon.'));
		small.appendChild(p);

		block.parentNode.insertBefore(small, block);
		block.msgNode = small;
	}

	x = y = 0;

	// compute the vertical offset of the element relative to the page
	for (node = elem; node; node = node.offsetParent)
		y += node.offsetTop;

	// compute the horizontal offset of the element relative to the page
	for (x = 0, node = elem; node; node = node.offsetParent)
		x += node.offsetLeft;

	if (!elem.qnError) {
		if (!block.numErrs)
			block.numErrs = 0;

		block.numErrs++;

		div = document.createElement('div');

		div.className		= 'ptnerr';
		div.style.position	= 'absolute';
		div.style.display	= 'none';

		div.appendChild(document.createTextNode(elem.getAttribute('msg')));
		document.body.appendChild(div);

		img = document.createElement('img');
		img.className		= 'warning';
		img.style.position	= 'absolute';
		img.style.display	= 'none';

		if (navigator.appName == 'Microsoft Internet Explorer' && parseInt(navigator.appVersion.substring(navigator.appVersion.indexOf('MSIE') + 5)) < 7) {
			img.style.filter = 'progid:DXImageTransform.Microsoft.AlphaImageLoader(src="http://freemags.magazines.com/static/default/images/warning-small.png", sizingMethod="scale")';
			img.style.width = '16px';
			img.style.height = '16px';
			img.src = 'http://freemags.magazines.com/static/default/images/clear.gif';
		} else
			img.src = 'http://freemags.magazines.com/static/default/images/warning-small.png';

		document.body.appendChild(img);

		elem.divMsg = div;
		elem.imgMsg = img;

		msg = new catjax.tip({ text: elem.getAttribute('msg'), pos: 'right' });

		img.onmouseover = msg.show.bind(msg);
		img.onmouseout = msg.hide.bind(msg);

		elem.className	= elem.className + '_err';
		elem.qnError	= true;
	} else {
		img = elem.imgMsg;
	}

	img.style.top		= y + 10 + 'px';
	img.style.left		= x + elem.offsetWidth - 8 + 'px';
	img.style.display	= 'block';
}

function qn_pattern_err_refresh_all()
{
	var i;

	for (i = 0; i < qnErrs.length; i++)
		qn_pattern_err_refresh(qnErrs[i]);
}

window.onresize = qn_pattern_err_refresh_all;
catjax.onload(qn_validate);
