/**
*  search & results
*/

var isGMapCompatible = GBrowserIsCompatible();
var searchMap = null;
var resultsMap = null;
var resultsView = null;
var isLoading = false;

var isMember = false;

$(function() {
    /**
    *  search from
    */

    // get active tab
    var view = window.location.hash.substring(3); // including # simbol
    //console.log('View: ' + view);
    switchSearchView(view);

    // switch tabs
    $('#nav-extra a').click(function (e) {
        view = $(this).parent().get(0).id.substring(2);
        //console.log('View: ' + view);
        this.blur();
        this.hideFocus = false;

        switchSearchView(view);

        return false;
    });

    isMember = $('#is-member').length ? true : false;

    // quick seatch tip
    initKwTip();

    // quick community
    initQuickCom();

    /**
    *  results page
    *
    */
    resultsView = view ? view : 'list';
    switchResultsView(resultsView);

    // more/less options
    //$('#more-opts fieldset').hide();
    //$('#more-opts a#more-opts-less').hide();
    $('a.showopt').click(function() {
        if (this.id == 'more-opts-more') {
            $('#more-opts').show();
            $(this).hide();
        } else {
            $('#more-opts').hide();
            $('a#more-opts-more').show();
        }

        return false;
    });

    // 'sort by' & 'per page'
    initResultSelects();

    // list / map switch
    $('#results-switch a').live('click', function() {
        var view = this.id.replace(/n\-/, '');

        this.blur();
        this.hideFocus = false;

        switchResultsView(view);

        return false;
    });


    // pager
    $('ul.pager a').live('click', function() {
        //console.log('loading:' + this.href);
        var s = loadResults(this.href);
        //console.log('res:' + s);
        if (s) {
            $('ul.pager a').removeClass('selected');
            $(this).addClass('selected');

            //console.log('now results view is: ' + resultsView);

            if (resultsView == 'map') {
                switchResultsView('map');
            }
        }

        //return s ? false : true;
        return false;
    });

    // map view
    //initResultsMap();

    // modal dialogs
    if (isMember) {
        initModalSave();
        initModalSearches();
    } else {
        initModalSend();
        initModalButler();
        initModalJoin();
    }

    // refine form, neightbourhoods
    var locIncLink = $('a#location-inc-link');
    var locContainer = $('#location-inc');

    // form
    $('#search-location').focus(function () {
        locIncLink.remove();
        locContainer.remove();
    });

    // neighbourhoods modal
    locIncLink.click(function() {
        var pos = $(this).position();

        //var locContainer = $('#location-inc');
        var ul = $('#location-inc ul');
        var n = ul.size();
        w = parseInt(9 * n) + 'em';

        locContainer.css({
            position: 'absolute',
            marginLeft: 0,
            marginTop: 0,
            top: pos.top - 5,
            left: pos.left - 8,
            width: w
        });

        if ($.browser.msie) {
            $('#fs-beds,#fs-baths,#fs-price').css({visibility: 'hidden'});
        }

        locContainer.show();

        return false;
    });

    // close location link
    $('#location-inc a').click(function() {
        $('#fs-beds,#fs-baths,#fs-price').css({visibility: 'visible'});

        locContainer.hide();
        return false;
    });

    // save location link
    $('#location-inc button').click(function() {
        var cnt = $('#location-inc input:checked').size();
        //console.log(cnt);
        locIncLink.children('span').text(cnt);
        locContainer.find('span').text(cnt);

        $('#fs-beds,#fs-baths,#fs-price').css({visibility: 'visible'});
        locContainer.hide();
        return false;
    });

    // change location form
    $('#location-select-link').click(function(e) {
        e.preventDefault();

        $('#location-select').show();
        $(this).hide();
        $('p.areas').remove();
        $('#hidden-city').remove();

        return false;
    });



    // print results
    $('a.b-print').click(function(e) {
        e.preventDefault();
        printPage();
        return false;
    });


    // set unload events
    $(window).unload( function() {
        GUnload();
    });

    return true;

});


