
var ctlrbSingleConditon = null;
var ctlFilterListBox = null;
var ctlddlQuestion = null;
var ctlddlConditionOperator = null;
var ctlddlTextOperator = null;
var ctltxtConditionValue = null;
var ctltxtRangeMinValue = null;
var ctltxtRangeMaxValue = null;
var ctltxtFilters = null;
var ctlSelectOptions = null;
var ctlcbDemographicFilters = null;

var ctltxtSelectedQuestionValue = null;
var ctltxtSelectedOptionValue = null;

// !!NOTE!! These need to exactly match what is in demographicFilters.ascx.cs
var FILTERSPLIT = "&^|^&";
var FILTERPARTSPLIT = "%^|^%";

var globalField = null;

function onDemographicFiltersClick()
{
	if ((ctlcbDemographicFilters == null) || (ctlcbDemographicFilters.checked))
	{
		document.getElementById('divDemographicFilters').style.display = "block";
	}
	else
	{
		document.getElementById('divDemographicFilters').style.display = "none";
	}
}

function demographicFiltersInitialize(clientId, numNonText)
{
	
	ctlrbSingleConditon = document.getElementById(clientId + "_rbCondition");
	ctlFilterListBox = document.getElementById(clientId + "_lstFilters");
	ctlddlQuestion = document.getElementById(clientId + "_ddlQuestion");
	ctlddlConditionOperator = document.getElementById(clientId + "_ddlConditionOperator");
	ctlddlTextOperator = document.getElementById(clientId + "_ddlTextOperator");
	ctltxtConditionValue = document.getElementById(clientId + "_txtConditionValue");
	
	ctltxtRangeMinValue = document.getElementById(clientId + "_txtRangeMinValue");
	ctltxtRangeMaxValue = document.getElementById(clientId + "_txtRangeMaxValue");
	ctltxtFilters = document.getElementById(clientId + "_txtFilters");
	ctlcbDemographicFilters = document.getElementById(clientId + "_cbDemographicFilters");
	ctltxtddlState = document.getElementById(clientId + "_txtddlState");

	ctltxtSelectedQuestionValue = document.getElementById(clientId + "_txtSelectedQuestionValue");
	ctltxtSelectedOptionValue = document.getElementById(clientId + "_txtSelectedOptionValue");			
	
	ctlSelectOptions = document.getElementById('demographicSelectOptions');

	if (ctlrbSingleConditon.disabled)
	{
		var divEditArea=document.getElementById("divEditArea");
		divEditArea.style.display="none";
		populateQuestions(false);
	}
	else
	{
		filterTypeChange();
		if (numNonText > 0)
			document.getElementById('divRadioButtons').style.display = "block";
		else
			document.getElementById('divRadioButtons').style.display = "none";
	}
	
	//fill the list box with the initial values from the text box
	//because the list box does not change state
	populateListBox();

	onDemographicFiltersClick();
}

function reselectQuestion()
{
	var selectedQuestionValue = ctltxtSelectedQuestionValue.value;
	if (selectedQuestionValue.length > 0)
	{
		for (var i=ctlddlQuestion.options.length-1;i>-1;i=i-1)
		{
			if (ctlddlQuestion.options[i].value == selectedQuestionValue)
			{
				ctlddlQuestion.options[i].selected = true;
				onQuestionChange(ctlddlQuestion);
				break;
			}
		}
	}
}

function reselectOption()
{
	var selectedValue = ctltxtSelectedOptionValue.value;
	if (selectedValue.length > 0)
	{
		for (var i=ctlSelectOptions.options.length-1;i>-1;i=i-1)
		{
			if (ctlSelectOptions.options[i].value == selectedValue)
			{
				ctlSelectOptions.options[i].selected = true;
				break;
			}
		}
	}
}

