/*global jQuery */
(function($) {
    // defines function "blurb" that applies the parameters to each
    // of the matching elements
    $.fn.blurb = function(params) {

        // apply defaults and override with parameters
        params = $.extend({
            max_chars: 140
        }, params);

        // process each element in the selection and return the whole
        // stack for chaining purposes
        return this.each(function() {
            var jblurb = $(this);
            var jtextbox = $(this).find("textarea");
            var jinfobox = $(this).find(".blurbinfo");
            var jcounter = null;

            $(this).data('params', params)

            // =================================================================
            // 	 Attach event handlers
            // =================================================================
            var updater = function ()  {
                jblurb[0].updateInfoBox();
                return true;
            }
            jtextbox.bind("keypress click keyup", updater)
                    .bind("keypress keydown keyup", function (ev) {
                        if (ev.keyCode == 13) {
                            jblurb[0].lockSubmit();
                            return false;
                        }
                    });

            $("button[type=submit]", jblurb).bind("click", function () {
                var par = jblurb.data("params");
                if (jtextbox[0].value.length != 0 && (jtextbox[0].value.length - par['max_chars']) <= 0) {
                    jblurb[0].lockSubmit();
                }
            });

            // =================================================================
            //   API
            // =================================================================
            this.lockSubmit = function () {
                jblurb.blur();
                $("h1 a").focus();
                $.blockUI({ message: null , overlayCSS: { opacity: "0"} });
                jblurb[0].submit();
            };

            this.updateInfoBox = function () {
                var par = jblurb.data("params");
                var nchr = par['max_chars'] - jtextbox[0].value.length;

                if (jtextbox[0].value.length == 0) {
                    this.init();
                } else if (nchr > 0) {
                    if (!jcounter) {
                        jinfobox.html('<span class="blurbCounter">'
                                        + nchr
                                        + '</span>'
                                        + gettext("more characters"));
                        jcounter = jinfobox.find('.blurbCounter');
                    } else {
                        jcounter.text(nchr);
                    }
                } else {
                    if (!jcounter || nchr == -1) {
                        jinfobox.html('<span class="blurbCounter">' + nchr + '</span>'
                                       + gettext("characters")
                                       + '<a href="/add/post/">' + gettext("Add post") + '</a>');
                        jcounter = jinfobox.find('.blurbCounter');
                    } else {
                        jcounter.text(nchr);
                    }
                }
            };

            this.show = function () {
                jblurb.removeClass('minimized');
                jblurb.unbind("click");

                var url = "/services/rest/";
                var data = { method:'people.toggleBlurb',
                             rtype:'json',
                             action:'show',
                             csrfmiddlewaretoken:CSRF_TOKEN
                            };

                $.ajax({
                    type: "POST",
                    url: url,
                    data: data,
                    dataType: "json"
                });
            };

            this.minimize = function () {
                jblurb.addClass('minimized');
                jblurb.unbind('click').bind('click', function () {
                    jblurb[0].show();
                    return false;
                });

                var url = "/services/rest/";
                var data = { method:'people.toggleBlurb',
                             rtype:'json',
                             action:'hide',
                             csrfmiddlewaretoken:CSRF_TOKEN
                            };

                $.ajax({
                    type: "POST",
                    url: url,
                    data: data,
                    dataType: "json"
                });
            };

            this.init = function () {
                jcounter = null;
                jinfobox.html('<a class="closeBlurb" href="#">'
                                    + gettext("Hide")
                                    + '</a>');
                jinfobox.find(".closeBlurb").unbind('click').bind('click', function () {
                    jblurb[0].minimize();
                    return false;
                });
            };


            this.init();
        });
    };
})(jQuery);