//****************************************************************
//****************************************************************
//	COPYRIGHT 2008, Vertex Software
//****************************************************************
//****************************************************************

//----------------------------------------------------------------
//----------------------------------------------------------------
// For elements that use the js_enabledby class, the element will
// be enabled/disabled based on the condition of teh enabling object
// specified by id after the js_enabledby class. The id can optionaly
// be followed by a DOUBLE UNDERSCORE - __ - 
// (the use of COLON as a separtor has been deprecated since SitePress editor corrupts the tag)
// and one of teh following to determine when the element will be enabled:
//		__checked	- enables when a check or radio is checked
//		__notchecked - enables when a check or radio is not checked
//		__<value>	- enables when radio or select item with value is checked/selected
//		__not<value>	- enables when radio or select item with value is not checked/selected
// If no option is specifed, the following defualts apply:
//		radio/select - Enabled when selected item has a value, disabled is value is empty
//		checkbox	- Enabled if checked, disabled otherwise
//		text	- Enabled if value entered, disabled otherwise
//----------------------------------------------------------------
//----------------------------------------------------------------
var eEnabledByClasses = {
	Enabled:"_enabled",
	Disabled:"_disabled"
	}


//-----------------------------------------------------------
// enabledby
//-----------------------------------------------------------
function enabledby( element ) {
	var mEnabledElementID = "";
	var mControlElementID = "";
	var mControlOptions = "";
	var mControlElement;
	var mControlledElement;
	Initialize(element);

	//-----------------------------------------------------------
	// Initialize
	//-----------------------------------------------------------
	function Initialize( element ) {
		try {
			if (!element) return;
			// 02FEB2010 RFM - allow for otehr than first class
			//var classes = element.className.split( /[ ]+/ );
			//if (!classes) {
			var elementInfo = element.className.match( /js_enabledby ([^ ]+)/ ) ? RegExp.$1 : "";
			if (!elementInfo) {
				alert( "EnabledBy Behavior: The ID of the element that enabled/disabled thsi element is defined as the second class: class=\"js_enabledby elementID\"" );
				return;
				}
			// 02FEB2010 RFM - allow for otehr than first class
			//var controlInfo = classes[1].split(":");
			// 24FEB2010 RFM - TASK #6978 - Added support for using double-underscores as separator since SitePress editor strips colons!
			//var controlInfo = elementInfo.split(":");
			// 16MAR2010 RFM - Firfox & Chrome return separtor in split!!
			//var controlInfo = elementInfo.split( /(:|__)/);
			var controlInfo = elementInfo.split( elementInfo.indexOf( "__") > -1 ? "__" : ":" )
			mControlledElement = element;
			mControlElementID = controlInfo[0];
			mControlOptions = controlInfo[1] || "";
			mControlElement = document.getElementById(mControlElementID)
			// 01FEB2010 RFM - TASK #6158 - added support for named element.
			if (!mControlElement) {
				var elements = document.getElementsByName(mControlElementID);
				if (elements.length > 0) mControlElement = elements[0];
				}
			if (!mControlElement) {
				window.status = ( "EnabledBy Behavior: Element not found - " + mControlElementID );
				return;
				}
			// 24FEB2010 RFM - TASK #6978 Reduced use of jQuery to speed up on lareg forms.  See ARCHIVE for previous version.
			var elements = document.getElementsByName( mControlElementID );
			var initialized = {};
			for (var item=0; item<elements.length; item++) {
				var controlElement = elements[item];
				var controlElementID = controlElement.id || controlElement.name;
				$(controlElement).change( function() { HandleDisableEnableElement( this ); } );
				if (controlElement.tagName == "INPUT") $(controlElement).click( function() {HandleDisableEnableElement( this ); } );
				//  Since there will be multipl radios returned for one name, we need to find if ANY are checked and if so,
				// just call IsEnabled on that one. Otherwise call for any;
				// TODO - wriet code to handle case where none selected
				// 25FEB2010 RFM - TASK #6978 - added check to see if NO radios are selected and if so, call HandleDisableEnableElement
				//if (controlElement.type == "radio" && !controlElement.checked) continue;
				if (initialized[controlElementID]) continue; 
				if (controlElement.type == "radio" && !controlElement.checked && $( "input[type='radio'][name='" + controlElement.name + "']:checked").length > 0) continue;
				initialized[controlElementID] = 1;
				HandleDisableEnableElement( controlElement, true );
				}
			mControlElement.onchange = $(mControlElement).click( function() { HandleDisableEnableElement( this ); } );
			}
		catch (error) {
			alert( "enabledby.Initialize: " + error.description  );
			}
		}


	//-----------------------------------------------------------
	// HandleDisableEnableElement
	// 17FEB2009 RFM - Factored so can be called during init
	//-----------------------------------------------------------
	function HandleDisableEnableElement( enabler, isInit ) {
		try {
			// 17FEB2009 RFM - Added ability to process disabled event so that THIS control can
			// disable related cotnrol if ITS disabled
			if (isInit) { 
				$(enabler).bind( "disabled", function() {
					// When target is disabled, disable this control as well
					if (enabler.disabled) {
						mControlledElement.disabled = true;
						}
					else {
						mControlledElement.disabled = !IsEnabled(enabler,mControlOptions);
						}
					UpdateEnabledDisabledClass();
					} )
				}
			mControlledElement.disabled = (isInit && enabler.disabled ? true : !IsEnabled(enabler,mControlOptions));
			// 17FEB2009 RFM - Added disabled event which allows thsi control to be notifed
			// if enabler is disabled
			$(mControlledElement).trigger("disabled", enabler );
			UpdateEnabledDisabledClass();
			}
		catch (error) {
			alert( "enabledby.HandleDisableEnableElement: " + error.description );
			}
		}


	//-----------------------------------------------------------
	// UpdateEnabledDisabledClass
	// 17FEB2009 RFM - Added _disabled and _enabled classes dynamically for
	// use in client code to style enabled/disabl
	//-----------------------------------------------------------
	function UpdateEnabledDisabledClass( ) {
		try {
			// Only add for text since no way in css to universally filter by type
			if (mControlledElement.tagName != "INPUT" || mControlledElement.type != "text") return; 
			if (mControlledElement.disabled) $(mControlledElement).removeClass( eEnabledByClasses.Enabled ).addClass( eEnabledByClasses.Disabled ); 
			if (!mControlledElement.disabled) $(mControlledElement).removeClass( eEnabledByClasses.Disabled ).addClass( eEnabledByClasses.Enabled ); 
			}
		catch (error) {
			alert( "UpdateEnabledDisabledClass: " + error.description  );
			}
		}


	//-----------------------------------------------------------
	// IsEnabled
	//-----------------------------------------------------------
	function IsEnabled( controlElement, controlOptions ) {
		try {
			switch (controlElement.tagName + (controlElement.type||"")) {
				case "INPUTcheckbox":
				// 09NOV2008 RFM - Allow for multiple checkboxes - need to add support for multiple values
				//	if (!controlOptions) return controlElement.checked; 
				//	if (controlOptions == "checked") return controlElement.checked; 
				//	if (controlOptions == "notchecked") return !controlElement.checked; 
				//	break;
				case "INPUTradio":
					if (!controlOptions) return controlElement.checked && controlElement.value;
					if (controlOptions == "checked") return controlElement.checked; 
					if (controlOptions == "notchecked") return !controlElement.checked; 
					// 18FEB2009 RFM - Below is ALWAYS true for that radio button but should ONLY be true when this button is checked!
					//if (controlOptions == controlElement.value) return true; 
					if (controlOptions == controlElement.value) return controlElement.checked; 
					// 25FEB2010 RFM - TASK #6978 - Added support for MULTIPLE VALUES separted by PIPES
					if (controlOptions.indexOf("|") > -1 && controlElement.value && controlElement.value.match( new RegExp(controlOptions) ) ) return controlElement.checked; 					
					if (controlOptions.indexOf("not") == 0) return controlElement.checked && controlElement.value != controlOptions.substr("not".length); 
					break;
				// 01FEB2010 RFM - TASK #6158 - added support for textarea
				case "TEXTAREAtextarea":
				case "INPUTtext":
					if (!controlOptions) return controlElement.value;
					if (controlOptions == controlElement.value) return true; 
					if (controlOptions.indexOf("not") == 0) return controlElement.value != controlOptions.substr("not".length); 
					break;
				case "SELECT":
				case "SELECTselect-one":
					if (!controlOptions) return controlElement.value; 
					if (controlOptions == controlElement.value) return true; 
					if (controlOptions.indexOf("not") == 0) return controlElement.value != controlOptions.substr("not".length); 
					break;
				}
			}
		catch (error) {
			alert( "enabledby.IsEnabled: " + error.description );
			}
		return false;
		}

	}


AttachBehaviors("enabledby");