/**
*  switch views on manin search page
*  address / community
*/
function switchSearchView(view)
{
    view = (view == '' || typeof(view) == 'undefined') ? 'city' : view;

    // setup
    $.ajaxSetup({async: true});
    $('#main-search-alert').html('').hide();

    // hide all
    $('#location-address').hide();
    $('#location-areas').hide();
    $('#location-map').hide();

    if (view !== 'city') {
        $('p.intro').html('').hide();
    }

    // menu
    $('#nav-extra a').removeClass('active');
    $('#n-' + view + ' a').addClass('active');

    // view
    //console.log('switching to: ' + view);
    switch(view) {
        default:
        case 'address':
            showAddressView();
            theflv = 'tl-search-address.flv';
            showvideo();
            break
        case 'city':
            showCityView();
            break;
        case 'map':
            showMapView();
            theflv = 'tl-search-map.flv';
            showvideo();
            break;
    }

    // set hidden
    $('#location-tab-val').val(view);

    // cleanup
    _cleanSearchLocations();

    return false;
}

function _cleanSearchLocations()
{
    $('div.location-region').remove();
    $('a.region-link').removeClass('active');

    //$('#location-map-areas').empty();
}

function showAddressView()
{
    $('#location-address').show();
    //$('#location-nearby').show();
    //$('#search-street').focus();

    // activate address vs zip
    $('#location-address input').focus(function () {
        $('#location-address label').removeClass('off');
        if (this.id == 'search-zip') {
            $('#location-address input#search-street').parent('label').addClass('off');
            $('#location-address input#search-location').parent('label').addClass('off');
        } else {
            $('#location-address input#search-zip').parent('label').addClass('off');
        }
    });

    return false;
}

function showCityView()
{
    $('#location-areas').show();

    // check region
    $('input[id^=reg-check-]').click(function() {
        $('#location-areas .bubble').hide();
        //this.checked = false;

        var regionId = this.id.replace('reg-check-', '');
        _loadRegion(regionId);

        return false;
    });
}

function _loadRegion(regionId, communityId)
{
    var container = $('li#reg-' + regionId);
    if (!container.length) {
        return false;
    }

    var cb = $('input#reg-check-' + regionId);

    var regContainer = container.children('.location-region');

    var isActive = container.hasClass('active');
    if (isActive) {
        //cb.attr('checked', false);
        container.removeClass('active');
        container.find('.sign').html('&#9658;');

        regContainer.hide();
        regContainer.find('input[type=checkbox]').attr('checked', false);
    } else {
        //cb.attr('checked', true);

        container.addClass('active');
        container.find('.sign').html('&#9660;');

        // load if not exists
        if (!regContainer.length && !isLoading) {
            container.append('<p class="loading">Loading communities</p>');

            isLoading = true;

            $.get('/search/region', {id: regionId}, function (data) {
                container.find('p.loading').remove();
                container.append(data);

                // find checkbox
                var checkAll = container.find('input:last');
                checkAll.click(function() {
                    container.find('li input[type=checkbox]').attr('checked', this.checked);
                });

                // activate community areas popup
                communityPopUp(regionId);

                isLoading = false;

                // check community
                if (communityId) {
                    container.find('li input[type=checkbox]').attr('checked', false);
                    checkAll.attr('checked', false);
                    var com = $('#c-' + communityId);
                    com.attr('checked', true);
                    com.parent('label').addClass('hl');
                    com.focus();
                }
            });
        }

        regContainer.show();
    }

}

function communityPopUp(regionId)
{
    $('#reg-' + regionId + '-list a').each(function() {

        $(this).click(function () {
            //$(this).siblings('input').attr('checked', true);
            return false;
        });

        $(this).qtip({
             content: {
                text: '<div class="loading">Loading&hellip;</div>',
                url: '/search/community',
                data: {id: this.id.replace(/cp\-/, '') },
                method: 'get',
                title: {
                   text: 'included in ' + $(this).attr('title')
                   //button: 'close [x]'
                }
             },
             show: {
                when: 'click',
                solo: true
             },
             hide: 'unfocus',
             position: {
                corner: {
                   target: 'rightMiddle',
                   tooltip: 'leftMiddle'
                },
                adjust: {
                   screen: true // Keep the tooltip on-screen at all times
                }
             },
             style: {
                tip: true,
                border: {
                    width: 2,
                    color: '#99B7DF'
                },
                width: 450,
                name: 'light'
             },
             onHide: function() {
                alert('Yo')
             }

        });

    }); // each
}

