
/**
* (c)opy[2007-2009] rafal.zaczynski@gmail.com :: http://baton.pop.e-wro.pl
* all tweaks by mc.baton[a]gmail.com
*/


function __collect( instance, attribute ) {}


var SKIP_EK_ELEMS_INIT_PHASE = false; // 

var Site = {
	AJAX_CLASS_NAME : 'ajax_loading',
	DYNAMIC_CONFIRMATION_POPUP_ID: 'dynaConfirmation',


	requireLoadHighlight: function( elementId ) {
		var fX = function(){
			var highlightE = $( elementId );
			if ( highlightE ) {
				highlightE.done = false;
				var prevVal = highlightE.getStyle( 'background-color' );
				if ( !prevVal ) prevVal = 'transparent';
				//var topPos = highlightE.getTop();
				//if ( topPos > 200 ) $( document.body.getParent() ).scrollTo( 0, topPos - 200 );
				highlightE.effect( 'background-color', { duration: 1000, onComplete : function() {
					if ( highlightE.done ) highlightE.setStyle( 'background-color', 'transparent' );
					else {
						this.start( 'e30000', 'FFFFFF' );
						highlightE.done = true;
					}
				} } ).start( 'FFFFFF', 'e30000' );
			}
		};
		fX.delay( 400 );
	},

	pwdReminderPopupLoaded: function() {
		var lF = document.forms['loginF'];
		var prF = document.forms['remindPasswordF'];
		if ( lF && prF ) prF.elements['userName'].value = lF.elements['userName'].value;
	},

	register: function( formE, e ) {
		formE = $( formE );
		new Event( e ).stop();
		var regBtn = $('registerBtn');
		if ( regBtn ) Site.setButtonBusy( regBtn );
		formE.ekSend( {
			evalScripts: true,
			busyIndicator: formE.getParent(),
			onComplete: function( responseValue ) {
				formE.getParent().remove();
				Site.showError( 'Email is sent to you.<br/>Follow instructions in the email.' );
			},
			onAjaxError: function() { Site.setButtonBusy( regBtn ); }
		});
		return false;
	},

	setButtonBusy: function( buttonE ) {
		if ( window.gecko ) Site._setButtonBusy( buttonE );
		else Site._setButtonBusy.delay( 50, this, buttonE );
	},
	
	_setButtonBusy: function( buttonE ) {
		buttonE = $( buttonE );
		if ( buttonE ) {
			if ( buttonE.disabled ) {
				buttonE.disabled = false;
				buttonE.value = buttonE.originalValue;
				buttonE.getParent().removeClass( 'disabled' );
				buttonE.removeClass( 'fxBtnDisabled' );
			} else {
				buttonE.disabled = true;
				buttonE.originalValue = buttonE.value;
				buttonE.value = 'please wait..';
				buttonE.getParent().addClass( 'disabled' );
				buttonE.addClass( 'fxBtnDisabled' );
			}
		}
	},
	
	
	updateStampsCount: function( newStampsCount ) {
		var label = newStampsCount + ' stamps';
		if ( newStampsCount === 0 ) label = 'No stamps!';
		else if ( newStampsCount == 1 ) label = 'Last stamp';
		$ES( '.fxStampsCounterText' ).each( function(e) { e.setHTML( label ); } );
	},
	
	
	showEventTypeDetailsPopup: function( event, type ) {
		new Event(event).stop();
		Popups.loadPopup( 'dissmissableMessage', '/public/events/event/eventType/popup/viewDetails.ek?type=' + type );
	},
	
	

	countrySelectChanged: function( inpH ) {
		if ( inpH.value ) {
			var container = Site._findParentElement( inpH, false, 'fxCountrySel' );
			if ( container ) {
				if ( inpH.value != 'US' ) container.addClass( 'fxCountrySelSuppressState' );
				else container.removeClass( 'fxCountrySelSuppressState' );
			}
		}
		return true;
	},

	toggleGender: function( aE ) {// 
		aE = $( aE );
		if ( aE ) {
			var valH = aE.getElement('input');
			var labelH = aE.getElement('span');
			if ( valH ) {
				if ( valH.value == 'm' ) {
					valH.value = 'f';
					labelH.setHTML('female');
				} else {
					valH.value = 'm';
					labelH.setHTML('male');
				}
			}
		}
		return false;
	},
	
	showUnderConstruction: function() {
		Site.showError( 'We are currently improving this feature. Thank you for understanding.' );
		return false;
	},
	
	showEventInvitationEnableConfirmPopup: function( publishedDateString ) {
		var msgId = 'ENABLE_EVENT_INVITATIONS';
		if ( publishedDateString && publishedDateString.trim().length > 0 ) msgId = 'ENABLE_EVENT_INVITATIONS_PUBLISHED';
		return Site.showOperationConfirmPopup( msgId, 'return $(\'mForm\')._save( true, \'invitationEnable\' );', 'enableInviteConfirm' );
	},
	showMakeFullEventConfirmPopup: function() {
		return Site.showOperationConfirmPopup( 'MAKE_FULL_EVENT', 'return $(\'mForm\')._save( true, \'makeFullEvent\' );', 'enableInviteConfirm' );
	},
	showActivateInvitationConfirmPopup: function() {
		return Site.showOperationConfirmPopup( 'ACTIVATE_INVITATION_FROM_RL', 'return $(\'mForm\')._save( true, \'makeFullEvent\' );', 'enableInviteConfirm' );
	},

	showOperationConfirmPopup: function( operationType, action, popupId, enforceModal ) {
		var url = '/events/event/operation/confirmation/popup.ek?';
		url += 'action=';
		if ( action ) url += encodeURIComponent( action );
		url += '&operation=';
		url += encodeURIComponent( operationType );
		if ( !popupId ) popupId = Site.DYNAMIC_CONFIRMATION_POPUP_ID;
		
		if ( enforceModal === true ) Popups.loadPopup( popupId, url, null, false, { enforceModal: true } );
		else Popups.loadPopup( popupId, url );
		
		var box = $( popupId );
		if ( box ) box.adjustAlignTopTo( document.body );
		
		return false;
	},
	
	createAddBookmarkBtn: function( url, options ) {
		if ( !url ) url = window.location.href;
		var txt = 'Bookmark this page'; // 
		if ( options && options.txt ) txt = options.txt;
		var title = 'Event Kingdom';
		if ( options && options.title ) title = options.title;
		var cId = 'fxBookmarkAddCtx';
		if ( options.containerId ) cId = options.containerId;
		var container = $( cId );
		if ( container ) {
			var atts = { 'href': url, 'id': 'bookmarkAddBtn' };
			if ( window.opera ) atts[ 'rel' ] = 'sidebar';
			var btn = new Element( 'a', atts );
			btn.injectTop( container );
			btn.onclick = function() { return Site.addBookmark( url, title ); }
			btn.setHTML( '<span>' + txt + '</span>' );
			return btn;
		}
		return false;
	},
	addBookmark: function( url, title ) {
		if ( window.sidebar ) { // Mozilla Firefox Bookmark
			window.sidebar.addPanel( title, url, "" );
		} else if( window.ie ) { // IE Favorite
			window.external.AddFavorite( url, title ); 
		} else {
			Site.showMessage( 'To bookmark this page either right click on that link and choose "Add to favorites.." ' 
				+ 'from context menu or drag this link to your favorites toolbar', true );
		}
		return false;
	},

	toCleanUrl : function ( sValue ) {
		var retV = '';
		if ( sValue && sValue.length > 0 ) {
			for ( var i=0; i<sValue.length; i++ ) { //>
				var cChar = sValue.charAt(i);
				if ( cChar >= 'a' && cChar <= 'z' 
					|| cChar >= 'A' && cChar <= 'Z' 
					|| cChar >= '0' && cChar <= '9' 
					|| cChar == '_' ) {
					retV += cChar;
				}
			}
		}
		return retV;
	},

	previewWebsitePopup : function( previewUrl, popupName ) {
		return Site._previewPopup( previewUrl, popupName, 800, 673 );
	},
	previewPopup : function( previewUrl, popupName ) {
		return Site._previewPopup( previewUrl, popupName, 900, 750 );
	},
	_previewPopup : function( previewUrl, popupName, width, height ) {
		popupName = popupName || 'ekPreview';
		var aW = Site._openPopup( previewUrl, popupName, width, height );
		var errTI = (function(){
			var msg = 'Preview shall pop up in a new browser window, but current settings of your browser do not allow this to happen. Please enable popup windows in your browser before trying preview again.';
			if ( window.gecko ) msg += '<br/>If you are using <strong>Firefox</strong> browser, please try changing the settings in menu: <strong>Tools/Options..</strong>, and then see tab <strong>Content</strong> and uncheck <strong>Block popup windows</strong> (or add our site to exceptions).';
			else if ( window.webkit ) msg += '<br/>If you are using <strong>Safari 4</strong> browser, please try changing the settings called <strong>Block Pop-up Windows</strong> in browser menu or click <strong>Ctrl+Shift+K</strong> to make it enabled right away.';
			else if ( window.ie ) msg += '<br/>If you are using <strong>Internet Explorer</strong> browser, please try changing the <strong>Pop-up blocker</strong> settings in <strong>Tools</strong> menu.';
			Site.showError( msg ); 
		}).delay( 1000 );
		if ( aW ) {
			$clear( errTI );
			aW.focus();
		}
		return false;
	},
	
	_openPopup : function( url, windowName, width, height ) {
		return window.open( url, windowName,
			'toolbar=0,location=no,directories=no,menubar=no,scrollbars=yes,status=0,resizable=1,width=' + width + ',height=' + height );
	},

	ensureVisible: function( element ) {
		element = $(element);
		if ( element ) {
			var wH = window.getHeight();
			var wST = window.getScrollTop();
			//var wSH = window.getScrollHeight();
			var eTop = element.getPosition().y;
			if ( eTop && eTop + 100 > wST + wH ) {
				window.scrollTo( 0, eTop - parseInt( wH/2 ) );
			}
		}
	},
	
	setBgSilenced: function( isSilenced ) {
		if ( isSilenced ) {
			var bE = $(document.body);
			var bgSE = Site.getBgSilencer();
			if ( bgSE ) {
				bgSE.ekVisible = true;
				var mH = Math.max( window.getHeight(), window.getScrollHeight() );
				bgSE.setStyle( 'height', mH );
				window.removeEvent( 'resize', Site.__adjustBgSilH );
				window.addEvent( 'resize', Site.__adjustBgSilH );
			}
			bE.getParent().scrollTo( 0, 0 );
			bE.addClass( 'fxBgSilenced' );
		} else {
			var bgSE = Site.getBgSilencer();
			if ( bgSE ) bgSE.ekVisible = false;
			$(document.body).removeClass( 'fxBgSilenced' );
		}
	},
	getBgSilencer: function () {
		return $('backgroundSilencer');
	},
	__adjustBgSilH: function() { //
		var bgSE = Site.getBgSilencer();
		if ( bgSE && bgSE.ekVisible ) {
			var mH = Math.max( window.getHeight(), window.getScrollHeight() );
			bgSE.setStyle( 'height', mH );
		}
	},

	toggleSearch : function( imgE, defaultState ) {
		imgE = $( imgE );
		var tabsC = $( 'tabsContainer' );
		var leftC = $( 'leftColumn' );
		if ( !$defined( tabsC.fx ) ) {
			tabsC.fx = tabsC.effect( "width", {duration:700});
			leftC.fx = leftC.effect( "width", {duration:700});
		}
		if ( !$defined( imgE.shrinked ) ) {
			imgE.shrinked = defaultState;
		}
		
		if ( imgE.shrinked ) { // shrink columns - search is shrinked
			imgE.shrinked = false;
			tabsC.fx.start( 700 );
			leftC.fx.start( 708 );
		} else {
			imgE.shrinked = true;
			tabsC.fx.start( 880 );
			leftC.fx.start( 924 );
		}
	},

	/**
	 * cuts too long text in text areas - may fail on paste event
	 * assign to onkeypress, onkeydown and onkeyup
	 */
	cutTooLong : function ( event, element, maxLength ) {
		event = new Event( event );
		if ( ['up', 'down', 'left', 'right', 'backspace', 'delete'].contains( event.key ) ) return true;
		if ( element.value.length >= maxLength ) {
			element.value = element.value.substr( 0, maxLength );
			return false;
		}
		return true;
	},

	/** synchronize L[etter] A[ddressing] T[ab] P[ersonal]C[ontact] Name */
	synchLATPCName : function( fNE, lNE, nCE ) { // firstNameElement, lastNameElement, nameCopyElement
		nCE = $( nCE );
		if ( nCE ) {
			fNE = $( fNE );
			lNE = $( lNE );
			if ( fNE && lNE ) {
				nCE.setHTML( fNE.value + " " + lNE.value );
			}
		}
	},

	/**
	 * m[ain]t[ab]Click - linked on main tabs
	 */
	mtClk : function( url ) {
		document.location = url;
	},


	/**
	 * t[ab]Click - linked on tabs
	 */
	tClk : function( url ) {
		document.location = url;
	},


	/**
	 * a[link]Click
	 */
	aClk : function( url ) {
		document.location = url;
	},


	setBusy : function( isBusy ) {
		if ( BUSY_INDICATOR ) {
			if ( isBusy ) BUSY_INDICATOR.addClass( Site.AJAX_CLASS_NAME );
			else BUSY_INDICATOR.removeClass( Site.AJAX_CLASS_NAME );
		}
	},

	setPopupBusy : function( popupId ) {
		var popup = $( popupId );
		if ( popup && popup.setBusy ) popup.setBusy( true );
	},

	_addParam: function( url, param, value ) {
		if ( value ) {
			var hasParams = (url.indexOf( '?' ) != -1);
			return url + ( hasParams ? '&' : '?' ) + param + '=' + value;
		} else return url;
	},


	/** */
	go2 : function ( vForm, action, additionalParams ) {
		
		if ( $type( vForm ) == 'string' ) vForm = document.forms[ vForm ];
		else {
			if ( $defined( vForm["form"] ) ) {
				vForm = vForm.form; // the vForm is an input element otherwise
			} else { // find wrapping form
				vForm = Site._findParentElement( vForm, 'form' );
			}
		}
		
		if ( $defined( action ) ) vForm.elements[ 'action' ].value = action;

		if ( $defined( additionalParams ) && $type( additionalParams ) == 'object' ) {
			for ( var property in additionalParams ) {
				if ( $defined( vForm.elements[ property ] ) ) {
					vForm.elements[ property ].value = additionalParams[ property ];
				} else {
					var fE = new Element( 'input', 
						{ 	'type':'hidden', 'name':property, 
							'value':additionalParams[ property ] } );
					fE.injectInside( vForm );
				}
			}
		}
		
		if ( vForm ) vForm.submit();
		return false; // do not follow the link clicked
	},
	

	mAR : function( url, options ) { // 
		options = options || {};
		var updateBox = null;
		if ( $defined( options ) && $defined( options.updateBox ) ) {
			updateBox = $( options.updateBox );
		}
		var sendOpts = $merge( {
			update : updateBox,
			busyIndicator : updateBox,
			onComplete: function( responseValue ) {
				if ( updateBox ) { // 
				} else {
					//
					Site.showMessage( responseValue.clean() );
				}
			}
		}, options ); 
		new EkAjax( url, sendOpts ).request();
	},
	
	
	
	/**
	 * p[review]U[ser]
	 */
	pU : function( userProfileId ) {
		var url = '/contacts/previewUser.ek?userProfileId=' + userProfileId;
		Site.aClk( url );
	},
	
	
	/**
	 * ajax functionality that triggers removal of a contact with no reload of underlying contacts list 
	 */
	deleteContact : function( contactId ) {
		var url = '/contacts/deleteContact.ek?contactId=' + contactId;
		return Site._removeContactFromListJson( url, contactId );
	},


	/**
	 * ajax functionality that triggers disconnection of a contact with no reload of underlying contacts list 
	 */
	disconnectContact : function( contactId ) {
		var url = '/contacts/network/disconnectContact.ek?contactId=' + contactId;
		return Site._removeContactFromListJson( url, contactId );
	},


	_removeContactFromListJson : function( url, contactId ) {
		if ( contactId && contactId > 0 ) {
			var request = new EkJson( url, {
				onComplete: function( jsonObj ) {
					if ( jsonObj.success ) {
						IHovers._I.removeContact( contactId );
						// try to update "cLen" label containing current contacts length
						var cLen = $('cLen');
						if ( cLen ) {
							var cC = parseInt( cLen.innerHTML );
							if ( $type( cC ) == 'number' && cC > 0 ) {
								cLen.setHTML( cC - 1 );
							}
						}
					}
				}
			}).send();
		}
		return false;
	},
	
	
	
	/**
	 * sends a form embedded in specified element and reloads the contents of that element from response (if not options.reload=false)
	 */
    sendContent : function( containerId, options ) {
		var eBox = $( containerId );
		var form = eBox.getElement( 'form' ); // take form embeded in popup
		eBox.addClass( 'ajax_loading' );
		if ( $defined(options) && $defined( options.form ) ) form = options.form; 
		if ( !form ) Site.showError( "No form found" ); // FIXME - use translated message

		// 
		var opts = {
			onComplete: function( responseValue ) {
				eBox.removeClass( 'ajax_loading' );
			   	if ( !$defined(options) || !$defined( options.reload ) || options.reload == false){
			  		 Site.showMessage(responseValue);
				}
				
			},
			onFailure: function() {
				eBox.removeClass( 'ajax_loading' );
				Site.showError( 'Error loading popup contents' );
			}
		};
				
		if ( $defined(options) && $defined( options.reload ) && options.reload == true){
		   opts.update = eBox;
		}

		if ( $defined( options ) ) {
			opts = $merge.apply( null, [opts, options] );
		}
		if ( $defined( opts.url ) ) form.action = opts.url; // switch url if defined
		if ( $defined( opts.action ) ) form.elements['action'].value = opts.action;
		
		form.send( opts );
		return false;
	},

	/**
	 * Makes a popup visible using positioningE for positioning of a popup
	 */
	showPopup : function( positioningE, popupId ) {
		positioningE = $( positioningE );
		var box = $( popupId );
		box.setStyles( { 'top' : (positioningE.getTop() - 24), 'left' : (positioningE.getLeft() - 50), 'display' : 'block' } );
		return false;
	},


	
	showPopupCentered : function( popup, modal, alignTo, clearContentsOnPopupClose ) {
		//if ( $type( popup ) == 'string' )
		var box = $( popup );
		if ( $defined( clearContentsOnPopupClose ) ) box.clearContentsOnPopupClose = clearContentsOnPopupClose;
		else box.clearContentsOnPopupClose = false; // by default do not clear popup contents

		box.enforceModal = !!modal;
		Popups._initApi( popup, box );

		box.recallInitialPosition();

		/* if ( modal ) {
			//var lC = $( 'contents' );
			//var shades = $( 'leftColumn' ); // make alpha 0.5
			//box.injectTop( lC );
		}*/
		box.showMe();
		
		//if ( alignTo ) box.adjustAlignTopTo( $( alignTo ) );
		//else 
		Popups._autoAdjustTopOnContentChange( box );
		
		return false;
	},


	toggleClassSuffix : function( el, cN, cS ) { // cN - class name; cS - class suffix
		if ( el.hasClass( cN ) ) {
			el.addClass( cN + cS );
			el.removeClass( cN );
		} else if ( el.hasClass( cN + cS ) ) {
			el.addClass( cN );
			el.removeClass( cN + cS );
		}
	},






	getListSelectionCount : function( listContainer, warnIfZero, options ) {
		var selectionCount = 0;
		if ( options && options.selectionDelta ) selectionCount += options.selectionDelta;
		listContainer = $( listContainer );
		Site.doOnListSelectedRows( listContainer, function(e) { selectionCount++; });
		var messageText = 'Nothing is selected.<br/>Please use the checkboxes on the left side of list to select.';
		if ( options.messageText ) messageText = options.messageText;
		if ( selectionCount == 0 && warnIfZero ) {
			Site._showError( messageText, options, 'noSelectionMsg' );
		}
		return selectionCount;
	},
	doOnListSelectedRows : function( listContainer, callF ) {
		if ( listContainer && callF ) {
			if ( listContainer.hasClass( 'fxBrowserDefaultCheckBoxes' ) ) {
				var formE = Site._findParentElement( listContainer, 'form' );
				if ( formE ) { 
					var eiA = $( formE ).elements;
					var eiC = eiA.length;
					for ( var eI=0; eI<eiC; eI++ ) {
						var e = eiA[ eI ];
						if ( e.className != 'listS' ) continue;
						//$ES( 'div.listSelection input', listContainer ).each( function(e) {
						if ( e.checked ) callF( e );
					}
				}
			} else {
				$ES( 'div.listSelection div.checkB', listContainer ).each( function(e) {
					if ( e.inputElement && e.inputElement.checked ) callF( e );
				});
			}
		}
	},

	clearListSelection : function( listContainer ) {
		if ( listContainer ) {
			if ( listContainer.hasClass( 'fxBrowserDefaultCheckBoxes' ) ) {
				var formE = Site._findParentElement( listContainer, 'form' );
				if ( formE ) { 
					var eiA = $( formE ).elements;
					var eiC = eiA.length;
					for ( var eI=0; eI<eiC; eI++ ) {
						var e = eiA[ eI ];
						if ( e.className != 'listS' ) continue;
						//$ES( 'div.listSelection input', listContainer ).each( function(dC){
						e.checked = false;
					}
				}
			} else {
				$ES( 'div.listSelection div.checkB', listContainer ).each( function(dC){
					dC.inputElement.setChecked( false );
				});
			}
		}
	},
	

	/**
	 * 
	 */
	doListActionWithReload : function( buttonE, lContainer, action, options ) {
		// check if anything is selected
		var selectionCount = 0;
		if ( !options ) options = {};
		if ( options.noSelectionCheck ) {
			if ( options.selectionDelta ) selectionCount = 0;
			else selectionCount = 1;
		} else {
			selectionCount = Site.getListSelectionCount( lContainer, true, options );
		}
		if ( options.selectionDelta ) selectionCount += options.selectionDelta;
		
		if ( selectionCount > 0 ) {
			
			var busyIndicator = lContainer;
			if ( options && options.busyIndicator ) {
				busyIndicator = options.busyIndicator;
			}
			// find form to be submitted
			var aF = null;
			if ( $defined( buttonE.form ) ) aF = $( buttonE.form );
			else aF = Site._findParentElement( buttonE, 'form' );
			if ( !aF && options && options.formId ) aF = $( options.formId );
			
			busyIndicator.addClass('ajax_loading');
			
			// remember prev action..
			var prevA = aF.elements['action'].value;
			
			var updateE = lContainer;
			if ( options && options.noUpdate ) {
				updateE = null;
			}
			
			aF.elements['action'].value = action; // set action
			aF.send({ // 
				update: updateE,
				evalScripts: true,
				onComplete: function( responseValue ) {
					busyIndicator.removeClass('ajax_loading');
					aF.elements['action'].value = prevA; // set default action again
					if ( updateE ) {
						Site._initCheckboxes( lContainer ); // init any checkboxes within new contents
					} else {
						Site.clearListSelection( lContainer );
					}
					if ( $defined( options ) && $defined( options.onComplete ) ) options.onComplete();
				},
				onFailure: function() {
					busyIndicator.removeClass('ajax_loading');
					Site._showError( 'Error submitting ajax request', options, 'ajaxErrorMsg' );
					aF.elements['action'].value = prevA; // set default action again
				}
			});
		}
	},


	_showError : function ( defaultMsg, options, property ) {
		var msg = defaultMsg;
		if ( $defined( options ) ) {
			if ( $defined( options[ property ] ) ) {
				msg = options[ property ];
			}
		} 
		Site.showError( msg );
	},



	_forceBoxAlwaysVisible : function( eBox ) { // eBox must be visible already
		var scrollT = window.getScrollTop();

		if ( $defined( eBox.origTop ) ) { // recall original margin
			eBox.setStyle( "margin-top", eBox.origTop );
		}

		if ( scrollT > 0 ) {
			if ( !$defined( eBox.origTop ) ) { // remember original margin - must be visible to get proper value
				eBox.origTop = parseInt( eBox.getStyle( "margin-top" ) );
			}
			Popups._autoAdjustTopOnContentChange( eBox );
			/*var newTop = scrollT;
			var canvH = window.getHeight();
			newTop = eBox.origTop + newTop;
			eBox.setStyle( "margin-top", parseInt( newTop ) );*/
		}
	},

	_showMessagesInContainer : function( msg, containerId, fadeTimeout ) {
		var eBox = $( containerId );
		if ( !eBox ) { // create box popup for messages
			eBox = new Element( "div", { "id":containerId } );
			eBox.setHTML( '<img onclick="$(\'' + containerId + '\').close()" ' +
				'src="/img/lyt/ic_close-popup.gif" ' +
				'class="fR popupClose"/><div class="container"><div>' + msg + '</div></div>' );
			//eBox.addEvent( 'click', function(){ eBox.close(); } );
			eBox.close = function() {
				eBox.setStyle( "display", "none" );
				if ( eBox.fxFade && eBox.fxFade.stop ) eBox.fxFade.stop( true );
				eBox.fxFade = null;
			}
			eBox.inject( document.body );
			eBox.setStyle( 'opacity', 1 );
			Site._forceBoxAlwaysVisible( eBox ); // must be AFTER is shown
		} else {
			var msgB = new Element( "div" );
			var eBoxContainer = eBox.getElement( 'div.container' );
			eBoxContainer.empty(); // clear server side/previous contents
			msgB.setHTML( msg );
			msgB.inject( eBoxContainer );
			eBox.setStyle( 'opacity', 1 );
			eBox.setStyle( "display", "block" );
			Site._forceBoxAlwaysVisible( eBox ); // must be AFTER is shown
		}
		
		if ( fadeTimeout ) { // fade out msg popup
			Site._initFade( eBox, fadeTimeout );
		}
	},
	showError : function( msg ) {
		Site._showMessagesInContainer( msg,'errors' );
	},
	showMessage : function( msg, fadeOut ) {
		if ( fadeOut ) Site._showMessagesInContainer( msg,'messages', Site.DEFAULT_MSG_FADE_TIMEOUT );
		else Site._showMessagesInContainer( msg,'messages' );
	},
	_initFade: function ( eBox, fadeTimeout ) {
		if ( !fadeTimeout ) fadeTimeout = Site.DEFAULT_MSG_FADE_TIMEOUT;
		if ( eBox.fxFade && eBox.fxFade.stop ) eBox.fxFade.stop( true );
		eBox.fxFade = eBox.effect( 'opacity', { onComplete: function() { if ( eBox.close ) eBox.close(); } });
		eBox.fxFade.start.delay( fadeTimeout * 1000, eBox.fxFade, [ 1, 0 ] );
	},
	_initMsgFadeOnLoad: function() { //
		var eBox = $( 'messages' );
		if ( eBox ) Site._initFade( eBox );
	},




	prepareFormValidation : function( formId, saveBtnId, defaultValidation, validateF ) {
		var f = $(formId);
		f._validate = defaultValidation;

		f.validate = function ( f ) {
			if ( f._validate ) {
				if ( $defined( validateF ) ) {
					return validateF( f );
				}
			}
			return true;
		};
		
		f.addEvent( 'submit', function(e) {
			Site.setBusy( true );
			var v = f.validate( f );
			if ( !v ) {
				Site.setBusy( false );
				new Event(e).stop(); // stop normal submit propagation
			}
		});
		
		f._save = function( doValidate, tabDispatch, anchorName ) {
			if ( $defined( doValidate ) ) {
				f._validate = doValidate;
			}
			if ( $defined( tabDispatch ) ) {
				f.elements[ 'tabDispatch' ].value = tabDispatch;
			}
			if ( anchorName ) {
				var cA = f.getAttribute( 'action' );
				if ( cA.indexOf('#') == -1 ) {
					cA += '#' + anchorName;
					f.setAttribute( 'action', cA );
				}
			}
			f.elements[ saveBtnId ].click();
			return false;
		};
	},
	
	
	/** document initialization method added for all documents within domready event */
	init : function() {

		BrowserFeatures.refresh();
		
		Site._initNewElements( document );
		Site._initComboSelectors( document );
		Site._initMsgFadeOnLoad();
		
		// create main hover menu
		new MainHOverMenu( $$('#mtHolder a.mainTab') );
		//
		var eP = $('errors');
		if ( eP && eP.getStyle('display') != 'none' ) Site._forceBoxAlwaysVisible( eP );
		
		//
		Site.ShadowTabs._preselectOnAnchor();
	},

	
	/** called when new popup is loaded into dom */
	_initNewElements : function( container ) {

		if ( SKIP_EK_ELEMS_INIT_PHASE ) {
			SKIP_EK_ELEMS_INIT_PHASE = false;
			return;
		}
		
		//var _tx = (new Date()).getTime();
		// initialize all input fields/textareas focus handling
		var eh = function(e){e.toggleClass('focused')}
		var fX = function( eX ) {
			eX.addEvent( 'focus', function(){eh(eX)} );
			eX.addEvent( 'blur', function(){eh(eX)} );
		};
		$ES( 'input.text', container ).each( fX );
		$ES( 'textarea', container ).each( fX );

		// initialize tooltips - but only in new content
		var qTips = new Tips( $ES( '.question', container ), { className:'tooltip', fixed:false } );

		//init all checkboxes
		Site._initCheckboxes();
		Site._initSelectboxes(container);
		//alert( (new Date()).getTime() - _tx );
	},
	
	
	_initComboSelectors : function( container ) {
		$ES( 'ul.smallCombo', container ).each( function( ul ) {
			var lSel = ul.getElement( 'li.selector' );
			var _BG_C = ul.hasClass( 'actionButton' ) ? '#FFFFFF' : '#F1EECC';
			var _BG_ACTIVE_C = '#D5AC20';
	
			var list = ul.getElements( 'li div.selection' );
			list.each( function( element ) {
				var fx = element.effect( 'background-color', { duration: 200, wait: false });
				element.addEvent( 'mouseenter', function() { fx.start( _BG_ACTIVE_C ); });
				element.addEvent( 'mouseleave', function() { fx.start( _BG_C ); });
				element.addEvent( 'click', function() { ul.toggle(); }.bind( element ) );
			});
	
			ul.rolled = false;
			
			ul.toggle = function() {
				//if ( ul.rolled ) { fx.start( _SEL_H ); } 
				//else { fx.start( _MAX_H + _SEL_H ); }
				//lSel.toggleClass('down');
				ul.toggleClass( 'down' );
				ul.rolled = !ul.rolled;
			};
			lSel.addEvent('click', ul.toggle);
		});
	},
	
	
	_initCheckboxes : function( container ) {
		var divChecks = $ES( 'div.checkB', container );
		divChecks.each( function(dC) {
			dC.inputElement = dC.getElement( 'input' );
			if ( dC.inputElement.checked ) {
				dC.addClass( 'selected' );
			}
			
			if ( dC.inputElement.disabled ) {
			    if( dC.hasClass( 'selected' ) )
			    	dC.addClass( 'selected_chBdisabled' );
			    else 
			        dC.addClass( 'chBdisabled' );
			    
			}
			
			dC.inputElement.setChecked = function( state ){
				if ( dC.inputElement.disabled ) return;
				dC.inputElement.checked = state;
				if ( state ) dC.addClass( 'selected' );
				else dC.removeClass( 'selected' );
			};
			dC.inputElement.toggleChecked = function() {
				dC.inputElement.setChecked( !dC.inputElement.checked );
			};
			

			dC.inputElement.setDisabled = function( state ){
				dC.inputElement.disabled = state;
				if ( state ) {
					if( dC.hasClass( 'selected' ) )
						dC.addClass( 'selected_chBdisabled' );
					else
						dC.addClass( 'chBdisabled' );
						 
				} else {
					if( dC.hasClass( 'selected_chBdisabled' ) )
					   	dC.removeClass( 'selected_chBdisabled' );
					else if( dC.hasClass( 'chBdisabled' ) )
						dC.removeClass( 'chBdisabled' );
				}
			};
		});
	},
	
	_initSelectboxes : function(container){
	
		var selectboxes = $ES('div.elsel',container);
		
		selectboxes.each(function(sb){
			Selectbox.initApi(sb);		
		});
	
	},
	

	// 
	_focusFirstInput : function( containerE ) {
		var inps = $(containerE).getElements( 'input[type!=hidden]' );
		if ( inps && inps.length > 0 ) {
			//inps = inps.filterByAttribute( 'type', '==', 'checkbox' ); //
			for ( var fEI = 0; fEI < inps.length; fEI++ ) {
				var fE = inps[ fEI ];
				if ( !fE.disabled ) {
					if ( fE.type == 'checkbox' && !Site.__checkIfHidden( fE.getParent() ) ) return;
					if ( fE.focus && !Site.__checkIfHidden( fE ) ) {
						fE.focus();
						return fE;
					}
				}
			}
		}
	},
	
	__checkIfHidden : function( startE ) {
		for ( var e = $(startE); e.getTag() != 'body'; e = e.getParent() ) {
			if ( e.getStyle( 'visibility' ) == 'hidden' 
				|| e.getStyle( 'display' ) == 'none' ) {
				return true;
			}
			if ( e.getTag() == 'div' ) { // 
				var dS = e.getSize();
				if ( dS && dS.size ) {
					if ( dS.size.x <= 2 || dS.size.y <= 2 ) return true;
				}
			}
		}
		return false;
	},
	
	
	
	chkClicked : function( check ) {
		check = $( check );
		if(!check.hasClass( 'chBdisabled' ) && !check.hasClass( 'selected_chBdisabled' ) ){
			if ( !check.hasClass( 'selected' ) ) {
				check.inputElement.setChecked( true );
			} else {
				check.inputElement.setChecked( false );
			}
		}
		return false;
	},
	
 
	checkUncheckAll : function( dC, formId, selector, forceState, checkboxValue ) {
		if ( !$defined( formId ) ) { // find first wrapping form
			formId = Site._findParentElement( dC, 'form' );
		}
		var checkboxValueEqualityRequired = $defined( checkboxValue );
		if ( formId ) {
			if ( dC && $(dC).getTag()=='input' ) {
				var _setStateTo = dC.checked;
				var eiA = $(formId).elements;
				var eiC = eiA.length;
				for ( var eI=0; eI<eiC; eI++ ) {
					var e = eiA[ eI ];
					if ( !checkboxValueEqualityRequired && e.className != 'listS' ) continue;
					if ( e.disabled || ( e.ekInvisible == true ) ) continue;
					if ( dC == e ) continue; //
					if ( checkboxValueEqualityRequired && e.value != checkboxValue ) continue;
					
					if ( $defined( forceState ) ) e.checked = forceState; //
					else e.checked = _setStateTo; //
				}
			} else {
				var sExpr = 'input[type=checkbox]';
				if ( $defined(selector) ) sExpr = selector;
				$ES(sExpr,formId).each( function(e) {
					if ( dC && dC.inputElement == e ) return; //
					
					if ( $defined( forceState ) ) e.setChecked( forceState ); //
					else e.setChecked( !dC.inputElement.checked ); //
				});
			}
		}
	},
	
	_toggleRowChBox: function( rowE ) {
		rowE = $(rowE);
		if ( rowE ) {
			var chbX = rowE.getElement('input[type=checkbox]');
			if ( chbX ) {
				if ( chbX.toggleChecked ) chbX.toggleChecked();
				else chbX.checked = !chbX.checked;
			}
		}
	},
	_toggleRowRadio: function( rowE ) {
		rowE = $(rowE);
		if ( rowE ) {
			var chbX = rowE.getElement('input[type=radio]');
			if ( chbX ) chbX.checked = !chbX.checked;
		}
	},
	
	__findKeyForValue: function( kVO, value ) {
		if ( kVO ) {
			for ( var key in kVO ) {
				var val = kVO[ key ];
				if ( val == value ) return key;
			}
		}
		return null;
	},
	
	_findParentElement : function( startElement, elementTagName, className ) { //
		for ( var e = $(startElement); e && e.getTag && e.getTag() != 'body'; e = e.getParent() ) {
			if ( !e ) break;
			if ( elementTagName ) {
				if ( e.getTag() == elementTagName ) {
					if ( $defined( className ) ) {
						if ( e.hasClass( className ) ) {
							return e;
						}
					} else {
						return e;
					}
				}
			} else {
				if ( $defined( className ) ) {
					if ( e.hasClass( className ) ) {
						return e;
					}
				}
			}
		}
		return false;
	},
	
	
	toggleButtonValue : function( button, altValueId) {
		var b = $(button);
		var alt = $(altValueId);
		var prevV = b.value;
		b.value = alt.getText();
		alt.setHTML(prevV);
	}
	
};
Site.DEFAULT_MSG_FADE_TIMEOUT = 5; // in seconds



