var fi = fi || {};
fi.models = fi.models || {};
fi.models.YouTube = function() {
    this.init();
};
fi.models.YouTube.prototype = {
    init: function() {
        this.callbacks = [];
        this.videos = [];
    },
    load: function(url) {
        $.get(url, $.proxy(this.onLoad, this));
    },
    onLoad: function(data) {
        var json = data;
        data = jQuery.parseJSON(data);
        if (data == null) {
            data = eval(json);
        }
        data = data.feed.entry;
        for (var i = 0; i < data.length; i++) {
            var video = {};
            video.id = data[i].media$group.yt$videoid.$t;
            video.title = data[i].title.$t;
            video.author = {
                name: data[i].author[0].name.$t,
                link: data[i].author[0].uri.$t
            };
            video.description = data[i].media$group.media$description.$t;
            video.media = {
                thumbs: {},
                duration: data[i].media$group.yt$duration.seconds,
                uploaded: data[i].media$group.yt$uploaded.$t
            };
            var thumbs = data[i].media$group.media$thumbnail;
            for (var t = 0; t < thumbs.length; t++) {
                video.media.thumbs[thumbs[t].yt$name] = {
                    url: thumbs[t].url,
                    height: thumbs[t].height,
                    width: thumbs[t].width,
                    time: thumbs[t].time,
                    name: thumbs[t].yt$name
                };
            }
            video.comments = {
                link: null,
                count: null
            };
            if (data[i].gd$comments) {
                video.comments.link = data[i].gd$comments.gd$feedLink.href;
                video.comments.count = data[i].gd$comments.gd$feedLink.countHint;
            }
            video.rating = {
                average: null,
                max: null,
                min: null,
                numRaters: null
            };
            if (data[i].gd$rating) {
                average: data[i].gd$rating.average;
                max: data[i].gd$rating.max;
                min: data[i].gd$rating.min;
                numRaters: data[i].gd$rating.numRaters;
            }
            data[i].yt$rating = data[i].yt$rating || {
                numLikes: 0,
                numDislikes: 0
            };
            video.likes = {
                numLikes: data[i].yt$rating.numLikes,
                numDislikes: data[i].yt$rating.numDislikes
            };
            data[i].yt$statistics = data[i].yt$statistics || {
                favoriteCount: 0,
                viewCount: 0
            };
            video.statistics = {
                favoriteCount: data[i].yt$statistics.favoriteCount,
                viewCount: data[i].yt$statistics.viewCount
            };
            video.published = data[i].published.$t;
            video.updated = data[i].updated.$t;
            this.videos.push(video);
        }
        for (var i = 0; i < this.callbacks.length; i++) {
            var scope = this.callbacks[i].scope;
            var callback = this.callbacks[i].callback;
            this.callbacks[i].callback(this.videos, scope);
        }
    },
    getYouTubes: function() {
        return this.videos;
    },
    addListener: function(callback, scope) {
        if (this.videos.length == 0) {
            this.callbacks.push({
                callback: callback,
                scope: scope
            });
        } else {
            callback(this.videos, scope);
        }
    }
};
