﻿var timestarts = 0;
var Debug = {
    Write: function(message) {
        var d = new Date();
        if ($('#timediv').length == 0) {
            $('<div id="timediv" style="background-color:yellow;position:absolute;right:0px;top:0px;height:1000px;width:400px;z-index:20000;"></div>')
                            .appendTo(document.body);
        }
        $('#timediv').html(
                '<br/>'
                + (d.getTime() - timestarts)
                + ' : '
                + message
                + $('#timediv').html());

    },
    Clear: function() {
        $('#timediv').remove();
    }
};
function etsValidateAddress() {
    this.addresses = new Array(50);
    this.usedAddress = 0;
    
    function AddressFields(objAddress) {
        this.address = '';
        this.city = '';
        this.state = '';
        this.zip = '';
        this.lat = '';
        this.lng = '';

        
        
        //Debug.Write("Address Parse Starts");
        if (objAddress.address) { this.address = objAddress.address; }
        if (objAddress.AddressDetails) {
            var str = $.toJSON(objAddress.AddressDetails);

           // Debug.Write("Zip Parse Starts");
            this.zip = ftags(str, 'PostalCodeNumber');
           // Debug.Write("State Parse Starts");
            this.state = ftags(str, 'AdministrativeAreaName');
           // Debug.Write("City Parse Starts");
            this.city = ftags(str, 'LocalityName');
            if (this.city == '') {
               // Debug.Write("City 1 Parse Starts");
                this.city = ftags(str, 'DependentLocalityName');
            }
            if (this.city == '') {
              //  Debug.Write("City 2 Parse Starts");
                this.city = ftags(str, 'SubAdministrativeAreaName');
            }
        }
        //Debug.Write("Lng  Parse Starts");
        this.lng = objAddress.Point.coordinates[0];
        //Debug.Write("Lat  Parse Starts");
        this.lat = objAddress.Point.coordinates[1];
        return this;
    }
    function ftags(str, tagname) {
        i = str.indexOf('"' + tagname + '":"');
        if (i > -1) {
            j = str.indexOf('"', i + tagname.length+4);
            if (j > -1) {
                return str.substring(i + tagname.length+4, j );
            }
        }
        return "";
    }
    function AddressFields1(objAddress){
        this.address = '';
        this.city = '';
        this.state = '';
        this.zip = '';
        this.lat = '';
        this.lng = '';

       // Debug.Write("Address Parse Starts");
        if(objAddress.address){this.address = objAddress.address;}
        if (objAddress.AddressDetails) {
         //   Debug.Write("Zip Parse Starts");
            this.zip = findTags(objAddress.AddressDetails.Country.AdministrativeArea, 'PostalCodeNumber');
         //   Debug.Write("State Parse Starts");
             this.state = findTags(objAddress.AddressDetails.Country.AdministrativeArea, 'AdministrativeAreaName');
            // Debug.Write("City Parse Starts"); 
             this.city = findTags(objAddress.AddressDetails.Country.AdministrativeArea, 'LocalityName');
            if(this.city == ''){
             //   Debug.Write("City 1 Parse Starts");
                this.city = findTags(objAddress.AddressDetails.Country.AdministrativeArea, 'DependentLocalityName');
            }
            if(this.city == ''){
             //   Debug.Write("City 2 Parse Starts");
                this.city = findTags(objAddress.AddressDetails.Country.AdministrativeArea, 'SubAdministrativeAreaName');
            }
        }
       // Debug.Write("Lng  Parse Starts");
        this.lng = objAddress.Point.coordinates[0];
       // Debug.Write("Lat  Parse Starts");
         this.lat = objAddress.Point.coordinates[1];
        return this;
    }
    
    function findTags(n, tagname){
        for(e in n){
            if(e == tagname){
                return n[e];
            }else{
                var ret = findTags1(n[e], tagname);
                if(ret!=''){
                    return ret;
                }
            }
        }
        return '';
    }
    function findTags1(n, tagname) {
        for (e in n) {
            if (e == tagname) {
                return n[e];
            } else {
                var ret = findTags2(n[e], tagname);
                if (ret != '') {
                    return ret;
                }
            }
        }
        return '';
    }
    function findTags2(n, tagname) {
        for (e in n) {
            if (e == tagname) {
                return n[e];
            } else {
                var ret = findTags3(n[e], tagname);
                if (ret != '') {
                    return ret;
                }
            }
        }
        return '';
    }
    function findTags3(n, tagname) {
        for (e in n) {
            if (e == tagname) {
                return n[e];
            } else {
                var ret = findTags4(n[e], tagname);
                if (ret != '') {
                    return ret;
                }
            }
        }
        return '';
    }
    function findTags4(n, tagname) {
        for (e in n) {
            if (e == tagname) {
                return n[e];
            }
        }
        return '';
    }
    function etsAddress(address, identifier, onComplete, onError) {
        this.address = address;
        this.identifier = identifier;
        this.isValid = false;
        this.fetchedAddress = null;
        
        this.onComplete = null;
        if (onComplete) { this.onComplete = onComplete; }

        this.onError = null;
        if (onError) { this.onError = onError; }

        var geo;
        geo = new GClientGeocoder();

        var obj = this;
        //Debug.Write(this.address + " Starts");
        geo.getLocations(this.address, function(addressJSON) {
            //Debug.Write(obj.address + " Received");
            if (addressJSON.Status.code != 200) {
                obj.isValid = false;
                if (obj.onError) { obj.onError(obj.address, obj.identifier); }
            }
            else {
                obj.isValid = true;
                objAddress = addressJSON.Placemark[0];
              //  Debug.Write(obj.address + " Parse Starts");
                obj.fetchedAddress = new AddressFields(objAddress);
                //Debug.Write(obj.address + " Parse Ends");
                if (obj.onComplete) { obj.onComplete(obj.address, obj.identifier, obj.fetchedAddress); }
            }
        });
        
    }

    this.searchAddress = function(address, identifier, onComplete, onError) {
        for (savedAddress in this.addresses) {
            if (savedAddress.address == address) {
                if (savedAddress.isValid == true) {
                    if (onComplete) { onComplete(address, identifier, savedAddress.fetchedAddress); }
                } else {
                    if (onError) { onError(address, identifier); }
                }
                break;
            }
        }
        this.addresses[this.usedAddress] = new etsAddress(address, identifier, onComplete, onError);
        this.usedAddress++;
    }
    this.returnAddress = function(address) {
        for (i = 0; i < this.usedAddress; i++) {
            var savedAddress = this.addresses[i];
            if (savedAddress.address == address) {
                if (savedAddress.isValid == true) {
                    return savedAddress.fetchedAddress;
                }
            }
        }
        return null;
    }
}
