// Copyright notice

// Be inspired, do not steal.
// This script is not a template
// It cannot be reproduced in whole or in part without express permission of Stuff and Nonsense
// DOM Scripting by Brothercake (www.brothercake.com) for Stuff and Nonsense (www.malarkey.co.uk)

// Creative Commons License:
// http://creativecommons.org/licenses/by-nc-nd/2.0/



//initialisation function
window.onload = function()
{
if(document.getElementById)
{


// Add Property form validation

// This could cause a problem for browser-based screenreaders
// because the validation changes label text but doesn't move the focus
// and moving the focus is pretty unfriendly anyway
// so ... to mitigate that don't run the script in detectable browser-based screenreaders
// we detect them with a focus handler on the submit button
// which works because browser-based readers (JAWS and HPR tested) don't generate focus events when tabbed to
// and with a mousedown event, which keyboard navigation doesn't generate (it does generate onclick, so we can't use that)
	var isReader = true;


	//elements to validate, and their regex
	var vEles = {
		'usr_eml_eml' : '[^@]+@[^\.]+\.[a-zA-Z]',
		'usr_std_name' : '',
		'usr_std_school' : ''
		};

// get form/label associations function by beetle -- http://www.peterbailey.com
// details at http://www.codingforums.com/showthread.php?t=14672
	function addLabelProperties( f )
	{
		var labels = f.getElementsByTagName( "label" );
		for ( var i = 0; ( label = labels[i] ); i++ )
			f.elements[label.htmlFor].label = label;
	}


	//check contact form is there
	var contactForm = document.getElementById('fm-register');
	if(contactForm != null)
	{
		//button detection handler
		document.getElementById('fm-button').onfocus = function()
		{
			isReader = false;
		};
		document.getElementById('fm-button').onmousedown = function()
		{
			isReader = false;
		};

		//form onsubmit handler
		contactForm.onsubmit = function()
		{
			var isValid = true;

			//process the form for graphical browsers
			if(!isReader)
			{
				addLabelProperties(this);

				for(var j in vEles)
				{
					//remove any existing labels

					try {
						this[j].label.firstChild.innerHTML = this[j].label.firstChild.innerHTML.replace('[The value you entered was not valid]', '');
						this[j].label.firstChild.innerHTML = this[j].label.firstChild.innerHTML.replace('[Please complete this field]', '');
						this[j].label.firstChild.innerHTML = this[j].label.firstChild.innerHTML.replace('(Required)', '');
					}
					catch (Exception) {
						continue;
					}



					//if value is invalid, clear box and add message to label
					this.regex = new RegExp(vEles[j],'');
					if(!this.regex.test(this[j].value))
					{
						this[j].value = '';
						this[j].label.firstChild.innerHTML += '<em>[The address that you entered was invalid]</em>';

						isValid = false;
					}

					//else if field is empty, add message to label
					else if(this[j].value == '')
					{
						this[j].label.firstChild.innerHTML += '<em>[Please complete this field]</em>';

						isValid = false;
					}


				}


			}


			return isValid;
		}
	};











//show/hide optional contact form fields
	var linkContainer = document.getElementById('linkContainer');

	if(linkContainer != null)
	{
	var toggle = linkContainer.appendChild(document.createElement('a'));
	toggle.href = '#';
	toggle.appendChild(document.createTextNode('Remove optional fields?'));
	toggle.onclick = function()
	{
	var linkText = this.firstChild.nodeValue;
	this.firstChild.nodeValue = (linkText == 'Remove optional fields?') ? 'Display optional fields?' : 'Remove optional fields?';

	var tmp = document.getElementsByTagName('div');
	for (var i=0;i<tmp.length;i++)
	{
	if(tmp[i].className == 'fm-optional')
	{
	tmp[i].style.display = (tmp[i].style.display == 'none') ? 'block' : 'none';
	}
	}
	return false;
	}
	}










// show/hide subscribe form
/**
	var frm = document.getElementById('frm-subscribe');
	frm.className = 'hide';

	document.getElementById('formTrigger').onclick = function()
	{
	frm.className = (/hide/.test(frm.className)) ? '' : 'hide';
	return false;
	};
**/
}
}










