/*
* ALERT
*/

var GAlert = function(sTitle, sMessage, oParams) {
	var sAlertDiv = $('#message-bar');
	if (sMessage == undefined) {
		sMessage = '';
	}
	var iAlertId = GAlert.Register();
	if (GAlert.sp_dHandler != undefined) {
		GAlert.sp_dHandler.Alert(sTitle, sMessage, oParams, iAlertId);
	}
	else {
		if(oParams.iType == GAlert.TYPE_MESSAGE){
			sAlertDiv.css('background-color','#7cb729');
		}else if (oParams.iType == GAlert.TYPE_ERROR){
			sAlertDiv.css('background-color','#be1a1b');
		}
		sAlertDiv.text(sTitle);
		sAlertDiv.slideDown("slow"); 
		setTimeout(function() { 
			sAlertDiv.slideUp(200) 
		}, 3000);
	}
	sAlertDiv.bind('click', function() {
        $(this).slideUp(200);
    });
	return iAlertId;
};

var GWarning = function(sTitle, sMessage, oParams) {
	if (oParams == undefined) {
		oParams = {};
	}
	oParams.iType = GAlert.TYPE_WARNING;
	return GAlert(sTitle, sMessage, oParams);
};

var GError = function(sTitle, sMessage, oParams) {
	if (oParams == undefined) {
		oParams = {};
	}
	oParams.iType = GAlert.TYPE_ERROR;
	return GAlert(sTitle, sMessage, oParams);
};

var GMessage = function(sTitle, sMessage, oParams) {
	if (oParams == undefined) {
		oParams = {};
	}
	oParams.iType = GAlert.TYPE_MESSAGE;
	return GAlert(sTitle, sMessage, oParams);
};

var GPrompt = function(sTitle, fOnConfirm, oParams) {
	if (oParams == undefined) {
		oParams = {};
	}
	var sMessage = '<span class="field-text"><input type="text" class="prompt-value" value="' + ((oParams.sDefault == undefined) ? '' : oParams.sDefault) + '"/></span>';
	oParams = $.extend(true, {
		bAutoExpand: true,
		bNotRetractable: true,
		aoPossibilities: [
			{
				mLink: GEventHandler(function(eEvent) {
					var sValue = $(this).closest('.message').find('input.prompt-value').val();
					fOnConfirm.apply(this, [sValue]);
					//GAlert.DestroyThis.apply(this, [eEvent]);
				}),
				sCaption: GMessageBar.Language.add
			},
			{
				mLink: GAlert.DestroyThis,
				sCaption: GMessageBar.Language.cancel
			}
		]
	}, oParams);
	oParams.iType = GAlert.TYPE_PROMPT;
	return GAlert(sTitle, sMessage, oParams);
};

GAlert.Destroy = function(iAlertId) {
	if (GAlert.sp_dHandler != undefined) {
		GAlert.sp_dHandler.Destroy(iAlertId);
	}
};

GAlert.DestroyThis = function(eEvent) {
	GAlert.Destroy($(this));
};
	
GAlert.DestroyAll = function() {
	if (GAlert.sp_dHandler != undefined) {
		GAlert.sp_dHandler.DestroyAll();
	}
};

GAlert.Register = function() {
	return GAlert.s_iCounter++;
};

GAlert.sp_dHandler;
GAlert.s_iCounter = 0;

GAlert.TYPE_WARNING = 0;
GAlert.TYPE_ERROR = 1;
GAlert.TYPE_MESSAGE = 2;
GAlert.TYPE_PROMPT = 3;


/*
* CORE
*/

var oDefaults = {
	iCookieLifetime: 30,
	sDesignPath: '',
	sController: 'main',
	sCartRedirect: ''
};

GCore = function(oParams) {
	
	GCore.p_oParams = oParams;
	GCore.DESIGN_PATH = GCore.p_oParams.sDesignPath;
	GCore.CONTROLLER = GCore.p_oParams.sController;
	GCore.COOKIE_LIFETIME = GCore.p_oParams.iCookieLifetime;
	GCore.CART_REDIRECT = GCore.p_oParams.sCartRedirect;
	GCore.StartWaiting();
	
};


GCore.NULL = 'null';

GCore.s_afOnLoad = [];

GCore.GetArgumentsArray = function(oArguments) {
	var amArguments = [];
	for (var i = 0; i < oArguments.length; i++) {
		amArguments[i] = oArguments[i];
	}
	return amArguments;
};

GCore.Duplicate = function(oA, bDeep) {
	var oB = $.extend((bDeep == true), {}, oA);
	return oB;
};

GCore.OnLoad = function(fTarget) {
	GCore.s_afOnLoad.push(fTarget);
};

GCore.Init = function() {
	for (var i = 0; i < GCore.s_afOnLoad.length; i++) {
		GCore.s_afOnLoad[i]();
	}
	GCore.StopWaiting();
};

GCore.ExtendClass = function(fBase, fChild, oDefaults) {
	var fExtended = function() {
		var aBaseArguments = [];
		for (var i = 0; i < arguments.length; i++) {
			aBaseArguments.push(arguments[i]);
		}
		var result = fBase.apply(this, aBaseArguments);
		if (result === false) {
			return result;
		}
		fChild.apply(this, arguments);
		this.m_oOptions = $.extend(true, GCore.Duplicate(oDefaults, true), arguments[0]);
		return this;
	};
	for(var i in fBase.prototype) {
		fExtended.prototype[i] = fBase.prototype[i];
	}
	return fExtended;
};

GCore.ObjectLength = function(oObject) {
	var iLength = 0;
	for (var i in oObject) {
		iLength++;
	}
	return iLength;
};

GCore.FilterObject = function(oSource, fTest) {
	var oResult = {};
	for (var i in oSource) {
		if (fTest(oSource[i])) {
			oResult[i] = GCore.Duplicate(oSource[i], true);
		}
	}
	return oResult;
};

GCore.GetIterationArray = function(oSource, fCompare) {
	var oSource = GCore.Duplicate(oSource, true);
	var aSource = [];
	for (var i in oSource) {
		aSource.push($.extend(true, {$$key: i}, oSource[i]));
	}
	aSource.sort(fCompare);
	var asIterationArray = [];
	for (var i = 0; i < aSource.length; i++) {
		asIterationArray.push(aSource[i]['$$key']);
	}
	return asIterationArray;
};

GCore.StartWaiting = function() {
	$('body').css({
		cursor: 'wait'
	});
};

GCore.StopWaiting = function() {
	$('body').css({
		cursor: 'auto'
	});
};


var GEventHandler = function(fHandler) {
	var fSafeHandler = function(eEvent) {
		try {
			if (eEvent.data) {
				for (var i in eEvent.data) {
					this[i] = eEvent.data[i];
				}
			}
			return fHandler.apply(this, arguments);
		}
		catch (xException) {
			GException.Handle(xException);
			return false;
		}
	};
	return fSafeHandler;
};

/*
* CALLBACK
*/

var GCallback = function(fHandler, oParams) {
	if (oParams == undefined) {
		oParams = {};
	}
	var i = GCallback.s_iReferenceCounter++;
	GCallback.s_aoReferences[i] = {
		fHandler: fHandler,
		oParams: oParams
	};
	GCallback['Trigger_' + i] = function() {
		GCallback.Invoke(i, GCore.GetArgumentsArray(arguments));
	};
	return 'GCallback.Trigger_' + i + '';
};

GCallback.s_iReferenceCounter = 0;
GCallback.s_aoReferences = {};

GCallback.Invoke = function(iReference, amArguments) {
	if (amArguments[0] == undefined) {
		amArguments[0] = {};
	}
	var oReference = GCallback.s_aoReferences[iReference];
	if (oReference != undefined) {
		oReference.fHandler.call(this, $.extend(oReference.oParams, amArguments[0]));
	}
	delete GCallback.s_aoReferences[iReference];
};


/*
* EXCEPTION
*/

var GException = function(sMessage) {
	this.m_sMessage = sMessage;
	this.toString = function() {
		return this.m_sMessage;
	};
};

GException.Handle = function(xException) {
	new GAlert(GException.Language['exception_has_occured'], xException);
	throw xException; // for debugging
};

GException.Language = {
	exception_has_occured: 'Wystąpił błąd!'
};


/*
* PLUGIN
*/

var GPlugin = function(sPluginName, oDefaults, fPlugin) {
	
	(function($) {
	
		var oExtension = {};
		oExtension[sPluginName] = function(oOptions) {
			if ($(this).hasClass(sPluginName)) {
				return;
			}
			oOptions = $.extend(GCore.Duplicate(oDefaults), oOptions);
			return this.each(function() {
				this.m_oOptions = oOptions;
				this.m_iId = GPlugin.s_iCounter++;
				GPlugin.s_oInstances[this.m_iId] = this;
				this.m_oParams = {};
				this._GetClass = function(sClassName) {
					var sClass = this.m_oOptions.oClasses['s' + sClassName + 'Class'];
					if (sClass == undefined) {
						return '';
					}
					else {
						return sClass;
					}
				};
				this._GetImage = function(sImageName) {
					var sImage = this.m_oOptions.oImages['s' + sImageName];
					if (sImage == undefined) {
						return '';
					}
					else {
						return GCore.DESIGN_PATH + sImage;
					}
				};
				try {
					var asParams = $(this).attr('class').match(/G\:\w+\=\S+/g);
					if (asParams != undefined) {
						for (var i = 0; i < asParams.length; i++) {
							var asParamData = asParams[i].match(/G:(\w+)\=(\S+)/);
							this.m_oParams[asParamData[1]] = asParamData[2];
						}
					}
					$(this).addClass(sPluginName);
					fPlugin.apply(this, [this.m_oOptions]);
				}
				catch(xException) {
					throw xException;
					GException.Handle(xException);
				}
			});
		};
		$.fn.extend(oExtension);
		fPlugin.GetInstance = GPlugin.GetInstance;
	
	})(jQuery);
	
};

GPlugin.s_iCounter = 0;
GPlugin.s_oInstances = {};

GPlugin.GetInstance = function(iId) {
	if (GPlugin.s_oInstances[iId] != undefined) {
		return GPlugin.s_oInstances[iId];
	}
	throw new GException('Requested instance (' + iId + ') not found.');
	return false;
};


/*
* ACCORDION
*/

var oDefaults = {
	oClasses: {
	}
};

var GAccordion = function() {
	
	var gThis = this;
	
	this._Constructor = function() {
		$(gThis).children('li').not(':first').addClass('collapsed');
		$(gThis).find('h4').click(function(eEvent) {
			if ($(this).closest('li').hasClass('collapsed')) {
				$(gThis).children('li').addClass('collapsed');
				$(this).closest('li').removeClass('collapsed');
				$(gThis).closest('.GLayoutBoxes').trigger('positionsChanged');
				return false;
			}
			return true;
		});
		$(gThis).closest('.GLayoutBoxes').trigger('positionsChanged');
	};
	
	gThis._Constructor();
	
};

new GPlugin('GAccordion', oDefaults, GAccordion);


/*
* BOX
* Adds a subtle shadow to a block.
*/

var oDefaults = {
	oClasses: {
		sN: 'beginning',
		sS: 'ending'
	}
};

var GBox = function() {
	
	var gThis = this;
	
	gThis._Constructor = function() {
		$(gThis).prepend('<div class="' + gThis.m_oOptions.oClasses.sN + '"/>');
		$(gThis).append('<div class="' + gThis.m_oOptions.oClasses.sS + '"/>');
	};
	
	gThis._Constructor();
	
};

new GPlugin('GBox', oDefaults, GBox);



/*
* CART REFRESH
* Automated cart refresh after adding a product to cart
*/

var GCartRefresh = function() {
	
	var gThis = this;

	this._Constructor = function() {
		
		if(GCore.CART_REDIRECT != undefined && GCore.CART_REDIRECT != ''){
			parent.$.fancybox.close();
			parent.location.href = GCore.CART_REDIRECT;
		}else{
			parent.$.fancybox.close();
			if (typeof parent.xajax_RefreshCart === 'function') {
				return parent.xajax_RefreshCart();
			}else{
				GMessage('Produkt został dodany do koszyka','Kliknij OK aby kontynuować zakupy');
			}
		}
	};
	
	gThis._Constructor();
	
};

new GPlugin('GCartRefresh', oDefaults, GCartRefresh);

/*
* LOADING
* Adds a loading indicator for the desired DOM element.
*/

var oDefaults = {
	oClasses: {
	},
	sBackground: '#fff',
	fOpacity: .75,
	iZIndex: 1001
};

var GLoading = function() {
	
	var gThis = this;
	
	gThis.m_jOverlay;
	gThis.m_jIcon;
	
	gThis._Constructor = function() {
		gThis.m_jOverlay = $('<div class="GLoading"/>').css({
			display: 'block',
			position: 'absolute',
			left: $(gThis).offset().left,
			top: $(gThis).offset().top,
			width: $(gThis).width(),
			height: $(gThis).height(),
			zIndex: gThis.m_oOptions.iZIndex,
			opacity: 0,
			background: gThis.m_oOptions.sBackground
		});
		gThis.m_jIcon = $('<div class="GLoading_icon"/>').css({
			display: 'block',
			position: 'absolute',
			left: $(gThis).offset().left,
			top: $(gThis).offset().top,
			width: $(gThis).width(),
			height: $(gThis).height(),
			zIndex: gThis.m_oOptions.iZIndex,
			opacity: 0
		});
		$('body').append(gThis.m_jOverlay).append(gThis.m_jIcon);
		gThis.m_jOverlay.animate({
			duration: 500,
			opacity: gThis.m_oOptions.fOpacity
		});
		gThis.m_jIcon.animate({
			duration: 500,
			opacity: 1
		});
		$(gThis).resize(GEventHandler(function(eEvent) {
			gThis.m_jOverlay.css({
				width: $(gThis).width(),
				height: $(gThis).height()
			});
			gThis.m_jIcon.css({
				width: $(gThis).width(),
				height: $(gThis).height()
			});
		}));
	};
	
	gThis.StopLoading = function() {
		gThis.m_jOverlay.stop(true, true).animate({
			duration: 500,
			opacity: 0
		}, function() {
			$(this).remove();
		});
		gThis.m_jIcon.stop(true, true).animate({
			duration: 500,
			opacity: 0
		}, function() {
			$(this).remove();
		});
		$(gThis).removeClass('GLoading');
	};
	
	gThis._Constructor();
	
};

GLoading.Stop = function(jNode) {
	return jNode.get(0).StopLoading();
};

GLoading.RemoveAll = function() {
	$('.GLoading, GLoading_icon').remove();
};

new GPlugin('GLoading', oDefaults, GLoading);

/*
* PRODUCT ATTRIBUTES
*/

var oDefaults = {
	
};

var GProductAttributes = function(oOptions) {
	
	var gThis = this;
	
	
	gThis._Constructor = function() {
		$(gThis).change(function(){
			gThis.UpdateAttributes(oOptions);
		});
	};
	
	gThis.UpdateAttributes = function(oOptions) {
		gThis.aoAttributes = [];
		$(".attributes").find('option:selected').each(function() {
			gThis.aoAttributes.push(this.value);
		});
		gThis.sCheckedVariant = gThis.aoAttributes.join(',');
		if(oOptions.aoVariants[gThis.sCheckedVariant] == undefined){
			$('#available').hide();
			$('#noavailable').show();
		}else{
			$('#available').show();
			$('#noavailable').hide();
			$('#attributevariants').val(oOptions.aoVariants[gThis.sCheckedVariant].setid);
			$('#availablestock').val(oOptions.aoVariants[gThis.sCheckedVariant].stock);
			$('#availablity').text(oOptions.aoVariants[gThis.sCheckedVariant].stock);
			$('#variantprice').val(oOptions.aoVariants[gThis.sCheckedVariant].sellprice);
			$('#changeprice').text(oOptions.aoVariants[gThis.sCheckedVariant].sellprice + ' '+ oOptions.sCurrency);
		}
		
	};
	
	gThis._Constructor();
	gThis.UpdateAttributes(oOptions);
	
};

new GPlugin('GProductAttributes', oDefaults, GProductAttributes);


/*
* SEARCH
* Live Search 
*/

var oDefaults = {
	oClasses: {
	},
	sBackground: '#fff',
	fOpacity: .75,
	iZIndex: 1001,
	iDuration: 200,
	sDefaultText: 'Szukaj produktu...',
	sViewUrl:'/index.php/searchresults/view/',
	sPlaceholder: 'live-search-results'
};

var GSearch = function() {
	
	var gThis = this;
	
	gThis._Constructor = function() {
		gThis.m_jInput = $(this);
		gThis.sLastValue = gThis.m_jInput.val();
		gThis.m_jInput.attr('autocomplete','off');
		gThis.m_jLiveSearch = $('<div>').attr('id',gThis.m_oOptions.sPlaceholder).appendTo(document.body).hide().slideUp(0);
		$(document.body).click(function(event){
			var clicked = $(event.target);
			if(!(clicked.is('#'+gThis.m_oOptions.sPlaceholder) || clicked.parents('#' + gThis.m_oOptions.sPlaceholder).length || clicked.is('input'))){
				gThis.m_jLiveSearch.slideUp(gThis.m_oOptions.iDuration);
			}
		});
		gThis.OnFocus();
		gThis.OnBlur();
		gThis.OnClick();
		
		gThis.m_jInput.typeWatch({callback: function(){
			gThis.OnTypingFinished();
		}});
	};
	
	gThis.RepositionLiveSearch = function() {
		var liveSearchPaddingBorderHoriz = parseInt(gThis.m_jLiveSearch.css('paddingLeft'), 10) + parseInt(gThis.m_jLiveSearch.css('paddingRight'), 10) + parseInt(gThis.m_jLiveSearch.css('borderLeftWidth'), 10) + parseInt(gThis.m_jLiveSearch.css('borderRightWidth'), 10);
		var tmpOffset = gThis.m_jInput.offset();
		var inputDim = {
			left: tmpOffset.left,
			top: tmpOffset.top,
			width: gThis.m_jInput.outerWidth(),
			height: gThis.m_jInput.outerHeight()
		};
		
		inputDim.topPos = inputDim.top + inputDim.height;
		inputDim.totalWidth = inputDim.width - liveSearchPaddingBorderHoriz;

		gThis.m_jLiveSearch.css({
			position:	'absolute',
			left:	inputDim.left+'px',
			top:	inputDim.topPos+'px',
			width:	inputDim.totalWidth+'px'
		});
	};
	
	gThis.ShowLiveSearch = function() {
		gThis.RepositionLiveSearch();	
		$(window).unbind('resize', gThis.RepositionLiveSearch).bind('resize', gThis.RepositionLiveSearch);
		gThis.m_jLiveSearch.slideDown(gThis.m_oOptions.iDuration);
	};
	
	gThis.HideLiveSearch = function() {
		gThis.m_jLiveSearch.slideUp(gThis.m_oOptions.iDuration);
	};
	
	gThis.OnFocus = function() {
		gThis.m_jInput.focus(function() {
			if(gThis.m_jInput.val() == gThis.m_oOptions.sDefaultText) $(this).val("");
		});
		if (gThis.m_jInput.val() != ''){
			if (gThis.m_jLiveSearch.html() == ''){
				gThis.sLastValue = '';
				gThis.m_jInput.keyup();
			}else{
				setTimeout(gThis.ShowLiveSearch(),1);
			}
		}
	};
	
	gThis.OnClick = function() {
		gThis.m_jInput.click(function(){
			if(gThis.m_jLiveSearch.html() != '') {
				setTimeout(gThis.ShowLiveSearch(),1);
			}	
		});
	};
	
	gThis.OnBlur = function() {
		gThis.m_jInput.blur(function() {
			if(gThis.m_jInput.val() == '') $(this).val(gThis.m_oOptions.sDefaultText);
		});
		if(gThis.m_jLiveSearch.html() != ''){
			gThis.ShowLiveSearch();
		}
	};
	
	gThis.OnTypingFinished = function() {
		if(gThis.sLastValue != gThis.m_jInput.val() && gThis.m_jInput.val() != '' && gThis.m_jInput.val() != gThis.m_oOptions.sDefaultText && gThis.m_jInput.val().length > 2){
			gThis.LoadResults();
		}
	};
	
	gThis.LoadResults = function() {
		gThis.sLastValue = gThis.m_jInput.val();
		$.get(gThis.m_oOptions.sViewUrl + Base64.encode(gThis.m_jInput.val()), function (data){
			if (data.length && gThis.sLastValue.length) {
				gThis.m_jLiveSearch.html(data);
				gThis.ShowLiveSearch();
			}else{
				gThis.HideLiveSearch();
			}
		});
	};
	
	gThis._Constructor();
	
};

new GPlugin('GSearch', oDefaults, GSearch);

/*
* SELECT
* Beautiful select-field replacement.
*/

var oDefaults = {
	oClasses: {
		sFauxClass: 'faux'
	}
};

