Event.observe(window,'load',initSearchMenu);
Event.observe(window,'load',initCalendar);

var lastOffre = '';
var persistentOffres ='';
var optionFlag = 1;

function initSearchMenu()
{
    if($('mainSearchEngine') != null)
    {
        populateBrandsOrDestination('brands');
        populateBrandsOrDestination('type_destination');
        populateActivities();
        fixLabelForIe();
        bindBtnBrands();
        bindBtnDestination();
        loadPays('none');
        loadRegion('none');
        loadVille('none');
        resetTypDest();
        resetBrands();
        lastOffre= relation;
        populateSearchFields();
    }
}
	
function fixLabelForIe()
{
    if(Prototype.Browser.IE) 
    {
        fixLabelActionforBrands();
        fixLabelActionforDest();
    }
}

function fixLabelActionforBrands()
{
    var brandImgs = $$('.brandImg');
    brandImgs.each(function(el){
        el.observe('click', fixIeForBrands);
    });
}

function fixLabelActionforDest()
{
    var brandImgs = $$('.destImg');
    brandImgs.each(function(el){
        el.observe('click', fixIeForDest);
    });
}

function fixIeForBrands(e)
{
    var imgEl = e.element();
    var inputEl = $(imgEl).previous();

    if(inputEl.checked==true){
        inputEl.checked=false;
        loadBrandDest();
        return;
    }
    else
    {
        inputEl.checked='checked';
        loadBrandDest();
    }

}

function fixIeForDest(e)
{
    var imgEl = e.element();
    var inputEl = $(imgEl).previous();

    if(inputEl.disabled==true){
        return;
    }

    if(inputEl.checked==true){
        inputEl.checked = false;
        loadBrandDest();
        return;
    }
    else{
        inputEl.checked='checked';
        loadBrandDest();
        return;
    }
}		
	
/*chargement des marques et des types de destination*/
function populateBrandsOrDestination(type)
{
    var listBrands = marque;
    var listTypeDestination = type_destination;
    var srcArray = [];
    var mainContainer;
    var item;
    var completeID;
    var elName;
    var elClass;
    var igmClass

    if(type=='brands')
    {
        mainContainer = $('brandsContainer');

        item = listBrands;
        listBrands.each(function(brand){
            srcArray[brand.id] = 'pictos/search_logo_' + brand.id.toLowerCase() + '.gif';
        });
        completeID = 'brand-';
        elName ='brand[]';
        elClass= 'btnBrand';
        igmClass = 'brandImg';
    }

    if(type=='type_destination')
    {
        mainContainer = $('typeDestContainer');

        item = listTypeDestination;

        listTypeDestination.each(function(typeDest){
            srcArray[typeDest.id] = 'pictos/search_typedest_' + typeDest.id.toLowerCase() + '.gif';
        });

        completeID ='boundfor-';
        elClass='btnDest';
        elName ='destination[]';
        igmClass = 'destImg';
    }

    item.each(function(oItem){
        var itemId = oItem.id;
        var rootEl = new Element('label',{'title':oItem.text, 'for':completeID+itemId});
        var fst_child = new Element('input',{'id':completeID+itemId, 'class':elClass, 'type':'checkbox', 'value':itemId, 'name':elName});
        var lst_child = new Element('img',{'alt':oItem.text, 'class':igmClass, 'style':'float:left;', 'src':imgBasePath + srcArray[itemId]});

        rootEl.insert(fst_child);
        rootEl.insert(lst_child);
        mainContainer.insert(rootEl);
    });
    mainContainer.insert('<div class="clearBlock"></div>');
}

