function limitCheckboxes(ckcount,FormName,CtrlName,CurElement)
{
var checkboxes_selected = 0;
var checkboxes = window.document[FormName].elements[CtrlName];

// Loop from zero to the one minus the number of checkbox button selections
for (var cnt = 0; cnt < checkboxes.length; cnt++)
{
	// If a checkbox has been selected it will return true
	// (If not it will return false)
	if (checkboxes[cnt].checked)
	{
		checkboxes_selected = checkboxes_selected + 1;
	}
}

if (checkboxes_selected > ckcount )
{
	alert('Please limit your choices to the ' + ckcount + ' most important for your job comparison.');
	CurElement.checked = false;
}

return;

}

function processSkip(yn)
{
	if (yn == false)
	{
		alert('PLEASE DO NOT SKIP THIS QUESTION. This question is important for evaluating your compensation.')
	}	
	else
	{
		window.document.newQuestion.skipbutton.value = 'Skip';
		window.document.newQuestion.submit();
	}
	return;
}

function isNumber(inputStr)  {
	var retVal = true;
	
	for (var i=0;i < inputStr.length;i++)
	{
		var oneChar = inputStr.substring(i,i+1);
		if ((oneChar < "0" || oneChar > "9") && (oneChar != ".") && (oneChar != ","))
		{
			retVal = false;
		}
	}

	return retVal;
}

function isState(inputStr)  {
	
	if (inputStr.length == 2)
	{
		switch(inputStr.toLowerCase())
		{
		case 'ak': inputStr = 'Alaska'; break;
		case 'al': inputStr = 'Alabama'; break;
		case 'ar': inputStr = 'Arkansas'; break;
		case 'az': inputStr = 'Arizona'; break;
		case 'ca': inputStr = 'California'; break;
		case 'co': inputStr = 'Colorado'; break;
		case 'ct': inputStr = 'Connecticut'; break;
		case 'dc': inputStr = 'District of Columbia'; break;
		case 'de': inputStr = 'Delaware'; break;
		case 'fl': inputStr = 'Florida'; break;
		case 'ga': inputStr = 'Georgia'; break;
		case 'gu': inputStr = 'Guam'; break;
		case 'hi': inputStr = 'Hawaii'; break;
		case 'ia': inputStr = 'Iowa'; break;
		case 'id': inputStr = 'Idaho'; break;
		case 'il': inputStr = 'Illinois'; break;
		case 'in': inputStr = 'Indiana'; break;
		case 'ks': inputStr = 'Kansas'; break;
		case 'ky': inputStr = 'Kentucky'; break;
		case 'la': inputStr = 'Louisiana'; break;
		case 'ma': inputStr = 'Massachusetts'; break;
		case 'md': inputStr = 'Maryland'; break;
		case 'me': inputStr = 'Maine'; break;
		case 'mi': inputStr = 'Michigan'; break;
		case 'mn': inputStr = 'Minnesota'; break;
		case 'mo': inputStr = 'Missouri'; break;
		case 'ms': inputStr = 'Mississippi'; break;
		case 'mt': inputStr = 'Montana'; break;
		case 'nc': inputStr = 'North Carolina'; break;
		case 'nd': inputStr = 'North Dakota'; break;
		case 'ne': inputStr = 'Nebraska'; break;
		case 'nh': inputStr = 'New Hampshire'; break;
		case 'nj': inputStr = 'New Jersey'; break;
		case 'nm': inputStr = 'New Mexico'; break;
		case 'nv': inputStr = 'Nevada'; break;
		case 'ny': inputStr = 'New York'; break;
		case 'oh': inputStr = 'Ohio'; break;
		case 'ok': inputStr = 'Oklahoma'; break;
		case 'or': inputStr = 'Oregon'; break;
		case 'pa': inputStr = 'Pennsylvania'; break;
		case 'pr': inputStr = 'Puerto Rico'; break;
		case 'ri': inputStr = 'Rhode Island'; break;
		case 'sc': inputStr = 'South Carolina'; break;
		case 'sd': inputStr = 'South Dakota'; break;
		case 'tn': inputStr = 'Tennessee'; break;
		case 'tx': inputStr = 'Texas'; break;
		case 'ut': inputStr = 'Utah'; break;
		case 'va': inputStr = 'Virginia'; break;
		case 'vi': inputStr = 'Virgin Islands'; break;
		case 'vt': inputStr = 'Vermont'; break;
		case 'wa': inputStr = 'Washington'; break;
		case 'wi': inputStr = 'Wisconsin'; break;
		case 'wv': inputStr = 'West Virginia'; break;
		case 'wy': inputStr = 'Wyoming'; break;
		}
	}
	return inputStr;
}

