/* CLASSES */
var Search = new Class ({

    options: {
        maxPax: 9,
        minAdults: 1,
        maxAdults: 9,
        maxChildren: 8,
        minChildAge: 2,
        maxChildAge: 14,
        maxChildrenPerAdult: 8,
        maxInfantsPerAdult: 1,
        maxRooms: 9,
        defAdults: 2,
        defChildren: 0,
        defChildAge: 2,
        defInfants: 0,
        infantAge: 1,
        minAdultsPerRoom: 1,
        defRooms: 1,
        expandAfter: 1,
        depDateWindow: 14,
        rooms: {
            options: { rooms: [] },
            initialize: function(options) { this.setOptions(options); },
            
            getRooms: function() { return this.options.rooms; },
            getRoom: function(iRoom) { return this.options.rooms[iRoom]; },
            setRooms: function(aRooms) { this.options.rooms = aRooms; },
            setRoom: function(iRoom,oRoom) { this.options.rooms[iRoom] = oRoom; },
            addRoom: function(oRoom) { this.options.rooms.push(oRoom); },
            removeRoom: function(oRoom) { this.options.rooms.remove(oRoom); },
            
            getAdult: function(iRoom,iAdult) { return this.options.rooms[iRoom].options.adults[iAdult]; },
            addAdult: function(iRoom,oAdult) { this.options.rooms[iRoom].options.adults.extend([oAdult]); },
            removeAdult: function(iRoom,oAdult) { this.options.rooms[iRoom].options.adults.remove(oAdult); },
            
            getChild: function(iRoom,iChild) { return this.options.rooms[iRoom].options.children[iChild]; },
            addChild: function(iRoom,oChild) { this.options.rooms[iRoom].options.children.extend([oChild]); },
            removeChild: function(iRoom,oChild) { this.options.rooms[iRoom].options.children.remove(oChild); },
            
            countRooms: function() { return this.options.rooms.length; },
            countPax: function(type,iRoom) {
                var iPax = 0;
                if (arguments.length > 0) {
                    switch (type) {
                        case 'adults':
                            if (arguments.length > 1 ) {
                                iPax = this.getRoom(iRoom).options.adults.length;
                            } else {
                                for (var i = 0; i < this.countRooms(); i++) {
                                    iPax += this.getRoom(i).options.adults.length;
                                }
                            }
                            break;
                        case 'children':
                            if (arguments.length > 1 ) {
                                iPax = this.getRoom(iRoom).options.children.length;
                            } else {
                                for (var i = 0; i < this.countRooms(); i++) {
                                    iPax += this.getRoom(i).options.children.length;
                                }
                            }
                            break;
                        case 'infants':
                            if (arguments.length > 1 ) {
                                for (var i = 0; i < this.getRoom(iRoom).options.children.length; i++) {
                                    if (this.getChild(iRoom,i).getAge() <= oSearch.options.infantAge) { iPax++; }
                                }
                            } else {
                                for (var i = 0; i < this.countRooms(); i++) {
                                    for (var j = 0; j < this.getRoom(i).options.children.length; j++) {
                                        if (this.getChild(i,j).getAge() <= oSearch.options.infantAge) { iPax++; }
                                    }
                                }
                            }
                            break;
                        default:
                            iPax = 0;
                    }
                } else {
                    if (arguments.length > 1 ) {
                        iPax += this.getRoom(iRoom).options.adults.length;
                        iPax += this.getRoom(iRoom).options.children.length;
                        iPax += this.getRoom(iRoom).options.infants.length;
                    } else {
                        for (var i = 0; i < this.countRooms(); i++) {
                            iPax += this.getRoom(i).options.adults.length;
                            iPax += this.getRoom(i).options.children.length;
                            iPax += this.getRoom(i).options.infants.length;
                        }
                    }
                }
                return iPax;
            }     
        }
    },
    
    initialize: function(options) {
        this.setOptions(options);
        
        this.Rooms = this.options.rooms;
        
        // REM: Need to make this handle defaults and saved searches
        this.Rooms.addRoom(
            new Room({
                name: "Huone 1",
                adults: [
                    new Adult( {name: "Aikuinen 1"} ),
                    new Adult( {name: "Aikuinen 2"} )
                ],
                /*adults: function() {
                    var ret = [];
                    for (var i = 0; i < this.options.defAdults; i++) {
                        ret.include(new Adult( {name: "Aikuinen"} ))
                    }
                    return ret;
                },*/
                children: [],
                infants: [],
                minAdultsPerRoom: this.minAdultsPerRoom
            })        
        );
    }
    
});
Search.implement(new Options, new Events);

