/*
 * Word count
 */
 
var MAX_WORD_COUNT = 5000;
	
function getWordCount(text)
{
	var count = 0;

	var tokens = text.match(/\b\w+\b/g);
	if (tokens != null)
		count = tokens.length;
		
	return count;
}

function checkWordCount()
{
	var count = getWordCount(document.getElementById('txtNoticeText').value);
	if (count > MAX_WORD_COUNT)
	{
		tabClick(3);
		document.getElementById('txtNoticeText').focus();
		alert('You can\'t have more than ' + MAX_WORD_COUNT + ' words in your notice.');
	}
	
	return (count <= MAX_WORD_COUNT);
}

function showWordCount()
{
	var count = getWordCount(document.getElementById('txtNoticeText').value);
	document.getElementById('wordCount').innerHTML = count + '/' + MAX_WORD_COUNT;

	if (count > MAX_WORD_COUNT)
		document.getElementById('wordCountDiv').style.color = 'red';
	else
		document.getElementById('wordCountDiv').style.color = 'black';
}



/*
 * Bold text and Footnotes
 */

String.prototype.trim = function ()
{
	return this.replace(/^\s+|\s+$/g, '');
}

String.prototype.startsWith = function (str)
{
	return !this.indexOf(str);
}

String.prototype.endsWith = function (str)
{
	return this.lastIndexOf(str) == this.length - str.length;
}

noticeText = document.getElementById('txtNoticeText');


function getSelectedText()
{
	var selection = '';
	
	if (document.selection)
	{
		// IE
		range = document.selection.createRange();
		selection = range.text;
	}
	else
	{
		// Firefox
		var from = elem.selectionStart;
		var to = elem.selectionEnd;
		selection = elem.value.substring(from, to);
	}
	
	return selection;
}


function toggleTags(elem, startTag, endTag)
{
	if (document.selection)
	{
		// IE
		range = document.selection.createRange();
		if (range.text.startsWith(startTag) && range.text.endsWith(endTag))
		{
       		range.text = range.text.substring(startTag.length, range.text.length - endTag.length);
		}
		else
		{
			var blankTags = (range.text == '');
			range.text = startTag + range.text + endTag;
			
			if (blankTags)
			{
				range.move("character", -endTag.length);
				range.select();
			}
		}
	}
	else
	{
		// Firefox
		var from = elem.selectionStart;
		var to = elem.selectionEnd;
		var before = elem.value.substring(0, from);
		var selected = elem.value.substring(from, to);
		var after = elem.value.substring(to, elem.value.length)
		if (selected.startsWith(startTag) && selected.endsWith(endTag))
		{
       		elem.value = before + selected.substring(startTag.length, selected.length - endTag.length) + after;
       		elem.setSelectionRange(from, from + selected.length - startTag.length - endTag.length);
		}
		else
		{
       		elem.value = before + startTag + selected + endTag + after;
       		if (selected.length == 0)
       		{
	       		elem.setSelectionRange(from + startTag.length, from + startTag.length);
       		}
       		else
       		{
	       		elem.setSelectionRange(from, from + selected.length + startTag.length + endTag.length);
       		}
		}
	}
}