function clearQuestions()
{
	for (var i=ctlddlQuestion.options.length-1;i>-1;i=i-1)
	{
		if (ctlddlQuestion.options[i].selected)
		{
			selectedQuestionValue = ctlddlQuestion.options[i].value;
		}
		ctlddlQuestion.options[i] = null;
	}
}

function clearConditionValueOptions()
{
	for (var i=ctlSelectOptions.options.length-1;i>-1;i=i-1)
	{
		if (ctlSelectOptions.options[i].selected)
		{
			selectedOptionValue = ctlSelectOptions.options[i].value;
		}
		ctlSelectOptions.options[i] = null;
	}
}

function onOptionChange(combo)
{
	ctltxtSelectedOptionValue.value = combo.options[combo.selectedIndex].value;
}

function onQuestionChange(combo)
{
	var questionCode = combo.options[combo.selectedIndex].value;
	ctltxtSelectedQuestionValue.value = questionCode;
	
	if (isQuestionText(questionCode))
	{
		document.getElementById('divIs').style.display = "block";
		document.getElementById('divOperator').style.display = "none";
		
		if (isQuestionOption(questionCode))
		{
			document.getElementById('divConditionValueText').style.display = "none";
			document.getElementById('divConditionValueOptions').style.display = "block";
			
			clearConditionValueOptions();
			//dynamic function
			populateConditionValueOptions(questionCode);
			reselectOption();
			
		}
		else
		{
			document.getElementById('divConditionValueText').style.display = "block";
			document.getElementById('divConditionValueOptions').style.display = "none";
		}
		
	}
	else
	{
		document.getElementById('divIs').style.display = "none";
		document.getElementById('divOperator').style.display = "block";
		document.getElementById('divConditionValueText').style.display = "block";
		document.getElementById('divConditionValueOptions').style.display = "none";
	}
}

function getOptionFieldName(questionCode)
{

	var sText = "";
	
	for (var i=0;i<ctlddlQuestion.options.length;i++)
	{
		if (ctlddlQuestion.options[i].value == questionCode)
		{
			sText = ctlddlQuestion.options[i].text;
			break;
		}
	}
	
	return sText;
}

function populateOption(optionValue)
{
	if (optionValue.length > 0)
	{
	
		var optionText = "";
		var parts = optionValue.split(FILTERPARTSPLIT);
		
		var bText = isQuestionText(parts[0]);

		if (bText)
		{
			optionText = getOptionFieldName(parts[0])
			if (parts[1] == '<>')
				optionText = optionText + " is not ";
			else
				optionText = optionText + " is ";
		}
		else
			optionText = getOptionFieldName(parts[0]) + " " + parts[1] + " ";
		
		var bBetween = (parts[1] == "between");
		
		if (bText)
		{
			optionText = optionText + "'";	
		}
		
		optionText = optionText + parts[2];
		
		if (bText)
		{
			optionText = optionText + "'";	
		}
		
		if (bBetween)
		{
			optionText = optionText + " and ";
			
			if (bText)
			{
				optionText = optionText + "'";	
			}

			optionText = optionText + parts[3];
						
			if (bText)
			{
				optionText = optionText + "'";	
			}
		
		}		
		
		var cItems = ctlFilterListBox.length;
		var option = new Option(optionText, optionValue, false, false);
		ctlFilterListBox.options[cItems] = option;
	}
}

function populateListBox()
{
	//the text field holds it's state, so parse the options from it
	var stateText = ctltxtFilters.value;

	if (stateText.length > 0)
	{
	
		var optionTextArray = stateText.split(FILTERSPLIT);
		for (var i=0; i < optionTextArray.length; i++)		
		{
			populateOption(optionTextArray[i]);			
		}
	}
	
}

function isQuestionPhone(questionCode)
{
	if (questionCode.indexOf(":7") >= 0)
		return true;
	else
		return false;
}

function isQuestionDate(questionCode)
{
	if (questionCode.indexOf(":6") >= 0)
		return true;
	else
		return false;
}