var BrowserFeatures = { 
	supportsPopupsModality: true,
	
	refresh: function() {
		try {
			if ( !top.BrowserDetect ) return;
			
			if ( top.BrowserDetect.browser == "Firefox" && top.BrowserDetect.version <= 2 ) {
				BrowserFeatures.supportsPopupsModality = false;
			}
		} catch ( ex ) {}
	}
};



Site.Gui = {
	_CSS_ACTIVATION_CONTEXT_CLASS : 'fxElementActivationCtx',
	_CSS_ACTIVATION_ELEMENT_CLASS : 'fxActivationElement',
	_CSS_AUTO_CHECK_RADIO_ON_EDIT_CTX : 'fxAutoCheckRadioOnEditCtx',
	_CSS_ACTIVATION_ACTIVE_ELEMENT_CLASS : 'active',
	
	
	
	preCheckRadioOnEdit: function( inputE ) {
		inputE = $(inputE);
		if ( inputE ) {
			var ctxE = Site._findParentElement( inputE, false, Site.Gui._CSS_AUTO_CHECK_RADIO_ON_EDIT_CTX );
			if ( ctxE ) {
				var radioE = ctxE.getElement( 'input[type=radio]' );
				if ( radioE ) radioE.checked = true;
			}
		}
	},
	
	centerAbsE: function( eId ) {
		var eToCenter = $( eId );
		if ( eToCenter && !eToCenter.hasClass( 'fxCentered' )) {
			eToCenter.addClass( 'fxCentered' );
			var ltS = eToCenter.getSize().size.x;
			var fxRS = function() {
				var wW = window.getWidth();
				var fxEIdE = $( eId );
				if ( fxEIdE ) fxEIdE.setStyle( 'margin-left', Math.floor(( wW - ltS ) / 2) + 1 );
				else window.removeEvent( 'resize', arguments.callee );
			}
			window.addEvent( 'resize', fxRS );
			fxRS();
		}
	},
	
	activateSelector: function( newActiveE, findFirstParent, familyClass ) {
		if ( findFirstParent ) newActiveE = Site._findParentElement( newActiveE, false, ( familyClass ? familyClass : Site.Gui._CSS_ACTIVATION_ELEMENT_CLASS ) );
		if ( newActiveE ) {
			var contextE = Site._findParentElement( newActiveE, false, Site.Gui._CSS_ACTIVATION_CONTEXT_CLASS );
			if ( contextE ) {
				contextE.getElements( '.' + ( familyClass ? familyClass : Site.Gui._CSS_ACTIVATION_ELEMENT_CLASS ) ).each( function( aE ) {
					aE.removeClass( Site.Gui._CSS_ACTIVATION_ACTIVE_ELEMENT_CLASS );
				});
				newActiveE.addClass( Site.Gui._CSS_ACTIVATION_ACTIVE_ELEMENT_CLASS );
			}
		}
	},
	

	initScroller: function( containerE ) {
		//
		var _AUTOSTART_TIMEOUT = 550; // 
		fX = function( eX ) {
			var _AX = 0;
			eX.autoAnim = true;
			eX.addEvent( 'mouseover', function() { $clear( _AX ); eX.autoAnim = false; } );
			eX.autoAnimScrollDelta = 1;
			var L = function() {
				if ( this.autoAnim && $type( this.getSize ) == 'function' ) { //
					var s = this.getSize();
					var _oaasd = this.autoAnimScrollDelta;
					if ( s.scroll.x >= s.scrollSize.x - s.size.x - 10 ) this.autoAnimScrollDelta = -1;
					this.scrollTo( s.scroll.x + this.autoAnimScrollDelta, s.scroll.y );
					if ( s.scroll.x + this.scrollDelta <= 0 ) this.autoAnimScrollDelta = 1;
					L.delay( 25, this );
				}
			};
			var _axL = function() {
				this.autoAnim = true;
				this.autoAnimScrollDelta = 1;
				L.bind(this)();
			};
			eX.autostartTease = _axL.bind( eX );
			eX.addEvent( 'mouseout', function() { $clear( _AX ); _AX = _axL.delay( _AUTOSTART_TIMEOUT, eX ); } );
			_AX = L.delay( _AUTOSTART_TIMEOUT, eX );
		};
		$ES( 'div.fxTeaserHScroll', containerE ).each( fX );
	},

	vertScroller: function( e, el, margin, switchOff, triggerRun ) {
		var event = new Event( e );
		element = $( el );
		if ( !element.s ) element.s = element.getSize();
		if ( !element.p ) element.p = element.getPosition();
		var s = element.s;
		var p = element.p;
		
		if ( !margin ) margin = parseInt( s.size.x / 3 );
		
		var mPos = (event.page.x-p.x);
		if ( switchOff ) element.scrollDelta = 0;
		else {
			var maxScroll = 8;
			var strength = 0;
			var multiplicator = 1;
			if ( s.size.x - mPos < margin ) {
				strength = 1 - ( s.size.x - mPos - 1 ) / margin;
			} else if ( mPos < margin ) {
				strength = 1 - mPos / margin;
				multiplicator = -1;
			}
			if ( strength > 0 ) {
				strength = parseInt( Math.round( 1 + strength * maxScroll ) ) * multiplicator;
				triggerRun = true;
			} else strength = 0;
			
			element.scrollDelta = strength;
		}
		
		if ( triggerRun && !element.running ) {
			element.running = true;
			Site.Gui._runVScroll.bind( element )();
		}
	},
	_runVScroll: function() {
		if ( $type( this.getSize ) == 'function' ) { //
			var s = this.getSize();
			
			var step = 3;
			if ( this.scrollDelta > 0 ) this.scrollTo( s.scroll.x + step, s.scroll.y );
			else if ( this.scrollDelta < 0 ) this.scrollTo( s.scroll.x - step, s.scroll.y );
				
			step = Math.abs( parseInt( 40 / this.scrollDelta ) );
			if ( this.scrollDelta != 0 ) Site.Gui._runVScroll.delay( step, this );
			else element.running = false;
		}
	}
};




