/*
 * Sammelvariable fuer alle Javascriptfunktionen, die mit der Suche zu tun haben
 * @author Marco Bender <bender@via-software.de>
 * @version 1.5 - 30.11.2011
*/
var Suche = {};

/* Just for testing */
Suche.host = "http://www.residencio.de/";

/*
 * initialisiert alle Funktionen, die fuer die Suche benoetigt werden
 *
*/
Suche.init = function() {
	Suche.preloadImages();
	Suche.initFeatures();
	
	/* MultiSelect fuer Laender */
	$$('.countries').each(function(el) {
		new MultipleSelect(el, $('more_country_content'), $('choosen_countries')).createString();
	});
	$('more_country').slide('hide');
	$('more_country').style.display = 'block';
	
	/* MultiSelect fuer Regionen */
	$$('.regions').each(function(el) {
		new MultipleSelect(el, $('more_region_content'), $('choosen_region')).createString();
	});
	$('more_region').slide('hide');
	$('more_region').style.display = 'block';
	
	/* erweiterte Besonderheiten */
        
	$('featureUl').set('tween', {
		transition: Fx.Transitions.Linear, 
		onComplete: function(elem) {
			$('featureUl').toggleClass('multiple_select_list2_grown');
			$('more_feature_button2').toggleClass('buttondown');
			$('more_feature_button2').toggleClass('buttonup');
			$('featureUl').scrollTo(0);
			if (elem.getStyle('height').toInt() < 300) {
				$('more_features_text').set('html', 'Mehr Besonderheiten');
			} else {
				$('more_features_text').set('html', 'Ausblenden');
			}
		}
	});
	$('more_feature_button').addEvent('click', function(ev) {
		if ($('featureUl').getStyle('height').toInt() < 300) {
			$('featureUl').tween('height', 300);
		} else {
			$('featureUl').tween('height', 100);
		}
	});
	
	/* Paginatortextfelder Eventinitialisierung */
	if ($$('.search_jmp').length > 0) {
		$$('.search_jmp').each(function(item) {
			item.addEvents({
				'keydown' : function(event) {
					if (event.key == 'enter' && this.value != '') {
						$('hidden_page').value = this.value
						$('searchbox').submit();
						return false;
					} else if (event.key == 'enter') {
						return false;
					}
				},
				'blur' : function() {
					if (this.value != '') {
						$('hidden_page').value = this.value;
						$('searchbox').submit();
					}
				}
			});
		});
	}
};

/*
 * Anzeigen/Ausblenden der erweiterten Suchfunktion
 */
Suche.toggleOptions = function() {
	$('more_options').slide('toggle');
        /*
        if ($('more_options').getStyle('display') == 'none') {
            $('more_options').setStyle('display', 'block');
        } else {
            $('more_options').setStyle('display', 'none');
        }*/
        
        /*
        $('img_erweitert_top').toggleClass('erweitertclose');
        $('img_erweitert_top').toggleClass('erweitertopen');

        $('img_erweitert').toggleClass('erweitertclose');
        $('img_erweitert').toggleClass('erweitertopen');
        */
}

/*
 * Anzeigen/Ausblenden der Laenderliste
 */
Suche.toggleMoreCountry = function() {
	$('more_country').slide('toggle');
	if($('more_region').get('slide').open) {
		$('more_region').slide('out');
	}
}

/*
 * Anzeigen/Ausblenden der Regionliste
 */
Suche.toggleMoreRegion = function() {
	if(!$('search_more_region').hasClass('disabled')) { 
		$('more_region').slide('toggle'); 
		if($('more_country').get('slide').open) {
			$('more_country').slide('out');
		}
	}
}

/*
 * Laedt alles vor, was waehrend der Eingabe benoetigt wird
 * erstellt Events fuer die ganzen Buttons
 */
Suche.preloadImages = function () {
	Suche.preloadImage = new Image();
	Suche.preloadImage.src = '/images/stichwortsuche/erweitert_small.png';
	
	Suche.preloadImageClose = new Image();
	Suche.preloadImageClose.src = '/images/stichwortsuche/erweitert_small_close.png';
	
	Suche.preloadImagePfeil = new Image();
	Suche.preloadImagePfeil.src = '/images/button_pfeil_up.gif';
	
	Suche.addToggleSlideEvent('more_country', 'more_country_button');
	Suche.addToggleSlideEvent('more_region', 'more_region_button');
	Suche.addToggleSlideEvent('more_feature', 'more_feature_button');
	
        /*
        $('more_options').get('slide').addEvent('start', function(elem) {
            if (this.open) {
                elem.getParent().setStyle('height', 20);
                elem.getParent().setStyle('overflow', 'hidden');
            }
        });*/
    
        $('more_options').get('slide').options.hideOverflow = false;
        $('more_options').get('slide').options.resetHeight = true;
        
	$('more_options').get('slide').addEvent('complete', function(elem) {
		$('img_erweitert_top').toggleClass('erweitertclose');
		$('img_erweitert_top').toggleClass('erweitertopen');
		
		$('img_erweitert').toggleClass('erweitertclose');
		$('img_erweitert').toggleClass('erweitertopen');
                /*if (this.open) {
                    elem.getParent().setStyle('height', '');
                    elem.getParent().setStyle('overflow', 'visible');
                } */
	});
        
}

