if(typeof(Flips) == 'undefined'){ var Flips = {}; }
if(typeof(console) == 'undefined'){
	var console = { log : function(){} };
}else{
	console.log = function(){};
}

Flips.Map = {
	setup : function(){
		var maps = $('div.map');

		if(maps.length <= 0) return;

		var self = this;
		maps.each(function(){
			self.attach(this);
		});
	},
	attach : function(div){
		var params = this.getParams(div);
		if(!params) return;

        if(typeof(google) == "undefined") return;

        var myLatlng = new google.maps.LatLng(params.lat, params.lng);

        var myMapOptions = {
            zoom      : params.zoom,
            center    : myLatlng,
            mapTypeId : google.maps.MapTypeId.ROADMAP,
            mapTypeControl : false,
            streetViewControl : false,
            zoomControl       : true,
            zoomControlOptions: {
                style: google.maps.ZoomControlStyle.SMALL
            },
            navigationControl        : true,
            navigationControlOptions : {
                style : google.maps.NavigationControlStyle.ZOOM_PAN
            }
        };

        var map = new google.maps.Map(div, myMapOptions);

        var myMarkerOptions = {
            map: map,
            position: myLatlng
        };
        new google.maps.Marker(myMarkerOptions);

		if(Flips.Editor && div.parentNode){
            myMapOptions.draggable = false;
            map.setOptions(myMapOptions);
			div.parentNode.onmouseover = function(){
				div.style.visibility = 'hidden';
			};
			div.parentNode.onmouseout = function(){
				div.style.visibility = 'visible';
			};
		}
	},
	getParams : function(div){
		var title = $(div).attr('title');
		if(!title) return null;

		var arr = title.split(',');
		return {
			lat  : parseFloat(arr[0]),
			lng  : parseFloat(arr[1]),
			zoom : parseInt(arr[2])
		};
	}
};


jQuery.fn.extend({
    pos : function(left, top){
        var w = this.width();
        var h = this.height();
        var win = $(window);
        
        // 座標の指定がなければ中央に配置する
        top  = typeof(top) == 'undefined' ? Math.floor((win.height() - h)/2) + win.scrollTop() : top + win.scrollTop();
        left = typeof(left) == 'undefined' ? Math.floor((win.width() - w)/2) : left;
        top  = Math.max(0, top);
        left = Math.max(0, left);
        this.css({
            top : top + 'px',
            left : left + 'px'
        });
    }
});

/*
    [usage]
    var d= new Flips.Dialog({
        content : jQueryObject,
        buttons: [
            {
                obj: $('#button'),
                click: function(){
                    this.close();
                }
            }
        ]
    })
    d.open();
    ------------------
    or simply,
    
    var d= new Flips.Dialog(jQueryObject);
    ------------------
    see init() for other options.
*/
Flips.Dialog = function(){
    this.options = {};
    this.isOpened = false;
    this.init.apply(this, arguments);
}
Flips.Dialog.prototype = {
    init : function(options){
        if(options.length){
            this.options.content = options;
            this.options.modal = true;
        }else{
            this.options = {
                content : options.content,  // jquery object. required
                buttons : options.buttons,
                modal  : typeof(options.modal) == 'undefined' ? true : options.modal, // true by default
                top    : options.top,
                left   : options.left,
                width  : options.width,
                close  : options.close,
                without_close_button : options.without_close_button
            }
        }
        if(this.options.modal){
            (new Image()).src = '/images/ui/overlay-trans.png';
        }
        this._build();
        if(this.options.width > 0){
            this.obj.width(this.options.width);
        }
    },
    open : function(){
        if(this.options.modal) Flips.Overlay.show();
        this.obj.pos(this.options.left, this.options.top);
        this.obj.fadeIn(300);
        this.isOpened = true;
    },
    close : function(){
        this.obj.fadeOut(300);
        if(this.options.modal) Flips.Overlay.hide();
        if(this.options.close) this.options.close.apply(this, arguments);
        this.isOpened = false;
    },
    _build : function(){
        this.obj = this._wrap();
        if(!this.options.without_close_button) this._addCloseButton();
        if(this.options.buttons) this._attachButtonEvents();
    },
    _wrap : function(){
        var wrap = $('<div />').addClass('flips-ui-dialog-wrap').appendTo(this.options.content.parent());
        wrap.append(this.options.content.addClass('flips-ui-dialog-content').show());
        return wrap;
    },
    _addCloseButton : function(){
        var self = this;
        var closeButton = $('<div />').addClass('flips-ui-dialog-button-close').click(function(){self.close()});
        this.obj.append(closeButton);
        return closeButton;
    },
    _attachButtonEvents : function(){
        var self = this;
        $.each(this.options.buttons, function(i, button){
            button.obj.addClass('flips-ui-dialog-button');
            button.obj.click(function(){
                button.click.apply(self, arguments)
            });
        });
    }
}
Flips.Message = function(){
    this.options = {};
    this.init.apply(this, arguments);
}
Flips.Message.prototype = {
    init : function(options){
        if(typeof(options.autoclose) === 'undefined'){
            options.autoclose = true;
        }
        this.options = {
            message : options.message,
            type   : options.type,
            autoclose : options.autoclose,
            lifetime  : options.lifetime || 3600,
            width : options.width,
            top  : options.top,
            left : options.left
        }
        this._build();
        if(options.width > 0){
            this.obj.width(this.options.width);
        }
    },
    open : function(){
        if(this.options.modal) Flips.Overlay.show();
        this.obj.pos(this.options.left, this.options.top);
        this.obj.fadeIn(300);
        
        /*
        // 自動クローズ
        var self = this;
        if(this.options.autoclose){
            setTimeout(function(){
                self.close();
            }, this.options.lifetime)
        }
        */
    },
    close : function(){
        var obj = this.obj;
        obj.fadeOut(300, obj.remove());
    },
    _build : function(){
        var self = this;
        this.obj = $('<div />').addClass('flips-ui-message').html(this.options.message.replace(/\n/g, '<br />'));
        var closeButton = $('<button />').text('閉じる').click(function(){
            self.close();
        });
        this.obj.append($('<p></p>').append(closeButton));
        if(this.options.type){
            this.obj.addClass('flips-ui-message-' + this.options.type);
        }
        this.obj.appendTo('body');
    }
}
Flips.Overlay = {
    obj : null,
    isHidden : true,
    show : function(){
        if(!this.isHidden) return;
        if(!this.obj){
            var self = this;
            this.obj = $('<div />').attr('id', 'flips-ui-overlay').appendTo($('body'));
            $(window).resize(function(){
                self.resize();
            });
        }
        this.resize();
        this.obj.show();
        this.isHidden = false;
    },
    hide : function(){
        this.obj.hide();
        this.isHidden = true;
    },
    resize : function(){
        this.obj.height($(document).height() + 'px');
        this.obj.width($(window).width() + 'px');
    }
}


$(window).load(function(){

    Flips.Map.setup();

});