//
Site.Gui.EmptyField = {
	onFocusBg: function( thisE ) {
		$( thisE ).removeClass('fxEmpty');
		return true;
	},
	onBlurBg: function( thisE ) { return Site.Gui.EmptyField._onBlurChangeBg( thisE ); },
	onChangeBg: function( thisE ) { return Site.Gui.EmptyField._onBlurChangeBg( thisE ); },
	
	_onBlurChangeBg: function( thisE ) {
		thisE.value.trim().length == 0 ? $(thisE).addClass('fxEmpty') : $(thisE).removeClass('fxEmpty')
		return true;
	},
	
	onFocus: function( thisE ) {
		thisE = $( thisE );
		if ( thisE ) {
			if ( thisE.hasClass('fxEmpty') ) {
				if ( !thisE.ekEmptyLabel ) thisE.ekEmptyLabel = thisE.value;
			}
			if ( thisE.value == thisE.ekEmptyLabel ) thisE.value = '';
			thisE.removeClass('fxEmpty');
		}
		return true;
	},
	onBlur: function( thisE ) {
		thisE = $( thisE );
		if ( thisE ) {
			if ( thisE.value.trim().length == 0 ) {
				thisE.addClass('fxEmpty');
				if ( thisE.ekEmptyLabel ) thisE.value = thisE.ekEmptyLabel;
			}
		}
		return true;
	}
};






var HelpManager = {
	show: function( msgId, localeKey ) {
		var url = '/ajax/helpMessage/load.ek?msgId=' + msgId;
		if( localeKey ) {
			url += "&localeKey=" + localeKey;
		}
		Popups.loadPopup( 'dissmissableMessage', url );
		var windowScroll = window.getScrollTop();
		if ( windowScroll > 0 ) {
			var popup = $( 'dissmissableMessage' );
			if ( popup ) {
				var pTopM = popup.getStyle( "margin-top" ).toInt();
				popup.setStyle( "margin-top", pTopM + windowScroll );
			}
		}
		return false;
	}
};



var UserSettings = {
	MAX_COOKIE_AGE: 365*5,
	PENDING_DISMISSABLE_MESSAGES: [],
	
	showDismissableMessagePopup: function( msgId, suppressCheckbox, localeKey ) {
		var url = '/ajax/dissmissableMessage/load.ek?msgId=' + msgId;
		if ( suppressCheckbox === true ) url += '&suppressCheckbox=1';
		if ( localeKey ) url += '&localeKey=' + localeKey;
		Popups.loadPopup( 'dissmissableMessage', url );
		var windowScroll = window.getScrollTop();
		if ( windowScroll > 0 ) {
			var popup = $( 'dissmissableMessage' );
			if ( popup ) {
				var pTopM = popup.getStyle( "margin-top" ).toInt();
				popup.setStyle( "margin-top", pTopM + windowScroll );
			}
		}
		return false;
	},
	
	addPendingDismissableMessage: function( messageIdx ) {
		if ( !UserSettings.PENDING_DISMISSABLE_MESSAGES.contains( messageIdx ) )
			UserSettings.PENDING_DISMISSABLE_MESSAGES.push( messageIdx );
	},
	
	showDismissableMessagePopupIfPending: function( messageIdx, localeKey ) {
		if ( UserSettings.PENDING_DISMISSABLE_MESSAGES.contains( messageIdx ) ) {
			var url = '/ajax/dissmissableMessage/remove.ek?msgIdx='+messageIdx;
			if ( localeKey ) url += '&localeKey=' + localeKey;
			new EkAjax( url ).request();
			return UserSettings.showDismissableMessagePopup( messageIdx );
		}
	},
	
	toggleDisposeChbox: function( chkBox, msgId, userId ) {
		var cI = 'ekus.0.' + userId;
		var cV = Cookie.get( cI );
		if ( !cV ) cV = '-1';
		var cvA = cV.split('.');
		var cvNewArr = [];
		for ( var i=0; i<cvA.length; i++ ) {
			var currV = '' + cvA[ i ];
			if ( currV == '' ) continue;
			if ( !cvNewArr.contains( currV ) ) cvNewArr.push( currV );
		}
		if ( chkBox.checked ) {
			if ( !cvNewArr.contains( msgId ) ) cvNewArr.push( msgId );
		} else cvNewArr.remove( msgId );
		
		if ( cvNewArr.length == 0 ) cVN = '-1';
		else cVN = cvNewArr.join('.');
		Cookie.set( cI, cVN, { 'path': '/', duration: UserSettings.MAX_COOKIE_AGE } );
	}
};




Site.Pinger = {
	_PING_TIMER : null,
	ping: function( uId ) {
		var url = '/pingSession.ek?f='+uId;
		if ( window.ie ) url += '&tx=' + ((new Date()).getTime());
		new EkJson( url, {
			onComplete: function( rJ ) {}
		}).send();
	},
	bind: function( uId ) {
		if ( uId && !Site.Pinger._PING_TIMER ) { //
			Site.Pinger._PING_TIMER = Site.Pinger.ping.periodical( 1000 * 60 * 9, null, uId ); // 
		}
	},
	delay: function() {
		Site.Pinger._PING_TIMER = $clear( Site.Pinger._PING_TIMER );
		Site.Pinger.bind();
	}
};










// some global variables
Site.IS_ERROR_IN_AJAX = false;
IS_EK_PUBLIC_PAGE = false;
IS_EK_LOGGED_OUT = false;



//
var EkJson = Json.Remote.extend({

	initialize: function(url, options){
		this.addEvent( 'onComplete', this.processMessages );
		this.addEvent( 'onFailure', this.processFailure );
		this.parent( url, options );
	},

	processMessages: function( jsonObj, secure ){
		if ( jsonObj.message ) Site.showMessage( jsonObj.message, true );
		if ( jsonObj.error ) Site.showError( jsonObj.error );
	},
	
	processFailure : function( request ) {
		Site.showError( 'Error submitting ajax request' );
	}

});



//
var EkAjax = Ajax.extend({
	
	initialize: function( url, options ){
		this.addEvent( 'onEkComplete', this.onEkComplete ); // fire our event and from there fire normal onComplete
		this.addEvent( 'onFailure', this.processFailure );
		this.addEvent( 'onRequest', this.setBusy );
		
		//
		this.parent( url, options );
		//
		//this.addEvent( 'onSuccess', this.processSuccess );
		
		this.SESS_COOKIE = 'JSESSIONID';
	},
	send: function(url, data){ //
		if ( !data ) this.setOptions({method: 'get'}); //
		if ( window.ie ) {
			if ( url.indexOf( '?' ) != -1 ) url += '&';
			else url += '?';
			url += 'ieTx=' + ((new Date()).getTime());
		}
		this.parent(url, data);
	},
	request: function(data){ //
		Site.IS_ERROR_IN_AJAX = false;
		this.parent(data);
	},
	
	setBusy : function() {
		if ( this.options && this.options.busyIndicator ) this.options.busyIndicator.addClass('ajax_loading');
	},
	
	removeBusy : function() {
		if ( this.options && this.options.busyIndicator ) this.options.busyIndicator.removeClass('ajax_loading');
	},
	
	// 
	onComplete: function(){
		this._WAS_IN_PRIVATE = !IS_EK_PUBLIC_PAGE;
		if (this.options.evalScripts || this.options.evalResponse) this.evalScripts(); // mootools stuff
		// 
		this.fireEvent('onEkComplete', [this.response.text, this.response.xml], 20); // script evaluation is done using timeout so we have to make a delay
	},
	
	onEkComplete: function( respText, respXml ) {
		// 
		if ( !IS_EK_PUBLIC_PAGE || this._WAS_IN_PRIVATE ) {
			if ( IS_EK_LOGGED_OUT ) {
				// 
				location = '/sessionLost.ek'; // 
				return;
			}
		}

		if ( Site.IS_ERROR_IN_AJAX && !this.options.ignoreAjaxError ) {
			this.removeBusy();
			this.fireEvent( 'onAjaxError', [this.response.text, this.response.xml] );
			return; //
		}
		
		//
		if (this.options.update) {
			$(this.options.update).empty().setHTML(this.response.text);
			//
			Popups._autoAdjustTopOnContentChange( $(this.options.update) );
		}

		//
		if ( this.options && this.options.initNewElements ) Site._initNewElements( this.options.initNewElements );
		this.removeBusy();

		//
		this.fireEvent('onComplete', [this.response.text, this.response.xml]);
	},
	
	processFailure : function( request ) {
		this.removeBusy();

		var reqStatus = -1;
		try {
			reqStatus = request.status;
		} catch ( ex ) {} // 
		
		if ( reqStatus == 401 ) { //
			if ( this.options && this.options.method && this.options.method == 'get' ) {
				//
				location.reload(); //
			} else {
				//Site.showError( 'Error loading popup contents<br/>(Http error code: ' + reqStatus + ')' );
				location = '/sessionLost.ek'; // go to "loginForm" and show some message
			}
		} else {
			// check out if guy was not logged out - and no autologon is enabled
			if ( !IS_EK_PUBLIC_PAGE || this._WAS_IN_PRIVATE ) { //
				//if (this.options.update) $(this.options.update).empty(); // still does not solve all the layouting problems but minimizes it
				location = '/sessionLost.ek?ajaxErrorCode=' + reqStatus; // go to "loginForm" and show some message
				return;
			} else {
				Site.showError( 'Error loading popup contents<br/>(Http error code: ' + reqStatus + ')' );
			}
		}
	}

});