/**
 * Listener, der an ein Slide Complete Event die Klassen buttondown
 * und buttonup vertauscht
 */
Suche.addToggleSlideEvent = function(toElem, button) {
	if ($(toElem) == null) return;
	$(toElem).get('slide').addEvent('complete', function (elem) {
			$(button).toggleClass('buttondown');
			$(button).toggleClass('buttonup');
	});
}

/*
 * initalisiert die Besonderheiten
 */
Suche.initFeatures = function() {
	$$('.features').each(function(item) {
		item.addEvent('click', function(ev) {
			this.toggleClass('choice_selected');
			$("sel"+this.id).selected = !$("sel"+this.id).selected;
		})
	});
}

/**
 * Laedt die regionlist in laendersuche
 * Nicht mit erweiterte Stichwortsuche nutzen!
 */
Suche.loadRegion = function(countryId) {
    if ($("region_"+countryId).hasClass("received")) {
        $("region_"+countryId).slide("toggle");
        
    } else {
        new Request.JSON({
            url: Suche.host+'geco/' + countryId + '/regions.json',
            onRequest: function() {
                $("loader_"+countryId).removeClass("hide");
            },
            onComplete: function() {
                $("loader_"+countryId).addClass("hide"); 
            },
            onSuccess: function(region) {
                $("region_"+countryId).get("slide").options.resetHeight = true;
                $("region_"+countryId).slide("hide");  
                $("region_"+countryId).removeClass("hide");
                    
                if (region.length > 0) {
                    region.each(function(item) {
                        var r = new Element("div", {
                            "class": "region"
                        });

                        var firstdiv = new Element("div", {
                            "class": "fll boldlink moo_tip",
                            "title": "Subregionen anzeigen",
                            "html": item.region,
                            "styles": {"padding-right" : "5px"}
                        });
                        
                        if (item.hasSubregions > 0) {
                            firstdiv.addClass("underline");
                        } else {
                            firstdiv.set("html", "");
                            firstdiv.appendChild(new Element("a", {
                                "href"  : Suche.host+"urlauber/search/?regionIds[]=r"+item.id,
                                "html"  : item.region
                            }));
                            
                            firstdiv.set("title", "Objekte anzeigen");
                        }
                        r.appendChild(firstdiv);

                        var seconddiv = new Element("div", {
                            "class": "fll"
                        });
                        var nof_objects = new Element("a", {
                            "id"    : "counter_region_"+item.id,
                            "class" : "counter_region",
                            "title" : "Objekte anzeigen",
                            "html"  : " ("+item.nof_objects+" <img src='images/laendersuche_haus.png' border='0'/>)", //<img src='images/ajax-loader.gif' border='0' width='10px' style='padding-left: 5px;'/>",
                            "href"  : Suche.host+"urlauber/search/?regionIds[]=r"+item.id
                        });
                        seconddiv.appendChild(nof_objects);
                        new Tips(nof_objects, {text: ""});
                        
                        r.appendChild(seconddiv);
                        r.appendChild(new Element("div", {
                            "html"  : "<a href='"+Suche.host+"kartensuchegoto.php?regionid="+item.id+"'><img src='images/weltkarte.png' border='0'/></a>",
                            "class" : "fll moo_tip",
                            "title" : "Region auf Karte anzeigen"
                        }));
                        r.appendChild(new Element("div", {
                            "html"  : "<img src='images/ajax-loader.gif' border='0' width='10px' style='padding-left: 5px;'/>",
                            "class" : "fll hide",
                            "id"    : "loader_sr"+item.id
                        }))
                        r.appendChild(new Element("div", {"class": "clearer"}));

                        if (item.hasSubregions > 0) {
                            var sr = new Element("div", {
                                "id"    : "subregion_"+item.id,
                                "class" : "subregion hide moo_tip"
                            });
                            r.appendChild(sr);
                            sr.slide("hide");
                            sr.removeClass("hide");
                            
                            firstdiv.addEvent('click', function() {
                                Suche.loadSubregions(sr, item.id);
                            });
                        }
                        //append to region
                        $("region_"+countryId).appendChild(r);

                    });
                    new Tips(".moo_tip");
                    $("region_"+countryId).addClass("received");
                    $("region_"+countryId).slide("toggle");
                    $("region_"+countryId).get("slide").addEvent("complete", function(ev) {
                        Cookie.write("countryId", ev.id.substr(ev.id.indexOf("_")+1));
                    });
                    
                    //this is just for initializing for users who use forward/back buttons
                    Suche.initLaendersuche(true);
                }
            }
        }).send();
    
    }
}