// live comment preview  - comment body
// This function originally from Stuart Langridge at http://www.kryogenix.org/
// Heavily updated by Jeff Minard at http://www.creatimation.net/

function superTextile(s) {
var r = s;
// quick tags first
qtags = [['\\*', 'strong'],
['\\?\\?', 'cite'],
['\\+', 'ins'],  //fixed
['~', 'sub'],
['\\^', 'sup'], // me
['@', 'code']];
for (var i=0;i<qtags.length;i++) {
ttag = qtags[i][0]; htag = qtags[i][1];
re = new RegExp(ttag+'\\b(.+?)\\b'+ttag,'g');
r = r.replace(re,'<'+htag+'>'+'$1'+'</'+htag+'>');
}
// underscores count as part of a word, so do them separately
re = new RegExp('\\b_(.+?)_\\b','g');
r = r.replace(re,'<em>$1</em>');

//jeff: so do dashes
re = new RegExp('[\s\n]-(.+?)-[\s\n]','g');
r = r.replace(re,'<del>$1</del>');

// links
re = new RegExp('"\\b(.+?)\\(\\b(.+?)\\b\\)":([^\\s]+)','g');
r = r.replace(re,'<a href="$3" title="$2">$1</a>');
re = new RegExp('"\\b(.+?)\\b":([^\\s]+)','g');
r = r.replace(re,'<a href="$2">$1</a>');

// images
re = new RegExp('!\\b(.+?)\\(\\b(.+?)\\b\\)!','g');
r = r.replace(re,'<img src="$1" alt="$2">');
re = new RegExp('!\\b(.+?)\\b!','g');
r = r.replace(re,'<img src="$1">');

// block level formatting

// Jeff's hack to show single line breaks as they should.
// insert breaks - but you get some....stupid ones
re = new RegExp('(.*)\n([^#\*\n].*)','g');
r = r.replace(re,'$1<br />$2');
// remove the stupid breaks.
re = new RegExp('\n<br />','g');
r = r.replace(re,'\n');

lines = r.split('\n');
nr = '';
for (var i=0;i<lines.length;i++) {
line = lines[i].replace(/\s*$/,'');
changed = 0;
if (line.search(/^\s*bq\.\s+/) != -1) { line = line.replace(/^\s*bq\.\s+/,'\t<blockquote>')+'</blockquote>'; changed = 1; }

// jeff adds h#.
if (line.search(/^\s*h[1-6]\.\s+/) != -1) {
re = new RegExp('h([1-6])\.(.+)','g');
line = line.replace(re,'<h$1>$2</h$1>');
changed = 1;
}

                if (line.search(/^\s*\*\s+/) != -1) { line = line.replace(/^\s*\*\s+/,'\t<liu>') + '</liu>'; changed = 1; } // * for bullet list; make up an liu tag to be fixed later
        if (line.search(/^\s*#\s+/) != -1) { line = line.replace(/^\s*#\s+/,'\t<lio>') + '</lio>'; changed = 1; } // # for numeric list; make up an lio tag to be fixed later
if (!changed && (line.replace(/\s/g,'').length > 0)) line = '<p>'+line+'</p>';
lines[i] = line + '\n';
}

// Second pass to do lists
inlist = 0;
listtype = '';
for (var i=0;i<lines.length;i++) {
line = lines[i];
if (inlist && listtype == 'ul' && !line.match(/^\t<liu/)) { line = '</ul>\n' + line; inlist = 0; }
if (inlist && listtype == 'ol' && !line.match(/^\t<lio/)) { line = '</ol>\n' + line; inlist = 0; }
if (!inlist && line.match(/^\t<liu/)) { line = '<ul>' + line; inlist = 1; listtype = 'ul'; }
if (!inlist && line.match(/^\t<lio/)) { line = '<ol>' + line; inlist = 1; listtype = 'ol'; }
lines[i] = line;
}

r = lines.join('\n');
// jeff added : will correctly replace <li(o|u)> AND </li(o|u)>
r = r.replace(/li[o|u]>/g,'li>');

return r;
}

function reloadPreviewDiv() {
var commentString = document.getElementById('usr_req_text').value;
var con = superTextile(commentString);
document.getElementById('TextDisplay').innerHTML = con;
}
