/*
 * vnh - vioma information handler
 * 
 */
(function($) {
	if ( typeof window.cst_remember != 'undefined' ) {
		return;
	}
	
	_lib_load( 'Cookies' );
	
	if ( typeof JSON == 'undefined' ) {
		_lib_load( 'jquery.json' );
	}
	
	window.cst_remember = function (){};
	cst_remember.debug = false;
	
	if( window.location.hostname.indexOf( '.rm.webdev' ) != -1 ) {
		cst_remember.debug = window.console && window.console.firebug;
	}

	cst_remember.layer_show_before = function( layer ){ return true; },
	cst_remember.layer_show_after = function( layer ){ return true; },
	cst_remember.layer_hide_before = function( layer ){ return true; },
	cst_remember.layer_hide_after = function( layer ){ return true; },
	cst_remember.layer_inited = function( layer ){ return true; },
	cst_remember.layer_has_changed = function( layer ){ return true; },
	cst_remember.layer_updated = function( layer, item_count ){ return true; },
	cst_remember.layer_group_added = function( layer, item_count, element ){ return true; }
	cst_remember.layer_group_item_added = function( layer, item_count ){ return true; }
	cst_remember.strings_inited = function( strings ){ return true; }

	cst_remember.utf8_encode = function( string ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.utf8_encode( ' + string + ' )' );
		return string;
	};

	cst_remember.utf8_decode = function( string ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.utf8_decode( ' + string + ' )' );
		
		return string;
	};

	cst_remember.anchor_get = function() {
		if ( cst_remember.debug ) console.log( 'cst_remember.anchor_get()' );
		
		var anchor = window.location.hash.substring( 1 );
		
		if ( anchor.indexOf( cst_remember.settings.anchorprefix ) != -1 ) {
			return anchor.substring( anchor.indexOf( cst_remember.settings.anchorprefix ) + cst_remember.settings.anchorprefix.length );
		}
		
		return false;
	};
	
	/*
	 * scroll to an element and call callback function
	 */
	cst_remember.scroll_to = function( id ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.scroll_to( ' + id + ' )' );

		if ( cst_remember.settings._cookie[id] == undefined ) return false;
		
		if ( cst_remember.settings._cookie[id].type != 'site' ) {
			jQuery( 'html,body' ).animate({ scrollTop: cst_remember.settings._cookie[id].scrollTop });
		}
	};
	
	/*
	 * scroll to an element and call callback function
	 */
	cst_remember.scroll_to_current = function() {
		if ( cst_remember.debug ) console.log( 'cst_remember.scroll_to_current()' );
		
		window.setInterval(function(){
			var anchor_new = window.location.hash.substring( 1 );

			if ( cst_remember._anchor != anchor_new ) {
				cst_remember._anchor = window.location.hash.substring( 1 );
				cst_remember.scroll_to( cst_remember.anchor_get() );
			}
			
			if ( cst_remember._anchor === undefined ) {
				cst_remember._anchor = window.location.hash.substring( 1 );
			}
		}, 500 );
	};
	
	
	/*
	 * set default values
	 */
	cst_remember.strings_init = function() {
		if ( cst_remember.debug ) console.log( 'cst_remember.strings_init()' );

		cst_remember.strings = [];
		
		cst_remember.strings['de'] = [];
		cst_remember.strings['de']['remember'] = 'Merkblatt';
		cst_remember.strings['de']['request'] = 'Anfragen';
		cst_remember.strings['de']['nothing'] = 'Nichts vorgemerkt';
		cst_remember.strings['de']['delete'] = 'löschen';
		cst_remember.strings['de']['notice_left'] = 'Das Angebot wurde dem Merkblatt hinzugefuegt. Sie finden das Merkblatt links.';
		cst_remember.strings['de']['notice_right'] = 'Das Angebot wurde dem Merkblatt hinzugefuegt. Sie finden das Merkblatt rechts.';
		cst_remember.strings['de']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';

		cst_remember.strings['it'] = [];
		cst_remember.strings['it']['remember'] = 'Il mio promemoria';
		cst_remember.strings['it']['request'] = 'richiesta';
		cst_remember.strings['it']['nothing'] = 'Nessuna prenotazione';
		cst_remember.strings['it']['delete'] = 'cancellare';
		cst_remember.strings['it']['notice_left'] = 'La offerta e aggiungiato sulla promemoria';
		cst_remember.strings['it']['notice_right'] = 'La offerta e aggiungiato sulla promemoria';
		cst_remember.strings['it']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';

		cst_remember.strings['fr'] = [];
		cst_remember.strings['fr']['remember'] = 'Mon panier';
		cst_remember.strings['fr']['request'] = 'Envoyer une demande';
		cst_remember.strings['fr']['nothing'] = 'Aucune sélection';
		cst_remember.strings['fr']['delete'] = 'supprimer';
		cst_remember.strings['fr']['notice_left'] = 'Votre sélection a bien été enregistrée. Elle se trouve dans votre panier à gauche';
		cst_remember.strings['fr']['notice_right'] = 'Votre sélection a bien été enregistrée. Elle se trouve dans votre panier à droite';
		cst_remember.strings['fr']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';

		cst_remember.strings['cz'] = [];
		cst_remember.strings['cz']['remember'] = 'Poznámky';
		cst_remember.strings['cz']['request'] = 'Popt&#225;vky';
		cst_remember.strings['cz']['nothing'] = 'Nebylo nic poznamen&#225;no';
		cst_remember.strings['cz']['delete'] = 'Smazat';
		cst_remember.strings['cz']['notice_left'] = 'Tato nab&#237;dka byla vlo&#382;ena do pozn&#225;mkov&#233; tabulky. Tuto tabulku naleznate vlevo.';
		cst_remember.strings['cz']['notice_right'] = 'Tato nab&#237;dka byla vlo&#382;ena do pozn&#225;mkov&#233; tabulky. Tuto tabulku naleznate vpravo.';
		cst_remember.strings['cz']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';

		cst_remember.strings['pl'] = [];
		cst_remember.strings['pl']['remember'] = 'Zapami&#281;ta&#263;';
		cst_remember.strings['pl']['request'] = 'Pytania';
		cst_remember.strings['pl']['nothing'] = 'Nic nie zosta&#322;o zaznaczone';
		cst_remember.strings['pl']['delete'] = 'Skasowa&#263;';
		cst_remember.strings['pl']['notice_left'] = 'Aby zapami&#281;ta&#263; t&#261; ofert&#281;, prosz&#281; zaznaczy&#263; j&#261; na podanej li&#347;cie. Lista znajduje si&#281; po lewej stronie.';
		cst_remember.strings['pl']['notice_right'] = 'Aby zapami&#281;ta&#263; t&#261; ofert&#281;, prosz&#281; zaznaczy&#263; j&#261; na podanej li&#347;cie. Lista znajduje si&#281; po prawej stronie.';
		cst_remember.strings['pl']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';
		
		cst_remember.strings['nl'] = [];
		cst_remember.strings['nl']['remember'] = 'Kattebelletje';
		cst_remember.strings['nl']['request'] = 'Aanvragen';
		cst_remember.strings['nl']['nothing'] = 'Niets genoteerd';
		cst_remember.strings['nl']['delete'] = 'verwijderen';
		cst_remember.strings['nl']['notice_left'] = 'Het aanbod werd aan uw winkelmandje toegevoegd. U kunt het links terugvinden.';
		cst_remember.strings['nl']['notice_right'] = 'Het aanbod werd aan uw winkelmandje toegevoegd. U kunt het rechts terugvinden.';
		cst_remember.strings['nl']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';
		
		cst_remember.strings['bg'] = [];
		cst_remember.strings['bg']['remember'] = 'Бележки';
		cst_remember.strings['bg']['request'] = 'Запитвания';
		cst_remember.strings['bg']['nothing'] = 'няма нищо отбелязано';
		cst_remember.strings['bg']['delete'] = 'Изтриване';
		cst_remember.strings['bg']['notice_left'] = 'Офертата бе добавена към Вашите бележки. В ляво ще намерите бележките.';
		cst_remember.strings['bg']['notice_right'] = 'Офертата бе добавена към Вашите бележки. В дясно ще намерите бележките.';
		cst_remember.strings['bg']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';
		
		cst_remember.strings['pt'] = [];
		cst_remember.strings['pt']['remember'] = 'Minhas anotações';
		cst_remember.strings['pt']['request'] = 'consultar';
		cst_remember.strings['pt']['nothing'] = 'nada marcado';
		cst_remember.strings['pt']['delete'] = 'apagar';
		cst_remember.strings['pt']['notice_left'] = 'A oferta foi adicionada na Memória, que se encontra ao lado esquerdo.';
		cst_remember.strings['pt']['notice_right'] = 'A oferta foi adicionada na Memória, que se encontra ao lado direito.';
		cst_remember.strings['pt']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';
		
		cst_remember.strings['ru'] = [];
		cst_remember.strings['ru']['remember'] = 'Памятка';
		cst_remember.strings['ru']['request'] = 'Сделать запрос';
		cst_remember.strings['ru']['nothing'] = 'Записей нет';
		cst_remember.strings['ru']['delete'] = 'удалить';
		cst_remember.strings['ru']['notice_left'] = 'Предложение внесено в памятку. Памятка расположена слева.';
		cst_remember.strings['ru']['notice_right'] = 'Предложение внесено в памятку. Памятка расположена справа.';
		cst_remember.strings['ru']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';
		
		cst_remember.strings['es'] = [];
		cst_remember.strings['es']['remember'] = 'Nota';
		cst_remember.strings['es']['request'] = 'Solicitud';
		cst_remember.strings['es']['nothing'] = 'No anotado';
		cst_remember.strings['es']['delete'] = 'borrar';
		cst_remember.strings['es']['notice_left'] = 'La oferta fue puesta en la notas. La nota se encuentra a la izquierda.';
		cst_remember.strings['es']['notice_right'] = 'La oferta fue puesta en la nota. La nota se encuentra a la derecha.';
		cst_remember.strings['es']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';
		
		cst_remember.strings['ro'] = [];
		cst_remember.strings['ro']['remember'] = 'Notite';
		cst_remember.strings['ro']['request'] = 'Intrebari';
		cst_remember.strings['ro']['nothing'] = 'Nimic notat';
		cst_remember.strings['ro']['delete'] = 'Sterge';
		cst_remember.strings['ro']['notice_left'] = 'Oferta a fost adaugata la notite. Notitele le gasiti in stanga.';
		cst_remember.strings['ro']['notice_right'] = 'Oferta a fost adaugata la notite. Notitele le gasiti in dreapta.';
		cst_remember.strings['ro']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';

		cst_remember.strings['en'] = [];
		cst_remember.strings['en']['remember'] = 'my notes';
		cst_remember.strings['en']['request'] = 'inquire';
		cst_remember.strings['en']['nothing'] = 'nothing noted';
		cst_remember.strings['en']['delete'] = 'delete';
		cst_remember.strings['en']['notice_left'] = 'This offer has been added to your notes. You can find it on the left under "my notes".';
		cst_remember.strings['en']['notice_right'] = 'This offer has been added to your notes. You can find it on the right under "my notes".';
		cst_remember.strings['en']['sites_only'] = 'Sie haben kein Angebot, Zimmer oder Program auf ihrem Merkzettel.';
		
		cst_remember.strings_inited( cst_remember.strings );
	};
	
	/*
	 * return string
	 */
	cst_remember.string_get = function( name, alternative ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.string_get( ' + name + ' )' );
		
		var language = cst_remember.settings.language || 'en';
		
		if ( cst_remember.strings[ language ] ) {
			if (cst_remember.strings[ language ][ name ]) {
				return cst_remember.strings[ language ][ name ];
			}
			if ( cst_remember.strings[ language ][ alternative ] ) {
				return cst_remember.strings[ language ][ alternative ];
			}
		}
		
		return false;
	};
	
	/*
	 * return the current language
	 */
	cst_remember.language_init = function() {
		var language = cst_remember.settings.language;
		
		
		if ( !language ) {
			var pathname = window.location.pathname.substring( 1 );
			language = pathname.substring( 0, pathname.indexOf( '/' ) )
			
			if ( language.length > 2 ) {
				language = false;
			}
		}
		
		cst_remember.settings.language_alias = language;
		cst_remember.settings.language = cst_remember.language_make_real( language );
	};

	cst_remember.language_make_real = function( language ) {
		switch( language ) {
			case 'de': case 'dx': return 'de';
			case 'fr': case 'fx': return 'fr';
			case 'it': case 'ix': return 'it';
			case 'cz': case 'cx': return 'cz';
			case 'bg': case 'bx': return 'bg';
			case 'ru': case 'rx': return 'ru';
			case 'pl': case 'px': return 'pl';
			case 'nl': case 'nx': return 'nl';
			default: return 'en';
		}
	};
	
	/*
	 * split "hrt1234" into { type: 'hrt', id: '1234' }
	 * if id is an integer, type would be set to "site"
	 */
	cst_remember.item_id_split = function( id ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.item_id_split( ' + id + ' )' );
	
		if ( id == undefined || id.length == 0 ) return false;
		
		var length = id.length
			type = '';
		
		for( var i = 0; i < length; i++ ) {
			var character = id.charAt( i );
			var code = id.charCodeAt( i );
	
			if ( code >= 97 && code <= 122 ) {
				type += '' + character;
			}
		}
		
		if ( type.length == 0 ) {
			return { 'type': 'site', 'id': id };
		}
	
		return { 'type': type, 'id': id.substring( type.length ) };		
	};
	
	/*
	 * add a group to notices
	 */
	cst_remember.group_add = function( element, id, name, url ){
		if ( cst_remember.debug ) console.log( 'cst_remember.group_add( ' + id + ', ' + name + ' )' );
	
		var cookie = cst_remember.cookie_get();
	
		if ( cookie == undefined ) {
			cookie = {};
		}
		
		if ( cookie[id] == undefined ) {
			cookie[id] = {
				name: cst_remember.utf8_decode( name ),
				url: cst_remember.utf8_decode( url || window.location.pathname + window.location.search ),
				items: {},
				scrollTop: jQuery( document ).scrollTop()
			};
		}
		
		cst_remember.save( cookie );
		cst_remember.layer_group_added( cst_remember.settings.container, cst_remember.settings._group_count, element );
	};
	
	/*
	 * delete a group from notices
	 */
	cst_remember.group_delete = function( id ){
		if ( cst_remember.debug ) console.log( 'cst_remember.group_delete( ' + id + ' )' );
		
		var cookie = cst_remember.cookie_get( cst_remember.cookiename );
		
		if ( cookie == undefined || cookie[id] == undefined ) {
			return false;
		}
		
		delete cookie[id];
	
		cst_remember.save( cookie );
	};
	
	/*
	 * add a group item to notices
	 */
	cst_remember.group_item_add = function( id, name, group, url, price, description, amount, subitems ){
		amount = amount*1;
		if ( cst_remember.debug ) console.log( 'cst_remember.group_item_add( ' + id + ', ' + name + ', ' + group + ', ' + url + ', ' + price + ', ' + description +' )' );
		
		var cookie = cst_remember.cookie_get( cst_remember.cookiename ) || {},
			type = cst_remember.item_id_split( id );
	
		// if we have no group informations, add item into "sites" group
		if ( group == undefined || group.length == 0 ) {
			group = 'sites';
		}
		
		if ( cookie[group] == undefined ) {
			cookie[group] = { items: {} };
		}
		
		if( cookie[group].items[id] ) {
			cookie[group].items[id].amount += amount;
		} else {
			cookie[group].items[id] = {
				id: type.id,
				type: type.type,
				name: name,
				price: price,
				description: description,
				url: url || window.location.pathname + window.location.search,
				scrollTop: jQuery( document ).scrollTop(),
				amount: amount || 1,
				subitems: subitems || {}
			}
		}
		
		cst_remember.utf8_decode( cookie[group].items[id] );
		cst_remember.save( cookie );
		
		if ( cst_remember.settings.notify ) {
			cst_remember.layer_notify();
		}
		
		cst_remember.layer_group_item_added( cst_remember.settings.container, cst_remember.settings._group_item_count );
	};
	
	/*
	 * delete a group item from notices
	 */
	cst_remember.group_item_delete = function( group_id, item_id ){
		if ( cst_remember.debug ) console.log( 'cst_remember.group_item_delete( ' + group_id + ', ' + item_id + '  )' );
		
		var cookie = cst_remember.cookie_get(),
			items = false;
		
		if ( cookie == undefined || cookie[group_id] == undefined || cookie[group_id].items[item_id] == undefined ) {
			return false;
		}
		
		delete cookie[group_id].items[item_id];
		
		// if group names are hidden remove empty groups
		if ( !cst_remember.settings.groupnames ) {
			jQuery.each( cookie[group_id].items, function(a, b){
				items = true;
			});
			
			if ( !items ) {
				delete cookie[group_id];
			}
		}
	
		cst_remember.save( cookie );
	};
	
	/*
	 * toggle the notice layer
	 */
	cst_remember.layer_toggle = function(){
		if ( cst_remember.settings.container.css( 'display' ) == 'none' ) {
			cst_remember.layer_show();
		}
		else {
			cst_remember.layer_hide();
		}
	};
	
	/*
	 * show the notice layer
	 */
	cst_remember.layer_show = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_show()' );
		if ( !cst_remember.settings.container ) cst_remember.layer_create();
		
		cst_remember.layer_show_before( cst_remember.settings.container );
	
		if ( cst_remember.settings.effect[0] == 'slide' ) {
			cst_remember.settings.container.slideDown();
		}
		else if ( cst_remember.settings.effect[0] == 'fade' ) {
			cst_remember.settings.container
				.css({
					opacity: 0,
					display: 'block'
				})
				.fadeTo( 'fast', 0.85 );

		}
		else {
			cst_remember.settings.container.show();
		}
		
		cst_remember.layer_show_after( cst_remember.settings.container );
	};
	
	/*
	 * hide the notice layer
	 */
	cst_remember.layer_hide = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_hide()' );
	
		cst_remember.layer_hide_before( cst_remember.settings.container );
	
		if ( cst_remember.settings.effect[1] == 'slide' ) {
			cst_remember.settings.container.slideUp();
		}
		else if ( cst_remember.settings.effect[1] == 'fade' ) {
			cst_remember.settings.container.fadeOut();
		}
		else {
			cst_remember.settings.container.hide();
		}

		cst_remember.layer_hide_after( cst_remember.settings.container );
	};
	
	cst_remember.layer_init = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_init()' );
		
		cst_remember.strings_init();
		
		if ( cst_remember.settings.effect.indexOf( '|' ) == -1 ) {
			cst_remember.settings.effect = cst_remember.settings.effect + '|' + cst_remember.settings.effect;
		}
		
		cst_remember.settings.effect = cst_remember.settings.effect.split( '|' );

		if ( cst_remember.settings.link.element ) {
			cst_remember.settings.link.element
				.unbind( 'click' )
				.bind( 'click', function(){
					cst_remember.layer_toggle();
		
					return false;
				});
		}

		cst_remember.settings.container
			.addClass( 'vnh-notices' )
			.css( 'display', ( cst_remember.settings.hidden ? 'none' : 'block' ) )
			.html( cst_remember.layer_update() );
		
		if ( ( id = cst_remember.anchor_get() ) ) {
			cst_remember.scroll_to( id );		
		}

		cst_remember.layer_inited( cst_remember.settings.container, cst_remember.settings._group_item_count );
	};
	
	cst_remember.layer_create = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_create()' );
		if ( cst_remember.settings.container ) return;
		
		cst_remember.settings.container = jQuery( document.createElement( 'div') )
			.css({
				position: 'absolute'
			})
			.bind( 'mouseenter', function(){
				cst_remember.settings.container.bind( 'mouseleave', function(){
					window.setTimeout(function(){
						cst_remember.layer_hide()
					}, 1500 );
				});
			})
			.appendTo( 'body' );
	};
	
	cst_remember.layer_notify = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_notify()' );

		if ( cst_remember.settings.display == 2 ) {
			/* we need to check the position of the link,
			 * because the container is floating around when hidden and has another width
			 */
			var offset = cst_remember.settings.link.element.offset();
		}
		else {
			var offset = cst_remember.settings.container.offset();
		}
		
		if ( cst_remember.settings.position ) {
			alert( cst_remember.string_get( 'notice_' + cst_remember.settings.position ) );
			return;
		}
		
		
		if ( offset.left > ( jQuery( window ).width() / 2 ) ) {
			alert( cst_remember.string_get( 'notice_right' ) );
		}
		else {
			alert( cst_remember.string_get( 'notice_left' ) );
		}
	};
	
	/*
	 * update content of the notice layer
	 */
	cst_remember.layer_update = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_update()' );

		var hotel_items = false,
			notices = cst_remember.cookie_get();
		
		if ( notices != undefined ) {
			var content, count = 0;
			cst_remember.settings._group_count = 0;
			cst_remember.settings._group_item_count = 0;
			cst_remember.settings._cookie = {};
			cst_remember.settings.container.empty();
			
			jQuery.each( notices, function( group_id, group ){
				count++;
				var group_item_count = 0;
				cst_remember.settings._group_count++;

				if ( group_id != 'sites' ) {
					hotel_items = true;
				}
				
				var group_title = cst_remember.layer_group_add( group_id, group );
				cst_remember.settings.container.append( group_title );
	
				jQuery.each( notices[group_id].items, function( item_id, item ){
					group_item_count++;
					count++;
					cst_remember.settings._group_item_count++;
					cst_remember.settings._cookie[item_id] = item;
					cst_remember.settings.container.append( cst_remember.layer_group_item_add( item_id, item, group_id ) );
				});
				if ( !group_item_count ) {
					$(group_title).hide();
				}
			})
			
			cst_remember.settings.container
				.find( 'div.vnh-group:last' )
				.addClass( 'vnh-group-last' )
				.end()
				.find( 'div.vnh-group-item:last' )
				.addClass( 'vnh-group-item-last' );
			
			if ( cst_remember.settings.container == false ) {
				cst_remember.layer_create();
			}
		}

		cst_remember.layer_updated( cst_remember.settings.container, cst_remember.settings._group_item_count );

		if ( cst_remember.settings._group_item_count == 0 ) {
			cst_remember.settings.container
				.append( cst_remember.string_get( 'empty' ) )
				.css( 'display', ( cst_remember.settings.display == 1 ? 'block' : 'none' ) );

			if ( cst_remember.settings.link.empty && cst_remember.settings.link.empty == 'hidden' ) {
				cst_remember.settings.link.element.hide();
			}
			
			if ( cst_remember.settings.empty == 'hidden' || cst_remember.settings.hidden ) {
				cst_remember.settings.container.hide();
				
				if ( cst_remember.settings.container_parent ) {
					cst_remember.settings.container_parent.hide();
				}
			}
		}
		else {
			if ( cst_remember.settings.link.empty && cst_remember.settings.link.empty == 'hidden' ) {
				cst_remember.settings.link.element.show();
			}
			if ( !cst_remember.settings.hidden ) {
				cst_remember.settings.container.show();
			}
			if ( cst_remember.settings.container_parent ) {
				cst_remember.settings.container_parent.show();
			}
		}
		
		cst_remember.layer_has_changed( cst_remember.settings.container );
	};
	
	/*
	 * add a group to the notice layer
	 */
	cst_remember.layer_group_add = function( id, group ){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_group_add( ' + id + ', ' + group + ' )' );
	
		var row = jQuery( document.createElement( 'div' ) ).addClass( 'vnh-group' );
		if ( cst_remember.settings.groupnames != false && typeof group.name != 'undefined' ) {
			row
				.append(
					jQuery( '<a>' )
						.attr( 'href', group.url + '#' + cst_remember.settings.anchorprefix + id )
						.attr( 'class', 'vnh-group-link' )
						.html( cst_remember.utf8_encode( group.name ) )
						.click( function(){
							if ( window.location.pathname == group.url ) {
								cst_remember.scroll_to_current();
							}
						})
				)
				.append(
					'<a href="#" onclick="cst_remember.group_delete( &quot;' + id + '&quot; ); return false;" class="vnh-group-delete">' + cst_remember.string_get( 'delete_group', 'delete' ) + '</a>'
				);
		}
		
		return row;
	};
	
	/*
	 * add a group item to the notice layer
	 */
	cst_remember.layer_group_item_add = function( item_id, item, group_id ){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_group_item_add( ' + item_id + ', ' + item + ', ' + group_id + ' )' );

		var amount_str = '';
		if( item.amount > 1 ) { amount_str = '<span class="vnh-group-item-amount">(' + item.amount + ')</span>'; }		

		return jQuery( document.createElement( 'div' ) )
			.addClass( 'vnh-group-item vnh-group-item-' + cst_remember.item_id_split( item_id ).type )
			.append(
				jQuery( document.createElement( 'a' ) )
					.attr( 'href', item.url + '#' + cst_remember.settings.anchorprefix + item_id )
					.attr( 'class', 'vnh-group-item-link' )
					.attr( 'rev', item_id )
					.html( item.name + amount_str )
					.bind( 'click', function(){
						if ( window.location.pathname == item.url ) {
							cst_remember.scroll_to_current();
						}
					})
			)
			.append(
				'<a href="#" onclick="cst_remember.group_item_delete( &quot;' + group_id + '&quot;, &quot;' + item_id + '&quot; ); return false;" class="vnh-group-item-delete">' + cst_remember.string_get( 'delete_group_item', 'delete' ) + '</a>'
			);
	};
	
	/*
	 * show the notice layer
	 */
	cst_remember.layer_detail_show = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_detail_show()' );
	
		cst_remember.settings.container
			.html( cst_remember.layer_detail_update() )
			.slideDown();
	};
	
	/*
	 * hide the notice layer
	 */
	cst_remember.layer_detail_hide = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_detail_hide()' );
	
		cst_remember.settings.container.hide();
	};
	
	cst_remember.layer_detail_init = function() {
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_detail_init()' );
		if ( cst_remember.settings.link_detail == false ) return;
		
		if ( cst_remember.settings.container_detail == false ) {
			cst_remember.layer_detail_create();
		}

		var layer_detail = jQuery( cst_remember.settings.container_detail ).addClass( 'vnh-detail-view' )
		
		jQuery( cst_remember.settings.link_detail )
			.unbind( 'click' )
			.bind( 'click', function(){
				if ( layer_detail.css( 'display' ) == 'none' ) {
					cst_remember.layer_detail_show();
				}
				else {
					cst_remember.layer_detail_hide();
				}
				return false;
			});

		cst_remember.on_layer_detail_init( layer_detail );
	};
	
	cst_remember.layer_detail_create = function() {
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_detail_create()' );

		cst_remember.settings.container_detail = jQuery( document.createElement( 'div' ) )
			.css({
				display: 'none',
				position: 'absolute'
			})
			.appendTo( 'body' );
	};

	/*
	 * update content of the notice layer
	 */
	cst_remember.layer_detail_update = function(){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_detail_update()' );
	
		var count = 0,
			content = cst_remember.string_get( 'empty' ),
			container = jQuery( cst_remember.settings.container_detail ).empty(),
			notices = cst_remember.cookie_get();
		
		if ( notices != undefined ) {
			cst_remember.settings._cookie = {};
			
			jQuery.each( notices, function( group_id, group ){
				count++;
				content = jQuery( document.createElement( 'div' ) )
					.addClass( 'cst-remember-group' )
					.append( cst_remember.layer_detail_group_add( group_id, group ) );
	
				jQuery.each( notices[group_id].items, function( item_id, item ){
					count++;
					cst_remember.settings._cookie[item_id] = item;
					
					content
						.addClass( 'cst-remember-group' )
						.append( cst_remember.layer_detail_group_item_add( item_id, item, group_id ) );
				});
				
				container.append( content );
			})
		}
		
		return container.html();
	};
	
	/*
	 * add a group to the notice layer
	 */
	cst_remember.layer_detail_group_add = function( id, group ){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_detail_group_add( ' + id + ', ' + group + ' )' );
		
		var row = jQuery( document.createElement( 'div' ) ).addClass( 'cst-remember-group' );
		
		if ( cst_remember.settings.groupnames != false ) {
			if ( group.name != undefined ) {
				row.append(
					jQuery( document.createElement( 'div' ) )
						.addClass( 'vnh-group-name' )
						.html( group.name )
					);
			}
			
			if ( group.url != undefined ) {
				row = jQuery( '<a class="vnh-group-link" href="' + group.url + '#' + cst_remember.settings.anchorprefix + id + '">' + group.name + '</a>' ).html( row );
			}
			
			
			if ( row.children().size() > 0 ) {
				row.append( '<a class="vnh-group-delete" href="#" onclick="cst_remember.group_delete( &quot;' + id + '&quot; ); return false;">' + cst_remember.string_get( 'delete_group', 'delete' ) + '</a>' );
			}
		}
		
		return row;
	};
	
	/*
	 * add a group item to the notice layer
	 */
	cst_remember.layer_detail_group_item_add = function( item_id, item, group_id ){
		if ( cst_remember.debug ) console.log( 'cst_remember.layer_detail_group_item_add( ' + item_id + ', ' + item + ', ' + group_id + ' )' );
	
		var row = jQuery( document.createElement( 'div' ) ).addClass( 'vnh-group-item vnh-group-item-' + cst_remember.item_id_split( item_id ).type );
		
		if ( item.name != undefined ) {
			row.append( '<div class="vnh-group-item-name">' + item.name + '</div>' );
		}
		
		if ( item.url != undefined ) {
			row = jQuery( '<a class="vnh-group-item-link" href="' + item.url + '#' + cst_remember.settings.anchorprefix + item_id + '">' + item.name + '</a>' ).html( row );
		}

		if ( item.price != undefined ) {
			row.append( '<div class="vnh-group-item-price">' + item.price + '</div>' );
		}
		
		row.append( '<a class="vnh-group-item-delete" href="#" onclick="cst_remember.group_item_delete( &quot;' + group_id + '&quot;, &quot;' + item_id + '&quot; ); return false;">' + cst_remember.string_get( 'delete_group_item', 'delete' ) + '</a>' );
		
		return row;
	};
	
	/*
	 * check if a cookie with the given name already exusts
	 */
	cst_remember.cookie_exist = function( name ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.cookie_exist()' );
		
		return ( typeof jQuery.cookie( name ) == 'string' );
	};
	
	/*
	 * writes the given value into a cookie
	 */
	cst_remember.cookie_write = function( data ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.cookie_write( ' + data + ' )' );
	
		var json = encodeURIComponent( cst_remember.utf8_decode( cst_remember.json_encode( data ) ) );
		
		var path = '/';
		
		if ( cst_remember.settings.cookie_path ) {
			path = cst_remember.settings.cookie_path;
		}
		
		if ( !cst_remember.settings.cookie_path && cst_remember.settings.language ) {
			path = '/' + cst_remember.settings.language_alias + '/';
		}
		
		jQuery.cookie( cst_remember.settings.cookiename, json, { expires: cst_remember.settings.cookie_expiry, path: path, domain: window.location.host, secure: false });
	};
	
	/*
	 * return the content of a cookie
	 */
	cst_remember.cookie_get = function() {
		if ( cst_remember.debug ) console.log( 'cst_remember.cookie_get( ' + name + ' )' );

		var json = jQuery.cookie( cst_remember.settings.cookiename );
	
		if ( json != null ) {
			return cst_remember.json_decode( decodeURIComponent( json ) );
		}
	};
	
	/*
	 * add the given value to an existing cookie, dont overwrite existing content
	 */
	cst_remember.cookie_entry_add = function( group, item, value ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.cookie_entry_add( ' + group + ', ' + item + ' )' );
		
		if ( value == undefined ) return false;
		var cookie = cst_remember.cookie_get();
	
		if ( cookie == undefined ) {
			cookie = {};
		}
	
		if ( cookie[group] == undefined ) {
			cookie[group] = {};
		}
		
		if ( item == undefined ) {
			cookie[group].name = value;
		}
		else {
			cookie[group][item] = value;
		}
	
		cookie[group][item] = value;
		
		cst_remember.save( cookie );
	};
	
	/*
	 * delete the cookie with the given name
	 */
	cst_remember.cookie_delete = function() {
		if ( cst_remember.debug ) console.log( 'cst_remember.cookie_delete()' );
		
		jQuery.cookie( cst_remember.settings.cookiename, false, { expires: -1 });
	};
	
	/*
	 * convert the given object into json string
	 */
	cst_remember.json_encode = function( data ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.json_encode( ' + data + ' )' );
		
		if ( typeof JSON != 'undefined' && typeof JSON.stringify != 'undefined' ) {
			return JSON.stringify( data );
		}
	
		return jQuery.json.encode( data );
	};
	
	/*
	 * convert the given json string into an object
	 */
	cst_remember.json_decode = function( json ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.json_decode( ' + json + ' )' );
		
		if ( typeof JSON != 'undefined' && typeof JSON.stringify != 'undefined' ) {
			return JSON.parse( json );
		}
	
		return jQuery.json.decode( json );
	};
	
	/*
	 * write data into cookie
	 */
	cst_remember.save = function( data ){
		if ( cst_remember.debug ) console.log( 'cst_remember.save( ' + data + ' )' );
		
		cst_remember.cookie_write( data );
		cst_remember.layer_update();
		
		if ( cst_remember.settings.container_detail != false ) {
			cst_remember.layer_detail_update();
		}
		
		var cookie = cst_remember.cookie_get(),
			items = false;
		
		if ( !cookie ) return false;
		
		jQuery.each( cookie, function(a, b){
			items = true;
		});
		
		if ( !items ) {
			jQuery( cst_remember.settings.empty_container ).css( 'display', 'none' );
		}
		else {
			jQuery( cst_remember.settings.empty_container ).css( 'display', 'block' );
		}
	};
	
	/*
	 * redirect to request page
	 */
	cst_remember.request = function( element ) {
		if ( cst_remember.debug ) console.log( 'cst_remember.request( ' + element + ' )' );
		
		var notices = cst_remember.cookie_get(),
			items = false;

		jQuery.each( notices, function( group_id, group ){
			if ( group_id == 'sites' ) return;
			
			items = true;
		});
		
		if ( !items ) {
			alert( cst_remember.string_get( 'sites_only' ) );
			return;
		}
		
		var link = jQuery( element ).attr( 'href' );

		window.location = link;
		return false;
	}
	
	cst_remember.book_items_str = function( group_id ) {
		var struct = this.cookie_get( this.cookiename );
		var book_url = '';
		try {
			if( typeof struct != 'undefined' && typeof group_id != 'undefined' && typeof struct[group_id] != 'undefined' && typeof struct[group_id].items != 'undefined' ) {
				jQuery.each( struct[group_id].items, function(i, item ) {
					if( item.type == 'hp' ) {
						var item_str = '&book_item[]=hp_' + item.id +',cart_init_auto:1,cart_amount:'+item.amount;
						book_url += item_str;
					}
				});
			}
		} catch(e) {};
		return book_url;
	} 
	
	$.fn.vnh = function( options ) {
		return this.each(function() {   
			$.vnh( this, options );
		});
	};

	$.vnh = function( element, options ) {
		var version = '1.2',
			defaults = {
				effect: 'slide|slide',// one argument: open and close effects are the same; tow arguments for different effects, serperated by pipe (slide|fade)
				link: {},
				notify: true,
				position: false,
				container: false,
				container_parent: false,
				container_detail: false,
				link_detail: false,
				groupnames: false,
				empty: 'show',// 'hidden'
				cookiename: 'cst_remember_notices',
				anchorprefix: 'vnh:',
				cookie_path: undefined,
				language: false,
				strings: [],
				_cookie: {},
				_group_count: 0,
				_group_item_count: 0,
				cookie_expiry: 31
			};
		
		if ( window.console && window.console.info ) {
			console.info( 'vioma notice handler ' );
			console.info( 'Version ' + version );
		}

		cst_remember.settings = $.extend( true, defaults, options );

		if ( cst_remember.settings.container === false ) {
			cst_remember.settings.container = jQuery( element );
		}
		else {
			cst_remember.settings.container = jQuery( cst_remember.settings.container );
			jQuery( element ).remove();
		}
		
		if ( cst_remember.settings.container_parent != false ) {
			cst_remember.settings.container_parent = jQuery( cst_remember.settings.container_parent );
		}
		
		if ( cst_remember.settings.link.element ) {
			cst_remember.settings.link.element = jQuery( cst_remember.settings.link.element );
		}
		
		cst_remember.language_init();
		cst_remember.layer_init();
		
	}
})(jQuery);