/**
 * Laedt Subregionlist in json format und fuegt es der
 * laendersuche view hinzu
 * nicht mit erweiterter Suche nutzen
 */
Suche.loadSubregions = function(srdiv, regionId) {
    if (srdiv.hasClass("received")) {
        srdiv.slide("toggle");
        return true;
    }
    
    new Request.JSON({
        url: Suche.host+'geco/' + regionId + '/subregions.json',
        onRequest: function() {
          $("loader_sr"+regionId).removeClass("hide");  
        },
        onComplete: function() {
              $("loader_sr"+regionId).addClass("hide");  
        },
        onSuccess: function(subregion) {
            if (subregion.length > 0) {
                subregion.each(function(item) {
                    var i = new Element("div", {
                       "class"  : "subregion"
                    });
                    var rname = new Element("a", {
                        "href"  : Suche.host+"urlauber/search/?regionIds[]=s"+item.id,
                        "class" : "fll",
                        "title" : "Objekte anzeigen",
                        "html"  : item.subregion,
                        "styles": {"padding-right": "5px"}
                    });
                    i.appendChild(rname);
                    new Tips(rname, {text: ""});

                    i.appendChild(new Element("a", {
                        "class": "counter_subregion fll",
                        "id": "counter_subregion_"+item.id,
                        "href": Suche.host+"urlauber/search/?regionIds[]=s"+item.id,
                        "html": " ("+item.nof_objects+" <img src='images/laendersuche_haus.png' border='0'/>)"
                    }));
                    i.appendChild(new Element("a", {
                        "href"  : Suche.host+"kartensuchegoto.php?subregionid="+item.id,
                        "html"  : "<img src='images/weltkarte.png' border='0'/>",
                        "class" : "fll",
                        "title" : "Subregion auf Karte anzeigen",
                        "styles": {"padding-right": "5px"}
                    }));

                    i.appendChild(new Element("div", {"class": "clearer"}));
                    srdiv.appendChild(i);
                });
                srdiv.addClass("received");
                srdiv.slide("toggle");
                srdiv.get("slide").addEvent("complete", function(ev) {
                    Cookie.write("regionId", ev.id.substr(ev.id.indexOf("_")+1));
                });
            }
        }
    }).send();
    return true;
}

/**
 * Loads previous state of Laendersuche if set with cookies
 * for users who use forward/back buttons
 * start with partTwo = false, partTwo will be automatic executed if there is a
 *  region set and the load of the regionlist is done
 * @param partTwo boolean - always start with false
 */
Suche.initLaendersucheDone = false;
Suche.initLaendersuche = function(partTwo) {
    if (!Suche.initLaendersucheDone) {
        if (partTwo) {
            if (Cookie.read("regionId") != null) {
                Suche.loadSubregions($('subregion_'+Cookie.read("regionId")), Cookie.read("regionId"));
            }
            Suche.initLaendersucheDone = true;
        } else if (Cookie.read("countryId") != null) {
            Suche.loadRegion(Cookie.read("countryId"));
            console.log(window.location.hash = "country_"+Cookie.read("countryId"));
        }
    }
}

/*
Script:
  multiple_select.js

License:
  MIT-style license
  
Group: HTML Widgets
  provides customizable multiple select widgets

Based on:
  comboBoo.js by Bruno Torrinha, <http://www.torrinha.com>

Credits:
  wollzelle GmbH, <http://www.wollzelle.com>
  Michael Aufreiter

GitHub: http://github.com/michael/multiple_select/blob/master/multiple_select.js
*/