function doNumFieldValidate(inputStr,strFieldName)
{
	if (!isNumber(inputStr))
	{
		alert('Please enter a NUMERIC value.');
		return '';
	}
	else
	{
		return inputStr;
	}
}

function doPercentageValidate(inputStr)
{
	var wordArray = inputStr.split('%');

	inputStr = wordArray[0];

	//note - we purposely invalidate fractional numbers between 0 and 1
	if (isNumber(inputStr) && ((inputStr >= 1 && inputStr < 101) || inputStr==0))
	{
			return inputStr;

	}

	alert('For percentages, please enter an integer value between 0 and 100.')
	return '';
}

function doNumberRangeValidate(inputStr, low, high)
{

	if (isNumber(inputStr) && inputStr >= low && inputStr <= high)
	{
			return inputStr;
	}

	alert('Please enter a numeric value between ' + low + ' and ' + high + '.')
	return '';
}

function NormalizeCity(inputStr)
{
	var stateSuffix = /^(.+)\,( *([a-z]\.*[a-z]\.* *|Alabama|Alaska|Arizona|Arkansas|California|Colorado|Connecticut|Delaware|District of Columbia|Florida|Georgia|Hawaii|Idaho|Illinois|Indiana|Iowa|Kansas|Kentucky|Louisiana|Maine|Maryland|Massachusetts|Michigan|Minnesota|Mississippi|Missouri|Montana|Nebraska|Nevada|New Hampshire|New Jersey|New Mexico|New York|North Carolina|North Dakota|Ohio|Oklahoma|Oregon|Pennsylvania|Rhode Island|South Carolina|South Dakota|Tennessee|Texas|Utah|Vermont|Virginia|Washington|West Virginia|Wisconsin|Wyoming) *)$/i;
	var twoLetterPrefix = /^([a-z][a-z])[\,\.]+ *(.+)$/i;
	var matches;
	
	matches = inputStr.match(stateSuffix);
	if (matches != null)
	{
		inputStr = matches[1];
	}

	matches = inputStr.match(twoLetterPrefix);
	if (matches != null)
	{
		inputStr = matches[1] + '. ' + matches[2];
	}
	return inputStr;
}

// not using isNaN because i don't want to support stuff like '1e6' and '0x300'
function IsValidNumericAnswer(val, min, max)
{
	if (val == '' || val == '-')
	{
		return true;
	}
	var i = 0;
	if (val.charAt(0) == '-')
	{
		i++;
	}
	var hadDot = false;
	while (i < val.length)
	{
		var c = val.charAt(i);
		if (c == '.')
		{
			if (hadDot)
			{
				return false;
			}
			hadDot = true;
		}
		else if (c < '0' || c > '9')
		{
			return false;
		}
		i++;
	}
	var f = parseFloat(val);
	if (min != -1 && f < min)
	{
		return false;
	}	
	if (max != -1 && f > max)
	{
		return false;
    }

    if (f > 99999999999999)
    {
        return false;
    }
    
	return true;
}

function FormatNumericAnswer(flt, isCurrency, showSeparator)
{
	// can't just use toLocaleString because IE's implementation always shows
    // decimal places.  also it's spottily supported, apparently.
    var result = '';
    if (flt < 0)
    {
        flt = -flt;
        result = '-';
    }
    
    var minDecimals = 0;
    if ((flt < 100.0) && isCurrency)
    {
        minDecimals = 2;
    }
    var base = Math.floor(flt);
    var rest = flt - base;
    rest = Math.round(rest * 10000);
    if (rest >= 10000)
    {
        base++;
    }
    rest = (rest / 10000);

    // we can get away with toString() because we know it's integral and
    // we know it's smaller than the point at which it switches to exp notation
    base = base.toString();

    if (showSeparator)
    {
        var i;
        var len = base.length;
        for (i = 0; i < len; i++)
        {
            result += base.charAt(i);
            if ((((len - i - 1) % 3) == 0) && (i != len - 1))
            {
                result += ',';
            }
        }
    }
    else
    {
        result = base;
    }

    if (rest == 0 || rest == 1)
    {
        if (minDecimals == 2)
        {
            result += '.00';
        }
    }
    else
    {
        rest = rest.toString();
        result += rest.substring(1);
        for (i = rest.length + 1; i < minDecimals; i++)
        {
            result += '0';
        }
    }
	return result;
}