var Room = new Class ({
    options: {
        name: Class.empty,
        adults: [],
        children: [],
        //infants: [],
        minAdultsPerRoom: Class.empty
    },
    initialize: function (options) {
        this.setOptions(options);
        this.validate();
    },
    validate: function() {
        try {
            // Check that adults >= minAdultsPerRoom
            if (this.options.adults.length < this.options.minAdultsPerRoom) throw('Adults must be >= '+this.options.minAdultsPerRoom);
        } catch (e) {
            alert(e);
        }
    },
    addPax: function(type) {
    }
});
Room.implement(new Options, new Events);

var Pax = new Class ({
    options: {
        name: Class.empty
    },    
    initialize: function (options) {
        this.setOptions(options);
    }
});
Pax.implement(new Options, new Events);

var Adult = Pax.extend ({ });
var Infant = Pax.extend ({ });
var Child = Pax.extend ({
    options: {
        age: Class.empty
    }, 
    initialize: function (options) {
        this.setOptions(options);
    },
    validate: function () {
        try {
            // Child age must be specified
            if (this.options.age = null) throw("Child age required");
        } catch(e) {
            alert(e);
        }
    },
    getDOB: function() {
        try {
            var useDateOfTravel = false;
            if (arguments.length == 0) { useDateOfTravel = true; } // Use todays date if dateOfTravel not provided
            
            var dateOfTravel = new Date();
            if (useDateOfTravel) {
                var depField = $('departureMonthYearStart');
                var depMonthField = $('departureMonthYear');
                if(depField) {
                    dateOfTravel = oSearchController.createDate($('departureMonthYearStart').getValue()+"-"+$('departureDayStart').getValue(),"-");
                } else if(depMonthField) {
                    dateOfTravel = oSearchController.createDate($('departureMonthYear').getValue()+"-"+$('departureDay').getValue(),"-");
                }
                dateOfTravel = new Date(Math.max((new Date()).getTime(), dateOfTravel.getTime()-oSearch.options.depDateWindow/2*oSearchController.getMilliseconds("d"))); // Adjust by duration (start match not applicable --> may alter pricing, which is up to server)
            } 
            return new Date(dateOfTravel.getFullYear()-this.options.age,dateOfTravel.getMonth(),dateOfTravel.getDate());
        } catch (e) {
            alert(e);
        }
    },
    getAge: function(useDateOfTravel) {
        return this.options.age;
    },
    setAge: function(a) {
        this.options.age = a;
    }
});

/* END CLASSES */

