/*
See http://kvdb.net/projects/6pp on how to use this script.
*/

function showAlert(message, title)
{
    message = message || 'An error has occured';
    title = title || 'Error';

    var dialog = $('#dialog');

    dialog.find('.content').html(message);

    dialog.dialog({
        bgiframe: true,
        modal: true,
        title: title,
        buttons: {
            Ok: function() {
                $(this).dialog('close');
            }
        }
    });
}

// Namespacing the code so the examples don't clash.
var net = {};
net.kvdb = {};
net.kvdb.Lookup = {};
var _lookup = net.kvdb.Lookup;

_lookup.isValidPostcode = function(zipcode) {
    // Check if input is a valid 4PP of 6PP.
    return /^\d{4} ?$/.test(zipcode) ||
    /^\d{4} ?[A-Za-z]{2}$/.test(zipcode);
}

_lookup.lastLookup = null;
_lookup.fromPostcode = function(zipcode) {
    zipcode = zipcode || $('#zipcode').val();

    var streetnumber = $('#number').val();

    if (this.isValidPostcode(zipcode)) {
        // If the same postcode was already retrieved, skip.
        if (_lookup.lastLookup != zipcode + streetnumber) {
            this.lookup();
        }
    } else {
        this.resetResults();
    }
    _lookup.lastLookup = zipcode + streetnumber;
}

_lookup.lodokup = function() {
    // Perform an address lookup based on postcode and -if entered- street number.

    // Clear the street / city result fields.
    this.resetResults();

    // Enable spinner, so the user knows the lookup is being performed.
    /*var spinner = document.getElementById("spinner");
    if (spinner) {
        spinner.style.display = '';
    }*/

    var streetnumber = $('#zipcode').val();
    var zipcode = $('#zipcode').val();
    this.loadScript('http://6pp.kvdb.net/services/lookup?postcode=' + escape(zipcode) + '&streetnumber=' + escape(streetnumber) + '&tg_format=json&jsonp=_lookup.showStreetAndCity');
}

_lookup.lastLookup = null;
_lookup.lookup = function(zipcode)
{
    if (!zipcode.match(/[1-9]{1}[0-9]{3}\s?([a-zA-Z]{2})/))
    {
        return;
    }

    if (_lookup.lastLookup == zipcode)
    {
        return;
    }
    
    _lookup.lastLookup = zipcode;

    var url = 'http://6pp.kvdb.net/services/lookup?postcode=' + escape(zipcode)
		+ '&streetnumber=' + escape('') + '&tg_format=json&jsonp=_lookup.showStreetAndCity'

	url = 'http://static.annommx.com/zipcodes.php?zipcode=' + escape(zipcode);

    var script = document.createElement('script');
    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
}

_lookup.showStreetAndCity = function(json)
{
    if (json.result == 'Invalid input')
    {
        showAlert('Invalid input');
        
        return;
    }

    var count = json.result.length;

    if (count == 0)
    {
        //showAlert('No address information found');
        //$('#street').val('');
        //$('#city').val('');
    }
    else if (count == 1)
    {
        $('#street').val(json.result[0].street);
        $('#city').val(json.result[0].city);
    }
    else
    {
        
    }
}

_lookup.edit = function() {
    // Return street information with postcode + street number to improve the 6pp database.
    var postcode = document.getElementById('postcode').value;
    var streets = document.getElementById('streets');
    // But only if the user chose a street instead of the default text.
    if (streets.selectedIndex == 0) {
        return;
    }
    var straatnaam = streets.options[streets.selectedIndex].text;
    var city = document.getElementById('city').value;
    var streetnumber = document.getElementById('streetnumber').value;
    // After the submit, perform lookup again to get the new data.
    this.loadScript('http://6pp.kvdb.net/services/feedback?postcode=' + escape(postcode) + '&street=' + escape(straatnaam) + '&city=' + escape(city) + '&streetnumber=' + escape(streetnumber) + '&tg_format=json&jsonp=lookup');
}

_lookup.loadScript = function(url) {
    var script = document.createElement('script');
    script.src = url;
    document.getElementsByTagName('head')[0].appendChild(script);
}

_lookup.resetResults = function() {
    // Empty single street result field
    $('#street').val('');
    // Empty multiple streets result listbox
    //document.getElementById('streets').options.lenght = 0;
    // Empty city result field
    $('#city').val('');
//    // Hide the map
//    document.getElementById('map').style.display = "none";
//    // Hide the unsure link
//    document.getElementById('unsure').style.display = "none";
//    // Hide the fix link
//    document.getElementById('fix').style.display = "none";
//    // Hide the add link
//    document.getElementById('add').style.display = "none";
//    // Hide the addanother link
//    document.getElementById('addanother').style.display = "none";
}

