﻿
App.Home = function() {

    /* Private */

    /* Properties */

    var cmp = {};





    /* Methods */

    var init = function() {

        /* Constructor */

        cmp.homeSearchForm = new TVI.Form({

            ID: 'homeSearchForm',
            url: TVI.handlers + 'App.Search.aspx/search',
            data: {
                type: 'mini'
            },
            validation: function(d) {

                //custom validation to check pitches and dates have been entered
                var pitches = this.field('pitches').val();
                var startDate = this.field('startDate').val();
                var nights = this.field('nights').val();

                if (pitches === '' && startDate === '' && nights === ''){ return; }

                if (pitches === '' || startDate === '' || nights === ''){ d.errors.push({ fieldID: 'pitches', message: 'Please enter your pitches, date and nights.' }); return; }

                //calculate start and end dates
                var dd = startDate.substring(0, startDate.indexOf('/'));
                var mm = startDate.substring(startDate.indexOf('/') + 1, startDate.lastIndexOf('/'))
                var yyyy = startDate.substring(startDate.lastIndexOf('/') + 1);
                        
                if (dd.indexOf('0') === 0){ dd = dd.substring(1); }
                if (mm.indexOf('0') === 0){ mm = mm.substring(1); }
                 
                startDate = new Date(yyyy, parseInt(mm) - 1, dd);
                var endDate = new Date(yyyy, parseInt(mm) - 1, dd);
        
                endDate.setDate(endDate.getDate() + parseInt(nights));
                
                if (startDate.toDateString() === 'Invalid Date' || startDate.toDateString() === 'NaN' || endDate.toDateString() === 'Invalid Date' || endDate.toDateString() === 'NaN') { d.errors.push({ fieldID: 'startDate', message: 'Please enter a valid date.' }); return; }

                if ((pitches !== '' || startDate !== '' || endDate !== '') && (pitches === '' || startDate === '' || endDate === '')) {

                    if (pitches === '') { d.errors.push({ fieldID: 'pitches', message: 'Please enter a number of pitches.' }); }

                    if (startDate === '' || endDate === '') { d.errors.push({ fieldID: 'startDate', message: 'Please select a date and number of nights.' }); }

                }
                else{

                    //set end date
                    dd = endDate.toLocaleDateString().substring(0, 2);

                    //check is number for chrome
                    if ((dd - 0) != dd){
                    
                        dd = endDate.toLocaleDateString().substring(endDate.toLocaleDateString().lastIndexOf(',') -2, endDate.toLocaleDateString().lastIndexOf(','));
                    
                    }

                    mm = endDate.getMonth() + 1;
                    yyyy = endDate.toLocaleDateString().substring(endDate.toLocaleDateString().lastIndexOf(' ') + 1);
                    
                    if (mm > 12){ mm = 12; }
                    if (mm < 10){ mm = '0' + mm; }

                    this.hiddenData.endDate = dd + '/' + mm + '/' + yyyy;
                
                }

            },
            success: function(d) {

                //call base method

                //show locations if necessary
                if (d.locations === true) {
                
                    this.success();

                    this.el.find('.TVI-form-submit').show();
                    
                    TVI.Popup.show({
                        
                        title: 'Choose Your Location',
                        template: '<div id="locations">{for r in rows}<div><a id="location-${r[0]}" href="#">${r[1]}</a></div>{/for}</div>'.process(d)
                        
                    });

                    return;

                }


                //store map coordinates
                this.hiddenData.mapX = d.mapX;
                this.hiddenData.mapY = d.mapY;

                //clear selected location
                this.hiddenData.locationID = '';
                    
                //redirect to results page
                window.location.href = getURL();

            }
        
        });


        $('#homeSearchForm-startDate-control').change(function(){
        
            $('#btn-clear').show();
        
        });


        TVI.event('#btn-clear A', 'click', function(){
        
            cmp.homeSearchForm.field('pitches').clear();
            cmp.homeSearchForm.field('startDate').clear();
            cmp.homeSearchForm.field('nights').clear();

            $('#btn-clear').hide();
        
        });


        //handle location changed event to clear map coordinates
        TVI.event('#homeSearchForm-location-control', 'keyup', function() {

            cmp.homeSearchForm.hiddenData.mapX = 0;
            cmp.homeSearchForm.hiddenData.mapY = 0;
            
            cmp.locationChanged = true;

        });


        //handle location selected event to run search on PA location
        TVI.event('#locations A', 'click', function() {

            var locationID = this.id.replace('location-', '');

            cmp.homeSearchForm.hiddenData.locationID = locationID;

            cmp.homeSearchForm.handler.call();

            TVI.Popup.close();

        });


        //show location map for user to select location
        TVI.event('#btn-searchMap', 'click', function() {

            TVI.Mapping.load({
                
                success: function(){
                
                    $('#searchFormMap').show();

                    //set map form
                    cmp.searchFormMap = new TVI.Form({

                        ID: 'searchFormMap'

                    });
            
            
                    //set map location and zoom
                    cmp.searchFormMap.field('map').control.map.setCentre({
            
                        longitude: '-1.505126953125',
                        latitude: '52.37224556866933',
                        zoomLevel: 6
            
                    });

                    //add pin to map if already searched on location
                    if (cmp.homeSearchForm.hiddenData.mapX !== undefined && cmp.homeSearchForm.hiddenData.mapX !== 0) {

                        cmp.searchFormMap.val({

                            mapX: cmp.homeSearchForm.hiddenData.mapX,
                            mapY: cmp.homeSearchForm.hiddenData.mapY

                        });

                    }

                    //add double-click event to map to set search coordinates
                    GEvent.addListener(cmp.searchFormMap.field('map').control.map.map, "dblclick", function(overlay, latlng) {

                        cmp.homeSearchForm.hiddenData.mapX = latlng.x;
                        cmp.homeSearchForm.hiddenData.mapY = latlng.y;
                
                        cmp.locationChanged = true;

                        //using yahoo GEO to find map location name
                        yqlgeo.get(latlng.y, latlng.x, function(o) {
                
        //                    var location = o.place.locality1 ? o.place.locality1.content : "Near " + o.place.name.content;

                            cmp.homeSearchForm.field('location').val(o.place.locality1 ? o.place.locality1.content : "Map Location");

                        });

                        //put loading text in field
                        cmp.homeSearchForm.field('location').val('Finding location...');

                        //hide map and unbind body click
                        $('#searchFormMap').hide();

                        $('BODY').unbind('click', hideMapPopup);

                    });


                    //handle body click event to hide location map
                    setTimeout(function(){ $('BODY').bind('click', hideMapPopup); }, 100);
                    
                    $('.location .tabs A').removeClass('active');
                    $('.showMapTab A').addClass('active');
                
                }

            });

        });

    };
    
    
    
    
    
    var getURL = function(e){
    
        /* returns a url representing this search */
        
        if (e === undefined){ e = {}; }
    
        var url = '/search/';
        
        var args = '';
        
        var data = cmp.homeSearchForm.val();

        for (var d in data){
            
            //ignore certain fields
            if (d === 'success' || d === 'type'){ continue; }
        
            //only add distance if location exists
            if (d === 'distance' && data[d] && data[d] !== ''){
            
                if (!data['location'] || data['location'] === ''){ continue; }
                
            }                
        
            //only add page if not 1
            if (d === 'page' && data[d] && data[d] === 1){ continue; }             
        
            //only add sort if not a-z
            if (d === 'sort' && data[d] && data[d] === 'a-z'){ continue; }                
        
            if (data[d] && data[d] !== ''){ args += "&" + d + "=" + data[d]; }
        
        }
        
        if (args !== '' && args.substr(0, 1) === '&'){ args = args.replace('&', '?'); }
        
        if (e.replacePage === true){
        
            if (args.indexOf('page=')){
            
                args = args.replace('page=' + data["page"], 'page=[pageNo]');
            
            }
            else{
                args = args + (args.indexOf('?') < 0 ? '?' : '&') + "page=[pageNo]"
            }
        
        }
        
        return url + args;
    
    };





    var hideMapPopup = function(e) {

        /* handles the body click event to hide location map */

        if ($(e.target).parents('#searchFormMap:first').length === 0) {

            $('#searchFormMap').hide();

            $('BODY').unbind('click', hideMapPopup);

        }
                    
        $('.location .tabs A').removeClass('active');
        $('.chooseTab A').addClass('active');

    };





    TVI.ready(init);


    return cmp;


} ();