tinyMCEPopup.requireLangPack();

var SearchReplaceDialog = {
    init: function (ed) {
        var t = this, f = document.forms[0], m = tinyMCEPopup.getWindowArg("mode");

        t.switchMode(m);

        f[m + '_panel_searchstring'].value = tinyMCEPopup.getWindowArg("search_string");

        // Focus input field
        f[m + '_panel_searchstring'].focus();

        mcTabs.onChange.add(function (tab_id, panel_id) {
            t.switchMode(tab_id.substring(0, tab_id.indexOf('_')));
        });
    },

    switchMode: function (m) {
        var f, lm = this.lastMode;

        if (lm != m) {
            f = document.forms[0];

            if (lm) {
                f[m + '_panel_searchstring'].value = f[lm + '_panel_searchstring'].value;
                f[m + '_panel_backwardsu'].checked = f[lm + '_panel_backwardsu'].checked;
                f[m + '_panel_backwardsd'].checked = f[lm + '_panel_backwardsd'].checked;
                f[m + '_panel_casesensitivebox'].checked = f[lm + '_panel_casesensitivebox'].checked;
            }

            mcTabs.displayTab(m + '_tab', m + '_panel');
            document.getElementById("replaceBtn").style.display = (m == "replace") ? "inline" : "none";
            document.getElementById("replaceAllBtn").style.display = (m == "replace") ? "inline" : "none";
            this.lastMode = m;
        }
    },

    searchNext: function (a) {
        var ed = tinyMCEPopup.editor, se = ed.selection, r = se.getRng(), f, m = this.lastMode, s, b, fl = 0, w = ed.getWin(), wm = ed.windowManager, fo = 0;

        // Get input
        f = document.forms[0];
        s = f[m + '_panel_searchstring'].value;
        b = f[m + '_panel_backwardsu'].checked;
        ca = f[m + '_panel_casesensitivebox'].checked;
        rs = f['replace_panel_replacestring'].value;

        if (tinymce.isIE) {
            r = ed.getDoc().selection.createRange();
        }

        if (s == '')
            return;

        function fix() {
            // Correct Firefox graphics glitches
            r = se.getRng().cloneRange();
            ed.getDoc().execCommand('SelectAll', false, null);
            se.setRng(r);
        };

        function replace() {
            ed.selection.setContent(rs); // Needs to be duplicated due to selection bug in IE
        };

        // IE flags
        if (ca)
            fl = fl | 4;

        switch (a) {
            case 'all':
                // Move caret to beginning of text
                ed.execCommand('SelectAll');
                ed.selection.collapse(true);

                if (tinymce.isIE) {
                    ed.focus();
                    r = ed.getDoc().selection.createRange();

                    while (r.findText(s, b ? -1 : 1, fl)) {
                        r.scrollIntoView();
                        r.select();
                        replace();
                        fo = 1;

                        if (b) {
                            r.moveEnd("character", -(rs.length)); // Otherwise will loop forever
                        }
                    }

                    tinyMCEPopup.storeSelection();
                } else {
                    while (w.find(s, ca, b, false, false, false, false)) {
                        replace();
                        fo = 1;
                    }
                }

                if (fo)
                    tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.allreplaced'));
                else
                    tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));

                return;

            case 'current':
                if (!ed.selection.isCollapsed())
                    replace();

                break;
        }

        se.collapse(b);
        r = se.getRng();

        // Whats the point
        if (!s)
            return;

        if (tinymce.isIE) {
            ed.focus();
            r = ed.getDoc().selection.createRange();

            if (r.findText(s, b ? -1 : 1, fl)) {
                r.scrollIntoView();
                r.select();
            } else
                tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));

            tinyMCEPopup.storeSelection();
        } else {
            if (!w.find(s, ca, b, false, false, false, false))
                tinyMCEPopup.alert(ed.getLang('searchreplace_dlg.notfound'));
            else
                fix();
        }
    }
};

tinyMCEPopup.onInit.add(SearchReplaceDialog.init, SearchReplaceDialog);
