/* Dynamic Criteria Functions For Microsites */

function SetValueForStatementVariable(fieldType, validationType, elmName, varName, operator, val, blockMethodDelegate)
{
	var elm = document.getElementById(elmName);
	var resultText = "false";
	var dynCriteriaCtl;
	
	if (elm)
	{
		switch (fieldType)
		{
			case 4:
				dynCriteriaCtl = new RadioButtonDynCriteria(elm, operator, val);
				break;
			case 5:
				dynCriteriaCtl = new SelectBoxDynCriteria(elm, operator, val, false);
				break;
			case 3:
				dynCriteriaCtl = new CheckBoxDynCriteria(elm, operator, val, false);
				break;
			case 1:
				if (validationType == 1)
					dynCriteriaCtl = new TextBoxDynCriteria(elm, operator, val);
				else if (validationType == 2)
					dynCriteriaCtl = new NumericTextBoxDynCriteria(elm, operator, val);
				else if (validationType == 3)
					dynCriteriaCtl = new DateTimeTextBoxDynCriteria(elm, operator, val);
				else if (validationType == 4)
					dynCriteriaCtl = new DateTextBoxDynCriteria(elm, operator, val);
				else if (validationType == 5)
					dynCriteriaCtl = new TimeTextBoxDynCriteria(elm, operator, val);				
				else if (validationType == 7)
					dynCriteriaCtl = new EmailTextBoxDynCriteria(elm, operator, val);
				else
					alert("Validation type " + validationType + " not supported.");
				break;
			case 8:
				if (elm.tagName.toLowerCase() == "select")
					dynCriteriaCtl = new SelectBoxDynCriteria(elm, operator, val, true);
				else
					dynCriteriaCtl = new CheckBoxDynCriteria(elm, operator, val, true);
				break;
			default:
				alert("Field type not supported for dynamic criteria.");
				break;
		}
	}
	
	if (dynCriteriaCtl && dynCriteriaCtl.evaluateControl())
		resultText = "true";
	eval(varName + " = " + resultText);
	if (blockMethodDelegate)
		eval(blockMethodDelegate);
}

/* Base Class */
DynCriteriaControl = function(elm, operator, val)
{
	this.ctlElement = elm;
	this.ctlOperator = operator;
	this.staticVal = val;
}

DynCriteriaControl.prototype.getDynCriteriaControlValue = function()
{
	return this.convertValItem(this.getRawDynCriteriaControlValue());	
}

DynCriteriaControl.prototype.getRawDynCriteriaControlValue = function()
{
	alert("getRawDynCriteriaControlValue not implemented");
}

DynCriteriaControl.prototype.handleEqualTo = function(leftSide, rightSide)
{
	return leftSide + " == " + rightSide;
}

DynCriteriaControl.prototype.handleLessThan = function(leftSide, rightSide)
{
	return leftSide + " < " + rightSide;
}

DynCriteriaControl.prototype.handleGreaterThan = function(leftSide, rightSide)
{
	return leftSide + " > " + rightSide;
}

DynCriteriaControl.prototype.handleLessThanOrEqualTo = function(leftSide, rightSide)
{
	return leftSide + " <= " + rightSide;
}

DynCriteriaControl.prototype.handleGreaterThanOrEqualTo = function(leftSide, rightSide)
{
	return leftSide + " >= " + rightSide;
}

DynCriteriaControl.prototype.handleNotEqualTo = function(leftSide, rightSide)
{
	return leftSide + " != " + rightSide;
}

DynCriteriaControl.prototype.handleStartsWith = function(leftSide, rightSide)
{
	return leftSide + ".indexOf(" + rightSide + ") == 0";
}

DynCriteriaControl.prototype.handleContains = function(leftSide, rightSide)
{
	return leftSide + ".indexOf(" + rightSide + ") != -1";
}

DynCriteriaControl.prototype.handleIsNull = function(leftSide, rightSide)
{
	return leftSide + ".length == 0";
}

DynCriteriaControl.prototype.handleIsNotNull = function(leftSide, rightSide)
{
	return leftSide + ".length >= 0";	
}

DynCriteriaControl.prototype.handleChecked = function(leftSide, rightSide)
{
	return leftSide + " == true";
}