/* CONTROLLERS */
var SearchController = new Class ({
    
    initialize: function() {
    },
    
    initForm: function() {
        /* Flight only doesn't have room-container, it handles things a bit differently */
        if($('room-container') != null) {
            $('rooms').selectedIndex = oSearch.options.defRooms-1;
            for (var i = 0; i < oSearch.Rooms.countRooms(); i++) {
                this.addRoomToDOM(i);
            }
        }
    },
    
    rollback: function(type,iRoom) {
        try {
            oSearch.Rooms = oSearch.Rollback;
            
            var indexAdjust = (type == "adults" || type == "rooms") ? -1 : 0;
            var rollbackLength = 0;
            
            if (type == "rooms") {
                rollbackLength = oSearch.Rooms.countRooms();
                eval("$('"+type+"').selectedIndex = "+(rollbackLength+indexAdjust));
            } else if (type == "infants") {
                //TODO more meaningful version of this
                eval("$('infants').selectedIndex = 0");
            }
            else {
                rollbackLength = oSearch.Rooms.countPax(type,iRoom);
                eval("$('r-"+iRoom+"-"+type+"').selectedIndex = "+(rollbackLength+indexAdjust));
            }
        } catch (e) {
            alert(e);
        }
    },
    
    /* ROOM METHODS */
    // Used for IE6 related bug regarding CS00008 - if selects are dynamically created inside display: none area, IE6 doesn't want to reveal their content afterwards
    rebuildRooms: function() {
        try {
            var i = oSearch.Rooms.countRooms();
            while (i > 0) {
                // Remove room object
                oSearch.Rooms.removeRoom(oSearch.Rooms.getRoom(i-1));
                // Remove room from DOM
                this.removeRoomFromDOM(i-1, "true");
                i--;
            }
            // Add rooms ?
            if ($('rooms').getValue() > oSearch.Rooms.countRooms()) {
                var i = oSearch.Rooms.countRooms();
                while (i < $('rooms').getValue()) {
                    oSearch.Rooms.addRoom(new Room({
                        name: "Huone "+(i+1),
                        adults: [new Adult( {name: "Aikuinen"} )],
                        children: [],
                        infants: []
                    }));
                    this.addRoomToDOM(i);
                    i++;
                }
            }          
        } catch (e) {
            this.showError(e);
            return false;
        }
    },
    
    setRooms: function() {
        try {
            oSearch.Rollback = oSearch.Rooms;
            
            if (this.validateRooms()) {
                // Add rooms ?
                if ($('rooms').getValue() > oSearch.Rooms.countRooms()) {
                    var i = oSearch.Rooms.countRooms();
                    while (i < $('rooms').getValue()) {
                        oSearch.Rooms.addRoom(new Room({
                            name: "Huone "+(i+1),
                            adults: [new Adult( {name: "Aikuinen"} )],
                            children: [],
                            infants: []
                        }));
                        this.addRoomToDOM(i);
                        i++;
                    }
                }
                // Remove rooms ?
                if ($('rooms').getValue() < oSearch.Rooms.countRooms()) {
                    var i = oSearch.Rooms.countRooms();
                    while (i > $('rooms').getValue()) {
                        // Remove room object
                        oSearch.Rooms.removeRoom(oSearch.Rooms.getRoom(i-1));
                        // Remove room from DOM
                        this.removeRoomFromDOM(i-1);
                        i--;
                    }
                }
            }
            
        } catch (e) {
            this.showError(e);
            this.rollback('rooms');
            return false;
        } finally {
            delete oSearch.Rollback;
        }
    },
    
    validateRooms: function() {
        try {
            // Check that max pax is not exceeded
            // If current paxcount + new number of rooms > maxPax --> error
            if ((oSearch.Rooms.countPax() + ($('rooms').getValue() - oSearch.Rooms.countRooms())) > oSearch.options.maxPax) { throw ("Matkustajia saa olla korkeintaan "+oSearch.options.maxPax); }
            
            return true;
        } catch (e) {
            this.showError(e);
            this.rollback('rooms');
            return false;
        }
    },
    
    fetchChildrenFromCookie: function (iRoom) {

        if (arguments.length == 0) { throw ("Room not specified"); }
        
        oSearch.Rollback = oSearch.Rooms;
        if (this.validateChildAges(iRoom)) {   
        
            var cookie_name = brand + "r" + iRoom + "ch";
            var val = _at_getCookie(cookie_name);  
            if(val) {
            
                var values = val.split("_");
                var childCount = values[0];
                
                var element = $('r-'+iRoom+'-children');
                
                for(var k=0;k<element.options.length;k++)
                if (element.options[k].value == childCount) {
                    element.options[k].selected=true;
                    break;
                }              

                // Add children ?
                if (childCount > oSearch.Rooms.countPax('children',iRoom)) {
                    for (var i = oSearch.Rooms.countPax('children',iRoom); i < childCount; i++) {
                        oSearch.Rooms.addChild(iRoom,new Child( {age: values[i+1]} ));
                    }
                }
                // Remove children ?
                if (childCount < oSearch.Rooms.countPax('children',iRoom)) {
                    for (var i = oSearch.Rooms.countPax('children',iRoom); i > childCount; i--) {
                        oSearch.Rooms.removeChild(iRoom,oSearch.Rooms.getChild(iRoom,i-1));
                    }
                }
                // Update child ages
                for (var i = 0; i < oSearch.Rooms.countPax('children',iRoom); i++) {    
                    oSearch.Rooms.getChild(iRoom,i).setAge(values[i+1]);
                }
                // Display the child ages and Update children DOB hidden field
                this.setChildAgeDisplay(iRoom);
                // Remove DOB selections and hide prompt
                this.removeChildAgesFromDOM(iRoom);
                oObj.hide($('child-age-prompt'));
                // Display age header if children still exist in any room
                (oSearch.Rooms.countPax('children') > 0) ? $('age-header').setHTML('Lasten iät') : $('age-header').setHTML('');
             }
        }
    },
    
    fetchAdultsFromCookie: function (iRoom) {

        if (arguments.length == 0) { throw ("Room not specified"); }
        
        oSearch.Rollback = oSearch.Rooms;
        var cookie_name = brand + 'r-'+iRoom+'-adults';
        var val = _at_getCookie(cookie_name);  
        if(val) {
            var element = $('r-'+iRoom+'-adults');
            
            for(var k=0;k<element.options.length;k++)
            if (element.options[k].value == val) {
                element.options[k].selected=true;
                break;
            }              
            
            // Add adults ?
            if (val > oSearch.Rooms.countPax('adults',iRoom)) {
                for (var i = oSearch.Rooms.countPax('adults',iRoom); i < val; i++) {
                    oSearch.Rooms.addAdult(iRoom,new Adult());
                }
            }
            // Remove adults ?
            if (val < oSearch.Rooms.countPax('adults',iRoom)) {
                for (var i = oSearch.Rooms.countPax('adults',iRoom); i > val; i--) {
                    oSearch.Rooms.removeAdult(iRoom,oSearch.Rooms.getAdult(iRoom,i-1));
                }
            }
         }
    },
    
    addRoomToDOM: function (iRoom) {
        try {
            // tr
            var tr = new Element('tr', { 'id': 'r'+iRoom, 'class': '' });
            if (iRoom % 2 > 0) { tr.addClass("odd") };
            tr.injectInside('room-container');
            
            // td room
            var tdRoom = new Element('td', { 'class': 'room' }).setHTML("Huone "+(iRoom+1)).injectInside(tr);
            
            // td adult select
            var tdAdult = new Element('td', { 'class': 'td-adults' }).injectInside(tr);
            var selectAdult = new Element('select', {
                'events': {
                    'change': function(){ oSearchController.setAdults(iRoom); _at_saveWithBrandByValue('r-'+iRoom+'-adults'); }
                },
                'name': 'r-'+iRoom+'-adults',
                'id': 'r-'+iRoom+'-adults',
                'class': 'adults'
            }).injectInside(tdAdult);
            
            // adult options
            for (var i = 1; i <= oSearch.options.maxAdults; i++) {
                if (oSearch.Rooms.countPax('adults',iRoom) == i) {
                    (new Element('option', { 'value': i, 'selected': 'selected' })).setHTML(i).injectInside(selectAdult);
                } else {
                    (new Element('option', { 'value': i })).setHTML(i).injectInside(selectAdult);
                }
            }
            
            // td child select
            var tdChild = new Element('td', { 'class': 'td-children' }).injectInside(tr);
            var selectChild = new Element('select', {
                'events': {
                    'change': function(){ oSearchController.removeChildAgesFromDOM(iRoom); oObj.hide($('child-age-prompt')); oSearchController.promptChildAges(iRoom); }
                },
                'name':'r-'+iRoom+'-children',
                'id': 'r-'+iRoom+'-children',
                'class': 'children'
            }).injectInside(tdChild);
            
            // child options
            for (var i = 0; i <= oSearch.options.maxChildren; i++) {
                if (oSearch.Rooms.countPax('children',iRoom) == i) {
                    (new Element('option', { 'value': i, 'selected': 'selected' })).setHTML(i).injectInside(selectChild);
                } else {
                    (new Element('option', { 'value': i })).setHTML(i).injectInside(selectChild);
                }
            }
            
            // hidden field to contain child ages
            var hiddenDOB = new Element('input', {
                'name':'r-'+iRoom+'-children-dob',
                'type': 'hidden',
                'id': 'r-'+iRoom+'-children-dob',
                'value': ''
            }).injectInside(tdChild);
            
            // td child ages
            //****  MC modified 12/05
            var tdChildAges = new Element('td', { 'name': 'r'+iRoom+'-child-ages','id': 'r'+iRoom+'-child-ages' }).injectInside(tr);
            
            // td child age info
            var tdChildAgeInfo = new Element('td', { 'class': 'age-info' }).injectInside(tr);
            //****  MC modified 12/05
            var tdChildAgeInfoLink = new Element('a', { 'name':'r'+iRoom+'-child-age-info', 'id': 'r'+iRoom+'-child-age-info', 'href': 'javascript: oSearchController.promptChildAges('+iRoom+');' }).injectInside(tdChildAgeInfo);

            if (oSearch.Rooms.countPax('children',iRoom) < 1) { $(tdChildAgeInfoLink).setStyle('display','none');};

            var tdChildAgeInfoLinkImg = new Element('img', {
                'name': 'r'+iRoom+'-child-age-edit',
                'src': 'css/' + siteID + '/images/icons/info_small.gif',
                'id': 'r'+iRoom+'-child-age-edit',
                'alt': 'Muuta lasten iki&auml;',
                'border': '0'
            }).injectInside(tdChildAgeInfoLink);
            
            this.adjustSearchBoxSize();

        } catch(e) {
            this.showError(e);
        }
    },
    
    removeRoomFromDOM: function (num, doNotRemoveCookies) {
        try {
            $('r'+num).remove();
            
            this.adjustSearchBoxSize();
            
            if("true" != doNotRemoveCookies) {
                _at_removeCookie(brand + 'r-'+num+'-adults');
                _at_removeCookie(brand + 'r' + num + 'ch');
            }
        } catch (e) {
            alert(e);
        }
    },
    
    adjustSearchBoxSize: function() {
        if (this.isCompactSearch()) {
            // compact search, try to adjust size if needed
            var searchDiv = $('compact-search');
            if(!searchDiv) {
               // don't touch resort search
            } else {
                var searchBoxDiv = $('compact-search-content');
                var heightAdjust = 0;
                var roomCount = oSearch.Rooms.countRooms();
                var roomLimitForFixedBoxSize = oSearch.options.expandAfter.toInt();
                if (roomCount > roomLimitForFixedBoxSize) {
                    // ok, more rooms that our fixed size allows, adjust height
                    heightAdjust = (oSearch.Rooms.countRooms()-1)*this.getExtraRowHeight();
                } else {
                    // use default height
                }
                var boxHeight = this.getBoxHeight();
                
                if(window.ie7) {                
                    var flashContainer = $('flash-container');
                    if(flashContainer)
                        flashContainer.setStyle('margin-bottom','11px');
                    searchBoxDiv.setStyle('margin-bottom', '10px');
                    searchDiv.setStyle('height', (boxHeight.toInt()+heightAdjust+10)+'px');
                    searchBoxDiv.setStyle('height', (boxHeight.toInt()+heightAdjust-6)+'px');
                }
                else {
                    searchDiv.setStyle('height', (boxHeight.toInt()+heightAdjust+4)+'px');
                    searchBoxDiv.setStyle('height', (boxHeight.toInt()+heightAdjust-6)+'px');
                }
                
            }
        }
    },
    
    /* END ROOM METHODS */
    
    /* PAX METHODS */    
    setAdults: function(iRoom) {
        try {
            if (arguments.length == 0) { throw ("Room not specified"); }
            
            oSearch.Rollback = oSearch.Rooms;
            
            if (this.validateAdults(iRoom)) {            
                // Add adults ?
                if ($('r-'+iRoom+'-adults').getValue() > oSearch.Rooms.countPax('adults',iRoom)) {
                    for (var i = oSearch.Rooms.countPax('adults',iRoom); i < $('r-'+iRoom+'-adults').getValue(); i++) {
                        oSearch.Rooms.addAdult(iRoom,new Adult);
                    }
                }
                // Remove adults ?
                if ($('r-'+iRoom+'-adults').getValue() < oSearch.Rooms.countPax('adults',iRoom)) {
                    for (var i = oSearch.Rooms.countPax('adults',iRoom); i > $('r-'+iRoom+'-adults').getValue(); i--) {
                        oSearch.Rooms.removeAdult(iRoom,oSearch.Rooms.getAdult(iRoom,i-1));
                    }
                }
            }
        } catch (e) {
            this.showError(e);
            this.rollback('adults',iRoom);
            return false;
        } finally {
            delete oSearch.Rollback;
        }
    },
    
    validateAdults: function(iRoom) {
        try {
            if (arguments.length == 0) { throw ("Room not specified"); }
            
            // Check that maxPax is not exceeded
            if ( ( oSearch.Rooms.countPax('adults') + oSearch.Rooms.countPax('children') + ( parseInt( $('r-'+iRoom+'-adults').getValue(), 10 ) - oSearch.Rooms.countPax('adults',iRoom) ) ) > oSearch.options.maxPax ) { throw('Matkustajia saa olla korkeintaan '+oSearch.options.maxPax) };
            
            // Check maxChildrenPerAdult (incl infants)
            if ( ( oSearch.Rooms.countPax('children') / ( oSearch.Rooms.countPax('adults') + ( parseInt( $('r-'+iRoom+'-adults').getValue(), 10 ) - oSearch.Rooms.countPax('adults',iRoom) ) ) ) > oSearch.options.maxChildrenPerAdult ) { throw ('Lapsia on liikaa suhteessa aikuisiin') };
            
            // Check maxInfantsPerAdult
            if ( oSearch.Rooms.countPax('infants') / ( oSearch.Rooms.countPax('adults') + ( parseInt( $('r-'+iRoom+'-adults').getValue(), 10 ) - oSearch.Rooms.countPax('adults',iRoom) ) ) > oSearch.options.maxInfantsPerAdult ) { throw ('Lapsia on liikaa suhteessa aikuisiin') };
                                
            return true;
        } catch (e) {
            this.showError(e);
            this.rollback('adults',iRoom);
            return false;
        }
    },
    
    promptChildAges: function(iRoom) {
        try {
            if (arguments.length == 0) { throw ("Room not specified"); }
            
            oSearch.Rollback = oSearch.Rooms;
            
            if ($('r-'+iRoom+'-children').getValue() == 0) {
                _at_removeCookie(brand + 'r' + iRoom + 'ch');
                oSearch.Rooms.getRoom(iRoom).options.children.length = 0;
                this.removeChildAgeDisplay(iRoom);
                (oSearch.Rooms.countPax('children') > 0) ? $('age-header').setHTML('Lasten iät') : $('age-header').setHTML('');
            } else {
                if (this.validateChildren(iRoom)) {
                    
                    this.addChildAgesToDOM(iRoom);
                    
                    var x = $('r-'+iRoom+'-children').getCoordinates().right-303;
                    if(typeof moveChildBox != "undefined")
                        x = $('r-'+iRoom+'-children').getCoordinates().right+50;
                    var y = $('r-'+iRoom+'-children').getCoordinates().bottom-50;
                    
                    oObj.show('child-age-prompt',x,y,true);                    
                }
            }
        } catch (e) {
            this.showError(e);
            this.rollback('children',iRoom);
        } finally {
            delete oSearch.Rollback;
        }
    },
        
    addChildAgesToDOM: function(iRoom) {
        try {
            if (arguments.length == 0) { throw("Room not specified"); };
            
            // Reset cancel and set functions to use current room
            $('child-ages-cancel').setProperty('href','javascript:oSearchController.cancelChildAges('+iRoom+');');
            $('child-ages-ok').setProperty('href','javascript:oSearchController.setChildren('+iRoom+');');
            
            for (var i = 0; i < $('r-'+iRoom+'-children').getValue(); i++) {
                // label
                //***** MC Modified 12/05
                var lbl = new Element('label', { 'name': 'lbl-r'+iRoom+'-child-age', 'id': 'lbl-r'+iRoom+'-child-age' });
                if (i % 2 > 0) { lbl.addClass("odd") };
                lbl.setHTML('Lapsi '+(i+1)+'  <span style="margin: 44px;">&nbsp;</span>').injectInside('child-age-container');
                
                // new select style input
                var input = new Element('select', {
                    'name': 'r'+iRoom+'-c'+i+'-age',
                    'id': 'r'+iRoom+'-c'+i+'-age'
                }).injectInside(lbl);
                
                // child options
                for (var j = 0; j <= 14; j++) {
                    var valueStr = j;
                    if($defined(oSearch.Rooms.getChild(iRoom,i)) && oSearch.Rooms.getChild(iRoom,i).options.age == valueStr) {
                        (new Element('option', { 'value': valueStr, 'selected': 'selected' })).setHTML(j + ' v').injectInside(input);    
                    }                
                    else {
                        (new Element('option', { 'value': valueStr })).setHTML(j + ' v').injectInside(input);                    
                    }
                }
            }
            
        } catch (e) {
            this.showError(e);
        }
    },
    
    removeChildAgesFromDOM:  function (iRoom) {
        try {
            $('child-age-container').empty();
        } catch (e) {
            alert(e);
        }
    },
    
    setChildren: function(iRoom) {    
        try {
            if (arguments.length == 0) { throw ("Room not specified"); }
            
            oSearch.Rollback = oSearch.Rooms;
            
            if (this.validateChildAges(iRoom)) {  
                                      
                // Add children ?
                if ($('r-'+iRoom+'-children').getValue() > oSearch.Rooms.countPax('children',iRoom)) {
                    for (var i = oSearch.Rooms.countPax('children',iRoom); i < $('r-'+iRoom+'-children').getValue(); i++) {
                        oSearch.Rooms.addChild(iRoom,new Child( {age: $('r'+iRoom+'-c'+i+'-age').getValue()} ));
                    }
                }
                // Remove children ?
                if ($('r-'+iRoom+'-children').getValue() < oSearch.Rooms.countPax('children',iRoom)) {
                    for (var i = oSearch.Rooms.countPax('children',iRoom); i > $('r-'+iRoom+'-children').getValue(); i--) {
                        oSearch.Rooms.removeChild(iRoom,oSearch.Rooms.getChild(iRoom,i-1));
                    }
                }
                // Update child ages
                for (var i = 0; i < oSearch.Rooms.countPax('children',iRoom); i++) {    
                    oSearch.Rooms.getChild(iRoom,i).setAge($('r'+iRoom+'-c'+i+'-age').getValue());
                }
                // Display the child ages and Update children DOB hidden field
                this.setChildAgeDisplay(iRoom);

                var cookie_name = brand + "r" + iRoom + "ch";
                var values = $('r-'+iRoom+'-children').getValue();
                for(var i=0;i<$('r-'+iRoom+'-children').getValue();++i) {
                    values = values + "_" + $('r'+iRoom+'-c'+i+'-age').getValue();
                }
                _at_setCookie(cookie_name,values);

                // Remove DOB selections and hide prompt
                this.removeChildAgesFromDOM(iRoom);
                oObj.hide($('child-age-prompt'));
                // Display age header if children still exist in any room
                (oSearch.Rooms.countPax('children') > 0) ? $('age-header').setHTML('Lasten iät') : $('age-header').setHTML('');
            }
            
        } catch (e) {
            this.showError(e);
            this.rollback('children');
        } finally {
            delete oSearch.Rollback;
        }
    },
    
    validateChildren: function(iRoom,checkAges) {
        try {
            var ret = false;
            
            // Check that maxPax is not exceeded
            if ( ( oSearch.Rooms.countPax('adults') + oSearch.Rooms.countPax('children') + ( parseInt( $('r-'+iRoom+'-children').getValue(), 10 ) - oSearch.Rooms.countPax('children',iRoom) ) ) > oSearch.options.maxPax ) { throw('Matkustajia saa olla korkeintaan '+oSearch.options.maxPax) };
                
            // Check maxChildrenPerAdult
            if ( ( ( oSearch.Rooms.countPax('children') + ( parseInt( $('r-'+iRoom+'-children').getValue(), 10 ) - oSearch.Rooms.countPax('children',iRoom) ) ) / oSearch.Rooms.countPax('adults') ) > oSearch.options.maxChildrenPerAdult ) { throw ('Lapsia on liikaa suhteessa aikuisiin') };
                           
            return true;
        } catch (e) {
            this.showError(e);
            this.rollback('children',iRoom);
            if($('room-container') != null) {  /* FLIGHT ONLY DOESN'T NEED THESE */
                this.removeChildAgesFromDOM(iRoom);
                oObj.hide($('child-age-prompt'));
            }
            return false;
        }
    },
    
    validateChildAges: function(iRoom) {
        /* NORMAL VERSION */
        if($('room-container') != null) {         
            try {               
                // Check maxInfantsPerAdult (only know once ages are specified)
                var iInfants = 0; // Can't use normal infant count, since infants haven't been set
                for (var i = 0; i < $('r-'+iRoom+'-children').getValue(); i++) {
                    var age = $('r'+iRoom+'-c'+i+'-age').options[$('r'+iRoom+'-c'+i+'-age').selectedIndex].value;
                    if (age <= oSearch.options.infantAge) { iInfants++; }
                    //if (this.defineAge(dob) < 0) { throw ('Ikä ei saa olla negatiivinen: ' + $('r'+iRoom+'-c'+i+'-dob').getValue()) }
                    //if (this.defineAge(dob) >= 18) { throw ('Lapsi ei saa olla yli 18 -vuotias: ' + $('r'+iRoom+'-c'+i+'-dob').getValue()) }
                }
                if ( ( ( iInfants + ( oSearch.Rooms.countPax('infants') - oSearch.Rooms.countPax('infants',iRoom) ) ) / oSearch.Rooms.countPax('adults') ) > oSearch.options.maxInfantsPerAdult ) { throw ('Pieniä lapsia on liian monta suhteessa aikuisten määrään') };

                return true;
            } 
            catch(e) {
                this.showError(e);
                this.rollback('children',iRoom);
                this.removeChildAgesFromDOM(iRoom);
                oObj.hide($('child-age-prompt'));
                return false;
            }
       } else { /* FLIGHT ONLY VERSION */
            try {                   
                var iInfants = $('infants').getValue();                
                if ( ( ( iInfants + ( oSearch.Rooms.countPax('infants') - oSearch.Rooms.countPax('infants',iRoom) ) ) / oSearch.Rooms.countPax('adults') ) > oSearch.options.maxInfantsPerAdult ) { throw ('Pieniä lapsia on liian monta suhteessa aikuisten määrään') };

                return true;
            } catch(e) {
                this.showError(e);
                this.rollback('infants',iRoom);
                return false;
            }
       }
    },

    setChildAgeDisplay: function(iRoom) {
        if(arguments.length == 0) {
            for (var i = 0; i < oSearch.Rooms.countRooms(); i++) {
                this.setChildAgeDisplay(i);
            }
            return;
        }
        try {
            var childAges = [];
            var childDOBs = [];
            for (var i = 0; i < oSearch.Rooms.countPax('children',iRoom); i++) {
                childAges.push(oSearch.Rooms.getRoom(iRoom).options.children[i].getAge());
                childDOBs.push(this.convertDate(oSearch.Rooms.getRoom(iRoom).options.children[i].getDOB(),'-'));
            }
            $('r-'+iRoom+'-children-dob').value = childDOBs.toString();
            $('r'+iRoom+'-child-ages').setHTML(childAges.toString());
            if(oSearch.Rooms.countPax('children',iRoom) > 0) {
                oObj.show($('r'+iRoom+'-child-age-info'));
            } else {
                oObj.hide($('r'+iRoom+'-child-age-info'));
            }
        } catch (e) {
            this.showError(e);
        }
    },
    
    removeChildAgeDisplay: function(iRoom) {
        try {     
            $('r-'+iRoom+'-children-dob').value = '';
            $('r'+iRoom+'-child-ages').setHTML('');
            oObj.hide($('r'+iRoom+'-child-age-info'));
        } catch (e) {
            alert(e);
        }
    },

    cancelChildAges: function(iRoom) {
        try {
            // Has number of children changed
            if ($('r-'+iRoom+'-children').getValue() != oSearch.Rooms.countPax('children',iRoom)) {
                // Set value back to what it was (based on set children)
                $('r-'+iRoom+'-children').selectedIndex = oSearch.Rooms.countPax('children',iRoom);
            }
            // Hide child age prompt
            oObj.hide($('child-age-prompt'));
            // Remove child age selections from DOM
            this.removeChildAgesFromDOM(iRoom);
        } catch (e) {
            this.showError(e);
        }
    },

    isCompactSearch: function() {
        try {
            if(compactSearch) {
                return true; 
            } else {
                return false;
            }
        } catch(e) {
            return false;
        } 
    },

    getBoxHeight: function () {
        if (brand == 'TO' || siteID == 'TO') {
            return 380;
        } else {
            // return 368; correct height.. however, not working with parallel usage
            return 390;
        }
    },

    getExtraRowHeight: function () {
        return 23;
    },
    
    showError: function(message) {
        
        alert(message);
        
        /*
        try {
            oObj.hide('error-dialog');                    

            $('error-dialog-content').setHTML('<p style="margin: 6px 0px 5px;"><strong>' + message + '</strong></p>');
            
            var errorParentDiv = $('r-1-children');
            if (!errorParentDiv)
                errorParentDiv = $('r-0-children')
            if (!errorParentDiv)
                errorParentDiv = $('submit')
            if (!errorParentDiv)
                errorParentDiv = $('room-container')
            if (!errorParentDiv)
                errorParentDiv = $('compact-search')
            
            var x = errorParentDiv.getCoordinates().right-303;
            var y = errorParentDiv.getCoordinates().bottom-50;
            
            oObj.show('error-dialog',x,y,true);                    
        } catch (e) {
            alert(e)
        }*/
    },
    
    /* END PAX METHODS */
    
    createDate: function(d,splitter) {
        try {
            // Default splitter if none defined
            if (arguments.length < 2) { splitter = "."; }
            
            // Date array
            var dArr = d.split(splitter);
            
            // Check that at least year, month and day are specified
            if (dArr.length < 3) { throw("Invalid date length"); }
            
            // If splitter = '-' format yyyy-mm-dd, otherwise dd-mm-yyyy
            var Y = (splitter == "-") ? parseInt(dArr[0], 10) : parseInt(dArr[2], 10) ;
            var M = parseInt(dArr[1], 10)-1; // Decrement for javascript month
            var D = (splitter == "-") ? parseInt(dArr[2], 10) : parseInt(dArr[0], 10) ;
                        
            return new Date(Y,M,D);
        } catch(e) {
            alert(e);
        }
    },
    
    convertDate: function(d,splitter) {
        try {
            // Default splitter if none defined
            if (arguments.length < 2) { splitter = "."; }
            
            return d.getDate()+splitter+(d.getMonth()+1)+splitter+d.getFullYear();
        } catch(e) {
            alert(e);
        }
    },
    
    isDate: function (d) {
        try {
            return (isNaN(d)) ? false : true ;
        } catch (e) {
            alert(e);
            return false;
        }
    },
    
    getMilliseconds: function (type) {
        try {
            var ret = 0;
            switch(type) {
                case "d":
                    ret = 1000*60*60*24;
                    break;
                default:
            }
            return ret;
        } catch(e) {
            alert(e);
        }
    }
    
});

