﻿// Copyright 1998,1999 Macromedia, Inc. All rights reserved.

//Constructs a multiple choice element
function MM_inpt(theParent, theName, theInitialValue,
                 theExpectedValue, theIsCorrect, theScore)
{
	// properties
	this.initialValue = theInitialValue;
	this.value = '';
	this.disabled = true;

	this.expectedValue = theExpectedValue;
	this.isCorrect = theIsCorrect;
	this.score = theScore;
	this.selected = false;

	this.isRadioList = false;

	this._parent = theParent;
	this._name = theName;
	this._obj = '';

	this.c = new Array(this); // NOTE: choice info stored on the element.

	// member functions
	this.init = MM_inptInit;
	this.reset = MM_inptReset;
	this.enable = MM_inptEnable;
	this.disable = MM_inptDisable;
	this.update = MM_inptUpdate;
	this.setDisabled = MM_inptSetDisabled;
	this.redraw = MM_inptRedraw;
	this.validValue = MM_inptValidValue;
	this.setValue = MM_inptSetValue;
	this.setSelected = MM_inptSetSelected;
	this.changeValue = MM_inptChangeValue;
}

// Initializes the element, special case radio lists
function MM_inptInit()
{
	var rlist, i, pos = 0;
	with (this)
	{
		_obj = MM_intFindObject(_parent._self + _name + "Inp");
		if (!_obj)
		{ // assume radio
			rlist = MM_intFindObject(_parent._self + "RadioInp");
			if (rlist && rlist.length != null)
			{
				for (i in _parent.e) if (i != 'length') // get our element position
					if (_parent.e[i] == this) break; else pos++;
				if (pos < rlist.length) _obj = rlist[pos];  // get radio at same position
				isRadioList = true;
			} 
		} 
	}
}

//Resets the element
function MM_inptReset()
{
	var isChanged = '';
	with (this)
	{
		isChanged = (value != initialValue);
		value = initialValue;
		_parent.disabled ? disable() : enable();
		validValue();
		redraw();
		if (isChanged && this.onChange != null) onChange(_parent._self + _name, value);
	}
}

//Enables the element
function MM_inptEnable()
{
	if (this._obj) with (this)
	{
		disabled = false;
		redraw();
	}
}

//Calls the approppriate disable or enable function
function MM_inptSetDisabled(theDisabled)
{
	if (theDisabled) this.disable();
	else this.enable();
}

//Disables the element
function MM_inptDisable()
{
	this.disabled = true;
	this.redraw();
}

//Called by onClick event to update this elements value
function MM_inptUpdate()
{
	var noJudge = false;
	with (this)
	{
		if (disabled)
		{
			if (!isRadioList)
				redraw();
			else
				for (var i in _parent.e) if (i != 'length')
				_parent.e[i].redraw();
			return;
		}

		if (_obj.checked != null)
		{
			if (isRadioList && value == _obj.checked) noJudge = true; //IE3.0 oddity
			changeValue((_obj.checked) ? true : false);  //IE3.0 oddity
		} else
			changeValue(_parent.allowMultiSel ? !value : true);

		// call the parent's update
		_parent.update(noJudge);
	}
}

//Sets the checked state of the form element
function MM_inptRedraw()
{
	if (this._obj) with (this)
	{
		if (_obj.disabled != null) _obj.disabled = disabled;
		if (isRadioList)
		{
			if (value) _obj.checked = true;
		} else if (_obj.checked != null) _obj.checked = value;
	}
}

//Checks the value with the expectedValue
function MM_inptValidValue()
{
	this.selected = (this.value == this.expectedValue);
	return this.selected;
}

//Internal routine for changing element value
function MM_inptChangeValue(theValue)
{
	var i, isChanged = '', isReset = '';
	with (this)
	{
		isChanged = (value != theValue);
		if (!_parent.allowMultiSel || isRadioList || _obj.type == 'radio')
		{
			value = theValue;
			for (i in _parent.e) if (i != 'length') with (_parent)
			{
				if (e[i] != this)
				{
					isReset = (e[i].value != false);
					e[i].value = false;
				}
				e[i].validValue();
				e[i].redraw();
				if (e[i] != this && isReset && e[i].onChange != null)
					e[i].onChange(e[i]._parent._self + e[i]._name, e[i].value);
			}
		} else
		{
			value = theValue;
			validValue();
			redraw();
		}
		if (isChanged && this.onChange != null) onChange(_parent._self + _name, value);
	}
}

//Sets the state of the element to the given value
function MM_inptSetValue(theValue)
{
	with (this)
	{
		changeValue(theValue);
		_parent.update(true); // update int, but don't judge
	}
}

//Sets this element to its selected state
function MM_inptSetSelected(theSelected)
{
	if (theSelected)
		this.setValue(this.expectedValue);
	else
		this.setValue(!this.expectedValue);
}
