Request.HTML.implement({
    processHTML: function(text){
        var match = text.match(/<body[^>]*>([\s\S]*?)<\/body>/i);
        text = (match) ? match[1] : text;

        var container = new Element('div');

        return $try(function(){
            var root = '<root>' + text + '</root>', doc;
            if (Browser.Engine.trident){
                doc = new ActiveXObject('Microsoft.XMLDOM');
                doc.async = false;
                doc.loadXML(root);
            } else {
                doc = new DOMParser().parseFromString(root, 'text/html');
            }
            root = doc.getElementsByTagName('root')[0];
            for (var i = 0, k = root.childNodes.length; i < k; i++){
                var child = Element.clone(root.childNodes[i], true, true);
                if (child) container.grab(child);
            }
            return container;
        }) || container.set('html', text);
    }
});


var submenuStates = new Object();
var addmenuStates = new Object();
var historyManager;
window.addEvent('domready', function(){
	$$('#mainmenu li a').each(function(mainmenu) {
		var submenuID = mainmenu.getParent().getProperty('rel');
		mainmenu.addEvent('mouseenter', function(){showHideSubmenu(mainmenu.getParent(),submenuID,true)});
		mainmenu.addEvent('mouseleave', function(){showHideSubmenu.delay(1000,mainmenu,new Array(mainmenu.getParent(),submenuID,false));submenuStates[submenuID]=false;});
	});
	$$('.submenu_panel').each(function(submenu) {
		var submenuID = submenu.getProperty('id').substring(8);
		submenu.addEvent('mouseenter', function(){showHideSubmenu(submenu,submenuID,true)});
		submenu.addEvent('mouseleave', function(){showHideSubmenu.delay(1000,submenu,new Array(submenu,submenuID,false));submenuStates[submenuID]=false;});
		submenuStates[submenuID] = false;
	});
	//Hover Show Full Hotel Name
	$$('#submenu a.expandName').each(function(elem) {
		elem.addEvent('mouseenter', function(){expandMenuName(elem,true)});
		elem.addEvent('mouseleave', function(){expandMenuName(elem,false)});
	});
	$$('.panel_shifter').each(function(panel_button) {
		panel_button.addEvent('click',function(){shiftPanel(panel_button)});
	});
	$$('.destinations li').each(function(destination_li) {
		destination_li.addEvent('mouseenter',function(){dest_mark_active(destination_li,true)});
		destination_li.addEvent('mouseleave',function(){dest_mark_active(destination_li,false)});
	});
	//FADE TEXTE (wie Angebote suchen)
	$$('.fadetext').each(function(fadetext) {
		fadetext.addEvent('focus',function(){fadeText(fadetext,true)});
		fadetext.addEvent('blur',function(){fadeText(fadetext,false)});
	});
	//AJAX Links
	//History Manager:
	historyManager = new HistoryManager();
	historyManager.addEvent('onHistoryChange', function(hash) {
		regularAjaxRequest(hash);
	});
	//SUBSUBMENU
	$$('.subsubmenu').each(function(subsubmenu) {
		subsubmenu.addEvent('mouseenter',function(){li_mark_active(subsubmenu.getParent(),true)});
		subsubmenu.addEvent('mouseleave',function(){li_mark_active(subsubmenu.getParent(),false)});
		subsubmenu.getParent().addEvent('mouseenter',function(){li_mark_active(subsubmenu.getParent(),true)});
		subsubmenu.getParent().addEvent('mouseleave',function(){li_mark_active(subsubmenu.getParent(),false)});
	});
	if (window.location.href.lastIndexOf('#')>0){
		regularAjaxRequest(historyManager.getCurrentLocation());
	}
	replaceAjaxLinks('');

});

function hoverSwitchIcon(actMarker, normalImage, overImage, over){
	if (markerManager[actMarker]){
		var marker = markerManager[actMarker];
		if (over)
		 	marker.setImage(overImage);
		else
			marker.setImage(normalImage);
	}
}

function expandMenuName(elem, expand){
	var replaceText = elem.get('title');
	var span = elem.getElement('span');
	elem.set('title',span.get('html'));
	span.set('html',replaceText);
	if (expand) {
  	span.setStyle('display', 'block');
  	span.setStyle('position', 'absolute');
  	span.setStyle('overflow', 'visible');
  	span.setStyle('z-index', '999');
  }
	else {
		span.set('style','');
	}
}