//
Element.extend({
	ekSend: function(options){
		Site.IS_ERROR_IN_AJAX = false; //
		return new EkAjax(this.getProperty('action'), $merge({data: this.toQueryString()}, options, {method: 'post'})).request();
	}
});










/**
 * Popups handling
 */
var viewMessage = null; // for the handler to be overloadable in document itself if needed

var Popups = {
	DEFINE_HOST_ID: 'defineHost',


	// 
	_autoAdjustTopOnContentChange: function ( updatedE ) {
		updatedE = $( updatedE );
		if ( updatedE ) {
			var popupE = null;
			var updateEId = updatedE.getAttribute( 'id' );
			if ( updateEId == 'errors' || updateEId == 'messages' ) popupE = updatedE;
			else popupE = Site._findParentElement( updatedE, 'div', 'popup' );
			popupE = $( popupE );
			if ( popupE ) {
				//var popupParentE = popupE.getParent();
				//if ( popupParentE && popupParentE.getTag() == 'body' ) {
					var scrollT = window.getScrollTop();
					var canvH = window.getHeight();
					var eSize = popupE.getSize();
					var newMTop = scrollT;
					
					if ( popupE.getParent().getTag() == 'body' && (updateEId == 'errors' || updateEId == 'messages') ) {
						//if ( popupE.getStyle( 'top' ) > 0 ) newMTop -= popupE.getStyle( 'top' );
					} else {
						if ( canvH - eSize.size.y > 0 ) newMTop += ( (canvH - eSize.size.y) / 2 );
						var parentPos = popupE.getParent().getPosition();
						if ( parentPos && parentPos.y ) newMTop -= parentPos.y;
					}
					//alert( newMTop );
					popupE.setStyle( 'margin-top', newMTop );
				//}
			}
		}
	},

	_initApi : function( popupId, eBox ) {
		if ( $type( popupId ) != 'string' ) popupId = eBox.getAttribute( 'id' );
		
		var isSilencingBg = eBox.hasClass( 'fxForceBgSilence' );
		
		if ( !$defined( eBox.showMe ) ) {
			eBox.showMe = function() {
				if ( isSilencingBg ) Site.setBgSilenced( true );
				if ( eBox.enforceModal && BrowserFeatures['supportsPopupsModality'] ) $( document.body ).addClass( 'fxModalityEnforced' );
				eBox.setStyle( "display", "block" );
			}
		}
		
		if ( !$defined( eBox.close ) ) {
			eBox.close = function( emptyMe ) {
				var clearOnClose = true;
				if ( $defined( emptyMe ) ) {
					clearOnClose = emptyMe;
				} else {
					// use the global popup property if no param
					clearOnClose = eBox.clearContentsOnPopupClose;
				}
				
				if ( $defined( eBox.cleanup ) ) { // additionally call the cleanup function if created
					eBox.cleanup();
				}
				if ( eBox.fireEvent ) eBox.fireEvent( 'onPopupClose', eBox );
				if ( isSilencingBg ) Site.setBgSilenced( false );
				eBox.setBusy( false );
				eBox.setStyle( "display", "none" );
				if ( clearOnClose ) {
					var eBoxC = eBox.getElement( 'div.spacer' );
					if ( eBoxC ) eBoxC.empty(); // get rid of all hanging form elements not to be submitted
				}
				if ( eBox.enforceModal && BrowserFeatures['supportsPopupsModality'] ) $( document.body ).removeClass( 'fxModalityEnforced' );
			}
		}
		if ( !$defined( eBox.setBusy ) ) {
			eBox.setBusy = function( busyStatus ) {
				var pE = $( popupId );
				if ( pE ) {
					var pES = pE.getElement( 'div.spacer' );
					if ( pES ) {
						if ( busyStatus ) {
							pES.addClass('ajax_loading');
						} else {
							pES.removeClass('ajax_loading');
							pES.getElements( 'input.fxBtnDisabled' ).each( Site.setButtonBusy );
						}
					}
				}
			}
		}
		if ( !$defined( eBox.initDrag ) ) {
			eBox.initDrag = function() {
				var dragH = eBox.getElement('.dragHandle');
				if ( dragH ) {
					var margs = { 'top': eBox.getStyle( 'margin-top' ), 'left': eBox.getStyle( 'margin-left' ) };
					eBox.makeDraggable( { handle: dragH, modifiers: { x: 'margin-left', y: 'margin-top' } } );
					eBox.setStyle( 'margin-top', margs.top );
					eBox.setStyle( 'margin-left', margs.left );
					if ( !$defined( eBox.initialMargs ) ) eBox.initialMargs = margs;
					
					dragH.empty();
					new Element( 'img', { 'src': '/img/s.gif' } ).inject( dragH );
				}
			}
		}
		if ( !$defined( eBox.recallInitialPosition ) ) {
			eBox.recallInitialPosition = function() {
				if ( $defined( eBox.initialMargs ) ) { // 
					eBox.setStyle( "margin-top", eBox.initialMargs.top );
					eBox.setStyle( "margin-left", eBox.initialMargs.left );
				}
			}
		}
		
		if ( !$defined( eBox.initHResize ) ) {
			eBox.initHResize = function() { // 
				var dragH = eBox.getElement('img.fxResizeH');
				if ( !dragH ) {
					var handleI = new Element( 'img', { 'src': '/img/s.gif', 'class': 'fxResizeH' } );
					handleI.inject( eBox );
					var sizesP = eBox.getSize().size;
					if ( !$defined( eBox.initialSize ) ) eBox.initialSize = sizesP;
					eBox.makeResizable( {
						'handle': handleI,
						'modifiers': { 'x': 'width', 'y': false },
						'limit' : { 'x': [ sizesP.x ] } 
					} );
				}
			}
		}
		if ( !$defined( eBox.recallInitialSize ) ) {
			eBox.recallInitialSize = function() {
				if ( $defined( eBox.initialSize ) ) { // 
					eBox.setStyle( "width", eBox.initialSize.x );
				}
			}
		}
		if ( !$defined( eBox.adjustAlignTopTo ) ) {
			eBox.adjustAlignTopTo = function( alignTop, alignTopHeight ) {
				if ( alignTop == document.body ) {
					Site._forceBoxAlwaysVisible( eBox );
				} else {
					if ( alignTop ) {
						var _DIFF = 300;
						if ( alignTopHeight ) _DIFF = alignTopHeight;
			
						var _DH = parseInt(_DIFF / 2); // 
						var aBTop = 0 + eBox.getTop();
						if ( !$defined( eBox.origTop ) ) { // 
							eBox.origTop = parseInt( eBox.getStyle( "margin-top" ) );
						}
						var eCTop = 0 + alignTop.getTop();
						if ( eCTop - aBTop > _DIFF ) { // 
							eBox.setStyle( "margin-top", "" + (eCTop - aBTop + eBox.origTop - _DH) + "px" );
						}
					}
				}
			}
		}
		if ( !$defined( eBox.getCanvas ) ) {
			eBox.getCanvas = (function() {
				try {
					return $( popupId ).getElement( 'div.spacer' );
				} catch ( ex ) {
					//alert(ex); //
					//
					var pE = $( popupId );
					return pE.getLast().getFirst(); //
				}
			}).bind( eBox );
		}
	},

	loadPopup : function( popupId, url, container, recursive, options ) {


		var eBox = $( popupId );
		var exists = true;
		if ( !eBox ) {
			eBox = new Element( "div", { "id":popupId, "class":"popup" } );
			eBox.setHTML( '<img onclick="$(\'' + popupId + '\').close()" ' +
				'src="/img/lyt/ic_close-popup.gif" ' +
				'class="fR popupClose"/><div class="dragHandle"></div><div class="layouter"><div class="spacer">&nbsp;</div></div>' );
			eBox.injectTop( container || document.body );
			exists = false;
		}
		
		var clearContentsOnPopupClose = true;
		if ( options && options.clearContentsOnPopupClose === false ) {
			clearContentsOnPopupClose = false;
		}
		eBox.clearContentsOnPopupClose = clearContentsOnPopupClose;

		var enforceModal = false;
		if ( options && options.enforceModal === true ) enforceModal = true;
		eBox.enforceModal = enforceModal;
		
		Popups._initApi( popupId, eBox );
		if ( options && options.onPopupClose ) eBox.addEvent( 'onPopupClose', options.onPopupClose );
		
		// remove addition if its there
		if ( eBox.addition ) {
			eBox.addition.remove();
			eBox.addition = null;
		}
		
		var eBoxContainer = eBox.getCanvas();
		if ( exists ) eBoxContainer.empty();
		//eBox.addClass('ajax_loading');
		
		if ( $defined( eBox.origTop ) ) { // recall original margin
			eBox.setStyle( "margin-top", eBox.origTop );
		}
		eBox.recallInitialSize();
		eBox.recallInitialPosition();
		
		
		
		eBox.showMe();
		//eBoxContainer = eBox.getCanvas();
		//eBox.setStyle( "display", "block" );
		if ( options && options.alignTop ) {
			eBox.adjustAlignTopTo( $( options.alignTop ), options.alignTopHeight );
		}
		
		//if ( recursive ) { // make the func definition always.. to be used anywhere
			var makeRecursiveSubmit = function( containerE ) {
				var frm = this.getElement( 'form' );
				var _T = this; //eBox
				if ( frm ) {
					var eBoxContainer = containerE || this.getCanvas();
					frm.addEvent('submit', function(e) {
						//prevent normal submit
						new Event(e).stop();
						var updateBox = eBoxContainer;
						var updateFunction = null;
						if ( $defined( options ) && $defined( options.updateFunction ) ) {
							updateBox = null;
							updateFunction = options.updateFunction;
						}
						var ajaxErrCall = options ? options.onAjaxError : null;
						this.ekSend({
							update: updateBox,
							initNewElements: updateBox,
							busyIndicator: eBoxContainer,
							evalScripts: true,
							onComplete: function( responseValue ) {
								if ( updateFunction ) {
									eBox.close();
									updateFunction( responseValue );
								} else {
									//Site._initNewElements( eBoxContainer ); // framework calls it
									_T.makeRecursiveSubmit( eBoxContainer );
								}
							},
							//
							onAjaxError: function( t, x ) { if ( ajaxErrCall ) ajaxErrCall( t, x ); },
							onFailure: function() { Site.showError( 'Error submitting ajax request' ); }
						});
					});
				}
			};
			eBox.makeRecursiveSubmit = makeRecursiveSubmit.bind( eBox );
		//}
		if ( options && options.tabId ) {
			eBoxContainer.setStyle( "display", "none" );
		}
		
		if ( $type( url ) == 'element' ) {
			url = url.getAttribute( 'href' );
		}
		
		if ( url ) {
			new EkAjax( url, {
				update: eBoxContainer,
				evalScripts: true,
				busyIndicator : eBox,
				initNewElements : eBox,
				ignoreAjaxError : true,
				onComplete: function( responseValue ) {
				    

					eBoxContainer.setStyle( "display", "block" ); // FIXME - use eBox.showMe instead	

				    // 
				    if ( options && options.tabId ) {
				        var tabId = options.tabId;
				        var tabs = $(popupId).getElements('div.tabHandle');
				        if ( tabs.length > 0 ) {
				        	// 
							tabs = tabs.filterByAttribute('onclick','^=','Popups.jumpTab(\''+tabId+'\'');
							tabs.each( function(tab) {
								Popups.jumpTab( tabId, tab, popupId, true ); //
							});
						}
					}
					
					if ( options && options.onComplete ) {
						options.onComplete.bind(this)( responseValue );
					}
					if ( options && options.loaded ) {
						options.loaded( eBox );
					}
					var frm = eBoxContainer.getElement( 'form' );
					if ( recursive ) {
						eBox.makeRecursiveSubmit();
					} else {
						if ( frm ) {
							frm.addEvent('submit', function(e) { // just show that its being submitted
								eBoxContainer.addClass( 'ajax_loading' );
							});
						}
					}
	
					// 
					if ( frm && options && options.fields ) {
						for ( var fI in options.fields ) { //
							frm.elements[ fI ].value = options.fields[ fI ];
						}
					}
					// 
					Site._focusFirstInput( eBoxContainer );
				}
			}).request();
		}		
		
		return false;
	},
	
		
	reloadContent : function( popupId, options ) {
		var eBox = $( popupId );
		if ( !eBox ) Popups.loadPopup( popupId, false );
		eBox = $( popupId );
		Popups._initApi( popupId, eBox );
		var eBoxContainer = eBox.getCanvas();
		var form;
		
		if ( $defined( options.form4Send ) ) {
			form = $( options.form4Send );  //uses form from options
		} else {
			form = eBox.getElement( 'form' ); // take form embeded in popup
		}
		if ( !form ) Site.showError( "No form found" );
		// default options
		var opts = {
			update : eBoxContainer,
			busyIndicator : eBoxContainer,
			initNewElements : eBoxContainer,
			evalScripts: true
		};
		
	
		
		if ( $defined( options ) ) {
			opts = $merge.apply( null, [opts, options] );
		}
		if ( $defined( opts.url ) ) form.action = opts.url; // switch url if defined
		if ( $defined( opts.action ) ) form.elements['action'].value = opts.action;
		
		form.ekSend( opts );
		return false;
	},
	
	
	closeMe : function( element, emptyPopup ) {
		var popup = Site._findParentElement( element, 'div', 'popup' );
		if ( popup ) popup.close( emptyPopup );
	},
	setBusy : function( element, busy ) {
		var popup = Site._findParentElement( element, 'div', 'popup' );
		if ( popup ) popup.setBusy( busy );
	},
	
	jumpTab : function( tabId, handleE, container, noFocus ) {
		var currentTabContents = null;
		$ES( 'div.tabContents', container ).each(function(eX) {
			if ( eX.getAttribute( "id" ) == (tabId + "TabContents") ) {
				currentTabContents = eX;
			}
			eX.setStyle("display","none");
		});
		currentTabContents.setStyle("display","block");
		
		$ES( 'div.tabHandle', container ).each(function(eX) {
			eX.removeClass( 'active' );
		});
		if ( !handleE.hasClass( 'active' ) ) {
			handleE.addClass( 'active' );
		}
		//
		Popups._autoAdjustTopOnContentChange( handleE );
			
		// 
		if ( noFocus !== false ) Site._focusFirstInput( currentTabContents );
		
		return currentTabContents;
	},
	
	
	closeAddition : function( popupId ) {
		var eBox = $( popupId );
		var additionalBox = eBox.getElement('div.layouter div.additional');
		if ( additionalBox ) {
			additionalBox.remove();
		} else {
			if ( eBox.close ) eBox.close();
		}
		eBox.addition = null;
	},
	
	showPopupAddition : function( popupId, url, options ) {
		var eBox = $( popupId );
		var additionalBox = eBox.getElement('div.layouter div.additional');
		if ( !additionalBox ) {
			additionalBox = new Element( 'div', { 'class':'additional' } );
			additionalBox.injectAfter( eBox.getElement('div.spacer') );
		}
		eBox.addition = additionalBox;
		Garbage.collect( eBox.addition );
		
		new EkAjax( url, {
			update: additionalBox,
			busyIndicator : additionalBox,
			//initNewElements : additionalBox,
			evalScripts: true,
			onComplete: function( responseValue ) {
				if ( options && options.onComplete ) {
					options.onComplete.bind(this)( responseValue );
				}
				if ( options && options.recursive && eBox.makeRecursiveSubmit ) {
					eBox.makeRecursiveSubmit( additionalBox );
				}
				Site._initNewElements( additionalBox ); // init any checkboxes within new contents
				// 
				Site._focusFirstInput( additionalBox );
			}
		}).request();
		return false;
	},
	
	viewMessage : function( row, messageId ) {
		if ( $type( viewMessage ) == 'function' ) { // if function overloaded in current document - use it instead
			return viewMessage( row, messageId );
		} else {
			var rE = null;
			if ( $type( row ) == 'string' ) rE = $( row );
			else rE = $( row );
			if ( rE ) rE.removeClass( 'notRead' );
			return Popups.loadPopup( 'message', '/messages/showMessage.ek?messageId=' + messageId, null, true );
		}
	}
	
};
//Popups.implement(new Events, new Options);






