var Gmaps = function(el, options) {
    new this.init(el, options);
};
(function(g){
    if(!g.maps) {
        throw "required Google Maps API version 3 !";
    }

    var prot = Gmaps.prototype,
        fn;

    prot.init = function(e, o) {
        this.init(e, o);
    };


    // fn prototype
    fn = prot.init.prototype = {};


    fn.elm     = null;
    fn.options = {};

    // initialize object
    fn.init = function(el, opt) {
        this.elm = el;
        this.options = opt;
        this.info_window = null;
        this.latlng = null;
        this.map_node = null;

        this.add_dom_listener();
    };


    // add listener for window
    fn.add_dom_listener = function() {
        var t = this;
        if(this.options.geocode == true) {
            g.maps.event.addDomListener(window, "load", function(ev) {
                t.geocode(ev);
            });
        }
        else {
            g.maps.event.addDomListener(window, "load", function(ev) {
                t.draw(ev);
            });
        }
    };


    // geocode to adress data
    fn.geocode = function(ev) {
        var t = this,
            geo = new g.maps.Geocoder();

        //geo.address = this.options.address;
        geo.geocode({ address: this.options.address }, function(st, msg) {
            if(msg != "OK") {
                t.throw_error();
            }
            var loc = st[0].geometry.location;
            t.options.pos = {
                lat: loc.b,
                lng: loc.c
            }
            t.draw(ev);
        });
    };


    // draw Google map
    fn.draw = function(ev) {
        var t  = this,
            ll = new g.maps.LatLng(this.options.pos.lat, this.options.pos.lng),
            m  = new g.maps.Map(this.elm, {
                center: ll,
                zoom: 13,
                mapTypeId: g.maps.MapTypeId.ROADMAP
            }),
            marker = new g.maps.Marker({
                position: ll,
                map:m
            });

        this.map_node = m;
        this.latlng = ll;

        var win = new g.maps.InfoWindow({
            position: this.latlng,
            content: (this.options.content ? this.options.content + "<br />" : "") + this.options.address
        });
        this.info_window = win;
        win.open(this.map_node);

        g.maps.event.addDomListener(marker, "click", function(ev) {
            if(t.info_window) {
                t.info_window.close();
            }
            t.popup(ev);
        });
    }


    // popup information window
    fn.popup = function(ev) {
        var win = new g.maps.InfoWindow({
            position: this.latlng,
            content: (this.options.content ? this.options.content + "<br />" : "") + this.options.address
        });
        this.info_window = win;
        win.open(this.map_node);
    }


    // throw error
    fn.throw_error = function(msg) {
        throw msg;
    }
})(google);