function populateActivities ()
{
    var elName = 'activities[]';

    var i = 0;
    var j = 0;

    var rows = [];

    var rootEl = document.createElement('table');

    rows[j] = [];
    activities.each(function(item) {

        if (i > 0 && (i%2)==0) {
            j++;
            rows[j] = [];
        }

        var label = document.createElement('label');
        var textLabel = document.createTextNode(' ' + item.desc);

        var input = document.createElement('input');
        input.setAttribute('type', 'checkbox');
        input.setAttribute('class', 'btnActi');
        input.setAttribute('name', elName);
        input.setAttribute('value', item.code);

        label.appendChild(input);
        label.appendChild(textLabel);

        rows[j][(i%2)] = label;
        i++;
    });

    rows = $A(rows);

    for(var x=0; x < rows.size(); ++x)
    {
        var ligne = rootEl.insertRow(x);
        for(var y=0; y < rows[x].size(); ++y)
        {
            var col = ligne.insertCell(y);
            col.setAttribute('class', 'col0'+(y+1));
            col.appendChild(rows[x][y]);
        }
    }

    //liste vide, désaffichage du titre
    if (rows.size() == 0) {
        $('activitiesContainerTitle').hide();
    }

    $('activitiesContainer').appendChild(rootEl);

    var clearEl = document.createElement('div');
    clearEl.setAttribute('class', 'clearBlock');
    $('activitiesContainer').appendChild(clearEl);
}
	
function resetMoteur()
{
    resetTypDest();
    resetBrands();
    loadPays('none');
    loadRegion('none');
    loadVille('none');

    $('date_depart').value ='jj/mm/aaaa';
    $('duration').selectedIndex = 0;
    $('budget').selectedIndex = 0;
    $('nbPeople').selectedIndex = 0;

    $$('.btnActi').each(function(el){
        el.checked = false;
    });

    $$('.btnHousing').each(function(el){
        el.checked = false;
    });
}

function loadBrandDest()
{
    // On récupère les cases cochées
    var checkedBrand = checkedBrands();
    var checkedDest = checkedDests();

    var offres;
    var type_DestinationToShow;

    // ------------ Tests pour savoir quel couple de bouton est coché ------------ //

    if(checkedBrand.length !=0 && checkedDest.length !=0 ) // Une marque et un type de destination au moins sont cochés
    {
        // On actualise les boutons radios des types de destination en fonction des marques choisies
        type_DestinationToShow = getTypeDestinationForBrands(checkedBrand);
        loadTypeDestination(type_DestinationToShow);
        // On recharge la liste des types de dest cochés, car certains on pu etre decochés automatiquement dans la fonction cidessus
        checkedDest = checkedDests();

        // On récupère la liste des offres liés aux marques choisies
        offres = getOffresForBrand(checkedBrand);

        // On trie les offres precedentes en fonction du type de destination si il y en a toujours de coché
        if(checkedDest.length !=0){
            offres = getOffresForTypeDest(checkedDest,offres);
        }

    }
    else if(checkedBrand.length ==0 && checkedDest.length !=0) // Juste type(s) de destination, pas de marques
    {
        offres = getOffresForTypeDest(checkedDest,relation);
    }
    else if(checkedBrand.length !=0 && checkedDest.length ==0) // Juste marque(s)
    {
        // On actualise les boutons radios des types de destination en fonction des marques choisies
        type_DestinationToShow = getTypeDestinationForBrands(checkedBrand);
        loadTypeDestination(type_DestinationToShow);

        // On récupère la liste des offres liés aux marques choisies
        offres = getOffresForBrand(checkedBrand);
    }
    else if(checkedBrand.length ==0 && checkedDest.length ==0) // Toutes les cases sont décochées
    {
        // On réinitialise les filtres
        loadPays('none');
        loadRegion('none');
        loadVille('none');
        resetTypDest();
        return;
    }

    // On charge les filtres en fonction des offres calculées précédemment
    var destTri =getDestinationsFromOffres(offres);
    var paysTri = getPaysFromOffres(offres);
    var regionTri = getRegionFromOffres(offres);
    loadPays(paysTri);
    loadVille(destTri);
    loadRegion(regionTri);
    lastOffre = offres;

    return;
}