DynCriteriaControl.prototype.handleUnchecked = function(leftSide, rightSide)
{
	return leftSide + " == false";
}

DynCriteriaControl.prototype.handleOneOfTheFollowing = function(leftSide, rightSide)
{
	return "true == false";
}

DynCriteriaControl.prototype.handleNoneOfTheFollowing = function(leftSide, rightSide)
{
	return "true == false";
}

DynCriteriaControl.prototype.handleAllOfTheFollowing = function(leftSide, rightSide)
{
	return "true == false";
}

DynCriteriaControl.prototype.getOperatorValueSet = function(leftSide, rightSide)
{
	switch (this.ctlOperator)
	{
		case g_Operators.opEqualTo:
			return this.handleEqualTo(leftSide, rightSide);
			break;
		case g_Operators.opLessThan:
			return this.handleLessThan(leftSide, rightSide);
			break;
		case g_Operators.opGreaterThan:
			return this.handleGreaterThan(leftSide, rightSide);
			break;
		case g_Operators.opLessThanOrEqualTo:
			return this.handleLessThanOrEqualTo(leftSide, rightSide);
			break;
		case g_Operators.opGreaterThanOrEqualTo:
			return this.handleGreaterThanOrEqualTo(leftSide, rightSide);
			break;
		case g_Operators.opNotEqualTo:
			return this.handleNotEqualTo(leftSide, rightSide);
			break;
		case g_Operators.opStartsWith:
			return this.handleStartsWith(leftSide, rightSide);
			break;
		case g_Operators.opContains:
			return this.handleContains(leftSide, rightSide);
			break;
		case g_Operators.opIsNull:
			return this.handleIsNull(leftSide, rightSide);
			break;
		case g_Operators.opIsNotNull:
				return this.handleIsNotNull(leftSide, rightSide);	
			break;
		case g_Operators.opChecked:
			return this.handleChecked(leftSide, rightSide);
			break;
		case g_Operators.opUnchecked:
			return this.handleUnchecked(leftSide, rightSide);
			break;
		case g_Operators.opOneOfTheFollowing:
			return this.handleOneOfTheFollowing(leftSide, rightSide);
			break;
		case g_Operators.opNoneOfTheFollowing:
			return this.handleNoneOfTheFollowing(leftSide, rightSide);
			break;
		case g_Operators.opAllOfTheFollowing:
			return this.handleAllOfTheFollowing(leftSide, rightSide);
			break;
		default:
			alert("Operator " + this.ctlOperator + " not supported.");	
	}
}

DynCriteriaControl.prototype.getResultValues = function()
{
	var arr = new Array();
	var separator = "~~@~~";
	if (this.staticVal.indexOf(separator) != -1)
	{
		var arrTwo = this.staticVal.split(separator);
		for (var i = 0; i < arrTwo.length; i++)
			arr.push(this.convertValItem(arrTwo[i]));		
	}	
	else
		arr.push(this.convertValItem(this.staticVal));

	return arr;
}

DynCriteriaControl.prototype.convertValItem = function(valItem)
{
	return valItem.toString();
}

DynCriteriaControl.prototype.evaluateControl = function()
{
	var currentCtlValue = this.getDynCriteriaControlValue();
	var resultVals = this.getResultValues();
	
	var js = "";
	for (var i = 0; i < resultVals.length; i++)
	{
		if (js.length > 0)
			js += " || ";
		else
			js += "(";
		js += this.getOperatorValueSet(currentCtlValue, resultVals[i]);
	}
	
	js += ")";
	
	return eval(js);
}

