// Copyright 2000, 2001, 2002, 2003, 2006 Macromedia, Inc. All rights reserved.

//*************** GLOBALS VARS *****************

var helpDoc = MM.HELP_behEffectGrowShrink;

var ELEMENTNAMES_ALLOWED; // list of elements to which the Grow/Shrink Effect can be asigned (initialized in "initGlobals()")
var ID_LIST;              // list of available IDs in the current document
var STATE_LIST;           // holds the string/value-pairs for the two effects
var OLD_VALUE_POOL;           // saves the old values of the text fields


//******************* BEHAVIOR FUNCTION **********************

// Adds an Grow/Shrink-Effect to the element.
// Accepts the following arguments:
//  targetElement - ID or JavaScript DOM object of target element
//  duration      - duration time of applying the effect (in milliseconds)
//  from          - percentage of opacity to start (0 - 100)
//  to            - percentage of opacity to end (0 - 100)
//  toggle        - trigger effect again toggles to reverse behavior
//
function MM_effectGrowShrink(targetElement, duration, from, to, toggle)
{
	new Spry.Effect.GrowShrink(targetElement, {duration: duration, from: from, to: to, toggle: toggle});
}


//******************* API **********************


//Can be used with any tag and any event

function canAcceptBehavior(){
	var retVal = "onClick,onMouseUp,onMouseDown,(onClick)";  // default is onClick
	return retVal;
}


//Returns a Javascript function to be inserted in HTML head with script tags.

function behaviorFunction(){
  return "MM_effectGrowShrink";
}


//Returns fn call to insert in HTML tag <TAG... onEvent='thisFn(arg)'>

function applyBehavior()
{
	var selIdx   = document.theForm.pageEltObj.selectedIndex;
	var selValue = document.theForm.pageEltObj.options[selIdx].value;
	var includeLibrary = true;
	var referHeight    = document.theForm.referTypeObj.selectedIndex == 1 ? true : false; // 0: wide, 1: high
	var retVal;

	if(selValue=="default") // no target element selected
	{
		includeLibrary = false;
		retVal = MSG_SelectTargetOrCancel;
	}
	else if(selValue=="this") // effect is assigned to the behavior element
	{
		retVal = "MM_effectGrowShrink(this, "+parseInt(document.theForm.durationObj.value)+", '"+parseFloat(document.theForm.fromObj.value)+document.theForm.fromTypeObj.options[document.theForm.fromTypeObj.selectedIndex].value+"', '"+parseFloat(document.theForm.toObj.value)+document.theForm.toTypeObj.options[document.theForm.toTypeObj.selectedIndex].value+"', "+document.theForm.toggleObj.checked+", "+referHeight+", "+(document.theForm.growCenterObj.options[document.theForm.growCenterObj.selectedIndex].value == "center" ? "true" : "false")+")";
	}
	else // behavior element triggers effect which is assigned to a target element
	{
		var refIdx = parseInt(selValue);
		retVal = "MM_effectGrowShrink('"+ID_LIST[refIdx]+"', "+parseInt(document.theForm.durationObj.value)+", '"+parseFloat(document.theForm.fromObj.value)+document.theForm.fromTypeObj.options[document.theForm.fromTypeObj.selectedIndex].value+"', '"+parseFloat(document.theForm.toObj.value)+document.theForm.toTypeObj.options[document.theForm.toTypeObj.selectedIndex].value+"', "+document.theForm.toggleObj.checked+", "+referHeight+", "+(document.theForm.growCenterObj.options[document.theForm.growCenterObj.selectedIndex].value == "center" ? "true" : "false")+")";
	}

	if(includeLibrary)
		addLibraryInclude(); // make sure SpryEffects.js-lib is available

	return retVal;
}


//Passed the function call above, takes prior arguments and reloads the UI.
//Removes any escape characters "\"