_lookup.showSingleAddress = function() {
    // Hide the multiple address elements
    //var streets = document.getElementById('streets');
    //streets.style.display = 'none';
    // Show the single address elements
    //var street = document.getElementById('street');
    //street.style.display = '';
    }

_lookup.showManyAddresses = function() {
    // Hide the single address elements
    //var street = document.getElementById('street');
    //street.style.display = 'none';
    // Show the multiple address elements
    //var streets = document.getElementById('streets');
    //streets.style.display = '';
    }

_lookup.showLookupResults = function(json) {
    // Disable spinner
    //    var spinner = document.getElementById("spinner");
    //    if (spinner) {
    //        spinner.style.display = 'none';
    //    }

    if (json.result == 'Invalid input') {
        document.getElementById('city').value = "Ongeldige invoer";
        return;
    }
    var count = json.result.length;
    if (count == 0) {
    // No results found
    } else {
        // Always display the city
        document.getElementById('city').value = json.result[0].city;
        if (count == 1) {
            // There's exactly one address available.
            this.showSingleAddress();
            var street = json.result[0].street;
            var subtitle = json.result[0].subtitle;
            var street_id = json.result[0].street_id;
            var postcode_id = json.result[0].postcode_id;
            var postcode = document.getElementById('zipcode').value;
            var chars = postcode.substr(4).replace(/^\s+/,'').replace(/\s+$/,'').toUpperCase();

            // On 6PP lookups, allow user to add unknown streets.
            if (!street && postcode.length >= 6) {
                street = "Straat onbekend";
                var add = document.getElementById('add');
                add.href = "http://6pp.kvdb.net/wiki/add?street=&postcode_id=" + postcode_id + "&chars=" + chars;
                add.style.display = "inline";
            }
            document.getElementById('street').value = street;
            document.getElementById('street').title = subtitle;
            if (street_id) {
        // Allow user to flag the street as possibly invalid (unsure).
        /*var unsure = document.getElementById('unsure');
                unsure.onclick = new Function("_lookup.unsureStreet(" + street_id +"); return false;");
                unsure.style.display = "inline";
                // Allow user to add an extra street in addition to the one(s) seen.
                var addanother = document.getElementById('addanother');
                addanother.href = "http://6pp.kvdb.net/wiki/add?street=&postcode_id=" + postcode_id + "&chars=" + chars;
                addanother.style.display = "inline";*/
        }
        } else {
            // There are more known addresses for this postcode (+ street number). Show all options.
            this.showManyAddresses();
            var streets = document.getElementById('streets');
            streets.options[0] = new Option("Maak uw keuze uit " + count + " straten.", "Placeholder");
            for (var i = 0; i < count; i++)
            {
                var street = json.result[i].street;
                streets.options[i+1] = new Option(street, i);
            }
        }
        // Show geo-coordinates on a map, if available.
        var lat = json.result[0].geo_lat;
        var lng = json.result[0].geo_long;
        if (lat && lng) {
    /*var map = document.getElementById('map');
            // Map was not visible, show it now.
            map.style.display = "block";
            map.src = 'examples/kaart.php?size=small&lat=' + lat + '&long=' + lng;*/
    }
    }
}

_lookup.unsureStreet = function(street_id) {
    // User chose to flag this street as unsure.

    // Enable spinner, so the user knows the action is being performed.
    var spinner = document.getElementById("spinner");
    if (spinner) {
        spinner.style.display = '';
    }

    this.loadScript('http://6pp.kvdb.net/services/setstreet?id=' + street_id + '&unsure=True' + '&tg_format=json&jsonp=_lookup.unsureResults');

    // The unsure link is no longer required.
    var unsure = document.getElementById('unsure');
    unsure.style.display = "none";
}

_lookup.unsureResults = function(json) {
    // The street has been flagged unsure.

    // Disable spinner
    var spinner = document.getElementById("spinner");
    if (spinner) {
        spinner.style.display = 'none';
    }

    // Hope the user will fix the spotted error too.
    var fix = document.getElementById('fix');
    fix.href = "http://6pp.kvdb.net/wiki/edit?street_id=" + json.result.id;
    fix.style.display = "inline";
}