/* Check Box */
CheckBoxDynCriteria = function(elm, operator, val, isMulti)
{
	this.isMulti = isMulti;
	CheckBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(CheckBoxDynCriteria, DynCriteriaControl);

CheckBoxDynCriteria.prototype.getRawDynCriteriaControlValue = function()
{
	if (this.isMulti)
	{
		// We need to get all values by name
		var elmName = this.ctlElement.getAttribute("name");
		var countElm = document.getElementById(elmName + "__Count");
		var checkBoxCount = parseInt(countElm.getAttribute("value"));
		
		var vals = "";
		for (var i = 0; i < checkBoxCount; i++)
		{
			var tmpElm = document.getElementById(elmName + "_" + i);
			if (tmpElm.checked)
			{
				if (vals.length > 0)
					vals += ";";
				vals += tmpElm.getAttribute("value");
			}
		}
		if (vals.length == 0)
			vals = "0";
		return vals;
	}
	else
		return this.ctlElement.checked;
}

CheckBoxDynCriteria.prototype.handleOneOfTheFollowing = function(leftSide, rightSide)
{
	if (this.isMulti)
	{
		if (typeof(leftSide) == "object")
		{
			var sb = "";
			var hasData = false;
			for (var i = 0; i < leftSide.length; i++)
			{
				if (sb.length > 0)
					sb += " || ";
				sb += leftSide[i] + " == " + rightSide;
				hasData = true;
			}
			return sb;
		}
		else
		{
			return leftSide + " == " + rightSide;
		}
	}
	else
		return CheckBoxDynCriteria.base.handleOneOfTheFollowing.call(this, leftSide, rightSide);
}

CheckBoxDynCriteria.prototype.handleNoneOfTheFollowing = function(leftSide, rightSide)
{
	if (this.isMulti)
	{
		if (typeof(leftSide) == "object")
		{
			var sb = "";
			var hasData = false;
			for (var i = 0; i < leftSide.length; i++)
			{
				if (sb.length > 0)
					sb += " && ";
				sb += leftSide[i] + " != " + rightSide;
				hasData = true;
			}
			return sb;
		}
		else
		{
			return leftSide + " == " + rightSide;
		}
	}
	else
		return CheckBoxDynCriteria.base.handleOneOfTheFollowing.call(this, leftSide, rightSide);
}

CheckBoxDynCriteria.prototype.handleAllOfTheFollowing = function(leftSide, rightSide)
{
	if (this.isMulti)
	{
		if (typeof(leftSide) == "object")
		{
			var sb = "";
			var hasData = false;
			for (var i = 0; i < leftSide.length; i++)
			{
				if (sb.length > 0)
					sb += " && ";
				sb += leftSide[i] + " == " + rightSide;
				hasData = true;
			}
			return sb;
		}
		else
		{
			return leftSide + " == " + rightSide;
		}
	}
	else
		return CheckBoxDynCriteria.base.handleOneOfTheFollowing.call(this, leftSide, rightSide);
}

CheckBoxDynCriteria.prototype.convertValItem = function(valItem)
{
	if (this.isMulti)
	{
		if (valItem.length == 0)
			return 0;
		else if (isNaN(valItem))
		{
			if (valItem.indexOf(";") >= 0)
				return valItem.split(";");
			else
				return 0;
		}
		else
			return parseInt(valItem);
	}
	else
		CheckBoxDynCriteria.base.convertValItem.call(this, valItem);
}


/* Text Box */
TextBoxDynCriteria = function(elm, operator, val)
{
	TextBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(TextBoxDynCriteria, DynCriteriaControl);

TextBoxDynCriteria.prototype.getRawDynCriteriaControlValue = function()
{
	return this.ctlElement.value;
}

TextBoxDynCriteria.prototype.convertValItem = function(valItem)
{
	return "\"" + valItem + "\"";
}


/* Numeric Text Box*/
NumericTextBoxDynCriteria = function(elm, operator, val)
{
	NumericTextBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(NumericTextBoxDynCriteria, TextBoxDynCriteria);

NumericTextBoxDynCriteria.prototype.convertValItem = function(valItem)
{
	if (valItem.length == 0)
		return 0;
	else if (isNaN(valItem))
		return 0;
	else
		return parseInt(valItem);
}


/* Date Time Text Box */
DateTimeTextBoxDynCriteria = function(elm, operator, val)
{
	DateTimeTextBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(DateTimeTextBoxDynCriteria, TextBoxDynCriteria);

DateTimeTextBoxDynCriteria.prototype.convertValItem = function(valItem)
{
	try
	{	
		if (valItem == "")
			return "new Date().getTime()";
		else
		{
			var dte = new Date(valItem);
			if (dte.toString() != "NaN")
				return "new Date(\"" + valItem + "\").getTime()";
		}
	}
	catch(e)
	{
		alert("Invalid Date");
		return "new Date().getTime()";
	}
}

DateTimeTextBoxDynCriteria.prototype.getRawDynCriteriaControlValue = function()
{
	return Date_Unformat(this.ctlElement.value);
}

/* Date Text Box */
DateTextBoxDynCriteria = function(elm, operator, val)
{
	DateTextBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(DateTextBoxDynCriteria, DateTimeTextBoxDynCriteria);

/* Time Text Box */
TimeTextBoxDynCriteria = function(elm, operator, val)
{
	TimeTextBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(TimeTextBoxDynCriteria, DateTimeTextBoxDynCriteria);

/* Email Text Box */
EmailTextBoxDynCriteria = function(elm, operator, val)
{
	EmailTextBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(EmailTextBoxDynCriteria, TextBoxDynCriteria);


/* Select Box */
SelectBoxDynCriteria = function(elm, operator, val, isMulti)
{
	this.isMulti = isMulti;
	SelectBoxDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(SelectBoxDynCriteria, DynCriteriaControl);

SelectBoxDynCriteria.prototype.getRawDynCriteriaControlValue = function()
{
	var vals = "";
	for (var i = 0; i < this.ctlElement.options.length; i++)
	{
		if (this.ctlElement.options[i].selected && this.shouldAppendVal(this.ctlElement.options[i].value, vals))
		{
			if (vals.length > 0)
				vals += ";";
			vals += this.ctlElement.options[i].value;
		}
	}
	return vals;
}

SelectBoxDynCriteria.prototype.shouldAppendVal = function(optionVal, selectedVals)
{
	if (!this.isMulti)
	{
		if (selectedVals.length > 0)
			return false;
		else
			return true;
	}
	else
		return true;
}

SelectBoxDynCriteria.prototype.convertValItem = function(valItem)
{
	if (valItem.length == 0)
		return 0;
	else if (isNaN(valItem))
	{
		if (valItem.indexOf(";") >= 0)
			return valItem.split(";");
		else
			return 0;
	}
	else
		return parseInt(valItem);
}

SelectBoxDynCriteria.prototype.handleOneOfTheFollowing = function(leftSide, rightSide)
{
	if (typeof(leftSide) == "object")
	{
		var sb = "";
		var hasData = false;
		for (var i = 0; i < leftSide.length; i++)
		{
			if (sb.length > 0)
				sb += " || ";
			sb += leftSide[i] + " == " + rightSide;
			hasData = true;
		}
		return sb;
	}
	else
	{
		return leftSide + " == " + rightSide;
	}
}

SelectBoxDynCriteria.prototype.handleNoneOfTheFollowing = function(leftSide, rightSide)
{
	if (typeof(leftSide) == "object")
	{
		var sb = "";
		var hasData = false;
		for (var i = 0; i < leftSide.length; i++)
		{
			if (sb.length > 0)
				sb += " && ";
			sb += leftSide[i] + " != " + rightSide;
			hasData = true;
		}
		return sb;
	}
	else
	{
		return leftSide + " == " + rightSide;
	}
}

SelectBoxDynCriteria.prototype.handleAllOfTheFollowing = function(leftSide, rightSide)
{
	if (typeof(leftSide) == "object")
	{
		var sb = "";
		var hasData = false;
		for (var i = 0; i < leftSide.length; i++)
		{
			if (sb.length > 0)
				sb += " && ";
			sb += leftSide[i] + " == " + rightSide;
			hasData = true;
		}
		return sb;
	}
	else
	{
		return leftSide + " == " + rightSide;
	}
}


/* Dual Select */
DualSelectDynCriteria = function(elm, operator, val)
{
	DualSelectDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(DualSelectDynCriteria, SelectBoxDynCriteria);

DualSelectDynCriteria.prototype.shouldAppendVal = function(optionVal, selectedVals)
{
	return true;
}

/* Radio Button */
RadioButtonDynCriteria = function(elm, operator, val)
{
	RadioButtonDynCriteria.baseConstructor.call(this, elm, operator, val);		
}
Inheritance.inheritsFrom(RadioButtonDynCriteria, DynCriteriaControl);

RadioButtonDynCriteria.prototype.getRawDynCriteriaControlValue = function()
{
	if (this.ctlElement.checked)
		return this.ctlElement.value;
	else
		return 0;
}
