function add(questionID){
	
	//Increment the count of entries in question.
	var count = parseInt(document.getElementById('question' + questionID + 'entries').value) + 1;
	document.getElementById('question' + questionID + 'entries').value = count;
	
	//Get the question span to add the fields.
	var questionFields = document.getElementById('question' + questionID);
	
	var entry = document.createElement('div');
	entry.setAttribute('id', 'question' + questionID + 'entry' + count);
	
	//Every name field needs a unique ID to know which field triggered auto complete.
	var AlterFirstName = document.createElement('input');
	AlterFirstName.setAttribute('id', 'question' + questionID + 'AlterFirstName' + count);
	AlterFirstName.setAttribute('name', 'AlterFirstName');
	AlterFirstName.setAttribute('type', 'text');
	AlterFirstName.setAttribute('size', '20');
	AlterFirstName.setAttribute('value', '');
	AlterFirstName.onkeydown = new Function('firstAutoComplete(\'' + AlterFirstName.getAttribute('id') + '\');');
	
	var AlterLastInitial = document.createElement('input');
	AlterLastInitial.setAttribute('id', 'question' + questionID + 'AlterLastInitial' + count);
	AlterLastInitial.setAttribute('name', 'AlterLastInitial');
	AlterLastInitial.setAttribute('type', 'text');
	AlterLastInitial.setAttribute('size', '20');
	AlterLastInitial.setAttribute('value', '');
	AlterLastInitial.onkeydown = new Function('lastAutoComplete(\'' + AlterLastInitial.getAttribute('id') + '\');');
	
	var deleteButton = document.createElement('input');
	deleteButton.setAttribute('id', 'question' + questionID + 'deleteButton' + count);
	deleteButton.setAttribute('type', 'button');
	deleteButton.setAttribute('value', 'x');
	deleteButton.onclick = new Function('remove(\'' + questionID + '\', \'' + count + '\');');
	
	var lineBreak = document.createElement('br');
	
	var errorMsg = document.createElement('span');
	errorMsg.setAttribute('id', entry.id + 'errorMsg');
	
	entry.appendChild(AlterFirstName);
	entry.appendChild(AlterLastInitial);
	entry.appendChild(deleteButton);
	entry.appendChild(lineBreak);
	entry.appendChild(errorMsg);
	
	questionFields.appendChild(entry);
	
	checkAddButton(questionID);
}

function remove(questionID, entryID){
	var temp = document.getElementById('question' + questionID + 'entry' + entryID);
	temp.parentNode.removeChild(temp);
	
	checkAddButton(questionID);
}

function checkAddButton(questionID){
	//Get number of contacts.
	var maxContacts = parseInt(document.getElementById('question' + questionID + 'maxContacts').value);
	var question = document.getElementById('question' + questionID);
	var inputs = question.getElementsByTagName('input');
	var currentContacts = 0;
	
	for(var i = 0; i < inputs.length; i++){
		if(inputs[i].getAttribute('name') == 'AlterFirstName') currentContacts++;
	}
	
	if(currentContacts == maxContacts){
		//Disable add button and exit.
		document.getElementById('question' + questionID + 'addButton').style.display = 'none';
		return;
	}else{
		document.getElementById('question' + questionID + 'addButton').style.display = '';
	}
}