function populateSearchFields()
{
    var data =$('searchCritere').value;
    if(data=='') {
        return false;
    }
    var searchCritere = data.evalJSON();
    brandsToselect = (searchCritere.brand) ? searchCritere.brand : null;
    destinationToselect = searchCritere.destination ? searchCritere.destination : null;
    activitiesToSelect = searchCritere.activities ? searchCritere.activities : null;
    typeHousingToSelect = (searchCritere.typeHousing) ? searchCritere.typeHousing : null;
    
    if(searchCritere.duration) {
        selectOption('duration',searchCritere.duration);
    }
    if(searchCritere.nbPeople) {
        selectOption('nbPeople',searchCritere.nbPeople);
    }
    if(searchCritere.budget) {
        selectOption('budget',searchCritere.budget);
    }
    if(searchCritere.date) {
        $('date_depart').value = searchCritere.date;
    }
    if(brandsToselect) {
        selectItemWithValue(brandsToselect,'.btnBrand');
    }
    if(destinationToselect) {
        selectItemWithValue(destinationToselect,'.btnDest');
    }
    if(activitiesToSelect) {
        selectItemWithValue(activitiesToSelect,'.btnActi');
    }
    if(typeHousingToSelect) {
        selectItemWithValue(typeHousingToSelect,'.btnHousing');
    }
    if(!brandsToselect) {
        loadBrandDest();
    }
    if(!destinationToselect) {
        loadBrandDest();
    }
    if((brandsToselect) && (destinationToselect)) {
        loadBrandDest();
    }
    if(searchCritere.country)
    {
        selectOption('country',searchCritere.country);
        // si on a filtrer avec un pays, il faut recharger la liste des villes associé
        selectFromRelation(searchCritere.country);
    }
    if(searchCritere.city) {
        selectOption('city',searchCritere.city);
    }
}
	
function selectItemWithValue(items, cName)
{
    var itemBtn = $$(cName);
    if((items.constructor==String) || (items.constructor==Number))
    {
        itemBtn.each(function(element){
            if(element.value == items) {
                element.checked='checked';
            }
        });
    }
    else
    {
        itemBtn.each(function(element){
            if(items.include(element.value)) {
                element.checked='checked';
            }
        });
    }
}
	
function selectOption(idSelect, idOption)
{
    var option = $$('#'+idSelect+' option[value="'+idOption+'"]')[0];
    if(option) {
        option.setAttribute('selected', 'selected');
    }
} 
		
function doSearch()
{
    $('searchCritere').value="";
    var searchCritere = $('mainSearchEngine').serialize(true);
    $('searchCritere').value = Object.toJSON(searchCritere);
    $('mainSearchEngine').submit();
}

function bindBtnBrands()
{
    var brandBtn = $$('.btnBrand');
    brandBtn.each(function(element){
        element.observe('click',loadBrandDest);
    });
}


function bindBtnDestination()
{
    var destBtn = $$('.btnDest');
    destBtn.each(function(element){
        element.observe('click', loadBrandDest);
    });
}

// les marques selectionnees
function checkedBrands()
{
     var brandsBtn = $$('.btnBrand');
     var checkedBrands = new Array();
     brandsBtn.each(function(element){
        if(element.checked==true)
        {
            var elID = element.id;
            var elInfo = elID.split('-');
            checkedBrands.push(elInfo[1]);
        }
     });

    return checkedBrands;
}

//les destinations selectionnees
function checkedDests()
{
    var destBtn = $$('.btnDest');
    var checkedDest = new Array();
    destBtn.each(function(element){
        if(element.checked==true)
        {
            var elID = element.id;
            var elInfo = elID.split('-');
            checkedDest.push(elInfo[1]);
        }
    });

    return checkedDest;
}


function getRegionFromOffres(offres)
{
    var nbOffres = offres.length;
    var regions = new Array();
    var i =0;
    for(i; i<nbOffres; i++)
    {
        var oRegion = getRegionByID(offres[i].id_region);
        if(oRegion) {
            regions[oRegion.id] = oRegion;
        }
    }
    return regions;
}


function getRegionByID(id)
{
    var nbRegions = region.length;
    var retour ='';
    var i =0;
    for(i; i<nbRegions;  i++)
    {
        if(region[i].id==id)
        {
            retour = region[i];
            return retour;
        }
    }
    return retour;
}

function getRegionsForPays(idPays)
{
    var regions_arr = new Array();
    region.each(function(region){
        if(region.id_pays==idPays.toUpperCase()) {
            regions_arr.push(region);
        }
    });
    return regions_arr;
}

function ShowCriteres()
{
    var moreOptions = $('moreOptions');
    if(!moreOptions.visible())
    {
        $('moreCritereBtn').innerHTML = moinsCriteres;
        moreOptions.style.display = "block";
    }
    else
    {
        $('moreCritereBtn').innerHTML = plusCriteres;
        moreOptions.style.display = "none";
    }
}