function inspectBehavior(fnStr){
  var argArray = extractExprStr(fnStr);
 
  if (argArray.length == 5) { // we expect 5 args -> targetElement, duration, from, to, toggle
	var selIdx  = 0;
	var targetElement = skipWhitespaces(unescExprStr(argArray[0],false).toLowerCase());

	if(targetElement == "this") // effect is assigned to the behavior element
	{
		var optIdx = effectsUtils.getPopupIndex(document.theForm.pageEltObj, 'this');
		if(optIdx >= 0)
			selIdx = optIdx;
	}
	else // behavior element triggers effect which is assigned to a target element
	{
		var idValue = targetElement;
		var found   = false;
		var i       = ID_LIST.length-1;
		while(!found && i>=0)
		{
			if(ID_LIST[i].toLowerCase()==idValue)
				found = true;
			else
				i--;
		}

		if(found)
		{
			var idxString = String(i);
			var optIdx    = effectsUtils.getPopupIndex(document.theForm.pageEltObj, idxString);
			if(optIdx >= 0)
				selIdx = optIdx;
		}
	}

	document.theForm.pageEltObj.selectedIndex = selIdx;
	document.theForm.durationObj.value = skipWhitespaces(unescExprStr(argArray[1],false)); // duration time of applying the effect (in milliseconds)
	
	var fromValue = effectsUtils.stripWhitespaces(unescExprStr(argArray[2],false));
	var toValue   = effectsUtils.stripWhitespaces(unescExprStr(argArray[3],false));
	var stateIdx  = (parseFloat(fromValue) > parseFloat(toValue)) ? 1 : 0; // 0: grow, 1: shrink

	document.theForm.effectTypeObj.selectedIndex = stateIdx;
	document.theForm.fromTxtObj.innerHTML = STATE_LIST[stateIdx][0];
	document.theForm.toTxtObj.innerHTML   = STATE_LIST[stateIdx][1];

	if(stateIdx == 1) // shrink
		document.theForm.directionTypeObj.innerHTML = STATE_LIST[stateIdx][1];
	else // grow
		document.theForm.directionTypeObj.innerHTML = STATE_LIST[stateIdx][0];

	document.theForm.fromObj.value = parseInt(fromValue);
	document.theForm.fromTypeObj.selectedIndex = getOptionIndex(document.theForm.fromTypeObj, fromValue);
	document.theForm.toObj.value   = parseInt(toValue);
	document.theForm.toTypeObj.selectedIndex = getOptionIndex(document.theForm.toTypeObj, toValue);

	document.theForm.growCenterObj.selectedIndex = (effectsUtils.stripWhitespaces(unescExprStr(argArray[6],false)) == "true" ? 1 : 0); // 0: "Top Left Corner", 1: "Center"
	document.theForm.toggleObj.checked = (effectsUtils.stripWhitespaces(unescExprStr(argArray[4],false)) == "true");

	if(effectsUtils.stripWhitespaces(unescExprStr(argArray[5],false)) == "true")
		document.theForm.referTypeObj.selectedIndex = 1;
	else
		document.theForm.referTypeObj.selectedIndex = 0;

	handleReferTypeVisibility();

	document.theForm.pageEltObj.focus();  // set focus on popup
  }
}


//Given the original function call, this parses out the args

function deleteBehavior(fnCallStr)
{
	initGlobals();

	var theDOM = dreamweaver.getDocumentDOM();
	if(theDOM.documentElement.innerHTML.indexOf("function MM_effect") == -1)
	{
		var allScripts = theDOM.getElementsByTagName("script");

		if(allScripts)
		{
			for (var i=0; i<allScripts.length; i++)
			{
				var scriptSource = allScripts[i].getAttribute("src");
				if(scriptSource && scriptSource.indexOf("SpryEffects.js") >= 0)
				{
					allScripts[i].outerHTML = "";
					return;
				}
			}
		}
	}
}



//***************** LOCAL FUNCTIONS  ******************


//initializes the User Interface with default values

