(function($) {

    $.widget("ui.moogaloop", {
        loaded: false,
        looped: false,
        volumeLevel: 100,
        options: {
            load: function(element) { },
            play: function(element) { },
            pause: function(element) { },
            finish: function(element) { },
            loading: function(element, bytes, percentage) { },
            progress: function(element, seconds) { },
            seek: function(element, seconds) {}},

        _create: function() {
            var i = this;
            var element = this.element;
            var target = this.element.get(0);

            target.addEvent('onLoad', function() {
                target.addEvent('onLoading', function(bytes, percentage) {
                    i.options.loading(element, bytes, percentage);
                });
                target.addEvent('onPlay', function() {i.options.play(element);});
                target.addEvent('onSeek', function(seconds) {
                    i.options.seek(element, seconds);
                });
                target.addEvent('onProgress', function(seconds) {
                    i.options.progress(element, seconds);
                });
                target.addEvent('onPause', function() {i.options.pause(element);});
                target.addEvent('onFinish', function() {i.options.finish(element);});
                i.loaded = true;
                i.options.load(element);
            });
        },

        destroy: function() {$.Widget.prototype.destroy.call(this);},

        _setOption: function(key, value) {
            this.options[key] = value;
        },

        _update: function() {
        },

        isLoaded: function() {
            return this.loaded;
        },

        play: function() {this.element.get(0).api("api_play");},

        pause: function() {this.element.get(0).api("api_pause");},

        color: function(hex) {
            this.element.get(0).api("api_changeColor", hex);
        },

        currentTime: function(completed) {
            var i = this;
            i.element.get(0).get("api_getCurrentTime", function(currentTime) {
                completed(i.element, currentTime);
            });
        },

        duration: function(completed) {
            var i = this;
            i.element.get(0).get("api_getDuration", function(duration) {
                completed(i.element, duration);
            });
        },

        seekTo: function(seconds) {
            this.element.get(0).api("api_seekTo", seconds);
        },

        loop: function(isloop) {
            if (isloop !== undefined) {
                if (isloop == true || isloop == '1') {
                    this.element.get(0).api("api_setLoop", '1');
                    this.looped = true;
                }
                else {
                    this.element.get(0).api("api_setLoop", '0');
                    this.looped = false;
                }
            }
            else {
                return this.looped;
            }
        },

        volume: function(newVolumeLevel) {
            if (newVolumeLevel !== undefined) {
                var intVolumeLevel = parseInt(newVolumeLevel);

                if (intVolumeLevel >= 0 && intVolumeLevel <= 100) {
                    this.element.get(0).api("api_setVolume", newVolumeLevel);
                    this.volumeLevel = newVolumeLevel;
                }
            }
            else {
                return this.volumeLevel;
            }
        },

        unload: function() {this.element.get(0).api("api_unload");}
    });

})(jQuery);