function isQuestionNumeric(questionCode)
{
	if (questionCode.indexOf(":5") >= 0)
		return true;
	else
		return false;
}

function isQuestionOption(questionCode)
{
	if ((questionCode.indexOf(":3") < 0) & (questionCode.indexOf(":4") < 0))
		return false;
	else
		return true;
}

function isQuestionText(questionCode)
{
	if ((questionCode.indexOf(":5") < 0) & (questionCode.indexOf(":6") < 0))
		return true;
	else
		return false;
}

function updateFilterText()
{
	
	var sFilterText = "";
	for (var i=0;i<ctlFilterListBox.length;i++)
	{
		sFilterText = sFilterText + ctlFilterListBox.options[i].value + FILTERSPLIT;
	}
	
	ctltxtFilters.value = sFilterText;
	
}

function validatePhoneNumber(numberStr)
{
    //Store all the illegal characters here
	var illegalChars = ""; 

	//process to remove non-numbers and spaces
	for(var i = 0; i < numberStr.length; i++) 
	{
		var character = numberStr.charAt(i);
		if(isNaN(character) && character != "-" && character != "(" && character != ")" && character != " " && character != "+" && character != ".") 
			illegalChars += character;
	}

	return (illegalChars.length == 0);	
}

//The database stores numbers up to numeric(18,4) - up to 14 digits to the left
//of the decimal place, 4 to the right.
function isValidNumber(numberStr)
{
    //strip out commas
    var strippedNumberStr = '';
	for(var i = 0; i < numberStr.length; i++) 
	{
		var character = numberStr.charAt(i);
		if(character != ',')
		{
			strippedNumberStr += character;
		}
	}
    
    if (isNaN(strippedNumberStr))
    {
        window.alert("\"" + numberStr + "\" is not a number");
        return false;
    }

    var numberArray = strippedNumberStr.split('.');
    if (numberArray.length > 2)
    {
        window.alert("\"" + numberStr + "\" is not a number");
        return false;
    }
    if (numberArray[0].length > 14)
    {
        window.alert("Numeric answers cannot exceed 14 digits.");
        return false;
    }
    if (numberArray.length < 2)
    {
        return true;
    }
    if (numberArray[1].length > 4)                
    {
        window.alert("Please limit numeric answers to 4 numbers after the decimal.  For example 9.9999.");
        return false;
    }
    
    return true;
//	var objRegExp  =  /(^-?\d\d*\.\d*$)|(^-?\d\d*$)|(^-?\.\d\d*$)/;
//	//check for numeric characters
//	return objRegExp.test(numberStr);
}

function isValidDate(dateStr, format)
{
	if (format == null) 
	{ 
		format = "MDY"; 
	}

	format = format.toUpperCase();

	if (format.length != 3) 
	{ 
		format = "MDY"; 
	}

	if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) || (format.indexOf("Y") == -1) )
	{
		format = "MDY"; 
	}
	
	if (format.substring(0, 1) == "Y") 
	{ // If the year is first
		var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
		var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	} 
	else if (format.substring(1, 2) == "Y") 
	{ // If the year is second
		var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
		var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
	} 
	else 
	{ // The year must be third
		var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
		var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	}
	
	// If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
	if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) 
	{ return false; }
	
	var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
	// Check to see if the 3 parts end up making a valid date
	if (format.substring(0, 1) == "M") 
	{ var mm = parts[0]; } 
	else if (format.substring(1, 2) == "M") 
	{ var mm = parts[1]; } 
	else 
	{ var mm = parts[2]; }
	
	if (format.substring(0, 1) == "D") 
	{ var dd = parts[0]; } 
	else if (format.substring(1, 2) == "D") 
	{ var dd = parts[1]; } 
	else 
	{ var dd = parts[2]; }
	
	if (format.substring(0, 1) == "Y") 
	{ var yy = parts[0]; } 
	else if (format.substring(1, 2) == "Y") 
	{ var yy = parts[1]; } 
	else 
	{ var yy = parts[2]; }
	
	if (parseFloat(yy) <= 50) 
	{ yy = (parseFloat(yy) + 2000).toString(); }
	
	if (parseFloat(yy) <= 99) 
	{ yy = (parseFloat(yy) + 1900).toString(); }
	
	var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
	if (parseFloat(dd) != dt.getDate()) 
	{ return false; }
	
	if (parseFloat(mm)-1 != dt.getMonth()) 
	{ return false; }
	
	return true;
}