function initializeUI()
{
	initGlobals(); // initialize global vars

	//
	// we create the popup for all allowed elements in the document
	//
	var theDOM         = dreamweaver.getDocumentDOM(); // DOM of the current document
	var option_entries = new Array(); // to hold all the options-strings
	var targetElts     = new Array(); // to hold all the target elt/id-pairs

	// if selected element can be target for the effect we will add them too
	var selObj = dw.getBehaviorElement();
	if(!selObj)
		selObj = dw.getDocumentDOM().getSelectedNode();
	var tagname = selObj ? selObj.tagName : "";

	if(isAllowedElementName(tagname, ELEMENTNAMES_ALLOWED))
		option_entries.push("<option value=\"this\">&lt;"+MSG_ThisElement+"&gt;</option>");
	else
		option_entries.push("<option value=\"default\">*** " + MSG_SelectIDOfTarget + " ***</option>"); // we add a default entry

	fetchSuitableTargetElements(theDOM.body, ELEMENTNAMES_ALLOWED, targetElts);

	for(var i=0; i<targetElts.length; i++)
	{
		ID_LIST.push(targetElts[i][1]);
		option_entries.push("<option value=\"" + i + "\">" + targetElts[i][0].toLowerCase() + " \"" + targetElts[i][1] + "\"</option>");
	}

	if(option_entries.length > 1) // there are potential elements to which the Grow/Shrink Effect can be applied to
		document.theForm.pageEltObj.innerHTML = option_entries.join("");
	else
		document.theForm.pageEltObj.innerHTML = "<option value=\"default\">*** " + MSG_NoValidTargetsAvailable + " ***</option>"

	document.theForm.pageEltObj.selectedIndex = 0;

	//
	// set default values to the rest of the input fields
	//
	document.theForm.durationObj.value = "1000"; // duration time of applying the effect (in milliseconds)

	var selIdx = 1; // 0: grow, 1: shrink

	document.theForm.effectTypeObj.selectedIndex = selIdx;
	document.theForm.fromTxtObj.innerHTML        = STATE_LIST[selIdx][0];
	document.theForm.toTxtObj.innerHTML          = STATE_LIST[selIdx][1];

	if(selIdx == 1) // shrink
		document.theForm.directionTypeObj.innerHTML   = STATE_LIST[selIdx][1];
	else // grow
		document.theForm.directionTypeObj.innerHTML = STATE_LIST[selIdx][0];

	document.theForm.fromObj.value               = STATE_LIST[selIdx][2]; // percentage of opacity to start (0 - 100)
	document.theForm.toObj.value                 = STATE_LIST[selIdx][3]; // percentage of opacity to end (0 - 100)
	document.theForm.fromTypeObj.selectedIndex   = STATE_LIST[selIdx][4]; // "%" or "px"
	document.theForm.toTypeObj.selectedIndex     = STATE_LIST[selIdx][5]; // "%" or "px"
	document.theForm.growCenterObj.selectedIndex = 1; // 0: "Top Left Corner", 1: "Center"

	document.theForm.toggleObj.checked = false;
	handleReferTypeVisibility();

	document.theForm.pageEltObj.focus();  // set focus on popup
}


//Called by Attain to silently update behavior calls
//Returns new call if ok, otherwise returns empty string

function reapplyBehavior(oldBehaviorCall) {
	var newBehaviorCall = "";

  	return newBehaviorCall;
}


// initializes the global vars
//
function initGlobals()
{
	ELEMENTNAMES_ALLOWED = new Array("address", "blockquote", "body", "dd", "div", "dl", "dt", "fieldset", "form", "frame", "frameset", "h1", "h2", "h3", "h4", "h5", "h6", "iframe", "img", "noframes", "object", "p", "ol", "ul", "li", "applet", "center", "dir", "hr", "menu", "pre"); // elements to which the Grow/Shrink Effect can be assigned to (should be typed in lowercase letters)

	ID_LIST = new Array();
	STATE_LIST               = new Array([MSG_GrowFrom  , MSG_GrowTo  ,   0, 100, 0, 0],   // holds the string/value/type-infos for the two effects
										 [MSG_ShrinkFrom, MSG_ShrinkTo, 100,   0, 0, 0]);
	OLD_VALUE_POOL           = new Array("","",""); // saves the old values of the text fields
}


// cheks if the string contains only digits (leading and trailing whitespaces will bes skipped
//
function onlyDigits(inputString, negativeAllowed)
{
	if(inputString)
	{
		var pattern = negativeAllowed ? /^\s*-?\s*\d+\s*$/ : /^\s*\d+\s*$/;
		return pattern.test(inputString);
	}

	return false;
}


// Stores the value of the text field
//
function storeValue(idx, objectNode)
{
	if(objectNode && idx >= 0 && idx < OLD_VALUE_POOL.length)
		OLD_VALUE_POOL[idx] = objectNode.value;
}


// Checks if the duration-value is valid (digits only).
// If the value is not valid a info message appears.
function checkDuration(idx, objectNode)
{
	if(objectNode && idx >= 0 && idx < OLD_VALUE_POOL.length)
	{
		var value = objectNode.value;

		if(!onlyDigits(value))
		{
			var message = MSG_NotAValidValue;
			message = message.replace('%1',value);
			alert(message);

			objectNode.value = OLD_VALUE_POOL[idx];
		}
	}
}