Site.SearchFieldMediator = new Class({
	
	options: {
		doSearch: Class.empty,
		onSearchStart: Class.empty,
		onSearchDone: Class.empty
	},

	initialize: function( options ) {
		this.setOptions( options );
	},


	_search: function( value ) {
		this.fireEvent( 'onSearchStart' );
		this.options.doSearch( value );
	},
		
	_searchKey: function( e, input ) { // 
		e = new Event( e );
		if ( e.key == 'enter' ) {
			e.preventDefault();
			// 
			if ( input ) {
				this._search( input.value );
				input.disabled = true; // 
			}
			return false;
		}
	},
	
	_searchClick: function( inpE ) {
		if ( inpE.disabled ) return false;
		var sVal = "" + inpE.value;
		sVal = sVal.trim();
		var siTitle = inpE.getAttribute('title');
		if ( sVal == siTitle ) return false; // 'search..'
		else return this._search( sVal );
	},
	
	_searchReset: function( inpE ) {
		if ( inpE.disabled ) return false;
		return this._search( '' );
	},
	
	
	_searchBlur: function( e, inpE ) {
		inpE = $(inpE);
		if ( !inpE ) return;
		var sVal = "" + inpE.value;
		sVal = sVal.trim();
		if ( sVal.length == 0 ) {
			inpE.addClass( 'searchInputEmpty' );
			var siTitle = inpE.getAttribute('title');
			inpE.value = siTitle;
		} 
	},
	_searchFocus: function( e, inpE ) {
		inpE = $(inpE);
		if ( !inpE ) return;
		var sVal = "" + inpE.value;
		inpE.removeClass( 'searchInputEmpty' );
		sVal = sVal.trim();
		var siTitle = inpE.getAttribute('title');
		if ( sVal == siTitle ) inpE.value = '';
	}
	
});
Site.SearchFieldMediator.implement( new Events, new Options );






/**
 * Address Book handling object
 */
var AddressBook = new Class({
	POPUP_ID : 'addrBook',
	CLASS_TAB_SELECTION_AWARE_NAME : 'fxSelectionCheckTrigger',
	TAB_SELECTION_HOLDER_PARAM : 'abTabSubmit',
	// 
	options : {
		multiple : true,
		msgNothingSelected : 'No contact is selected',
		msgOnlyOneSelectable : 'You can choose only one contact from all contacts',
		msgErrorAjaxSubmit : 'Error submitting ajax request'
	},
	
	initialize: function( options ) {
		this.setOptions( options );
		AddressBook._I = this; //
		var _this = this;
		
		this.searchMediator = new Site.SearchFieldMediator( { doSearch: _this.searchContacts.bind( _this ) } );
		
		this.contactsLoaded = true;
		var url = '/compos/ab/loadAddressBook.ek';
		var questionUsed = false;
		if ( this.options.network ) {
			url += "?network=1";
			questionUsed = true;
		}
		if ( this.options.groups ) {
			if ( questionUsed ) url += "&";
			else url += "?";
			questionUsed = true;
			url += "groups=1";
		}
		if ( this.options.newGuest ) {
			if ( questionUsed ) url += "&";
			else url += "?";
			questionUsed = true;
			url += "newGuest=1";
			if ( this.options.contactsLoadUrl ) this.contactsLoaded = false;
		}
		if ( this.options.newCommitteeHost ) {
			if ( questionUsed ) url += "&";
			else url += "?";
			questionUsed = true;
			url += "newCommitteeHost=1";
		}
		if ( this.options.messageKey ) {
			if ( questionUsed ) url += "&";
			else url += "?";
			questionUsed = true;
			url += "messageKey=" + this.options.messageKey;
		}
		if ( this.options.titleKey ) {
			if ( questionUsed ) url += "&";
			else url += "?";
			questionUsed = true;
			url += "titleKey=" + this.options.titleKey;
		}
		if ( this.options.localeKey ) {
			if ( questionUsed ) url += "&";
			else url += "?";
			questionUsed = true;
			url += "localeKey=" + this.options.localeKey;
		}
		
		Popups.loadPopup( this.POPUP_ID, url, null, false, { 
				enforceModal: true,
				loaded : function( popup ) {
					//new ImgTips( $ES( 'div.itemThumb img', popup ), { overflown: [ popup.getElement('div.scroller') ] } );
					_this.overloadOK.bind( _this )( popup );
				}
		});
		this.popup = $( this.POPUP_ID );
		var popupCont = this.popup.getElement( 'div.spacer' );
		var fxCleanup = function() {
				if ( window.ie ) {
					var contactsTabContents = $( 'ab_cts_list' );
					if ( contactsTabContents ) contactsTabContents.innerHTML = "";
					if ( popupCont ) popupCont.innerHTML = "";
				}
			};
		this.cleanup = fxCleanup;
		if ( !this.popup.cleanup ) {
			this.popup.cleanup = function() { fxCleanup(); }
		}
		// overload 'ok' submit button in address book
		if ( $defined( this.options.form ) ) {
			var frm = this.options.form;
			var eBox = this.popup;
			var eBoxContainer = eBox.getElement( 'div.spacer' );
			var _T = this;
			frm.addEvent('submit', function(e) {
				//
				new Event(e).stop();
				if ( AddressBook._I != _T ) return;
				// 
				if ( _T.isCurrentTabSelectionAware() ) { //
					var selectionCount = 0;
					$ES( 'div.checkB', _T.getCurrentTabContents() ).each(
						function(e){if(e.hasClass('selected'))selectionCount++;}
					);
					if ( selectionCount == 0 ) {
						Site.showError( _this.options.msgNothingSelected );
						return;
					}
					if ( !_this.options.multiple && selectionCount > 1 ) {
						Site.showError( _this.options.msgOnlyOneSelectable );
						return;
					}
				}
				
				this.ekSend({ 
					busyIndicator: eBoxContainer,
					evalScripts: true,
					onComplete: function( responseValue ) { eBox.close(); }
				});
			});
		}
		return false;
	},
	overloadOK : function( aBook ) { // 
		var okB = aBook.getElement( 'input[type=submit]' );
		
		//  
		if ( $defined( this.options.form ) ) {
			this.form = this.options.form;
		} else {
			this.form = okB.form;
		}
		// 
		var evaluatedCurrentTabId = 'abContactsP'; // 
		// 
		var tabHEls = aBook.getElements( 'div.tabsHolder div.tabHandle' );
		if ( tabHEls ) tabHEls.each( function( tE ) {
				if ( tE.hasClass('active') ) evaluatedCurrentTabId = tE.getAttribute( 'tabId' );
			});
		this.currentTabId = evaluatedCurrentTabId;
		this.updateTabState( this.currentTabId );
		
		if ( this.options.onClick ) {
			var _this = this;
			okB.addEvent('click',function(e){
				_this.options.onClick.bind(_this)( e, okB.form );
			});
		}
		//
		if ( this.options.tabs ) {
			var tabH = aBook.getElement( 'div.tabsHolder' ); //
			var tabB = aBook.getElement( 'div.simpleTabsContainer' ); //
			if ( tabH && tabB ) {
				var _T = this;
				var preselectTabH = null;
				this.options.tabs.each( function( newT ) {
					var tabHandle = new Element( 'div', { 'class': 'fL tabHandle' } );
					tabHandle.setHTML( newT.title );
					tabHandle.inject( tabH );
					tabHandle.setAttribute( 'tabId', newT.id );
					var tabItself = new Element( 'div', { 'id': newT.id+'TabContents', 'class': 'tabContents' } );
					tabItself.loaded = false;
					tabItself.setStyle( 'display', 'none' );
					tabItself.setHTML( 'loading..' );
					tabItself.inject( tabB );
					tabHandle.addEvent( 'click', function() {
						AddressBook._I.jumpTab.bind( _T )( newT.id, tabHandle );
						if ( !tabItself.loaded ) {
							new EkAjax( newT.url, {
								busyIndicator: aBook.getElement( 'div.spacer' ),
								update : tabItself,
								onComplete: function() { tabItself.loaded = true; }
							}).request();
						}
					} );
					if ( _T.options.tabActiveOnEntry == newT.id ) preselectTabH = tabHandle;
				});
				if ( preselectTabH ) preselectTabH.fireEvent( 'click' );
			}
		}
	},
	
	getCurrentTabContents: function() {
		if ( this.currentTabId ) return $( this.currentTabId + 'TabContents' );
		return false;
	},
	isCurrentTabSelectionAware: function() {
		var tabCE = this.getCurrentTabContents();
		if ( tabCE ) return tabCE.hasClass( this.CLASS_TAB_SELECTION_AWARE_NAME );
		return false;
	},
	
	searchContacts: function( searchQ ) {
		var url = '/compos/ab/loadAddressBook/filterContacts.ek';
		if ( this.options.contactsLoadUrl ) url = this.options.contactsLoadUrl;
		if ( url.indexOf( '?' ) >= 0 ) url += '&';
		else url += '?';
		if ( searchQ ) url += 'abCS=' + encodeURIComponent( searchQ );
		var cTab = $('abContactsPTabContents');
		if ( cTab ) Site.mAR( url, { 
			updateBox: cTab, 
			onComplete: function() {
				var inpE = $('abCSI');
				if ( inpE ) inpE.focus();
			}
		} );
		return false;
	},
	
	_search: function( e, input ) {
		return this.searchMediator._searchKey( e, input );
	},
	_searchClick: function( inpE ) {
		return this.searchMediator._searchClick( inpE );
	},
	_searchReset: function( inpE ) {
		return this.searchMediator._searchReset( inpE );
	},
	
	_searchBlur: function( e, inpE ) {
		return this.searchMediator._searchBlur( e, inpE );
	},
	_searchFocus: function( e, inpE ) {
		return this.searchMediator._searchFocus( e, inpE );
	},
	
	
	jumpTab : function( tabId, handleE ) {
		var tabContents = Popups.jumpTab( tabId, handleE, this.POPUP_ID );
		this.updateTabState( tabId );
		return tabContents;
	},
	jumpContactsTab: function( handleE ) {
		var tabContents = this.jumpTab( 'abContactsP', handleE );
		if ( this.contactsLoaded == false ) {
			var _T = this;
			new EkAjax( this.options.contactsLoadUrl, {
				busyIndicator: _T.popup.getCanvas(),
				update : tabContents,
				onComplete: function() { _T.contactsLoaded = true; }
			}).request();
		}
	},
	
	updateTabState : function( tabId ) {
		this.currentTabId = tabId;
		if ( this.form && this.form.elements[ this.TAB_SELECTION_HOLDER_PARAM ] ) {
			this.form.elements[ this.TAB_SELECTION_HOLDER_PARAM ].value = tabId;
		} else { 
			//
			if ( this.form ) {
				var hiN = this.TAB_SELECTION_HOLDER_PARAM;
				var hI = new Element( 'input', { 'type':'hidden', 'name':hiN, 'value':tabId } );
				hI.inject( $( this.form ) );
			}
		}
		// 
		if ( this.options.alternateTitles ) {
			//
			if ( !this._defaultTitle ) this._defaultTitle = this.getTitle();
			if ( this.options.alternateTitles[ this.currentTabId ] ) this.setTitle( this.options.alternateTitles[ this.currentTabId ] );
			else if ( this._defaultTitle ) this.setTitle( this._defaultTitle );
		}
	},
	
	getTitle: function() {
		var titleC = $('fxABTitleC');
		if ( titleC ) return titleC.getText();
		return false;
	},
	setTitle: function( newTitle ) {
		var titleC = $('fxABTitleC');
		if ( titleC ) titleC.setHTML( newTitle );
	}
});
AddressBook.implement(new Events, new Options);






/**
 * Draggable image inside smaller canvas - used e.g. for user profile photo.
 */
var DragThumb = new Class({
	options: {
		unit: 'px',
		onStart: Class.empty,
		onBeforeStart: Class.empty,
		onComplete: Class.empty,
		onSnap: Class.empty,
		onDrag: Class.empty,
		limit: true,
		horizontal: true,
		grid: false,
		snap: 1
	},
	
	initialize: function(el, options){
		var elE = $( el );
		if ( elE.dragger ) {
			elE.dragger.detach();
			elE.dragger = null;
		}
		elE.dragger = this;
		
		this.setOptions(options);
		this.handle = elE;
		
		this.element = this.handle.getElement('img');
		this.mouse = {'now': {}, 'pos': {}};
		this.value = {'start': {}, 'now': {}};
		this.bound = {
			'start': this.start.bindWithEvent(this),
			'check': this.check.bindWithEvent(this),
			'drag': this.drag.bindWithEvent(this),
			'stop': this.stop.bindWithEvent(this)
		};
		if ( this.options.horizontal ) {
			this.modifier = "x";
			this.options["modifiers"] = { x : 'margin-left' };
		} else {
			this.modifier = "y";
			this.options["modifiers"] = { y : 'margin-top' };
		}
		
		if ( !this.options.noReset ) this.reset();
		this.attach();
	},

	reset: function() {
		if ( this.options.resetSize ) {
			if ( this.options.horizontal ) {
				this.element.setStyle( 'width', 'auto' );
				this.element.setStyle( 'height', this.options.resetSize[ 1 ] + this.options.unit );
			} else {
				this.element.setStyle( 'height', 'auto' );
				this.element.setStyle( 'width', this.options.resetSize[ 0 ] + this.options.unit );
			}
		}
		this.element.setStyle( 'margin-left', "0" + this.options.unit );
		this.element.setStyle( 'margin-top', "0" + this.options.unit );
		this.setNewValue( 0 );
	},
		
	attach: function(){
		this.handle.addEvent('mousedown', this.bound.start);
		return this;
	},

	detach: function(){
		this.handle.removeEvent('mousedown', this.bound.start);
		return this;
	},

	start: function(event){
		//this.fireEvent('onBeforeStart', this.element);
		this.mouse.start = event.page;
		var limit = this.options.limit;
		this.limit = {'x': [], 'y': []};
		for (var z in this.options.modifiers){
			if (!this.options.modifiers[z]) continue;
			this.value.now[z] = this.element.getStyle(this.options.modifiers[z]).toInt();
			this.mouse.pos[z] = event.page[z] - this.value.now[z];
			if (limit){ // && limit[z]
				for (var i = 0; i < 2; i++){
					if ($chk(limit[i])) this.limit[z][i] = ($type(limit[i]) == 'function') ? limit[i]() : limit[i];
				}
			}
		}
		//if ($type(this.options.grid) == 'number') this.options.grid = {'x': this.options.grid, 'y': this.options.grid};
		// document.addListener('mousemove', this.bound.check);
		document.addListener('mousemove', this.bound.check);
		document.addListener('mouseup', this.bound.stop);
		//this.fireEvent('onStart', this.element);
		event.stop();
	},

	check: function(event){
		var distance = Math.round(Math.sqrt(Math.pow(event.page.x - this.mouse.start.x, 2) + Math.pow(event.page.y - this.mouse.start.y, 2)));
		if (distance > this.options.snap){
			document.removeListener('mousemove', this.bound.check);
			document.addListener('mousemove', this.bound.drag);
			this.drag(event);
			//this.fireEvent('onSnap', this.element);
		}
		event.stop();
	},

	drag: function(event){
		this.out = false;
		this.mouse.now = event.page;
		for (var z in this.options.modifiers){
			if (!this.options.modifiers[z]) continue;
			this.value.now[z] = this.mouse.now[z] - this.mouse.pos[z];
			if (this.limit[z]){
				if ($chk(this.limit[z][1]) && (this.value.now[z] > this.limit[z][1])){
					this.value.now[z] = this.limit[z][1];
					this.out = true;
				} else if ($chk(this.limit[z][0]) && (this.value.now[z] < this.limit[z][0])){
					this.value.now[z] = this.limit[z][0];
					this.out = true;
				}
			}
			//if (this.options.grid[z]) this.value.now[z] -= (this.value.now[z] % this.options.grid[z]);
			
			this.element.setStyle(this.options.modifiers[z], this.value.now[z] + this.options.unit);
			//this.handle.setAttribute( 'title', this.options.modifiers[z] + '=' + this.value.now[z] + this.options.unit );
		}
		//this.fireEvent('onDrag', this.element);
		event.stop();
	},

	stop: function(event){
		// set the value of current drag
		this.setNewValue( this.value.now[ this.modifier ] );
	
		document.removeListener('mousemove', this.bound.check);
		document.removeListener('mousemove', this.bound.drag);
		document.removeListener('mouseup', this.bound.stop);
		//this.fireEvent('onComplete', this.element);
		event.stop();
	},
	
	setNewValue: function( newValue ) {
		if ( this.options.valueSetter ) {
			if ( $type( this.options.valueSetter ) == 'function' ) {
				this.options.valueSetter( newValue );
			}
		}
	}
});
DragThumb.implement(new Events, new Options);




/**
 * Media library handling object
 */