/**
* search page, map view
*/
function showMapView()
{
    $('#location-map').show();
    initSearchMap();
    $('#search-map').show();

    return false;
}

/**
*
*/
function initSearchMap()
{
    if (null !== searchMap) {
        searchMap.clearOverlays();
        searchMap.setCenter(new GLatLng(37.28279464911045, -119.46533203125), 6);
        return true;
    }

    var mapContainer = $('#search-map');
    if (!mapContainer.length) {
        //console.log('map container not found: ' + mapContainer);
        return false;
    }

    if (!isGMapCompatible) {
        return false;
    }

    //console.log('map init');
    searchMap = new GMap2(mapContainer.get(0));

    // dragzoom control
    var styleOpts = {
        fillColor: '#fff',
        opacity: 0.5,
        border: '1px dashed #17447F'
    };

    var otherOpts = {
        buttonStartingStyle: {background: 'transparent', padding: '0', border: 'none'},
        buttonHTML: '<img id="dzi" src="/images/icons/gmap/dragzoom-in.png" title="Drag Zoom In" alt="zoom in"/>',
        buttonStyle: {background: 'transparent', width:'27px', height:'27px'},
        buttonZoomingHTML: '<div class="zoom-msg"><strong>Drag a region on the map</strong>(click here to cancel)</div>',
        buttonZoomingStyle: {width: '100px'},
        backButtonHTML: '<img src="/images/icons/gmap/dragzoom-out.png" title="Drag Zoom Out" alt="zoom out"/>',
        backButtonStyle: {display:'none', background: 'transparent', marginTop:'8px', width:'27px', height:'27px'},
        backButtonEnabled: true,
        overlayRemoveTime: 2000
    }

    //searchMap.addControl(new GSmallZoomControl());
    searchMap.addControl(new GSmallMapControl());
    searchMap.addControl(new GScaleControl());
    searchMap.addControl(new DragZoomControl(styleOpts, otherOpts, {
        dragend: _checkZoom,
        dragstart: function() { searchMap.clearOverlays(); }
    }), new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(11, 110)));

    searchMap.setCenter(new GLatLng(37.28279464911045, -119.46533203125), 6); // CA
    searchMap.checkResize();

    GEvent.addListener(searchMap, 'zoomend', function() {
        //$('#search-map img#dzi').show();
    });

}

function _checkZoom(nw, ne, se, sw)
{
    var maxZoom = 10;
    var minRadius = 12;

    searchMap.clearOverlays();
    zoom = searchMap.getZoom();

    var center = searchMap.getCenter();
    //var point = new GLatLng();
    var radius = Math.round( center.distanceFrom(nw) / 1609.344);
    if (radius < minRadius) {
        radius = minRadius;
    }
    console.log('center: ' + center);
    console.log('radius: ' + radius + ' mil');
    console.log('zoom: ' + zoom);


    // cal range
    var range = [];
    if (radius >= 200) {
        range = [50, 100, 150];
    } else if (radius >= 100) {
        range = [30, 50, 100];
    } else if (radius >= 50) {
        range = [10, 20, 30 ];
    } else if (radius >= 30) {
        range = [5, 10, 20];
    } else if (radius >= 20) {
        range = [3, 5, 10];
    } else {
        range = [1, 3, 5, 10, 20];
    }

    // get cities & draw
    var container = $('#location-map-areas');
    container.html('<div class="loading">Loading communities</div>');

    //console.log('/search/bounds?center=' + center.toUrlValue(7) + '&radius=' + radius);
    //return;

    $.get('/search/rangemap', {center: center.toUrlValue(7), radius: radius}, function (data) {
        container.html(data);

        var fillOpacity = 0.5;
        var strokeOpacity = 1;
        var i = 0;

        $(data).find('li[id^=cr-]').each(function() {
            var r = parseInt(this.id.replace(/cr\-/, ''));
            console.log('got radius ' + r);

            if (!r) return false;

            fillOpacity -= (i * 0.15);
            fillOpacity = fillOpacity.toFixed(2)
            if (fillOpacity <= 0) fillOpacity = 0.1;

            strokeOpacity -= (i * 0.1);
            strokeOpacity = strokeOpacity.toFixed(2)
            if (strokeOpacity <= 0) strokeOpacity = 0.1;

            //console.log('draw radius: ' + r);
            var circle = new CircleOverlay(center, r, "#6A97D2", 1, strokeOpacity, '#6A97D2', fillOpacity);
            searchMap.addOverlay(circle);

            i++;
        });

        // draw circles
/*
        for (i in range) {
            var fillOpacity = 0.5  - (i * 0.15);
            var strokeOpacity = 1 - (i * 0.15);

            fillOpacity = fillOpacity.toFixed(2)
            if (fillOpacity <= 0) fillOpacity = 0.1;

            strokeOpacity = strokeOpacity.toFixed(2)
            if (strokeOpacity <= 0) strokeOpacity = 0.1;

            var r = range[i];
            //console.log('draw radius: ' + r);
            var circle = new CircleOverlay(center, r, "#6A97D2", 1, strokeOpacity, '#6A97D2', fillOpacity);
            searchMap.addOverlay(circle);

        }
*/

        // fix zoom
        if (zoom > maxZoom) {
            searchMap.setZoom(maxZoom);
            //console.log('fix zoom: ' + zoom + ', new: ' + maxZoom);
        }

    });

    return;
}