function validateRangeFields(minField, maxField, bDate, bNumber)
{
	var minValue = minField.value;
	var maxValue = maxField.value;
	if (bDate)
	{
		var minDate = new Date(minValue);
		var maxDate = new Date(maxValue);
		if (maxDate < minDate)
		{
			window.alert("First range date cannot be greater than second range date.");
			minField.focus();
			return false;
		}
	}
	else if (bNumber)
	{
		var minNumber = new Number(minValue);
		var maxNumber = new Number(maxValue);
		if (maxNumber < minNumber)
		{
			window.alert("First range number cannot be greater than second range number.");
			minField.focus();
			return false;
		}
	}
	
	return true;
}

function validateTextFieldLength(controlField, length)
{
    var textValue = controlField.value;
    if(textValue.length>length)
    {
	    alert("You have " + controlField.value.length + " characters. Please limit your answer to only " + length + " characters.");

		globalField = controlField;		
	 	setTimeout("SetFocusGlobalField();", 0);    		
	 	 
	    return false;
    }
    else
    {
        globalField = null;
        return true;
    }
}

function validateNumericField(controlField, minValue, maxValue)
{
	var textValue = controlField.value;

	if(!isValidNumber(textValue))
	{
		//window.alert("Numeric answers cannot exceed 14 digits.");
		globalField = controlField;		
	 	setTimeout("SetFocusGlobalField();", 0);    		

		return false;
	}
		
	var nValue = parseFloat(textValue);
	
	if ((minValue != null) && (minValue > nValue))
	{
		alert("Must be greater than or equal to " + minValue + ".");

		globalField = controlField;		
	 	setTimeout("SetFocusGlobalField();", 0);    		

		return false;
	}
	
	if ((maxValue !=null) && (maxValue < nValue))
	{    
		alert("Must be less than or equal to " + maxValue + ".");		
		
		globalField = controlField;		
	 	setTimeout("SetFocusGlobalField();", 0);    		
	 	
        return false;
	}
		
	globalField = null;
		
	return true;
}

function SetFocusGlobalField()
{
    globalField.focus();
}

function validateForm() 
{
    return (globalField == null);
}

function validateTextField(controlField, bDate, bNumber, bPhone)
{
	var textValue = controlField.value;
	
	if (bDate)
	{
		globalField = null;

		if (!isValidDate(textValue))
		{
			window.alert(textValue + " is not a valid date format.  Enter date with mm/dd/yyyy format.");

			globalField = controlField;		
    	 	setTimeout("SetFocusGlobalField();", 0);    		

			return false;
		}
	}
	else if (bNumber)
	{
		globalField = null;

		if(!isValidNumber(textValue))
		{
			//window.alert(textValue + " is not a valid number, or exceeds the allowed value.");
			globalField = controlField;		
	 	    setTimeout("SetFocusGlobalField();", 0);    		

			return false;
		}
	}
	else if (bPhone)
	{
		globalField = null;

		var isValidPhone = validatePhoneNumber(textValue);
		if (!isValidPhone)
		{
			window.alert(textValue + " is not a valid phone number.  Enter a valid phone number.");
					
			globalField = controlField;		
	 	    setTimeout("SetFocusGlobalField();", 0);    		

			return false;
		}
	}
	
	return true;
}