/* END CONTROLLERS */

//var oSearch = new Search();
//var oSearchController = new SearchController();

/*if(fullSearch) {
    window.addEvent('load', function(){
        oSearchController.initForm();
        var departureCal = new Calendar({ 'departureMonthYearStart': {
            'departureMonthYearStart': 'Y-m',
            'departureDayStart': 'd'
        }}, {
            direction: 0,
            draggable: false,
            days: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
            months: ['Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu'],
            offset: 1,
            tweak: { x: -160, y: 17 }
        });
        var departureCal = new Calendar({ 'departureMonthYearEnd': {
            'departureMonthYearEnd': 'Y-m',
            'departureDayEnd': 'd'
        }}, {
            direction: 0,
            draggable: false,
            days: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
            months: ['Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu'],
            offset: 1,
            tweak: { x: -160, y: 17 }
        });
    });
} else {
    window.addEvent('load', function(){
        oSearchController.initForm();
        var departureCal = new Calendar({ 'departureMonthYear': {
            'departureMonthYear': 'Y-m',
            'departureDay': 'd'
        }}, {
            direction: 0,
            draggable: false,
            days: ['Sunnuntai', 'Maanantai', 'Tiistai', 'Keskiviikko', 'Torstai', 'Perjantai', 'Lauantai'],
            months: ['Tammikuu', 'Helmikuu', 'Maaliskuu', 'Huhtikuu', 'Toukokuu', 'Kesäkuu', 'Heinäkuu', 'Elokuu', 'Syyskuu', 'Lokakuu', 'Marraskuu', 'Joulukuu'],
            offset: 1,
            tweak: { x: -160, y: 17 }
        });
    });
}*/

// $Rev: 1434 $