function _checkZoom_old()
{
    var zoom = searchMap.getZoom();
    var bounds = searchMap.getBounds();
    var sw = bounds.getSouthWest();
    var ne = bounds.getNorthEast() ;
    //$('#location-map-areas').html('NE: ' + ne + 'SW:' + sw + ', zoom: ' + zoom);

    var sw_ = sw.lat() + ',' + sw.lng();
    var ne_ = ne.lat() + ',' + ne.lng();

    var url = '/search/bounds?sw=' + escape(sw_) + '&' + 'ne=' + escape(ne_) + '&z=' + zoom;
    // /search/bounds?sw=33.48414472606364%2C-119.21264648437501&ne=34.85212898939811%2C-117.69653320312499

    if (zoom >= 12) { // max zoom reached
        $('#search-map img#dzi').hide();
        searchMap.setZoom(12);

    }

    //console.log(url);

    var container = $('#location-map-areas');
    container.html('<div class="loading"></div>');

    $.get('/search/bounds', { sw: sw_, ne:ne_ }, function (data) {
        container.removeClass('loading');
        container.html(data);
        return;
    });


}


/**
*  switch list/map
*/
function switchResultsView(view)
{
    resultsView = view ? view : 'list';

    //console.log('View: ' + view);
    $('#results-switch a').removeClass('selected');
    $('#results-switch a#n-' + view).addClass('selected');

    if (resultsView == 'map') {
        $('#results-list').hide();
        $('#results-map').show();
        $('form.results-pager').hide();
        initResultsMap();
    } else {
        $('#results-list').show();
        $('#results-map').hide();
        $('form.results-pager').show();
    }

    return true;
}


/**
* load search results, ajax
*/
function loadResults(url, data)
{
    var container = $('#main-content .col');
    var success = false;

    // cleanup
    if (null !== resultsMap) {
        resultsMap.clearOverlays();
        GUnload();
        resultsMap = null;
    }

    container.html('');
    container.append('<p class="loading clearfix">Loading results&hellip;<a href="' + url + '">reload</a></p>');

    $('#main-content .col').load(url, data, function(responseText, textStatus, XMLHttpRequest) {
        success = (XMLHttpRequest.status == 200);
        container.remove('p.loading');

        //
        if (!success) {
            container.html(serverErrorMsg);
        }

        initResultSelects();
    });

    return success;
}


/**
* initialize sort by & per pege dropdown
*/
function initResultSelects() {
    $('form#results-sort select').change(function() {
        var s = loadResults('/search/results?_sort=' + this.value);
        return s ? false : true;
    });
    $('form.results-pager select').change(function() {
        var s = loadResults('/search/results?_perpage=' + this.value);
        return s ? false : true;
    });
}