var GSelect = function() {
	
	var gThis = this;
	
	this._Constructor = function() {
		if (this.bSelectInitialized) {
			return;
		}
		this.bSelectInitialized = true;
		$(this).parent().find('select').css('opacity', 0);
		$(this).parent().append('<span class="' + gThis._GetClass('Faux') + '"><span>' + $(this).find('option:selected').text() + '</span></span>');
		$(this).change(function() {
			$(this).parent().find('.' + gThis._GetClass('Faux') + ' span').text($(this).find('option:selected').text());
		});
	};
	
	gThis._Constructor();
	
};

new GPlugin('GSelect', oDefaults, GSelect);


/*
* SEO LINK
* Automated seo link replacement
*/

var GSeoLinks = function() {
	
	var gThis = this;
	
	this._Constructor = function() {
		$('span.sflink').each(function(){
			$(this).replaceWith($('<a>').attr('href',Base64.decode($(this).attr('class').split(' ').pop())).text($(this).text()));
        });
	};
	
	gThis._Constructor();
	
};

new GPlugin('GSeoLinks', oDefaults, GSeoLinks);


/*
* LAYOUT COLUMN
*/

var GLayoutColumn = function(oOptions) {
	
	var gThis = this;
	
	gThis.m_oOptions = $.extend(true, GCore.Duplicate(GLayoutColumn.DEFAULTS, true), oOptions);
	
};

GLayoutColumn.WIDTH_AUTO = 0;

GLayoutColumn.DEFAULTS = {
	iWidth: 0,
	asBoxes: []
};


/*
* LAYOUT BOX
*/

var GLayoutBox = function(oOptions) {
	
	var gThis = this;
	
	gThis.m_oOptions = $.extend(true, GCore.Duplicate(GLayoutBox.DEFAULTS, true), oOptions);
	
	gThis.p_oPosition = {c:0, r:0};
	gThis.m_bCollapsed = false;
	gThis.m_bClosed = false;
	gThis.m_iSpan = 1;
	gThis.m_sType;
	gThis.m_oObject = GCore.NULL;
	gThis.m_aiWidthClasses = [];
	
	gThis._Constructor = function() {
		gThis.m_oOptions.jNode.data('oBox', gThis);
		gThis._ExtractOptions();
		gThis._InitializeEvents();
	};
	
	gThis.ChangeParams = function(oBoxModification) {
		if (!$.isEmptyObject(oBoxModification)) {
			gThis.m_oOptions.oParamsFromHash = $.extend(gThis.m_oOptions.oParamsFromHash, oBoxModification);
			var oModification = {};
			oModification[gThis.m_oOptions['sName']] = gThis.m_oOptions.oParamsFromHash;
			gThis.m_oOptions.oLayoutBoxes.ChangeParams(oModification);
			gThis.m_oOptions.jNode.triggerHandler('boxHashParamsChange');
		}
		return gThis.m_oParamsFromHash;
	};
	
	gThis.OnLinkClick = GEventHandler(function(eEvent) {
		gThis.ParseLink($(this).attr('href'));
		return false;
	});
	
	gThis.ParseLink = function(sLink) {
		gThis.m_oOptions.oLayoutBoxes.ChangeParams(gThis.m_oOptions.oLayoutBoxes._GetParamsFromHref(sLink));
		return false;
	};
	
	gThis._ExtractOptions = function() {
		var sClass = gThis.m_oOptions.jNode.attr('class');
		var oMatch;
		var rRE = /layout-box-option-([^- ]+)-([^- ]+)/g;
		while ((oMatch = rRE.exec(sClass)) !== null) {
			switch (oMatch[1]) {
				case 'expandable':
					gThis.m_oOptions.bExpandable = (oMatch[2] == 'true');
					break;
				case 'closable':
					gThis.m_oOptions.bClosable = (oMatch[2] == 'true');
					break;
				case 'collapsible':
					gThis.m_oOptions.bCollapsible = (oMatch[2] == 'true');
					break;
				case 'fixed':
					gThis.m_oOptions.bFixed = (oMatch[2] == 'true');
					break;
				case 'collapsed':
					gThis.m_bCollapsed = (oMatch[2] == 'true');
					break;
				case 'header':
					gThis.m_oOptions.bShowHeader = (oMatch[2] == 'true');
					break;
				case 'span':
					gThis.m_oOptions.iSpan = parseInt(oMatch[2]);
					break;
			}
		}
		var rRE2 = /layout-box-type-([^ ]+)/;
		oMatch = rRE2.exec(sClass);
		if (oMatch != null) {
			gThis.m_sType = oMatch[1];
		}
	};
	
	gThis._InitializeEvents = function() {
		gThis.m_oOptions.jNode.bind('distributed', gThis.OnDistributed);
		gThis.m_oOptions.jNode.find('.layout-box-header').disableSelection();
		if (gThis.m_bCollapsed) {
			gThis.m_oOptions.jNode.find('.layout-box-content').css('display', 'none');
		}
		gThis.m_oOptions.jNode.find('a[href*=",p="]').click(gThis.OnLinkClick);
		gThis.m_oOptions.jNode.bind('resize', gThis._CheckWidthClasses);
	};
	
	gThis.SetWidthClasses = function(aiClasses) {
		gThis.m_aiWidthClasses = aiClasses;
	};
	
	gThis._CheckWidthClasses = GEventHandler(function(eEvent) {
		gThis.m_oOptions.jNode.attr('class', gThis.m_oOptions.jNode.attr('class').replace(/layout-box-width-class-\d+/g, ''));
		if (!gThis.m_aiWidthClasses.length) {
			return;
		}
		var iWidth = gThis.m_oOptions.jNode.width();
		for (var i = 0; i < gThis.m_aiWidthClasses.length; i++) {
			if (gThis.m_aiWidthClasses[i] > iWidth) {
				break;
			}
		}
		gThis.m_oOptions.jNode.addClass('layout-box-width-class-' + i);
	});
	
	gThis._InitializeBox = function() {
		if (gThis.m_sType != undefined) {
			var sFunctionName = 'GLayoutBoxType' + gThis.m_sType.replace(/\w+/g, function(a) {
				return a.charAt(0).toUpperCase() + a.substr(1).toLowerCase();
			}).replace(/-/, '');
			if (window[sFunctionName]) {
				gThis.m_oObject = new window[sFunctionName]({
					jNode: gThis.m_oOptions.jNode,
					oLayoutBox: gThis
				});
			}
		}
	};
	
	gThis._InitializeIcons = function() {
		var jBox = gThis.m_oOptions.jNode;
		jBox.find('.layout-box-icons .layout-box-icon, .layout-box-resize').remove();
		if (gThis.m_oOptions.bCollapsible) {
			if (gThis.m_bCollapsed) {
				gThis.m_oOptions.jNode.addClass('layout-box-collapsed');
				jBox.find('.layout-box-icons').prepend($('<span class="layout-box-uncollapse layout-box-icon"/>').click(gThis.Uncollapse));
				jBox.find('.layout-box-header h3').click(gThis.Uncollapse).css('cursor', 'pointer');
			}
			else {
				gThis.m_oOptions.jNode.removeClass('layout-box-collapsed');
				jBox.find('.layout-box-icons').prepend($('<span class="layout-box-collapse layout-box-icon"/>').click(gThis.Collapse));
				jBox.find('.layout-box-header h3').click(gThis.Collapse).css('cursor', 'pointer');
			}
		}
		if (gThis.m_oOptions.bClosable) {
			jBox.find('.layout-box-icons').prepend($('<span class="layout-box-close layout-box-icon"/>').click(gThis.Close));
		}
		if (gThis.m_oOptions.bExpandable) {
			var jExpansionTrigger = $('<span class="layout-box-resize"/>');
			jBox.append(jExpansionTrigger.mousedown(gThis.OnStartResize));
		}
		jBox.find('.layout-box-header h3').unbind('click', gThis.Collapse).unbind('click', gThis.Uncollapse);
	};
	
	gThis.m_iInitX = 0;
	gThis.m_iCurrentSpan = 1;
	gThis.m_iFormerWidth = 0;
	gThis.m_jBoxHelper;
	
	gThis.OnStartResize = GEventHandler(function(eEvent) {
		gThis.m_oOptions.jNode.parent().css('z-index', 1000);
		$(gThis.m_oOptions.oLayoutBoxes).find('.ui-sortable').sortable('disable');
		$('body').mousemove(gThis.OnResize).mouseup(gThis.OnStopResize);
		gThis.m_iInitX = eEvent.pageX;
		gThis.m_jBoxHelper = $('<div class="layout-box-place"/>');
		gThis.m_oOptions.jNode.after(gThis.m_jBoxHelper);
		var jBox = gThis.m_oOptions.jNode;
		gThis.m_iFormerWidth = jBox.width();
		gThis.m_jBoxHelper.css({
			position: 'absolute',
			left: jBox.offset().left - jBox.parent().offset().left,
			top: jBox.offset().top - jBox.parent().offset().top,
			width: jBox.width(),
			height: jBox.height(),
			zIndex: 1000
		});
		return false;
	});
	
	gThis.OnResize = GEventHandler(function(eEvent) {
		var iDifference = eEvent.pageX - gThis.m_iInitX;
		var iOldSpan = gThis.m_iCurrentSpan;
		if (iDifference > gThis.m_oOptions.oLayoutBoxes.m_oOptions.iSpace) {
			gThis.m_iCurrentSpan = gThis.m_iSpan + 1;
		}
		else if (iDifference < -gThis.m_oOptions.oLayoutBoxes.m_oOptions.iSpace) {
			gThis.m_iCurrentSpan = gThis.m_iSpan - 1;
		}
		if (iOldSpan != gThis.m_iCurrentSpan) {
			gThis.m_oOptions.jNode.data('iSpan', gThis.m_iCurrentSpan);
			$(gThis.m_oOptions.oLayoutBoxes).triggerHandler('positionsChanged');
		}
		gThis.m_jBoxHelper.width(gThis.m_oOptions.jNode.width());
		gThis.m_jBoxHelper.height(gThis.m_oOptions.jNode.height());
		if (document.selection) {
			document.selection.createRange().execCommand('Unselect');
		}
	});
	
	gThis.OnStopResize = GEventHandler(function(eEvent) {
		$('body').unbind('mousemove', gThis.OnResize);
		$('body').unbind('mouseup', gThis.OnStopResize);
		gThis.ChangeSpan(gThis.m_iCurrentSpan);
		gThis.m_jBoxHelper.remove();
		$(gThis.m_oOptions.oLayoutBoxes).find('.ui-sortable').sortable('enable');
		if (document.selection) {
			document.selection.createRange().execCommand('Unselect');
		}
	});
	
	gThis.OnDistributed = GEventHandler(function(eEvent) {
		gThis.m_oOptions.jNode.triggerHandler('resize');
	});
	
	gThis.Close = function() {
		gThis.m_bClosed = true;
		gThis.m_oOptions.jNode.fadeOut(200, function() {
//			$(this).appendTo(gThis.m_oOptions.oLayoutBoxes.m_jClosedBoxes).css('display', 'none');
			$(gThis.m_oOptions.oLayoutBoxes).triggerHandler('distributionChanged');
			gThis.m_oOptions.oLayoutBoxes._UpdateOptions();
		});
	};
	
	gThis.Show = function() {
		gThis.m_bClosed = false;
		gThis.m_oOptions.jNode.css('display', 'block');
		gThis.m_oOptions.jNode.appendTo($(gThis.m_oOptions.oLayoutBoxes).find('.layout-column:first'));
		$(gThis.m_oOptions.oLayoutBoxes).triggerHandler('distributionChanged');
		gThis.m_oOptions.oLayoutBoxes._UpdateOptions();
	};
	
	gThis.Collapse = function() {
		if (gThis.m_oOptions.jNode.data('bDontCollapse')) {
			return;
		}
		gThis.m_oOptions.jNode.addClass('layout-box-collapsed');
		gThis.m_bCollapsed = true;
		gThis._InitializeIcons();
		gThis.m_oOptions.jNode.find('.layout-box-content').slideUp(gThis.m_oOptions.iAnimationTime, function() {
			$(gThis.m_oOptions.oLayoutBoxes).triggerHandler('distributionChanged');
			$(window).triggerHandler('resize');
			if (!gThis.m_oOptions.bShowHeader) {
				gThis.m_oOptions.jNode.removeClass('layout-box-option-header-false');
			}
		});
		gThis.m_oOptions.jNode.triggerHandler('collapse');
		gThis.m_oOptions.jNode.triggerHandler('resize');
	};
	
	gThis.Uncollapse = function() {
		if (gThis.m_oOptions.jNode.data('bDontCollapse')) {
			return;
		}
		gThis.m_oOptions.jNode.removeClass('layout-box-collapsed');
		gThis.m_bCollapsed = false;
		if (!gThis.m_oOptions.bShowHeader) {
			gThis.m_oOptions.jNode.addClass('layout-box-option-header-false');
		}
		gThis._InitializeIcons();
		gThis.m_oOptions.jNode.find('.layout-box-content').slideDown(gThis.m_oOptions.iAnimationTime, function() {
			$(gThis.m_oOptions.oLayoutBoxes).triggerHandler('distributionChanged');
			$(window).triggerHandler('resize');
		});
		gThis.m_oOptions.jNode.triggerHandler('uncollapse');
		gThis.m_oOptions.jNode.triggerHandler('resize');
	};
	
	gThis.Expand = function() {
		gThis.ChangeSpan(gThis.m_iSpan + 1);
	};
	
	gThis.Retract = function() {
		gThis.ChangeSpan(gThis.m_iSpan - 1);
	};
	
	gThis.ChangeSpan = function(iSpan) {
		gThis.m_iSpan = Math.max(1, iSpan);
		gThis.m_oOptions.jNode.data('iSpan', gThis.m_iSpan);
		gThis._InitializeIcons();
		$(gThis.m_oOptions.oLayoutBoxes).triggerHandler('distributionChanged');
		gThis.m_oOptions.jNode.triggerHandler('resize');
	};
	
	gThis._Constructor();
	
};

GLayoutBox.DEFAULTS = {
	sName: '',
	sCaption: '',
	bClosable: true,
	bCollapsible: true,
	bFixed: false,
	bExpandable: true,
	bShowHeader: true,
	iSpan: 1,
	jNode: GCore.NULL,
	iAnimationTime: 50,
	oLayoutBoxes: GCore.NULL,
	oParamsFromHref: {},
	oParamsFromHash: {}
};


/*
* LAYOUT BOXES
*/

var oDefaults = {
	aoColumns: [],
	sLayoutHash: '',
	iSpace: 20,
	iMinWidth: 800,
	oImages: {
		sOptionsIcon: 'icons/options.png'
	}
};

