/**
 * YAHOO.gaia.widget.ItemTooltip
 * Creates a tooltip that displays item information
 *
 * Sample usage:
 * var foo = new YAHOO.gaia.widget.Tooltips.Item(item_id, is_unique);
 * foo.show();
 *
 * @author Karen <kziv@gaiaonline.com>
 **/
(function() {

    var Event = YAHOO.util.Event;
    var Dom   = YAHOO.util.Dom;

    YAHOO.namespace('gaia.util');

    /**
     * @param {obj} Object literal of config data
     * - hd {str} 
     * - bd {str}
     * - ft {str}
     * - gapi {str} URL of an optional GAPI call to populate data from
     * - id {str} default ID to assign to the panel
     **/
    YAHOO.gaia.util.Tooltip = function(oConfig) {
        if (!oConfig) { return; }

        /**
         * @param {int} ID of item to get info for
         * @param {str|el} Element to attach tooltip to
         * @param {obj} (optional) Config parameters
         **/
        var tooltip = function(id, user_id, el, oUserConfig) {
            var oUserConfig = oUserConfig || {};
            
            // If the user hasn't passed in an ID to assign the panel, 
            // use the default for this type of object. If no default was
            // set, make one up
            var panel_id = oUserConfig.id || oConfig.id;
            if (!panel_id) {
                panel_id = Dom.generateId();
            }
            
            // TODO : allow many panels
            if (!this.panel) {
                this.panel = new YAHOO.widget.Panel(panel_id, {context: [el, 'tl', 'tr'],
								//width:'200px',
								//height: '100px',
								width: 'auto',
								height: 'auto',
								close: false,
								draggable:false});
				this.panel.configzIndex(panel_id,10,this);
            }
            else {
                this.panel.cfg.setProperty('context', [el, 'tl', 'tr']);
            }
            this.panel.setBody('Loading...');

            // Set the tooltip header, body, footer content            
            function setContent(info) {

                // Parses and sets the content for the right section
                function setSection(section, raw_content, data) {
                    
                    var content = '';
                    if (raw_content) {
                        content = raw_content(data);
                        if (!content) {
                            content = '';
                        }
                    }
                    
                    // Set it in the appropriate place
                    switch (section) {
                        case 'hd' : that.panel.setHeader(content); break;
                        case 'bd' : that.panel.setBody(content); break;
                        case 'ft' : that.panel.setFooter(content); break;
                    }
                
                }
                
                var parts = ['hd', 'bd', 'ft'];
                for (var i=0; i<parts.length; i++) {
                    if (oConfig[ parts[i] ]) {
                        setSection(parts[i], oConfig[ parts[i] ], info); 
                    }
                    else {
                        setSection(parts[i], '');
                    }
                }
                
            }
            
            // If there's some data to get, get it
            if (oConfig.gapi) {

                var that = this;
                oConfig.gapi = oConfig.gapi.replace(/badge_id=\d*/, 'badge_id=' + id);
				oConfig.gapi = oConfig.gapi.replace(/item_id=\d*/, 'item_id=' + id);
                oConfig.gapi = oConfig.gapi.replace(/user_id=\d*/, 'user_id=' + user_id);


                // Check for Connection Manager
                if (!YAHOO.util.Connect) {
                    return false;
                }
        
                // Load the item data from GAPI
                YAHOO.util.Connect.asyncRequest('GET', oConfig.gapi, {
                    failure: function(o) {
                        alert('failure');
                    },
                    success: function(o) {
                        var loader = new YAHOO.util.YUILoader({
                            require: ['json'],
                            onSuccess: function() {

                                try {
                                    setContent(YAHOO.lang.JSON.parse(o.responseText));
                                }
                                catch (e) {
									/*alert(o.responseText);*/
                                    this.failure();
                                    return;
                                }

                            },
                            onFailure: function() {
                                this.failure();
                            }
                        });
                        loader.insert();
                    }

                   
                });

                
            }
            else {
                setContent();
            }
            
            // Create the panel
            this.panel.render(document.body);
            Dom.addClass(panel_id, 'toolPanel');
            Dom.addClass(panel_id, 'tooltipLeftTop');
            if (oConfig.extraClass) {
                if (typeof(oConfig.extraClass) == 'string') {
                    Dom.addClass(panel_id, oConfig.extraClass);
                }
                else {
                    for (var i=0; i<oConfig.extraClass.length; i++) {
                        Dom.addClass(panel_id, oConfig.extraClass[i]);
                    }
                }
            }
            YAHOO.util.Get.css('http://' + GAIA_config('graphics_server') + '/src/yui/gaia/widgets/tooltip/tooltip.css');
            
            var close_btn_id = 'tooltip-close-' + panel_id;
            if (!Dom.get(close_btn_id)) {
                var btn_close = document.createElement('div');
                btn_close.setAttribute('id', close_btn_id);
                Dom.addClass(btn_close, 'closer');
                Dom.get(panel_id).appendChild(btn_close);
            }
            Event.addListener(close_btn_id, 'click', this.hide, this, true);            

        };

        tooltip.prototype.show = function() {
            this.panel.show();
        }
        tooltip.prototype.hide = function() {
            this.panel.hide();
        }

        return tooltip;
        
    };


    /* ==================================================================
       TOOLTIPS
       ================================================================== */
    
    YAHOO.namespace('gaia.widget.Tooltips');

    /**
     * Item tooltip
     **/
    YAHOO.gaia.widget.Tooltips.Item = YAHOO.gaia.util.Tooltip({
        gapi  : '/gapi/rest/items/getinfo?item_id=&user_id=',
        extraClass : 'itemdetails',            
        id    : 'tooltip-itemdetail',
        hd    : function(data) {
            return data.name;
        },
        bd   : function(data) {
            var itemdetailstr = '<h4>' + data.name + '</h4>'
                + '<img src="' + data.img + '" />'
                + '<div><em>Description</em>: ' + data.description;
			if ( data.store_name ) itemdetailstr += '<br /><em>Purchased At</em>: <a href="' + data.store_url + '">' + data.store_name + '</a>';
			itemdetailstr += '</div>';
			
			return itemdetailstr;
        }
    });

    /**
     * Badge tooltip
     **/
    YAHOO.gaia.widget.Tooltips.Badge = YAHOO.gaia.util.Tooltip({
        gapi  : '/gapi/rest/users/getbadge?badge_id=&user_id=',
        extraClass : 'badge',
        id    : 'tooltip-badge',
        bd    : function(data) {
            return '<h4>' + data.name + '</h4>'
                + '<img src="' + data.img + '" />'
                + '<span><em>Acquired</em>: ' + data.date_earned + '<br />'
                + '<em>Description</em>: ' + data.description + '</span>';
        }
    });

    /**
     * User tooltip
     **/
    /*
    YAHOO.gaia.widget.Tooltips.User = YAHOO.gaia.util.Tooltip({
        gapi : '/gapi/rest/users/getinfo?user_id={id}',
        id   : 'foo',
        hd   : function(data) {
            return data.item_name;
        },
        bd   : function(data) {}
    });
    */
})(); 
