').addClass("formErrorContent").html(promptText).appendTo(prompt);
			// create the css arrow pointing at the field
			// note that there is no triangle on max-checkbox and radio
			if (options.showArrow) {
				var arrow = $('
').addClass("formErrorArrow");
				//prompt positioning adjustment support. Usage: positionType:Xshift,Yshift (for ex.: bottomLeft:+20 or bottomLeft:-20,+10)
				var positionType=field.data("promptPosition") || options.promptPosition;
				if (typeof(positionType)=='string')
				{
					var pos=positionType.indexOf(":");
					if(pos!=-1)
						positionType=positionType.substring(0,pos);
				}
				switch (positionType) {
					case "bottomLeft":
					case "bottomRight":
						prompt.find(".formErrorContent").before(arrow);
						arrow.addClass("formErrorArrowBottom").html('
');
						break;
					case "topLeft":
					case "topRight":
						arrow.html('
');
						prompt.append(arrow);
						break;
				}
			}
			// Modify z-indexes  for jquery ui
			if (field.closest('.ui-dialog').length)
				prompt.addClass('formErrorInsideDialog');
			prompt.css({
				"opacity": 0,
				'position':'absolute'
			});
			field.before(prompt);
			var pos = methods._calculatePosition(field, prompt, options);
			prompt.css({
				"top": pos.callerTopPosition,
				"left": pos.callerleftPosition,
				"marginTop": pos.marginTopSize,
				"opacity": 0
			}).data("callerField", field);
			if (options.autoHidePrompt) {
				setTimeout(function(){
					prompt.animate({
						"opacity": 0
					},function(){
						prompt.closest('.formErrorOuter').remove();
						prompt.remove();
					});
				}, options.autoHideDelay);
			}
			return prompt.animate({
				"opacity": 0.87
			});
		},
		/**
		 * Updates the prompt text field - the field for which the prompt
		 * @param {jqObject} field
		 * @param {String} promptText html text to display type
		 * @param {String} type the type of bubble: 'pass' (green), 'load' (black) anything else (red)
		 * @param {boolean} ajaxed - use to mark fields than being validated with ajax
		 * @param {Map} options user options
		 */
		_updatePrompt: function(field, prompt, promptText, type, ajaxed, options, noAnimation) {
			if (prompt) {
				if (typeof type !== "undefined") {
					if (type == "pass")
						prompt.addClass("greenPopup");
					else
						prompt.removeClass("greenPopup");
					if (type == "load")
						prompt.addClass("blackPopup");
					else
						prompt.removeClass("blackPopup");
				}
				if (ajaxed)
					prompt.addClass("ajaxed");
				else
					prompt.removeClass("ajaxed");
				prompt.find(".formErrorContent").html(promptText);
				var pos = methods._calculatePosition(field, prompt, options);
				var css = {"top": pos.callerTopPosition,
					"left": pos.callerleftPosition,
					"marginTop": pos.marginTopSize};
				if (noAnimation)
					prompt.css(css);
				else
					prompt.animate(css);
			}
		},
		/**
		 * Closes the prompt associated with the given field
		 *
		 * @param {jqObject}
			*            field
		 */
		_closePrompt: function(field) {
			var prompt = methods._getPrompt(field);
			if (prompt)
				prompt.fadeTo("fast", 0, function() {
					prompt.parent('.formErrorOuter').remove();
					prompt.remove();
				});
		},
		closePrompt: function(field) {
			return methods._closePrompt(field);
		},
		/**
		 * Returns the error prompt matching the field if any
		 *
		 * @param {jqObject}
			*            field
		 * @return undefined or the error prompt (jqObject)
		 */
		_getPrompt: function(field) {
			var formId = $(field).closest('form').attr('id');
			var className = methods._getClassName(field.attr("id")) + "formError";
			var match = $("." + methods._escapeExpression(className) + '.parentForm' + formId)[0];
			if (match)
				return $(match);
		},
		/**
		 * Returns the escapade classname
		 *
		 * @param {selector}
			*            className
		 */
		_escapeExpression: function (selector) {
			return selector.replace(/([#;&,\.\+\*\~':"\!\^$\[\]\(\)=>\|])/g, "\\$1");
		},
		/**
		 * returns true if we are in a RTLed document
		 *
		 * @param {jqObject} field
		 */
		isRTL: function(field)
		{
			var $document = $(document);
			var $body = $('body');
			var rtl =
				(field && field.hasClass('rtl')) ||
					(field && (field.attr('dir') || '').toLowerCase()==='rtl') ||
					$document.hasClass('rtl') ||
					($document.attr('dir') || '').toLowerCase()==='rtl' ||
					$body.hasClass('rtl') ||
					($body.attr('dir') || '').toLowerCase()==='rtl';
			return Boolean(rtl);
		},
		/**
		 * Calculates prompt position
		 *
		 * @param {jqObject}
			*            field
		 * @param {jqObject}
			*            the prompt
		 * @param {Map}
			*            options
		 * @return positions
		 */
		_calculatePosition: function (field, promptElmt, options) {
			var promptTopPosition, promptleftPosition, marginTopSize;
			var fieldWidth 	= field.width();
			var fieldLeft 	= field.position().left;
			var fieldTop 	=  field.position().top;
			var fieldHeight 	=  field.height();
			var promptHeight = promptElmt.height();
			// is the form contained in an overflown container?
			promptTopPosition = promptleftPosition = 0;
			// compensation for the arrow
			marginTopSize = -promptHeight;
			//prompt positioning adjustment support
			//now you can adjust prompt position
			//usage: positionType:Xshift,Yshift
			//for example:
			//   bottomLeft:+20 means bottomLeft position shifted by 20 pixels right horizontally
			//   topRight:20, -15 means topRight position shifted by 20 pixels to right and 15 pixels to top
			//You can use +pixels, - pixels. If no sign is provided than + is default.
			var positionType=field.data("promptPosition") || options.promptPosition;
			var shift1="";
			var shift2="";
			var shiftX=0;
			var shiftY=0;
			if (typeof(positionType)=='string') {
				//do we have any position adjustments ?
				if (positionType.indexOf(":")!=-1) {
					shift1=positionType.substring(positionType.indexOf(":")+1);
					positionType=positionType.substring(0,positionType.indexOf(":"));
					//if any advanced positioning will be needed (percents or something else) - parser should be added here
					//for now we use simple parseInt()
					//do we have second parameter?
					if (shift1.indexOf(",") !=-1) {
						shift2=shift1.substring(shift1.indexOf(",") +1);
						shift1=shift1.substring(0,shift1.indexOf(","));
						shiftY=parseInt(shift2);
						if (isNaN(shiftY)) shiftY=0;
					};
					shiftX=parseInt(shift1);
					if (isNaN(shift1)) shift1=0;
				};
			};
			switch (positionType) {
				default:
				case "topRight":
					promptleftPosition +=  fieldLeft + fieldWidth - 30;
					promptTopPosition +=  fieldTop;
					break;
				case "topLeft":
					promptTopPosition +=  fieldTop;
					promptleftPosition += fieldLeft;
					break;
				case "centerRight":
					promptTopPosition = fieldTop+4;
					marginTopSize = 0;
					promptleftPosition= fieldLeft + field.outerWidth(true)+5;
					break;
				case "centerLeft":
					promptleftPosition = fieldLeft - (promptElmt.width() + 2);
					promptTopPosition = fieldTop+4;
					marginTopSize = 0;
					break;
				case "bottomLeft":
					promptTopPosition = fieldTop + field.height() + 5;
					marginTopSize = 0;
					promptleftPosition = fieldLeft;
					break;
				case "bottomRight":
					promptleftPosition = fieldLeft + fieldWidth - 30;
					promptTopPosition =  fieldTop +  field.height() + 5;
					marginTopSize = 0;
			};
			//apply adjusments if any
			promptleftPosition += shiftX;
			promptTopPosition  += shiftY;
			return {
				"callerTopPosition": promptTopPosition + "px",
				"callerleftPosition": promptleftPosition + "px",
				"marginTopSize": marginTopSize + "px"
			};
		},
		/**
		 * Saves the user options and variables in the form.data
		 *
		 * @param {jqObject}
			*            form - the form where the user option should be saved
		 * @param {Map}
			*            options - the user options
		 * @return the user options (extended from the defaults)
		 */
		_saveOptions: function(form, options) {
			// is there a language localisation ?
			if ($.validationEngineLanguage)
				var allRules = $.validationEngineLanguage.allRules;
			else
				$.error("jQuery.validationEngine rules are not loaded, plz add localization files to the page");
			// --- Internals DO NOT TOUCH or OVERLOAD ---
			// validation rules and i18
			$.validationEngine.defaults.allrules = allRules;
			var userOptions = $.extend(true,{},$.validationEngine.defaults,options);
			form.data('jqv', userOptions);
			return userOptions;
		},
		/**
		 * Removes forbidden characters from class name
		 * @param {String} className
		 */
		_getClassName: function(className) {
			if(className)
				return className.replace(/:/g, "_").replace(/\./g, "_");
		},
		/**
		 * Conditionally required field
		 *
		 * @param {jqObject} field
		 * @param {Array[String]} rules
		 * @param {int} i rules index
		 * @param {Map}
			* user options
		 * @return an error string if validation failed
		 */
		_condRequired: function(field, rules, i, options) {
			var idx, dependingField;
			for(idx = (i + 1); idx < rules.length; idx++) {
				dependingField = jQuery("#" + rules[idx]).first();
				/* Use _required for determining wether dependingField has a value.
				 * There is logic there for handling all field types, and default value; so we won't replicate that here
				 */
				if (dependingField.length && methods._required(dependingField, ["required"], 0, options) == undefined) {
					/* We now know any of the depending fields has a value,
					 * so we can validate this field as per normal required code
					 */
					return methods._required(field, ["required"], 0, options);
				}
			}
		}
	};
	/**
	 * Plugin entry point.
	 * You may pass an action as a parameter or a list of options.
	 * if none, the init and attach methods are being called.
	 * Remember: if you pass options, the attached method is NOT called automatically
	 *
	 * @param {String}
		*            method (optional) action
	 */
	$.fn.validationEngine = function(method) {
		var form = $(this);
		if(!form[0]) return form;  // stop here if the form does not exist
		if (typeof(method) == 'string' && method.charAt(0) != '_' && methods[method]) {
			// make sure init is called once
			if(method != "showPrompt" && method != "hide" && method != "hideAll")
				methods.init.apply(form);
			return methods[method].apply(form, Array.prototype.slice.call(arguments, 1));
		} else if (typeof method == 'object' || !method) {
			// default constructor with or without arguments
			methods.init.apply(form, arguments);
			return methods.attach.apply(form);
		} else {
			$.error('Method ' + method + ' does not exist in jQuery.validationEngine');
		}
	};
	// LEAK GLOBAL OPTIONS
	$.validationEngine= {fieldIdCounter: 0,defaults:{
		// Name of the event triggering field validation
		validationEventTrigger: "blur",
		// Automatically scroll viewport to the first error
		scroll: true,
		// Focus on the first input
		focusFirstField:true,
		// Opening box position, possible locations are: topLeft,
		// topRight, bottomLeft, centerRight, bottomRight
		promptPosition: "topRight",
		bindMethod:"bind",
		// internal, automatically set to true when it parse a _ajax rule
		inlineAjax: false,
		// if set to true, the form data is sent asynchronously via ajax to the form.action url (get)
		ajaxFormValidation: false,
		// The url to send the submit ajax validation (default to action)
		ajaxFormValidationURL: false,
		// HTTP method used for ajax validation
		ajaxFormValidationMethod: 'get',
		// Ajax form validation callback method: boolean onComplete(form, status, errors, options)
		// retuns false if the form.submit event needs to be canceled.
		onAjaxFormComplete: $.noop,
		// called right before the ajax call, may return false to cancel
		onBeforeAjaxFormValidation: $.noop,
		// Stops form from submitting and execute function assiciated with it
		onValidationComplete: false,
		// Used when you have a form fields too close and the errors messages are on top of other disturbing viewing messages
		doNotShowAllErrosOnSubmit: false,
		// Object where you store custom messages to override the default error messages
		custom_error_messages:{},
		// true if you want to vind the input fields
		binded: true,
		// set to true, when the prompt arrow needs to be displayed
		showArrow: true,
		// did one of the validation fail ? kept global to stop further ajax validations
		isError: false,
		// Caches field validation status, typically only bad status are created.
		// the array is used during ajax form validation to detect issues early and prevent an expensive submit
		ajaxValidCache: {},
		// Auto update prompt position after window resize
		autoPositionUpdate: false,
		InvalidFields: [],
		onSuccess: false,
		onFailure: false,
		// Auto-hide prompt
		autoHidePrompt: false,
		// Delay before auto-hide
		autoHideDelay: 10000,
		// Fade out duration while hiding the validations
		fadeDuration: 0.3,
		// Use Prettify select library
		prettySelect: false,
		// Custom ID uses prefix
		usePrefix: "",
		// Custom ID uses suffix
		useSuffix: "",
		// Only show one message per error prompt
		showOneMessage: false
	}};
	$(function(){$.validationEngine.defaults.promptPosition = methods.isRTL()?'topLeft':"topRight"});
})(jQuery);
/***************************************************************
 *  Copyright notice
 *
 *  (c) 2012 Alexander Kellner 
, in2code
 *
 *  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 3 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.
 *
 *  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!
 ***************************************************************/
jQuery.fn.powermailTabs = function(options) {
	'use strict';
	var $this = jQuery(this);
	options = jQuery.extend({
		container: 'fieldset',
		header: 'legend'
	},options);
	// generate menu
	var $ul = jQuery('', {
		'id': 'tabmenu',
		'class': 'tabmenu'
	}).insertBefore($this.children(options.container).filter(':first'));
	//all containers
	$this.children(options.container).each(function(i, $fieldset){
		//tab_menu
		$ul.append(
			jQuery('')
			.html($(this).children(options.header).html())
			.addClass((i==0) ? 'active' : '')
			.click({
				container: $this.children(options.container),
				fieldset: $($fieldset)
			}, function(e){
				jQuery('.tabmenu li', $this).removeClass('active');
				jQuery(this).addClass('active');
				e.data.container.hide();
				e.data.fieldset.show()
			})
		)
	});
	// initial show first fieldset
	$this.children(options.container).hide();
	$this.find(options.container).first().show();
	// Stop submit
	$this.submit(function(e) {
		//e.preventDefault();
	});
}