var MediaLibrary = new Class({
	POPUP_ID : 'mediaLibrary',
	UPLOAD_POPUP_ID : 'mediaUpload',
	_FACADE_FORM_ID : 'mLibraryFacadeF',
	_TYPE_SIZE : { 'USER' : [ 130, 170 ], 'EVENT' : [ 170, 130 ] },
	_MEDIA_EMPTY_MARKER_CSS : 'fxImgCUnset',
	
	_INSTANCE : null,
	
	options : {
		loadUrl : '/compo/mm/loadImages.ek',
		onChanged: Class.empty,
		onClosed: Class.empty,
		setBg : true,
		noShow : false,
		disableTopAlign : false,
		addParams : '', //
		containerType : null, // USER(vertical) or EVENT(horizontal)
		canvasType : null, // USER(vertical) or EVENT(horizontal)
		localeKey : null, // Locale session key
		selectionHandler : function( imageUrl, imageId, imgE ) { // this = MediaLibrary._INSTANCE
			// update relation id
			var form = this.getForm();
			if ( $defined(form) && $defined(this.options.fElement) ) {
				var eName = this.options.fElement;
				if ( form.elements[ eName ] ) {
					form.elements[ eName ].value = imageId;
				} else { // as fallback try using fElement + "Id"
					eName += "Id";
					if ( form.elements[ eName ] ) {
						form.elements[ eName ].value = imageId;
					}
				}
			}
			// update presentation
			if ( $defined(this.options.imgContainer) ) {
				
				// if there is no image - create a new one
				//if ( $type(imgs) == 'collection' )
				var _theImageE = null;
				if ( this.options.imgContainerNotImg === true ) {
					_theImageE = $( this.options.imgContainer );
				} else {
					var imgs = $( this.options.imgContainer ).getElementsByTagName('IMG');
					if ( imgs.item(0) == null ) {
						_theImageE = new Element( 'img', { 'src' : '/img/spacer.gif' } );
						_theImageE.inject( $( this.options.imgContainer ) );
					} else {
						_theImageE = $( imgs.item(0) );
					}
				}
				
				if ( this.options.setBg ) {
					if ( imageUrl.indexOf("'")!=0 && imageUrl.indexOf('"')!=0 ) imageUrl = "'" + imageUrl + "'"; //
					_theImageE.setStyle( "background-image", 'url(' + imageUrl + ')' );
				} else {
					_theImageE.setAttribute( "src", imageUrl );
				}
			}
			
			// now handle all that draggin crap if image is overlapping
			if ( $defined(imgE) && $defined(this.options.canvasType) ) {
				this.initDrag( [ parseInt( imgE.getAttribute( 'origW' ) ), 
					parseInt( imgE.getAttribute( 'origH' ) ) ], true );
			}
		}
	},
	
	initialize: function( triggerBtn, options ){
		this.setOptions( options );
		this.triggerBtn = $( triggerBtn );
		var box = $( this.POPUP_ID );
		if ( !box ) Site.showError( "Media Library can not be initialized (not in document)" );
		MediaLibrary._INSTANCE = this; // remember the instance to be used from upload iframe
		this.mL = box; // .. and remember div popup in the instance as well
		if ( !$defined(box.cleanup) ) {
			box.cleanup = function() {
				var _T = MediaLibrary._INSTANCE;
				box.removeClass('ajax_loading');
				_T.hideUpload( this.mU );
				box.setStyle( 'display', 'none' );
				_T.fireEvent( 'onClosed' );
			};
			box.select = function( imageUrl, imageId, imgE ) {
				var _T = MediaLibrary._INSTANCE;
				_T.options.selectionHandler.bind( _T )( imageUrl, imageId, imgE );
				if ( _T.triggerBtn ) _T.triggerBtn.removeClass( _T._MEDIA_EMPTY_MARKER_CSS );
				_T.fireEvent( 'onChanged', imageId );
				box.cleanup();
			};
		}
		if ( options.noShow ) return;
		var alignTopTo = $( this.options.imgContainer );
		if ( this.options.disableTopAlign ) alignTopTo = null;
		Site.showPopupCentered( box, false, alignTopTo );
		this.load( box );
	},
	
	isSet: function( mmTrigger ) {
		if ( mmTrigger ) mmTrigger = $( mmTrigger );
		else mmTrigger = this.triggerBtn;
		if ( mmTrigger ) return !mmTrigger.hasClass( MediaLibrary.prototype._MEDIA_EMPTY_MARKER_CSS );
		return false;
	},
	
	selectUpload : function( mediaE, mediaId ) {
		var imgE = $( mediaE ).getElement( 'div.preview img' );
		var mediaUrl = imgE.getAttribute( 'src' );
		this.mL.select.bind( this.mL )( mediaUrl, mediaId, imgE );
	},

	load : function( mL ) {
		var url = this.options.loadUrl; // url for loading whole contents of media popup
		var _SEPA = "?";
		if ( this.options.source ) {
			url += '?source=' + this.options.source;
			url += '&sourceId=' + this.options.sourceId;
			_SEPA = "&";
		}
		if ( this.options.containerType ) {
			url += _SEPA + 'containerType=' + this.options.containerType;
			_SEPA = "&";
		}
		if ( this.options.canvasType ) {
			url += _SEPA + 'canvasType=' + this.options.canvasType;
			_SEPA = "&";
		}
		if ( this.options.addParams ) {
			url += _SEPA + this.options.addParams;
			_SEPA = "&";
		}
		if ( this.options.localeKey ) {
			url += _SEPA + 'localeKey=' + this.options.localeKey;
			_SEPA = "&";
		}
		var contents = mL.getElement( 'div.spacer' ); // get div to load contents to
		mL.addClass('ajax_loading');
		new EkAjax( url, {
			update : contents,
			evalScripts: true,
			busyIndicator : mL,
			initNewElements : contents,
			onComplete: function( rV ) {
				new ImgTips( $ES( 'div.preview img', mL ), { overflown: [ mL.getElement('div.scroller') ] } );
			}
		}).request();
	},
	
	
	initDrag : function( imgOrigSize, reset ) {
		var origW = imgOrigSize[ 0 ];
		var origH = imgOrigSize[ 1 ];
		var canvasType = this.options.canvasType;
		var width = this._TYPE_SIZE[ canvasType ][ 0 ];
		var height = this._TYPE_SIZE[ canvasType ][ 1 ];
		var canvasRatio = width / height;
		var originalRatio = origW / origH;
		var horizontal = false;
		if ( originalRatio > canvasRatio ) { // scroll left/right
            width = ( height * origW ) / origH;
            horizontal = true;
        } else { // scroll top/bottom
            height = ( width * origH ) / origW;
        }
        
        if ( $defined( this.options.imgContainer ) ) {
        	var container = $( this.options.imgContainer );

        	// init offset setter function
        	var sFunc = null;
			var form = this.getForm();
			if ( $defined(form) && $defined(this.options.fElement) ) {
				var eName = this.options.fElement + "Offset";
				if ( form.elements[ eName ] ) {
					sFunc = function( oV ) {
						form.elements[ eName ].value = Math.abs( oV );
					};
				}
			}
        	
        	if ( horizontal ) {
        		container.setStyle( 'cursor', 'w-resize' );
            	new DragThumb( container, { 
            		horizontal : horizontal,
            		resetSize: this._TYPE_SIZE[ canvasType ],
            		valueSetter: sFunc,
            		noReset : !reset,
            		limit : [ - ( width.toInt() - this._TYPE_SIZE[ canvasType ][ 0 ] ), 0 ]
            	} );
        	} else {
        		container.setStyle( 'cursor', 'n-resize' );
            	new DragThumb( container, { 
            		horizontal : horizontal,
            		resetSize: this._TYPE_SIZE[ canvasType ],
            		valueSetter: sFunc,
            		noReset : !reset,
            		limit : [ - ( height.toInt() - this._TYPE_SIZE[ canvasType ][ 1 ] ), 0 ]
            	} );
        	}
        }
	},
	
	getForm : function() {
		var form = null;
		if ( $defined(this.options.fName) ) {
			form = document.forms[ this.options.fName ];
		}
		return form;
	},
	
	/**
	 * this is called from uploadButton.jsp iframe - do not touch
	 */
	uploaded : function( newUploadId ) {
		this.hideUpload( this.mU );
		this.load( this.mL );
	},

	toggleUploadPopup : function( button ) {
		var mU = $( this.UPLOAD_POPUP_ID );
		this.mU = mU;
		mU.triggerButton = button;
		if ( mU.displayed ) this.hideUpload( mU );
		else this.showUpload( mU );
		return false;
	},
	showUpload : function( mU ) {
		if ( true == mU.displayed ) return;
		mU.setStyle('display','block');
		mU.displayed = true;
		mU.triggerButton.value = mU.triggerButton.value.substr(0, mU.triggerButton.value.length-2) + "<<";
	},
	hideUpload : function( mU ) {
		if ( !mU || false == mU.displayed ) return;
		mU.setStyle('display','none');
		mU.displayed = false;
		mU.triggerButton.value = mU.triggerButton.value.substr(0, mU.triggerButton.value.length-2) + ">>";
	},
	
	removeSelection : function( linkE ) {
		var mLF = $( this._FACADE_FORM_ID );
		this.mL.addClass('ajax_loading');
		var _t = this;
		mLF.ekSend( {
			busyIndicator : _t.mL,
			onComplete: function( rV ) {
				Site.showMessage( rV );
				_t.load( _t.mL );
			}
		});
	}
});
MediaLibrary.implement(new Events, new Options);




/**
 * Client side form validation
 */
var Validation = {
	_VALIDATION_HILIGHT_CLASS_NAME: 'fxValidationHighlight',

	_dateComparableValue: function( f, propPrefix ) {
		var el = f.elements;
		var dV = parseInt( el[ propPrefix + 'Year' ].value );
		dV = dV * 100 + parseInt( el[ propPrefix + 'Month' ].value );
		dV = dV * 100 + parseInt( el[ propPrefix + 'Day' ].value );
		return dV;
	},

	getForm : function( fHandle ) {
		var fHandleType = $type( fHandle );
		if ( fHandleType == "string" ) {
			return document.forms[ fHandle ];
		} else if ( fHandleType == "element" ) {
			if ( fHandle.tagName == 'FORM' ) {
				return fHandle;
			} else {
				fHandle = fHandle.form; // the fHandle is an input element otherwise
			}
		}
	},
	
	highlight: function( eL ) {
		var hiE = Site._findParentElement( eL, false, Validation._VALIDATION_HILIGHT_CLASS_NAME );
		if ( hiE ) Site.requireLoadHighlight( hiE );
	},
	
	notEmpty : function( vForm, fName, msg, callbackF ) {
		var f = Validation.getForm( vForm );
		if ( f.elements[ fName ].value != null ) {
			if ( f.elements[ fName ].value.trim() != "" ) {
				return true;
			}
		}
		if ( f.elements[ fName ] ) {
			Site.ShadowTabs._ensureVisible( f.elements[ fName ], true );
			Site.ensureVisible( f.elements[ fName ] );
			Validation.highlight( f.elements[ fName ] );
		}
		Site.showError( msg );
		if ( callbackF ) callbackF();
		return false;
	}
};

var CollectionValidator = {
     /**
       * vForm : form
       * collection : name of the collection 
       * fNames : properties names of collection's item that should be validated
       * relMsgs : messages, vFNames[0,1,...] <==> relMsgs[0,1,...] 
       */
    notEmpty : function( vForm , collection , fNames, relMsgs){
    	var f = Validation.getForm( vForm );
    	var elements =  f.getElements('input[name^='+collection+']');
    	for ( var i=0; i < fNames.length ; i++ ){
   			var fields = elements.filterByAttribute('name','$=',fNames[i]);
            for (var j=0 ; j < fields.length ; j++ ) {
     	        if ( fields[j].value == null || fields[j].value.trim() == "" ) {
					Site.ensureVisible( fields[j] );
					Site.ShadowTabs._ensureVisible( fields[j], true );
					Validation.highlight( f.elements[ fields[j].name ] );
					Site.showError( relMsgs[i] );
					return false;
				}
       	    }
       	}       
	   	return true;
    }

};


/**
 * selectbox scripts
 */
var Selectbox = {
	BUTTON_INACTIVE : "/img/sel_bt.gif",
	BUTTON_ACTIVE : "/img/sel_bta.gif",
	CLASS_AUTO_WIDTH : 'fxAutoWidth',
	
	showList : function elselShowList(o){
		
		var selectbox = $(o.parentNode);
		Selectbox.init(selectbox);
		
		var e = selectbox.getElementsByTagName('DIV').item(1);		
		e.className="elsellsta";
		
		
		o.src = this.BUTTON_ACTIVE;
		o.clickHandler = function (ev){
			var event = ev;
			if (!ev) {
				event = window.event;
			}
			var et = event.target || event.srcElement;
			while(et){
				if (et == e || et == o.parentNode) {
					return;
				}
				et = et.parentNode;
			}
			Selectbox.hideList(o);
		}
		
		if ( !selectbox.hasClass( Selectbox.CLASS_AUTO_WIDTH ) ) e.style.width = selectbox.clientWidth - 2 + "px";
		if (e.clientHeight > 196){
			e.style.height = "196px";
		}
		Selectbox.scroll(e);
		e.page = e.offsetHeight / e.sel.offsetHeight; 
		
		o.onclick = function (){Selectbox.hideList(o);return false};

		e.onkeypress = function (e){return Selectbox.keyPress(e,o);};
		e.onkeydown = function (e){return Selectbox.keyDown(e,o);};
		o.active = true;
		var inp = selectbox.getElementsByTagName('INPUT').item(0);
		o.prevValue = inp.value;
		if (document.addEventListener){
	  		document.addEventListener('click', o.clickHandler, true);	
		} else if (document.attachEvent){
	  		document.attachEvent('onclick', o.clickHandler);
		}
		
	},
	
	hideList : function elselHideList(o){
		var e = o.parentNode.getElementsByTagName('DIV').item(1);
		var inp = o.parentNode.getElementsByTagName('INPUT').item(0);
		e.className="elsellst";
		o.src = this.BUTTON_INACTIVE;
		o.onclick = function (){Selectbox.showList(o);return false};
		o.active = false;
		if (inp.onchange && (o.prevValue != inp.value)) {
			inp.onchange();
		}
		if (document.removeEventListener){
	  		document.removeEventListener('click', o.clickHandler, true); 

		}
		else if (document.detachEvent) {
	        document.detachEvent('onclick', o.clickHandler);
		}
	},
	toggleList : function toggleList(o){
		var i = o.parentNode.getElementsByTagName('INPUT').item(1);
		i.focus();
		if (!i.disabled){
			if (i.active){
				this.hideList(i);
			}
			else {
				this.showList(i);
			}
		}
	},
	
	initApi : function(selectbox){
		selectbox.getValue = Selectbox.getValue; // mootools lib getValue method is overwritten here
		selectbox.getSelectedOption = Selectbox.getSelectedOption;	
	},
	
	init : function(selectbox){

		if(!selectbox.inited){
		
			var hiddenInput = $ES('input',selectbox)[0];
			var optionsContainer = $ES('div',selectbox)[1];			
			var options = $ES('div',optionsContainer);
			
			options.each(function(option){			
					option.onmouseover = Selectbox.over;
					option.onclick = Selectbox.select;			
					option.value = option.title;
					option.title = "";
					if(option.value == hiddenInput.value){
						optionsContainer.sel = option;
					}			 
			}); 
	
			if (!optionsContainer.sel && options.length > 0) {
				optionsContainer.sel = options[0];
			}
			
			optionsContainer.sel.className = "elsellstia";
			selectbox.inited = true;
		}
	},
	
	getValue : function(){
		Selectbox.init(this);
		return this.getElementsByTagName('INPUT').item(0).value;	
	},
	
	getSelectedOption : function(){
		Selectbox.init(this);
		return this.getElementsByTagName('DIV').item(1).sel.innerHTML;	 
	},
	
	select : function elselSelect(){
		var o = this.parentNode.parentNode.getElementsByTagName('INPUT').item(1);
		Selectbox.hideList(o);
		Selectbox.setSel(this);
	},	
	
	over : function elselOver(){
		var d = this.parentNode;
		d.sel.className = "";
		d.sel = this;
		this.className = "elsellstia";
	},
	
	setSel : function elselSetSel(s){
		var d = s.parentNode;
		var i = s.parentNode.parentNode.getElementsByTagName('INPUT').item(0);
		var o = s.parentNode.parentNode.getElementsByTagName('INPUT').item(1);
		var t = s.parentNode.parentNode.getElementsByTagName('DIV').item(0);
		var old = i.value;
		t.innerHTML = s.innerHTML;
		i.value = s.value;
		d.sel.className = "";
		d.sel = s;
		d.sel.className = "elsellstia";
		if (i.onchange && (old != i.value) && !o.active) {
			i.onchange();
		}
	},
	
	setMyValue : function( inpE, val ) {
		return Selectbox.setValue( inpE, val );
	},
	
	setValue : function elselSetValue(o, val){
		var selectbox = $(o.parentNode);
		var e = selectbox.getElementsByTagName('DIV').item(1);
		Selectbox.init(selectbox);
		var a = e.getElementsByTagName('DIV');
		var s = null;
		for (var i = 0; i < a.length; i++){
			if (a[i].value == val){
				s = a[i];
				break;
			}
		}
		if (s) {
			Selectbox.setSel(s);
		}
		
	},

	setValueById : function elselSetValueById(id1, val){
		var d = document.getElementById(id1);
		var o = d.getElementsByTagName('INPUT').item(0);
		Selectbox.setValue(o,val);
	},
	
	keyDown : function elselKeyDown(ev, t){
		var ev = (ev) ? ev : window.event;
		var code = ev.keyCode;
		
		if ((code == 9)){
			if (t.active) {
				this.hideList(t);
				t.focus();
			}
			return true;
		}
		if ((code >= 33) && (code <= 40)) {
			if (!t.active) {
				this.showList(t);
			}
        		switch (code) {
            			case 38 : Selectbox.move(t, true);
                			break;
            			case 40 : Selectbox.move(t, false);
                			break;
            			case 33 : Selectbox.move(t, true, true);
                			break;
            			case 36 : Selectbox.move(t, true, false, true);
                			break;
            			case 34 : Selectbox.move(t, false, true);
                			break;
            			case 35 : Selectbox.move(t, false, false, true);
                			break;
            			default : break;
        		}
        		return false;
    		}
	},
	
	keyPress : function elselKeyPress(ev, t){
		var ev = (ev) ? ev : window.event;
		var code = (ev.charCode) ? ev.charCode : ev.keyCode;
		
		if ((code == 13) || (code == 10)){
			ev.cancelBubble = true;
			if (t.active) {
				this.hideList(t);
			}
			return false;
		}
		else if (code != 9 && code != 32){
			if (!t.active) {
				this.showList(t);
			}
			Selectbox.selChar(t,code);
			return false;
		}
	},
	
	selChar : function elselSelChar(o, code){
		var cl = String.fromCharCode(code).toLowerCase().charCodeAt(0);
		var cu = String.fromCharCode(code).toUpperCase().charCodeAt(0);
		var selectbox = $(o.parentNode);
		var e = selectbox.getElementsByTagName('DIV').item(1);
		Selectbox.init(selectbox);
		var a = e.getElementsByTagName('DIV');
		var s = null;
		var before = true;
		for (var i = 0; i < a.length; i++){
			if (a[i].innerHTML.charCodeAt(0) == cl || a[i].innerHTML.charCodeAt(0) == cu){
				if (!s) {
					s = a[i];
				}
				if (!before){
					s = a[i];
					break;
				}
				if (a[i] == e.sel){
					before = false;
				}
				
			}
			else if (s){
				break;
			}
		}
		if (s) {
			Selectbox.setSel(s);
			Selectbox.scroll(e);
		}
	},
	
	scroll : function elselScroll(l){
		if ((l.scrollTop > l.sel.offsetTop) || (l.scrollTop + l.offsetHeight < l.sel.offsetTop + l.sel.offsetHeight)) {
            		l.scrollTop = l.sel.offsetTop + l.sel.offsetHeight / 2 - l.offsetHeight / 2; 
            	}
	},
	move : function elselMove(o, up, page, all) {
	
		var e = o.parentNode.getElementsByTagName('DIV').item(1);
	    	var a = e.getElementsByTagName('DIV');
	    	if (a.length <= 1) {
	    		return false;
	    	}
	    	var s = null;
	    	var pageSize = (e.page && (e.page > 1)) ? Math.floor(e.page) : 1;
	    	if (!all) {
		        for (var i = 0; i < a.length; i++) {
		            if (a[i] == e.sel) {
		                if (up) {
		                    if (!page) {
		                        if (i > 0) {
		                            s = a[i - 1];
		                        }
		                        break;
		                    }
		                    else {
		                        s = (i > pageSize) ?  a[i - pageSize] : a[0];
		                        break;
		                    }
		                }
		                else {
		                    if (!page) {
		                        if (i < (a.length - 1)) {
		                            s = a[i + 1];
		                        }
		                        break;
		                    }
		                    else {
		                        s = (i < (a.length - 1 - pageSize)) ?  a[i + pageSize] : a[a.length - 1];
		                        break;
		                    }
		                }
		            }
		        }
	    	}
	    	else {
		        if (up) {
		            s = a[0];
		        }
		        else {
		            s = a[a.length - 1];
		        }
	    	}
	    	if (s) {
	        	Selectbox.setSel(s);
			Selectbox.scroll(e);
	    	}
	    	return false;
	}	
};




