/**
 * dynamiclist.js
 */

var dynamiclist_plugin_scripts = [
	//'dynamiclist_tinymce.js'
];
var dynamiclist_plugins = [];

// dynamiclist_loadPluginScripts
// not currently working, add each plugin script to the
// html file instead.
function dynamiclist_loadPluginScripts() {
/*
	var sPath, sSrc, a, i;
	a = document.getElementsByTagName('script');
	for (i=0; i < a.length; i++) {
		sSrc = a[i].src;
		if (sSrc && (sSrc.indexOf('dynamiclist.js') != -1)) {
			sPath = sSrc.substr(0, sSrc.lastIndexOf('/'));
			break;
		}
	}
	a = dynamiclist_plugin_scripts;
	for (i=0; i < a.length; i++) {
		document.write(
			'<sc'+'ript language="javascript" type="text/javascript" ' + 
			'src="' + sPath + '/' + a[i] + '"></script>'
		);
	}
*/
}

// dynamiclist_addPlugin
// plugin scripts call this function to add their object(s) 
// to receive events
function dynamiclist_addPlugin(o) {
	dynamiclist_plugins.push(o);
}

// dynamiclist_init
function dynamiclist_init() {
	var i, o, a;
	if (TemplateCollection) {
		templateCollection = new TemplateCollection();
		a = document.getElementsByTagName('form');
		for (i=0; i < a.length; i++) {
			o = a[i];
			addSubmitEvent(o, function() {return dynamiclist_onsubmit(o);});
		}
	}
}

// dynamiclist_getNextSibling
function dynamiclist_getNextSibling(nTarget) {
	while(nTarget = nTarget.nextSibling) {
		if(api.hasAttribute(nTarget, "repeat")) {return nTarget;}
	}
	return null;
}

// dynamiclist_getPreviousSibling
function dynamiclist_getPreviousSibling(nTarget) {
	while(nTarget = nTarget.previousSibling) {
		if(api.hasAttribute(nTarget, "repeat")) {return nTarget;}
	}
	return null;
}

// dynamiclist_onsubmit
// We want to take the first child of the form, and momentarily
// remove and re-insert it into the document tree. This ensures
// that the form data is sent to the server in the order in which the
// controls appear in the document. The insertBefore DOM method 
// accomplishes this. Note that we are assuming that all form 
// controls are within the first child of the form.
function dynamiclist_onsubmit(oForm) {
	var o, oForm, s, a, i, d;
	if (!document.all && oForm) {
		a = oForm.childNodes;
		for (i=0; i<a.length; i++) {
			if (a[i].nodeType == 1) {o = a[i]; break;}
		}
		if (o) {
			s = o.nextSibling;
			if (!s) {
				d = document.createElement("div");
				addClass(d, 'dynamiclist_swapper');
				oForm.appendChild(d);
				s = o.nextSibling;
			}
		}
		if (s) {
			oForm.insertBefore(o, s);
		}
	}
	return 1;
}

// beforeRemoveNode, afterAddNode, beforeMoveNode, afterMoveNode
// These functions gets called by the webforms2 implementation when
// interesting things are happening to the document tree. Different things
// within the node may need to react to this, so we route the message
// to any registered plugins.
function wfRepetitionBlock_beforeRemoveNode(node) {
}
function wfRepetitionBlock_afterAddNode(node) {
	var i, o;
	for (i=0; i < dynamiclist_plugins.length; i++) {
		o = dynamiclist_plugins[i];
		if (o.afterAddNode) {o.afterAddNode(node);}
	}
}
function wfRepetitionBlock_beforeMoveNode(node) {
	var i, o;
	for (i=0; i < dynamiclist_plugins.length; i++) {
		o = dynamiclist_plugins[i];
		if (o.beforeMoveNode) {o.beforeMoveNode(node);}
	}
}
function wfRepetitionBlock_afterMoveNode(node) {
	var i, o;
	for (i=0; i < dynamiclist_plugins.length; i++) {
		o = dynamiclist_plugins[i];
		if (o.afterMoveNode) {o.afterMoveNode(node);}
	}
}

// dynamiclist_heterogeneous_item_onBeforeRemoved
function dynamiclist_heterogeneous_item_onBeforeRemoved() {
	var oRepetitionBlock;
	oRepetitionBlock = this;
	if (!dynamiclist_getPreviousSibling(oRepetitionBlock) && !dynamiclist_getNextSibling(oRepetitionBlock)) {
		dynamiclist_heterogeneous_setBottomAdderVisibility(oRepetitionBlock, true);
	}
}

// dynamiclist_heterogeneous_item_onAdded
function dynamiclist_heterogeneous_item_onAdded() {
	var oRepetitionBlock, oTemplateSelector, oTemplateAdderButton, sTemplateId, iRepeatIndex, sTemplateAdderButtonId;

	oRepetitionBlock = this;
	oTemplateSelector = dynamiclist_heterogeneous_getTemplateSelector(oRepetitionBlock);
	sTemplateIdPrefix = dynamiclist_heterogeneous_getTemplateIdPrefix(oRepetitionBlock);
	iRepeatIndex = api.getAttribute(oRepetitionBlock, 'repeat');
	sTemplateAdderButtonId = 'btnAdd_' + sTemplateIdPrefix + '-' + iRepeatIndex + '-' + oTemplateSelector.value;
	oTemplateAdderButton = api.gebi(sTemplateAdderButtonId);

	if (oTemplateAdderButton) {
		api.eventsHandler({target: oTemplateAdderButton, type: "click"});
	}

	dynamiclist_heterogeneous_setBottomAdderVisibility(oRepetitionBlock, false);
}

// dynamiclist_heterogeneous_setBottomAdderVisibility
function dynamiclist_heterogeneous_setBottomAdderVisibility(node, bVisible) {
	var oTemplateSelector;
	oTemplateSelector = dynamiclist_heterogeneous_getTemplateSelector(node, true);
	oTemplateSelector.parentNode.style.display = (bVisible ? '' : 'none');
}

// dynamiclist_heterogeneous_getTemplateIdPrefix
function dynamiclist_heterogeneous_getTemplateIdPrefix(node) {
	var sTemplateIdPrefix;
	sTemplateIdPrefix = api.getAttribute(node, 'repeatTemplate');
	if (sTemplateIdPrefix) {
		sTemplateIdPrefix = sTemplateIdPrefix.substr(0, sTemplateIdPrefix.lastIndexOf("-"));
		return(sTemplateIdPrefix);
	}
}

// dynamiclist_heterogeneous_getTemplateSelector
function dynamiclist_heterogeneous_getTemplateSelector(node, bBottom) {
	var sTemplateIdPrefix, oPreviousNode, iRepeatIndex, sTemplateSelectorID, oTemplateSelector;

	oPreviousNode = dynamiclist_getPreviousSibling(node);
	sTemplateIdPrefix = dynamiclist_heterogeneous_getTemplateIdPrefix(node);
	sTemplateSelectorID = 'select_' + sTemplateIdPrefix + '-template';
	if (oPreviousNode && !bBottom) {
		iRepeatIndex = api.getAttribute(oPreviousNode, 'repeat');
		if (!isNaN(iRepeatIndex)) {
			sTemplateSelectorID += '-' + iRepeatIndex;
		}
	}

	oTemplateSelector = api.gebi(sTemplateSelectorID);
	return(oTemplateSelector);
}

// load plugin scripts now, and call init function as part of onLoad
if (isJsEnabled()) {
	addLoadEvent(dynamiclist_init);
}
