private Point InternalGetPosition(IHTMLElement relativeTo)
            {
                var a = GetPositionData.Of(relativeTo);
                var b = GetPositionData.Of(Internal_Element);

                // top elements might be the same so we remove them
                var loop = true;

                while (loop)
                {
                    loop = false;

                    if (a.Count > 0)
                    {
                        if (b.Count > 0)
                        {
                            if (a[a.Count - 1].Element == b[b.Count - 1].Element)
                            {
                                a.RemoveAt(a.Count - 1);
                                b.RemoveAt(b.Count - 1);

                                loop = true;
                            }
                        }
                    }
                }

                var x = 0;
                var y = 0;

                if (a.Count > 0)
                {
                    var a_ = a[a.Count - 1];

                    x += a_.X;
                    y += a_.Y;
                }

                if (b.Count > 0)
                {
                    var b_ = b[b.Count - 1];

                    x += b_.X;
                    y += b_.Y;
                }

                return(new Point
                {
                    X = Internal_OffsetX + x,
                    Y = Internal_OffsetY + y
                });
            }
        public TouchPoint GetTouchPoint(IInputElement relativeTo)
        {
            __IInputElement _relativeTo = (__IInputElement)(object)relativeTo;

            #region magic, yet works

            var pp = new Point(0, 0);

            if (this.InternalValue != null)
            {
                pp.X = this.InternalValue.pageX;
                pp.Y = this.InternalValue.pageY;
            }
            ;


            var a = GetPositionData.Of(_relativeTo.InternalGetDisplayObjectDirect());
            var b = GetPositionData.Of(this.InternalElement);


            if (b.Count > 0)
            {
                var item = b.Last();

                pp.X -= item.X;
                pp.Y -= item.Y;
            }


            // top elements might be the same so we remove them
            var loop = true;

            while (loop)
            {
                loop = false;

                if (a.Count > 0)
                {
                    if (b.Count > 0)
                    {
                        if (a[a.Count - 1].Element == b[b.Count - 1].Element)
                        {
                            a.RemoveAt(a.Count - 1);
                            b.RemoveAt(b.Count - 1);

                            loop = true;
                        }
                    }
                }
            }

            if (a.Count > 0)
            {
                var itembb = a.Last();

                pp.X -= itembb.X;
                pp.Y -= itembb.Y;
            }

            if (b.Count > 0)
            {
                var item = b.Last();

                pp.X += item.X;
                pp.Y += item.Y;
            }

            #endregion



            return(new __TouchPoint
            {
                TouchDevice = TouchDevice,
                Position = pp
            });
        }