var GLayoutBoxes = function() {
	
	var gThis = this;
	
	gThis.m_iColumns = 0;
	gThis.m_iBoxes = 0;
	gThis.m_oBoxes = {};
	gThis.m_aasBoxesDistribution = {};
	gThis.m_bDontSave = false;
	gThis.m_iCurrentlySortedOriginalSpan = 1;
	gThis.m_iCurrentlySortedSpan = 1;
	gThis.m_iOffsetTop = 0;
	gThis.m_bInvalidPlace = false;
	gThis.m_jClosedBoxes;
	gThis.m_jBoxesOptions;
	gThis.m_oBoxesOptions;
	gThis.m_oParamsFromHref;
	gThis.m_oParamsFromHash;
	
	gThis._Constructor = function() {
		gThis.m_oParamsFromHref = gThis._GetParamsFromHref(location.href);
		gThis.m_oParamsFromHash = $.extend({}, gThis.m_oParamsFromHref, gThis._GetParamsFromHash(location.hash));
		gThis.m_iColumns = gThis.m_oOptions.aoColumns.length;
		gThis.m_jClosedBoxes = $('<div/>');
		$(gThis).append(gThis.m_jClosedBoxes);
		gThis._CreateBoxes();
		gThis._CreateColumns();
		gThis.ResetDistribution();
		gThis._InitializeEvents();
		gThis._DistributeParams();
		gThis._InitializeBoxes();
		gThis.ResetDistribution();
	};
	
	gThis._GetParamsFromHref = function(sSource, sBoxId) {
		var mMatch = sSource.match(/,p=([^,#?]+)/);
		if (mMatch == null) {
			return {};
		}
		if (sBoxId == undefined) {
			return gThis._ExtractParams(mMatch[1]);
		}
		return gThis._ExtractParams(mMatch[1])[sBoxId];
	};
	
	gThis._GetParamsFromHash = function(sSource, sBoxId) {
		if ((sSource == undefined) || !sSource.length) {
			return {};
		}
		var mMatch = (',' + sSource).match(/,#?p=([^,#?]+)/);
		if (mMatch == null) {
			return {};
		}
		if (sBoxId == undefined) {
			return gThis._ExtractParams(mMatch[1]);
		}
		return gThis._ExtractParams(mMatch[1])[sBoxId];
	};
	
	gThis._ExtractParams = function(sSource) {
		return $.parseJSON(Base64.decode(sSource));
	};
	
	gThis.ChangeParams = function(oModification) {
		if (!$.isEmptyObject(oModification)) {
			gThis.m_oParamsFromHash = $.extend(gThis.m_oParamsFromHash, oModification);
			location.hash = 'p=' + Base64.encode(JSON.stringify(gThis.m_oParamsFromHash));
			gThis._DistributeParams();
			$(gThis).triggerHandler('hashParamsChange');
		}
		return gThis.m_oParamsFromHash;
	};
	
	gThis._DistributeParams = function() {
		for (var i in gThis.m_oParamsFromHash) {
			if (gThis.m_oBoxes[i] != undefined) {
				gThis.m_oBoxes[i].m_oOptions.oParamsFromHash = gThis.m_oParamsFromHash[i];
				gThis.m_oBoxes[i].m_oOptions.jNode.triggerHandler('boxParamsChange');
			}
		}
	};
	
	gThis.ResetDistribution = function() {
		gThis.m_bDontSave = true;
		gThis.m_aasBoxesDistribution = {};
		var bLoadDefault = true;
		var aaoDistribution = {};
		if ($.cookie(GLayoutBoxes.COOKIE_NAME_HASHCODE + GCore.CONTROLLER) != undefined) {
			if (gThis.m_oOptions.sLayoutHash != $.cookie(GLayoutBoxes.COOKIE_NAME_HASHCODE + GCore.CONTROLLER)) {
				$.cookie(GLayoutBoxes.COOKIE_NAME_DISTRIBUTION + GCore.CONTROLLER, null);
			}
		}
		$.cookie(GLayoutBoxes.COOKIE_NAME_HASHCODE + GCore.CONTROLLER, gThis.m_oOptions.sLayoutHash, {expires: GCore.COOKIE_LIFETIME});
		if ($.cookie(GLayoutBoxes.COOKIE_NAME_DISTRIBUTION + GCore.CONTROLLER) != undefined) {
			bLoadDefault = false;
			try {
				
				gThis.m_aasBoxesDistribution = $.parseJSON($.cookie(GLayoutBoxes.COOKIE_NAME_DISTRIBUTION + GCore.CONTROLLER));
			}
			catch (xException) {
				bLoadDefault = true;
			}
		}
		if (bLoadDefault) {
			for (var i = 0; i < gThis.m_iColumns; i++) {
				var oColumn = gThis.m_oOptions.aoColumns[i];
				gThis.m_aasBoxesDistribution[i] = GCore.Duplicate(gThis.m_oOptions.aoColumns[i].m_oOptions.asBoxes);
			}
		}

		gThis.DistributeBoxes();
		gThis.m_bDontSave = false;
	};
	
	gThis._CreateBoxes = function() {
		var jBoxes = $(gThis).find('.layout-box');
		gThis.m_iBoxes = jBoxes.length;
		for (var i = 0; i < gThis.m_iBoxes; i++) {
			var sName = jBoxes.eq(i).attr('id').substr("layout-box-".length);
			gThis.m_oBoxes[sName] = new GLayoutBox({
				sName: sName,
				sCaption: jBoxes.eq(i).find('.layout-box-header h3').text(),
				jNode: jBoxes.eq(i),
				oLayoutBoxes: gThis,
				oParamsFromHref: gThis.m_oParamsFromHref[sName],
				oParamsFromHash: gThis.m_oParamsFromHash[sName]
			});
		}
	};
	
	gThis._InitializeBoxes = function() {
		for (var i in gThis.m_oBoxes) {
			gThis.m_oBoxes[i]._InitializeBox();
		}
	};
	
	gThis._CreateColumns = function() {
		for (var i = 0; i < gThis.m_iColumns; i++) {
			var oColumn = gThis.m_oOptions.aoColumns[i];
			var jColumn = $(gThis).children('.layout-column:eq(' + i + ')');
			$(gThis).append(jColumn);
			jColumn.css('z-index', 1 + gThis.m_iColumns - i);
		}
	};
	
	gThis._UpdateOptions = function() {
		var jContent = $('<div/>');
		jContent.append('<p>' + GLayoutBoxes.Language.available_boxes + ' (<a href="#">' + GLayoutBoxes.Language.restore_layout + '</a>):</p>');
		jContent.find('a').click(GEventHandler(function(eEvent) {
			$.cookie(GLayoutBoxes.COOKIE_NAME_DISTRIBUTION + GCore.CONTROLLER, null);
			gThis.ResetDistribution();
			gThis._UpdateOptions();
			return false;
		}));
		var jUl = $('<ul/>');
		jContent.append(jUl);
		gThis.m_jBoxesOptions.find('.layout-box-content').html(jContent);
		for (var i in gThis.m_oBoxes) {
			var oBox = gThis.m_oBoxes[i];
			var jLi = $('<li><label><input type="checkbox" name="show[' + oBox.m_oOptions.sName + ']" value="1"' + (oBox.m_oOptions.bClosable ? '' : ' disabled="disabled"') + '/>' + oBox.m_oOptions.sCaption + '</label></li>');
			if (gThis.m_jClosedBoxes.children('#layout-box-' + oBox.m_oOptions.sName).length) {
				jLi.unCheckCheckboxes();
			}
			else {
				jLi.checkCheckboxes();
			}
			jLi.find('input').change(GEventHandler(function(eEvent) {
				var sName = $(this).attr('name').substring(5, $(this).attr('name').length - 1);
				var oBox = gThis.m_oBoxes[sName];
				if ($(this).is(':checked')) {
					oBox.Show();
				}
				else {
					oBox.Close();
				}
			}));
			jUl.append(jLi);
		}
	};
	
	gThis.DistributeBoxes = function() {
		var jColumns = $(gThis).children('.layout-column');
		for (var i = 0; i < gThis.m_iColumns; i++) {
			if (gThis.m_aasBoxesDistribution[i] == undefined) {
				continue;
			}
			var jColumn = jColumns.eq(i);
			var iBoxes = GCore.ObjectLength(gThis.m_aasBoxesDistribution[i]);
			for (var j = 0; j < iBoxes; j++) {
				var oBoxOptions = gThis.m_aasBoxesDistribution[i][j];
				var oBox = gThis.m_oBoxes[oBoxOptions.sName];
				if (oBoxOptions.iSpan != undefined) {
					oBox.ChangeSpan(oBoxOptions.iSpan);
				}
				else {
					oBox.ChangeSpan(1);
				}
				var iTime = oBox.m_oOptions.iAnimationTime;
				oBox.m_oOptions.iAnimationTime = 0;
				if (oBoxOptions.bCollapsed) {
					oBox.Collapse();
				}
				else {
					oBox.Uncollapse();
				}
				oBox.m_bClosed = oBoxOptions.bClosed;
				if (!oBox.m_bClosed) {
					oBox.m_oOptions.jNode.css('display', 'block');
					
				}
				else {
					oBox.m_oOptions.jNode.css('display', 'none');
				}
				oBox.m_oOptions.iAnimationTime = iTime;
				jColumn.append($('#layout-box-' + oBox.m_oOptions.sName));
			}
		}
		$(gThis).children('.layout-box:not(.boxes-options)').appendTo(gThis.m_jClosedBoxes).css('display', 'none');
		gThis.RefreshPositions();
	};
	
	gThis._InitializeEvents = function() {
		$(window).resize(gThis.OnResize).resize();
		$(gThis).children('.layout-column').sortable({
			connectWith: '.layout-column',
			revert: 100,
			items: '.layout-box:not(.layout-box-option-fixed-true)',
			placeholder: 'layout-box-place',
			opacity: 0.8,
			cancel: '.layout-box-content',
			//tolerance: 'pointer',
			cursor: 'move',
			start: gThis.OnStartDrag,
			stop: gThis.OnStopDrag,
			sort: gThis.OnSort,
			delay: 200,
			zIndex: 1000
		});
		$(gThis).bind('distributionChanged', gThis.OnDistributionChanged);
		$(gThis).bind('positionsChanged', gThis.OnPositionsChanged);
	};
	
	gThis.OnDistributionChanged = GEventHandler(function(eEvent) {
		setTimeout(function() {
			gThis.RefreshPositions();
			gThis.SaveDistribution();
		}, 50);
	});
	
	gThis.OnPositionsChanged = GEventHandler(function(eEvent) {
		gThis.RefreshPositions();
	});
	
	gThis.OnSort = function(eEvent, oUI) {
		gThis.RefreshPositions();
		return true;
	};
	
	gThis.OnStartDrag = function(eEvent, oUI) {
		gThis.m_bInvalidPlace = false;
		var jSourceSortable = $(oUI.item).closest('.ui-sortable');
		$(oUI.item).data('bDontCollapse', true).data('iPreviousZIndex', jSourceSortable.css('z-index')).data('jSourceSortable', jSourceSortable);
		jSourceSortable.css('z-index', 150);
		gThis.m_iCurrentlySortedOriginalSpan = $(oUI.item).data('iSpan');
		gThis.m_iCurrentlySortedSpan = gThis.m_iCurrentlySortedOriginalSpan;
	};
	
	gThis.OnStopDrag = function(eEvent, oUI) {
		$(oUI.item).data('bDontCollapse', false);
		$(oUI.item).data('jSourceSortable').css('z-index', $(oUI.item).data('iPreviousZIndex'));
		$(oUI.item).css('top', 0);
		if (gThis.m_bInvalidPlace) {
			setTimeout(function() {
				gThis.RefreshPositions();
				$(window).resize();
				gThis.SaveDistribution();
			}, 50);
			return false;
		}
		if (isNaN(gThis.m_iCurrentlySortedSpan)) {
			gThis.m_iCurrentlySortedSpan = 1;
		}
		$(oUI.item).data('iSpan', gThis.m_iCurrentlySortedSpan);
		setTimeout(function() {
			gThis.RefreshPositions();
			$(window).resize();
			gThis.SaveDistribution();
		}, 50);
		return true;
	};
	
	gThis.RefreshPositions = function() {
		gThis.m_bInvalidPlace = false;
		$(gThis).find('.layout-box:not(.ui-sortable-helper), .layout-box-place').css('margin-top', 0);
		$(gThis).find('.layout-box:not(.ui-sortable-helper), .layout-box-place').css('width', 'auto');
		var jColumns = $(gThis).children('.layout-column');
		for (var i = 0; i < gThis.m_iColumns; i++) {
			var iColumnWidth = jColumns.eq(i).width();
			var jBoxes = jColumns.eq(i).children('.layout-box:not(.ui-sortable-helper), .layout-box-place');
			var iBoxes = jBoxes.length;
			for (var j = 0; j < iBoxes; j++) {
				var jBox = jBoxes.eq(j);
				if (jBox.is('.layout-box')) {
					var iSpan = jBox.data('iSpan');
				}
				else {
					if (jBox.is('.layout-box-place')) {
						jBox.removeClass('layout-box-place-invalid');
					}
					var iSpan = gThis.m_iCurrentlySortedOriginalSpan;
					gThis.m_iCurrentlySortedSpan = iSpan;
				}
				if (iSpan == undefined) {
					iSpan = 1;
				}
				var iXBorder = iColumnWidth - jBox.width();
				var iYBorder = jBox.outerHeight() - jBox.height();
				var iWidth = iColumnWidth;
				for (var k = i + 1; k < i + iSpan; k++) {
					if (k >= gThis.m_iColumns) {
						if (jBox.is('.layout-box-place')) {
							var sName = $(gThis).find('.ui-sortable-helper').attr('id');
							if (sName != undefined) {
								var oBox = gThis.m_oBoxes[sName.substr('layout-box-'.length)];
								if (!oBox.m_oOptions.bExpandable) {
									gThis.m_bInvalidPlace = true;
									jBox.addClass('layout-box-place-invalid');
								}
								else {
									gThis.m_iCurrentlySortedSpan = k - i;
									iSpan = k - i;
								}
							}
							else {
								gThis.m_iCurrentlySortedSpan = k - i;
								iSpan = k - i;
							}
						}
						break;
					}
					iWidth += jColumns.eq(k).width() + gThis.m_oOptions.iSpace;
				}
				jBox.css('width', iWidth - iXBorder);
				var iY1Min = jBox.offset().top - gThis.m_iOffsetTop;
				var iY1Max = iY1Min + jBox.height() + iYBorder + gThis.m_oOptions.iSpace;
				for (var k = i + 1; k < i + iSpan; k++) {
					var jRelatedBoxes = jColumns.eq(k).children('.layout-box:not(.ui-sortable-helper), .layout-box-place');
					var iRelatedBoxes = jRelatedBoxes.length;
					iY3Max = 0;
					for (var l = 0; l < iRelatedBoxes; l++) {
						var jRelatedBox = jRelatedBoxes.eq(l);
						var iY2Min = jRelatedBox.offset().top - gThis.m_iOffsetTop;
						var iY2Max = iY2Min + jRelatedBox.height() + iYBorder + gThis.m_oOptions.iSpace;
						if ((iY2Max > iY1Min) && (iY2Min < iY1Max)) {
							jRelatedBox.css('margin-top', iY1Max - iY3Max);
						}
						iY3Max = iY2Max - gThis.m_oOptions.iSpace;
					}
				}
			}
		}
		for (var i = 0; i < gThis.m_iColumns; i++) {
			if (gThis.m_aasBoxesDistribution[i] == undefined) {
				continue;
			}
			var iBoxes = GCore.ObjectLength(gThis.m_aasBoxesDistribution[i]);
			for (var j = 0; j < iBoxes; j++) {
				var oBoxOptions = gThis.m_aasBoxesDistribution[i][j];
				var oBox = gThis.m_oBoxes[oBoxOptions.sName];
				oBox.m_oOptions.jNode.triggerHandler('distributed');
			}
		}
	};
	
	gThis.RefreshDistribution = function() {
		var jColumns = $(gThis).children('.layout-column');
		for (var i = 0; i < gThis.m_iColumns; i++) {
			gThis.m_aasBoxesDistribution[i] = [];
			var jBoxes = jColumns.eq(i).children('.layout-box');
			var iBoxes = jBoxes.length;
			for (var j = 0; j < iBoxes; j++) {
				var jBox = jBoxes.eq(j);
				var sName = jBox.attr('id').substr("layout-box-".length);
				gThis.m_oBoxes[sName].p_oPosition.c = i;
				gThis.m_oBoxes[sName].p_oPosition.r = j;
				if (isNaN(jBox.data('iSpan'))) {
					jBox.data('iSpan', 1);
				}
				gThis.m_oBoxes[sName].m_iSpan = jBox.data('iSpan');
				gThis.m_aasBoxesDistribution[i].push({
					sName: sName,
					iSpan: gThis.m_oBoxes[sName].m_iSpan,
					bCollapsed: gThis.m_oBoxes[sName].m_bCollapsed,
					bClosed: gThis.m_oBoxes[sName].m_bClosed
				});
			}
		}
	};
	
	gThis.SaveDistribution = function() {
		gThis.RefreshDistribution();
		if (gThis.m_bDontSave) {
			return;
		}
		$.cookie(GLayoutBoxes.COOKIE_NAME_DISTRIBUTION + GCore.CONTROLLER, JSON.stringify(gThis.m_aasBoxesDistribution), {expires: GCore.COOKIE_LIFETIME});
	};
	
	gThis.OnResize = GEventHandler(function(eEvent) {
		gThis.m_iOffsetTop = $(gThis).offset().top;
		gThis._UpdateColumnWidths();
		gThis.RefreshPositions();
	});
	
	gThis._UpdateColumnWidths = function() {
		var jColumns = $(gThis).children('.layout-column');
		var iWidthRemaining = $(gThis).css('width', 'auto').width();
		if (gThis.m_oOptions.iMinWidth > iWidthRemaining) {
			iWidthRemaining = gThis.m_oOptions.iMinWidth;
		}
		$(gThis).width(iWidthRemaining);
		iWidthRemaining += gThis.m_oOptions.iSpace;
		var iAutoWidthColumns = 0;
		for (var i = 0; i < gThis.m_iColumns; i++) {
			var oColumn = gThis.m_oOptions.aoColumns[i];
			if (oColumn.m_oOptions.iWidth == GLayoutColumn.WIDTH_AUTO) {
				iAutoWidthColumns++;
				continue;
			}
			iWidthRemaining -= gThis.m_oOptions.iSpace + oColumn.m_oOptions.iWidth;
		}
		var iAutoWidth = Math.floor((iWidthRemaining - (iAutoWidthColumns) * gThis.m_oOptions.iSpace) / iAutoWidthColumns);
		for (var i = 0; i < gThis.m_iColumns; i++) {
			if (gThis.m_oOptions.aoColumns[i].m_oOptions.iWidth == GLayoutColumn.WIDTH_AUTO) {
				jColumns.eq(i).width(iAutoWidth);
			}
			else {
				jColumns.eq(i).width(gThis.m_oOptions.aoColumns[i].m_oOptions.iWidth);
			}
			if (i > 0) {
				jColumns.eq(i).css('margin-left', gThis.m_oOptions.iSpace);
			}
			else {
				jColumns.eq(i).css('margin-left', 0);
			}
		}
	};
	
	gThis._Constructor();
	
};

GLayoutBoxes.COOKIE_NAME_DISTRIBUTION = 'layout-distribution-';
GLayoutBoxes.COOKIE_NAME_HASHCODE = 'layout-hashcode-';

new GPlugin('GLayoutBoxes', oDefaults, GLayoutBoxes);

GLayoutBoxes.Language = {
	display_options: 'Opcje',
	available_boxes: 'Dostępne boksy',
	restore_layout: 'Przywróć domyślny układ'
};


/*
* BOTTOM TABS
*/

var GLayoutBoxBottomTabs = function(oOptions) {
	
	var gThis = this;
	gThis.m_oOptions = $.extend(true, GCore.Duplicate(GLayoutBoxBottomTabs.DEFAULTS, true), oOptions);
	
	gThis.m_jTabs;
	gThis.m_jTabsUl;
	gThis.m_iTabsWidth;
	
	gThis._Constructor = function() {
		var jTabs = gThis.m_oOptions.jNode.find('.bottom-tabs').find('a');
		var iTabs = jTabs.length;
		var iSelected = 0;
		var iTotalWidth = 0;
		for (var i = 0; i < iTabs; i++) {
			jTabs.eq(i).css({
				width: jTabs.eq(i).outerWidth(),
				paddingLeft: 0,
				paddingRight: 0
			});
			iTotalWidth += jTabs.eq(i).closest('li').outerWidth();
			var oParams = gThis.m_oOptions.oLayoutBox.m_oOptions.oLayoutBoxes._GetParamsFromHref(jTabs.eq(i).attr('href'), gThis.m_oOptions.oLayoutBox.m_oOptions.sName);
			if (oParams == undefined) {
				continue;
			}
			if (oParams['category'] == gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHash.category) {
				iSelected = i;
			}
		}
		gThis.m_jTabs = gThis.m_oOptions.jNode.find('.bottom-tabs').tabs({
			select: gThis._OnTabSelect,
			show: gThis._OnTabLoad,
			selected: -1
		});
		gThis.m_oOptions.jNode.bind('boxParamsChange', gThis._OnParamsChange);
		gThis.m_jTabs.tabs('select', iSelected);
		gThis.m_jTabsUl = gThis.m_jTabs.children('ul');
		gThis.m_jTabsUl.css('width', iTotalWidth - 1);
		gThis.m_jTabsUl.children('li:last').css('margin-right', -1);
		gThis.m_iTabsWidth = gThis.m_jTabsUl.width();
		gThis.m_jTabs.mousemove(gThis._OnMouseMove).mouseleave(gThis._OnMouseOut);
		gThis.m_oOptions.jNode.bind('resize', GEventHandler(function(eEvent) {
			gThis.ResetTabsPosition();
		}));
		gThis.ResetTabsPosition();
	};
	
	gThis._OnMouseMove = GEventHandler(function(eEvent) {
		gThis.m_jTabsUl.stop(true, true).css({
			left: Math.min(0, Math.max(- (gThis.m_iTabsWidth - gThis.m_jTabs.width()), - (((eEvent.pageX - gThis.m_jTabs.offset().left) / gThis.m_jTabs.width() * 1.3 - 0.15) * (gThis.m_iTabsWidth - gThis.m_jTabs.width()))))
		});
	});
	
	gThis._OnMouseOut = GEventHandler(function(eEvent) {
		gThis.ResetTabsPosition();
	});
	
	gThis.ResetTabsPosition = function() {
		if (!gThis.m_jTabsUl.children('.ui-state-active').length) {
			return;
		}
		gThis.m_jTabsUl.stop(true, true).animate({
			left: Math.min(0, Math.max(- (gThis.m_iTabsWidth - gThis.m_jTabs.width()), - (gThis.m_jTabsUl.children('.ui-state-active').offset().left - gThis.m_jTabsUl.offset().left - (gThis.m_jTabs.width() - gThis.m_jTabsUl.children('.ui-state-active').width()) / 2))),
			duration: 750
		});
	};
	
	gThis._OnTabSelect = function(eEvent, oUi) {
		var sUrl = $.data(oUi.tab, 'load.tabs');
		gThis.m_oOptions.oLayoutBox.ParseLink(sUrl);
		$.data(oUi.tab, 'url', sUrl);
		gThis.m_jTabs.tabs('url', oUi.index, '');
		return true;
	};
	
	gThis._OnTabLoad = function(eEvent, oUi) {
		gThis.m_jTabs.tabs('url', oUi.index, $.data(oUi.tab, 'url'));
		return true;
	};
	
	gThis._Constructor();
	
};

GLayoutBoxBottomTabs.DEFAULTS = {
	jNode: GCore.NULL,
	oLayoutBox: GCore.NULL
};


/*
* CATEGORY MENU
*/

var GLayoutBoxTypeCategorymenu = function(oOptions) {
	
	var gThis = this;
	gThis.m_oOptions = $.extend(true, GCore.Duplicate(GLayoutBoxTypeCategorymenu.DEFAULTS, true), oOptions);
	
	gThis.m_jProductList;
	
	gThis._Constructor = function() {
		var jSubmenus = gThis.m_oOptions.jNode.find('.submenu');
		var iSubmenus = jSubmenus.length;
		if (!iSubmenus) {
			return;
		}
		for (var i = 0; i < iSubmenus; i++) {
			gThis._PrepareSubmenu(jSubmenus.eq(i));
		}
	};
	
	gThis._PrepareSubmenu = function(jSubmenu) {
		var jItems = jSubmenu.find('li');
		var iItems = jItems.length;
		if (iItems <= gThis.m_oOptions.iSubmenuItemsThreshold) {
			return;
		}
		var iColumns = Math.ceil(iItems / gThis.m_oOptions.iSubmenuItemsThreshold);
		jSubmenu.css({
			width: iColumns * gThis.m_oOptions.iColumnWidth + 2,
			'margin-right': - iColumns * gThis.m_oOptions.iColumnWidth + 12
		});
		for (var i = 1; i < iColumns; i++) {
			var jUl = $('<ul/>');
			jUl.append(jItems.filter(':gt(' + (i * gThis.m_oOptions.iSubmenuItemsThreshold - 1) + '):lt(' + ((i + 1) * gThis.m_oOptions.iSubmenuItemsThreshold + 1) + ')'));
			jSubmenu.children('.submenu-wrapper').append(jUl);
		}
		jSubmenu.find('ul').css({
			width: gThis.m_oOptions.iColumnWidth,
			display: 'inline',
			float: 'left'
		});
	};
	
	gThis._Constructor();
	
};

GLayoutBoxTypeCategorymenu.DEFAULTS = {
	jNode: GCore.NULL,
	oLayoutBox: GCore.NULL,
	iSubmenuItemsThreshold: 20,
	iColumnWidth: 200
};


/*
* PRODUCT LIST BOX
*/

var GLayoutBoxTypeProductList = function(oOptions) {
	
	var gThis = this;
	gThis.m_oOptions = $.extend(true, GCore.Duplicate(GLayoutBoxTypeProductList.DEFAULTS, true), oOptions);
	
	gThis.m_jProductList;
	gThis.m_iPage = 1;
	gThis.m_iPagesTotal = 1;
	gThis.m_jPagination;
	
	gThis._Constructor = function() {
		gThis.m_oOptions.oLayoutBox.SetWidthClasses([100, 300]);
		gThis.m_jProductList = gThis.m_oOptions.jNode.find('ul.product-list');
		gThis.m_jPagination = gThis.m_oOptions.jNode.find('.pagination');
		gThis.m_jFilter = gThis.m_oOptions.jNode.find('.filter');
		gThis.m_jFilter.hide();
		gThis.m_iPagesTotal = parseInt(gThis.m_jPagination.find('.next').prev().text());
		gThis.m_iPage = parseInt(gThis.m_jPagination.find('.active').text());
		gThis._InitializeEvents();
		
		gThis.m_jLink = $('<a>').attr('href','#').text('').addClass('filterlink');
		if(gThis.m_oOptions.jNode.find('.filter').attr('id')){
			gThis.m_oOptions.jNode.find('.layout-box-icons').append(gThis.m_jLink);
			gThis.m_jLink.click(function(){
				gThis.m_jFilter.slideToggle('slow');
				return false;
			});

		}
		
		var oParams = gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHash;
		if(oParams.params != undefined){
			$.each(oParams.params, function(index,value) {
				gThis.m_jFilter.find('#'+index).val(value);
			});
			gThis.m_jFilter.slideToggle('slow');
			gThis.m_iPage = oParams.page;
			gThis.m_jFilter.find('form').submit();
		}
		if ((oParams.page != undefined) && (!isNaN(oParams.page))) {
			gThis.GoToPage(oParams.page);
		}
	};
	
	gThis._OnParamsChange = GEventHandler(function(eEvent) {
		
		gThis.m_iPage = parseInt(gThis.m_jPagination.find('.active').text());
		var oParams = gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHash;
		
		if ((oParams.page != undefined) && (!isNaN(oParams.page))) {
			
			if(gThis.m_iPage != oParams.page){
				gThis.m_iPage = oParams.page;
				gThis._UpdateIndicators();
				gThis.LoadPage();
			}
		}
	});
	
	gThis._UpdateIndicators = function() {
		gThis.m_jPagination.find('li').removeClass('active').eq(gThis.m_iPage).addClass('active');
		if (gThis.m_iPage == 1) {
			gThis.m_jPagination.find('li.previous').addClass('disabled');
		}
		else {
			gThis.m_jPagination.find('li.previous').removeClass('disabled');
		}
		if (gThis.m_iPage >= gThis.m_iPagesTotal) {
			gThis.m_jPagination.find('li.next').addClass('disabled');
		}
		else {
			gThis.m_jPagination.find('li.next').removeClass('disabled');
		}
	};
	
	gThis.ChangeFilter = GEventHandler(function(eEvent) {
		gThis.ao_FilterParams = {};
		var form = $('.filter #form').serializeArray();
		$.each(form, function(index,value) {
			gThis.ao_FilterParams[value.name] = value.value;
		});

		gThis.m_oOptions.oLayoutBox.ChangeParams({
			page: gThis.m_iPage,
			params: gThis.ao_FilterParams
		});
		gThis.m_oOptions.jNode.triggerHandler('pageChange');
		return false;
	});
	
	
	gThis._OnPageChange = GEventHandler(function(eEvent) {
		gThis.LoadPage();
	});
	
	gThis.LoadPage = function() {
		gThis.ao_FilterParams = {};
		var form = gThis.m_jFilter.find('form').serializeArray();
		$.each(form, function(index,value) {
			gThis.ao_FilterParams[value.name] = value.value;
		});
		gThis.m_jProductList.GLoading();
		window['xajax_GetProductsForList_' + gThis.m_oOptions.oLayoutBox.m_oOptions.sName]({
			page: gThis.m_iPage,
			params: gThis.ao_FilterParams
		}, GCallback(gThis._OnPageLoad));
	};
	
	gThis.GoToPage = function(iPage) {
		iPage = Math.max(1, Math.min(gThis.m_iPagesTotal, iPage));
		if (gThis.m_iPage == iPage) {
			return;
		}
		gThis.ao_FilterParams = {};
		var form = gThis.m_jFilter.find('form').serializeArray();
		$.each(form, function(index,value) {
			gThis.ao_FilterParams[value.name] = value.value;
		});
		gThis.m_iPage = iPage;
		gThis._UpdateIndicators();
		gThis.m_oOptions.oLayoutBox.ChangeParams({
			page: gThis.m_iPage,
			params: gThis.ao_FilterParams
		});
		gThis.m_oOptions.jNode.triggerHandler('pageChange');
	};
	
	gThis.GoToPrevious = GEventHandler(function(eEvent) {
		gThis.GoToPage(gThis.m_iPage - 1);
		return false;
	});
	
	gThis.GoToNext = GEventHandler(function(eEvent) {
		gThis.GoToPage(gThis.m_iPage + 1);
		return false;
	});
	
	gThis._OnPageLoad = GEventHandler(function(eEvent) {
		gThis.m_jProductList.empty();
		gThis.m_jProductList.append(eEvent.products);
		if (eEvent.pagination != undefined){
			gThis.m_jPagination.empty();
			gThis.m_jPagination.append(eEvent.pagination);
		}
		GLoading.Stop(gThis.m_jProductList);
	});
	
	gThis.GoToPrevious = GEventHandler(function(eEvent) {
		gThis.GoToPage(gThis.m_iPage - 1);
		return false;
	});
	
	gThis.GoToNext = GEventHandler(function(eEvent) {
		gThis.GoToPage(gThis.m_iPage + 1);
		return false;
	});
	
	gThis._InitializeEvents = function() {
		var id = gThis.m_oOptions.jNode.attr('id');
		gThis.m_oOptions.jNode.bind('boxParamsChange', gThis._OnParamsChange);
		gThis.m_oOptions.jNode.bind('pageChange', gThis._OnPageChange);
		$('#'+ id + ' .pagination .previous a').live('click',gThis.GoToPrevious);
		$('#'+ id + ' .pagination .next a').live('click',gThis.GoToNext);
		$('#' + id + ' .pagination a[href*=",p="]').live('click',function(){
			gThis.GoToPage($(this).attr('id'));
			return false;
		});
		gThis.m_jFilter.find('input,select').change(gThis.ChangeFilter);
		gThis.m_jFilter.find('form').submit(gThis.ChangeFilter);
	};
	
	gThis._Constructor();
	
};

GLayoutBoxTypeProductList.DEFAULTS = {
	jNode: GCore.NULL,
	oLayoutBox: GCore.NULL
};


/*
* SHOWCASE BOX
*/

var GLayoutBoxTypeShowcase = function(oOptions) {
	
	var gThis = this;
	gThis.m_oOptions = $.extend(true, GCore.Duplicate(GLayoutBoxTypeShowcase.DEFAULTS, true), oOptions);
	
	gThis.m_sCategory = '';
	gThis.m_jCarousel;
	gThis.m_iCurrentItem = 0;
	gThis.m_bFirstLoad = true;
	
	gThis._Constructor = function() {
		gThis.m_oOptions.oLayoutBox.SetWidthClasses([450]);
		gThis.m_jCarousel = gThis.m_oOptions.jNode.find('.carousel > ul');
		GLayoutBoxBottomTabs.apply(gThis, [{
			jNode: gThis.m_oOptions.jNode,
			oLayoutBox: gThis.m_oOptions.oLayoutBox
		}]);
		gThis.m_oOptions.jNode.bind('resize', GEventHandler(function(eEvent) {
			gThis._InitializeCarousel();
		}));
		gThis._InitializeCarousel();
	};
	
	gThis._OnParamsChange = GEventHandler(function(eEvent) {
		if (gThis.m_jTabs.tabs('option', 'selected') != gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHash.category) {
			if (gThis.m_bFirstLoad) {
				gThis.m_bFirstLoad = false;
				if ((gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHref.category == gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHash.category) || (gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHash.category == 'all')) {
					return;
				}
			}
			gThis.ChangeCategory(gThis.m_oOptions.oLayoutBox.m_oOptions.oParamsFromHash.category);
		}
	});
	
	gThis.ChangeCategory = function(sCategory) {
		gThis.m_sCategory = (sCategory == 'all') ? '' : sCategory;
		gThis.m_jCarousel.parent().stop(true, true).animate({
			opacity: .5,
			duration: 250
		});
		window['xajax_GetProductsForSchowcase_' + gThis.m_oOptions.oLayoutBox.m_oOptions.sName]({
			category: gThis.m_sCategory
		}, GCallback(function(eEvent) {
			gThis.m_jCarousel.parent().stop(true, true).animate({
				opacity: 0,
				duration: 150
			}, function() {
				gThis.m_iCurrentItem = 0;
				gThis.m_jCarousel.empty().css('left', 0);
				gThis.m_jCarousel.append(eEvent.products);
				gThis.m_jCarousel.parent().animate({
					opacity: 1,
					duration: 250
				});
				gThis._InitializeCarousel();
			});
		}));
	};
	
	gThis._InitializeCarousel = function() {
		var iItemWidth = gThis.m_jCarousel.parent().width();
		gThis.m_jCarousel.children('li').css('width', iItemWidth);
		gThis.m_jCarousel.css('width', iItemWidth * gThis.m_jCarousel.children('li').length);
		gThis.m_oOptions.jNode.find('.controls a.previous').unbind('click', gThis.GoToPreviousItem).click(gThis.GoToPreviousItem);
		gThis.m_oOptions.jNode.find('.controls a.next').unbind('click', gThis.GoToNextItem).click(gThis.GoToNextItem);
		gThis._UpdateCarousel();
	};
	
	gThis.GoToNextItem = GEventHandler(function(eEvent) {
		gThis.m_iCurrentItem++;
		gThis.m_iCurrentItem = Math.min(gThis.m_iCurrentItem, gThis.m_jCarousel.children('li').length - 1);
		gThis._UpdateCarousel();
		return false;
	});
	
	gThis.GoToPreviousItem = GEventHandler(function(eEvent) {
		gThis.m_iCurrentItem--;
		gThis.m_iCurrentItem = Math.max(gThis.m_iCurrentItem, 0);
		gThis._UpdateCarousel();
		return false;
	});
	
	gThis._UpdateCarousel = function() {
		gThis.m_jCarousel.stop(true, true).animate({
			left: - gThis.m_iCurrentItem * gThis.m_jCarousel.children('li:first').width(),
			duration: 250
		});
		if (gThis.m_iCurrentItem == 0) {
			gThis.m_oOptions.jNode.find('.controls .previous').css({
				opacity: .3,
				cursor: 'default'
			});
		}
		else {
			gThis.m_oOptions.jNode.find('.controls .previous').css({
				opacity: 1,
				cursor: 'pointer'
			});
		}
		if (gThis.m_iCurrentItem >= gThis.m_jCarousel.children('li').length - 1) {
			gThis.m_oOptions.jNode.find('.controls .next').css({
				opacity: .3,
				cursor: 'default'
			});
		}
		else {
			gThis.m_oOptions.jNode.find('.controls .next').css({
				opacity: 1,
				cursor: 'pointer'
			});
		}
	};
	
	gThis._Constructor();
	
};

GLayoutBoxTypeShowcase.DEFAULTS = {
	jNode: GCore.NULL,
	oLayoutBox: GCore.NULL
};

/*
* BLOCK
* Adds rounded corners to a block.
*/

var oDefaults = {
	oClasses: {
		sNE: 'beginning-r',
		sNW: 'beginning-l',
		sSE: 'ending-r',
		sSW: 'ending-l'
	}
};

var GBlock = function() {
	
	var gThis = this;
	
	this._Constructor = function() {
		$(gThis).prepend('<div class="' + gThis.m_oOptions.oClasses.sNE + '"/>');
		$(gThis).prepend('<div class="' + gThis.m_oOptions.oClasses.sNW + '"/>');
		$(gThis).append('<div class="' + gThis.m_oOptions.oClasses.sSE + '"/>');
		$(gThis).append('<div class="' + gThis.m_oOptions.oClasses.sSW + '"/>');
	};
	
	gThis._Constructor();
	
};

new GPlugin('GBlock', oDefaults, GBlock);

/*
* TABS
*/

var oDefaults = {
	oClasses: {
		sBlockClass: 'block',
		sButtonClass: 'button',
		sButtonImageRightClass: 'right',
		sNavigationClass: 'navigation',
		sPreviousClass: 'previous',
		sNextClass: 'next',
		sInputWithImageClass: 'with-image',
		sActionsClass: 'actions',
		sTabbedClass: 'tabbed',
		sTabbedHorizontalClass: 'tabbed-horizontal'
	},
	oImages: {
		sArrowLeftGray: '_images_panel/icons/buttons/arrow-left-gray.png',
		sArrowRightGreen: '_images_panel/icons/buttons/arrow-right-green.png',
		sSave: '_images_panel/icons/buttons/check.png'
	},
	iType: 0
};

var GTabs = function() {
	
	var gThis = this;
	
	this._Constructor = function() {
		gThis._PrepareDOM();
	};
	
	gThis._PrepareDOM = function() {
		var jPanels = $(gThis).children('fieldset');
		if (!jPanels.length) {
			return;
		}
		if (gThis.m_oOptions.iType == GTabs.TABS_HORIZONTAL) {
			$(gThis).addClass(gThis._GetClass('TabbedHorizontal'));
		}
		else {
			$(gThis).addClass(gThis._GetClass('Tabbed'));
		}
		var jTabs = $('<ul class="form-navigation"/>');
		var sLastId = '';
		for (var i = 0; i < jPanels.length; i++) {
			var jPanel = jPanels.eq(i);
			var sId = jPanel.attr('id');
			if (!sId.length) {
				sId = 'GTabs-auto-panel-' + GTabs.s_iId++;
			}
			jPanel.attr('id', '');
			var jWrapper = $('<div/>').attr('id', sId).addClass(gThis._GetClass('Block'));
			jPanel.replaceWith(jWrapper);
			jWrapper.append(jPanel);
			jWrapper.GBlock();
			jTabs.append('<li><a href="#' + sId + '">' + jPanel.find('legend span').eq(0).text() + '</a></li>');
			var jNavigation = $('<ul class="' + gThis._GetClass('Navigation') + '"/>');
			if (i > 0) {
				jNavigation.append('<li class="' + gThis._GetClass('Previous') + '"><a tabindex="-1" class="' + gThis._GetClass('Button') + '" href="#previous-tab"><span><img src="' + gThis._GetImage('ArrowLeftGray') + '" alt=""/>' + GForm.Language.previous + '</span></a></li>');
			}
			if (i < jPanels.length - 1) {
				var sNextId = jPanels.eq(i + 1).attr('id');
				if (!sNextId.length) {
					sNextId = 'GTabs-auto-panel-' + GTabs.s_iId;
				}
				jNavigation.append('<li class="' + gThis._GetClass('Next') + '"><a tabindex="-1" class="' + gThis._GetClass('Button') + '" href="#next-tab"><span><img class="' + gThis._GetClass('ButtonImageRight') + '" src="' + gThis._GetImage('ArrowRightGreen') + '" alt=""/>' + GForm.Language.next + '</span></a></li>');
			}
			else if ($(gThis).is('form')) {
				jNavigation.append('<li class="' + gThis._GetClass('Next') + '"><span class="' + gThis._GetClass('Button') + '"><span><img class="' + gThis._GetClass('ButtonImageRight') + '" src="' + gThis._GetImage('Save') + '" alt=""/><input type="submit" class="' + gThis._GetClass('InputWithImage') + '" value="' + GForm.Language.save + '"/></span></span></li>');
			}
			jPanel.append(jNavigation);
			sLastId = sId;
		}
		$(gThis).prepend(jTabs).tabs();
		var jAs = $(gThis).find('.navigation a');
		for (i = 0; i < jAs.length; i++) {
			jAs.eq(i).click(function() {
				$(gThis).tabs('select', $(this).attr('href'));
				return false;
			});
		}
		$(gThis).bind('tabsshow', function(eEvent, oUI) {
			$(oUI.panel).children('fieldset').triggerHandler('GFormShow');
		});
		gThis._SolveAllProblems();
		gThis._InitializeTabsEvents();
	};
	
	gThis._InitializeTabsEvents = function() {
		$('a[href="#previous-tab"]').bind('click', GEventHandler(function(eEvent) {
			var jPanel = $(eEvent.currentTarget).closest('.ui-tabs-panel');
			do {
				jPanel = jPanel.prev();
				if (!jPanel.length) {
					return false;
				}
			} while (jPanel.children('fieldset').css('display') == 'none');
			$(gThis).tabs('select', '#' + jPanel.attr('id'));
			eEvent.stopImmediatePropagation();
			return false;
		}));
		$('a[href="#next-tab"]').bind('click', GEventHandler(function(eEvent) {
			var jPanel = $(eEvent.currentTarget).closest('.ui-tabs-panel');
			do {
				jPanel = jPanel.next();
				if (!jPanel.length) {
					return false;
				}
			} while (jPanel.children('fieldset').css('display') == 'none');
			$(gThis).tabs('select', '#' + jPanel.attr('id'));
			eEvent.stopImmediatePropagation();
			return false;
		}));
	};
	
	gThis._SolveAllProblems = function() {
		$(gThis).css({
			opacity: 0,
			height: 0,
			overflow: 'hidden'
		}).tabs('add', '#a', '', 1).tabs('select', 1);
		setTimeout(function() {
			setTimeout(function() {
				setTimeout(function() {
					$(gThis).tabs('select', 0).tabs('remove', 1).wrap('<div style="clear: both;"/>').css('height', 'auto');
					$(gThis).parent().css('display', 'none').slideDown(350);
					$(gThis).css({
						opacity: 1,
						overflow: 'visible'
					});
				}, 10);
			}, 10);
		}, 10);
	};
	
	gThis._Constructor();
	
};

GTabs.TABS_VERTICAL = 0;
GTabs.TABS_HORIZONTAL = 1;

GTabs.s_iId = 0;

new GPlugin('GTabs', oDefaults, GTabs);

/*
* DEPENDENCIES
*/

var GFormDependency = function(sType, sFieldSource, mCondition, mArgument) {
	
	var gThis = this;
	
	gThis.m_iId;
	gThis.m_sType = sType;
	gThis.m_gForm;
	gThis.m_sFieldSource = sFieldSource;
	gThis.m_sFieldTarget;
	gThis.m_mArgument = mArgument;
	if (mCondition instanceof GFormCondition) {
		gThis.m_gCondition = mCondition;
	}
	else if (mCondition instanceof Function) {
		gThis.m_fSource = mCondition;
	}
	
	gThis.Constructor = function(gForm, sFieldTarget) {
		gThis.m_iId = GFormDependency.s_iNextId++;
		gThis.m_gForm = gForm;
		gThis.m_sFieldTarget = sFieldTarget;
		gThis._InitializeEvents();
	};
	
	gThis._InitializeEvents = function() {
		var gFieldTarget = gThis.m_gForm.GetField(gThis.m_sFieldTarget);
		var fHandler;
		switch (gThis.m_sType) {
			case GFormDependency.HIDE:
				fHandler = gThis.EvaluateHide;
				break;
			case GFormDependency.SHOW:
				fHandler = gThis.EvaluateShow;
				break;
			case GFormDependency.IGNORE:
				fHandler = gThis.EvaluateIgnore;
				break;
			case GFormDependency.SUGGEST:
				fHandler = gThis.EvaluateSuggest;
				break;
			case GFormDependency.INVOKE_CUSTOM_FUNCTION:
				fHandler = gThis.EvaluateInvoke;
				break;
			case GFormDependency.EXCHANGE_OPTIONS:
				fHandler = gThis.EvaluateExchangeOptions;
				break;
			default:
				return;
		}
		var bAlreadyInitialised = false;
		if (!gFieldTarget.m_oInitializedDependencies[gThis.m_iId]) {
			var gField = gThis.m_gForm.GetField(gThis.m_sFieldSource);
			gField.BindChangeHandler(fHandler, {
				gNode: gField
			});
			gField.m_afDependencyTriggers.push(fHandler);
			gFieldTarget.m_oInitializedDependencies[gThis.m_iId] = true;
			bAlreadyInitialised = true;
		}
		if (!bAlreadyInitialised || (gThis.m_sType != GFormDependency.EXCHANGE_OPTIONS)) {
			fHandler.apply(gThis.m_gForm.GetField(gThis.m_sFieldSource).m_jField);
		}
	};
	
	gThis.EvaluateShow = function(eEvent) {
		var gCurrentField, gDependentField;
		if (eEvent == undefined) {
			eEvent = {data: {gNode: $(this).closest('.GFormNode').get(0).gNode}};
		}
		gCurrentField = eEvent.data.gNode;
		gDependentField = gThis._FindFieldInCurrentRepetition(gCurrentField, gThis.m_gForm.GetField(gThis.m_sFieldTarget));
		if ((gCurrentField.m_gParent instanceof GFormFieldsetRepeatable) && (gCurrentField.m_gParent == gDependentField.m_gParent)) {
			gDependentField = gDependentField;
		}
		if (gThis.Evaluate(gCurrentField.GetValue())) {
			gDependentField.Show();
		}
		else {
			gDependentField.Hide();
		}
	};
	
	gThis.EvaluateHide = function(eEvent) {
		var gCurrentField, gDependentField;
		if (eEvent == undefined) {
			eEvent = {data: {gNode: $(this).closest('.GFormNode').get(0).gNode}};
		}
		gCurrentField = eEvent.data.gNode;
		gDependentField = gThis._FindFieldInCurrentRepetition(gCurrentField, gThis.m_gForm.GetField(gThis.m_sFieldTarget));
		if (gThis.Evaluate(gCurrentField.GetValue())) {
			gDependentField.Hide();
		}
		else {
			gDependentField.Show();
		}
	};
	
	gThis._FindFieldInCurrentRepetition = function(gCurrentField, gDependentField) {
		if ((gCurrentField.m_gParent instanceof GFormRepetition) && (gCurrentField.m_gParent.m_gParent == gDependentField.m_gParent.m_gParent)) {
			for (var i in gCurrentField.m_gParent.m_agFields) {
				var gField = gCurrentField.m_gParent.m_agFields[i];
				if (gField.m_oOptions.sName == gThis.m_sFieldTarget) {
					return gField;
				}
			}
		}
		return gDependentField;
	};
	
	gThis.EvaluateIgnore = function(eEvent) {
		var gCurrentField, gDependentField;
		if (eEvent == undefined) {
			eEvent = {data: {gNode: $(this).closest('.GFormNode').get(0).gNode}};
		}
		gCurrentField = eEvent.data.gNode;
		gDependentField = gThis._FindFieldInCurrentRepetition(gCurrentField, gThis.m_gForm.GetField(gThis.m_sFieldTarget));
		if (gThis.Evaluate(gCurrentField.GetValue())) {
			gDependentField.Ignore();
		}
		else {
			gDependentField.Unignore();
		}
	};
	
	gThis.EvaluateInvoke = function(eEvent) {
		if (eEvent == undefined) {
			eEvent = {
				data: {
					gNode: $(this).closest('.GFormNode').get(0).gNode,
					mArgument: gThis.m_mArgument
				}
			};
		}
		gThis.m_fSource({
			sValue: eEvent.data.gNode.GetValue(),
			gForm: gThis.m_gForm,
			sFieldTarget: gThis.m_sFieldTarget,
			mArgument: gThis.m_mArgument
		});
	};
	
	gThis.EvaluateSuggest = function(eEvent) {
		var gCurrentField, gDependentField;
		if (eEvent == undefined) {
			eEvent = {data: {gNode: $(this).closest('.GFormNode').get(0).gNode}};
		}
		gCurrentField = eEvent.data.gNode;
		gDependentField = gThis._FindFieldInCurrentRepetition(gCurrentField, gThis.m_gForm.GetField(gThis.m_sFieldTarget));
		gThis.m_fSource({
			value: eEvent.data.gNode.GetValue()
		}, GCallback(function(oData) {
			gDependentField.SetValue(oData.suggestion);
		}, {
			gForm: gThis.m_gForm,
			sFieldTarget: gThis.m_sFieldTarget
		}));
	};
	
	gThis.EvaluateExchangeOptions = function(eEvent) {
		if (eEvent == undefined) {
			eEvent = {
				data: {
					gNode: $(this).closest('.GFormNode').get(0).gNode,
					mArgument: gThis.m_mArgument
				}
			};
		}
		gThis.m_fSource({
			value: eEvent.data.gNode.GetValue()
		}, GCallback(function(oData) {
			oData.gForm.GetField(oData.sFieldTarget).ExchangeOptions(oData.options);
		}, {
			gForm: gThis.m_gForm,
			sFieldTarget: gThis.m_sFieldTarget
		}));
	};
	
	gThis.Evaluate = function(mValue) {
		return gThis.m_gCondition.Evaluate(mValue);
	};
	
};

GFormDependency.HIDE = 'hide';
GFormDependency.SHOW = 'show';
GFormDependency.IGNORE = 'ignore';
GFormDependency.SUGGEST = 'suggest';
GFormDependency.INVOKE_CUSTOM_FUNCTION = 'invoke';
GFormDependency.EXCHANGE_OPTIONS = 'exchangeOptions';

GFormDependency.s_iNextId = 0;


/*
* NODE
* Abstract class with base functionality used by all form nodes.
*/

var oDefaults = {
	oClasses: {
		
	}
};

var GFormNode = function(oOptions) {
	
	var gThis = this;
	
	gThis.m_jNode;
	gThis.m_gParent;
	gThis.m_gForm;
	gThis.m_sNamePrefix;
	gThis.m_bRepeatable;
	gThis.m_bIgnore = false;
	gThis.m_oInitializedDependencies = {};
	
	gThis._Constructor = function() {};
	
	gThis.Render = function() {
		gThis.m_bRepeatable = false;
		if ((gThis.m_oOptions.oRepeat != undefined) && (gThis.m_oOptions.oRepeat.iMax != undefined) && (gThis.m_oOptions.oRepeat.iMax > 1)) {
			gThis.m_bRepeatable = true;
		}
		gThis._PrepareNode();
		gThis.m_jNode.get(0).gNode = gThis;
		gThis.m_jNode.addClass('GFormNode');
		return gThis.m_jNode;
	};
	
	gThis._GetClass = function(sClassName) {
		var sClass = gThis.m_oOptions.oClasses['s' + sClassName + 'Class'];
		if (sClass == undefined) {
			return '';
		}
		else {
			return sClass;
		}
	};
	
	gThis._GetImage = function(sImageName) {
		var sImage = gThis.m_oOptions.oImages['s' + sImageName];
		if (sImage == undefined) {
			return '';
		}
		else {
			return GCore.DESIGN_PATH + sImage;
		}
	};
	
	gThis.GetName = function(sId) {
		if ((gThis.m_sNamePrefix == undefined) || (gThis.m_sNamePrefix == '')) {
			return (sId != undefined) ? gThis.m_oOptions.sName + '[' + sId + ']' : gThis.m_oOptions.sName;
		}
		var sName = gThis.m_sNamePrefix + '[' + gThis.m_oOptions.sName + ']';
		if (sId != undefined) {
			sName += '[' + sId + ']';
		}
		return sName;
	};
	
	gThis.GetId = function(sId) {
		var sName = gThis.GetName().replace(/[\[\]]+/g, '__').replace(/\_\_$/, '');
		if (sId != undefined) {
			sName += '__' + sId;
		}
		return sName;
	};
	
	gThis.Populate = function(mData) {};
	gThis.PopulateErrors = function(mData) {};
	gThis.Validate = function(bNoRequests, iRepetition) { return true; };
	
	gThis.OnInit = function() {
		gThis._Initialize();
		gThis._InitializeEvents();
		gThis._InitializeDependencies();
		gThis._InitializeRules();
	};
	
	gThis._InitializeDependencies = function() {
		if (gThis.m_oOptions.agDependencies != undefined) {
			for (var i in gThis.m_oOptions.agDependencies) {
				gThis.m_oOptions.agDependencies[i].Constructor(gThis.m_gForm, gThis.m_oOptions.sName);
			}
		}
	};
	
	gThis._InitializeRules = function() {
		if (!gThis.m_jNode) {
			return;
		}
		if (gThis.m_oOptions.aoRules != undefined) {
			for (var i = 0; i < gThis.m_oOptions.aoRules.length; i++) {
				if (gThis.m_oOptions.aoRules[i].sType == 'required') {
					gThis.m_jNode.addClass('required');
				}
			}
		}
	};
	
	gThis.OnReset = function() {};
	gThis.OnShow = function() {};
	gThis.OnHide = function() {};
	gThis.OnRemove = function() {};
	gThis.Reset = function() {};
	gThis.Focus = function() { return false; };
	
	gThis.BindChangeHandler = function(fHandler, oData) {
		return gThis.m_jNode.bind('change', oData, fHandler);
	};
	
	gThis._PrepareNode = function() {};
	gThis._Initialize = function() {};
	gThis._InitializeEvents = function() {};
	
	gThis.Ignore = function() {
		gThis.m_bIgnore = true;
	};
	
	gThis.Unignore = function() {
		gThis.m_bIgnore = false;
	};
	
	gThis.Show = function() {
		gThis.Unignore();
		gThis.m_jNode.slideDown(200);
		if (gThis.m_oOptions.sName != undefined) {
			$(gThis.m_gForm).find('.form-navigation li:has(a[href="#' + gThis.m_oOptions.sName + '"])').css('display', 'block');
		}
	};
	
	gThis.Hide = function() {
		gThis.Ignore();
		gThis.m_jNode.slideUp(150);
		if (gThis.m_oOptions.sName != undefined) {
			$(gThis.m_gForm).find('.form-navigation li:has(a[href="#' + gThis.m_oOptions.sName + '"])').css('display', 'none');
		}
	};
	
};


/*
* RULE
* Abstract class representing a form validation rule.
*/

var GFormRule = function() {};

GFormRule.Check = function(oRule, gField, bNoRequest, iRepetition) {
	if (bNoRequest == undefined) {
		bNoRequest = false;
	}
	var mValue = gField.GetValue(iRepetition);
	switch (oRule.sType) {
		
		case 'required':
			if(gField._GetField(iRepetition).find('option:selected').val() != undefined)
			{
				if(gField._GetField(iRepetition).find('option:selected').val() == 0){
					return gField.ValidationResult(false, oRule.sErrorMessage, iRepetition);
				}
			}
			else if (mValue == '') {
				return gField.ValidationResult(false, oRule.sErrorMessage, iRepetition);
			}
			return gField.ValidationResult(true, oRule.sErrorMessage, iRepetition);
		
		case 'format':
			var rRE = new RegExp(oRule.sFormat.substr(1, oRule.sFormat.length - 2));
			return gField.ValidationResult(rRE.test(mValue), oRule.sErrorMessage, iRepetition);
			
		case 'email':
			if(mValue != ''){
				return gField.ValidationResult(/^[A-Z0-9._%+-]+@[A-Z0-9.-]+\.(?:[A-Z]{2}|com|org|net|gov|mil|biz|info|mobi|name|aero|jobs|museum)$/i.test(mValue), oRule.sErrorMessage, iRepetition);
			}
			return gField.ValidationResult(true);
			
		case 'vat':
			var sValue = mValue.replace(/-/, '');
			sValue = sValue.replace(/-/, '');
			sValue = sValue.replace(/-/, '');

			if (sValue.length != 10){
	    	    return gField.ValidationResult(false, oRule.sErrorMessage, iRepetition);
       		}
 			
       		aoSteps = new Array(6, 5, 7, 2, 3, 4, 5, 6, 7);
	   	 	iSum=0;
 
	   		for (i = 0; i < 9; i++){
 
				iSum += aoSteps[i] * sValue.charAt(i);
 
		    }
 
		    iModulo = iSum % 11;
		    
    		if(iModulo == 10){
		   		iControl = 0;
			}else{
				iControl = iModulo;
			}
 
			if (iControl == sValue.charAt(9)){
			    return gField.ValidationResult(true, oRule.sErrorMessage, iRepetition);	
			}
 
		case 'compare':
			var jFieldToCompare = $('[id$="' + oRule.sFieldToCompare + '"]');
			if (!jFieldToCompare.length) {
				return gField.ValidationResult(false, oRule.sErrorMessage, iRepetition);
			}
			return gField.ValidationResult(mValue == jFieldToCompare.closest('.GFormNode').get(0).gNode.GetValue(), oRule.sErrorMessage, iRepetition);
		
		case 'unique':
			if (!bNoRequest) {
				gField.StartWaiting();
				oRule.fCheckFunction({
					value: mValue
				}, GCallback(GFormRule.ValidationResponse, {
					gField: gField,
					sErrorMessage: oRule.sErrorMessage,
					iRepetition: iRepetition
				}));
			}
			return gField.ValidationResult(true);
		
		case 'languageunique':
			if (!bNoRequest) {
				gField.StartWaiting();
				oRule.fCheckFunction({
					value: mValue,
					language: gField.m_gParent.m_oOptions.sName
				}, GCallback(GFormRule.ValidationResponse, {
					gField: gField,
					sErrorMessage: oRule.sErrorMessage,
					iRepetition: iRepetition
				}));
			}
			return gField.ValidationResult(true);
			
		case 'custom':
			var oParams = {};
			for (var sI in oRule.oParams) {
				if (sI.substr(0, 7) == '_field_') {
					oParams[sI.substr(7)] = gField.m_gForm.GetField(oRule.oParams[sI]).GetValue();
				}
				else {
					oParams[sI] = oRule.oParams[sI];
				}
			}
			if (!bNoRequest) {
				gField.StartWaiting();
				oRule.fCheckFunction({
					value: mValue,
					params: oParams
				}, GCallback(GFormRule.ValidationResponse, {
					gField: gField,
					sErrorMessage: oRule.sErrorMessage,
					iRepetition: iRepetition
				}));
			}
			return gField.ValidationResult(true);
		
	}
	return gField.ValidationResult(false);
};

GFormRule.ValidationResponse = function(oData) {
	oData.gField.StopWaiting();
	oData.gField.ValidationResult(oData.unique, oData.sErrorMessage, oData.iRepetition);
};

/*
* CONTAINER
*/

var oDefaults = {
	sName: '',
	oClasses: {
		sRepetitionClass: 'GFormRepetition',
		sAddButtonClass: 'add-repetition',
		sDeleteButtonClass: 'delete-repetition'
	},
	aoFields: [],
	agFields: []
};

var GFormContainer = GCore.ExtendClass(GFormNode, function() {

	var gThis = this;

	gThis.m_oContainerRepetitions = {};
	gThis.m_iRepetitionIndex = 0;
	gThis.m_agFields = [];
	gThis.m_iChildIndex = 0;

	gThis._Constructor = function() {
		gThis.m_bRepeatable = false;
		if ((gThis.m_oOptions.oRepeat != undefined) && (gThis.m_oOptions.oRepeat.iMax != undefined) && (gThis.m_oOptions.oRepeat.iMax > 1)) {
			gThis.m_bRepeatable = true;
		}
		if (!gThis.m_bRepeatable) {
			gThis._ConstructChildren();
		}
	};
	
	gThis._ConstructChildren = function() {
		for (var i = 0; i < gThis.m_oOptions.aoFields.length; i++) {
			var oField = gThis.m_oOptions.aoFields[i];
			var gChild = new oField.fType(oField);
			if (gChild._Constructor != undefined) {
				gChild._Constructor();
			}
			gThis.m_oOptions.agFields.push(gChild);
			gThis.m_agFields[gThis.m_iChildIndex++] = gChild;
		}
	};
	
	gThis.RenderChildren = function() {
		var jChildrenCollection = $('<div/>');
		for (var i = 0; i < gThis.m_oOptions.agFields.length; i++) {
			gThis._PrepareChild(gThis.m_oOptions.agFields[i]);
			jChildrenCollection.append(gThis.m_oOptions.agFields[i].Render());
		}
		return jChildrenCollection.children();
	};

	gThis._PrepareChild = function(gChild) {
		gChild.m_gForm = gThis.m_gForm;
		gChild.m_gParent = gThis;
		if (gChild.m_oOptions.sName != undefined) {
			gThis.m_gForm.m_ogFields[gChild.m_oOptions.sName] = gChild;
		}
		if (gThis.m_gParent == GCore.NULL) {
			gChild.m_sNamePrefix = '';
		}
		if (gThis.m_gForm == gThis.m_gParent) {
			gChild.m_sNamePrefix = gThis.m_oOptions.sName;
		}
		else {
			gChild.m_sNamePrefix = gThis.GetName();
		}
	};

	gThis.OnInit = function() {
		gThis._Initialize();
		gThis._InitializeEvents();
		for (var i = 0; i < gThis.m_iChildIndex; i++) {
			if (gThis.m_agFields[i] == undefined) {
				continue;
			}
			gThis.m_agFields[i].OnInit();
		}
		gThis._InitializeDependencies();
		gThis._InitializeRules();
	};

	gThis.OnShow = function() {
		for (var i = 0; i < gThis.m_iChildIndex; i++) {
			if (gThis.m_agFields[i] == undefined) {
				continue;
			}
			gThis.m_agFields[i].OnShow();
		}
	};

	gThis.OnRemove = function() {
		for (var i = 0; i < gThis.m_iChildIndex; i++) {
			if (gThis.m_agFields[i] == undefined) {
				continue;
			}
			gThis.m_agFields[i].OnRemove();
		}
	};

	gThis.OnHide = function() {
		for (var i = 0; i < gThis.m_iChildIndex; i++) {
			if (gThis.m_agFields[i] == undefined) {
				continue;
			}
			gThis.m_agFields[i].OnHide();
		}
	};

	gThis.OnReset = function() {
		for (var i = 0; i < gThis.m_iChildIndex; i++) {
			if (gThis.m_agFields[i] == undefined) {
				continue;
			}
			gThis.m_agFields[i].OnReset();
		}
	};

	gThis.Reset = function() {
		for (var i = 0; i < gThis.m_iChildIndex; i++) {
			if (gThis.m_agFields[i] == undefined) {
				continue;
			}
			gThis.m_agFields[i].Reset();
		}
	};
	
	gThis.Validate = function(bNoRequests) {
		var bResult = true;
		for (var i = 0; i < gThis.m_iChildIndex; i++) {
			if (gThis.m_agFields[i] == undefined) {
				continue;
			}
			if (!gThis.m_agFields[i].Validate(bNoRequests)) {
				bResult = false;
			}
		}
		return bResult;
	};
	
	gThis.AddRepetition = function(i) {
		if (i == undefined) {
			i = 'new-' + gThis.m_iRepetitionIndex++;
		}
		var oOptions = GCore.Duplicate(gThis.m_oOptions, true);
		oOptions.sName = i;
		oOptions.agFields = [];
		oOptions.oRepeat = {};
		var gRepetition = new GFormRepetition(oOptions);
		gRepetition._Constructor();
		gThis._PrepareChild(gRepetition);
		gThis.m_jNode.append(gRepetition.Render());
		gRepetition.OnInit();
		gRepetition.m_jNode.find('.' + gThis._GetClass('DeleteButton')).attr('rel', i).click(function() {
			gThis.RemoveRepetition($(this).attr('rel'));
			return false;
		});
		gThis.m_oContainerRepetitions[i] = gRepetition;
		gThis.m_agFields[gThis.m_iChildIndex++] = gRepetition;
		if (GCore.ObjectLength(gThis.m_oContainerRepetitions) <= gThis.m_oOptions.oRepeat.iMin) {
			gThis.m_jNode.find('.' + gThis._GetClass('Repetition') + ' > .' + gThis._GetClass('DeleteButton')).css('display', 'none');
		}
		else {
			gThis.m_jNode.find('.' + gThis._GetClass('Repetition') + ' > .' + gThis._GetClass('DeleteButton')).css('display', 'block');
		}
		gRepetition.OnShow();
	};
	
	gThis.RemoveRepetition = function(i) {
		gRepetition = gThis.m_oContainerRepetitions[i];
		if (gRepetition == undefined) {
			return;
		}
		gRepetition.OnRemove();
		if (gRepetition.m_jNode != undefined) {
			gRepetition.m_jNode.remove();
		}
		for (var j in gThis.m_agFields) {
			if (gThis.m_oContainerRepetitions[i] == gThis.m_agFields[j]) {
				delete gThis.m_agFields[j];
			}
		}
		delete gThis.m_oContainerRepetitions[i];
		if (GCore.ObjectLength(gThis.m_oContainerRepetitions) <= gThis.m_oOptions.oRepeat.iMin) {
			gThis.m_jNode.find('.' + gThis._GetClass('Repetition') + ' > .' + gThis._GetClass('DeleteButton')).css('display', 'none');
		}
		if (GCore.ObjectLength(gThis.m_oContainerRepetitions) < gThis.m_oOptions.oRepeat.iMax) {
			gThis.m_jAdd.css('display', 'block');
		}
	};

	gThis.Populate = function(mData) {
		if (gThis.m_bRepeatable) {
			gThis.AddRepetition();
		}
		if (mData == undefined) {
			return;
		}
		var i;
		if (gThis.m_bRepeatable) {
			if (!GCore.ObjectLength(mData)) {
				return;
			}
			var aKeys = [];
			for (i in mData) {
				aKeys.push(i);
			}
			aKeys.sort();
			if (!gThis.m_gForm.m_bPopulatedWithDefaults) {
				for (var k in gThis.m_oContainerRepetitions) {
					gThis.RemoveRepetition(k);
				}
				gThis.m_jNode.find('.' + gThis._GetClass('Repetition')).remove();
			}
			for (i = 0; i < aKeys.length; i++) {
				var j = aKeys[i];
				if (gThis.m_oContainerRepetitions[j] == undefined) {
					gThis.AddRepetition(j);
				}
				gThis.m_oContainerRepetitions[j].Populate(mData[j]);
			}                                    
		}
		else {
			for (i = 0; i < gThis.m_oOptions.agFields.length; i++) {
				if ((gThis.m_oOptions.agFields[i].m_oOptions.sName != undefined)) {
					gThis.m_oOptions.agFields[i].Populate(mData[gThis.m_oOptions.agFields[i].m_oOptions.sName]);
				}
			}
		}
	};

	gThis.PopulateErrors = function(mData) {
		if (mData == undefined) {
			return;
		}
		var i;
		if (gThis.m_bRepeatable) {
			for (i in mData) {
				if (gThis.m_oContainerRepetitions[i] != undefined) {
					gThis.m_oContainerRepetitions[i].PopulateErrors(mData[i]);
				}
			}                                    
		}
		else {
			for (i = 0; i < gThis.m_oOptions.agFields.length; i++) {
				if ((gThis.m_oOptions.agFields[i].m_oOptions.sName != undefined)) {
					gThis.m_oOptions.agFields[i].PopulateErrors(mData[gThis.m_oOptions.agFields[i].m_oOptions.sName]);
				}
			}
		}
	};
	
	gThis.Focus = function() {
		if (gThis.m_bRepeatable) {
			var aKeys = [];
			for (i in gThis.m_oContainerRepetitions) {
				aKeys.push(i);
			}
			aKeys.sort();
			for (i = 0; i < aKeys.length; i++) {
				var j = aKeys[i];
				if (gThis.m_oContainerRepetitions[j].Focus()) {
					return true;
				}
			}
		}
		else {
			for (var i = 0; i < gThis.m_oOptions.agFields.length; i++) {
				if (gThis.m_oOptions.agFields[i].Focus()) {
					return true;
				}
			}
		}
		return false;
	};
	
	gThis._Initialize = function() {
		if (gThis.m_bRepeatable && !gThis.m_agFields.length) {
			for (var i = 0; i < gThis.m_oOptions.oRepeat.iMin; i++) {
				gThis.AddRepetition();
			}
		}
	};

}, oDefaults);


/*
* FIELD
* Abstract class with base functionality used by all field types.
*/

var oDefaults = {
	oClasses: {
		sInvalidClass: 'invalid',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting',
		sFieldRepetitionClass: 'repetition',
		sAddRepetitionClass: 'add-field-repetition',
		sRemoveRepetitionClass: 'remove-field-repetition'
	},
	oImages: {
		sAddRepetition: '_images_panel/icons/buttons/add.png',
		sRemoveRepetition: '_images_panel/icons/buttons/delete.png'
	},
	aoRules: [],
	sComment: ''
};

var GFormField = GCore.ExtendClass(GFormNode, function() {
	
	var gThis = this;
	
	gThis.m_jField = $('empty');
	gThis.m_oAlerts = {};
	gThis.m_oRepetitionLookup = {};
	gThis.m_sRepetitionCounter = 0;
	gThis.m_oRepetitions = {};
	gThis.m_bAlreadyPopulated = false;
	gThis.m_bSkipValidation = false;
	gThis.m_afDependencyTriggers = [];
	
	gThis.Populate = function(mData) {
		var i;
		if (gThis.m_bRepeatable) {
			if (GCore.ObjectLength(mData) && !gThis.m_bAlreadyPopulated) {
				gThis.m_bAlreadyPopulated = true;
				for (i in gThis.m_oRepetitions) {
					gThis.RemoveRepetition(i);
				}
			}
			for (i in mData) {
				if (gThis.m_oRepetitions[i] == undefined) {
					gThis.AddRepetition(i);
				}
				gThis.SetValue(mData[i], i);
			}
		}
		else {
			gThis.SetValue(mData);
		}
	};
	
	gThis.AddRepetition = function(sRepetition) {
		if (sRepetition == undefined) {
			sRepetition = 'new-' + gThis.m_sRepetitionCounter++;
		}
		var jRepetition = gThis._AddField(sRepetition);
		gThis.m_jNode.append(jRepetition);
		gThis.m_oRepetitions[sRepetition] = jRepetition;
		jRepetition.get(0).sRepetition = sRepetition;
		gThis._GetField(sRepetition).get(0).sRepetition = sRepetition;
		gThis._InitializeEvents(sRepetition);
		gThis._UpdateRepetitionButtons();
		gThis.OnInitRepetition(sRepetition);
		return sRepetition;
	};
	
	gThis.OnInitRepetition = function(sRepetition) {};
	
	gThis.RemoveRepetition = function(sRepetition) {
		gThis._RemoveAlerts(sRepetition);
		gThis.m_oRepetitions[sRepetition].addClass('to-remove');
		gThis.m_jField = gThis.m_jField.not('.to-remove *');
		gThis.m_oRepetitions[sRepetition].remove();
		delete gThis.m_oRepetitions[sRepetition];
		gThis._UpdateRepetitionButtons();
	};
	
	gThis.PopulateErrors = function(mData) {
		if ((mData == undefined) || (mData == '')) {
			return;
		}
		if (gThis.m_bRepeatable) {
			for (var i in mData) {
				if (gThis.m_oRepetitions[i] == undefined) {
					gThis.AddRepetition(i);
				}
				gThis.SetError(mData[i], i);
			}
		}
		else {
			gThis.SetError(mData);
		}
	};
	
	gThis.GetValue = function(sRepetition) {
		if (gThis.m_jField == undefined) {
			return '';
		}
		return gThis._GetField(sRepetition).val();
	};
	
	gThis.SetValue = function(mValue, sRepetition) {
		if (gThis.m_jField == undefined) {
			return;
		}
		gThis._GetField(sRepetition).val(mValue);
	};
	
	gThis.Validate = function(bNoRequests, sRepetition) {
		if (gThis.m_bRepeatable && (sRepetition == undefined)) {
			for (var j in gThis.m_oRepetitions) {
				gThis._RemoveAlerts(j);
			}
			if (gThis.m_bIgnore || (gThis.m_oOptions.aoRules == undefined)) {
				return true;
			}
			var bResult = true;
			for (j in gThis.m_oRepetitions) {
				for (var i = 0; i < gThis.m_oOptions.aoRules.length; i++) {
					if (!GFormRule.Check(gThis.m_oOptions.aoRules[i], gThis, bNoRequests, j)) {
						bResult = false;
					}
				}
			}
			return bResult;
		}
		else {
			gThis._RemoveAlerts(sRepetition);
			if (gThis.m_bIgnore || (gThis.m_oOptions.aoRules == undefined)) {
				return true;
			}
			for (var i = 0; i < gThis.m_oOptions.aoRules.length; i++) {
				if (!GFormRule.Check(gThis.m_oOptions.aoRules[i], gThis, bNoRequests, sRepetition)) {
					return false;
				}
			}
		}
		return true;
	};
	
	gThis.OnRemove = function() {
		gThis._RemoveAlerts();
	};
	
	gThis._RemoveAlerts = function(sRepetition) {
		var i;
		if (sRepetition == undefined) {
			if (gThis.m_bRepeatable) {
				for (var j in gThis.m_oRepetitions) {
					for (i in gThis.m_oAlerts[j]) {
						GAlert.Destroy(gThis.m_oAlerts[j][i]);
					}
				}
			}
			else {
				for (i in gThis.m_oAlerts[0]) {
					GAlert.Destroy(gThis.m_oAlerts[0][i]);
				}
			}
		}
		else {
			if (gThis.m_oAlerts[sRepetition] != undefined) {
				for (i in gThis.m_oAlerts[sRepetition]) {
					GAlert.Destroy(gThis.m_oAlerts[sRepetition][i]);
				}
			}
		}
		gThis._GetField(sRepetition).closest('.' + gThis._GetClass('FieldSpan')).parent().find('.required').html('');
		gThis._GetField(sRepetition).closest('.' + gThis._GetClass('FieldSpan')).parent().removeClass(gThis._GetClass('Invalid'));
	};
	
	gThis.StartWaiting = function(sRepetition) {
		var jWaiting = $('<span class="' + gThis._GetClass('Waiting') + '"/>');
		gThis._GetField(sRepetition).closest('.' + gThis._GetClass('FieldSpan')).parent().append(jWaiting);
		jWaiting.css('display', 'none').fadeIn(250);
	};
	
	gThis._GetField = function(sRepetition) {
		if (!gThis.m_bRepeatable || (sRepetition == undefined)) {
			return gThis.m_jField;
		}
		if (gThis.m_oRepetitions[sRepetition] == undefined) {
			return $();
		}
		gThis.m_oRepetitions[sRepetition].addClass('to-retrieve');
		var jField = gThis.m_jField.filter('.to-retrieve *');
		gThis.m_oRepetitions[sRepetition].removeClass('to-retrieve');
		return jField;
	};
	
	gThis.StopWaiting = function(sRepetition) {
		gThis._GetField(sRepetition).closest('.' + gThis._GetClass('FieldSpan')).parent().find('.' + gThis._GetClass('Waiting')).fadeOut(250, function() {$(this).remove();});
	};
	
	gThis.ValidationResult = function(bResult, sMessage, sRepetition) {
		if (!bResult) {
			gThis.SetError(sMessage, sRepetition);
		}
		return bResult;
	};
	
	gThis.SetError = function(sMessage, sRepetition) {
		gThis._GetField(sRepetition).closest('.' + gThis._GetClass('FieldSpan')).parent().addClass(gThis._GetClass('Invalid'));
		gThis._GetField(sRepetition).closest('.' + gThis._GetClass('FieldSpan')).parent().find('.required').html(sMessage).fadeOut(150, function() {
			$(this).fadeIn(150, function() {
				$(this).fadeOut(150, function() {
					$(this).fadeIn(150, function() {  });
				});
			});
		});
	};
	
	gThis._InitializeEvents = function(sRepetition) {
		if (gThis.m_jField == undefined) {
			return;
		}
		if (gThis.m_bRepeatable && (sRepetition == undefined)) {
			return;
		}
		var jField = gThis._GetField(sRepetition);
		jField.focus(gThis.OnFocus);
		jField.blur(gThis.OnBlur);
		jField.each(function() {
			$(this).unbind('change', gThis.OnValidate).change(gThis.OnValidate);
		});
	};
	
	gThis._ActivateFocusedTab = function(eEvent) {
		if ($(eEvent.currentTarget).closest('.ui-tabs-panel').length && $(eEvent.currentTarget).closest('.ui-tabs-panel').hasClass('ui-tabs-hide')) {
			gThis.m_gForm.m_bDontFocus = true;
			$(eEvent.currentTarget).closest('.ui-tabs').tabs('select', $(eEvent.currentTarget).closest('.ui-tabs-panel').attr('id'));
		}
	};
	
	gThis.OnFocus = function(eEvent) {
		gThis._ActivateFocusedTab(eEvent);
	};
	
	gThis.OnBlur = function(eEvent) {};
	
	gThis.OnValidate = GEventHandler(function(eEvent) {
		if (!$(this).closest('.GFormNode').get(0).gNode.m_bSkipValidation) {
			gThis.Validate(false, this.sRepetition);
		}
	});
	
	gThis.Focus = function(sRepetition) {
		gThis._GetField(sRepetition).eq(0).focus();
		return true;
	};
	
	gThis._UpdateRepetitionButtons = function() {
		if (!gThis.m_bRepeatable) {
			return;
		}
		for (var j in gThis.m_oRepetitions) {
			gThis.m_oRepetitions[j].find('.' + gThis._GetClass('RemoveRepetition') + ', .' + gThis._GetClass('AddRepetition')).remove();
		}
		var jRepetitions = gThis.m_jNode.find('.' + gThis._GetClass('FieldRepetition'));
		var jTrigger;
		for (var i = 0; i < jRepetitions.length; i++) {
			if ((i == jRepetitions.length - 1) && (GCore.ObjectLength(gThis.m_oRepetitions) < gThis.m_oOptions.oRepeat.iMax)) {
				jTrigger = $('<a href="#" class="' + gThis._GetClass('AddRepetition') + '"/>').append('<img src="' + gThis._GetImage('AddRepetition') + '" alt="' + GForm.Language.add_field_repetition + '" title="' + GForm.Language.add_field_repetition + '"/>');
				jRepetitions.eq(i).find('.' + gThis._GetClass('FieldSpan')).after(jTrigger);
				jTrigger.click(function() {
					gThis.AddRepetition();
					return false;
				});
			}
			if (jRepetitions.length > 1) {
				jTrigger = $('<a href="#" class="' + gThis._GetClass('RemoveRepetition') + '"/>').append('<img src="' + gThis._GetImage('RemoveRepetition') + '" alt="' + GForm.Language.remove_field_repetition + '" title="' + GForm.Language.remove_field_repetition + '"/>');
				jRepetitions.eq(i).find('.' + gThis._GetClass('FieldSpan')).after(jTrigger);
				var sRepetition = jRepetitions.get(i).sRepetition;
				jTrigger.click(function() {
					gThis.RemoveRepetition($(this).closest('.' + gThis._GetClass('FieldRepetition')).get(0).sRepetition);
					return false;
				});
			}
		}
	};
	
}, oDefaults);


/*
* CHECKBOX
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-checkbox',
		sFieldSpanClass: 'field',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting',
		sFieldRepetitionClass: 'repetition'
	},
	sFieldType: 'checkbox',
	sDefault: '',
	aoRules: [],
	sComment: ''
};

var GFormCheckbox = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis.m_bShown = false;
	
	gThis.GetValue = function(sRepetition) {
		if (gThis.m_jField == undefined) {
			return '';
		}
		return (gThis._GetField(sRepetition).is(':checked')) ? gThis._GetField(sRepetition).attr('value') : '';
	};
	
	gThis.SetValue = function(mValue, sRepetition) {
		if (gThis.m_jField == undefined) {
			return;
		}
		if (gThis._GetField(sRepetition).attr('value') == mValue) {
			gThis._GetField(sRepetition).parent().checkCheckboxes();
		}
		else {
			gThis._GetField(sRepetition).parent().unCheckCheckboxes();
		}
	};
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		var jLabel = $('<label for="' + gThis.GetId() + '"/>');
		jLabel.text(gThis.m_oOptions.sLabel);
		if ((gThis.m_oOptions.sComment != undefined) && (gThis.m_oOptions.sComment.length)) {
			jLabel.append(' <small>' + gThis.m_oOptions.sComment + '</small>');
		}
		gThis.m_jNode.append(jLabel);
		gThis.m_jField = $('<input type="' + gThis.m_oOptions.sFieldType + '" name="' + gThis.GetName() + '" id="' + gThis.GetId() + '" value="1"/>');
		var jRepetitionNode = $('<span class="' + gThis._GetClass('FieldRepetition') + '"/>');
		jRepetitionNode.append($('<span class="' + gThis._GetClass('FieldSpan') + '"/>').append(gThis.m_jField));
		gThis.m_jNode.append(jRepetitionNode);
	};
	
	gThis.OnFocus = function(eEvent) {
		var jField = $(eEvent.currentTarget);
		jField.closest('.' + gThis._GetClass('FieldSpan')).addClass(gThis._GetClass('Focused'));
		gThis._ActivateFocusedTab(eEvent);
	};
	
	gThis.OnBlur = function(eEvent) {
		var jField = $(eEvent.currentTarget);
		jField.closest('.' + gThis._GetClass('FieldSpan')).removeClass(gThis._GetClass('Focused'));
	};
	
	gThis.Reset = function() {
		gThis.m_jField.val(gThis.m_oOptions.sDefault);
	};
	
}, oDefaults);

/*
* FIELDSET
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sRepetitionClass: 'GFormRepetition',
		sAddButtonClass: 'add-repetition',
		sDeleteButtonClass: 'delete-repetition'
	},
	oImages: {
		sDelete: '_images_panel/buttons/small-delete.png',
		sAdd: '_images_panel/buttons/small-add.png'
	},
	aoFields: [],
	agFields: [],
	oRepeat: {
		iMin: 1,
		iMax: 1
	},
	sClass: ''
};

var GFormFieldset = GCore.ExtendClass(GFormContainer, function() {
	
	var gThis = this;
	
	gThis.m_jAdd;
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<fieldset/>');
		gThis.m_jNode.addClass(gThis.m_oOptions.sClass);
		gThis.m_jNode.attr('id', gThis.m_oOptions.sName);
		if(gThis.m_oOptions.sLabel != ''){
			gThis.m_jNode.append('<legend><strong>' + gThis.m_oOptions.sLabel + '</strong></legend>');
		}
		if (!gThis.m_bRepeatable) {
			gThis.m_jNode.append(gThis.RenderChildren());
		}
		else {
			gThis.m_jNode.addClass('repeatable');
			gThis.m_jAdd = $('<a href="#" class="' + gThis._GetClass('AddButton') + '"/>');
			gThis.m_jAdd.append('<img src="' + gThis._GetImage('Add') + '" alt="' + GForm.Language.add_repetition + '" title="' + GForm.Language.add_repetition + '"/>');
			gThis.m_jNode.append(gThis.m_jAdd);
			if (GCore.ObjectLength(gThis.m_oContainerRepetitions) >= gThis.m_oOptions.oRepeat.iMax) {
				gThis.m_jAdd.css('display', 'none');
			}
		}
	};
	
	gThis._InitializeEvents = function() {
		gThis.m_jNode.bind('GFormShow', function() {
			gThis.m_gForm.m_bFocused = false;
			gThis.OnShow();
		});
		if (gThis.m_bRepeatable) {
			gThis.m_jAdd.click(function() {
				gThis.AddRepetition();
				if (GCore.ObjectLength(gThis.m_oContainerRepetitions) >= gThis.m_oOptions.oRepeat.iMax) {
					gThis.m_jAdd.css('display', 'none');
				}
				if (GCore.ObjectLength(gThis.m_oContainerRepetitions) > gThis.m_oOptions.oRepeat.iMin) {
					gThis.m_jNode.find('.' + gThis._GetClass('Repetition') + ' > .' + gThis._GetClass('DeleteButton')).css('display', 'block');
				}
				return false;
			});
		}
	};
	
	gThis.OnShow = function() {
		if (gThis.m_bRepeatable) {
			var aKeys = [];
			for (i in gThis.m_oContainerRepetitions) {
				aKeys.push(i);
			}
			aKeys.sort();
			for (i = 0; i < aKeys.length; i++) {
				var j = aKeys[i];
				gThis.m_oContainerRepetitions[j].OnShow();
				if (!gThis.m_gForm.m_bFocused) {
					gThis.m_gForm.m_bFocused = gThis.m_oContainerRepetitions[j].Focus();
				}
			}
		}
		else {
			if (gThis.m_gForm.m_bDontFocus || (gThis.m_gForm != gThis.m_gParent)) {
				gThis.m_gForm.m_bFocused = true;
				gThis.m_gForm.m_bDontFocus = false;
			}
			for (var i = 0; i < gThis.m_oOptions.agFields.length; i++) {
				gThis.m_oOptions.agFields[i].OnShow();
				if (!gThis.m_gForm.m_bFocused) {
					gThis.m_gForm.m_bFocused = gThis.m_oOptions.agFields[i].Focus();
				}
			}
		}
		return gThis.m_gForm.m_bFocused;
	};
	
}, oDefaults);


/*
* FORM
*/

var oDefaults = {
	sName: '',
	sFormName: '',
	sClass: '',
	oClasses: {
		sBlockClass: 'block',
		sButtonClass: 'button',
		sButtonImageRightClass: 'right',
		sNavigationClass: 'navigation',
		sPreviousClass: 'previous',
		sNextClass: 'next',
		sInputWithImageClass: 'with-image',
		sActionsClass: 'actions',
		sTabbedClass: 'tabbed'
	},
	oImages: {
		sArrowLeftGray: '_images_panel/icons/buttons/arrow-left-gray.png',
		sArrowRightGreen: '_images_panel/icons/buttons/arrow-right-green.png',
		sSave: '_images_panel/icons/buttons/check.png'
	},
	aoFields: [],
	agFields: [],
	oValues: {},
	iTabs: 0
};

var GForm = GCore.ExtendClass(GFormContainer, function() {
	
	var gThis = this;
	
	gThis.m_bDontFocus = false;
	gThis.m_bPopulatedWithDefaults = false;
	gThis.m_bFocused = false;
	gThis.m_ogFields = {};
	gThis.m_oLocks = {};
	gThis.m_iLockId = 0;
	
	gThis._Constructor = function() {
		GForm.s_agForms[gThis.m_oOptions.sFormName] = gThis;
		gThis.m_gForm = gThis;
		gThis.m_gParent = GCore.NULL;
		$(gThis).addClass(gThis.m_oOptions.sClass);
		gThis._ConstructChildren();
		$(gThis).append('<div class="' + gThis._GetClass('Actions') + '"/>');
		$(gThis).append(gThis.Render());
		gThis.Populate(gThis.m_oOptions.oValues);
		gThis.m_bPopulatedWithDefaults = true;
		gThis.PopulateErrors(gThis.m_oOptions.oErrors);
		gThis.OnInit();
		gThis._InitButtons();
	};
	
	gThis._InitializeEvents = function() {
		$(gThis).submit(gThis.OnSubmit);
	};
	
	gThis.Lock = function(sTitle, sMessage) {
		gThis.m_oLocks[gThis.m_iLockId++] = {
			sTitle: sTitle,
			sMessage: sMessage
		};
		return gThis.m_iLockId - 1;
	};
	
	gThis.Unlock = function(iLockId) {
		delete gThis.m_oLocks[iLockId];
	};
	
	gThis.OnSubmit = function() {
		for (var i in gThis.m_oLocks) {
			GAlert(gThis.m_oLocks[i].sTitle, gThis.m_oLocks[i].sMessage);
			return false;
		}
		var bResult = gThis.Validate(true);
		if (bResult) {
			GCore.StartWaiting();
		}
		return bResult;
	};
	
	gThis.Submit = function(sAction) {
		$(gThis).find('.' + gThis._GetClass('Actions')).empty();
		if ((sAction != undefined) && (sAction != '')) {
			$(gThis).find('.' + gThis._GetClass('Actions')).append('<input type="hidden" name="_Action_' + sAction + '" value="1"/>');
		}
		$(gThis).submit();
	};
	
	gThis._InitButtons = function() {
		var jButtons = $('a[href="#' + $(gThis).attr('id') + '"]');
		jButtons.each(function() {
			var jButton = $(this);
			var sRel = jButton.attr('rel').match(/^[^\[]+/)[0];
			var sAction = jButton.attr('rel').match(/\[[^\]]+\]$/);
			if (sAction != null) {
				sAction = sAction[0].substr(1, sAction[0].length - 2);
			}
			else {
				sAction = null;
			}
			switch (sRel) {
				case 'submit':
					jButton.click(function() {
						gThis.Submit(sAction);
						return false;
					});
					break;
				case 'reset':
					jButton.click(function() {
						gThis.Reset();
						return false;
					});
					break;
			}
		});
	};
	
	gThis.Render = function() {
		return gThis.RenderChildren();
	};
	
	gThis.Reset = function() {
		gThis.OnReset();
		gThis.m_bPopulatedWithDefaults = false;
		gThis.m_oOptions.agFields = gThis.m_agFields;
		gThis.Populate(gThis.m_oOptions.oValues);
		gThis.m_bPopulatedWithDefaults = true;
	};
	
	gThis.GetField = function(sName) {
		var asName = sName.split('.');
		if (asName.length == 2) {
			if (asName[0] != gThis.m_oOptions.sFormName) {
				return GForm.GetForm(asName[0]).GetField(asName[1]);
			}
			sName = asName[1];
		}
		return gThis.m_ogFields[sName];
	};
	
	gThis._Constructor();
	
}, oDefaults);

GForm.INFINITE = 99999;

GForm.TABS_VERTICAL = 0;
GForm.TABS_HORIZONTAL = 1;
GForm.s_agForms = {};

GForm.GetForm = function(sName) {
	return GForm.s_agForms[sName];
};

new GPlugin('GForm', oDefaults, GForm);

/*
* RADIO GROUP
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-radio-group',
		sFieldSpanClass: 'field',
		sGroupClass: 'group',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting'
	},
	aoOptions: [],
	sDefault: '',
	aoRules: [],
	sComment: ''
};

var GFormRadioGroup = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis.m_bResized;
	
	gThis._Constructor = function() {
		gThis.m_bResized = false;
	};
	
	gThis.GetValue = function() {
		return gThis.m_jField.filter(':checked').attr('value');
	};
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		var jLabel = $('<label class="' + gThis._GetClass('Group') + '" for="' + gThis.GetId() + '"/>');
		jLabel.text(gThis.m_oOptions.sLabel);
		if ((gThis.m_oOptions.sComment != undefined) && (gThis.m_oOptions.sComment.length)) {
			jLabel.append(' <small>' + gThis.m_oOptions.sComment + '</small>');
		}
		gThis.m_jNode.append(jLabel);
		gThis.m_jField = $();
		for (var i = 0; i < gThis.m_oOptions.aoOptions.length; i++) {
			var oOption = gThis.m_oOptions.aoOptions[i];
			var jInput = $('<input type="radio" name="' + gThis.GetName() + '" value="' + oOption.sValue + '">');
			gThis.m_jField.add(jInput);
			gThis.m_jNode.append($('<span class="' + gThis._GetClass('FieldSpan') + '"/>').append($('<label>' + oOption.sLabel + '</label>').prepend(jInput)));
		}
	};
	
	gThis.SetValue = function(mValue) {
		if ((gThis.m_jField != undefined) && (gThis.m_jField instanceof $)) {
			gThis.m_jField.find(':radio[value="' + mValue + '"]').click();
		}
	};
	
	gThis.Reset = function() {
	};
	
}, oDefaults);


/*
* RADIO VALUE GROUP
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-radio-group',
		sFieldSpanClass: 'field',
		sGroupClass: 'group',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting'
	},
	oImages: {
		sCalendarIcon: '_images_panel/icons/buttons/calendar.png'
	},
	aoOptions: [],
	sDefault: '',
	aoRules: [],
	sComment: ''
};

var GFormRadioValueGroup = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis.m_bResized;
	
	gThis._Constructor = function() {
		gThis.m_bResized = false;
	};
	
	gThis.GetValue = function() {
		return gThis.m_jField.filter(':checked').attr('value');
	};
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		var jLabel = $('<label class="' + gThis._GetClass('Group') + '" for="' + gThis.GetId() + '"/>');
		jLabel.text(gThis.m_oOptions.sLabel);
		if ((gThis.m_oOptions.sComment != undefined) && (gThis.m_oOptions.sComment.length)) {
			jLabel.append(' <small>' + gThis.m_oOptions.sComment + '</small>');
		}
		gThis.m_jNode.append(jLabel);
		for (var i = 0; i < gThis.m_oOptions.aoOptions.length; i++) {
			var oOption = gThis.m_oOptions.aoOptions[i];
			var jInput = $('<input type="radio" name="' + gThis.GetName() + '[value]" value="' + oOption.sValue + '">');
			if (gThis.m_jField instanceof $) {
				gThis.m_jField = gThis.m_jField.add(jInput);
			}
			else {
				gThis.m_jField = jInput;
			}
			var iPosition;
			if ((iPosition = oOption.sLabel.indexOf('%input%')) != -1) {
				var jLabel = $('<label/>');
				jLabel.append('<span>' + oOption.sLabel.substr(0, iPosition) + '</span>');
				var jInnerInput = $('<input type="text" name="' + gThis.GetName() + '[' + oOption.sValue + ']" value=""/>');
				jLabel.append($('<span class="inner-field-text"/>').append(jInnerInput));
				jLabel.append('<span>' + oOption.sLabel.substr(iPosition + 7) + '</span>');
			}
			else if ((iPosition = oOption.sLabel.indexOf('%date%')) != -1) {
				var jLabel = $('<label/>');
				jLabel.append('<span>' + oOption.sLabel.substr(0, iPosition) + '</span>');
				var jInnerInput = $('<input class="date" type="text" name="' + gThis.GetName() + '[' + oOption.sValue + ']" value=""/>');
				var jTrigger = $('<img style="width: 16px; height: 16px; float: left; margin: 0 5px 0 0;" src="' + gThis._GetImage('CalendarIcon') + '" alt=""/>');
				jTrigger.css('cursor', 'pointer');
				jLabel.append($('<span class="inner-field-text"/>').append(jInnerInput)).append(jTrigger);
				jLabel.append('<span>' + oOption.sLabel.substr(iPosition + 6) + '</span>');
			}
			else if ((iPosition = oOption.sLabel.indexOf('%select%')) != -1) {
				var jLabel = $('<label/>');
				jLabel.append('<span>' + oOption.sLabel.substr(0, iPosition) + '</span>');
				var jInnerInput = $('<select name="' + gThis.GetName() + '[' + oOption.sValue + ']"/>');
				for (var j in gThis.m_oOptions.oSuboptions[oOption.sValue]) {
					var oSuboption = gThis.m_oOptions.oSuboptions[oOption.sValue][j];
					jInnerInput.append('<option value="' + oSuboption.value + '">' + oSuboption.label + '</option>');
				}
				jLabel.append($('<span class="inner-field-select"/>').append($('<span class="field"/>').append(jInnerInput)));
				jLabel.append('<span>' + oOption.sLabel.substr(iPosition + 8) + '</span>');
			}
			else {
				var jLabel = $('<label>' + oOption.sLabel + '</label>');
			}
			gThis.m_jNode.append($('<span class="' + gThis._GetClass('FieldSpan') + '"/>').append(jLabel.prepend(jInput)));
		}
	};
	
	gThis._InitializeEvents = function() {
		var f = function(eEvent) {
			if ($(this).is(':checked')) {
				$(this).closest('.field').find('input:text').focus();
			}
		};
		gThis.m_jField.change(f).click(f);
		gThis.m_jField.closest('.field').find('select').GSelect();
		gThis.m_jField.closest('.field').find('.inner-field-text input').focus(function(eEvent) {
			$(this).parent().addClass('focus');
			$(this).closest('.field').find('input:radio:not(:checked)').click();
		}).blur(function(eEvent) {
			$(this).parent().removeClass('focus');
		});
		gThis.m_jField.closest('.field').find('.inner-field-select select').focus(function(eEvent) {
			$(this).parent().addClass('focus');
		}).blur(function(eEvent) {
			$(this).parent().removeClass('focus');
			$(this).closest('.field').find('input:radio:not(:checked)').click();
		}).change(function(eEvent) {
			$(this).closest('.field').find('input:radio:not(:checked)').click();
		});
		gThis.m_jNode.find('input.date').datepicker();
	};
	
	gThis.SetValue = function(mValue) {
		for (var i in mValue) {
			if (i == 'value') {
				if ((gThis.m_jField != undefined) && (gThis.m_jField.length)) {
					gThis.m_jField.filter('[value="' + mValue[i] + '"]').click();
				}
			}
			else {
				gThis.m_jNode.find('input:text[name="' + gThis.GetName() + '[' + i + ']"]').val(mValue[i]);
				gThis.m_jNode.find('select[name="' + gThis.GetName() + '[' + i + ']"]').val(mValue[i]).change();
			}
		}
	};
	
	gThis.Reset = function() {
	};
	
}, oDefaults);


/*
* SELECT
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-select',
		sFieldSpanClass: 'field',
		sPrefixClass: 'prefix',
		sSuffixClass: 'suffix',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sDisabledClass: 'disabled',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting',
		sFieldRepetitionClass: 'repetition',
		sAddRepetitionClass: 'add-field-repetition',
		sRemoveRepetitionClass: 'remove-field-repetition'
	},
	oImages: {
		sAddRepetition: '_images_panel/icons/buttons/add.png',
		sRemoveRepetition: '_images_panel/icons/buttons/delete.png'
	},
	aoOptions: [],
	sDefault: '',
	aoRules: [],
	sComment: '',
	sSelector: '',
	sCssAttribute: ''
};

var GFormSelect = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis.m_bShown = false;
	gThis.m_bResized = false;
	
	gThis.GetValue = function(sRepetition) {
		if (gThis.m_jField == undefined) {
			return '';
		}
		return gThis._GetField(sRepetition).find('option:selected').attr('value');
	};
	
	gThis.SetValue = function(mValue, sRepetition) {
		if (gThis.m_jField == undefined) {
			return;
		}
		var jField = gThis._GetField(sRepetition);
		jField.val(mValue);
		if ((jField.get(0) != undefined) && (jField.get(0).Update != undefined)) {
			jField.get(0).Update.apply(jField.get(0));
		}
	};
	
	gThis.ExchangeOptions = function(aoNewOptions) {
		var sOldValueId = gThis.m_jField.val();
		gThis.m_oOptions.aoOptions = aoNewOptions;
		var jOldNode = gThis.m_jNode;
		gThis.m_jField = GCore.NULL;
		gThis._PrepareNode();
		gThis.m_jNode.addClass('GFormNode').get(0).gNode = gThis;
		jOldNode.replaceWith(gThis.m_jNode);
		gThis.m_bShown = false;
		gThis.m_bResized = false;
		gThis.OnShow();
		if (gThis.m_jField.find('option[value="' + sOldValueId + '"]').length) {
			gThis.m_jField.val(sOldValueId);
		}
		gThis._InitializeDependencies();
		gThis.m_jField.change();
	};
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		var jLabel = $('<label for="' + gThis.GetId() + '"/>');
		jLabel.text(gThis.m_oOptions.sLabel);
		if ((gThis.m_oOptions.sComment != undefined) && (gThis.m_oOptions.sComment.length)) {
			jLabel.append(' <small>' + gThis.m_oOptions.sComment + '</small>');
		}
		gThis.m_jNode.append(jLabel);
		if (!gThis.m_bRepeatable) {
			gThis.m_jNode.append(gThis._AddField());
		}
		else {
			gThis.AddRepetition();
		}
		if ((gThis.m_oOptions.sSelector != undefined) && (gThis.m_oOptions.sSelector.length)) {
			gThis.m_jField.attr('name', gThis.GetName() + '[value]');
			gThis.m_jNode.append('<input type="hidden" name="' + gThis.GetName() + '[selector]" value="' + gThis.m_oOptions.sSelector + '"/>');
		}
		if ((gThis.m_oOptions.sCssAttribute != undefined) && (gThis.m_oOptions.sCssAttribute.length)) {
			gThis.m_jField.attr('name', gThis.GetName() + '[value]');
			gThis.m_jNode.append('<input type="hidden" name="' + gThis.GetName() + '[css_attribute]" value="' + gThis.m_oOptions.sCssAttribute + '"/>');
		}
	};
	
	gThis._AddField = function(sId) {
		var jField = $('<select name="' + gThis.GetName(sId) + '" id="' + gThis.GetId(sId) + '"/>');
		for (var i = 0; i < gThis.m_oOptions.aoOptions.length; i++) {
			var oOption = gThis.m_oOptions.aoOptions[i];
			jField.append('<option value="' + oOption.sValue + '">' + oOption.sLabel + '</option>');
		}
		if ((gThis.m_jField instanceof $) && gThis.m_jField.length) {
			gThis.m_jField = gThis.m_jField.add(jField);
		}
		else {
			gThis.m_jField = jField;
		}
		var jRepetitionNode = $('<span class="' + gThis._GetClass('FieldRepetition') + '"/>');
		if (gThis.m_oOptions.sPrefix != undefined) {
			var jPrefix = $('<span class="' + gThis._GetClass('Prefix') + '"/>');
			jPrefix.html(gThis.m_oOptions.sPrefix);
			jRepetitionNode.append(jPrefix);
		}
		jRepetitionNode.append($('<span class="' + gThis._GetClass('FieldSpan') + '"/>').append(jField));
		if (gThis.m_oOptions.sSuffix != undefined) {
			var jSuffix = $('<span class="' + gThis._GetClass('Suffix') + '"/>');
			jSuffix.html(gThis.m_oOptions.sSuffix);
			jRepetitionNode.append(jSuffix);
		}
		
		gThis.jRepetitionNode = jRepetitionNode;
		return gThis.jRepetitionNode;
	};
	
	gThis.OnInitRepetition = function(sRepetition) {
		if (!gThis.m_bShown) {
			return;
		}
		gThis._GetField(sRepetition).GSelect();
	};
	
	gThis.OnShow = function() {
		gThis._UpdateRepetitionButtons();
		if (!gThis.m_bShown && gThis.m_bRepeatable) {
			gThis._InitializeEvents('new-0');
		}
		gThis.m_bShown = true;
		if (gThis.m_bRepeatable) {
			for (var i in gThis.m_oRepetitions) {
				if (!gThis.m_oRepetitions[i].m_bResized) {
					gThis.m_oRepetitions[i].m_bResized = true;
					gThis.OnInitRepetition(i);
				}
			}
		}
		else {
			if (!gThis.m_bResized) {
				gThis.m_bResized = true;
				gThis.OnInitRepetition();
			}
		}
	};
	
	gThis.OnFocus = function(eEvent) {
		$(eEvent.currentTarget).closest('.' + gThis._GetClass('FieldSpan')).addClass(gThis._GetClass('Focused'));
		gThis._ActivateFocusedTab(eEvent);
	};
	
	gThis.OnBlur = function(eEvent) {
		$(eEvent.currentTarget).closest('.' + gThis._GetClass('FieldSpan')).removeClass(gThis._GetClass('Focused'));
	};
	
	gThis.Reset = function() {
		gThis.m_jField.val(gThis.m_oOptions.sDefault).change();
	};
	
	gThis._SetGlobal = function() {

		if (gThis.m_bRepeatable) {
				
			gThis.Populate(gThis.m_oOptions.asGlobals);
		}
		else {
			if(gThis.m_oOptions.sGlobal != undefined){
				
				gThis.m_jField.val(gThis.m_oOptions.sGlobal).change();
				
			}else{
				
				gThis.m_jField.val(0).change();
				
			}
		}
			
	};
	
	gThis._InitializeEvents = function(sRepetition) {
		if (gThis.m_jField == undefined) {
			return;
		}
		if (gThis.m_bRepeatable && (sRepetition == undefined)) {
			return;
		}
		var jField = gThis._GetField(sRepetition);
		jField.focus(gThis.OnFocus);
		jField.blur(gThis.OnBlur);
		jField.each(function() {
			$(this).change(GEventHandler(function(eEvent) {
				gThis.Validate(false, this.sRepetition);
			}));
		});
		jField.keydown(function(eEvent) {
			var dSelect = this;
			setTimeout(function() {
				dSelect.Update();
			}, 50);
			return true;
		});
		if (gThis.m_jNode.closest('.statusChange').length) {
			gThis.OnShow();
		}
	};
	
}, oDefaults);

/*
* STATIC TEXT
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-static-text'
	}
};

var GFormStaticText = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		gThis.m_jNode.append(gThis.m_oOptions.sText);
	};
	
	gThis.Focus = function() { return false; };
	
}, oDefaults);


/*
* SUBMIT
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-submit',
		sButtonClass: 'button'
	},
	sIcon: ''
};

var GFormSubmit = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		gThis.m_jNode.append('<span class="' + gThis._GetClass('Button') + '"><span>' + ((gThis.m_oOptions.sIcon != '') ? '<img src="' + GCore.DESIGN_PATH + gThis.m_oOptions.sIcon + '" alt=""/>' : '') + '<input type="submit" name="' + gThis.GetName() + '" value="' + gThis.m_oOptions.sLabel + '"/></span></span>');
	};
	
}, oDefaults);

/*
* TEXTFIELD
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-text',
		sFieldSpanClass: 'field',
		sPrefixClass: 'prefix',
		sSuffixClass: 'suffix',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sDisabledClass: 'disabled',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting',
		sFieldRepetitionClass: 'repetition',
		sAddRepetitionClass: 'add-field-repetition',
		sRemoveRepetitionClass: 'remove-field-repetition'
	},
	oImages: {
		sAddRepetition: '_images_panel/icons/buttons/add.png',
		sRemoveRepetition: '_images_panel/icons/buttons/delete.png'
	},
	sFieldType: 'text',
	sDefault: '',
	aoRules: [],
	sComment: ''
};

var GFormTextField = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis.m_bShown = false;
	gThis.m_bResized = false;
	
	gThis._PrepareNode = function() {

		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		var jLabel = $('<label for="' + gThis.GetId() + '"/>');
		jLabel.text(gThis.m_oOptions.sLabel);
		if ((gThis.m_oOptions.sComment != undefined) && (gThis.m_oOptions.sComment.length)) {
			jLabel.append(' <small>' + gThis.m_oOptions.sComment + '</small>');
		}
		gThis.m_jNode.append(jLabel);
		if (!gThis.m_bRepeatable) {
			gThis.m_jNode.append(gThis._AddField());
		}
		else {
			gThis.AddRepetition();
		}
		if ((gThis.m_oOptions.sSelector != undefined) && (gThis.m_oOptions.sSelector.length)) {
			gThis.m_jField.attr('name', gThis.GetName() + '[value]');
			gThis.m_jNode.append('<input type="hidden" name="' + gThis.GetName() + '[selector]" value="' + gThis.m_oOptions.sSelector + '"/>');
		}
		if ((gThis.m_oOptions.sCssAttribute != undefined) && (gThis.m_oOptions.sCssAttribute.length)) {
			gThis.m_jField.attr('name', gThis.GetName() + '[value]');
			gThis.m_jNode.append('<input type="hidden" name="' + gThis.GetName() + '[css_attribute]" value="' + gThis.m_oOptions.sCssAttribute + '"/>');
		}
		
	};

	gThis._AddField = function(sId) {
		var jField = $('<input type="' + gThis.m_oOptions.sFieldType + '" name="'+ gThis.GetName(sId) + '" id="' + gThis.GetId(sId) + '"/>');
		
		if ((gThis.m_jField instanceof $) && gThis.m_jField.length) {
			gThis.m_jField = gThis.m_jField.add(jField);
		}
		else {
			gThis.m_jField = jField;
		}
		var jRepetitionNode = $('<span class="' + gThis._GetClass('FieldRepetition') + '"/>');
		if (gThis.m_oOptions.sPrefix != undefined) {
			var jPrefix = $('<span class="' + gThis._GetClass('Prefix') + '"/>');
			jPrefix.html(gThis.m_oOptions.sPrefix);
			jRepetitionNode.append(jPrefix);
		}
		jRepetitionNode.append($('<span class="' + gThis._GetClass('FieldSpan') + '"/>').append(jField));
		if (gThis.m_oOptions.sSuffix != undefined) {
			var jSuffix = $('<span class="' + gThis._GetClass('Suffix') + '"/>');
			jSuffix.html(gThis.m_oOptions.sSuffix);
			jRepetitionNode.append(jSuffix);
		}
		var jError = $('<span class="' + gThis._GetClass('Required') + '"/>');
		jRepetitionNode.append(jError);
		gThis.jRepetitionNode = jRepetitionNode;
		return gThis.jRepetitionNode;
	};
	
	gThis.OnShow = function() {
		gThis._UpdateRepetitionButtons();
		if (!gThis.m_bShown && gThis.m_bRepeatable) {
			gThis._InitializeEvents('new-0');
		}
		gThis.m_bShown = true;
		if (gThis.m_bRepeatable) {
			for (var i in gThis.m_oRepetitions) {
				if (!gThis.m_oRepetitions[i].m_bResized) {
					gThis.m_oRepetitions[i].m_bResized = true;
					var iWidth = parseInt(gThis._GetField(i).css('width'));
					if (gThis.m_oRepetitions[i].find('.' + gThis._GetClass('Prefix')).length) {
						iWidth -= (gThis._GetField(i).offset().left - gThis.m_oRepetitions[i].find('.' + gThis._GetClass('Prefix')).offset().left) - 1;
					}
					if (gThis.m_oRepetitions[i].find('.' + gThis._GetClass('Suffix')).length) {
						iWidth -= gThis.m_oRepetitions[i].find('.' + gThis._GetClass('Suffix')).width() + 4;
					}
					gThis._GetField(i).eq(i).css('width', iWidth);
				}
			}
		}
		else {
			if (!gThis.m_bResized) {
				gThis.m_bResized = true;
				var iWidth = parseInt(gThis.m_jField.css('width'));
				if (gThis.m_jNode.find('.' + gThis._GetClass('Prefix')).length) {
					iWidth -= (gThis.m_jField.offset().left - gThis.m_jNode.find('.' + gThis._GetClass('Prefix')).offset().left) - 1;
				}
				if (gThis.m_jNode.find('.' + gThis._GetClass('Suffix')).length) {
					iWidth -= gThis.m_jNode.find('.' + gThis._GetClass('Suffix')).width() + 4;
				}
				gThis.m_jField.css('width', iWidth);
			}
		}
	};
	
	gThis.OnFocus = function(eEvent) {
		var jField = $(eEvent.currentTarget);
		jField.closest('.' + gThis._GetClass('FieldSpan')).addClass(gThis._GetClass('Focused'));
		gThis._ActivateFocusedTab(eEvent);
	};
	
	gThis.OnBlur = function(eEvent) {
		var jField = $(eEvent.currentTarget);
		jField.closest('.' + gThis._GetClass('FieldSpan')).removeClass(gThis._GetClass('Focused'));
	};
	
	gThis.Reset = function() {
		gThis.m_jField.val(gThis.m_oOptions.sDefault);
	};
	
	gThis._InitializeEvents = function(sRepetition) {
		if (gThis.m_jField == undefined) {
			return;
		}
		if (gThis.m_bRepeatable && (sRepetition == undefined)) {
			return;
		}
		var jField = gThis._GetField(sRepetition);
		jField.focus(gThis.OnFocus);
		jField.blur(gThis.OnBlur);
		jField.each(function() {
			$(this).unbind('change', gThis.OnValidate).change(gThis.OnValidate);
		});
		
	};
	
	
}, oDefaults);

/*
* FIELDSET REPEATABLE
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sRepetitionClass: 'GFormRepetition',
		sAddButtonClass: 'add-repetition',
		sDeleteButtonClass: 'delete-repetition'
	},
	oImages: {
		sDelete: '_images_panel/buttons/small-delete.png',
		sAdd: '_images_panel/buttons/small-add.png'
	},
	aoFields: [],
	agFields: [],
	oRepeat: {
		iMin: 1,
		iMax: 1
	}
};

var GFormFieldsetRepeatable = GCore.ExtendClass(GFormFieldset, function() {
	
}, oDefaults);

/*
* MULTISELECT
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-multiselect',
		sFieldSpanClass: 'field',
		sGroupClass: 'group',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting',
		sFieldRepetitionClass: 'repetition'
	},
	aoOptions: [],
	sDefault: '',
	aoRules: [],
	sComment: ''
};

var GFormMultiSelect = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis.m_bShown = false;
	
	gThis._Constructor = function() {
		gThis.m_bResized = false;
	};
	
	gThis.GetValue = function(sRepetition) {
		if (gThis.m_jField == undefined) {
			return '';
		}
		var aValues = [];
		var jValues = gThis._GetField(sRepetition).filter(':checked');
		for (var i in jValues) {
			aValues.push(jValues.eq(i).attr('value'));
		}
		return aValues;
	};
	
	gThis.SetValue = function(mValue, sRepetition) {
		if (gThis.m_jField == undefined) {
			return;
		}
		gThis._GetField(sRepetition).val(mValue).change();
	};
	
	gThis.ExchangeOptions = function(aoNewOptions) {
		gThis.m_oOptions.aoOptions = aoNewOptions;
		var jOldNode = gThis.m_jNode;
		gThis._PrepareNode();
		jOldNode.replaceWith(gThis.m_jNode);
		gThis.m_bShown = false;
		gThis.m_bResized = false;
		gThis.OnShow();
		gThis.m_jField.change();
	};
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		var jLabel = $('<label for="' + gThis.GetId() + '" class="' + gThis._GetClass('Group') + '"/>');
		jLabel.text(gThis.m_oOptions.sLabel);
		if ((gThis.m_oOptions.sComment != undefined) && (gThis.m_oOptions.sComment.length)) {
			jLabel.append(' <small>' + gThis.m_oOptions.sComment + '</small>');
		}
		gThis.m_jNode.append(jLabel);
		gThis.m_jNode.append(gThis._AddField());
	};
	
	gThis._AddField = function(sId) {
		var jField = $('<ul/>');
		for (var i = 0; i < gThis.m_oOptions.aoOptions.length; i++) {
			var oOption = gThis.m_oOptions.aoOptions[i];
			jField.append('<li><label><input type="checkbox" name="' + gThis.GetName(sId) + '[]" value="' + oOption.sValue + '"/>' + oOption.sLabel + '</label></li>');
		}
		if ((gThis.m_jField instanceof $) && gThis.m_jField.length) {
			gThis.m_jField = gThis.m_jField.add(jField);
		}
		else {
			gThis.m_jField = jField;
		}
		var jRepetitionNode = $('<span class="' + gThis._GetClass('FieldRepetition') + '"/>');
		jRepetitionNode.append($('<span class="' + gThis._GetClass('FieldSpan') + '"/>').append(jField));
		return jRepetitionNode;
	};
	
	gThis.OnReset = function() {
		gThis.m_jNode.find('input').parent().unCheckCheckboxes();
	};
	
	gThis.Populate = function(mValue) {
		gThis.m_jNode.unCheckCheckboxes();
		for (var i in mValue) {
			if (i == 'toJSON') {
				continue;
			}
			gThis.m_jNode.find('input[value="' + mValue[i] + '"]').parent().checkCheckboxes();
		}
	};
	
	gThis.Focus = function() {
		if (gThis.m_jField == undefined) {
			return;
		}
		gThis.m_jField.eq(0).focus();
	};
	
}, oDefaults);


/*
* PASSWORD
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-text',
		sFieldSpanClass: 'field',
		sPrefixClass: 'prefix',
		sSuffixClass: 'suffix',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting',
		sFieldRepetitionClass: 'repetition',
		sAddRepetitionClass: 'add-field-repetition',
		sRemoveRepetitionClass: 'remove-field-repetition'
	},
	oImages: {
		sAddRepetition: '_images_panel/icons/buttons/add.png',
		sRemoveRepetition: '_images_panel/icons/buttons/delete.png'
	},
	sFieldType: 'password',
	sDefault: '',
	aoRules: []
};

var GFormPassword = GCore.ExtendClass(GFormTextField, function() {
	
	var gThis = this;
	
}, oDefaults);

/*
* TEXTAREA
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sFieldClass: 'field-textarea',
		sFieldSpanClass: 'field',
		sPrefixClass: 'prefix',
		sSuffixClass: 'suffix',
		sFocusedClass: 'focus',
		sInvalidClass: 'invalid',
		sRequiredClass: 'required',
		sWaitingClass: 'waiting',
		sFieldRepetitionClass: 'repetition',
		sAddRepetitionClass: 'add-field-repetition',
		sRemoveRepetitionClass: 'remove-field-repetition'
	},
	oImages: {
		sAddRepetition: '_images_panel/icons/buttons/add.png',
		sRemoveRepetition: '_images_panel/icons/buttons/delete.png'
	},
	iRows: 3,
	iCols: 60,
	sDefault: '',
	aoRules: [],
	sComment: ''
};

var GFormTextarea = GCore.ExtendClass(GFormTextField, function() {
	
	var gThis = this;
	
	gThis.m_bResized;
	
	gThis._Constructor = function() {
		gThis.m_bResized = false;
	};
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		var jLabel = $('<label for="' + gThis.GetId() + '"/>');
		jLabel.text(gThis.m_oOptions.sLabel);
		if ((gThis.m_oOptions.sComment != undefined) && (gThis.m_oOptions.sComment.length)) {
			jLabel.append(' <small>' + gThis.m_oOptions.sComment + '</small>');
		}
		gThis.m_jNode.append(jLabel);
		if (!gThis.m_bRepeatable) {
			gThis.m_jNode.append(gThis._AddField());
		}
		else {
			gThis.AddRepetition();
		}
	};
	
	gThis._AddField = function(sId) {
		var jField = $('<textarea name="' + gThis.GetName() + '" id="' + gThis.GetId() + '" rows="' + gThis.m_oOptions.iRows + '" cols="' + gThis.m_oOptions.iCols + '"/>');
		if ((gThis.m_jField instanceof $) && gThis.m_jField.length) {
			gThis.m_jField = gThis.m_jField.add(jField);
		}
		else {
			gThis.m_jField = jField;
		}
		var jRepetitionNode = $('<span class="' + gThis._GetClass('FieldRepetition') + '"/>');
		jRepetitionNode.append($('<span class="' + gThis._GetClass('FieldSpan') + '"/>').append(jField));
		return jRepetitionNode;
	};
	
	gThis.OnShow = function() {};
	
}, oDefaults);


/*
* CONDITIONS
*/

var GFormCondition = function(sCondition, mArgument) {
	
	var gThis = this;
	
	gThis.m_sType = sCondition;
	gThis.m_mArgument = mArgument;
	
	gThis.Evaluate = function(mValue) {
		switch(gThis.m_sType) {
			
			// EQUALS
			case GFormCondition.EQUALS:
				if (gThis.m_mArgument instanceof GFormCondition) {
					return false;
				}
				else if (gThis.m_mArgument instanceof Array) {
					return $.inArray(mValue, gThis.m_mArgument) != -1;
				}
				else {
					return mValue == gThis.m_mArgument;
				}
				break;
			
			// GE
			case GFormCondition.GE:
				if (gThis.m_mArgument instanceof GFormCondition) {
					return false;
				}
				else {
					return mValue >= gThis.m_mArgument;
				}
				break;
			
			// LE
			case GFormCondition.LE:
				if (gThis.m_mArgument instanceof GFormCondition) {
					return false;
				}
				else {
					return mValue <= gThis.m_mArgument;
				}
				break;
			
			// NOT
			case GFormCondition.NOT:
				if (gThis.m_mArgument instanceof GFormCondition) {
					return !gThis.m_mArgument.Evaluate(mValue);
				}
				else {
					return false;
				}
				break;
			
			// AND
			case GFormCondition.AND:
				if (gThis.m_mArgument instanceof GFormCondition) {
					return true;
				}
				else if (gThis.m_mArgument instanceof Array) {
					for (var i = 0; i < gThis.m_mArgument.length; i++) {
						if (!(gThis.m_mArgument[i] instanceof GFormCondition) || !gThis.m_mArgument[i].Evaluate(mValue)) {
							return false;
						}
					}
					return true;
				}
				else {
					return false;
				}
				break;
			
			// OR
			case GFormCondition.OR:
				if (gThis.m_mArgument instanceof GFormCondition) {
					return true;
				}
				else if (gThis.m_mArgument instanceof Array) {
					for (var i = 0; i < gThis.m_mArgument.length; i++) {
						if (!(gThis.m_mArgument[i] instanceof GFormCondition)) {
							return false;
						}
						if (gThis.m_mArgument[i].Evaluate(mValue)) {
							return true;
						}
					}
					return true;
				}
				else {
					return false;
				}
				break;
			
		};
		return true;
	};
	
};

GFormCondition.EQUALS = '=';
GFormCondition.GE = '>=';
GFormCondition.LE = '<=';
GFormCondition.NOT = '!';
GFormCondition.AND = '&&';
GFormCondition.OR = '||';

/*
* COLUMNS
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	oClasses: {
		sColumnsClass: 'layout-two-columns',
		sColumnClass: 'column'
	},
	aoFields: [],
	agFields: [],
	sClass: ''
};

var GFormColumns = GCore.ExtendClass(GFormContainer, function() {
	
	var gThis = this;
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>');
		gThis.m_jNode.addClass(gThis._GetClass('Columns'));
		gThis.m_jNode.addClass(gThis.m_oOptions.sClass);
		gThis.m_jNode.attr('id', gThis.m_oOptions.sName);
		gThis.m_jNode.append(gThis.RenderChildren());
		gThis.m_jNode.children().addClass(gThis._GetClass('Column'));
	};
	
	gThis._InitializeEvents = function() {
		gThis.m_jNode.bind('GFormShow', function() {
			gThis.m_gForm.m_bFocused = false;
			gThis.OnShow();
		});
	};
	
	gThis.OnShow = function() {
		if (gThis.m_gForm.m_bDontFocus || (gThis.m_gForm != gThis.m_gParent)) {
			gThis.m_gForm.m_bFocused = true;
			gThis.m_gForm.m_bDontFocus = false;
		}
		for (var i = 0; i < gThis.m_oOptions.agFields.length; i++) {
			gThis.m_oOptions.agFields[i].OnShow();
			if (!gThis.m_gForm.m_bFocused) {
				gThis.m_gForm.m_bFocused = gThis.m_oOptions.agFields[i].Focus();
			}
		}
		return gThis.m_gForm.m_bFocused;
	};
	
}, oDefaults);

/*
* HIDDEN
*/

var oDefaults = {
	sName: '',
	oClasses: {
		sFieldClass: 'field-hidden'
	},
	sFieldType: 'hidden',
	sDefault: '',
	aoRules: [],
	aoDependencies: [],
	sComment: ''
};

var GFormHidden = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		gThis.m_jNode.append(gThis._AddField());
	};
	
	gThis.Validate = function(bNoRequests, sRepetition) {
		return true;
	};
	
	gThis._AddField = function(sId) {
		var jField = $('<input type="' + gThis.m_oOptions.sFieldType + '" name="' + gThis.GetName(sId) + '" id="' + gThis.GetId(sId) + '"/>');
		gThis.m_jField = jField;
		return jField;
	};
	
}, oDefaults);

/*
* REPETITION
*/

var oDefaults = {
	sName: '',
	oClasses: {
		sRepetitionClass: 'GFormRepetition',
		sDeleteButtonClass: 'delete-repetition'
	},
	oImages: {
		sDelete: '_images_panel/buttons/small-delete.png',
		sAdd: '_images_panel/buttons/small-add.png'
	},
	aoFields: [],
	agFields: []
};

var GFormRepetition = GCore.ExtendClass(GFormContainer, function() {
	
	var gThis = this;
	
	gThis._PrepareNode = function() {
		gThis.m_jNode = $('<div class="' + gThis._GetClass('Repetition') + '"/>');
		var jDelete = $('<a href="#" class="' + gThis._GetClass('DeleteButton') + '"/>');
		jDelete.append('<img src="' + gThis._GetImage('Delete') + '" alt="' + GForm.Language.delete_repetition + '" title="' + GForm.Language.delete_repetition + '"/>');
		gThis.m_jNode.append(jDelete);
		gThis.m_jNode.append(gThis.RenderChildren());
	};
	
}, oDefaults);

/*
* STATIC LISTING
*/

var oDefaults = {
	sName: '',
	sLabel: '',
	sTitle: '',
	bCollapsible: false,
	bExpanded: true,
	oClasses: {
		sFieldClass: 'field-static-listing'
	}
};

var GFormStaticListing = GCore.ExtendClass(GFormField, function() {
	
	var gThis = this;
	
	gThis.m_jListing;
	gThis.m_jCollapseTrigger;
	gThis.m_bExpanded;
	gThis.m_bShown = false;
	
	gThis._PrepareNode = function() {
		gThis.m_bExpanded = gThis.m_oOptions.bExpanded;
		gThis.m_jNode = $('<div/>').addClass(gThis._GetClass('Field'));
		if ((gThis.m_oOptions.sLabel != undefined) && gThis.m_oOptions.sLabel.length) {
			gThis.m_jNode.append('<label>' + gThis.m_oOptions.sLabel + '</label>');
		}
		gThis.m_jListing = $('<span class="repetition"/>');
		gThis.m_jNode.append(gThis.m_jListing.empty().append(gThis._MakeListing(gThis.m_oOptions.sTitle, gThis.m_oOptions.aoValues)));
	};
	
	gThis._MakeListing = function(sTitle, aoValues) {
		var jListing = $('<div/>');
		jListing.append('<h3>' + sTitle + '</h3>');
		if (gThis.m_oOptions.bCollapsible) {
			if (gThis.m_bExpanded) {
				gThis.m_jCollapseTrigger = $('<a class="trigger" href="#">' + GForm.Language.static_listing_collapse + '</a>');
			}
			else {
				gThis.m_jCollapseTrigger = $('<a class="trigger" href="#">' + GForm.Language.static_listing_expand + '</a>');
			}
			jListing.append(gThis.m_jCollapseTrigger);
		}
		var jDl = $('<dl/>');
		if (!gThis.m_bExpanded) {
			jDl.css('display', 'none');
		}
		var iLength = aoValues.length;
		for (var i = 0; i < iLength; i++) {
			jDl.append('<dt>' + aoValues[i].sCaption + '</dt>');
			jDl.append('<dd>' + aoValues[i].sValue + '</dd>');
		}
		jListing.append(jDl);
		return jListing;
	};
	
	gThis.OnShow = function() {
		if (gThis.m_bShown) {
			return;
		}
		gThis.m_bShown = true;
		gThis._InitializeExpansion();
	};
	
	gThis.ChangeItems = function(aoItems, sTitle) {
		if (sTitle == undefined) {
			sTitle = gThis.m_oOptions.sTitle;
		}
		gThis.m_jListing.empty().append(gThis._MakeListing(sTitle, aoItems));
		if (gThis.m_bShown) {
			gThis._InitializeExpansion();
		}
	};
	
	gThis._InitializeExpansion = function() {
		if (gThis.m_jCollapseTrigger != undefined) {
			gThis.m_jCollapseTrigger.click(GEventHandler(function(eEvent) {
				gThis.m_bExpanded = !gThis.m_bExpanded;
				if (gThis.m_bExpanded) {
					gThis.m_jListing.find('dl').slideDown(300);
					gThis.m_jCollapseTrigger.text(GForm.Language.static_listing_collapse);
				}
				else {
					gThis.m_jListing.find('dl').slideUp(300);
					gThis.m_jCollapseTrigger.text(GForm.Language.static_listing_expand);
				}
				return false;
			}));
		}
	};
	
	gThis.Focus = function() { return false; };
	
}, oDefaults);

GException.Language = {
	exception_has_occured: 'Wystąpił błąd!'
};

GForm.Language = {
	form_data_invalid: 'Nie można wysłać formularza, ponieważ zawiera on niepoprawne informacje. Przed zapisaniem zmian należy je poprawić.',
	scroll_to_field: 'Przejdź do pola',
	close_alert: 'Zamknij alert',
	next: 'Dalej',
	previous: 'Wstecz',
	save: 'Zapisz',
	add_field_repetition: 'Dodaj nową wartość',
	remove_field_repetition: 'Usuń wartość',
	all_actions: 'wszystkie',
	all_controllers: 'wszystkie'
};
