function scrollableEditor(h,g){var e=h.css(),t=h.width(),l=null,m=[],u=[],p=[],n={display:"block",position:"absolute",left:"-99999px",top:"-99999px"},r=$("
").appendTo(document.body),c=!1;for(var o in e)o.match(/^(direction|font-family|font-size|font-style|font-weight|letter-spacing|line-height|text-align|vertical-align|white-space|word-wrap|word-break|word-spacing)$/i)&&(n[o]=e[o]);function a(e){var t=h.val().split("\n"),n=0;r.width(h.width()),u=[];for(var o=0;o=f[0]&&l[1]<=f[1]){var u=p[s+1]?p[s+1][2]:g.get(0).scrollHeight,i=(0==c?0:f[2])+(u-f[2])*a;g.scrollTop(i);break}}}else for(var f,d=0;d=(f=p[d])[0]&&e<=f[1]){(d==p.length-1||f[2]r+g.height())&&g.scrollTop(f[2]);break}}}function s(e){var t=$(e),n=t.parent();return 0=i[0]&&o<=i[1]){s(l).removeClass("focus"),s(i[3]).addClass("focus"),l=i[3],r=o;break}}return r}return r.css(n),r.css("min-height",n["line-height"]),setInterval(function(){h.width()!=t&&(t=h.width(),h.trigger("resize"))},150),h.on("touch keypress click",f),h.on("focus",function(){c=!0}).on("blur",function(){c=!1,s(l).removeClass("focus")}),h.on("resize",a),h.on("DOMMouseScroll mousewheel touchmove",function(){i()}),g.on("DOMMouseScroll mousewheel touchmove",function(){!function(){var e,t=h.height(),n=(h.innerHeight()-t)/2,o=g.scrollTop(),r=!1;if(!(p.length<=0)){for(var a=0;a').insertAfter(this),r=0,a=s.minHeight,n=this;function i(e){var t=c(e).y,n=o+t;return t<=r&&(n-=5),r=t,n=Math.max(a,n),textarea.height(n+"px"),n |
').insertAfter(e),"tfoot"!=(o=$("tr:last",this)).parent().prop("tagName").toLowerCase()&&(a=(r=$("td",o)).height(),r.height(a-n.outerHeight())))}),c(document).bind("mousemove",c.tableDnD.mousemove).bind("mouseup",c.tableDnD.mouseup),this},makeDraggable:function(t){for(var e=t.rows,n=t.tableDnDConfig,o=0;oc.tableDnD.oldY,c.tableDnD.oldY=i,r.onDragClass?o.addClass(r.onDragClass):o.css(r.onDragStyle),(n=c.tableDnD.findDropTargetRow(o,i))&&(t&&c.tableDnD.dragObject!=n?c.tableDnD.dragObject.parentNode.insertBefore(c.tableDnD.dragObject,n.nextSibling):t||c.tableDnD.dragObject==n||c.tableDnD.dragObject.parentNode.insertBefore(c.tableDnD.dragObject,n))),!1}},findDropTargetRow:function(e,t){for(var n=c.tableDnD.currentTable.rows,o=0;on.length)break}else l[r]===n.charAt(pos)&&r!==m&&(pos++,o=r);return e?f():o+1