function checkContacts(incompleteSubmit){
	
	//Get all question nodes.
	var isFN=document.getElementById('qnreType').value=='F';
	if (!isFN) //ego-centric questionnaire. Complex validation
	{
		var questions = document.getElementsByName('question');
		var error = false;
		var FIRST_NAME_INDEX = 0;
		var LAST_NAME_INDEX = 1;
		var EMPLOYEE_ID_INDEX = 2;
		var VALUE_INDEX = 1;
		var NAME_COUNT = 3;
		var output='';
		var resultsArray = new Array();
		var focusElem=null;
		//var entryRegExp=New RegExp("question*entry*","gi");
		for(var i = 0; i < questions.length; i++)
		{
			var question = document.getElementById(questions[i].value);
			var indEntryError=false;
			
			//Get the list of first name and last names inside each question.
			var numEntries=document.getElementById(question.id+ 'maxContacts').value;
	
			var entries = document.getElementsByName(question.id + 'Entry');
			
			
			
			//Check names if question is compulsary.
			compulsary = document.getElementById(question.id + 'compulsary').value;
	
			//AllowContacts outside roster
			outsideRoster = document.getElementById(question.id + 'displayType').value==1?true:false;
	
			//assume thr's no entry found till one's found
			var fullEmpty = true;
	
			//assume thr's no error till one's found
			
		//Check each question for valid presence of each element
			for(var k = 1; k <= numEntries; k++)
			{
				//var entryName="div#question"+question.id+"entry" ;
				//if(entries[k].id=='')//autocomplete div
					//continue;
				var entry=document.getElementById(question.id+'entry'+k);	
				var AlterFirstName = document.getElementById(question.id+'alterfirstname'+k);
				var AlterLastInitial = document.getElementById(question.id+'alterlastinitial'+k);
				AlterFirstName.value=nameFormat(Trim(AlterFirstName.value));
				AlterLastInitial.value=nameFormat(Trim(AlterLastInitial.value));
				var employeeid=document.getElementById(question.id+'employeeid'+k);
				var errorMsg = document.getElementById(entry.id + 'errorMsg');
				clearErrorMsg(errorMsg);
				if(AlterFirstName.value==''|| AlterLastInitial.value=='')
				{
					if(AlterFirstName.value=='' && AlterLastInitial.value!='')
					{
						error=true;
						indEntryError=true;
						fullEmpty=false;
						if(!focusElem)
							focusElem=AlterFirstName;	
						setErrorMsg(errorMsg,1);	
					}
					else if(AlterLastInitial.value=='' && AlterFirstName.value!='')
					{
						error=true;
						indEntryError=true;
						fullEmpty=false;
						if(!focusElem)
							focusElem=AlterLastInitial;	
						setErrorMsg(errorMsg,2);	
					}
					if(incompleteSubmit)
						clearErrorMsg(errorMsg);
				}
				else //valid Entry - check if this entry is present in same question
				{
					if(!indEntryError)
					{
						fullEmpty=false;
						found = false;
						//Check if first name and last name already exists, set flag for question.
						for(var m = 0; m < resultsArray.length; m++)
						{
							if(resultsArray[m][FIRST_NAME_INDEX][VALUE_INDEX] == AlterFirstName.value && resultsArray[m][LAST_NAME_INDEX][VALUE_INDEX] == AlterLastInitial.value)
							{
								found = true;
								//Check for duplicate 	
								if(resultsArray[m][NAME_COUNT + i][1] == 1)
								{
									if(!focusElem)
										focusElem=errorMsg;
									error = true;
									indEntryError=true;
									if(!incompleteSubmit)
										setErrorMsg(errorMsg,3);		
									if(incompleteSubmit)
										clearErrorMsg(errorMsg);
								}
								else
								{
									//Set the flag for question i.
									resultsArray[m][NAME_COUNT + i][0] = document.getElementById(question.id + 'identifier').value;
									resultsArray[m][NAME_COUNT + i][1] = 1;
								}
							}
						}
						//If not add to list
						if(!found)
						{
							resultsArray[resultsArray.length] = new Array();
							resultsArray[resultsArray.length - 1][FIRST_NAME_INDEX] = new Array('AlterFirstName', AlterFirstName.value);
							resultsArray[resultsArray.length - 1][LAST_NAME_INDEX] = new Array('AlterLastInitial', AlterLastInitial.value);
							resultsArray[resultsArray.length - 1][EMPLOYEE_ID_INDEX] = new Array('Employeeid', employeeid.value);
							//Fill in array and default 0 values for all questions and 1 for question i.
							for(var m = 0; m < questions.length; m++)
							{
								var tempQuestion = document.getElementById(questions[m].value);
								value = m == i ? 1 : 0;
								
								resultsArray[resultsArray.length - 1][NAME_COUNT + m] = new Array(document.getElementById(tempQuestion.id + 'identifier').value, value);
							}
						}
					}
					
				}
			}
			if(fullEmpty && compulsary=='true')
			{
				error=true;
				var errorMsg = document.getElementById(question.id+'entry1errorMsg');
				setErrorMsg(errorMsg,0);
				if(!focusElem && !incompleteSubmit)
					focusElem=document.getElementById(question.id+'entry1').getElementsByTagName('input')[0];	
				if(incompleteSubmit)
					clearErrorMsg(errorMsg);
			}
		}
	
		resultsArray.sort(sortByAlterFirstName);
		
		var output = '';
		for(var i = 0; i < resultsArray.length; i++){
			for(var k = 0; k < resultsArray[i].length; k++){
				//output += resultsArray[i][k][0] + '=' + resultsArray[i][k][1]+',';
				if(k < resultsArray[i].length-1)
					output += resultsArray[i][k][1]+',';
				else
					output += resultsArray[i][k][1];
			}
			if(i < resultsArray.length-1)
				output += ';';
			//output += '<br />';
		}
		document.getElementById('filtered').value = output;
		if(!error)
		{
			document.getElementById('masterErrorTag').style.display='none';
			document.form1.submit();
			//alert(output);
		}
		else
		{
			if(!incompleteSubmit)
			document.getElementById('masterErrorTag').style.display='';
			//if(focusElem)
				//focusElem.focus();
			return false;	
		}
	
		
	}
	else //Simple Validation using jquery
	{
		var error=false;
		var output='';
		var ids=$('#contacts').getDataIDs();
		var row;
		var compulsory=document.getElementById('compulsory');
		if(ids.length>0)
		{
			for(i=0;i<ids.length;i++)
			{
				row = $('#contacts').getRowData(ids[i]);	
				if(i<ids.length-1)
					output+=row.firstname+","+row.lastname+","+ids[i]+",1;";
				else	
					output+=row.firstname+","+row.lastname+","+ids[i]+",1";
			}
			document.getElementById('filtered').value=output;
			document.form1.submit();
			
		}	
		else
		{
			if(!incompleteSubmit && isCompulsory)
				$("#error_nocontacts").dialog('open');
			else
			{//document.getElementById('contactsErrorMsg').style.display='';
				document.getElementById('filtered').value='';
				document.form1.submit();
			}
			return false;	
		}

		//alert(output);
	}



}