function fadeText(fadeText,focus){
	if (focus){
		fadeText.set('rel',fadeText.get('value'));
		fadeText.set('value','');
	}
	else {
		fadeText.set('value',fadeText.get('rel'));
		fadeText.set('rel','');
	}
}

function replaceAjaxLinks(container){
	if (container)
		container = '#'+container + ' ';
	$$(container+'a.ajax').each(function(link) {
		setAjaxLink(link);
	});
}

function regularAjaxRequest(hash){
	$('loader').setStyle('display','block');
	if (window.location.href.lastIndexOf('#')<0)
		return false;
	var urlSuffix = '.htm';
	var tAjaxBaseUrl = actAjaxBaseUrl;
	if (tAjaxBaseUrl.substring(tAjaxBaseUrl.length-urlSuffix.length) ==urlSuffix)
		tAjaxBaseUrl = tAjaxBaseUrl.substring(0,tAjaxBaseUrl.length-urlSuffix.length);
	var dataArray = {format:'ajax'};
	var req = new Request.HTML({
		url:tAjaxBaseUrl + '/' + hash,
		method:'post',
		data:dataArray,
		evalScripts:true,
		evalResponse:true,
		onSuccess: function(responseTree, responseElements, responseHTML, responseJavaScript){
			$('content').set('text', '');
			$('content').adopt(responseTree);
			replaceAjaxLinks('content');
			$('loader').setStyle('display','none');
		},
		onFailure: function() {
			$('result').set('text', 'The request failed.');
			$('loader').setStyle('display','none');
		}
	});
	req.send();
}

function setAjaxLink(link){
	var urlSuffix = '.htm';
	var tAjaxBaseUrl = actAjaxBaseUrl;
	var newPageAjaxLink = false;
	if(link.getProperty('rel')){
		var relProperties = JSON.decode(link.getProperty('rel'));
		try {
			if (relProperties.ajaxbase) {
		  	tAjaxBaseUrl = relProperties.ajaxbase;
				newPageAjaxLink = true;
		  }
		}
		catch (e){
		}
	}
	if (tAjaxBaseUrl.substring(tAjaxBaseUrl.length-urlSuffix.length) ==urlSuffix)
		tAjaxBaseUrl = tAjaxBaseUrl.substring(0,tAjaxBaseUrl.length-urlSuffix.length);
	var linkURL = link.getProperty('href');
	if (linkURL.substring(linkURL.length-urlSuffix.length) ==urlSuffix)
		linkURL = linkURL.substring(0,linkURL.length-urlSuffix.length);
	//IE FIXES (in IE linkURL is complete http://)
	if (linkURL.lastIndexOf(tAjaxBaseUrl)>0){
		linkURL = linkURL.substring(linkURL.lastIndexOf(tAjaxBaseUrl));
	}
	var newLink = linkURL.substring(tAjaxBaseUrl.length,linkURL.length);
	if (newLink.charAt(0) == '/')
		newLink = newLink.substring(1,newLink.length);
	if (newPageAjaxLink)
		newLink = tAjaxBaseUrl + '#' + newLink;
	else
		newLink = actAjaxBaseUrl + '#' + newLink;

	link.setProperty('href',newLink)
}

function dest_mark_active(act_li,show){
	li_mark_active(act_li,show);
	if (show) {
		var subDestinations = act_li.getElement('ul');
		if (subDestinations){
/*			if (act_li.getPosition().y + subDestinations.getSize().y - $(document.body).getScroll().y > $(document.body).getSize().y)
		  	subDestinations.setStyle('margin-top', -subDestinations.getSize().y + act_li.getSize().y + 6);
		  else*/
	  		subDestinations.setStyle('margin-top', 0);
		}
  }
}

function li_mark_active(act_li,show){
	if (show) {
  	act_li.addClass('active');
  }
  else {
  	act_li.removeClass('active');
  }
}

