/***************************************************************
*  Copyright notice
*
*  (c) 2009 Stephan Schuler <stephan.schuler@netlogix.de>
*  All rights reserved
*
*  This script is part of the TYPO3 project. The TYPO3 project is
*  free software; you can redistribute it and/or modify
*  it under the terms of the GNU General Public License as published by
*  the Free Software Foundation; either version 2 of the License, or
*  (at your option) any later version.
*
*  The GNU General Public License can be found at
*  http://www.gnu.org/copyleft/gpl.html.
*  A copy is found in the textfile GPL.txt and important notices to the license
*  from the author is found in LICENSE.txt distributed with these scripts.
*
*
*  This script is distributed in the hope that it will be useful,
*  but WITHOUT ANY WARRANTY; without even the implied warranty of
*  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
*  GNU General Public License for more details.
*
*  This copyright notice MUST APPEAR in all copies of the script!
***************************************************************/




/**
 * View handler to transfer fieldsets into tabs
 *
 * $Id$
 */
var nxformtabs = {




	allowedTabs: [],




	init: function(_param) {

		var param = jQuery.extend({
			performAddingEvents: true
		}, _param);

		jQuery('.nx-tabform').each(function(formKey, form) {
			if (!jQuery(form).hasClass('nx-tabform-tabbed')) {
				nxformtabs.createTabs(jQuery(form));
			}
		});

		if (param.performAddingEvents) {
			nxformtabs.performAddingEvents();
		}

	},




	performAddingEvents: function() {

		while (addEventFunction = nxformtabs.addEventStack.pop()) {
			if (typeof addEventFunction == 'function') {
				addEventFunction();
			}
		};

	},




	createTabs: function(form) {

		var forceForward = false;

		form.find('input.nx-tabform-forceforward').each(function(i, input) {
			if(jQuery(input).val()) {
				forceForward = true;
			}
		});

		var rawFormContent = jQuery('<div />')
			.addClass('nx-tabform-rawformcontent')
			.css('display', 'none') //TODO: display none
		;
		rawFormContent.append(form.children());

		var allButtons = jQuery('<ul />')
			.addClass('nx-tabform-allbuttons')
		;

		var allContents = jQuery('<div />')
			.addClass('nx-tabform-allcontents')
		;

		var allFooters = jQuery('<div />')
			.addClass('nx-tabform-allfooters')
		;

		form
			.html('')
			.addClass('nx-tabform-tabbed')
			.append(rawFormContent)
			.append(allButtons)
			.append(allContents)
			.append(allFooters)
		;

		var firstFieldConfiguration = {};
		var firstField = true;

		var allTabsConfigurations = [];

		var tabIndex = 0;
		var allowedTabs = [0];
		rawFormContent.find('.nx-tabform-tab').each(function(fieldsetKey, fieldset) {

			var fieldConfiguration = nxformtabs.createSingleTab(jQuery(fieldset), allButtons, allContents, allFooters, tabIndex, allowedTabs);
			if (firstField) {
				firstFieldConfiguration = fieldConfiguration;
			}
			allTabsConfigurations.push(fieldConfiguration);
			firstField = false;

			tabIndex++;

		});

		for (var i=0; i<allTabsConfigurations.length; i++) {
			if(!forceForward) {
				allowedTabs[i] = i;
			}
			nxformtabs.addFootNotesFor(i, allTabsConfigurations, allowedTabs);
		}

		showTabCount = 0;

		nxformtabs.showTab(

			allTabsConfigurations[showTabCount].tabButton,
			allTabsConfigurations[showTabCount].allButtons,

			allTabsConfigurations[showTabCount].tabContent,
			allTabsConfigurations[showTabCount].allContents,

			allTabsConfigurations[showTabCount].tabFooter,
			allTabsConfigurations[showTabCount].allFooters

		);

		nxformtabs.allowedTabs.push(allowedTabs);

		nxformtabs.allTabsConfigurations.push(allTabsConfigurations);

	},




	createSingleTab: function(fieldset, allButtons, allContents, allFooters, tabIndex, allowedTabs) {

		var additionalClasses = [];

		if (fieldset.attr('id')) {
			additionalClasses.push('nx-tabform-originalId-'+fieldset.attr('id'));
		}
		jQuery.each(fieldset.attr('class').split(/\s/g), function(key, className) {
			if (className != '') {
				additionalClasses.push('nx-tabform-originalClass-'+className);
			}
		});

		var tabButton = jQuery('<li />')
			.appendTo(allButtons)
			.addClass('nx-tabform-tabbutton')
		;

		var tabFooter = jQuery('<div />')
			.appendTo(allFooters)
			.addClass('nx-tabform-tabfooter')
		;

		var tabContent = jQuery('<div />')
			.appendTo(allContents)
			.append(fieldset)
			.addClass('nx-tabform-tabcontent')
		;

		jQuery.each(additionalClasses, function(id, className) {
			tabButton.addClass(className);
			tabFooter.addClass(className);
			tabContent.addClass(className);
		});

		var tabName = 'Tab';
                if(fieldset.find('legend').length >= 1) {
                        fieldset.find('legend').css('display', 'none');
                        tabName = jQuery(fieldset.find('legend')[0]).text();
                }


		var buttonLink = jQuery('<a />')
			.appendTo(tabButton)
			.text(tabName)
		;

		nxformtabs.addEventStack.push(function() {
			buttonLink.click(function() {
				if(typeof allowedTabs[tabIndex] != 'undefined' && allowedTabs[tabIndex]!==false) {
					nxformtabs.showTab(
						tabButton, allButtons,
						tabContent, allContents,
						tabFooter, allFooters
					);
				}
			});
		});

		return {

			tabButton: tabButton,
			allButtons: allButtons,

			tabContent: tabContent,
			allContents: allContents,

			tabFooter: tabFooter,
			allFooters: allFooters

		};

	},




	showTab: function (
		tabButton, allButtons,
		tabContent, allContents,
		tabFooter, allFooters
	) {

		allButtons.children().each(function(key, value) {
			nxformtabs.hideSingleBox(
				'button',
				jQuery(value)
			);
		});

		allContents.children().each(function(key, value) {
			nxformtabs.hideSingleBox(
				'content',
				jQuery(value)
			);
		});

		allFooters.children().each(function(key, value) {
			nxformtabs.hideSingleBox(
				'footer',
				jQuery(value)
			);
		});

		nxformtabs.showSingleBox('button', tabButton, allButtons);
		nxformtabs.showSingleBox('content', tabContent, allContents);
		nxformtabs.showSingleBox('footer', tabFooter, allFooters);

	},




	hideSingleBox: function(type, box) {

		box
			.addClass('nx-tabform-tab'+type+'-hide')
			.removeClass('nx-tabform-tab'+type+'-show')
			.removeClass('nx-tabform-tab'+type+'-before')
			.removeClass('nx-tabform-tab'+type+'-after')
		;

	},




	showSingleBox: function(type, box, allBoxes) {

		thisBoxFound = false;
		allBoxes.children().each(function(boxKey, boxElement) {
			if(jQuery(boxElement)[0] == box[0]) {
				thisBoxFound = true;
			}
			if (!thisBoxFound) {
				jQuery(boxElement)
					.addClass('nx-tabform-tab'+type+'-before')
				;
			}
			else if (jQuery(boxElement)[0] != box[0]) {
				jQuery(boxElement)
					.addClass('nx-tabform-tab'+type+'-after')
				;
			}
		});

		box
			.removeClass('nx-tabform-tab'+type+'-hide')
			.addClass('nx-tabform-tab'+type+'-show')
		;

	},




	addFootNotesFor: function(tabPosition, allTabsConfigurations, allowedTabs) {

		var directionBlock = jQuery('<div />')
			.addClass('nx-tabform-directionblock')
			.appendTo(allTabsConfigurations[tabPosition].tabFooter)
		;

		nxformtabs.addForwardButtonFor(tabPosition, allTabsConfigurations, directionBlock, allowedTabs);
		nxformtabs.addFastForwardButtonFor(tabPosition, allTabsConfigurations, directionBlock, allowedTabs);
		nxformtabs.addRevertButtonFor(tabPosition, allTabsConfigurations, directionBlock, allowedTabs);
		nxformtabs.addFastRevertButtonFor(tabPosition, allTabsConfigurations, directionBlock, allowedTabs);

		nxformtabs.addSubmitButtonsFor(tabPosition, allTabsConfigurations, directionBlock, allowedTabs);

		var footNotesBlock = jQuery('<div />')
			.addClass('nx-tabform-footnotes')
			.appendTo(allTabsConfigurations[tabPosition].tabFooter)
		;

		nxformtabs.addFootNoteValuesFor(tabPosition, allTabsConfigurations, footNotesBlock);

	},




	addForwardButtonFor: function(tabPosition, allTabsConfigurations, directionBlock, allowedTabs) {

		if(typeof allTabsConfigurations[tabPosition+1] == 'undefined') {
			return false;
		}
		var revertValue = false;
		var addClasses = [];
		jQuery(allTabsConfigurations[tabPosition].tabContent.find('input.nx-tabform-forward')).each(function(key, value) {
			revertValue = jQuery(value).val();
			addClasses = jQuery(value).attr('class').split(/\s/);
		});
		if (revertValue) {
			var revertButton = jQuery('<input />')
				.addClass('nx-tabform-button')
				.addClass('nx-tabform-forwardbutton')
				.attr('type', 'button')
				.val(revertValue)
				.appendTo(directionBlock)
			;
			jQuery.each(addClasses, function(i, addClass) {
				if (addClass.substr(0, 11) != 'nx-tabform-') {
					revertButton.addClass(addClass);
				}
			});
			nxformtabs.addShowEvent(revertButton, allTabsConfigurations[tabPosition+1], tabPosition+1, allowedTabs);
		}

	},




	addFastForwardButtonFor: function(tabPosition, allTabsConfigurations, directionBlock, allowedTabs) {

		if(typeof allTabsConfigurations[tabPosition+2] == 'undefined') {
			return false;
		}
		var revertValue = false;
		var addClasses = [];
		jQuery(allTabsConfigurations[tabPosition].tabContent.find('input.nx-tabform-fforward')).each(function(key, value) {
			revertValue = jQuery(value).val();
			addClasses = jQuery(value).attr('class').split(/\s/);
		});
		if (revertValue) {
			var revertButton = jQuery('<input />')
				.addClass('nx-tabform-button')
				.addClass('nx-tabform-fastforwardbutton')
				.attr('type', 'button')
				.val(revertValue)
				.appendTo(directionBlock)
			;
			jQuery.each(addClasses, function(i, addClass) {
				if (addClass.substr(0, 11) != 'nx-tabform-') {
					revertButton.addClass(addClass);
				}
			});
			nxformtabs.addShowEvent(revertButton, allTabsConfigurations[tabPosition+2], tabPosition+2, allowedTabs);
		}

	},




	addRevertButtonFor: function(tabPosition, allTabsConfigurations, directionBlock, allowedTabs) {

		if(typeof allTabsConfigurations[tabPosition-1] == 'undefined') {
			return false;
		}
		var forwardValue = false;
		var addClasses = [];
		jQuery(allTabsConfigurations[tabPosition].tabContent.find('input.nx-tabform-revert')).each(function(key, value) {
			forwardValue = jQuery(value).val();
			addClasses = jQuery(value).attr('class').split(/\s/);
		});
		if (forwardValue) {
			var forwardButton = jQuery('<input />')
				.addClass('nx-tabform-button')
				.addClass('nx-tabform-revertbutton')
				.attr('type', 'button')
				.val(forwardValue)
				.appendTo(directionBlock)
			;
			jQuery.each(addClasses, function(i, addClass) {
				if (addClass.substr(0, 11) != 'nx-tabform-') {
					revertButton.addClass(addClass);
				}
			});
			nxformtabs.addShowEvent(forwardButton, allTabsConfigurations[tabPosition-1], tabPosition-1, allowedTabs);
		}

	},




	addFastRevertButtonFor: function(tabPosition, allTabsConfigurations, directionBlock, allowedTabs) {

		if(typeof allTabsConfigurations[tabPosition-2] == 'undefined') {
			return false;
		}
		var forwardValue = false;
		var addClasses = [];
		jQuery(allTabsConfigurations[tabPosition].tabContent.find('input.nx-tabform-rrevert')).each(function(key, value) {
			forwardValue = jQuery(value).val();
			addClasses = jQuery(value).attr('class').split(/\s/);
		});
		if (forwardValue) {
			var forwardButton = jQuery('<input />')
				.addClass('nx-tabform-button')
				.addClass('nx-tabform-fastrevertbutton')
				.attr('type', 'button')
				.val(forwardValue)
				.appendTo(directionBlock)
			;
			jQuery.each(addClasses, function(i, addClass) {
				if (addClass.substr(0, 11) != 'nx-tabform-') {
					revertButton.addClass(addClass);
				}
			});
			nxformtabs.addShowEvent(forwardButton, allTabsConfigurations[tabPosition-2], tabPosition-2, allowedTabs);
		}

	},




	addSubmitButtonsFor: function(tabPosition, allTabsConfigurations, directionBlock, allowedTabs) {

		jQuery(allTabsConfigurations[tabPosition].tabContent.find('input.nx-tabform-submit')).each(function(key, value) {
			addClasses = jQuery(value).attr('class').split(/\s/);
			jQuery(value)
				.appendTo(directionBlock)
				.addClass('nx-tabform-button')
				.addClass('nx-tabform-submitbutton')
			;
		});

	},




	addFootNoteValuesFor: function(tabPosition, allTabsConfigurations, footNotesBlock) {

		jQuery(allTabsConfigurations[tabPosition].tabContent.find('.nx-tabform-footnote')).each(function(key, value) {
			footNotesBlock.append(value);
		});

	},




	addShowEvent: function(element, showConfig, tabIndex, allowedTabs) {

		nxformtabs.addEventStack.push(function() {
			element.click(function(event) {

				for (var i=0; i<=tabIndex; i++) {
					allowedTabs[i] = i;
				}

				nxformtabs.showTab(
					showConfig.tabButton,
					showConfig.allButtons,

					showConfig.tabContent,
					showConfig.allContents,

					showConfig.tabFooter,
					showConfig.allFooters
				);

			});
		});

	},




	allTabsConfigurations: [],




	addEventStack: []




};




jQuery(document).ready(function () {
	nxformtabs.init();
});




