goog.provide('ol.popup');

goog.require('ol.Popup');
goog.require('ol.map');


/**
 * @typedef {ol.Popup|{map, anchor, placement, content, template}} popup
 */
ol.PopupLike;



/**
 * @export
 * @param {ol.PopupLike} opt_arg popup object literal.
 * @return {ol.Popup} the popup.
 */
ol.popup = function(opt_arg){

    if (opt_arg instanceof ol.Popup) {
        return opt_arg;
    }
    
    /** @type {ol.Map} */
    var map;

    /** @type {ol.Loc|ol.Feature|undefined} */
    var anchor;

    /** @type {string|undefined} */
    var placement;

    /** @type {string|undefined} */
    var content;

    /** @type {string|undefined} */
    var template;

    if (arguments.length == 1 && goog.isDef(opt_arg)) {
        if (goog.isObject(opt_arg)) {
            ol.base.checkKeys(opt_arg, ['map', 'anchor', 'placement', 'content', 'template']);
            map = ol.API ? opt_arg['map'] : opt_arg.map;
            anchor = ol.API ? opt_arg['anchor'] : opt_arg.anchor;
            placement = ol.API ? opt_arg['placement'] : opt_arg.placement;
            content = ol.API ? opt_arg['content'] : opt_arg.content;
            template = ol.API ? opt_arg['template'] : opt_arg.template;
        }
    }

    var popup = new ol.Popup(map, anchor);
    
    if (goog.isDef(anchor)) {
        popup.setAnchor(anchor);
    }
    if (goog.isDef(placement)) {
        popup.setPlacement(placement);
    }
    if (goog.isDef(content)) {
        popup.setContent(content);
    }
    if (goog.isDef(template)) {
        popup.setTemplate(template);
    }
    
    return popup;
    
};


/**
 * @export
 * @param {ol.Loc|ol.Feature=} opt_arg a feature or a location.
 * @return {ol.Popup|ol.Feature|ol.Loc|undefined} Result.
 */
ol.Popup.prototype.anchor = function(opt_arg){
    if (arguments.length == 1 && goog.isDef(opt_arg)) {
        this.setAnchor(opt_arg);
        return this;
    }
    else {
        return this.getAnchor();
    }
};


/**
 * @export
 * @param {ol.Map=} opt_arg the map .
 * @return {ol.Popup|ol.Map|undefined} the map or the popup.
 */
ol.Popup.prototype.map = function(opt_arg){
    if (arguments.length == 1 && goog.isDef(opt_arg)) {
        this.setMap(opt_arg);
        return this;
    }
    else {
        return this.getMap();
    }
};

/**
 * @export
 * @param {string=} opt_arg the content for the map (HTML makrkup)
 * @return {ol.Popup|string|undefined} the content or the popup.
 */
ol.Popup.prototype.content = function(opt_arg){
    if (arguments.length == 1 && goog.isDef(opt_arg)) {
        this.setContent(opt_arg);
        return this;
    }
    else {
        return this.getContent();
    }
};

/**
 * @export
 * @param {string=} opt_arg the template to be used to generate the content
 * @return {ol.Popup|string|undefined} the template or the popup.
 */
ol.Popup.prototype.template = function(opt_arg){
    if (arguments.length == 1 && goog.isDef(opt_arg)) {
        this.setTemplate(opt_arg);
        return this;
    }
    else {
        return this.getTemplate();
    }
};

/**
 * Open the popup.
 * @export
 * @param {ol.Feature|ol.Loc} opt_arg feature or location for the anchor
 */
ol.Popup.prototype.open = function(opt_arg) {
    this.doOpen(opt_arg);
};