/**
* initialize results map
*/
function initResultsMap()
{
    //console.log('call initResultsMap()');
    //console.log('resultsMap = ' + resultsMap);

    if (null !== resultsMap) {
        return true;
    }

    var mapContainer = $('#results-map');
    if (!mapContainer.length || !mapContainer.is(':visible')) {
        //console.log('map container not found: ' + mapContainer);
        return false;
    }

    if (GBrowserIsCompatible()) {
        //console.log('map init');
        resultsMap = new GMap2(mapContainer.get(0));
        if (isMember) {
            resultsMap.addControl(new GSmallMapControl());
        }

        var bounds = new GLatLngBounds();

        // custom marker
        var baseIcon = new GIcon();
        baseIcon.iconSize = new GSize(24, 24);
        baseIcon.shadow = '/images/icons/gmap/marker-shadow.png';
        baseIcon.shadowSize = new GSize(36, 22);
        baseIcon.iconAnchor = new GPoint(9, 34);
        baseIcon.infoWindowAnchor = new GPoint(24, 2);

        $('.geo').each(function() {
            var id = this.id.replace('point-', '');
            //console.log(id + ':' + $('#marker-' + id).length );

            var lat = parseFloat($(this).children('span.latitude').text());
            var lon = parseFloat($(this).children('span.longitude').text());
            var type = $(this).children('span.type').text();

            //console.log(lat + ',' + lon);
            if (lat && lon) {
                var point = new GLatLng(lat, lon);
                bounds.extend(point);

                // icon type
                var pinIcon = new GIcon(baseIcon);
                pinIcon.image = '/images/icons/gmap/marker-' + type + '.png';

                var marker = new GMarker(point, {icon: pinIcon});

                GEvent.addListener(marker, 'click', function() {
                    marker.openInfoWindowHtml( '<div class="marker">' + $('#marker-' + id).html() + '</div>' );
                });
                resultsMap.addOverlay(marker);
            }
        });

        var bc = bounds.getCenter();
        resultsMap.setCenter(bc);
        resultsMap.setZoom(resultsMap.getBoundsZoomLevel(bounds));

        resultsMap.checkResize();
    }

    return true;
}

/**
*  save results for members
*/
function initModalSave()
{
    var modal = $('#save-results-modal');

    if (! modal.length)
        return false;

    modal.dialog({
        bgiframe: true,
            autoOpen: false,
            modal: true,
            draggable: false,
            width: 400,
            buttons: {
                Cancel: function() {
                    $(this).dialog('close');
                },
                'Save': function() {
                    // save search
                    var fields = {
                        'description': $(this).find('textarea[name=description]').val(),
                        'email_alert': $(this).find('input[name=email_alert]:checked').length,
                        'sms_alert':   $(this).find('input[name=sms_alert]:checked').length
                    };
                    console.log(fields);
                    $.post('/search/save', fields, function(res) {
                        console.log(res);
                    });
                    $(this).dialog('close');
                }
            }
    });

    // save / view saved links
    $('#refine-save-link').click(function() {
        modal.dialog('open');
        return false;
    });
}

/**
*  save results for members
*/
function initModalSearches()
{

    var modal = $('#searches-modal');

    if (! modal.length)
        return false;

    modal.dialog({
        bgiframe: true,
            autoOpen: false,
            modal: true,
            draggable: false,
            width: 400,
            buttons: {
                Close: function() {
                    $(this).dialog('close');
                }
            }
    });

    // save / view saved links
    $('#refine-searches-link').click(function() {
        // load data
        modal.empty();
        modal.append('<p class="loading clearfix">Loading &hellip;</p>');

/*
        modal.load('/member/searches', null, function(responseText, textStatus, XMLHttpRequest) {
            var success = (XMLHttpRequest.status == 200);
            modal.remove('p.loading');

                    //if (!success) {
                    //    modal.html(serverErrorMsg);
                    //    return false;
                    //}

                    // wire run link
        });
*/

        modal.load('/member/searches').dialog('open');

        return false;
    });

}