/*function loadTypeDest */
function loadTypeDestination(typeDest_arr)
{
    var destBtn = $$('.btnDest');

    destBtn.each(function(element) {

        var elInfo = element.id.split('-');
        
        if ( typeDestExist(typeDest_arr, elInfo[1]) )
        {
             element.disabled = false;
        }
        else
        {
            element.disabled = true;
            element.checked = false;
        }
    });
}

function typeDestExist(tab, id)
{
    return ( typeof $H(tab).get(id) != 'undefined' );
}

function resetTypDest()
{
    var destBtn = $$('.btnDest');
    destBtn.each(function(element){
        element.checked = false;
        element.disabled=false;
    });
}

function resetBrands()
{
    var brandsBtn = $$('.btnBrand');
    brandsBtn.each(function(element){
        element.checked = false;
        element.disabled = false;
    });
}

function getPaysFromOffres(offres)
{
    var nbOffres = offres.length;
    var pays = new Object();
    var i=0;
    var scPays = new Array();

    for(i; i<nbOffres; i++)
    {
        var oPays = getPaysByID(offres[i].id_pays);
        var payID = oPays.id;
        pays[payID]=oPays;
    }

    
    for(country in pays)
    {
        scPays.push(pays[country]);
    }

    return scPays;
}

function getPaysByID(id)
{
    var nbPays = pays.length;
    var retour ='';
    var i=0;
    for(i; i<nbPays;  i++)
    {
        if(pays[i].id==id)
        {
            retour = pays[i];
            return retour;
        }
    }

    return retour;
}

function loadPays(paysArr)
{
    var countrySelect = $("country");

    if(paysArr != 'none') {
        countries = paysArr;
    }
    else {
        countries = pays;
    }

    var nbPays = countries.length;

    if(nbPays==0)
    {
        countrySelect.update('<option value="00">'+optionPaysRegion+'</option>');
        countrySelect.disabled=true;
        return false;
    }
    
    if(countrySelect.disabled) {
        countrySelect.disabled=false;
    }

    countrySelect.update('<option value="00">'+optionPaysRegion+'</option>');

    var i =0;
    for(0; i<nbPays; i++)
    {
        var optionToAdd =new Element('option',{value:countries[i].id}).update(countries[i].text);
        countrySelect.appendChild(optionToAdd);
    }
    
    return true;
}

function loadRegion(regionArr)
{
    var regions;
    
    if(regionArr !='none') {
        regions = $A(regionArr);
    }
    else {
        regions = $A(region);
    }

    var countrySelect = $("country");
    //var nbRegions = regions.length;
    var optioToAdd = new Element('option',{value:'00'}).update('-----------'+optionRegions+'-----------');

    countrySelect.appendChild(optioToAdd);

    regions.each(function(region){
        optioToAdd = new Element('option',{value:region.id}).update(region.text);
        countrySelect.appendChild(optioToAdd);
    });

    /*var i = 0;
    for(i; i<nbRegions; i++)
    {
        optioToAdd = new Element('option',{value:regions[i].id}).update(regions[i].text);
        countrySelect.appendChild(optioToAdd);
    }*/
}

function getOffresForRegion(region_id, offres)
{
    var nbOffres = offres.length;
    var offresArr = new Array();

    var i = 0;
    for(i; i<nbOffres; i++)
    {
        if(offres[i].id_region == region_id)
        {
            var oOffre = offres[i];
            offresArr.push(oOffre);
        }
    }

    return offresArr;
}

/**InitCalenda**/
function initCalendar()
{
    var now = new Date();
    var n = Number(now.getFullYear());
    var n1 = n + 1;
    if($('mainSearchEngine') != null)
    {
        Calendar.setup({
            inputField     :    "date_depart",
            ifFormat       :    "%d/%m/%Y ",
            showsTime      :    false,
            button         :    "cldBtn",
            step           :    1,
            range		   : [n, n1],
            onClose		: destroyMe,
            dateStatusFunc : isInvalidDate
        });
        $('cldBtn').observe('click', fixCalendar);
    }
}

function fixCalendar(e)
{
    calendar = window._dynarch_popupCalendar;
    calendar.hide();
    var newX = Event.pointerX(e);
    var newY = Event.pointerY(e);
    calendar.showAt(newX, newY);
}

function isInvalidDate(date, year, month, iday)
{
    var myDate = new Date(year, month, iday);
    var today = new Date();

    return (myDate <= today);
}

