window.cmu = window.cmu || {};
window.cmu.hijack = window.cmu.hijack || {};

(function (ns) {
    var my = {};
    my.logger = gj.logging.getLogger('cmu.hijack');

    ns.handlers = {
        genericRedirect: function (e) {
            var href = $(this).attr('href');
            var redirectMatch = cmu.redirect.getMatch(href);

            if (redirectMatch) {
                my.logger.info('Hijacked link to "' + href + '", redirecting to "' + redirectMatch + '"');
                e.preventDefault();
                window.location.href = redirectMatch;
            }
        },
        addToSet: function (e) {
            var url = $(this).attr('href');

            cmu.communicationController.ajax({
                url: url,
                type: 'GET',
                success: function (data, status, xhr) {
                    var $data = $(data);
                    cmu._modalWindow.open();
                    cmu._modalWindow.setContent($data);

                    cmu.setCreationForm({
                        viewNode: $data.find('form')
                    });
                }
            });
            e.preventDefault();
        }
    };

    // TODO (yvdm): consider changing order of arguments
    ns.click = function (handler, selector, scope, extraHandler) {
        my.logger.debug('click()');
        scope = scope || this;
        var $elements  = scope.find(selector);

        my.logger.info('Hijacking clicks', $elements, scope);

        $elements.click(function (e) {
            ns.handlers[handler].apply(this, arguments);

            if (extraHandler) {
                extraHandler.apply(this);
            }
        });
    };

    ns.linkCallback = function (selector, scope, callback) {
        scope = scope || this;

        var $elements = scope.find(selector);

        $elements.click(function () {
            var url = $(this).attr('href');

            if (callback) {
                callback.apply(this, [url]);
            }
            return false;
        });
    };

})(window.cmu.hijack);