function toggleFootnote(elem)
{
	// Add/remove footnote reference
	if (document.selection)
	{
		// IE
		range = document.selection.createRange();
		if (range.text.match(/^<F([0-9])*>/i))		// String starts with a footnote tag
		{
			var num = RegExp.$1;
       		var reg = new RegExp('<FOOTNOTE_' + num + '>([^>]*)<\/FOOTNOTE_' + num + '>', 'gi');
       		reg.exec(elem.value);
       		if (RegExp.$1.trim() != '' && !confirm('Footnote #' + num + ' contains text. Would you like to delete it anyway?'))
       			return;

	       	range.text = range.text.replace(/^<F([0-9])*>/i, '');
	       	elem.value = elem.value.replace(reg, '');
		}
		else
		{
			range.text = '<F#newfoot>' + range.text;
		}
	}
	else
	{
		// Firefox
		var from = elem.selectionStart;
		var to = elem.selectionEnd;
		var before = elem.value.substring(0, from);
		var selected = elem.value.substring(from, to);
		var after = elem.value.substring(to, elem.value.length)
		var match = selected.match(/^<F([0-9])*>/i);			// String starts with a footnote tag
		var num = RegExp.$1;
		if (match)
		{
       		var reg = new RegExp('<FOOTNOTE_' + num + '>([^>]*)<\/FOOTNOTE_' + num + '>', 'gi');
       		reg.exec(elem.value);
       		if (RegExp.$1.trim() != '' && !confirm('Footnote #' + num + ' contains text. Would you like to delete it anyway?'))
       			return;
			
			var startTag = '<F' + num + '>';
       		elem.value = before + selected.substring(startTag.length, selected.length) + after;
	       	elem.value = elem.value.replace(reg, '');
		}
		else
		{
       		elem.value = before + '<F#newfoot>' + selected + after;
		}
	}

	// Re-number footnote refs
	elem.value = elem.value.replace(/<F[0-9]*>/gi, '<F#>');

	var i = 1;
	var newFoot = 0;

	while (match = elem.value.match(/<F\#/i))
	{
		var match = elem.value.match(/<F\#[^>]*>/i);

		if (match == '<F#newfoot>')
		{
			newFoot = i;
			elem.value = elem.value.replace(/<F\#newfoot>/i, '<F' + i++ + '>');
		}
		else if (elem.value.match(/<F\#>/i))
		{
			elem.value = elem.value.replace(/<F\#>/i, '<F' + i++ + '>');
		}
	}
	
	// Re-number footnotes
	elem.value = elem.value.replace(/<FOOTNOTE_[0-9]*>/gi, '<FOOTNOTE_#>');
	elem.value = elem.value.replace(/<\/FOOTNOTE_[0-9]*>/gi, '<\/FOOTNOTE_#>');

	i = 1;
	var insertPos = elem.value.length;
    var reg = new RegExp('<FOOTNOTE_#>([^>]*)<\/FOOTNOTE_#>', 'i');

	while (elem.value.match(/<FOOTNOTE_\#/i))
	{
		if (i == newFoot)
		{
			insertPos = elem.value.indexOf('<FOOTNOTE_#>');
			i++;
		}
		elem.value = elem.value.replace(/<FOOTNOTE_\#>/i, '<FOOTNOTE_' + i + '>');
		elem.value = elem.value.replace(/<\/FOOTNOTE_\#>/i, '<\/FOOTNOTE_' + i + '>');
		i++;
	}

	if (newFoot > 0)
	{
		// Add new footnote
		elem.value = elem.value.trim();
		elem.value = elem.value.substring(0, insertPos) + '\n\n<FOOTNOTE_' + newFoot + '>\n\n' +
			'</FOOTNOTE_' + newFoot + '>\n\n' + elem.value.substring(insertPos, elem.value.length);
			
		selectFootnote(elem, newFoot);
	}
}


function selectAtTag(elem, tag, offset)
{
	if (document.selection)
	{
		var text = elem.value.replace(/\n/g, '');
		var loc = text.indexOf(tag) + tag.length + offset;
		var range = elem.createTextRange();
        range.move("character", - text.length);
        range.move("character", loc);
        range.select();
	}
	else
	{
		var loc = elem.value.indexOf(tag) + tag.length + offset;
		elem.setSelectionRange(loc, loc);
		// TODO: elem.scrollTop = loc;
	}
}


function selectFootnote(elem, num)
{
	if (num > 0)
	{
		var tag = '<FOOTNOTE_' + num + '>';
		selectAtTag(elem, tag, 1);
	}
}

function selectFootnoteReference(elem, num)
{
	if (num > 0)
	{
		var tag = '<F' + num + '>';
		selectAtTag(elem, tag, 0);
	}
}

/*
 * Returns the number of the footnote nearest.
 */
function getNearestFootnote(elem)
{
	var result = 0;
	var text = '';

	if (document.selection)
	{
		var range = document.selection.createRange();
		var i = 0;
		do
		{
			range.moveStart('character', -23);
			text = range.text.match(/<FOOTNOTE_([0-9]*)>/i);

			i = i + 23;
			var stop = i > elem.value.length;
		}
		while (!text && !stop)
	}
	else
	{
		var from = elem.selectionStart;
		var to = from;
		var selected;
		do
		{
			to = to - 23;
			selected = elem.value.substring(from, to);
			text = selected.match(/<FOOTNOTE_([0-9]*)>/i);

			var stop = to < 0;
		}
		while (!text && !stop)
	}
		
	if (text)
	{
		result = RegExp.$1;
	}
	
	return result;
}

/*
 * Returns the number of the nearest footnote reference.
 */
function getNearestReference(elem)
{
	var result = 0;
	var text = '';

	if (document.selection)
	{
		var range = document.selection.createRange();
		var i = 0;
		do
		{
			range.moveStart('character', -7);
			text = range.text.match(/<F([0-9]*)>/i);

			i = i + 7;
			var stop = i > elem.value.length;
		}
		while (!text && !stop)
	}
	else
	{
		var from = elem.selectionStart;
		var to = from;
		var selected;
		do
		{
			to = to - 7;
			selected = elem.value.substring(from, to);
			text = selected.match(/<F([0-9]*)>/i);

			var stop = to < 0;
		}
		while (!text && !stop)
	}
		
	if (text)
	{
		result = RegExp.$1;
	}
	
	return result;
}

var noticeText_onKeyPress = function formatSelection(ev)
{
	ev = ev || window.event;
	var key = ev.keyCode || ev.which;
	
	if (ev.ctrlKey)
	{
		switch (key)
		{
			// 'b'
			case 98:
			case 66:
       			toggleTags(this, '<B>', '</B>');
				return false;

			// 'n'
			case 110:
			case 78:
       			toggleFootnote(this);
				return false;

			// up arrow
			case 38:
				var num = getNearestFootnote(this);
       			selectFootnoteReference(this, num);
				return false;

			// down arrow
			case 40:
				var num = getNearestReference(this);
       			selectFootnote(this, num);
				return false;
		}
	}
	
	return true;
}


if (document.all)
    noticeText.onkeydown = noticeText_onKeyPress;
else
    noticeText.onkeypress = noticeText_onKeyPress;


