$.each(listOfModifiers, function (index, value) {
     fakeDivCssStyles += value + ':' + Util.getCssStyleValue(el, value) + ';';
 });
    exports.getPositionCoordinates = function (el, position, correctOptions) {
        var range = null,
            rects = null,
            selectionPosition = null,
            rect = null,

            isTextarea = el.tagName.toLowerCase() === 'textarea',
            isContentEditable = Util.isContentEditableElement(el),
            offset = Util.getOffsetPosition(el);

        //NOTE: we don't create fake div element for contentEditable elements
        //because we can get the selection dimensions directly
        if (isContentEditable) {
            range = Util.findDocument(el).createRange();
            selectionPosition = ContentEditableHelper.calculateNodeAndOffsetByPosition(el, position);

            range.setStart(selectionPosition.node, Math.min(selectionPosition.offset, selectionPosition.node.length));
            range.setEnd(selectionPosition.node, Math.min(selectionPosition.offset, selectionPosition.node.length));
            rect = range.getClientRects()[0];

            return rect ? correctRectangle(rect, correctOptions) : null;
        }

        //NOTE: for IE
        if (typeof el.createTextRange === "function") {
            range = el.createTextRange();
            range.collapse(true);
            range.moveStart('character', position);
            range.moveEnd('character', position);
            range.collapse(true);
            rect = range.getBoundingClientRect();

            return rect ? correctRectangle(rect, correctOptions) : null;
        }

        var $body = $(document).find('body'),
            bodyMargin = Util.getElementMargin($body),
            bodyLeft = null,
            bodyTop = null,
            elementMargin = Util.getElementMargin($(el)),
            elementTop = offset.top - elementMargin.top,
            elementLeft = offset.left - elementMargin.left,
            width = el.scrollWidth,

            $fakeDiv = $('<div></div>'),
            fakeDivCssStyles = 'white-space:pre-wrap;border-style:solid;',
            listOfModifiers = ['direction', 'font-family', 'font-size', 'font-size-adjust', 'font-variant', 'font-weight', 'font-style', 'letter-spacing', 'line-height', 'text-align', 'text-indent', 'text-transform', 'word-wrap', 'word-spacing', 'padding-top', 'padding-left', 'padding-right', 'padding-bottom', 'margin-top', 'margin-left', 'margin-right', 'margin-bottom', 'border-top-width', 'border-left-width', 'border-right-width', 'border-bottom-width'];

        if (Util.getCssStyleValue($body[0], 'position') === 'absolute') {
            elementLeft -= bodyMargin.left;
            elementTop -= bodyMargin.top;
            bodyLeft = Util.getCssStyleValue($body[0], 'left');

            if (bodyLeft !== 'auto')
                elementLeft -= parseInt(bodyLeft.replace('px', ''));

            bodyTop = Util.getCssStyleValue($body[0], 'top');

            if (bodyTop !== 'auto')
                elementTop -= parseInt(bodyTop.replace('px', ''));
        }

        $.each(listOfModifiers, function (index, value) {
            fakeDivCssStyles += value + ':' + Util.getCssStyleValue(el, value) + ';';
        });

        $fakeDiv.appendTo($body);

        try {
            $fakeDiv.css({
                cssText: fakeDivCssStyles,
                position: 'absolute',
                top: elementTop,
                left: elementLeft,
                width: width,
                height: el.scrollHeight
            });

            $fakeDiv[0].textContent = !el.value.length ? ' ' : el.value;

            range = document.createRange(); //B254723
            range.setStart($fakeDiv[0].firstChild, Math.min(position, el.value.length));
            range.setEnd($fakeDiv[0].firstChild, Math.min(position, el.value.length));

            if (isTextarea) {
                rects = range.getClientRects();
                rect = range.getBoundingClientRect();

                if (rect.width === 0 && rect.height === 0)
                    rect = rects[0];
            } else
                rect = range.getClientRects()[0];

            $fakeDiv.remove();
        } catch (err) {
            $fakeDiv.remove();

            return {};
        }

        return rect ? correctRectangle(rect, correctOptions) : null;
    };