var area = [];

$.fn.buildWysiwyg = function () {
    var index = area.length;

    area[index] = document.getElementById(this.attr('id'));

    var panel = $('<ul class="panel" id="panel-' + this.attr('id') + '"></ul>');

    $(this).before(panel);

    $(panel).append('<li><a class="bold" title="жирный"></a></li>');
    $(panel).append('<li><a class="italic" title="курсив"></a></li>');
    $(panel).append('<li class="separator"></li>');
    $(panel).append('<li><a class="aquo" title="обрамить текст елочками"></a></li>');
    $(panel).append('<li><a class="dash" title="вставить тире"></a></li>');
    $(panel).append('<li class="separator"></li>');
    $(panel).append('<li><a class="link" title="вставить ссылку"></a></li>');
    $(panel).append('<li><a class="image" title="вставить изображение"></a></li>');

    $('a.bold', $(panel)).click(function() { $().insertTag(index, '<strong>', '</strong>'); });
    $('a.italic', $(panel)).click(function() { $().insertTag(index, '<em>', '</em>'); });
    $('a.aquo', $(panel)).click(function() { $().insertTag(index, '«', '»'); });
    $('a.dash', $(panel)).click(function() { $().insertTag(index, '—', ''); });

    $('a.link', $(panel)).click(function() {
        $.get('/aux/add-article-link', function (data) {
            $.modalWindow(data, {
                opacity: 0.2, overlay: true, header: true, footer: false, movable: false
            });

            Cufon.replace('#modal-window .cufon', {hover: true});

            $('#modal-window').bind('submit', function () {
                var href = $('#modal-window #href').val();
                var html = $('#modal-window #html').val();

				if ('' !== href && '' !== html) {
	                $(area[index]).focus();

	                $().insertTag(index, '<a href="' + href + '" title="' + html + '">' + html + '</a>', '', true);					
				}

                $(document).trigger('modal-window.close');

                return false;
            });
        }, 'json');
    });

    $('a.image', $(panel)).click(function() {
        $.get('/aux/add-article-image', function (data) {
			$.modalWindow(data, {
				opacity: 0.2, overlay: true, header: true, footer: false, movable: false
			});

			$('#modal-window form').submit(function () {
				$(this).ajaxUpload(function (data, status) {
					$(area[index]).focus();

	                $().insertTag(index, '<img src="' + data.image + '" width="' + data.width + '" height="' + data.height + '" alt="image" />', '', true);
	
					$(document).trigger('modal-window.close');
				});
				
				return false;
			});

			Cufon.replace('#modal-window .cufon', {hover: true});
        }, 'json');
    });
};

$.fn.ajaxUpload = function (callback) {
	$.ajaxFileUpload({
		url: $(this).attr('action'), 
		secureuri: false,
		fileElementId: 'upload-image',
		dataType: 'json',
		success: callback,
		error: function (data, status, e) {
			alert(e);
		}
	});

	return false;
};

$.fn.insertTag = function(index, tagOpen, tagClose, replace) {
    var textarea = area[index];

    if ('undefined' != parent.document.body.scrollTop) {
        var x = parent.document.body.scrollLeft;
        var y = parent.document.body.scrollTop;
    }

    if ('undefined' != typeof(textarea.caretPos) && textarea.createTextRange) {
        var caretPos = textarea.caretPos;
        var temp_length = caretPos.text.length;

        caretPos.text = caretPos.text.charAt(caretPos.text.length - 1) == ' '
                      ? tagOpen + ((typeof replace == 'undefined') ? caretPos.text : '') + tagClose + ' '
                      : tagOpen + ((typeof replace == 'undefined') ? caretPos.text : '') + tagClose;

        if (temp_length == 0) {
            caretPos.moveStart('character', -tagClose.length);
            caretPos.moveEnd('character', -tagClose.length);
            caretPos.select();
        } else {
            textarea.focus(caretPos);
        }
    } else if ('undefined' != typeof(textarea.selectionStart)) {
        var begin = textarea.value.substr(0, textarea.selectionStart);
        var selection = textarea.value.substr(
            textarea.selectionStart,
            textarea.selectionEnd - textarea.selectionStart
        );
        var end = textarea.value.substr(textarea.selectionEnd);
        var newCursorPos = textarea.selectionStart;
        var scrollPos = textarea.scrollTop;

        textarea.value = begin + tagOpen + ((typeof replace == 'undefined') ? selection : '') + tagClose + end;

        if (textarea.setSelectionRange) {
            if (selection.length == 0) {
                textarea.setSelectionRange(
                    newCursorPos + tagOpen.length, newCursorPos + tagOpen.length
                );
            } else {
                textarea.setSelectionRange(
                    newCursorPos,
                    newCursorPos + tagOpen.length + selection.length + tagClose.length
                );
            }

            textarea.focus();
        }

        textarea.scrollTop = scrollPos;
    } else {
        textarea.value += tagOpen + tagClose;
        textarea.focus(textarea.value.length - 1);
    }

    if ('undefined' != parent.document.body.scrollTop && parent.scrollTo) {
        if (y != parent.document.body.scrollTop) {
            parent.scrollTo(x, y);
        }
    }
};
