(function($){

$.fn.spWidget = function(options) {
    var defaults = {
    };

    options = $.extend(defaults, options);

    return this.not('.sp-widget-registered').each(function() {
        var strip = "sp-widget-";
        var id = $(this).attr('id').substr(strip.length);
        var type = null;
        var widget = $(this);

        widget.data("widget", {});

        // find widget type from class sp-widget-{type}
        var classes = $(this).attr('class').split(/[ ]+/);
        for (x in classes) {
            var cl = classes[x];
            if (cl != "sp-widget-wrapper" && /^sp-widget-/.test(cl)) {
                type = cl.substr(10);
                break;
            }
        }

        widget.data("widget")["type"] = type;

        log("Registering widget: " + type + " [" + id + "]");

        // register each control
        $('.sp-widget-control-wrapper', this).each(function() {
            var classes = $(this).attr('class').split(/[ ]+/);
            var find = "sp-widget-" + type + "-";
            var control = null;
            for (x in classes) {
                var cl = classes[x];
                if (cl.substr(0, find.length) == find) {
                    control = cl.substr(find.length);
                    break;
                }
            }
            
            if (control == null) {
                return;
            }

            log("  Control: " + control);

            var control_obj = this;

            $(this).click(function() {
                shiftpress.widgetapi(widget, control, {});
            });
        });

        $(this).addClass('sp-widget-registered').trigger('registered');
    });
};

var _apinum = 0;

shiftpress.widgetapi = function($widget, control, data) {
    var id = $widget.attr('id').replace(/^sp-widget-/, '');

    var apinum = _apinum++;

    log("WidgetAPI-" + apinum + ": Control activated: " + id + "/" + control);

    var $container = $widget.parents(".sp-container-wrapper").first();
    var thecontrol = control;

    if (/\[.*\]$/.test(thecontrol)) {
        var value = thecontrol.replace(/^.*\[/, '').replace(/\]$/, '');
        thecontrol = thecontrol.replace(/\[.*\]$/, '');
        $widget.data("widget")[thecontrol] = value;
    }

    data = $.extend($widget.data("widget"), data, {
        action: 'widget_control',
        id: id,
        control: thecontrol,
        container_id: $container.attr('id').replace(/^sp-container-/, '')
    });
    delete data.data;

    $.ajax({
        url: ajaxurl,
        data: data,
        success: function(data, result, xhdr) {
            log("WidgetAPI-" + apinum + ": Control data received: " + id + "/" + control);

            $widget.data("widget", $.extend($widget.data("widget"), data));
            $widget.trigger('update', [ $widget.data("widget")["type"], control ]);
        },
        error: function(xhdr, result, error) {
            log("  Control error: " + result);
        },
        dataType:'json'
    });

};

})(jQuery);