function destroyMe(cal)
{
    cal.destroy();
}

function loadVille(destArr)
{
    var villes;
    var cityToSelect = $("city");

    if(destArr != 'none') {
        villes = $A(destArr);
    }
    else {
        villes = $A(destination);
    }

    cityToSelect.update('<option value="00">'+optionToutesVilles+'</option>');

    villes.sortBy(function(ville){
        return ville.text;
    });
    
    villes.each(function(ville){
        var optionToAdd = new Element('option',{value:ville.id}).update(ville.text);
        cityToSelect.appendChild(optionToAdd);
    });
}


function selectFromRelation(id)
{
    if(id=='00') {
        loadVille('none');
    }
    else
    {
        var nboffres = lastOffre.length;
        var relation = lastOffre;

        var offres_arr = new Array();
        if(isNaN(parseInt(id)))//si c'est un pays
        {
            for(var i=0; i<nboffres; i++)
            {
                if(relation[i].id_pays == id)
                {
                    offres_arr.push(relation[i]);
                }
            }
        }
        else
        {
            offres_arr = getOffresForRegion(id,relation);
        }

        loadVille(getDestinationsFromOffres(offres_arr));
    }
}


function getOffresForBrand(brand_codes)
{
    //toutes les offres concernant les marques  selectionnees
    var nbRelations = relation.length;
    var nbBrands = brand_codes.length;
    var offres = new Array();
    for(var j=0; j<nbBrands;j++)
    {
        for(var i=0; i<nbRelations; i++)
        {
            if(relation[i].brand_code==brand_codes[j])
            {
                var oRelation = relation[i];
                offres.push(oRelation); //evite doublons eventuels
            }
        }
    }

    return offres;
}

function getDestinationFromRegion(id_destination)
{
    var nbOffres = relation.length;
    var offre_arr = new Array();

    for(var i=0; i<nbOffres; i++)
    {
        if(relation[i].id_destination == id_destination)
        {
            var oOffre = relation[i];
            if(oOffre) {
                offre_arr.push(oOffre);
            }
            break;
        }
    }

    if(offre_arr !=0)
    {
        var id_region = offre_arr[0].id_region;
        var option = $$('#country option[value="'+id_region+'"]')[0];
        if(option) {
            option.selected = 'selected';
        }
    }
}

/*recuperer les types de destination en function des marques*/
function getTypeDestinationForBrands(brands_arr)
{
     var new_offres = getOffresForBrand(brands_arr);
     var nbOffres = new_offres.length;
     var TypeDestinations = {};

     for(var i=0; i<nbOffres; i++)
     {
        var otypeDest = getTypeDestinationByID(new_offres[i].id_type_destination);

        if (otypeDest) {
            TypeDestinations['' + otypeDest.id] = otypeDest;
        }
     }

     return TypeDestinations;
}

/*recupere le type de destination en fonction d lID*/
function getTypeDestinationByID(id)
{
    var retour = '';
    var nbtype_destination = type_destination.length;

    for(var i=0; i<nbtype_destination;  i++)
    {
        if(type_destination[i].id==id)
        {
            retour = type_destination[i];
            return retour;
        }
    }

    return retour;
}

/**************getOffreForDestination************/
function getOffresForTypeDest(dest_ids,offres)
{
    var nbOffres = offres.length;
    var nbDest = dest_ids.length;
    var offresArr = new Array();

    for(var j=0; j<nbDest; j++)
    {
        for(var i=0; i<nbOffres; i++)
        {
            if(offres[i].id_type_destination == dest_ids[j])
            {
                var oOffre = offres[i];
                offresArr.push(oOffre);
            }
        }
    }

    return offresArr;
}


function getDestinationsFromOffres(offres)
{
    var nbOffres = offres.length;
    var destinations = new Array();

    for(var i=0; i<nbOffres; i++)
    {
        var oDest = getDestinationByID(offres[i].id_destination);
        destinations[oDest.id] = oDest; //evite les doublons;
    }

    return destinations;
}

//Recuperer les destinations en fonction de l'id
function getDestinationByID(id)
{
    var nbDestination = destination.length;
    var retour = '';

    for(var i=0; i<nbDestination;  i++)
    {
        if(destination[i].id == id)
        {
            retour = destination[i];
            return retour;
        }
    }

    return retour;
}