function shiftPanel(panelButton){
	if(panelButton.hasClass('inactive'))
		return false;
	var right = panelButton.hasClass('right');
	if (right)
		var shiftWrapper = panelButton.getPrevious();
	else
		var shiftWrapper = panelButton.getNext();
	shiftWrapper = shiftWrapper.getFirst();
	var actShiftPosition = shiftWrapper.get('rel');
	var shiftPlit = actShiftPosition.split(',');
	actShiftPosition = shiftPlit[0].toInt();
	maxShift = shiftPlit[1];
	if (right)
		var shiftOffset = -1;
	else
		var shiftOffset = 1;
	actShiftPosition = actShiftPosition + shiftOffset;
	if (-(actShiftPosition) >= Math.ceil(maxShift/2)){
		panelButton.addClass('inactive');
		if (right){
			panelButton.getPrevious().getPrevious().removeClass('inactive');
		}
		else{
			panelButton.getNext().getNext().removeClass('inactive');
		}
	}
	else {
		if (right){
			panelButton.removeClass('inactive');
		}
		else{
			panelButton.getNext().getNext().removeClass('inactive');
		}
	}
	if (actShiftPosition<0){
		if (right){
			panelButton.getPrevious().getPrevious().removeClass('inactive');
		}
		else{
			panelButton.removeClass('inactive');
		}
	}
	else{
		if (right){
			panelButton.getPrevious().getPrevious().addClass('inactive');
		}
		else{
			panelButton.addClass('inactive');
		}
	}
	shiftWrapper.set('rel',actShiftPosition+','+maxShift);
	var nextMargin = actShiftPosition*404;
	var morphObject = new Fx.Morph(shiftWrapper, {
		duration: 400,
		transition: 'quad:in:out',
		onComplete: function(passes_tween_element){

		}
	});
	morphObject.start({
		'margin-left': nextMargin
	});
}

function showHideSubmenu(triggerObject,submenuID,show){
	var submenu = $('submenu_'+submenuID);
	//Wenn das men� ausgeblendet werden soll, aber es auf sichtbar geschaltet ist
	if (show)
		submenuStates[submenuID] = true;
	if (show != submenuStates[submenuID])
		return false;
	if (submenu)
		if (show && parseFloat(submenu.getStyle('opacity'))>0  && submenu.getStyle('display') != 'none')
			return false;

	var opacity = 1;
	var display = 'block';
	if (show) {
		//Alle offenen MEn�s ausblenden
		fadeOutAllOthers(triggerObject,submenuID);
		if (submenu) {
			submenu.setStyle('opacity', 0);
			submenu.setStyle('display', 'block');
			var mainmenuPosition = $('mainmenu').getPosition()['x'];
			var parentLeftOffset = triggerObject.getPosition()['x'];
			var actSubmenuOffset = parentLeftOffset - mainmenuPosition;
			var submenuWidth = submenu.getSize().x;
			if ((submenuWidth + actSubmenuOffset - 2)>692){
				var parentWidth = $(triggerObject).getSize()['x'];
				submenu.setStyle('margin-left', actSubmenuOffset -4+parentWidth-submenuWidth+18);
			}
			else
				submenu.setStyle('margin-left', actSubmenuOffset );
		}
		if (show){
			triggerObject.addClass('active');
		}
	}
	else {
		opacity = 0;
		display = '';
	}
	if (!submenu) return false;
	var morphObject = new Fx.Morph(submenu, {
		duration: 200,
		transition: 'quad:in:out',
		onComplete: function(passes_tween_element){
			submenu.setStyle('display', display);
		}
	});
	morphObject.start({
		'opacity': opacity
	});
}