/**
*  send results for guests
*/
function initModalSend()
{
    var modal = $('#save-results-modal');

    if (! modal.length)
        return false;

    modal.dialog({
        bgiframe: true,
        autoOpen: false,
        modal: true,
        draggable: false,
        width: 400,
        buttons: {
            Cancel: function() {
                $(this).dialog('close');
            },
            'Send Results': function() {
                var bValid = true;
                var error = '';
                var allFields = $('#send-results-modal input');
                var tips = $('#send-results-modal #send-tip');

                tips.html('').removeClass('error');

                // check
                //var mode = $('#alert-switch').val();
                //var o = null;
                var sendData = {};
                var description = $('#send-results-modal textarea').val();

                var phoneField = $('#alert-phone');
                var emailField = $('#alert-email');
                var phone = '';
                var email = '';

                if (phoneField.val()) {
                    error = 'Phone number is incorrect';
                    phone = phoneField.val().replace(/[^0-9]+/, '');
                    bValid = (phone.length >= 10);
                }

                if (emailField.val()) {
                    error = 'Email address is incorrect';
                    email = emailField.val().replace(/[^A-Za-z0-9\-\_\.\@]+/, '');
                    var regexp = /^([\w-]+(?:\.[\w-]+)*)@((?:[\w-]+\.)*\w[\w-]{0,66})\.([a-z]{2,6}(?:\.[a-z]{2})?)$/i;
                    bValid = regexp.test(email);
                }

                if (!bValid) {
                    tips.html(error).addClass('error');
                } else {
                    // send
                    sendData = {phone: phone, email: email, description: description};
                    $.post('/search/save', sendData);
                    $(this).dialog('close');
                }
            }
        },
        close: function() {
            //allFields.val('').removeClass('ui-state-error');
        }
    });

    // email - phone switch
    /*
    $('#alert-switch').change(function() {
        var e = $('#alert-email').parent().get(0);
        var p = $('#alert-phone').parent().get(0);

        if (this.value == 'sms') {
            $(p).show();
            $(e).hide();
        } else {
            $(e).show();
            $(p).hide();
        }
    });
    */

    $('#refine-send-link').click(function() {
        modal.dialog('open');
        return false;
    });

    return true;
}

function initModalButler()
{
    var modal = $('#butler-modal');

    if (! modal.length)
        return false;

    modal.dialog({
        bgiframe: true,
        autoOpen: false,
        modal: true,
        draggable: false,
        width: 400,
        minWidth: 300,
        buttons: {
            'Cancel': function() {
                $(this).dialog('close');
            },
            'Do the Search': function() {
                $(this).dialog('close');
                $(this).children('form').submit();
            }
        }
    });

    // save / view saved links
    $('#butler-link').click(function() {
        modal.dialog('open');
        return false;
    });
}

/**
*  Join wondow for save/saved links
*/
function initModalJoin()
{
    var modal = $('#join-modal');

    if (! modal.length)
        return false;

    modal.dialog({
        bgiframe: true,
        autoOpen: false,
        modal: true,
        draggable: false,
        width: 300,
        minWidth: 300,
        buttons: {
            //'No thanks': function() {
            //    $(this).dialog('close');
            //},
            'Sign Up': function() {
                var url = modal.find('form').attr('action');
                $(this).dialog('close');
                window.location = url;
            }
        }
    });

    // save / view saved links
    $('#refine-save-link,#refine-searches-link').click(function() {
        modal.dialog('open');
        return false;
    });

}

function initKwTip()
{
    var link = $('#keyword-search a');
    if (!link.length) {
        return false;
    }

    link.qtip({
        content: {
            text: $('#keyword-search p').html(),
            title: 'Quick Keyword Search'
        },
        show: {
            when: 'click',
            solo: true
        },
        hide: 'unfocus',
        style: {
            tip: true,
            border: {
                width: 1,
                color: '#99B7DF'
            },
            width: 250,
            name: 'light'
        }
    });

    return true;
}

function initQuickCom()
{
    var qc = $('#quick-community-select');
    if (! qc.length) {
        return false;
    }

    qc.keypress(function() {
        return !(window.event && window.event.keyCode == 13);
    })

    qc.autocomplete('/search/autocomplete-community', {
        minChars: 3,
        highlight: false,
        selectFirst: false,
        width: 250,
        delay: 100
    });

    qc.result(function (event, data, formatted) {
        //var form = instSearchField.get(0).form;
        $('#location-areas .bubble').hide();

        var communityId = data[1];
        var regionId = data[2];

        _loadRegion(regionId, communityId);

        var pos = $('li#reg-' + regionId).position();
        $('html,body').animate({scrollTop: pos.top});

    });

    qc.focus(function(){
        this.value = '';
        $(this).removeClass('start');
    });

}