// Checks if the value is valid (digits only)
// If the value is not valid a info message appears.
function checkFromToValue(idx, objectNode)
{
	if(objectNode && idx >= 0 && idx < OLD_VALUE_POOL.length)
	{
		var value = objectNode.value;

		if(!onlyDigits(value))
		{
			var message = MSG_NotAValidValue;
			message = message.replace('%1',value);
			alert(message);

			objectNode.value = OLD_VALUE_POOL[idx];
		}
	}
}


// Fetches all suitable target elements of the document to which the effect can be applyed.
// allowedEltArrayIn: array of element names that are allowed for the effect
// targetEltsOut: array caotaining valid target elements in the form [element name, id value]
function fetchSuitableTargetElements(startEltIn, allowedEltArrayIn, targetEltsOut)
{
	if(!startEltIn  || startEltIn.nodeType != 1 || !targetEltsOut || !allowedEltArrayIn)
		return;

	var potAttrNameCurr = startEltIn.getAttribute('id');
	if(potAttrNameCurr != undefined)
	{
		var potEltNameCurr = startEltIn.tagName;

		if(isAllowedElementName(potEltNameCurr, allowedEltArrayIn))
			targetEltsOut.push([potEltNameCurr,potAttrNameCurr]);
	}

	if(startEltIn.hasChildNodes())
	{
		var childCnt = startEltIn.childNodes.length;
		for(var i=0; i<childCnt; i++)
		{
			var potChildCurr = startEltIn.childNodes[i];
			if(potChildCurr.nodeType == 1) // element node
				fetchSuitableTargetElements(potChildCurr, allowedEltArrayIn, targetEltsOut);
		}
	}
}


// sets the enable state of the referTypeObj (according the values of fromTypeObj and toTypeObj)
//
function handleReferTypeVisibility()
{
	if(   document.theForm.fromTypeObj.options[document.theForm.fromTypeObj.selectedIndex].value == 'px'
	   || document.theForm.toTypeObj.options[document.theForm.toTypeObj.selectedIndex].value == 'px')
		document.theForm.referTypeObj.removeAttribute('disabled');
	else
		document.theForm.referTypeObj.setAttribute('disabled', 'disabled');
}


// returns the index of the optionRoot which fits to the checkString
//
function getOptionIndex(optionRoot, checkString)
{
	if(optionRoot && checkString)
	{
		var optionsCount = optionRoot.options.length;
		for(var i=0; i<optionsCount; i++)
			if(checkString.indexOf(optionRoot.options[i].value) >= 0)
				return i;
	}

	return -1;
}


// removes whitespaces from the sting
//
function skipWhitespaces(whiteString)
{
	return whiteString.replace(/\s+$/,"").replace(/^\s+/,"");
}


// make sure that the necessary SpryEffects.js is included to the document
//
function addLibraryInclude()
{
	var theDOM    = dreamweaver.getDocumentDOM(); // DOM of the current document
	var assetList = new Array();
	var assetInfo = new AssetInfo("Shared/Spry/Effects/SpryEffects.js", "SpryEffects.js", "javascript");

	assetList.push(assetInfo);
	theDOM.copyAssets(assetList);
}

// changes the values of the to- and from-fields and chnages the according effect descriptions
//
function changeFromTo()
{
	var selIdx = document.theForm.effectTypeObj.selectedIndex; // 0: grow, 1: shrink

	document.theForm.fromTxtObj.innerHTML = STATE_LIST[selIdx][0];
	document.theForm.toTxtObj.innerHTML   = STATE_LIST[selIdx][1];

	if(selIdx == 1) // shrink
		document.theForm.directionTypeObj.innerHTML   = STATE_LIST[selIdx][1];
	else // grow
		document.theForm.directionTypeObj.innerHTML = STATE_LIST[selIdx][0];

	var buffer = document.theForm.fromObj.value;

	document.theForm.fromObj.value = document.theForm.toObj.value;
	document.theForm.toObj.value   = buffer;

	selIdx = document.theForm.fromTypeObj.selectedIndex;
	document.theForm.fromTypeObj.selectedIndex = document.theForm.toTypeObj.selectedIndex;
	document.theForm.toTypeObj.selectedIndex   = selIdx;
}
//**************** GENERIC FUNCTIONS ****************

function numOccurences(theStr) {
}
