(function($) {
    $.fn.Editor = function (options) {

        var settings = $.extend({
            onResize : function() {
            },
            animate : true,
            animateDuration : 200,
            animateCallback : function() {
            },
            extraSpace : 20,
            limit: 1000
        }, options);

        var self = this;


        var dialog = $("<div class='editor-dialog'><form><fieldset class='normal-form'><input type='text' class='editor-dialog-autocomplete' style='width: 270px;'/></fieldset></form></div>");
        dialog.appendTo($("body"));
        dialog.dialog({
                    modal:false,
                    autoOpen:false,
                    height:85,
                    title:"Wstaw miejsce",
                    close: function (event, ui) {
                        $(".editor-dialog-autocomplete").autocomplete( "option", "disabled", true );
                        self.restoreSelection(false);
                        $(".editor-tmp-link").remove();
                        $(".editor-dialog-autocomplete").val('');
                    },
                    open: function (event, ui) {
                        $(".editor-dialog-autocomplete").autocomplete( "option", "disabled", false);
                    }
                });

        var dialogSearch = new SearchBox({
                    el: $(".editor-dialog-autocomplete", dialog),
                    url: options.url,
                    appendTo: document.body,
                    minLength: 2,
                    action_handler: function(action, item) {
                        switch (action) {
                            case 'found':
                                var html = "<a href='/" + item.value + "/'>" + item.item.name + "</a>";
                                $(".editor-tmp-link", self).replaceWith(html).next().focus();
                                break;
                            default:
                                $(".editor-tmp-link", self).remove();
                                break;
                        }
                        dialog.dialog("close");
                        self.restoreSelection(true);
                    },
                    not_found_handler: function (search) {
                        return [
                            {label: '<li>Nie znaleziono. </li>', value:search,  action:'not_found', 'img': ''}
                        ];
                    },
                    render: function (ul, item) {
                        return $("<li></li>")
                                .data("item.autocomplete", item)
                                .append("<a class='search-row'><div class='media'><img class='img' src='" + item.img + "'><div class='bd'><p>" + item.label + "</p></div></div></a>")
                                .appendTo(ul);
                    }
                });


        var submitButton = $(options.submitButton);
        submitButton.button({disabled:true});

        this.data("editor", {
                    submitButton: submitButton,
                    dialog: dialog,
                    search: dialogSearch,
                    range : null
                });

        self.css({resize:'none','overflow-y':'hidden'});

        var origHeight = self.height();
        var clone = (function() {
            // Properties which may effect space taken up by chracters:
            var props = ['height','width','lineHeight','textDecoration','letterSpacing'],
                    propOb = {};

            // Create object of styles to apply:
            $.each(props, function(i, prop) {
                propOb[prop] = self.css(prop);
            });

            // Clone the actual textarea removing unique properties
            // and insert before original textarea:
            return self.clone().removeAttr('id').removeAttr('name').css({
                        position: 'absolute',
                        top: 0,
                        left: -9999
                    }).css(propOb).attr('tabIndex', '-1').insertBefore(self);

        })();
        var lastScrollTop = null;
        $.extend(this, {
                    onKeyDown: function (event) {
                        if (event.keyCode == "50" && event.shiftKey) {
                            event.preventDefault();
                            var editorData = $(this).data("editor");
                            editorData.range = self.saveSelection();
                            $(this).data("editor", editorData);
                            self.insertHtml("<a href='#' class='editor-tmp-link'>?</a>");
                            self.onAtPress(event);
                        } else if (event.keyCode == "13" && !event.shiftKey) {
                            //event.preventDefault();
                            //this.onEnterPress(event);
                        }
                    },
                    onEnterPress: function (event) {

                    },
                    onAtPress: function (event) {
                        dialog.dialog("open").dialog("widget").position({
                                    of: $(".editor-tmp-link", self),
                                    my: "left top",
                                    at: "right bottom",
                                    offset: "0 0"
                                });
                    },
                    onFocus: function () {
                        var data = $(this).data("editor");
                        self.stopTime("check-if-can-submit");
                        self.everyTime(100, 'check-if-can-submit', function () {
                            if (self.stripTags(self.html()).length > 0) {
                                data.submitButton.button("enable");
                            } else {
                                data.submitButton.button("disable");
                            }
                        });
                    },
                    onBlur: function () {
                        self.stopTime("check-if-can-submit");
                        self.html(self.html().replace(/<meta[^>]*>/ig, ""));

                    },
                    stripTags:function (html) {
                        return html.replace(/(<([^>]+)>)/ig, "");
                    },
                    insertHtml: function (html) {
                        var range;
                        if (window.getSelection && window.getSelection().getRangeAt) {
                            range = window.getSelection().getRangeAt(0);
                            var node = range.createContextualFragment(html);
                            range.insertNode(node);

                        } else if (document.selection && document.selection.createRange) {
                            range = document.selection.createRange();
                            range.pasteHTML(html);
                        }
                    },
                    saveSelection: function() {
                        if (window.getSelection) {
                            var sel = window.getSelection();
                            if (sel.getRangeAt && sel.rangeCount) {
                                return sel.getRangeAt(0);
                            }
                        } else if (document.selection && document.selection.createRange) {
                            return document.selection.createRange();
                        }
                        return null;
                    },
                    restoreSelection: function (nextNode) {
                        var editorData = $(this).data("editor");
                        var range = editorData.range;
                        if (range) {
                            if (window.getSelection) {
                                var sel = window.getSelection();
                                sel.removeAllRanges();
                                if (nextNode) {
                                    var startNode = range.startContainer.nextSibling;
                                    range.setStartAfter(startNode, 0);
                                    editorData.range = range;
                                    $(this).data("editor", editorData);
                                }
                                sel.addRange(range);
                            } else if (document.selection && range.select) {
                                //TODO: for IE handle moving the selection after the inserted link
                                range.select();
                            }
                        }
                    },
                    updateSize: function() {
                        // Prepare the clone:
                        clone.height(0).html($(this).html()).scrollTop(10000);

                        // Find the height of text:
                        var scrollTop = Math.max(clone.scrollTop(), origHeight) + settings.extraSpace,
                                toChange = $(this).add(clone);

                        // Don't do anything if scrollTip hasen't changed:
                        if (lastScrollTop === scrollTop) {
                            return;
                        }
                        lastScrollTop = scrollTop;

                        // Check for limit:
                        if (scrollTop >= options.limit) {
                            $(this).css('overflow-y', '');
                            return;
                        }
                        settings.animate ?
                            toChange.stop().animate({height:scrollTop}, settings.animateDuration, settings.animateCallback)
                        :   toChange.height(scrollTop);



                    }

                });
        this.focus(this.onFocus);
        this.blur(this.onBlur);
        this.keydown(this.onKeyDown);

        this.unbind('.dynSiz')
                .bind('keyup.dynSiz', this.updateSize)
                .bind('keydown.dynSiz', this.updateSize)
                .bind('change.dynSiz', this.updateSize);

    };
})(jQuery);