function RenderNumericAnswer(val, singularFmt, pluralFmt, currencyDropdownId, showSeparator)
{
	if (val == '' || val == '.' || val == '-')
	{
		return '';
    }
    var isCurrency = false;
    if (singularFmt.indexOf('{$}') != -1)
    {
        isCurrency = true;
    }
	var formatted = FormatNumericAnswer(parseFloat(val), isCurrency, showSeparator);
	var pos;
	var formatString;
	if (parseFloat(val) == 1.0)
	{
		formatString = singularFmt;
	}
	else
	{
		formatString = pluralFmt;
	}
	if (formatString == '' || ((pos = formatString.indexOf('{')) == -1))
	{
		return formatted;
	}
	if ((formatString.length < pos + 3) || (formatString.charAt(pos + 2) != '}'))
	{
		return formatted;
	}
	var type = formatString.charAt(pos + 1);
	switch (type)
	{
		case '%':
			formatted += '%';
			break;
		case '$':
			var currencyDropdown = document.getElementById(currencyDropdownId);
			if (currencyDropdown != null)
			{
				var selectedOption = currencyDropdown.options[currencyDropdown.selectedIndex];
				if (selectedOption != null)
				{
					var currencyFmt = selectedOption.getAttribute("formatString");
					if (currencyFmt != null)
					{
						formatted = currencyFmt.replace(/{#}/, formatted);
					}
				}
			}
			break;
	}
	return formatString.substring(0, pos) + formatted + formatString.substring(pos + 3);
}

function ValidateNumericField(ctrl, singularFmt, pluralFmt, min, max, currencyDropdownId, showSeparator, showPopup)
{
	if (ctrl._singularFormat == null)
	{
		ctrl._singularFormat = singularFmt;
	}
	if (ctrl._pluralFormat == null)
	{
		ctrl._pluralFormat = pluralFmt;
    }
    if (ctrl._showSeparator == null)
    {
        ctrl._showSeparator = showSeparator;
    }
	
	var target = document.getElementById(ctrl.id + "_fbk");
	var errorPane = document.getElementById(ctrl.id + "_err");
	if (!IsValidNumericAnswer(ctrl.value, min, max))
	{
		ctrl._isValid = false;
		target.innerHTML = '<span style="color:red; text-decoration: underline; cursor:hand; cursor:pointer;">ERROR</span>';
		if (showPopup)
		{
			target.style.display = "none";

			errorPane.left = ctrl.right + 1;
			errorPane.top = ctrl.top;
			errorPane.style.display = "inline";
			errorPane._hovering = false;
		}
	}
	else
	{
		ctrl._isValid = true;
		target.innerHTML = RenderNumericAnswer(ctrl.value, singularFmt, pluralFmt, currencyDropdownId, showSeparator);
		target.style.display = "inline";
		errorPane.style.display = "none";
	}
}

function RefreshCurrencyDisplay(ctrlId, currencyDropdownId)
{
	var ctrl = document.getElementById(ctrlId);
	if ((ctrl._isValid != null) && !ctrl._isValid)
	{
		return;
	}
	if (ctrl._singularFormat == null)
	{
		return;
	}
	var target = document.getElementById(ctrlId + "_fbk");
	target.innerHTML = RenderNumericAnswer(ctrl.value, ctrl._singularFormat, ctrl._pluralFormat, currencyDropdownId, ctrl._showSeparator);
}

function ClearInvalidFields()
{
    for (var ctrlId in aff)
    {
        var ctrl = aff[ctrlId][0];
        if ((ctrl._isValid != null) && !ctrl._isValid)
        {
            ctrl.value = '';
        }
    }
}

function doFeedbackMouseOver(ctrl, min, max)
{
	var baseId = ctrl.id.substring(0, ctrl.id.length - 4);
	var input = document.getElementById(baseId);
	if ((input._isValid != null) && !input._isValid)
	{
		var errorPane = document.getElementById(baseId + "_err");
		errorPane.style.display = "inline";
		errorPane._hovering = true;
		ctrl.style.display = "none";
	}
}

function doNumericFocus(ctrl, min, max)
{
	if ((ctrl._isValid != null) && !ctrl._isValid)
	{
		var errorPane = document.getElementById(ctrl.id + "_err");
		errorPane.style.display = "inline";
		errorPane._hovering = false;
		var target = document.getElementById(ctrl.id + "_fbk");
		target.style.display = "none";
	}
}

function doNumericBlur(ctrl, singularFmt, pluralFmt, min, max, currencyDropdownId, showSeparator, showPopup)
{
    ValidateNumericField(ctrl, singularFmt, pluralFmt, min, max, currencyDropdownId, showSeparator, showPopup)
	var errorPane = document.getElementById(ctrl.id + "_err");
	errorPane.style.display = "none";
	var target = document.getElementById(ctrl.id + "_fbk");
	target.style.display = "inline";
}

function doErrorMouseOut(ctrl)
{
	if ((ctrl._hovering != null) && ctrl._hovering)
	{
		var baseId = ctrl.id.substring(0, ctrl.id.length - 4);
		var target = document.getElementById(baseId + "_fbk");
		ctrl.style.display = "none";
		target.style.display = "inline";
	}
}