/**
 * Main hover menu bound to main tabs 
 */
var MainHOverMenu = new Class({
	options : {
		showDelay: 800,
		hideDelay: 20,
		elements: {
			//"startTab":{
			//},
			"messagesTab":{
				"all messages" : "/messages/all.ek",
				"network" : "/messages/network.ek",
				"event" : "/messages/event.ek",
				"drafts" : "/messages/draft.ek",
				"sent" : "/messages/sent.ek"
			},
			"contactsTab":{
				"all contacts" : "/contacts/all.ek",
				"network" : "/contacts/network.ek",
				"groups" : "/contacts/groups.ek",
				"locations" : "/contacts/locations.ek",
				"unconfirmed" : "/contacts/unconfirmed.ek",
				"to confirm" : "/contacts/toConfirm.ek"
			},
			"eventsTab":{
				"all events" : "/events/all.ek",
				"current" : "/events/current.ek",
				"favorites" : "/events/favorites.ek",
				"past" : "/events/past.ek"
			},
			"cardsTab":{
				"all letters" : "/cards/all.ek",
				"sent" : "/cards/sent.ek",
				"received" : "/cards/received.ek"
			},
			"profileTab":{
				"basics" : "/profile/basic.ek",
				"contact info" : "/profile/contact.ek",
				"web" : "/profile/web.ek",
				//"family" : "/profile/family.ek",
				//"interests" : "/profile/interests.ek",
				"work" : "/profile/work.ek",
				"settings" : "/profile/settings.ek",
				"invoices" : "/profile/invoices.ek"
			}
		}
	},
	initialize: function(elements, options){
		this.setOptions(options);
		$$(elements).each(this.build, this);
	},

	build: function(el) {
		if ( el.hasClass( 'disabled' ) ) return;
		var tId = el.getAttribute('id');
		el.over = new Element( 'div', { 'class': 'jsmHolder ' + tId } );
		el.over.injectTop( $( 'container' ) );
		el.addEvent('mouseenter', function(event){ this.start(el); }.bind(this));
		var end = function(event){ this.end(el); }.bind(this);
		el.addEvent('mouseleave', end);
		el.addEvent('trash', end);

		el.over.addEvent('mouseenter', function(event){ $clear( el.timer ); });
		el.over.addEvent('mouseleave', end);
		el.over.addEvent('trash', end);
		
		var kill = function(e){ $clear( el.timer ); this.hide(el); }.bind( this );
		el.addEvent( 'mouseup', kill );
	},

	start: function(el){

		if ( !el.built ) {
			el.empty = true;
			var tId = el.getAttribute('id');
			if ( this.options.elements[ tId ] ) {
				for ( var z in this.options.elements[ tId ] ) {
					var ex = new Element('div');
					ex.url = this.options.elements[ tId ][ z ];
					ex.onclick = function(e) {
						new Event(e).stop();
						if ( this.url ) Site.mtClk( this.url );
						return false;
					}
					if ( !ex.url ) ex.addClass( 'disabled' );
					ex.setHTML( z );
					ex.inject( el.over );
					el.empty = false;
				}
			}
			el.built = true;
		}
		
		$clear( el.timer );
		if ( !el.empty ) {
			if ( this.showed ) {
				this.show( el );
			} else {
				el.timer = this.show.delay(this.options.showDelay, this, [el]);
			}
		} else {
			if ( this.showed ) this.showed = el;
		}
	},
	end: function(el) {
		$clear( el.timer );
		el.timer = this.hide.delay(this.options.hideDelay, this, [el]);
	},
	show: function(el) {
		if ( el && el.over && el.over.setStyle ) {
			el.over.setStyle('display', 'block');
			this.showed = el;
		}
	},

	hide: function(el) {
		if ( el && el.over && el.over.setStyle ) {
			el.over.setStyle('display', 'none');
			if ( this.showed == el ) {
				this.showed = null;
			}
		}
	}
	
});
MainHOverMenu.implement(new Events, new Options);







/**
 * I[nteraction]Hovers - like on contact list
 */
var IHovers = new Class({
	options : {
		showDelay: 900, 
		hideDelay: 300, 
		fixed: true,
		buildOnInit: true
	},
	
	initialize : function( elements, options ) {
		this.setOptions( options );
		IHovers._I = this; // current singleton instance
		if ( this.options.buildOnInit ) $$(elements).each(this.build, this);
	},
	findMyHover: function( el ) {
		return $( el.getAttribute( 'id' ) + '_hover' );
	},
	findTrigger: function( el ) { return el; },
	build: function(el){
		var toolTip = this.findMyHover( el );
		if ( !toolTip ) return toolTip;

		// place hover outside scrolling window
		// this hover needs to be outside of scrolling container - for layout in mozilla - z-index setting is not helping
		toolTip.inject( $( 'contents' ) );
		toolTip.built = true; // set flag as BUILT
		
		var triggerEl = this.findTrigger( el );
		triggerEl.addEvent('mouseenter', function(event){
			$clear( triggerEl.hidder );
			this.start( toolTip );
			this.position( el, toolTip );
		}.bind(this));
		
		triggerEl.addEvent('mouseleave', function(event){
			$clear(this.timer);
			triggerEl.hidder = this.hide.delay(this.options.hideDelay, this, toolTip);
		}.bind(this));
		
		// cleanup function
		toolTip.cleanup = function() {
			if ( this.addition ) {
				this.addition.remove();
				this.addition = null;
			}
		}.bind( toolTip );
		
		toolTip.close = function() {
			this.hide( toolTip );
		}.bind( this );
		
		toolTip.addEvent('mouseleave', function(event){
			triggerEl.hidder = this.hide.delay(this.options.hideDelay, this, toolTip);
		}.bind(this));
		toolTip.addEvent('mouseenter', function(event){
			$clear( triggerEl.hidder );
		});
				
		return toolTip;
	},
	start: function(el) {
		if ( this.showed != el ) {
			if ( this.showed ) this.hide( this.showed );
		}
		$clear(this.timer);
		this.timer = this.show.delay(this.options.showDelay, this, [el]);
	},	
	show: function(el){
		if ( this.showed ) {
			this.hide( this.showed );
		}
		el.setStyle( "display", "block" );
		this.showed = el;
	},
	position: function(element, toolTip){
		var pos = element.getPosition( $$( '.scrolledWindow' ) );
		toolTip.setStyles({
			'left': pos.x,
			'top': pos.y
		});
	},
	hide: function( toolTip ){
		if ( toolTip ) {
			if ( $defined( toolTip.cleanup ) ) {
				toolTip.cleanup();
			}
			toolTip.setStyle( "display", "none" );
		}
		this.showed = null;
	},
	
	

	removeContact : function( contactId ) {
		if ( contactId && contactId > 0 ) {
			var cE = $( 'c_' + contactId ); // remove contact element
			if ( cE ) cE.remove();
			cE = $( 'c_' + contactId + '_hover' ); // .. and corresponding hover
			if ( cE ) cE.remove();
		}
	},
		
	/** user for refreshing contents of modified contact - ajax/json */
	refreshItem: function( contactContents ) {
		var newC = new Element("div");
		newC.setHTML( contactContents );
		var hover = newC.getElement("div"); // hover element with contactId attribute set
		var contactId = parseInt( hover.getAttribute("contactId") );
		if ( contactId > 0 ) {
			// toggle hover contents
			$('c_'+contactId+'_hover').setHTML( hover.innerHTML );
			hover.remove();
			// toggle contacts contents
			$('c_'+contactId).setHTML( newC.innerHTML );
		}
		newC.remove();
	},
	
	// additional functionality concerning actions inside hovers with some additional panels
	
	closeAddition : function() {
		if ( this.showed ) {
			this.showed.cleanup();
			//this.hide(); // as well hide whole popup as now mouse is outside of it
		}
		return false;
	},
	
	
	showAddition : function( url, initCheckboxes, options ) {
		var additionDiv = new Element( "div", { "class" : "additionalPart" } );
		
		this.showed.cleanup();
		this.showed.addition = additionDiv;
		additionDiv.inject( this.showed );
		
		var newElementsE = null;
		if ( initCheckboxes ) {
			newElementsE = additionDiv;
		}
		
		new EkAjax( url, {
			update: additionDiv,
			busyIndicator: additionDiv,
			initNewElements: newElementsE,
			evalScripts: true,
			onComplete: function( responseValue ) {
				if ( options ) {
					if ( options.onLoad ) {
						options.onLoad.call( options, additionDiv );
					}
					var frm = additionDiv.getElement( 'form' );
					if ( options.fields ) {
						for ( var fI in options.fields ) { // todo - if field does not exist do a hidden one
							frm.elements[ fI ].value = options.fields[ fI ];
						}
					}
					if ( options.makeAjaxSubmit ) { // overload the form with ajax submit only
						if ( frm ) {
							frm.addEvent('submit', function(e) {
								//prevent normal submit
								new Event(e).stop();
								additionDiv.addClass( 'ajax_loading' );
								//
								this.send({
									evalScripts: true,
									onComplete: function( responseValue ) {
										additionDiv.removeClass('ajax_loading');
										// hide box
										additionDiv.setStyle( 'display', 'none' );
										Site.showMessage( responseValue.clean() );
									},
									onFailure: function() {
										additionDiv.removeClass('ajax_loading');
										// hide box
										additionDiv.setStyle( 'display', 'none' );
										Site.showError( 'Error submitting ajax request' );
									}
								});
							});
						}
					} else {
						if ( frm ) {
							frm.addEvent('submit', function(e) { // just show that its being submitted
								additionDiv.addClass( 'ajax_loading' );
							});
						}
					}
				}
			}
		}).request();
		return false;
	}
	
});
IHovers.implement(new Events, new Options);






/**
 * G[uestList]I[nteractive]Hovers
 */
var GIHovers = IHovers.extend({
	options : {
		showDelay: 1500, 
		buildOnInit : false
	},
	
	initialize: function( elements, options ){
		// init parent
		this.parent( elements, options );
		GIHovers._I = this; // current singleton instance
	},
	
	findMyHover: function( el ) {
		var hE = $E( 'div.contactHover', el );
		if ( hE && hE.built ) return null;
		return hE;
	},
	findTrigger: function( el ) { return el.getElement('.fxHvrTrig'); },
	build: function(el) {
		var toolTip = this.parent( el );
		if ( !toolTip ) return toolTip;
		// on first entry as well proceed show
		this.findTrigger( el ).fireEvent( 'mouseenter', this );
		return toolTip;
	},
	
	overMe: function( el ) {
		this.build( $( el ) );
		return false;
	},
	
	outMe: function(){}
		
});






/** L[ist]A[ction]Combo */
var LACombo = new Class({
	options : {
		showDelay: 900, 
		hideDelay: 300,
		reccurent: true // 
	},
	
	
	initialize: function( triggerE, contactId, options ) {
		this.setOptions( options );
		this.element = $( triggerE );
		if ( this.element.laCombo && this.options.reccurent ) return;
		this.element.laCombo = this.element.getSize().size;
		this.contactId = contactId;
		this.bind();
	},
	
	bind: function() {
		var triggerF = function() { this.start(); }.bind( this );
		if ( this.options.reccurent ) this.element.addEvent( 'mouseenter', triggerF );
		this.element.addEvent( 'mouseleave', function() { $clear( this.timer ); this.timer = this.hide.delay(this.options.hideDelay, this); }.bind( this ) );
		triggerF();
	},
	
	build: function(el){
		var laCombo = new Element( 'div', { 'id': 'listActionCombo' });
		var cMarg = new Element( 'div', { 'class': 'comboMarginer' });
		this.buildElements( cMarg );
		cMarg.inject( laCombo );
		laCombo.inject( $( 'contents' ) );
		return laCombo;
	},
	buildElements: function( marginerContainerE ) {
		// 
		marginerContainerE.setHTML( $( 'g_' + this.contactId + '_h' ).getElement( 'div.actions' ).innerHTML );
	},
	start: function() {
		if ( this.combo ) this.hideMe();
		$clear( this.timer );
		this.timer = this.show.delay(this.options.showDelay, this);
	},	
	show: function() {
		$clear( this.timer );
		this.combo = this.build();
		this.combo.setStyle( 'display', 'block' );
		this.position();
		this.combo.addEvent( 'mouseenter', function() { $clear( this.timer ); }.bind( this ) );	
		this.combo.addEvent( 'mouseleave', function() { this.hide(); }.bind( this ) );	
	},
	position: function(){
		var pos = this.element.getPosition( $$( '.scrolledWindow' ) );
		this.combo.setStyles({
			'left': pos.x + this.element.laCombo.x.toInt() - this.combo.getSize().size.x.toInt(),
			'top': pos.y + this.element.laCombo.y.toInt()
		});
	},
	hideMe: function() {
		if ( this.combo ) {
			this.combo.remove();
			this.combo = null;
		}
	},
	hide: function(){
		$clear( this.timer );
		if ( this.combo ) {
			this.timer = this.hideMe.delay( this.options.hideDelay, this );
		}
	}
});
LACombo.implement(new Events, new Options);





/**
 * Hovers of image thumbs - showing whole size images underneath - user e.g. inside media library with timeout 2s
 */