/*
Class: MultipleSelect
  collects functions for multiple select widgets

Note:
  static class
*/
var MultipleSelect = new Class({
	Implements: [Events, Options],
	options: {
		className: 'multiple_select'
	},
	oldSelect: {},
	toElement: {},
	selectList: {},
	
  /*
  Property: initialize
    initializes a new multiple select widget
  */
  
	initialize: function(el, container, toElement) {
		this.oldSelect = $(el);
		this.toElement = toElement;
		
		this.selectList = new Element('ul', {
		  'class': this.options.className + '_list', 'id': el.name+'_choices'
		}).injectInside(container);

		this.build(el);
	},

  /*
  Property: build
    builds the HTML that is needed for displaying the multiple select
    widget instead of the normal select box
  */

	build: function(el) {
		var i=0, el2={}, innerEl;
		for( i = 0; i < el.length; i++) {
			el2 = new Element('li', 
						{'id': el.name + '_' + i}
					);
			/*IE6 Workaround, transparent places in png are not clickable*/
			var divClick = new Element('div');
			el2.adopt(divClick);
            innerEl = new Element('span', 
                    {'class': 'mutli',
                    'html': el.options[i].text}
            );
            divClick.adopt(innerEl);
            divClick.addEvents({
                'mousedown': this.choiceSelect.bind(this, [el2])
            });
      if (this.oldSelect.options[i].selected)
      	el2.addClass('choice_selected');		  
			this.addChoiceEvents(el2);
			el2.injectInside(this.selectList);
		};
	},

  /*
  Property: choiceSelect
    selects or deselects the clicked list items
  */
	choiceSelect: function(el) {
	    //el = el.getParent();
		el.toggleClass('choice_selected');
		var id = el.id.substring(el.id.lastIndexOf('_')+1).toInt();
		if (this.oldSelect.options[id].selected) {
			this.oldSelect.options[id].selected = '';
		} else { 
			this.oldSelect.options[id].selected = 'selected';
		}
		this.createString(true);
		
		el.fireEvent('change');
	},

  /*
  Property: addChoiceEvents
    registers the mouse events
  */
	addChoiceEvents: function(el) {
		return el.addEvents({
			mouseover: function() {el.addClass('choice_hover');},
			mouseout: function() {el.removeClass('choice_hover');}//,
			//mousedown: function(evt) { this.choiceSelect.bind(this, [el]); evt.stopPropagation(); }.bindWithEvent(this, [el])
		});
	},
	
	/*
	 * erstellt Texte für Laender und Regionfilter
	 */
	createString: function (reload) {
		var result = this.createCountryIdList('html'), html = [], i=0;
		if (reload === undefined) {
			reload = false;
		}
		if (result.length > 0) {
				result.each(function(item, key) {
					if (item.substr(0,1) == '-') {
						html.push(item.substr(1).replace(/&nbsp;/g, '').clean());
					} else {
						html.push(item.trim());
					}
				});
				this.toElement.set('html', html.join(', '));
				if (reload) {
					this.grayChange(true);
				}
		} else {
				this.toElement.set('html', '-- bitte ausw&auml;hlen --');
				if (reload) {
					this.grayChange(false);
				}
		}

	},
	
	/*
	 * Erstellt eine Liste mit den Werten aller Selected Felder 
	 * der Country Liste
	 */
	createCountryIdList: function(valueOrHtml) {
		var result = [];
		this.oldSelect.getSelected().each(function(item) {
			if (valueOrHtml == 'value') {
				result.push(item.value);
			} else {
				result.push(item.get('html'));
			}
				
		});
		return result;
	},
	
	/*
	 * Erstellt eine Liste mit den Werten aller selected Felder
	 * der Region Liste
	 */
	createRegionIdList: function() {
			var result = [];
			$('regionIds').getSelected().each(function(item) {
				result.push(item.value);
			});
			return result;
	},
	
	/*
	 * Graustufe fuer Region wird hier veraendert falls keine Laender ausgewaehlt werden,
	 * wird dieser ausgeblendet.
	 */
	grayChange: function (enough) {
		if (enough && this.toElement.id == 'choosen_countries') {
			$('search_more_region').removeClass('disabled');
			this.loadRegions();
		}
		else if (!enough && this.toElement.id == 'choosen_countries') {
			$('search_more_region').addClass('disabled');
			$('more_region').slide('out');
			
			//deleting all regions
			$('regionIds').getChildren().each(function(item, index) {
				item.dispose();
			});
			$('more_region_content').getChildren().each(function(item) {
				item.dispose();
			});
			$('choosen_region').set('html', '-- bitte ausw&auml;hlen --');
		}
	},
	
	/*
	 * Laedt die Regionen fuer die ausgewaehlte Regionen nach
	 */
	loadRegions: function() {
		var countries = this.createCountryIdList('value'), 
			selected_regions = this.createRegionIdList('value');
		new Request.JSON({
				url: Suche.host+'urlauber/geco/search/' + countries.join(',') + '/region.html',
				onSuccess: function(region) {
					$('regionIds').getChildren().each(function(item, index) {
						item.dispose();
					});
					$('more_region_content').getChildren().each(function(item) {
						item.dispose();
					});

					region.each(function(item, index) {
						var options = {'value' : item.id, 'html': item.region};
						if (selected_regions.contains(item.id)) {
							options.selected = 'selected';
						}
						var elem = new Element('option', options);
						elem.inject($('regionIds'));
					});
					
					$$('.regions').each(function(el) {
						new MultipleSelect(el, $('more_region_content'), $('choosen_region')).createString();
					});
				}
		}).send();
	}
});

