if( typeof cst_client == 'undefined' ) {
	
	// Usage cst_client.embed( content_url, hotel_id )
	var cst_client = function() {
		var client_url = 'http://hotel-grafenast.clients.clearingstation.de/';
		var client_language = 'de';
		// language_set() setzt den wert auf true
		var is_client_language_forced = false;
		var client_autoscroll = false;
		var iframe_resizing = true;
		var client_settings = {
			cst_box_stays: 7,
			cst_box_adults: 2
		};
		
		var iframe_settings = {}
		
		var language_strings = {
			'de': {
				'box_title': 'Anfragen & Buchen',
				'date_arrival': 'Anreisetag',
				'date_select_error': 'Bitte wählen Sie ein Datum aus',
				'stays': 'Übernachtungen',
				'adults': 'Erwachsene',
				'book': 'Online Buchen',
				'request': 'Unverbindlich Anfragen'
			},
			'fr': {
				'box_title': 'Demande & Réservation',
				'date_arrival': 'Jour d`arrivée',
				'date_select_error': 'Merci de choisir une date',
				'stays': 'Nuitées',
				'adults': 'Adultes',
				'book': 'Réservez en ligne',
				'request': 'Demande sans engagement'
			},
			'it': {
				'box_title': 'Richiesta & Prenotazione',
				'date_arrival': 'Giorno di arrivo',
				'date_select_error': 'La preghiamo di scegliere una data',
				'stays': 'Pernottamenti',
				'adults': 'Adulti',
				'book': 'Prenotazione online',
				'request': 'Richiesta senza impegno'
			},
			'en': {
				'box_title': 'Enquire & Book',
				'date_arrival': 'Day of Arrival',
				'date_select_error': 'Please select a date',
				'stays': 'Nights',
				'adults': 'Adults',
				'book': 'Book Online',
				'request': 'Send a non-binding enquiry'
			},
			'ru': {
				'box_title': 'Запрос & Бронирование',
				'date_arrival': 'Дата приезда',
				'date_select_error': 'Пожалуйста, выберите дату',
				'stays': 'Ночей',
				'adults': 'Взрослые',
				'book': 'Бронирование в режиме он-лайн',
				'request': 'Сделать запрос'
			},
			'pl': {
				'box_title': 'Pytania & Rezerwacja',
				'date_arrival': 'Data przyjazdu',
				'date_select_error': 'Proszę wybrać datę',
				'stays': 'Noclegi',
				'adults': 'doroąli',
				'book': 'Rezerwacja online',
				'request': 'Niezobowiązujące zapytanie'
			},
			'nl': {
				'box_title': 'Aanvragen & boeken',
				'date_arrival': 'Aankomstdatum',
				'date_select_error': 'Kiest een datum',
				'stays': 'Overnachtingen',
				'adults': 'Volwassenen',
				'book': 'Online boeken',
				'request': 'Vrijblijvende aanvraag'
			},
			'es': {
				'box_title': 'Solicitud & Reservar',
				'date_arrival': 'Día de llegada al Hotel',
				'date_select_error': 'Por favor elija una fecha',
				'stays': 'Noches',
				'adults': 'Adultos',
				'book': 'Reservas online',
				'request': 'Reservas no en firme'
			},
			'cz': {
				'box_title': 'Poptávky a Rezervovat',
				'date_arrival': 'Den příjezdu',
				'date_select_error': 'Datum',
				'stays': 'noclehy',
				'adults': 'dospělý',
				'book': 'Rezervovat online',
				'request': 'Poptávky'
			}
		}

		var language_detect = function() {
			var site_lng = document.documentElement.lang.split("-")[0];
			var browser_lng = ((navigator.language) ? navigator.language : navigator.userLanguage).split("-")[0];

			if( site_lng != '' && language_strings[site_lng]) {
				client_language = site_lng;
			} else if( language_strings[browser_lng] ) {
				client_language = browser_lng;
			} else {
				client_language = 'en';
			}
		}

		var analytics_detect = function() {
			if( window._gaq ) {
				return true;
			} else {
				return false;
			}
		}
		
		return {
			language_detect: language_detect,
			analytics_detect: analytics_detect,
			language_set: function( lang ) {
				if ( lang == undefined ) return false;
				
				client_language = lang;
				is_client_language_forced = true;
			},
			setting_set: function( name, value ) {
				client_settings[ name ] = value;
			},
			setting_get: function( name ) {
				if ( typeof client_settings[ name ] != 'undefined' ) {
					return client_settings[ name ];
				}
				
				return false;
			},
			string_get: function( name ) {
				if( language_strings[client_language] == null ) return;
				if( language_strings[client_language][name] == null ) return;
				return language_strings[client_language][name]
			},
			string_set: function( name, value ) {
				language_strings[client_language][name] = value
			},
			url_parameters_sep: function( str ) {
				return str.indexOf( '?' ) == -1 ? '?' : '&';
			},
			url_parameters_get: function( ) {
			    var vars = [], hash;
			    var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
			    for(var i = 0; i < hashes.length; i++) {
			        hash = hashes[i].split('=');
			        vars.push(hash[0]);
			        vars[hash[0]] = hash.slice( 1 ).join( '=' );
			    }
			    return vars;
			},
			url_build: function( url, params ) {
				jQuery.each( params, function( k, v ) {
					url += this.url_parameters_sep( url ) + k + '=' + v;
				}.bind( this ) );
				return url;
			},
			embed: function( content_url, options ) {
				
				// zu gefährlich, riskiert leere inhalte
				//if( !is_client_language_forced ) {
				//	language_detect();
				//}

				var iframe_id = 'cst-client-iframe-' + Math.random().toString().substring(2,12);

				var param = this.url_parameters_get(),
				settings = {
					style: {
						height: '1600px',
						width: '100%',
						border: '0px',
						margin: '0px',
						padding: '0px',
						'z-index': '10'
					},
					analytics: false,
					height_buffer: true,
					content_fixed: false
				};
				
				this.objects_merge( settings, options )
				
				iframe_settings[iframe_id] = settings;
				
				if( !settings.content_fixed && typeof param['cst_box_type'] != 'undefined' ) {
					content_url = this.embed_box_url( param );
				}
				
				var iframe_style = '';
				for ( k in settings.style ) {
					iframe_style += k + ':' + settings.style[k] + ' !important;';
				}

				var analytics_type_to_use = false;
				if( settings.analytics != false ) {
					analytics_type_to_use = settings.analytics;
				} else {
					analytics_type_to_use = analytics_detect();
				}

				var embed_url = content_url + this.url_parameters_sep( content_url ) + 'set_language='+client_language;
				iframe_url = analytics_type_to_use ? '' : client_url+embed_url;
				
				// window.name geht im ie nur wenn mans über ein tag writed....
	 			document.write( '<iframe name="' + iframe_id + '" id="'+ iframe_id + '" src="'+iframe_url+'" style="' + iframe_style + '" frameborder="0" allowTransparency="true"></iframe>' );
				
				var iframe = document.getElementById(iframe_id);
				
				if( analytics_type_to_use ) {
					var content_loaded = false;
					window._gaq = window._gaq || [];
					window._gaq.push(function() {
					  if( content_loaded ) { return; }
					  var pageTracker = _gat._getTrackerByName();
					  //var iframe = document.getElementById('cst-client-iframe');
					  iframe.src = pageTracker._getLinkerUrl(client_url+embed_url);
					  content_loaded = true;	
					});	
					// sollte nichts geladen werden	
					window.setTimeout(function() {
						if ( content_loaded ) { return; }
						iframe.src = client_url+embed_url;	
						content_loaded = true;
					}, 3000);
				}

			},
			embed_iframe_resize: function( params ){
				if ( iframe_resizing === false ) return;
				var iframe_id = 'cst-client-iframe'
				if (params.identifier) {
					iframe_id = params.identifier;
				}
				var iframe = document.getElementById( iframe_id ),
					iframe_style = iframe.getAttribute( 'style' ),
					style_object = this.objects_merge( params, {
						height: ( params.height || iframe.parentNode.offsetHeight ),
						width: ( params.width || iframe.parentNode.offsetWidth )
					}),
					style_string = '';
				
				// only msie returns an object
				if ( typeof iframe_style == 'string' ) {
					iframe_style = this.style_string_to_object( iframe_style.replace( / !important/g, '' ) );
				} 

				style_object = this.objects_merge( iframe_style, style_object );
				
				// add some buffer
				if( !iframe_settings[iframe_id] || iframe_settings[iframe_id].height_buffer ) {
					style_object.height = ( parseInt( style_object.height, 10 ) + 50 ) + 'px';
				}
				
				iframe.setAttribute( 'style', this.style_object_to_string( style_object, true ) );
				iframe.setAttribute( 'scrolling', 'no' );
				
				// check if we have a frame as parent
				if (window.location.toString() != window.top.location.toString()) {
					var window_height = window.innerHeight;
					// window.innerHeight for msie
					if ( !window_height ) {
						var body = (window.document.compatMode && window.document.compatMode == "CSS1Compat") ? window.document.documentElement : window.document.body || null;
						
						if ( body != null ) {
							window_height = body.clientHeight;
						}
					} 
					
					// if we can't resize this parent frame, take its height und turn off resizing
					if ( ( parseInt( style_object.height, 10 ) - 50 ) > window_height ) {
						iframe_resizing = false;
						style_object.height = window_height + 'px';
						style_object.overflow = 'visible';

						iframe.setAttribute( 'scrolling', 'yes' );
						iframe.setAttribute( 'style', this.style_object_to_string( style_object, true ) );
					} 
				}
			},
			embed_scroll_top: function( params ){
				var iframe_id = 'cst-client-iframe'
				if( params.identifier ) {
					iframe_id = params.identifier;
				}
				var iframe = document.getElementById( iframe_id ),
					iframe_position = this.element_position( iframe );
				
				/* nur agieren, wenn ein object uebergeben wird, sonst einfach scrollen */
				if ( typeof params == 'object' && params.autoscroll ) {
					/*
					 * ersten aufruf ignorieren, damit beim laden der seite nicht sofort zum cst-inhalt gesprungen wird
					 * kommt ein zweiter aufruf, wird innerhalb des cst-iframes navigiert und wir duerfen scrollen
					 */
					if ( !client_autoscroll ) {
						client_autoscroll = true;
						return;
					}
					
					var scrollTopCurrent = 0;
					
					if ( document.all ) {
						var iebody = ( document.compatMode && document.compatMode != 'BackCompat' )? document.documentElement : document.body;
						scrollTopCurrent = iebody.scrollTop;
					}
					else {
						scrollTopCurrent = window.pageYOffset;
					}

					/* autoscroll abbrechen, wenn wir schon im viewport sind */
					if ( scrollTopCurrent < iframe_position.y ) {
						return;
					}
				}
				
				window.scrollTo( 0, iframe_position.y );
			},
			embed_box_url: function( param ) {
				content_url = 'request-box.php';
				
				if( param['cst_box_type'] == 'url' && typeof param['cst_box_url'] != 'undefined' ) return param['cst_box_url'];
				
				if( param['cst_box_type'] == 'book' ) content_url += this.url_parameters_sep( content_url ) + 'redir=search.php';
				if( param['cst_box_type'] == 'request' ) content_url += this.url_parameters_sep( content_url ) + 'redir=request.php?page=2.page1';
				if( typeof param['cst_box_date'] != 'undefined' ) content_url += this.url_parameters_sep( content_url ) + 'form[dates][rd_from1]=' + param['cst_box_date'];
				if( typeof param['cst_box_stays'] != 'undefined' ) content_url += this.url_parameters_sep( content_url ) + 'form[dates][rd_stays]=' + param['cst_box_stays'];
				if( typeof param['cst_box_adults'] != 'undefined' ) content_url += this.url_parameters_sep( content_url ) + 'form[rd_adults]=' + param['cst_box_adults'];
				
				return content_url;
			},
			box_click_link: function( button ) {
				var date = jQuery( '#cst-client-box-date' ).val();
				
				if( date.length < 2 ) {
					alert( this.string_get( 'date_select_error' ) );
					return false;
				}
				
				var q = {
					cst_box_date: date,
					cst_box_stays: jQuery( '#cst-client-box-stays' ).val(),
					cst_box_adults: jQuery( '#cst-client-box-adults' ).val(),
					cst_box_type: jQuery( button ).attr( 'rel' )
				}
				
				var iframe = document.getElementById( 'cst-client-iframe' );
				
				if( iframe ) {
					iframe.src = client_url + this.embed_box_url( q );
				} else {
					location.href = this.url_build( this.box_target_page, q );
				}
				
				return false;
				
			},
			box: function( target_page, button_request, button_book ) {
				this.box_target_page = target_page;
				
				var param = this.url_parameters_get();
				
				document.write( '<script type="text/javascript">_lib_load( "jQuery", "jQuery-UI" );</script>' );
				document.write( '<link rel="stylesheet" type="text/css" href="'+client_url+'/css/def.css">' );
								document.write( '<style>input.imageAsBg, input.hasDatepicker { height: 21px !important; _height: 20px !important; background-repeat: no-repeat; background-position: center right; _background-position: top right; background-color: #fff; } .hasDatepicker { background-image: url("' + client_url + 'images/calendar-input.gif"); }</style>' );
				document.write( '<div class="cst-client-box">' );
				document.write( '<h3>'+this.string_get( 'box_title' )+'</h3>' );
				document.write( '<div class="cst-client-box-date"><label for="cst-client-box-date">'+this.string_get( 'date_arrival' )+'</label><span><input id="cst-client-box-date" value="'+( param['cst_box_date'] || '' ) +'" /></span></div>' );
				document.write( '<div class="cst-client-box-stays"><label for="cst-client-box-stays">'+this.string_get( 'stays' )+'</label><span><select id="cst-client-box-stays">'+this.box_options( 1, 14, param['cst_box_stays'] || this.setting_get( 'cst_box_stays' ) )+'</select></span></div>' );
				document.write( '<div class="cst-client-box-adults"><label for="cst-client-box-adults">'+this.string_get( 'adults' )+'</label><span><select id="cst-client-box-adults">'+this.box_options( 1, 8, param['cst_box_adults'] || this.setting_get( 'cst_box_adults' ) )+'</select></span></div>' );
				document.write( '<div class="cst-client-box-buttons"><div class="cst-client-box-button cst-client-box-button-book"><a href="#" onclick="return cst_client.box_click_link(this)" rel="book">'+this.string_get( 'book' )+'</a></div><div class="cst-client-box-button cst-client-box-button-request"><a href="#" onclick="return cst_client.box_click_link(this)" rel="request">'+this.string_get( 'request' )+'</a></div></div>' );
				document.write( '</div>' );
				
				this.box_loading_interval = window.setInterval(function(){
					if( typeof jQuery != 'undefined' ) {
						window.clearInterval( cst_client.box_loading_interval );
						jQuery(function(){ cst_client.box_dom_ready(); });
					}
				},10);
			},
			box_options: function( el_start, el_to, el_selected ) {
				html = '';
				for( var i = el_start; i <= el_to; i++ ) {
					html += '<option '+( el_selected == i ? 'selected' : '' )+'>'+i+'</option>';
				}
				return html;
			}, 
			box_dom_ready: function() {
				jQuery.datepicker.setDefaults({
					clearText: 'Clear',
					clearStatus: 'Erase the current date',
					closeText: 'X',
					closeStatus: 'Close without change',
					prevText: '<<',
					prevStatus: 'Show the previous month',
					nextText: '>>',
					nextStatus: 'Show the next month',
					currentText: 'Heute',
					currentStatus: 'Show the current month',
					monthNames: ['Januar','Februar','M&#228;rz','April','Mai','Juni','Juli','August','September','Oktober','November','Dezember'],
					monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'May', 'Jun', 'Jul', 'Aug', 'Sep', 'Oct', 'Nov', 'Dec'],
					monthStatus: 'Show a different month',
					yearStatus: 'Show a different year',
					weekHeader: 'Wk',
					weekStatus: 'Week of the year',
					dayNames: ['Sonntag', 'Montag', 'Dienstag', 'Mittwoch', 'Donnerstag', 'Freitag', 'Samstag'],
					dayNamesShort: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
					dayNamesMin: ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'],
					dayStatus: 'Set DD as first week day',
					dateStatus: 'Select DD, M d',
					dateFormat: 'dd.mm.yy',
					firstDay: 1,
					initStatus: 'Select a date',
					isRTL: false
				});
				jQuery( "#cst-client-box-date" ).datepicker({minDate: '0'});
			},
			embed_link: function( content_url ) {
				if( !content_url ) content_url = 'search.php';
				document.write( '<script type="text/javascript">if ( typeof jQuery == "undefined" ) { _lib_load( "jQuery" ); } else { _lib_load_libs_loaded["jQuery"] = true; };</script>' );
				document.write( '<script type="text/javascript">_lib_load( "Highslide" );</script>' );
				document.write( '<script type="text/javascript">highslide_language_set( "' + client_language + '" );</script>' );
				document.write( '<style>body .highslide-container div.highslide-html {background: #fff;}</style>' );
				document.write( '<a href="'+client_url+content_url+'" onclick="return hs.htmlExpand( this, { allowSizeReduction: false, objectType: \'iframe\', minHeight: jQuery( window ).height()-50, minWidth: 530, height: jQuery( window ).height()-50, width: 520 });">'+this.string_get( 'book' )+'</a>' );
			},
			objects_merge: function( settings, options ){
				if ( typeof options == 'undefined' ) {
					return settings;
				}
				
				if ( typeof options != 'object' ) {
					return options;
				}
				
				for ( key in options ) {
					settings[key] = this.objects_merge( settings[key], options[key] );
				}
				
				return settings;
			},
			element_position: function(element) {
				var elem=element,tagname="",x=0,y=0;
				
				while ((typeof(elem)=="object")&&(typeof(elem.tagName)!="undefined")) {
					y+=elem.offsetTop;
					x+=elem.offsetLeft;
					tagname=elem.tagName.toUpperCase();
					
					// ie6 scheint den body zu ueberspringen, zumindest wird direkt die HMTL-node zurueckgegeben
					if (tagname=="BODY" || tagname=="HTML") elem=0;
					
					if (typeof(elem)=="object")
					if (typeof(elem.offsetParent)=="object")
					elem=elem.offsetParent;
				}
				
				position=new Object();
				position.x=x;
				position.y=y;
				return position;
			},
			style_string_to_object: function( string ) {
				var string_params = string.split( ';' ),
					string_param_count = string_params.length,
					string_string = '',
					style_object = {};

				for ( var i = 0; i < string_param_count; i++ ) {
					var string_param = string_params[i].split( ':' ),
						key = string_param[0].toLowerCase().replace (/^\s+/, '').replace (/\s+$/, ''),
						value = string_param[1];
					
					if ( style_object[key] || typeof value == 'undefined' ) {
						continue;
					}
					
					style_object[key] = value;
				}
				
				return style_object;
			},
			style_object_to_string: function( object, important ){
				var string = '',
					string_affix = ( important ? ' !important;' : ';' );
				
				for ( key in object ) {
					// using "+=" throws an error in msie8
					string = ( string || '' ) + key + ':' + object[key] + string_affix;
				}
				
				return string;
			}
		}
	}();
}