function addFilter()
{
	
	var sFilter = "";
	var sValue = "";
	var questionType;
	var questionCode = ctlddlQuestion.options[ctlddlQuestion.selectedIndex].value;
	var bText = isQuestionText(questionCode);
	var bOption = isQuestionOption(questionCode);
	var bDate = isQuestionDate(questionCode);
	var bNumber = isQuestionNumeric(questionCode);
	var bPhone = isQuestionPhone(questionCode);
	
	sFilter = sFilter + ctlddlQuestion.options[ctlddlQuestion.selectedIndex].text;
	sValue = sValue + ctlddlQuestion.options[ctlddlQuestion.selectedIndex].value;

	if (ctlrbSingleConditon.checked)
	{
	
		sFilter = sFilter + ' ';
		sValue = sValue + FILTERPARTSPLIT;

		var ctlOperator = ctlddlConditionOperator;
		if (bText)
			ctlOperator = ctlddlTextOperator;
			
		sFilter = sFilter + ctlOperator.options[ctlOperator.selectedIndex].text;
		sValue = sValue + ctlOperator.options[ctlOperator.selectedIndex].value;

		sFilter = sFilter + ' ';
		sValue = sValue + FILTERPARTSPLIT;
		
		if (bText)
		{
			sFilter = sFilter + "'";	
		}

		if (bOption)
		{
			sFilter = sFilter + ctlSelectOptions.options[ctlSelectOptions.selectedIndex].value;
			sValue = sValue + ctlSelectOptions.options[ctlSelectOptions.selectedIndex].value;
		}
		else
		{
		
			if (!validateTextField(ctltxtConditionValue, bDate, bNumber, bPhone))
				return;
				
			var textValue = ctltxtConditionValue.value;
			sFilter = sFilter + textValue;
			sValue = sValue + textValue;
			
		}

		if (bText)
		{
			sFilter = sFilter + "'";	
		}
	
	}
	else
	{
	
		sFilter = sFilter + " between "
		sValue = sValue + FILTERPARTSPLIT + "between" + FILTERPARTSPLIT
	
		if (bText)
		{
			sFilter = sFilter + "'";	
		}

		if (!validateTextField(ctltxtRangeMinValue, bDate, bNumber, bPhone))
			return;
			
		var textValue = ctltxtRangeMinValue.value;
		sFilter = sFilter + textValue;
		sValue = sValue + textValue;
			
		if (bText)
		{
			sFilter = sFilter + "'";	
		}

		sFilter = sFilter + " and ";
		sValue = sValue + FILTERPARTSPLIT;
	
		if (bText)
		{
			sFilter = sFilter + "'";	
		}

		if (!validateTextField(ctltxtRangeMaxValue, bDate, bNumber, bPhone))
			return;
			
		if (!validateRangeFields(ctltxtRangeMinValue, ctltxtRangeMaxValue, bDate, bNumber))
			return;
			
		var textValue = ctltxtRangeMaxValue.value;
		sFilter = sFilter + textValue;
		sValue = sValue + textValue;
			
		if (bText)
		{
			sFilter = sFilter + "'";	
		}
		
	}
	
	var cItems = ctlFilterListBox.length;
	var option = new Option(sFilter, sValue, false, false);
	ctlFilterListBox.options[cItems] = option;
	
	updateFilterText();
	
}

function removeSelectedFilter()
{

	if (ctlFilterListBox.selectedIndex >= 0)
	{
		ctlFilterListBox.options[ctlFilterListBox.selectedIndex] = null;
	}
	
	updateFilterText();
	
}

function filterTypeChange()
{
	var divCondition = document.getElementById("divCondition");
	var divRange = document.getElementById("divRange");
	
	var bNonText = false;
	
	if (ctlrbSingleConditon.checked)
	{
		divRange.style.display = "none";
		divCondition.style.display = "block";
	}
	else
	{
		divCondition.style.display = "none";
		divRange.style.display = "block";
		bNonText = true;
	}
	
	clearQuestions();
	//dynamic function
	populateQuestions(bNonText);
	reselectQuestion();

}

