// requires Prototype.js :(
var QommentsView = Class.create({
    options: {
        logged_in: false,
        moderator: false,
        document_id: 0,
        kind: 0,
        on_load: Prototype.K
    },
    api: null,
    initialize: function(api, view) {
        this.options = Object.extend(this.options, view);
        this.api = api;
    },
    authorizedUser: function() {
        return this.options.logged_in;
    },
    isModerator: function() {
        return this.options.moderator;
    },
    override_view_params: function(params) {
        params['kind'] = this.options['kind'];
        params['document_id'] = this.options['document_id'];
        params['_resource'] = 'comment';
        return params;
    },
    update: function() {
        var params = {};
        switch (typeof(this.options.params)) {
            case 'undefined': break;
            case 'function': params = this.options.params(); break;
            default: params = this.options.params; break;
        }
        params = this.override_view_params(params);
        new Ajax.Request(this.api.getURL(), {
            method: 'get',
            evalJS: true,
            parameters: params,
            onSuccess: this.options.on_load.curry(this)
        });
    },
    put: function(params, callback) {
        var self = this;
        params = this.override_view_params(params);
        new Ajax.Request(this.api.getURL(), {
            method: 'put',
            evalJS: true,
            parameters: params,
            onSuccess: function(data) {
                if (callback && !callback(data)) return;
                self.update();
            }
        });
    },
    remove: function(params) {
        var self = this;
        params = this.override_view_params(params);
        new Ajax.Request(this.api.getURL(), {
            method: 'delete',
            evalJS: false,
            parameters: params,
            onSuccess: function(data) {
                window.location.reload();
            }
        });
    }
});

var QommentsApi = Class.create({
    options: {
        logged_in: false,
        moderator: false,
        document_id: 0,
        kind: 0,
        on_load: Prototype.K
    },
    views: [],
    url: '/dynamic.php',
    initialize: function(options) {
        this.options = Object.extend(this.options, options);
        if (!this.options['view'] || this.options['view'].length == 0)
            throw 'QommentsApi.initialize: No views provided, aborting.';
        else
            this.views = this.options['view'].map(function(v){return new QommentsView(this, Object.extend(Object.clone(this.options), v));}, this);
    },
    getURL: function() {
        return this.url;
    },
    findViews: function(options) {
        return this.views.filter(function(view){
            for (var i in options)
                if (options[i] && view.options[i] != options[i]) return false;
            return true;
        });
    },
    getView: function(num) {
        return this.views[num];
    },
    update: function(options) {
        var views = null;
        if (options != undefined) {
            switch (typeof(options)) {
                case 'number':
                    views = [this.options.getView(options)];
                    break;
                case 'object':
                    views = this.findViews(options);
                    break;
            }
        } else views = this.views;
        if (views && views.length) views.invoke('update');
    }
})


