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

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

var helpDoc = MM.HELP_behEffectSquish;

var ELEMENTNAMES_ALLOWED; // list of elements to which the Squish Effect can be asigned (initialized in "initGlobals()")
var ID_LIST;              // list of available IDs in the current document


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

// Adds an Squish-Effect to the element.
// Accepts the following argument:
//  targetElement - ID or JavaScript DOM object of target element
//
function MM_effectSquish(targetElement)
{
	new Spry.Effect.Squish(targetElement);
}


//******************* 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_effectSquish";
}



//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 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_effectSquish(this)";
	}
	else // behavior element triggers effect which is assigned to a target element
	{
		var refIdx = parseInt(selValue);
		retVal = "MM_effectSquish('"+ID_LIST[refIdx]+"')";
	}

	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 == 1) { // we expect 1 arg -> targetElement
	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.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 Squish 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;

	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 Squish Effect can be assigned to (should be typed in lowercase letters)

	ID_LIST = new Array();
}


// 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);
		}
	}
}

function isAllowedElementName(elementName, allowedElements)
{
	if(!elementName || !allowedElements)
		return false;

	for(var i=0; i<allowedElements.length; i++)
		if(allowedElements[i] == elementName.toLowerCase())
			return true;

	return false;
}

// 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);
}

//**************** GENERIC FUNCTIONS ****************

function numOccurences(theStr) {
}