var _base_res = 'http://hotel-grafenast.clients.clearingstation.de/';
var _version_cache = '1326814793-1326993043';

	var ver4, target;
	ver4 = (parseInt(navigator.appVersion) >= 4 );
	
	function toggle_state(targetId,_view){
		if ( ver4 ){
			if( target = document.getElementById(targetId) ) {
				if ( _view ) {
					target.style.display = "";
				} else {
					target.style.display = "none";
				}
			}// else alert( 'no id with value "'+targetId+'"');
		}
	}
	function toggle(targetId){
		if ( ver4 ){
			if( target = document.getElementById(targetId) ) {
				if ( target.style.display != "block" ) {
					if ( document.all ){
							target.style.display = "block";
						} else {
							target.style.display = "table-row";
						}
				} else {
					target.style.display = "none";
				}
			} else alert( 'no id with value "'+targetId+'"');
		}
	}
	function popup_site(url) {
		window.open(url,'info','width=750,height=650,scrollbars=yes,resizable=yes');
	}
	function check_boxes( hotel_id ) {
		var valid = false;
		if( hotels[hotel_id] ) {
			var hotel = hotels[hotel_id];
			for( i in hotel.roomtypes ) {
				if( document.getElementById( hotel.roomtypes[i] ).checked ) valid = true;
			}
			for( i in hotel.packages ) {
				if( document.getElementById( hotel.packages[i] ).checked ) valid = true;
			}
			if (valid == false) {
				for( i in hotel.programs ) {
					var tmp = hotel.programs[i].split('|');
					if( document.getElementById( tmp[0] ).checked ) {
							if (tmp[1] == 1) {
								valid = true;
							} else {
								valid = false;
								break;	
							}
					}
				}			
			}
		}
		if( !valid ) {
			var i18n = new cst_i18n;
			alert( i18n.i18n_string_entities_decode( lng_str['book.error.room.choose'] ) );
		}
		return valid;
	}
	function view_rows( rows ) {
		for( row in rows ) {
			toggle_state( rows[row], true );
		}
	}
	
	function toggle_rows( rows ) {
		for( row in rows ) {
			toggle( rows[row] );
		}
	}
	
	var calendar_offset_x = 25;
	var calendar_offset_y = 0;
	
	//gehoert zur request.xsl feldabfrage
	

	function request_check_form() {
		var tmpary = new Array();
		var fields = new Array(
				"request_user_firstname",
				"request_user_lastname",
				"request_user_street",
				"request_user_zip",
				"request_user_city",
				"request_user_country",
				"request_user_email",
				"rd_from1",
				"rd_to1"
			);
		var flength = fields.length;
		
		for (var i = 0; i < flength; i++) {
			var tmp = 'form[' + fields[i] + ']';
			if (document.form[tmp].value == "") {
				document.form[tmp].style.backgroundColor = "#FFFF70";
				tmpary.push(tmp);
			}
			else {
				document.form[tmp].style.backgroundColor = "#FFFFFF";
			} 
		}
		if (tmpary.length !=0) {
			alert('Bitte fuellen Sie alle farbig hinterlegten Felder aus');
			document.form[tmpary[0]].focus();
			return false;
		}
		return true;
	}
	
	var cst_image_zoom_win = false;
	function cst_image_zoom( url ) {
		cst_image_zoom_win = window.open( url+'/600xq', 'cstimage', 'width=620,height=550,location=no,toolbar=no' );
		cst_image_zoom_win.focus( );
		return false;
	}
	
	function cst_ssl_host( ssl_host ) {
		if( location.protocol != 'https:' ) {
			var target = 'https://'
			target += ssl_host;
			target += location.pathname;
			target += location.search;
			target += location.hash;
			location.href = target;
		}
	}
	
	function cst_hotel_stars_string( stars_num ) {
		var stars = [];
		for( var s = 0; s < Math.floor( stars_num / 10 ); s++ )  {
			stars.push( '*' )
		}
		if( stars_num == 45 || stars_num == 35 ) {
			stars.push( 's' )
		}
		return stars.join( '' );
	}
	
	function cst_datepicker_custom_range( input, obj_id, obj_range_start, obj_range_end ) {
		if( obj_range_start != '' ) {
			return {
				minDate: ( input.id == obj_id ? jQuery('#'+obj_range_start).datepicker( 'getDate' ) : null), 
				maxDate: ( input.id == obj_range_start ? jQuery('#'+obj_id).datepicker( 'getDate' ) : null)
			}; 
		} else if( obj_range_end != '' ) {
			var mindate = null;
			var thisdate = jQuery('#'+obj_id).datepicker( 'getDate' );
			if( input.id == obj_id && thisdate > jQuery('#'+obj_range_end).datepicker( 'getDate' ) ) {
				mindate = thisdate;
				jQuery('#'+obj_range_end).datepicker( 'setDate', thisdate );
			}
			return {
				minDate: mindate
			};
		} else {
			return true;
		}
	}
	
	var cst_xd_url,
		cst_xd_iframe_style = {},
		cst_xd_iframe_triggers = [],
		cst_xd_iframe_trigger_timer,
		cst_xd_iframe_autoresize = true;
	
	function cst_xd_url_set( url ) {
		cst_xd_url = url;
	}
	
	function cst_xd_iframe_create( url ) {
		/*
		 * iframe nur erstellen, wenn die cst in einem iframe liegt
		 * */
		try {
			if ( document.all ) {
				top.location.href;
			}
			else if ( typeof top.location.href == 'undefined' ) {
				throw (new Error());
			}
		} 
		catch (e) {
			jQuery('body').append('<iframe id="cst_xd_iframe" src="' + url + '" height="0" width="0" frameborder="0"></iframe>');
		}
	}
	
	function cst_xd_iframe_trigger( call, params ) {
		if ( typeof params == 'undefined' ) {
			params = '{}';
		}
		
		if ( call ) {
			cst_xd_iframe_triggers.push( [ call, params ] );
		}
		
		if ( cst_xd_iframe_trigger_timer == undefined ) {
			cst_xd_iframe_trigger_timer = window.setInterval(function(){
				if ( cst_xd_iframe_autoresize === true && parseInt( cst_xd_iframe_style.height, 10 ) != jQuery('body').children( 'div.cst:first' ).height() ) {
					cst_xd_iframe_resize();
				}
				
				if ( !cst_xd_iframe_triggers.length ) return;
				
				cst_xd_iframe_update( cst_xd_iframe_triggers[0][0], cst_xd_iframe_triggers[0][1] );
				cst_xd_iframe_triggers.shift();
			}, 500 )
		} 
	}
	
	function cst_xd_iframe_update( call, params ) {
		var iframe = document.getElementById("cst_xd_iframe"),
			url = cst_xd_url + '?call=' + call + '&params=' + params;
		
		// damit man beim zurueck gehen nicht immer zwei mal klicken muss,
		// jedes mal das alte iframe loeschen und ein neues erstellen.
		if ( iframe && iframe.tagName ) {
			iframe.parentNode.removeChild( iframe );
		}
		
		cst_xd_iframe_create( url );
	}
	
	function cst_xd_iframe_resize( options ) {
		if ( window.name.indexOf('cst-client-iframe') == -1 ) return;
		if ( !cst_xd_url ) return;
		if ( !options ) options = {};
		if ( !options.style ) options.style = {};
		
		options.style.overflow = 'hidden';
		cst_xd_iframe_style = style = options.style || {};
		
		var body = jQuery('body'),
			style_string = '';

		if ( !style.height ) {
			style.height = body.children( 'div.cst:first' ).height();
		}

		if ( !style.width ) {
			style.width = body.width();
		}
		
		var dimensions = {
			height: parseInt( style.height, 10 ),
			width: parseInt( style.width, 10 )
		};

		for( var key in dimensions ) {
			if ( dimensions[key] ) {
				cst_xd_iframe_style[ key ] = dimensions[key] + 'px';
			}
			else {
				delete cst_xd_iframe_style[ key ];
			}
		}
		
		for ( var key in cst_xd_iframe_style ) {
			style_string += key + ':"' + cst_xd_iframe_style[key] + '",';
		}
		body.attr( 'style', 'width: ' + cst_xd_iframe_style.width + ' !important' );
		cst_xd_iframe_trigger( 'embed_iframe_resize', encodeURI( '{' + style_string.substring( 0, style_string.length - 1 ) + ', identifier: "'+ window.name +'" }' ) );
	}
	
	function cst_xd_scroll_top() {
		cst_xd_iframe_trigger( 'embed_scroll_top', encodeURI( '{ identifier: "'+ window.name +'" }' ) );
	}
	
	if ( window.name.indexOf('cst-client-iframe') != -1 ) {
		/* direkter aufruf von cst_xd_iframe_trigger() schmeisst in manchen ie6 einen error */
		cst_xd_iframe_triggers.push( [ 'embed_scroll_top', encodeURI( '{autoscroll:true}' ) ] );
	}
	
	if( typeof _lib_load_libs == 'undefined' && typeof window._loader == 'undefined' ) {
		var _lib_load_loaded = false;
		var _lib_load_libs = {};
		if( typeof _lib_load_libs_loaded == 'undefined' ) {
			var _lib_load_libs_loaded = {};
		}

		var onload_old = window.onload;
		window.onload = function(){
			window._lib_load_loaded = true;
			if( typeof( onload_old ) == 'function' ) {
				onload_old();
			}
		};
		
		var _file_load = function( file ) {
			if( typeof file == 'undefined' ) { return; }
			var tag = false, file_ext = file.split( '?' )[0].substring( file.lastIndexOf( '.' ) + 1 );

			var head = document.getElementsByTagName( "head" )[0];
			if( file_ext == 'js' ) {
				if ( window._lib_load_loaded ) {
					tag = document.createElement( 'script' );
					tag.type = 'text/javascript';
					tag.src = file;
					tag.charset = 'UTF-8';
				}
				else {
					window.document.write( '<scr'+'ipt type="text/javascript" src="'+file+'" charset="UTF-8"></scr'+'ipt>' );
				}
			} else if ( file_ext == 'css' ) {
				if ( window._lib_load_loaded ) {
					tag = document.createElement( 'link' );
					tag.rel = 'stylesheet';
					tag.href = file;
				}
				else {
					window.document.write( '<link rel="stylesheet" href="'+file+'" type="text/css" />' );
				}
			}
			
			if ( window._lib_load_loaded && tag !== false ) {
				head.appendChild( tag );
			}
		}
		
		var _lib_load = function ( ) {
			for( var i = 0; i < arguments.length; i++ ) {
				var lib_name = arguments[i];
				if( typeof _lib_load_libs_loaded[lib_name] == 'undefined' ) {
					for( file_idx in _lib_load_libs[lib_name] ) {
						var file = _lib_load_libs[lib_name][file_idx];
						if ( typeof file == 'function' ) { continue; }
						if( typeof file == 'string' ) {
							_file_load( file );
						} else {
							if( typeof file.check == 'function' && file.check() ) {
								_file_load( file.path );
							} else if ( typeof file.check == 'undefined' ) {
								_file_load( file.path );
							}
						}
					}
					_lib_load_libs_loaded[lib_name] = true;
				}
			}
		};
		
		var _lib_repository_add = function ( name, files ) {
			if( typeof _lib_load_libs[name] == 'undefined' ) {
				_lib_load_libs[name] = files;
			}
		}
		
	}

	if( typeof window._loader != 'undefined' ) {
		var _lib_repository_add = window._loader.lib_add;
		var _lib_load = window._loader.lib_load;
	}		
	
	_lib_repository_add(
		'jQuery',
		[
			{ path: _base_res+'js/jquery-1.3.2/jquery-1.3.2.min.js', check: function() {
				if( typeof window.jQuery == 'undefined' ) { return true; }
				if( version_compare( "1.3.2", jQuery.fn.jquery ) ) {
					return true;
				}
				return false;
			} }
		]
	);

	_lib_repository_add(
		'jQuery_latest',
		[
			{ path: 'http://ajax.googleapis.com/ajax/libs/jquery/1/jquery.min.js' }
		]
	);	
	
	_lib_repository_add(
		'jQuery-UI',
		[
			_base_res+'js/ui-1.7.2/js/jquery-ui-1.7.2.custom.min.js',
			_base_res+'js/ui-1.7.2/css/smoothness/jquery-ui-1.7.2.custom.css'
		]
	);
	_lib_repository_add(
		'Datepicker',
		[
			_base_res+'js/datepicker-3.3/ui.datepicker.js',
			_base_res+'js/datepicker-3.3/ui.datepicker.css'
		]
	);
	_lib_repository_add(
		'Lytebox',
		[
			_base_res+'js/lytebox-3.22/lytebox.js',
			_base_res+'js/lytebox-3.22/lytebox.css'
		]
	);
	
	_lib_repository_add(
		'Highslide',
		[
			_base_res+'/js/highslide-4.1.12/highslide-full.min.js?version='+_version_cache,
			_base_res+'/js/highslide-4.1.12/settings.js?version='+_version_cache,
			_base_res+'/js/highslide-4.1.12/highslide.css?version='+_version_cache
		]
	);

	_lib_repository_add(
		'cst_general',
		[
			_base_res+'js/cst_i18n.js'
		]
	);
	_lib_repository_add(
		'cst_book',
		[
			_base_res+'js/cst_book.js?version='+_version_cache,
			_base_res+'js/cst_calendar.js?version='+_version_cache
		]
	);
	_lib_repository_add(
		'cst_book_legacy',
		[
			_base_res+'js/cst_book_legacy.js?version='+_version_cache,
		]
	);
	_lib_repository_add(
		'cst_scroller',
		[
			_base_res+'js/cst_scroller.js'
		]
	);
	_lib_repository_add(
		'calendar_old',
		[
			_base_res+'js/calendar.js'
		]
	);
	_lib_repository_add(
		'Mediaplayer',
		[
			_base_res+'js/mediaplayer-4.1/swfobject.js'
		]
	);
	_lib_repository_add(
		'swfobject',
		[
			_base_res+'js/swfobject-2.2/swfobject.js'
		]
	);
	_lib_repository_add(
		'bgiframe',
		[
			_base_res+'js/jquery.bgiframe-2.1.1/jquery.bgiframe.min.js'
		]
	);
	_lib_repository_add(
		'vjg',
		[
			_base_res+'js/vjg/vjg.js',
			_base_res+'js/vjg/vjg.css'
		]
	);
	_lib_repository_add(
		'vil',
		[
			_base_res+'js/vil/vil.js',
			_base_res+'js/vil/vil.css'
		]
	);
	_lib_repository_add(
		'vct',
		[
			_base_res+'js/vct/vct.js'
		]
	);
	_lib_repository_add(
		'vnh',
		[
			_base_res+'js/vnh/vnh.js'
		]
	);
	_lib_repository_add(
		'vac',
		[
			_base_res+'js/vac/vac.js',
			_base_res+'js/vac/vac.css'
		]
	);
	_lib_repository_add(
		'Cookies',
		[
			_base_res+'js/jquery.cookie-1.0/jquery.cookie.js'
		]
	);
	_lib_repository_add(
		'jquery.json',
		[
			_base_res+'js/jquery.labs_json-1.0/labs_json.js'
		]
	);
	_lib_repository_add(
		'ui',
		[
			_base_res+'js/ui-1.0.6/ui.core.js',
			_base_res+'js/ui-1.0.6/css/base/ui.all.css'
		]
	);
	_lib_repository_add(
		'ui-tabs',
		[
			_base_res+'js/ui-1.0.6/ui.tabs.js',
			_base_res+'js/ui-1.0.6/css/cst-tabs.css'
		]
	);
	_lib_repository_add(
			'ui-tabs-html-5',
			[
				_base_res+'js/ui-1.0.6/ui.tabs.js'
			]
	);
	_lib_repository_add(
		'ui-autocomplete',
		[
			_base_res+'js/jquery.autocomplete-1.2.6/jquery.autocomplete.js',
			_base_res+'js/jquery.autocomplete-1.2.6/jquery.autocomplete.css'
		]
	);
	_lib_repository_add(
		'ui-accordion',
		[
			_base_res+'js/ui-1.0.6/ui.accordion.js'
		]
	);
	_lib_repository_add(
		'corner',
		[
			_base_res+'js/curvycorners-2.0.3/curvycorners.js'
		]
	);
	
	_lib_repository_add(
		'roundies',
		[
			'/js/dd_roundies-0.0.2a/DD_roundies_0.0.2a-min.js'
		]
	);
	
	_lib_repository_add(
		'reflection',
		[
			_base_res+'js/reflection-2.0/reflection.js'
		]
	);

	_lib_repository_add(
		'jsoncookie',
		[
			_base_res+'js/jsoncookie-0.9/json2-min.js',
			_base_res+'js/jsoncookie-0.9/jquery.cookie.js',
			_base_res+'js/jsoncookie-0.9/jquery.jsoncookie.js'
		]
	);	

	_lib_repository_add(
		'voucher_calculate',
		[
			_base_res+'js/cst_voucher_calculate.js?version='+_version_cache
		]
	);	

	_lib_repository_add(
		'qtip',
		[
			_base_res+'js/qtip-1.0.0/jquery.qtip-1.0.0-rc3.min.js?version='+_version_cache
		]
	);
	
	_lib_repository_add(
		'cst_validator',
		[
			_base_res+'js/jquery.validation-1.5.2/jquery.validation.js?version='+_version_cache
		]
	);		

	_lib_repository_add(
		'cst_helper',
		[
			_base_res+'js/cst_helper.js?version='+_version_cache
		]
	);			

	_lib_repository_add(
		'cst_textbox_limited',
		[
			_base_res+'js/cst_textbox_limited.js?version='+_version_cache
		]
	);			

	_lib_repository_add(
		'cst_tab_switcher',
		[
			_base_res+'js/cst_tab_switcher-0.1/cst_tab_switcher.js?version='+_version_cache
		]
	);
	
	_lib_repository_add(
		'cst_pension',
		[
			_base_res+'js/cst_pension.js?version='+_version_cache
		]
	);
	
	_lib_repository_add(
		'cst_form_remember',
		[
			_base_res+'js/cst_form_remember.js?version='+_version_cache
		]
	);		

	_lib_repository_add(
		'history',
		[
			_base_res+'js/jquery.address-1.4/jquery.address-1.4.min.js?version='+_version_cache,
			_base_res+'js/jquery.address-1.4/address-legacy.js?version='+_version_cache
		]
	);		

	// platzhalter bei domshake
	_lib_repository_add(
		'general',
		[]
	);	
	
	//version_compare("1.2.3","1.0") returned true
	function version_compare( a, b ) {
		var a_versions = a.split(".");
		var b_versions = b.split(".");
		var max_parts = Math.max(a_versions.length,b_versions.length);
		for( var i = 0;i<max_parts;i++ ) {
		 var a_part = a_versions[i]*1;
		 var b_part = b_versions[i]*1;
		 if( a_part == b_part ) {continue}
		 if( a_part > b_part ) return true;
		    return false;   
		}
	}	
	
	if( typeof Function.prototype.bind != 'function' ) {
		Function.prototype.bind = function() {
			var __method = this, args = Array.prototype.slice.call(arguments,0), object = args.shift();
			return function() {
				return __method.apply(object, args.concat(Array.prototype.slice.call(arguments,0)));
			}
		}
	}
	
	/* IE Bildflackern bei hover vermeiden */
	try {
	 document.execCommand('BackgroundImageCache', false, true);
	} catch(e) {}	

	/* console für ie emulieren falls jmd eins vergisst */
	if(typeof console == 'undefined') {
		console = { log: function() {}, dir: function() {} };
	}
    
	if( typeof jQuery == 'function' ) {
		_$ = jQuery;
	}

	function cst_remember_item_delete() {
		jQuery('input.remember-item-amount').each( function() {
			var $remove_link = jQuery('<a>').attr('href','#').text('x');
			$remove_link.addClass('remember-item-remove-link');
			var $amount_input = jQuery(this);
			$remove_link.click( function() {
				
				if( typeof cst_remember == 'function' ){
					var parent_rel = $(this).parent().attr('id');
					var splited_rel = parent_rel.split('-');
					// vnh item loeschen, ansonsten erscheint es beim relaod wieder
					cst_remember.group_item_delete( splited_rel[1], splited_rel[0] )
				}
				
				// url für ajax request bauen
				var request_item_id = $(this).parent().attr('rel');
				var path = document.location.pathname;
				var ajax_url = path + '?rem_item_clear=' + request_item_id;
				
				// remember item in session löschen
				$.ajax({
					type: "GET",
					url: ajax_url
				 });
				
				$amount_input.val(0);
				jQuery(this).closest('tr').children().children().hide( 500, function() {
					jQuery(this).closest('a.remember-item-remove-link').remove();
					if( jQuery('a.remember-item-remove-link').size() < 1 ){
						jQuery('tr.cst-remember-items-header').hide();
					}
					jQuery(this).closest('td').css('border','none');
				});
				console.log($amount_input);
				return false;
			});
			jQuery(this).parent().append( $remove_link );
		})
	}
	
	function cst_request_required_highlighting( fields, form ){
		jQuery( 'input, select, textarea', form ).each( function( ){
			
			var current_input = jQuery( this );
			var input_name = this.name.match( /(\w+)/g );
			if( input_name != null ){
				var string = input_name[1];
				for( var i = 2; i < input_name.length; i++ ) {
				    string += '[' + input_name[i] + ']';
				};
				
				if( fields[string] ){
					current_input.addClass( 'request-field-required' );
					var focus_func = function(){
						jQuery( this ).removeClass( 'request-field-required' );
					};
					
					if( current_input.attr( 'type' ) == 'checkbox' || current_input.attr( 'type' ) == 'radio' || ( jQuery.browser.msie && current_input.is('select') ) ){
						jQuery( this ).removeClass( 'request-field-required' );
						current_input.wrap( '<div class="request-field-required">' );
						focus_func = function( ){
 							jQuery( this ).parent('div.request-field-required').replaceWith( jQuery( this ) );
 							if( current_input.attr( 'type' ) == 'checkbox' || current_input.attr( 'type' ) == 'radio' ){
 								jQuery( this ).attr('checked', 'checked')
 								if( current_input.attr( 'type' ) == 'radio' ){
 									jQuery( 'input[name="'+ this.name +'"]' ,form ).each(function(){
 										jQuery( this ).parent('div.request-field-required').replaceWith( jQuery( this ) );
 									});
 								}
 							}
						}
					} 
					if( jQuery.browser.msie && current_input.is('select') ){
						current_input.change( focus_func );
					} else {
						current_input.click( focus_func );
					}
				}
			}
		});
	}
	
	/* Request validation */
	function cst_request_field_validation( checks, lng_str , form ){
		var input_rule = {};
		var error_msg_obj = {};
		
		// required fields (*) highligthing
		var $p = jQuery('.form-field-required').closest('td');
		$p.add( $p.next() ).addClass('form-field-required-cell');
		$p.add( $p.next() ).find('input, textarea').addClass('required');
		// dem form die klasse für die input requierd geben 
		jQuery(form).addClass('request-form-valid');
		
		//  default enter event zum tab geändert 
		var forms_handle_focus = function() {
		    var classname = 'cst-request-item-selected';
		    var $elements = jQuery('input:visible[type!="submit"][type!="hidden"], textarea:visible, select:visible', form );
		    $elements.unbind('keypress.eleswitch');

		    $elements.sort( function( a, b){
		    	if(!a.tabIndex || !b.tabIndex){return 0;}
		    	return a.tabIndex - b.tabIndex;
		    });
		    
		    function switch_focused_element() {
		        $elements.removeClass(classname);
		        var ele_pos = 0;
		        $elements.each( function(i,ele) {
		            if( ele == document.activeElement ) {
		                ele_pos = i;
		                return false;
		            }
		        })
		        $elements.eq(ele_pos).trigger( 'focusout' );
		        $elements.eq(ele_pos+1).focus();
		    }
		    
		    $elements.bind('keypress.eleswitch', function(event) {
		    	// tab and enter!
		    	if ( ( event.keyCode == '13' || event.keyCode == '9' ) && event.currentTarget.nodeName != 'TEXTAREA' ) {
					switch_focused_element();
					event.preventDefault();
				}
		    });    
		    
		    $elements.bind('focus', function() {
			    jQuery(this).addClass(classname);
			});  
		    
		    $elements.bind('blur', function() {
		        jQuery(this).removeClass(classname);
		    });   
		    
		}
		forms_handle_focus();
		
		var formInputs = [];
		for( var key in checks ){
			var rule_obj = {
				required: true
			};
			
			if( key == 'request_user_email' ){
				rule_obj.email = checks[key].validation;
				rule_obj.required = false;
			} else {
				rule_obj.validation = checks[key].validation;
			}
			
			// für data/messages felder 
			var nameArrays = key.match(/\[.+\]/);
			
			if( nameArrays != null ){
				var splitedKey = key.split( nameArrays[0] )
				input_rule['form[' +splitedKey[0] +']'+ nameArrays[0]] = rule_obj;
			} else {
				input_rule['form['+key+']'] = rule_obj;
			}
			error_msg_obj['form['+key+']'] = checks[key]['error_msg'];
		}
		
		jQuery.validator.addMethod('email', function( v, e, p ){
			var current_field = jQuery(e);
			var validator = this;
			
			e.value = v = v.replace(' ', '')
			if( e.value.match( new RegExp( p ) ) == null ){
				text = lng_str.default_error;
				cst_request_qtip( e , text);
				return false;
			} 
			
			jQuery.ajax({
				url: 'mail-validate.php?email=' + jQuery(e).val(),
		        type: 'GET',
		        dataType: 'json',
				success: function( data ){
					var state, text;
					var json_data = data;
					var error_type = json_data.error.type_str;
					
					if( json_data.suggestions.address && json_data.suggestions.address.www ){
						text = '<span> ' + lng_str.user_error_www + ' <span class="hint-error">www.</span></span>';
						cst_request_qtip( e , text);
						state = false;
					} else {
						if ( error_type == 'ERROR_TYPE_NOERROR' ) {
							if( jQuery(e).data("qtip") ) jQuery(e).qtip("destroy");
							state = true;
						} else {
							switch( error_type ){
								case 'ERROR_TYPE_USER_NONEXISTANT':
									text = '<span>' + lng_str.user_error + ' <span class="hint-error">' + json_data.mail.user + '</span>@' + json_data.mail.domain + '</span>';
								break;
								case 'ERROR_TYPE_DOMAIN_NONEXISTANT':
									if( json_data.suggestions.domain != '' ){
										var nearest_domains = $.grep(json_data.suggestions.domain, function( d ){
											return d.lev == 1;
										});
										var domains_used = json_data.suggestions.domain;
										if( nearest_domains.length ){
											domains_used = nearest_domains;
										}
										var suggestions_domains = $.map(domains_used, function( d ){
											return d.domain;
										}).join('<span class="hint-error-compine"> '+ lng_str.or +' </span>');
										text = '<span> ' + lng_str.user_mean + ' <span class="hint-error">' + suggestions_domains + '?</span></span>';
									} else {
										text = '<span>' + lng_str.domain_error + ' '+ json_data.mail.user + '@<span class="hint-error">' + json_data.mail.domain + '</span></span>';
									}
									
								break;
								case 'ERROR_TYPE_USER_MAILBOX_FULL':
									text = lng_str.user_error_full;
								break;	
								default:
									text = lng_str.default_error;
								break;
							}
							cst_request_qtip( e , text);
							state = false;
						}
					}
					validator.async_response( v, e, p, state, data );
		        }
			})
			return 'pending';
		});
		
		jQuery.validator.addMethod('validation', function( v, e, p ){
			var current_field = jQuery(e);
			var element_name = e.name;
			
			if ( current_field.attr('name') == 'form[rd_from1]' || current_field.attr('name') == 'form[rd_to1]' ){
				p = '[0-9]+\.[0-9]+\.[0-9]{4}';
			}
			
			if( e.value.match( new RegExp( p , 'i' ) ) == null ){
				if( current_field.attr('type') == 'checkbox' || current_field.attr( 'type' ) == 'radio' || ( jQuery.browser.msie && current_field.is('select') && !current_field.parent().is('div.request-field-required') ) ){
					current_field.parent('div.request-field-success').replaceWith( jQuery( current_field ) );
					current_field.wrap( '<div class="request-field-required">' );
					if( current_field.attr('type') == 'checkbox' || current_field.attr('type') == 'radio' ){
						jQuery( this ).attr( 'checked', 'checked' );
					}
				}
				return false;
			} else {
				if( jQuery.browser.msie && current_field.is('select') && !current_field.parent().is('div.request-field-success') ){
					current_field.parent('div.request-field-required').replaceWith( jQuery( current_field ) );
					current_field.removeClass( 'request-field-success' ).wrap( '<div class="request-field-success">' );
				}
			}
			return true;
		});
		
		 window.cst_request_validator = jQuery( form ).validate({ 
		 	rules: input_rule,
		 	messages: error_msg_obj,
		 	onsubmit:false,
		 	errorClass:'request-field-required-check',
		 	validClass:'request-field-success',
		 	focusInvalid: true,
		 	onkeyup: false,
			errorPlacement: function(error, element) {
			     error.remove();
			},
			unhighlight: function(element, errorClass, validClass) {
				// nur pflichtfelder sollen hightlighted sein
				var namesObj = input_rule;
				for( var name in namesObj ){
					if( element.name == name ) {
						jQuery(element).addClass( validClass ).removeClass( errorClass ).removeClass( 'request-field-required' );
					} 
				}
			},
		 	success: function( label ) {
		 		label.addClass('request-field-success-check');
		 	}
		});
	}
	
	//input hints => auch anderweitig benutzbar
	//docu => http://craigsworks.com/projects/qtip/docs/
	function cst_request_qtip( element, text ){
		if( jQuery(element).data("qtip") ){
			jQuery(element).qtip("destroy");
		}
		jQuery(element).qtip({
			content: text,
			hide: {
				delay: 1500
			},
			show: { 
				ready:true 
			},
			style:{
				tip: 'bottomMiddle',
				border:{
					radius: 5
				}
			},
			position: {
                corner: {
                   tooltip:'bottomMiddle', 
                   target:'topMiddle'
                },
				adjust: { 
					x: 0, 
					y: 0,
					screen: true
				}
             }
	   });
	}

