(function($) {
    $.extend({
        oembed: function(obj, options) {
            var settings = $.extend({
                'source' : 'http://oembed.cornhooves.org/oembed/',
                'maxwidth' : null,
                'maxheight' : null,
                'iframe' : true,
                'className' : null
            }, options);
            
            var url = $(obj).attr("href");
            var jsonurl = settings.source + "?url=" + escape(url);
            if(settings['maxwidth'] != null)
                jsonurl += '&maxwidth=' + settings['maxwidth'];
            if(settings['maxheight'] != null)
                jsonurl += '&maxheight=' + settings['maxheight'];
            jsonurl += "&callback=?";
            
            $.getJSON(jsonurl,
                function(data) {
                    var fragment = false;
                    if(data.type == "photo") {
                        var img = $("<img/>").attr("src", data.url).attr("alt", "embed");
                        fragment = $("<a/>").attr("href", url).append(img);
                    } else if(data.type == "video" || data.type == "rich") {
                        if(settings.iframe) {
                            fragment = $("<iframe frameBorder='0' scrolling='no' marginheight='0' marginwidth='0' seamless='true' allowfullscreen></iframe>");
                             if(data.width)
                                fragment.attr("width", data.width);
                            if(data.height)
                                fragment.attr("height", data.height);
                            fragment.load(function() {
                                var body = $(this).contents().find("body");
                                body.html(data.html);
                                if(body.children().length == 1 && body.children("iframe").length == 1) {
                                    fragment.replaceWith(body.children());
                                }
                            });
                        } else {
                            if(data.html.match(/^</)) {
                                fragment = $(data.html);
                            } else {
                                fragment = $("<div/>").html(data.html);
                            }
                        }
                    } else if(data.type == "link") {
                        fragment = $("<a/>");
                        
                        if(typeof(data.url) != "undefined") {
                            fragment.attr("href", data.url);
                        } else {
                            fragment.attr("href", url);
                        }
                        if(typeof(data.title) != "undefined") {
                            fragment.append(document.createTextNode(data.title));
                        } else {
                            fragment.append(document.createTextNode(url));
                        }
                    }

                    if(fragment) {
                        if(settings.className)
                            $(fragment).addClass(settings.className)
                                       .addClass(settings.className+"-"+data.type);
                        $(obj).replaceWith(fragment);
                    }
                }
            ); /* end of json call */
        }
    });

    $.fn.extend({
        oembed: function(options) {
            return this.each(function(i, v) {
                $.oembed(v, options);
            });
        }
    });
})( jQuery );