function setErrorMsg(field,errorType)
{
	if(field)
	{
		if(errorType == 0)//empty field
		{
			field.innerHTML='Please enter a valid contact name';
			field.className='error_small';
		}
		else if(errorType == 1)//Duplicate Entry
		{
			field.innerHTML='Please enter a First Name for the contact';
			field.className='error_small';
		}
		else if(errorType == 2)//Duplicate Entry
		{
			field.innerHTML='Please enter a Last Initial for the contact';
			field.className='error_small';
		}
		else if(errorType == 3)//Duplicate Entry
		{
			field.innerHTML='Duplicate Entry';
			field.className='error_small';
		}
		else if(errorType == 4)//Entry not in roster
		{
			field.innerHTML='Contact not in roster';
			field.className='error_small';
		}
	}
}

function clearErrorMsg(field)
{
	if(field)
	{
		field.innerHTML='';
		field.className='';	
	}
}

function nameFormat(str)
{	
	if(str==null || str=='')
		return str;
	if(str.length==1)
		return str.toUpperCase();
	return str.substr(0,1).toUpperCase()+str.substr(1,str.length-1).toLowerCase();		
}


function RTrim(str)
{
		// We don't want to trip JUST spaces, but also tabs,
		// line feeds, etc.  Add anything else you want to
		// "trim" here in Whitespace
		var whitespace = new String(" \t\n\r");
		var s = new String(str);

		if (whitespace.indexOf(s.charAt(s.length-1)) != -1) {
			// We have a string with trailing blank(s)...

			var i = s.length - 1;       // Get length of string

			// Iterate from the far right of string until we
			// don't have any more whitespace...
			while (i >= 0 && whitespace.indexOf(s.charAt(i)) != -1)
				i--;


			// Get the substring from the front of the string to
			// where the last non-whitespace character is...
			s = s.substring(0, i+1);
		}

		return s;
}

function LTrim(str)
{
		var whitespace = new String(" \t\n\r");

		var s = new String(str);

		if (whitespace.indexOf(s.charAt(0)) != -1) {
			// We have a string with leading blank(s)...

			var j=0, i = s.length;

			// Iterate from the far left of string until we
			// don't have any more whitespace...
			while (j < i && whitespace.indexOf(s.charAt(j)) != -1)
				j++;


			// Get the substring from the first non-whitespace
			// character to the end of the string...
			s = s.substring(j, i);
		}

		return s;
}

function Trim(str)
{
		return RTrim(LTrim(str));
}
	


function firstAutoComplete(id){
	data = getUniqueAlterFirstNames().sort();
    AutoComplete_Create(id, data);
}

function lastAutoComplete(id){
	data = getUniqueAlterLastInitials().sort();
    AutoComplete_Create(id, data);
}

function autoComplete(id,relatedField)
{
	data = getUniqueNames(relatedField).sort();
    AutoComplete_Create(id, data);
}

function getUniqueNames(relatedField){
	var inputs = document.getElementsByTagName('input');
	var namesArray = new Array();
	var count = 0;
	
	for(var i = 0; i < inputs.length; 	i++){
		if(inputs[i].name == relatedField){
			namesArray[count++] = inputs[i].value;
		}
	}
	
	return unique(namesArray);
}

function getUniqueAlterFirstNames(){
	var inputs = document.getElementsByTagName('input');
	var namesArray = new Array();
	var count = 0;
	
	for(var i = 0; i < inputs.length; 	i++){
		if(inputs[i].name == "AlterFirstName"){
			namesArray[count++] = inputs[i].value;
		}
	}
	
	return unique(namesArray);
}

function getUniqueAlterLastInitials(){
	var inputs = document.getElementsByTagName('input');
	var namesArray = new Array();
	var count = 0;
	
	for(var i = 0; i < inputs.length; 	i++){
		if(inputs[i].name == "AlterLastInitial"){
			namesArray[count++] = inputs[i].value;
		}
	}
	
	return unique(namesArray);
}

/**
 * Removes duplicates in the array 'a'
 * @author Johan Känngård, http://dev.kanngard.net
 */
function unique(a) {
	tmp = new Array(0);
	for(i=0;i<a.length;i++){
		if(!contains(tmp, a[i])){
			tmp.length+=1;
			tmp[tmp.length-1]=a[i];
		}
	}
	return tmp;
}

/**
 * Returns true if 's' is contained in the array 'a'
 * @author Johan Känngård, http://dev.kanngard.net
 */
function contains(a, e) {
	for(j=0;j<a.length;j++)if(a[j]==e)return true;
	return false;
}

function sortByAlterFirstName(a, b) {
	var x = a[0][1].toLowerCase();
	var y = b[0][1].toLowerCase();
	return ((x < y) ? -1 : ((x > y) ? 1 : 0));
}