var ImgTips = new Class({

	options: {
		onShow: function(tip){
			tip.setStyle('display', 'block');
		},
		onHide: function(tip){
			tip.setStyle('display', 'none');
		},
		showDelay: 1000,
		hideDelay: 10,
		offsets: {'x': 24, 'y': 17}
	},

	initialize: function(elements, options){
		this.setOptions(options);
		this.toolTip = $('imgThumbPreview');
		if ( !this.toolTip ) {
			this.toolTip = new Element('div', { 'id': 'imgThumbPreview' });
			this.toolTip.injectTop( this.options.container || document.body );
			this.toolTip.empty();
			this.wrapper = new Element('div').inject(this.toolTip);
		} else {
			this.wrapper = this.toolTip.getElement( 'div' );
		}
		$$(elements).each(this.build, this);
		if (this.options.initialize) this.options.initialize.call(this);
	},

	build: function(el){
		var url = el.getStyle('background-image');
		if ( url.length < 5 ) { // 'none'
			el.$tmp.assetUrl = el.getAttribute( 'src' );
		} else {
			el.$tmp.assetUrl = url.substring( 4, url.length-2 ); // get rid of 'url(' and ')'
		}
		el.addEvent('mouseenter', function(event){
			this.start(el);
			this.position(el);
		}.bind(this));
		var end = this.end.bind(this);
		el.addEvent('mouseleave', end);
		el.addEvent('trash', end);
	},

	start: function(el){
		this.wrapper.empty();
		if (el.$tmp.assetUrl){
			new Element('img', {'src':el.$tmp.assetUrl}).inject( this.wrapper );
		}
		$clear(this.timer);
		this.timer = this.show.delay(this.options.showDelay, this);
	},

	end: function(event){
		$clear(this.timer);
		this.timer = this.hide.delay(this.options.hideDelay, this);
	},

	position: function(element){
		var pos = element.getPosition( this.options.overflown );
		this.toolTip.setStyles({
			'left': pos.x + this.options.offsets.x,
			'top': pos.y + this.options.offsets.y
		});
	},

	show: function(){
		if (this.options.timeout) this.timer = this.hide.delay(this.options.timeout, this);
		this.fireEvent('onShow', [this.toolTip]);
	},

	hide: function(){
		this.fireEvent('onHide', [this.toolTip]);
	}

});

ImgTips.implement(new Events, new Options);




/*
 * Jajah scripts
 */
var Jajah = {

	setJajahNumber: function(countryCode, number) {
		$('jajahToNumber').value = number;
		Selectbox.setValueById('jajahCountryCode', countryCode);
	}
}





/**
 * Design/Layout selector
 */
var Designer = new Class({
	
    cssLink : null,
    
    selectedDesign : null,
    
    OWN_UPLOAD_DESIGN : 'upload',
    OWN_UPLOAD_LAYOUT : 'image_and_text',
    SELECTED_CLASS : 'ltThumbSelected',
    POPUP_ID : 'invitationLayout',
    
    SINGLE_LEVEL_DESIGNS : [ this.OWN_UPLOAD_DESIGN ],
    WEB_CACHE_TOKEN : '461',
    
    initialize: function( useExistingLinkElem, isNonCssBased ) {
    	Designer._I = this; // current singleton instance
    	if ( useExistingLinkElem ) {
    		var links = document.getElementsByTagName( 'link' );
    		this.cssLink = links[ links.length - 1 ];
    	}
    	this.isNonCssBased = !!isNonCssBased;
    },
    
    close: function() {
    	var popupE = $( this.POPUP_ID );
    	if ( popupE ) popupE.close();
    	Designer._I = null;
    },
    closeAddition : function( eventPartName ) {
    	return Popups.closeAddition( this.POPUP_ID );
    },
    
    chooseUploadDesign : function( divE, eventPartName ) {
    	if ( divE ) {
	    	this.closeAddition( eventPartName );
	    	this._updateSelectedDesign( divE );
    	}
    	return this.selectLayout( divE, this.OWN_UPLOAD_DESIGN, this.OWN_UPLOAD_LAYOUT, eventPartName );
    },
    
    openSpecialRequestForm : function( divE, url, eventPartName ) {
    	this._updateSelectedDesign( divE );
    	return Popups.showPopupAddition( this.POPUP_ID, url, { recursive : true } );
    },
    
    openSpecialRequestPopup: function( ) {
    	var url = '/events/event/invitation/layout/specialRequest.ek';
    	return Popups.loadPopup( 'makeRequest', url, null, true, { enforceModal: true } );
    },
     
	openLayoutSelector : function( eventPartName, onOpenedF ) {
		var url = '/events/event/'+eventPartName+'/layoutSelector.ek';
		url += "?design=" + $('designHolder').value;
		var _T = this;
		return Popups.loadPopup( _T.POPUP_ID, url, null, false, { onComplete: function(rV) {
			_T.selectedDesign = $( _T.POPUP_ID ).getElement( 'div.'+_T.SELECTED_CLASS );
			if ( ! ( _T.selectedDesign ) ) { 
				// 
				_T.selectedDesign = $( _T.POPUP_ID ).getElement( 'div.fxNormalCategoriesH div.ltThumb' );
				_T.selectedDesign.addClass( _T.SELECTED_CLASS );
			}
			var selectedDesignName = null;
			if ( _T.selectedDesign ) selectedDesignName = _T.selectedDesign.getAttribute('name');
			if ( _T.selectedDesign && selectedDesignName != _T.OWN_UPLOAD_DESIGN ) {
				var url = '/events/event/'+eventPartName+'/layouts.ek';
				url += "?design=" + selectedDesignName;
				url += "&layout=" + $( 'layoutHolder' ).value;
				Popups.showPopupAddition( _T.POPUP_ID, url );
			}
			if ( onOpenedF ) {
				onOpenedF( $( _T.POPUP_ID ) );
			}
		}} );
	},
	
	initLayoutSelector: function( eventPartName ) {
	},
	
	
	_updateSelectedDesign : function( newSelectedDesignE ) {
		if ( this.selectedDesign ) {
			if ( this.selectedDesign.removeClass ) {
				this.selectedDesign.removeClass(this.SELECTED_CLASS);
			}
		}
		this.selectedDesign = $( newSelectedDesignE );
		this.selectedDesign.addClass(this.SELECTED_CLASS);
	},
	
	selectDesign : function( div, design, eventPartName ) {
		var url = '/events/event/'+eventPartName+'/layouts.ek';
		url += "?design=" + design;
		if ( div ) this._updateSelectedDesign( div );
		this.fireEvent( 'onDesignChanged', design ); //
		return Popups.showPopupAddition( this.POPUP_ID, url );
	},

	setLayout: function( design, layout, eventPartName ) {
		$('designHolder').value = design;
		$('layoutHolder').value = layout;
		this.fireEvent( 'onLayoutChanged', [ design, layout ] ); //
		if ( !this.isNonCssBased ) this.setTemplate( design, layout, eventPartName );
	},
	
	selectLayout : function( div, design, layout, eventPartName ) {
		this.setLayout( design, layout, eventPartName );
		var selectorPopup = $( this.POPUP_ID );
		if ( selectorPopup ) selectorPopup.close();
		return false;
	},
	
	_initCssLinkElement : function( href ) {
		this.cssLink = new Element( 'link', {
			'rel' : 'stylesheet',
			'type' : 'text/css',
			'href' : href
		});
		var styles = document.getElementsByTagName( 'style' );
		this.cssLink.injectAfter( styles[ styles.length - 1 ] );
		return this.cssLink;
	},
	
	setTemplate : function( design, layout, eventPartName ){
		var href = "/css/events/templates/"+eventPartName+"_"+design+"_"+layout+".css?v=" + this.WEB_CACHE_TOKEN;
		if ( !this.cssLink ) this._initCssLinkElement( href );
    	else this.cssLink.href = href;
	},

	isLayoutAdjustable : function( design, layout ) {
		return this.OWN_UPLOAD_DESIGN == design && this.OWN_UPLOAD_LAYOUT == layout;
	},

	preloadDesignCss : function( design, layout, layoutPart ) {
		var styles = document.getElementsByTagName( 'style' );
		var hrefUrl = "/css/events/templates/" + layoutPart + "_" + design + "_" + layout + ".css?v=" + this.WEB_CACHE_TOKEN;
		this.cssLink =  new Element( 'link', {
			'rel' : 'stylesheet',
			'type' : 'text/css',
			'href' : hrefUrl
		});
		this.fireEvent( 'onDesignChanged', design ); //
		this.fireEvent( 'onLayoutChanged', design, layout ); //
		this.cssLink.injectAfter( styles[ styles.length - 1 ] );
	}
	
});
Designer.implement( new Events );





/**
 *
 */
var WelcomeHovers = Tips.extend({ // 
	options : {
		className: 'welcomeTool',
		offsets: {'x': -15, 'y': 8}
	},

	build: function(el){
		el.$tmp.myTitle = false;
		var hid = el.getAttribute( 'hid' );
		if ( hid && hid.length > 0 ) {
			el.$tmp.myText = '<img src="/img/welcome/hovers/' + hid + '.png"/>';
		} else {
			el.removeClass('fxWHover');
			return;
		}
	
		el.addEvent('mouseenter', function(event){
			this.start(el);
			if (!this.options.fixed) this.locate(event);
			else this.position(el);
		}.bind(this));
		if (!this.options.fixed) el.addEvent('mousemove', this.locate.bindWithEvent(this));
		var end = this.end.bind(this);
		el.addEvent('mouseleave', end);
		el.addEvent('trash', end);
	},

	locate: function(event){
		var win = {'x': window.getWidth(), 'y': window.getHeight()};
		var scroll = {'x': window.getScrollLeft(), 'y': window.getScrollTop()};
		var tip = {'x': this.toolTip.offsetWidth, 'y': this.toolTip.offsetHeight};
		var prop = {'x': 'left', 'y': 'top'};
		for (var z in prop){
			var pos = event.page[z] + this.options.offsets[z];
			//if ((pos + tip[z] - scroll[z]) > win[z]) pos = event.page[z] - this.options.offsets[z] - tip[z];
			this.toolTip.setStyle(prop[z], pos);
		};
	}

	
});



//
Site.ShadowTabs = {
	_CSS_CONTAINER_CLASS : 'fxTabsCtnr', //
	_CSS_CONTENTS_CLASS : 'fxTabsContents', //
	_CSS_TABS_HANDLE_CLASS : 'fxTab', //
	_CSS_TAB_ACTIVE : 'active',
	_CSS_CONTAINER_CLASS_PREFIX : 'stTabC', //
	_ATTRIB_ON_TAB_CHANGE_HANDLER : 'ontabchange',
	
	_preselectTab: function( tabHandle ) {
		tabHandle.getParent().getElements( 'div.' + Site.ShadowTabs._CSS_TABS_HANDLE_CLASS ).each( 
			function( e ) { e.removeClass( Site.ShadowTabs._CSS_TAB_ACTIVE ); } 
		);
		tabHandle.addClass( Site.ShadowTabs._CSS_TAB_ACTIVE );
	},
	
	_initAllTabs: function( tabContainerE ) {
		if ( !tabContainerE.allTabs ) {
			var allTabs = [];
			tabContainerE.getElements( '.' + Site.ShadowTabs._CSS_CONTENTS_CLASS ).each( function( tE ) {
				allTabs.push( tE.getAttribute( 'id' ) );
			} );
			tabContainerE.allTabs = allTabs;
		}
		return tabContainerE.allTabs;
	},
	
	select: function( tabE, reloadUrl ) {
		tabE = $( tabE );
		if ( tabE && !tabE.hasClass( 'disabled' ) ) {
			var tabContainerE = Site._findParentElement( tabE, false, Site.ShadowTabs._CSS_CONTAINER_CLASS );
			if ( tabContainerE ) {
				var tabContentsE = tabContainerE.getElement( '.' + Site.ShadowTabs._CSS_CONTENTS_CLASS );
				if ( tabContentsE ) {
					new EkAjax( reloadUrl, { 
						update : tabContentsE,
						busyIndicator : tabContainerE,
						onComplete: function() {
							Site.ShadowTabs._preselectTab( tabE );
						}
					} ).request();
				}
			}
		}
	},
	
	_validateTabExit: function( tE ) {
		return true;
		/*var formE = Site._findParentElement( tE, 'form' );
		if ( formE && formE.validate ) {
			var valDefaultFlag = formE._validate;
			formE._validate = true;
			var validateValue = formE.validate( formE );
			formE._validate = valDefaultFlag;
			return validateValue;
		}
		return true;*/
	},
	
	setTab: function( tabE, tabNameToShow, disableValidationCheck ) {
		tabE = $( tabE );
		if ( tabE && !tabE.hasClass( 'disabled' ) ) {
			if ( !(disableValidationCheck === true) && !Site.ShadowTabs._validateTabExit( tabE ) ) return;
			var tabContainerE = Site._findParentElement( tabE, false, Site.ShadowTabs._CSS_CONTAINER_CLASS );
			if ( tabContainerE ) {
				Site.ShadowTabs._initAllTabs( tabContainerE );
				for ( var i=0; i<tabContainerE.allTabs.length; i++ ) tabContainerE.removeClass( tabContainerE.allTabs[ i ] );
				tabContainerE.addClass( tabNameToShow );
				Site.ShadowTabs._preselectTab( tabE );
				Site.ShadowTabs._fireTabChangeEvent( tabContainerE, tabNameToShow );
			}
		}
	},
	
	_fireTabChangeEvent: function( tabContainerE, tabNameToShow ) {
		var onTabChangeEvent = tabContainerE.getAttribute( Site.ShadowTabs._ATTRIB_ON_TAB_CHANGE_HANDLER );
		if ( onTabChangeEvent ) {
			Site.ShadowTabs._$tmpTCE = false;
			eval( "Site.ShadowTabs._$tmpTCE = " + onTabChangeEvent );
			if ( Site.ShadowTabs._$tmpTCE ) {
				if ( $type( Site.ShadowTabs._$tmpTCE ) == 'function' ) {
					Site.ShadowTabs._$tmpTCE.call( tabContainerE, tabNameToShow );
					Site.ShadowTabs._$tmpTCE = false;
				}
			}
		}
	},
	
	_findTab: function( eL, findNext ) { // 
		var tabContentsE = Site._findParentElement( eL, false, Site.ShadowTabs._CSS_CONTENTS_CLASS );
		if ( tabContentsE ) {
			if ( !Site.ShadowTabs._validateTabExit( eL ) ) return;
			var tabContainerE = Site._findParentElement( eL, false, Site.ShadowTabs._CSS_CONTAINER_CLASS );
			if ( tabContainerE ) {
				Site.ShadowTabs._initAllTabs( tabContainerE );
				var activeTab = null;
				tabContainerE.getElements( '.' + Site.ShadowTabs._CSS_TABS_HANDLE_CLASS ).each( function( tE ) {
					if ( tE.hasClass( Site.ShadowTabs._CSS_TAB_ACTIVE ) && !activeTab ) activeTab = tE;
				});
				if ( activeTab ) {
					var tabNameToShow = null;
					if ( findNext ) {
						Site.ShadowTabs._preselectTab( activeTab.getNext() );
						tabNameToShow = tabContentsE.getNext().getAttribute( 'id' );
					} else {
						Site.ShadowTabs._preselectTab( activeTab.getPrevious() );
						tabNameToShow = tabContentsE.getPrevious().getAttribute( 'id' );
					}
					for ( var i=0; i<tabContainerE.allTabs.length; i++ ) tabContainerE.removeClass( tabContainerE.allTabs[ i ] );
					tabContainerE.addClass( tabNameToShow );
					Site.ShadowTabs._fireTabChangeEvent( tabContainerE, tabNameToShow );
				}
			}
			return tabContainerE;
		}
		return false;
	},

	naviNext: function( eL ) {
		var tX = Site.ShadowTabs._findTab( eL, true );
		return false;
	},	
	naviPrev: function( eL ) {
		var tX = Site.ShadowTabs._findTab( eL, false );
		return false;
	},

	_ensureVisible: function( eL, disableValidationCheck ) {
		while ( eL ) eL = Site.ShadowTabs._ensureVisibleSingle( $(eL).getParent(), disableValidationCheck );
	},
	
	_ensureVisibleSingle: function( eL, disableValidationCheck ) {
		var tabContentsE = Site._findParentElement( eL, false, Site.ShadowTabs._CSS_CONTENTS_CLASS );
		if ( tabContentsE ) {
			var tabIndex = 0;
			var v = tabContentsE;
			while ( v = v.getPrevious() ) tabIndex++;
			var tabContainerE = Site._findParentElement( tabContentsE, false, Site.ShadowTabs._CSS_CONTAINER_CLASS );
			if ( tabContainerE ) {
				//
				var tabsHC = tabContainerE.getElement( '.' + Site.ShadowTabs._CSS_TABS_HANDLE_CLASS );
				if ( tabsHC ) tabsHC = tabsHC.getParent().getFirst();
				if ( tabsHC ) {
					while ( tabIndex > 0 && tabsHC ) {
						tabIndex--;
						tabsHC = tabsHC.getNext();
					}
					if ( tabsHC ) {
						var tabHandleToForceVisible = tabsHC;
						if ( tabsHC && !tabsHC.hasClass( Site.ShadowTabs._CSS_TAB_ACTIVE ) ) {
							Site.ShadowTabs.setTab( tabsHC, tabContentsE.getAttribute( 'id' ), disableValidationCheck );
						}
					}
				}
			}
			return tabContainerE;
		}
		return false;
	},
	
	_preselectOnAnchor: function() {
		var hashU = document.location.hash;
		if ( hashU && hashU.length > 4 ) {
			hashU = hashU.substr( 1 );
			$ES( '.' + Site.ShadowTabs._CSS_TABS_HANDLE_CLASS ).each( function( tHE ) {
				var tabIdA = tHE.getAttribute( 'tabId' );
				if ( tabIdA && hashU == tabIdA ) Site.ShadowTabs.setTab( tHE, tabIdA );
			});
		}
	}
	
	
	
}
 