function showHideAddMenu(triggerObject,addMenuID,show){
	var addmenu = $(addMenuID);
	//Wenn das men� ausgeblendet werden soll, aber es auf sichtbar geschaltet ist
	if (show)
		addmenuStates[addMenuID] = true;
	if (show != addmenuStates[addMenuID])
		return false;
	if (addmenu)
		if (show && parseFloat(addmenu.getStyle('opacity'))>0  && addmenu.getStyle('display') != 'none')
			return false;

	var opacity = 1;
	var display = 'block';
	if (show) {
		//Alle offenen MEn�s ausblenden
		fadeOutAllOtherAddMenus(triggerObject,addMenuID);
		if (addmenu) {
			addmenu.setStyle('opacity', 0);
			addmenu.setStyle('display', 'block');
			var parentLeftOffset = triggerObject.getPosition()['x'];
			var parentWidth = triggerObject.getSize().x;
			var addMenuWidth = addmenu.getSize().x;
			var maincontentPosition = $('maincontent_wrapper').getPosition()['x'];
			var maincontentWidth = $('maincontent_wrapper').getSize().x;
			if ((parentLeftOffset -2 +addMenuWidth)>(maincontentPosition + maincontentWidth)){
				addmenu.setStyle('left', parentLeftOffset +1 +parentWidth-addMenuWidth);
			}
			else {
				addmenu.setStyle('left', parentLeftOffset-1);
			}
			/*
			var submenuWidth = submenu.getSize().x;
			if ((submenuWidth + actSubmenuOffset - 2)>692){
				var parentWidth = $(triggerObject).getSize()['x'];
				submenu.setStyle('margin-left', actSubmenuOffset - 2+parentWidth-submenuWidth+18);
			}
			else
				submenu.setStyle('margin-left', actSubmenuOffset - 2);
			*/
		}
		if (show){
			triggerObject.addClass('active');
		}
	}
	else {
		opacity = 0;
		display = '';
	}
	if (!addmenu) return false;
	var morphObject = new Fx.Morph(addmenu, {
		duration: 200,
		transition: 'quad:in:out',
		onComplete: function(passes_tween_element){
			addmenu.setStyle('display', display);
		}
	});
	morphObject.start({
		'opacity': opacity
	});
}
function fadeOutAllOtherAddMenus(triggerObject, actAddMenuID){
	$$('#destinations_offers a.dropdown').each(function(addmenu_link) {
		var addMenuID = 'panel_'+addmenu_link.getProperty('rel');
		var addmenu = $(addMenuID);
		if (actAddMenuID != addMenuID) {
			addmenuStates[addMenuID] = false;
			showHideAddMenu(triggerObject,addMenuID,false);
			addmenu_link.removeClass('active');
		}
	});
}
function fadeOutAllOthers(triggerObject,actSubmenuID){
	$$('.submenu_panel').each(function(submenu) {
		var submenuID = submenu.getProperty('id').substring(8);
		if (actSubmenuID != submenuID) {
			submenuStates[submenuID]=false;
			showHideSubmenu(triggerObject,submenuID, false);
		}
	});
	$$('#mainmenu li').each(function(mainmenuTab) {
		var submenuID = mainmenuTab.getProperty('rel');
		if (actSubmenuID != submenuID){
			mainmenuTab.removeClass('active');
		}
	});
}
function unmaskEmail(id){
	var emailText = $(id).get('text');
	var replaceText = '';
	for (var i=0;i<emailText.length;i++){
		replaceText = replaceText + String.fromCharCode(emailText.charCodeAt(i)-1);
	}
	$(id).set('text', replaceText);
	$(id).set('href','mailto:'+replaceText);
}
function validateForm( frm ) {
	var valid = document.formvalidator.isValid(frm);
	if (valid == false) {
		return false;
	} else {
		return true;
	}
}

function setStarsSelector(fieldName){
	var elemBG = $(fieldName+'_stars_bg');
	var elemFG = $(fieldName+'_stars_fg');
	var elemInput = $(fieldName);
	var params = JSON.decode(elemBG.getProperty('rel'));
	var initStars = elemInput.get('value');
	elemBG.setStyle('width',params.max_stars*26);
	elemFG.setStyle('width',initStars*26);
	elemBG.addEvent('mousemove',function(event){moveStars(event,fieldName,params);});
	elemBG.addEvent('mouseenter',function(event){elemBG.set('class','stars_selector_bg_active');});
	elemBG.addEvent('mouseleave',function(event){elemBG.set('class','stars_selector_bg');restoreStars(fieldName)});
	elemBG.addEvent('click',function(event){clickStars(event,fieldName,params);});

}

function getStarsPosition(event,params){
	var event = new Event(event);
	var position = event.client.x - event.target.getPosition()['x'];
	var stars = Math.round(position/26);
	if (stars>params.max_stars)
		stars = params.max_stars;
	else if (stars<params.min_stars)
		stars = params.min_stars;
	return stars;
}
function moveStars(event, fieldName, params){
	var stars = getStarsPosition(event,params);
	position = parseInt(stars*26);
	$(fieldName+'_stars_fg').setStyle('width',position+'px');
}

function clickStars(event, fieldName,params){
	var stars = getStarsPosition(event,params);
	$(fieldName).set('value',stars);
	position = parseInt(stars*26);
	$(fieldName+'_stars_fg').setStyle('width',position+'px');
	$(fieldName+'_stars_bg').set('class','stars_selector_bg');
}

function restoreStars(fieldName){
	var initStars = $(fieldName).get('value');
	$(fieldName+'_stars_fg').setStyle('width',initStars*26)
}
