$(document).ready(function() {

    // tab interface for search forms; initTabIdx is (optionally) defined in
    // HTML page
    $('#search-forms > ul')
        .tabs({ selected: 0, disabled: [1] })
        .tabs('select', initTabIdx || 0); // workaround failure to initialize 'selected' option with anything other than 0
    
    // validate search by postal code and geocode if validation successful
    var $postalCode = $('#postal-code');
    $('#postal-search-form').bind('submit.validateAndGeocode', function() {
        var $form = $(this);

        // missing postal code
        if ($postalCode.val().search(/^\s*$/) != -1) {
            alert('Please enter a postal code.');
            return false;
        }
        
        // invalid postal code (need at least 1st 3 valid chars)
        else if ($postalCode.val().search(/^\s*[A-Z]\d[A-Z](\s*\d([A-Z]\d?)?)?\s*$/i) == -1) {
            alert('Invalid postal code.');
            return false;
        }
        
        // geocode
        else {
            $('body').css('cursor', 'wait');
            var geocoder = new GClientGeocoder();
            var mapQuery = $postalCode.val() + ', Canada';
            geocoder.getLatLng(mapQuery, function(point) {
                if (point) {
                    $(':input[name=longitude]', $form).val(point.lng());
                    $(':input[name=latitude]', $form).val(point.lat());
                }
                $form.trigger('submit!');
            });
            return false;
        }
    });
    
    // validate search by address and geocode if validation successful
    var $address = $('#address');
    var $city = $('#city');
    var $province = $('#province');
    $('#address-search-form').bind('submit.validateAndGeocode', function() {
        var $form = $(this);

        // validate
        if ($address.val().search(/^\s*$/) != -1 || $city.val().search(/^\s*$/) != -1 || $province.val().search(/^\s*$/) != -1) {
            alert('Please enter an address, city and province.');
            return false;
        }
        
        // geocode
        else {
            $('body').css('cursor', 'wait');
            var geocoder = new GClientGeocoder();
            var mapQuery = '';
            if ($address.val()) {
                mapQuery += $address.val() + ', ';
            }
            if ($city.val()) {
                mapQuery += $city.val() + ', ';
            }
            if ($province.val()) {
                mapQuery += $province.val() + ', ';
            }
            mapQuery += 'Canada';
            geocoder.getLatLng(mapQuery, function(point) {
                if (point) {
                    $(':input[name=longitude]', $form).val(point.lng());
                    $(':input[name=latitude]', $form).val(point.lat());
                }
                $form.trigger('submit!');
            });
            return false;
        }
    });

    // validate search by physician name
    var $firstName = $('#first-name');
    var $lastName = $('#last-name');
    $('#name-search-form').submit(function() {
        // require at least one of first name or last name
        if ($firstName.val().search(/^\s*$/) != -1 && $lastName.val().search(/^\s*$/) != -1) {
            alert('Please enter a first name and/or last name.');
            return false;
        }
    });
    
    // validate search by clinic name
    var $clinicName = $('#clinic-name');
    $('#clinic-search-form').submit(function() {
        if ($clinicName.val().search(/^\s*$/) != -1) {
            alert('Please enter a clinic name.');
            return false;
        }
    });
    
});
