").attr({id:i,role:"tooltip"}).addClass("ui-tooltip ui-widget ui-corner-all ui-widget-content "+(this.options.tooltipClass||""));return e("
").addClass("ui-tooltip-content").appendTo(a),a.appendTo(this.document[0].body),this.tooltips[i]=t,a},_find:function(t){var i=t.data("ui-tooltip-id");return i?e("#"+i):e()},_removeTooltip:function(e){e.remove(),delete this.tooltips[e.attr("id")]},_destroy:function(){var t=this;e.each(this.tooltips,function(i,s){var a=e.Event("blur");a.target=a.currentTarget=s[0],t.close(a,!0),e("#"+i).remove(),s.data("ui-tooltip-title")&&(s.attr("title",s.data("ui-tooltip-title")),s.removeData("ui-tooltip-title"))})}})})(jQuery);(function(e,t){var i="ui-effects-";e.effects={effect:{}},function(e,t){function i(e,t,i){var s=c[t.type]||{};return null==e?i||!t.def?null:t.def:(e=s.floor?~~e:parseFloat(e),isNaN(e)?t.def:s.mod?(e+s.mod)%s.mod:0>e?0:e>s.max?s.max:e)}function s(i){var s=l(),a=s._rgba=[];return i=i.toLowerCase(),f(h,function(e,n){var r,o=n.re.exec(i),h=o&&n.parse(o),l=n.space||"rgba";return h?(r=s[l](h),s[u[l].cache]=r[u[l].cache],a=s._rgba=r._rgba,!1):t}),a.length?("0,0,0,0"===a.join()&&e.extend(a,n.transparent),s):n[i]}function a(e,t,i){return i=(i+1)%1,1>6*i?e+6*(t-e)*i:1>2*i?t:2>3*i?e+6*(t-e)*(2/3-i):e}var n,r="backgroundColor borderBottomColor borderLeftColor borderRightColor borderTopColor color columnRuleColor outlineColor textDecorationColor textEmphasisColor",o=/^([\-+])=\s*(\d+\.?\d*)/,h=[{re:/rgba?\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[e[1],e[2],e[3],e[4]]}},{re:/rgba?\(\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,parse:function(e){return[2.55*e[1],2.55*e[2],2.55*e[3],e[4]]}},{re:/#([a-f0-9]{2})([a-f0-9]{2})([a-f0-9]{2})/,parse:function(e){return[parseInt(e[1],16),parseInt(e[2],16),parseInt(e[3],16)]}},{re:/#([a-f0-9])([a-f0-9])([a-f0-9])/,parse:function(e){return[parseInt(e[1]+e[1],16),parseInt(e[2]+e[2],16),parseInt(e[3]+e[3],16)]}},{re:/hsla?\(\s*(\d+(?:\.\d+)?)\s*,\s*(\d+(?:\.\d+)?)\%\s*,\s*(\d+(?:\.\d+)?)\%\s*(?:,\s*(\d?(?:\.\d+)?)\s*)?\)/,space:"hsla",parse:function(e){return[e[1],e[2]/100,e[3]/100,e[4]]}}],l=e.Color=function(t,i,s,a){return new e.Color.fn.parse(t,i,s,a)},u={rgba:{props:{red:{idx:0,type:"byte"},green:{idx:1,type:"byte"},blue:{idx:2,type:"byte"}}},hsla:{props:{hue:{idx:0,type:"degrees"},saturation:{idx:1,type:"percent"},lightness:{idx:2,type:"percent"}}}},c={"byte":{floor:!0,max:255},percent:{max:1},degrees:{mod:360,floor:!0}},d=l.support={},p=e("
")[0],f=e.each;p.style.cssText="background-color:rgba(1,1,1,.5)",d.rgba=p.style.backgroundColor.indexOf("rgba")>-1,f(u,function(e,t){t.cache="_"+e,t.props.alpha={idx:3,type:"percent",def:1}}),l.fn=e.extend(l.prototype,{parse:function(a,r,o,h){if(a===t)return this._rgba=[null,null,null,null],this;(a.jquery||a.nodeType)&&(a=e(a).css(r),r=t);var c=this,d=e.type(a),p=this._rgba=[];return r!==t&&(a=[a,r,o,h],d="array"),"string"===d?this.parse(s(a)||n._default):"array"===d?(f(u.rgba.props,function(e,t){p[t.idx]=i(a[t.idx],t)}),this):"object"===d?(a instanceof l?f(u,function(e,t){a[t.cache]&&(c[t.cache]=a[t.cache].slice())}):f(u,function(t,s){var n=s.cache;f(s.props,function(e,t){if(!c[n]&&s.to){if("alpha"===e||null==a[e])return;c[n]=s.to(c._rgba)}c[n][t.idx]=i(a[e],t,!0)}),c[n]&&0>e.inArray(null,c[n].slice(0,3))&&(c[n][3]=1,s.from&&(c._rgba=s.from(c[n])))}),this):t},is:function(e){var i=l(e),s=!0,a=this;return f(u,function(e,n){var r,o=i[n.cache];return o&&(r=a[n.cache]||n.to&&n.to(a._rgba)||[],f(n.props,function(e,i){return null!=o[i.idx]?s=o[i.idx]===r[i.idx]:t})),s}),s},_space:function(){var e=[],t=this;return f(u,function(i,s){t[s.cache]&&e.push(i)}),e.pop()},transition:function(e,t){var s=l(e),a=s._space(),n=u[a],r=0===this.alpha()?l("transparent"):this,o=r[n.cache]||n.to(r._rgba),h=o.slice();return s=s[n.cache],f(n.props,function(e,a){var n=a.idx,r=o[n],l=s[n],u=c[a.type]||{};null!==l&&(null===r?h[n]=l:(u.mod&&(l-r>u.mod/2?r+=u.mod:r-l>u.mod/2&&(r-=u.mod)),h[n]=i((l-r)*t+r,a)))}),this[a](h)},blend:function(t){if(1===this._rgba[3])return this;var i=this._rgba.slice(),s=i.pop(),a=l(t)._rgba;return l(e.map(i,function(e,t){return(1-s)*a[t]+s*e}))},toRgbaString:function(){var t="rgba(",i=e.map(this._rgba,function(e,t){return null==e?t>2?1:0:e});return 1===i[3]&&(i.pop(),t="rgb("),t+i.join()+")"},toHslaString:function(){var t="hsla(",i=e.map(this.hsla(),function(e,t){return null==e&&(e=t>2?1:0),t&&3>t&&(e=Math.round(100*e)+"%"),e});return 1===i[3]&&(i.pop(),t="hsl("),t+i.join()+")"},toHexString:function(t){var i=this._rgba.slice(),s=i.pop();return t&&i.push(~~(255*s)),"#"+e.map(i,function(e){return e=(e||0).toString(16),1===e.length?"0"+e:e}).join("")},toString:function(){return 0===this._rgba[3]?"transparent":this.toRgbaString()}}),l.fn.parse.prototype=l.fn,u.hsla.to=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t,i,s=e[0]/255,a=e[1]/255,n=e[2]/255,r=e[3],o=Math.max(s,a,n),h=Math.min(s,a,n),l=o-h,u=o+h,c=.5*u;return t=h===o?0:s===o?60*(a-n)/l+360:a===o?60*(n-s)/l+120:60*(s-a)/l+240,i=0===l?0:.5>=c?l/u:l/(2-u),[Math.round(t)%360,i,c,null==r?1:r]},u.hsla.from=function(e){if(null==e[0]||null==e[1]||null==e[2])return[null,null,null,e[3]];var t=e[0]/360,i=e[1],s=e[2],n=e[3],r=.5>=s?s*(1+i):s+i-s*i,o=2*s-r;return[Math.round(255*a(o,r,t+1/3)),Math.round(255*a(o,r,t)),Math.round(255*a(o,r,t-1/3)),n]},f(u,function(s,a){var n=a.props,r=a.cache,h=a.to,u=a.from;l.fn[s]=function(s){if(h&&!this[r]&&(this[r]=h(this._rgba)),s===t)return this[r].slice();var a,o=e.type(s),c="array"===o||"object"===o?s:arguments,d=this[r].slice();return f(n,function(e,t){var s=c["object"===o?e:t.idx];null==s&&(s=d[t.idx]),d[t.idx]=i(s,t)}),u?(a=l(u(d)),a[r]=d,a):l(d)},f(n,function(t,i){l.fn[t]||(l.fn[t]=function(a){var n,r=e.type(a),h="alpha"===t?this._hsla?"hsla":"rgba":s,l=this[h](),u=l[i.idx];return"undefined"===r?u:("function"===r&&(a=a.call(this,u),r=e.type(a)),null==a&&i.empty?this:("string"===r&&(n=o.exec(a),n&&(a=u+parseFloat(n[2])*("+"===n[1]?1:-1))),l[i.idx]=a,this[h](l)))})})}),l.hook=function(t){var i=t.split(" ");f(i,function(t,i){e.cssHooks[i]={set:function(t,a){var n,r,o="";if("transparent"!==a&&("string"!==e.type(a)||(n=s(a)))){if(a=l(n||a),!d.rgba&&1!==a._rgba[3]){for(r="backgroundColor"===i?t.parentNode:t;(""===o||"transparent"===o)&&r&&r.style;)try{o=e.css(r,"backgroundColor"),r=r.parentNode}catch(h){}a=a.blend(o&&"transparent"!==o?o:"_default")}a=a.toRgbaString()}try{t.style[i]=a}catch(h){}}},e.fx.step[i]=function(t){t.colorInit||(t.start=l(t.elem,i),t.end=l(t.end),t.colorInit=!0),e.cssHooks[i].set(t.elem,t.start.transition(t.end,t.pos))}})},l.hook(r),e.cssHooks.borderColor={expand:function(e){var t={};return f(["Top","Right","Bottom","Left"],function(i,s){t["border"+s+"Color"]=e}),t}},n=e.Color.names={aqua:"#00ffff",black:"#000000",blue:"#0000ff",fuchsia:"#ff00ff",gray:"#808080",green:"#008000",lime:"#00ff00",maroon:"#800000",navy:"#000080",olive:"#808000",purple:"#800080",red:"#ff0000",silver:"#c0c0c0",teal:"#008080",white:"#ffffff",yellow:"#ffff00",transparent:[null,null,null,0],_default:"#ffffff"}}(jQuery),function(){function i(t){var i,s,a=t.ownerDocument.defaultView?t.ownerDocument.defaultView.getComputedStyle(t,null):t.currentStyle,n={};if(a&&a.length&&a[0]&&a[a[0]])for(s=a.length;s--;)i=a[s],"string"==typeof a[i]&&(n[e.camelCase(i)]=a[i]);else for(i in a)"string"==typeof a[i]&&(n[i]=a[i]);return n}function s(t,i){var s,a,r={};for(s in i)a=i[s],t[s]!==a&&(n[s]||(e.fx.step[s]||!isNaN(parseFloat(a)))&&(r[s]=a));return r}var a=["add","remove","toggle"],n={border:1,borderBottom:1,borderColor:1,borderLeft:1,borderRight:1,borderTop:1,borderWidth:1,margin:1,padding:1};e.each(["borderLeftStyle","borderRightStyle","borderBottomStyle","borderTopStyle"],function(t,i){e.fx.step[i]=function(e){("none"!==e.end&&!e.setAttr||1===e.pos&&!e.setAttr)&&(jQuery.style(e.elem,i,e.end),e.setAttr=!0)}}),e.fn.addBack||(e.fn.addBack=function(e){return this.add(null==e?this.prevObject:this.prevObject.filter(e))}),e.effects.animateClass=function(t,n,r,o){var h=e.speed(n,r,o);return this.queue(function(){var n,r=e(this),o=r.attr("class")||"",l=h.children?r.find("*").addBack():r;l=l.map(function(){var t=e(this);return{el:t,start:i(this)}}),n=function(){e.each(a,function(e,i){t[i]&&r[i+"Class"](t[i])})},n(),l=l.map(function(){return this.end=i(this.el[0]),this.diff=s(this.start,this.end),this}),r.attr("class",o),l=l.map(function(){var t=this,i=e.Deferred(),s=e.extend({},h,{queue:!1,complete:function(){i.resolve(t)}});return this.el.animate(this.diff,s),i.promise()}),e.when.apply(e,l.get()).done(function(){n(),e.each(arguments,function(){var t=this.el;e.each(this.diff,function(e){t.css(e,"")})}),h.complete.call(r[0])})})},e.fn.extend({addClass:function(t){return function(i,s,a,n){return s?e.effects.animateClass.call(this,{add:i},s,a,n):t.apply(this,arguments)}}(e.fn.addClass),removeClass:function(t){return function(i,s,a,n){return arguments.length>1?e.effects.animateClass.call(this,{remove:i},s,a,n):t.apply(this,arguments)}}(e.fn.removeClass),toggleClass:function(i){return function(s,a,n,r,o){return"boolean"==typeof a||a===t?n?e.effects.animateClass.call(this,a?{add:s}:{remove:s},n,r,o):i.apply(this,arguments):e.effects.animateClass.call(this,{toggle:s},a,n,r)}}(e.fn.toggleClass),switchClass:function(t,i,s,a,n){return e.effects.animateClass.call(this,{add:i,remove:t},s,a,n)}})}(),function(){function s(t,i,s,a){return e.isPlainObject(t)&&(i=t,t=t.effect),t={effect:t},null==i&&(i={}),e.isFunction(i)&&(a=i,s=null,i={}),("number"==typeof i||e.fx.speeds[i])&&(a=s,s=i,i={}),e.isFunction(s)&&(a=s,s=null),i&&e.extend(t,i),s=s||i.duration,t.duration=e.fx.off?0:"number"==typeof s?s:s in e.fx.speeds?e.fx.speeds[s]:e.fx.speeds._default,t.complete=a||i.complete,t}function a(t){return!t||"number"==typeof t||e.fx.speeds[t]?!0:"string"!=typeof t||e.effects.effect[t]?e.isFunction(t)?!0:"object"!=typeof t||t.effect?!1:!0:!0}e.extend(e.effects,{version:"1.10.3",save:function(e,t){for(var s=0;t.length>s;s++)null!==t[s]&&e.data(i+t[s],e[0].style[t[s]])},restore:function(e,s){var a,n;for(n=0;s.length>n;n++)null!==s[n]&&(a=e.data(i+s[n]),a===t&&(a=""),e.css(s[n],a))},setMode:function(e,t){return"toggle"===t&&(t=e.is(":hidden")?"show":"hide"),t},getBaseline:function(e,t){var i,s;switch(e[0]){case"top":i=0;break;case"middle":i=.5;break;case"bottom":i=1;break;default:i=e[0]/t.height}switch(e[1]){case"left":s=0;break;case"center":s=.5;break;case"right":s=1;break;default:s=e[1]/t.width}return{x:s,y:i}},createWrapper:function(t){if(t.parent().is(".ui-effects-wrapper"))return t.parent();var i={width:t.outerWidth(!0),height:t.outerHeight(!0),"float":t.css("float")},s=e("
").addClass("ui-effects-wrapper").css({fontSize:"100%",background:"transparent",border:"none",margin:0,padding:0}),a={width:t.width(),height:t.height()},n=document.activeElement;try{n.id}catch(r){n=document.body}return t.wrap(s),(t[0]===n||e.contains(t[0],n))&&e(n).focus(),s=t.parent(),"static"===t.css("position")?(s.css({position:"relative"}),t.css({position:"relative"})):(e.extend(i,{position:t.css("position"),zIndex:t.css("z-index")}),e.each(["top","left","bottom","right"],function(e,s){i[s]=t.css(s),isNaN(parseInt(i[s],10))&&(i[s]="auto")}),t.css({position:"relative",top:0,left:0,right:"auto",bottom:"auto"})),t.css(a),s.css(i).show()},removeWrapper:function(t){var i=document.activeElement;return t.parent().is(".ui-effects-wrapper")&&(t.parent().replaceWith(t),(t[0]===i||e.contains(t[0],i))&&e(i).focus()),t},setTransition:function(t,i,s,a){return a=a||{},e.each(i,function(e,i){var n=t.cssUnit(i);n[0]>0&&(a[i]=n[0]*s+n[1])}),a}}),e.fn.extend({effect:function(){function t(t){function s(){e.isFunction(n)&&n.call(a[0]),e.isFunction(t)&&t()}var a=e(this),n=i.complete,o=i.mode;(a.is(":hidden")?"hide"===o:"show"===o)?(a[o](),s()):r.call(a[0],i,s)}var i=s.apply(this,arguments),a=i.mode,n=i.queue,r=e.effects.effect[i.effect];return e.fx.off||!r?a?this[a](i.duration,i.complete):this.each(function(){i.complete&&i.complete.call(this)}):n===!1?this.each(t):this.queue(n||"fx",t)},show:function(e){return function(t){if(a(t))return e.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="show",this.effect.call(this,i)}}(e.fn.show),hide:function(e){return function(t){if(a(t))return e.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="hide",this.effect.call(this,i)}}(e.fn.hide),toggle:function(e){return function(t){if(a(t)||"boolean"==typeof t)return e.apply(this,arguments);var i=s.apply(this,arguments);return i.mode="toggle",this.effect.call(this,i)}}(e.fn.toggle),cssUnit:function(t){var i=this.css(t),s=[];return e.each(["em","px","%","pt"],function(e,t){i.indexOf(t)>0&&(s=[parseFloat(i),t])}),s}})}(),function(){var t={};e.each(["Quad","Cubic","Quart","Quint","Expo"],function(e,i){t[i]=function(t){return Math.pow(t,e+2)}}),e.extend(t,{Sine:function(e){return 1-Math.cos(e*Math.PI/2)},Circ:function(e){return 1-Math.sqrt(1-e*e)},Elastic:function(e){return 0===e||1===e?e:-Math.pow(2,8*(e-1))*Math.sin((80*(e-1)-7.5)*Math.PI/15)},Back:function(e){return e*e*(3*e-2)},Bounce:function(e){for(var t,i=4;((t=Math.pow(2,--i))-1)/11>e;);return 1/Math.pow(4,3-i)-7.5625*Math.pow((3*t-2)/22-e,2)}}),e.each(t,function(t,i){e.easing["easeIn"+t]=i,e.easing["easeOut"+t]=function(e){return 1-i(1-e)},e.easing["easeInOut"+t]=function(e){return.5>e?i(2*e)/2:1-i(-2*e+2)/2}})}()})(jQuery);(function(e){var t=/up|down|vertical/,i=/up|left|vertical|horizontal/;e.effects.effect.blind=function(a,s){var n,r,o,l=e(this),h=["position","top","bottom","left","right","height","width"],u=e.effects.setMode(l,a.mode||"hide"),d=a.direction||"up",c=t.test(d),p=c?"height":"width",f=c?"top":"left",m=i.test(d),g={},v="show"===u;l.parent().is(".ui-effects-wrapper")?e.effects.save(l.parent(),h):e.effects.save(l,h),l.show(),n=e.effects.createWrapper(l).css({overflow:"hidden"}),r=n[p](),o=parseFloat(n.css(f))||0,g[p]=v?r:0,m||(l.css(c?"bottom":"right",0).css(c?"top":"left","auto").css({position:"absolute"}),g[f]=v?o:r+o),v&&(n.css(p,0),m||n.css(f,o+r)),n.animate(g,{duration:a.duration,easing:a.easing,queue:!1,complete:function(){"hide"===u&&l.hide(),e.effects.restore(l,h),e.effects.removeWrapper(l),s()}})}})(jQuery);(function(e){e.effects.effect.bounce=function(t,i){var a,s,n,r=e(this),o=["position","top","bottom","left","right","height","width"],l=e.effects.setMode(r,t.mode||"effect"),h="hide"===l,u="show"===l,d=t.direction||"up",c=t.distance,p=t.times||5,f=2*p+(u||h?1:0),m=t.duration/f,g=t.easing,v="up"===d||"down"===d?"top":"left",y="up"===d||"left"===d,b=r.queue(),_=b.length;for((u||h)&&o.push("opacity"),e.effects.save(r,o),r.show(),e.effects.createWrapper(r),c||(c=r["top"===v?"outerHeight":"outerWidth"]()/3),u&&(n={opacity:1},n[v]=0,r.css("opacity",0).css(v,y?2*-c:2*c).animate(n,m,g)),h&&(c/=Math.pow(2,p-1)),n={},n[v]=0,a=0;p>a;a++)s={},s[v]=(y?"-=":"+=")+c,r.animate(s,m,g).animate(n,m,g),c=h?2*c:c/2;h&&(s={opacity:0},s[v]=(y?"-=":"+=")+c,r.animate(s,m,g)),r.queue(function(){h&&r.hide(),e.effects.restore(r,o),e.effects.removeWrapper(r),i()}),_>1&&b.splice.apply(b,[1,0].concat(b.splice(_,f+1))),r.dequeue()}})(jQuery);(function(e){e.effects.effect.clip=function(t,i){var a,s,n,r=e(this),o=["position","top","bottom","left","right","height","width"],l=e.effects.setMode(r,t.mode||"hide"),h="show"===l,u=t.direction||"vertical",d="vertical"===u,c=d?"height":"width",p=d?"top":"left",f={};e.effects.save(r,o),r.show(),a=e.effects.createWrapper(r).css({overflow:"hidden"}),s="IMG"===r[0].tagName?a:r,n=s[c](),h&&(s.css(c,0),s.css(p,n/2)),f[c]=h?n:0,f[p]=h?0:n/2,s.animate(f,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){h||r.hide(),e.effects.restore(r,o),e.effects.removeWrapper(r),i()}})}})(jQuery);(function(e){e.effects.effect.drop=function(t,i){var a,s=e(this),n=["position","top","bottom","left","right","opacity","height","width"],r=e.effects.setMode(s,t.mode||"hide"),o="show"===r,l=t.direction||"left",h="up"===l||"down"===l?"top":"left",u="up"===l||"left"===l?"pos":"neg",d={opacity:o?1:0};e.effects.save(s,n),s.show(),e.effects.createWrapper(s),a=t.distance||s["top"===h?"outerHeight":"outerWidth"](!0)/2,o&&s.css("opacity",0).css(h,"pos"===u?-a:a),d[h]=(o?"pos"===u?"+=":"-=":"pos"===u?"-=":"+=")+a,s.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===r&&s.hide(),e.effects.restore(s,n),e.effects.removeWrapper(s),i()}})}})(jQuery);(function(e){e.effects.effect.explode=function(t,i){function s(){b.push(this),b.length===d*c&&a()}function a(){p.css({visibility:"visible"}),e(b).remove(),m||p.hide(),i()}var n,r,o,l,h,u,d=t.pieces?Math.round(Math.sqrt(t.pieces)):3,c=d,p=e(this),f=e.effects.setMode(p,t.mode||"hide"),m="show"===f,g=p.show().css("visibility","hidden").offset(),v=Math.ceil(p.outerWidth()/c),y=Math.ceil(p.outerHeight()/d),b=[];for(n=0;d>n;n++)for(l=g.top+n*y,u=n-(d-1)/2,r=0;c>r;r++)o=g.left+r*v,h=r-(c-1)/2,p.clone().appendTo("body").wrap("
").css({position:"absolute",visibility:"visible",left:-r*v,top:-n*y}).parent().addClass("ui-effects-explode").css({position:"absolute",overflow:"hidden",width:v,height:y,left:o+(m?h*v:0),top:l+(m?u*y:0),opacity:m?0:1}).animate({left:o+(m?0:h*v),top:l+(m?0:u*y),opacity:m?1:0},t.duration||500,t.easing,s)}})(jQuery);(function(e){e.effects.effect.fade=function(t,i){var s=e(this),a=e.effects.setMode(s,t.mode||"toggle");s.animate({opacity:a},{queue:!1,duration:t.duration,easing:t.easing,complete:i})}})(jQuery);(function(e){e.effects.effect.fold=function(t,i){var s,a,n=e(this),r=["position","top","bottom","left","right","height","width"],o=e.effects.setMode(n,t.mode||"hide"),l="show"===o,h="hide"===o,u=t.size||15,d=/([0-9]+)%/.exec(u),c=!!t.horizFirst,p=l!==c,f=p?["width","height"]:["height","width"],m=t.duration/2,g={},v={};e.effects.save(n,r),n.show(),s=e.effects.createWrapper(n).css({overflow:"hidden"}),a=p?[s.width(),s.height()]:[s.height(),s.width()],d&&(u=parseInt(d[1],10)/100*a[h?0:1]),l&&s.css(c?{height:0,width:u}:{height:u,width:0}),g[f[0]]=l?a[0]:u,v[f[1]]=l?a[1]:0,s.animate(g,m,t.easing).animate(v,m,t.easing,function(){h&&n.hide(),e.effects.restore(n,r),e.effects.removeWrapper(n),i()})}})(jQuery);(function(e){e.effects.effect.highlight=function(t,i){var s=e(this),a=["backgroundImage","backgroundColor","opacity"],n=e.effects.setMode(s,t.mode||"show"),r={backgroundColor:s.css("backgroundColor")};"hide"===n&&(r.opacity=0),e.effects.save(s,a),s.show().css({backgroundImage:"none",backgroundColor:t.color||"#ffff99"}).animate(r,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===n&&s.hide(),e.effects.restore(s,a),i()}})}})(jQuery);(function(e){e.effects.effect.pulsate=function(t,i){var s,a=e(this),n=e.effects.setMode(a,t.mode||"show"),r="show"===n,o="hide"===n,l=r||"hide"===n,h=2*(t.times||5)+(l?1:0),u=t.duration/h,d=0,c=a.queue(),p=c.length;for((r||!a.is(":visible"))&&(a.css("opacity",0).show(),d=1),s=1;h>s;s++)a.animate({opacity:d},u,t.easing),d=1-d;a.animate({opacity:d},u,t.easing),a.queue(function(){o&&a.hide(),i()}),p>1&&c.splice.apply(c,[1,0].concat(c.splice(p,h+1))),a.dequeue()}})(jQuery);(function(e){e.effects.effect.puff=function(t,i){var s=e(this),a=e.effects.setMode(s,t.mode||"hide"),n="hide"===a,r=parseInt(t.percent,10)||150,o=r/100,h={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()};e.extend(t,{effect:"scale",queue:!1,fade:!0,mode:a,complete:i,percent:n?r:100,from:n?h:{height:h.height*o,width:h.width*o,outerHeight:h.outerHeight*o,outerWidth:h.outerWidth*o}}),s.effect(t)},e.effects.effect.scale=function(t,i){var s=e(this),a=e.extend(!0,{},t),n=e.effects.setMode(s,t.mode||"effect"),r=parseInt(t.percent,10)||(0===parseInt(t.percent,10)?0:"hide"===n?0:100),o=t.direction||"both",h=t.origin,l={height:s.height(),width:s.width(),outerHeight:s.outerHeight(),outerWidth:s.outerWidth()},u={y:"horizontal"!==o?r/100:1,x:"vertical"!==o?r/100:1};a.effect="size",a.queue=!1,a.complete=i,"effect"!==n&&(a.origin=h||["middle","center"],a.restore=!0),a.from=t.from||("show"===n?{height:0,width:0,outerHeight:0,outerWidth:0}:l),a.to={height:l.height*u.y,width:l.width*u.x,outerHeight:l.outerHeight*u.y,outerWidth:l.outerWidth*u.x},a.fade&&("show"===n&&(a.from.opacity=0,a.to.opacity=1),"hide"===n&&(a.from.opacity=1,a.to.opacity=0)),s.effect(a)},e.effects.effect.size=function(t,i){var s,a,n,r=e(this),o=["position","top","bottom","left","right","width","height","overflow","opacity"],h=["position","top","bottom","left","right","overflow","opacity"],l=["width","height","overflow"],u=["fontSize"],d=["borderTopWidth","borderBottomWidth","paddingTop","paddingBottom"],c=["borderLeftWidth","borderRightWidth","paddingLeft","paddingRight"],p=e.effects.setMode(r,t.mode||"effect"),f=t.restore||"effect"!==p,m=t.scale||"both",g=t.origin||["middle","center"],v=r.css("position"),y=f?o:h,b={height:0,width:0,outerHeight:0,outerWidth:0};"show"===p&&r.show(),s={height:r.height(),width:r.width(),outerHeight:r.outerHeight(),outerWidth:r.outerWidth()},"toggle"===t.mode&&"show"===p?(r.from=t.to||b,r.to=t.from||s):(r.from=t.from||("show"===p?b:s),r.to=t.to||("hide"===p?b:s)),n={from:{y:r.from.height/s.height,x:r.from.width/s.width},to:{y:r.to.height/s.height,x:r.to.width/s.width}},("box"===m||"both"===m)&&(n.from.y!==n.to.y&&(y=y.concat(d),r.from=e.effects.setTransition(r,d,n.from.y,r.from),r.to=e.effects.setTransition(r,d,n.to.y,r.to)),n.from.x!==n.to.x&&(y=y.concat(c),r.from=e.effects.setTransition(r,c,n.from.x,r.from),r.to=e.effects.setTransition(r,c,n.to.x,r.to))),("content"===m||"both"===m)&&n.from.y!==n.to.y&&(y=y.concat(u).concat(l),r.from=e.effects.setTransition(r,u,n.from.y,r.from),r.to=e.effects.setTransition(r,u,n.to.y,r.to)),e.effects.save(r,y),r.show(),e.effects.createWrapper(r),r.css("overflow","hidden").css(r.from),g&&(a=e.effects.getBaseline(g,s),r.from.top=(s.outerHeight-r.outerHeight())*a.y,r.from.left=(s.outerWidth-r.outerWidth())*a.x,r.to.top=(s.outerHeight-r.to.outerHeight)*a.y,r.to.left=(s.outerWidth-r.to.outerWidth)*a.x),r.css(r.from),("content"===m||"both"===m)&&(d=d.concat(["marginTop","marginBottom"]).concat(u),c=c.concat(["marginLeft","marginRight"]),l=o.concat(d).concat(c),r.find("*[width]").each(function(){var i=e(this),s={height:i.height(),width:i.width(),outerHeight:i.outerHeight(),outerWidth:i.outerWidth()};f&&e.effects.save(i,l),i.from={height:s.height*n.from.y,width:s.width*n.from.x,outerHeight:s.outerHeight*n.from.y,outerWidth:s.outerWidth*n.from.x},i.to={height:s.height*n.to.y,width:s.width*n.to.x,outerHeight:s.height*n.to.y,outerWidth:s.width*n.to.x},n.from.y!==n.to.y&&(i.from=e.effects.setTransition(i,d,n.from.y,i.from),i.to=e.effects.setTransition(i,d,n.to.y,i.to)),n.from.x!==n.to.x&&(i.from=e.effects.setTransition(i,c,n.from.x,i.from),i.to=e.effects.setTransition(i,c,n.to.x,i.to)),i.css(i.from),i.animate(i.to,t.duration,t.easing,function(){f&&e.effects.restore(i,l)})})),r.animate(r.to,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){0===r.to.opacity&&r.css("opacity",r.from.opacity),"hide"===p&&r.hide(),e.effects.restore(r,y),f||("static"===v?r.css({position:"relative",top:r.to.top,left:r.to.left}):e.each(["top","left"],function(e,t){r.css(t,function(t,i){var s=parseInt(i,10),a=e?r.to.left:r.to.top;return"auto"===i?a+"px":s+a+"px"})})),e.effects.removeWrapper(r),i()}})}})(jQuery);(function(e){e.effects.effect.shake=function(t,i){var s,a=e(this),n=["position","top","bottom","left","right","height","width"],r=e.effects.setMode(a,t.mode||"effect"),o=t.direction||"left",h=t.distance||20,l=t.times||3,u=2*l+1,d=Math.round(t.duration/u),c="up"===o||"down"===o?"top":"left",p="up"===o||"left"===o,f={},m={},g={},v=a.queue(),y=v.length;for(e.effects.save(a,n),a.show(),e.effects.createWrapper(a),f[c]=(p?"-=":"+=")+h,m[c]=(p?"+=":"-=")+2*h,g[c]=(p?"-=":"+=")+2*h,a.animate(f,d,t.easing),s=1;l>s;s++)a.animate(m,d,t.easing).animate(g,d,t.easing);a.animate(m,d,t.easing).animate(f,d/2,t.easing).queue(function(){"hide"===r&&a.hide(),e.effects.restore(a,n),e.effects.removeWrapper(a),i()}),y>1&&v.splice.apply(v,[1,0].concat(v.splice(y,u+1))),a.dequeue()}})(jQuery);(function(e){e.effects.effect.slide=function(t,i){var s,a=e(this),n=["position","top","bottom","left","right","width","height"],r=e.effects.setMode(a,t.mode||"show"),o="show"===r,h=t.direction||"left",l="up"===h||"down"===h?"top":"left",u="up"===h||"left"===h,d={};e.effects.save(a,n),a.show(),s=t.distance||a["top"===l?"outerHeight":"outerWidth"](!0),e.effects.createWrapper(a).css({overflow:"hidden"}),o&&a.css(l,u?isNaN(s)?"-"+s:-s:s),d[l]=(o?u?"+=":"-=":u?"-=":"+=")+s,a.animate(d,{queue:!1,duration:t.duration,easing:t.easing,complete:function(){"hide"===r&&a.hide(),e.effects.restore(a,n),e.effects.removeWrapper(a),i()}})}})(jQuery);(function(e){e.effects.effect.transfer=function(t,i){var s=e(this),a=e(t.to),n="fixed"===a.css("position"),r=e("body"),o=n?r.scrollTop():0,h=n?r.scrollLeft():0,l=a.offset(),u={top:l.top-o,left:l.left-h,height:a.innerHeight(),width:a.innerWidth()},d=s.offset(),c=e("
").appendTo(document.body).addClass(t.className).css({top:d.top-o,left:d.left-h,height:s.innerHeight(),width:s.innerWidth(),position:n?"fixed":"absolute"}).animate(u,t.duration,t.easing,function(){c.remove(),i()})}})(jQuery);
\ No newline at end of file
diff --git a/static/grappelli/js/grappelli.js b/static/grappelli/js/grappelli.js
new file mode 100644
index 0000000..8ddfbf3
--- /dev/null
+++ b/static/grappelli/js/grappelli.js
@@ -0,0 +1,175 @@
+/**
+ * GRAPPELLI UTILS
+ * functions needed for Grappelli
+ */
+
+// grp jQuery namespace
+var grp = {
+ "jQuery": jQuery.noConflict(true)
+};
+
+// django jQuery namespace
+var django = {
+ "jQuery": grp.jQuery.noConflict(true)
+};
+
+var inputTypes = [
+ "[type='search']",
+ "[type='email']",
+ "[type='url']",
+ "[type='tel']",
+ "[type='number']",
+ "[type='range']",
+ "[type='date']",
+ "[type='month']",
+ "[type='week']",
+ "[type='time']",
+ "[type='datetime']",
+ "[type='datetime-local']",
+ "[type='color']"].join(",");
+
+(function($) {
+
+ // dateformat
+ grappelli.getFormat = function(type) {
+ if (type == "date") {
+ var format = DATE_FORMAT.toLowerCase().replace(/%\w/g, function(str) {
+ str = str.replace(/%/, '');
+ return str + str;
+ });
+ return format;
+ }
+ };
+
+ // remove types: search, email, url, tel, number, range, date
+ // month, week, time, datetime, datetime-local, color
+ // because of browser inconsistencies
+ /*jshint multistr: true */
+ grappelli.cleanInputTypes = function() {
+ $("form").each(function(){
+ $(this).find(':input').filter(inputTypes).each(function(){
+ $(this).attr("type", "text");
+ });
+ });
+ };
+
+ // datepicker, timepicker init
+ grappelli.initDateAndTimePicker = function() {
+
+ // HACK: get rid of text after DateField (hardcoded in django.admin)
+ $('p.datetime').each(function() {
+ var text = $(this).html();
+ text = text.replace(/^\w*: /, "");
+ text = text.replace(/
[^<]*: /g, "
");
+ $(this).html(text);
+ });
+
+ var options = {
+ //appendText: '(mm/dd/yyyy)',
+ constrainInput: false,
+ showOn: 'button',
+ buttonImageOnly: false,
+ buttonText: '',
+ dateFormat: grappelli.getFormat('date'),
+ showButtonPanel: true,
+ showAnim: '',
+ // HACK: sets the current instance to a global var.
+ // needed to actually select today if the today-button is clicked.
+ // see onClick handler for ".ui-datepicker-current"
+ beforeShow: function(year, month, inst) {
+ grappelli.datepicker_instance = this;
+ }
+ };
+ var dateFields = $("input[class*='vDateField']:not([id*='__prefix__'])");
+ dateFields.datepicker(options);
+
+ if (typeof IS_POPUP != "undefined" && IS_POPUP) {
+ dateFields.datepicker('disable');
+ }
+
+ // HACK: adds an event listener to the today button of datepicker
+ // if clicked today gets selected and datepicker hides.
+ // use on() because couldn't find hook after datepicker generates it's complete dom.
+ $(document).on('click', '.ui-datepicker-current', function() {
+ $.datepicker._selectDate(grappelli.datepicker_instance);
+ grappelli.datepicker_instance = null;
+ });
+
+ // init timepicker
+ $("input[class*='vTimeField']:not([id*='__prefix__'])").grp_timepicker();
+
+ };
+
+ // changelist: filter
+ grappelli.initFilter = function() {
+ $("a.grp-pulldown-handler").click(function() {
+ var pulldownContainer = $(this).closest(".grp-pulldown-container");
+ $(pulldownContainer).toggleClass("grp-pulldown-state-open").children(".grp-pulldown-content").toggle();
+ });
+ $("a.grp-pulldown-handler").bind('mouseout', function() {
+ $(this).blur();
+ });
+ $(".grp-filter-choice").change(function(){
+ location.href = $(this).val();
+ });
+ };
+
+ // changelist: searchbar
+ grappelli.initSearchbar = function() {
+ var searchbar = $("input.grp-search-field");
+ searchbar.focus();
+ };
+
+ grappelli.updateSelectFilter = function(form) {
+ if (typeof SelectFilter != "undefined"){
+ form.find(".selectfilter").each(function(index, value){
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length-1], false, "{% admin_media_prefix %}");
+ });
+ form.find(".selectfilterstacked").each(function(index, value){
+ var namearr = value.name.split('-');
+ SelectFilter.init(value.id, namearr[namearr.length-1], true, "{% admin_media_prefix %}");
+ });
+ }
+ };
+
+ grappelli.reinitDateTimeFields = function(form) {
+ form.find(".vDateField").datepicker({
+ constrainInput: false,
+ showOn: 'button',
+ buttonImageOnly: false,
+ buttonText: '',
+ dateFormat: grappelli.getFormat('date')
+ });
+ form.find(".vTimeField").grp_timepicker();
+ };
+
+ // autocomplete helpers
+ grappelli.get_app_label = function(elem) {
+ var link = elem.next("a");
+ if (link.length > 0) {
+ var url = link.attr('href').split('/');
+ return url[url.length-3];
+ }
+ return false;
+ };
+ grappelli.get_model_name = function(elem) {
+ var link = elem.next("a");
+ if (link.length > 0) {
+ var url = link.attr('href').split('/');
+ return url[url.length-2];
+ }
+ return false;
+ };
+ grappelli.get_query_string = function(elem) {
+ var link = elem.next("a");
+ if (link.length > 0) {
+ var url = link.attr('href').split('/');
+ pairs = url[url.length-1].replace('?', '').split("&");
+ return pairs.join(":");
+ }
+ return false;
+ };
+
+})(grp.jQuery);
+
diff --git a/static/grappelli/js/grappelli.min.js b/static/grappelli/js/grappelli.min.js
new file mode 100644
index 0000000..acd431e
--- /dev/null
+++ b/static/grappelli/js/grappelli.min.js
@@ -0,0 +1 @@
+var grp={jQuery:jQuery.noConflict(!0)},django={jQuery:grp.jQuery.noConflict(!0)},inputTypes=["[type='search']","[type='email']","[type='url']","[type='tel']","[type='number']","[type='range']","[type='date']","[type='month']","[type='week']","[type='time']","[type='datetime']","[type='datetime-local']","[type='color']"].join(",");!function(a){grappelli.getFormat=function(a){if("date"==a){var b=DATE_FORMAT.toLowerCase().replace(/%\w/g,function(a){return a=a.replace(/%/,""),a+a});return b}},grappelli.cleanInputTypes=function(){a("form").each(function(){a(this).find(":input").filter(inputTypes).each(function(){a(this).attr("type","text")})})},grappelli.initDateAndTimePicker=function(){a("p.datetime").each(function(){var b=a(this).html();b=b.replace(/^\w*: /,""),b=b.replace(/
[^<]*: /g,"
"),a(this).html(b)});var b={constrainInput:!1,showOn:"button",buttonImageOnly:!1,buttonText:"",dateFormat:grappelli.getFormat("date"),showButtonPanel:!0,showAnim:"",beforeShow:function(){grappelli.datepicker_instance=this}},c=a("input[class*='vDateField']:not([id*='__prefix__'])");c.datepicker(b),"undefined"!=typeof IS_POPUP&&IS_POPUP&&c.datepicker("disable"),a(document).on("click",".ui-datepicker-current",function(){a.datepicker._selectDate(grappelli.datepicker_instance),grappelli.datepicker_instance=null}),a("input[class*='vTimeField']:not([id*='__prefix__'])").grp_timepicker()},grappelli.initFilter=function(){a("a.grp-pulldown-handler").click(function(){var b=a(this).closest(".grp-pulldown-container");a(b).toggleClass("grp-pulldown-state-open").children(".grp-pulldown-content").toggle()}),a("a.grp-pulldown-handler").bind("mouseout",function(){a(this).blur()}),a(".grp-filter-choice").change(function(){location.href=a(this).val()})},grappelli.initSearchbar=function(){var b=a("input.grp-search-field");b.focus()},grappelli.updateSelectFilter=function(a){"undefined"!=typeof SelectFilter&&(a.find(".selectfilter").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!1,"{% admin_media_prefix %}")}),a.find(".selectfilterstacked").each(function(a,b){var c=b.name.split("-");SelectFilter.init(b.id,c[c.length-1],!0,"{% admin_media_prefix %}")}))},grappelli.reinitDateTimeFields=function(a){a.find(".vDateField").datepicker({constrainInput:!1,showOn:"button",buttonImageOnly:!1,buttonText:"",dateFormat:grappelli.getFormat("date")}),a.find(".vTimeField").grp_timepicker()},grappelli.get_app_label=function(a){var b=a.next("a");if(b.length>0){var c=b.attr("href").split("/");return c[c.length-3]}return!1},grappelli.get_model_name=function(a){var b=a.next("a");if(b.length>0){var c=b.attr("href").split("/");return c[c.length-2]}return!1},grappelli.get_query_string=function(a){var b=a.next("a");if(b.length>0){var c=b.attr("href").split("/");return pairs=c[c.length-1].replace("?","").split("&"),pairs.join(":")}return!1}}(grp.jQuery),function(a){var b={init:function(b){return b=a.extend({},a.fn.grp_autocomplete_fk.defaults,b),this.each(function(){var g=a(this);g.attr({tabindex:"-1",readonly:"readonly"}).addClass("grp-autocomplete-hidden-field"),g.next().next()&&"errorlist"!=g.next().next().attr("class")&&"grp-help"!=g.next().next().attr("class")&&g.next().next().remove(),g.next().after(c).after(d(g.attr("id"))),g.parent().wrapInner("
"),g.parent().prepend("
"),b=a.extend({wrapper_autocomplete:g.parent(),input_field:g.prev(),remove_link:g.next().next().hide(),loader:g.next().next().next().hide()},a.fn.grp_autocomplete_fk.defaults,b),f(g,b),e(g,b),g.bind("change focus keyup",function(){f(g,b)}),a("label[for='"+g.attr("id")+"']").each(function(){a(this).attr("for",g.attr("id")+"-autocomplete")})})}};a.fn.grp_autocomplete_fk=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?(a.error("Method "+c+" does not exist on jQuery.grp_autocomplete_fk"),!1):b.init.apply(this,arguments)};var c=function(){var b=a('
loader
');return b},d=function(b){var c=a('
');return c.attr("id","remove_"+b),c.attr("href","javascript://"),c.attr("onClick","return removeRelatedObject(this);"),c.hover(function(){a(this).parent().toggleClass("grp-autocomplete-preremove")}),c},e=function(b,c){c.wrapper_autocomplete.find("input:first").bind("focus",function(){c.wrapper_autocomplete.addClass("grp-state-focus")}).bind("blur",function(){c.wrapper_autocomplete.removeClass("grp-state-focus")}).autocomplete({minLength:1,delay:1e3,source:function(d,e){a.ajax({url:c.autocomplete_lookup_url,dataType:"json",data:"term="+encodeURIComponent(d.term)+"&app_label="+grappelli.get_app_label(b)+"&model_name="+grappelli.get_model_name(b)+"&query_string="+grappelli.get_query_string(b),beforeSend:function(){c.loader.show()},success:function(b){e(a.map(b,function(a){return{label:a.label,value:a.value}}))},complete:function(){c.loader.hide()}})},focus:function(){return!1},select:function(d,e){return c.input_field.val(e.item.label),b.val(e.item.value),b.trigger("change"),b.val()?a(c.remove_link).show():a(c.remove_link).hide(),!1}}).data("ui-autocomplete")._renderItem=function(b,c){return c.value?a("
").data("item.autocomplete",c).append("
"+c.label+"").appendTo(b):a("
").data("item.autocomplete",c).append("
"+c.label+"").appendTo(b)}},f=function(b,c){a.getJSON(c.lookup_url,{object_id:b.val(),app_label:grappelli.get_app_label(b),model_name:grappelli.get_model_name(b)},function(d){a.each(d,function(e){c.input_field.val(d[e].label),b.val()?a(c.remove_link).show():a(c.remove_link).hide()})})};a.fn.grp_autocomplete_fk.defaults={autocomplete_lookup_url:"",lookup_url:""}}(grp.jQuery),function(a){var b={init:function(b){return b=a.extend({},a.fn.grp_autocomplete_generic.defaults,b),this.each(function(){var i=a(this);i.attr({tabindex:"-1",readonly:"readonly"}).addClass("grp-autocomplete-hidden-field");var j=a(b.content_type).val()||a(b.content_type).find(":checked").val();j&&i.after(c).after(d(i.attr("id"))).after(e(i.attr("id"),j)),i.parent().wrapInner("
"),i.parent().prepend("
"),b=a.extend({wrapper_autocomplete:a(this).parent(),input_field:a(this).prev(),remove_link:i.nextAll("a.grp-related-remove").hide(),loader:i.nextAll("div.grp-loader").hide()},a.fn.grp_autocomplete_generic.defaults,b),j&&h(i,b),g(i,b),i.bind("change focus keyup",function(){h(i,b)}),a(b.content_type).bind("change",function(){f(a(this),b)}),a("label[for='"+i.attr("id")+"']").each(function(){a(this).attr("for",i.attr("id")+"-autocomplete")})})}};a.fn.grp_autocomplete_generic=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?(a.error("Method "+c+" does not exist on jQuery.grp_autocomplete_generic"),!1):b.init.apply(this,arguments)};var c=function(){var b=a('
loader
');return b},d=function(b){var c=a('
');return c.attr("id","remove_"+b),c.attr("href","javascript://"),c.attr("onClick","return removeRelatedObject(this);"),c.hover(function(){a(this).parent().toggleClass("grp-autocomplete-preremove")}),c},e=function(b,c){var d=a('
');return d.attr("id","lookup_"+b),d.attr("href","../../../"+MODEL_URL_ARRAY[c].app+"/"+MODEL_URL_ARRAY[c].model+"/?"),d.attr("onClick","return showRelatedObjectLookupPopup(this);"),d},f=function(b,f){var g=a(f.object_id);g.val(""),g.prev().val(""),g.nextAll("a.related-lookup").remove(),g.nextAll("a.grp-related-remove").remove(),g.nextAll("div.grp-loader").remove();var h=a(b).val()||a(b).find(":checked").val();h&&(g.after(c).after(d(g.attr("id"))).after(e(g.attr("id"),h)),f.remove_link=g.nextAll("a.grp-related-remove").hide(),f.loader=g.nextAll("div.grp-loader").hide())},g=function(b,c){c.wrapper_autocomplete.find("input:first").bind("focus",function(){c.wrapper_autocomplete.addClass("grp-state-focus")}).bind("blur",function(){c.wrapper_autocomplete.removeClass("grp-state-focus")}).autocomplete({minLength:1,delay:1e3,source:function(d,e){a.ajax({url:c.autocomplete_lookup_url,dataType:"json",data:"term="+encodeURIComponent(d.term)+"&app_label="+grappelli.get_app_label(b)+"&model_name="+grappelli.get_model_name(b)+"&query_string="+grappelli.get_query_string(b),beforeSend:function(){var b=a(c.content_type).val()||a(c.content_type).find(":checked").val();return b?void c.loader.show():!1},success:function(b){e(a.map(b,function(a){return{label:a.label,value:a.value}}))},complete:function(){c.loader.hide()}})},focus:function(){return!1},select:function(d,e){return c.input_field.val(e.item.label),b.val(e.item.value),b.trigger("change"),b.val()?a(c.remove_link).show():a(c.remove_link).hide(),!1}}).data("ui-autocomplete")._renderItem=function(b,c){return c.value?a("
").data("item.autocomplete",c).append("
"+c.label+"").appendTo(b):a("
").data("item.autocomplete",c).append("
"+c.label+"").appendTo(b)}},h=function(b,c){a.getJSON(c.lookup_url,{object_id:b.val(),app_label:grappelli.get_app_label(b),model_name:grappelli.get_model_name(b)},function(d){a.each(d,function(e){c.input_field.val(d[e].label),b.val()?a(c.remove_link).show():a(c.remove_link).hide()})})};a.fn.grp_autocomplete_generic.defaults={autocomplete_lookup_url:"",lookup_url:"",content_type:"",object_id:""}}(grp.jQuery),function(a){var b={init:function(b){return b=a.extend({},a.fn.grp_autocomplete_m2m.defaults,b),this.each(function(){var c=a(this);c.attr({tabindex:"-1",readonly:"readonly"}).addClass("grp-autocomplete-hidden-field"),c.next().after(e).after(f(c.attr("id"))),c.parent().wrapInner("
"),c.parent().prepend("
"),b=a.extend({wrapper_autocomplete:c.parent(),wrapper_repr:c.parent().find("ul.grp-repr"),wrapper_search:c.parent().find("li.grp-search"),remove_link:c.next().next().hide(),loader:c.next().next().next().hide()},a.fn.grp_autocomplete_m2m.defaults,b),c.parent().find("ul.errorlist")&&c.parent().find("ul.errorlist").detach().appendTo(c.parent().parent()),i(c,b),h(c,b),c.bind("change focus keyup",function(){i(c,b)}),a("label[for='"+c.attr("id")+"']").each(function(){a(this).attr("for",c.attr("id")+"-autocomplete")}),b.wrapper_autocomplete.bind("click",function(c){a(c.target).hasClass("related-lookup")||a(c.target).hasClass("grp-related-remove")||b.wrapper_search.find("input:first").focus()})})}};a.fn.grp_autocomplete_m2m=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?(a.error("Method "+c+" does not exist on jQuery.grp_autocomplete_m2m"),!1):b.init.apply(this,arguments)};var c=function(a,b){var c=[];return a.val()&&(c=a.val().split(",")),c.push(b),a.val(c.join(",")),a.trigger("change"),c.join(",")},d=function(a,b){var c=[];return a.val()&&(c=a.val().split(",")),c.splice(b,1),a.val(c.join(",")),a.trigger("change"),c.join(",")},e=function(){var b=a('
loader
');return b},f=function(b){var c=a('
');return c.attr("id","remove_"+b),c.attr("href","javascript://"),c.attr("onClick","return removeRelatedObject(this);"),c.hover(function(){a(this).parent().toggleClass("grp-autocomplete-preremove")}),c},g=function(b,c,e){var f=a('
'),g=a('
'+c+"");f.append(g),f.insertBefore(e.wrapper_search),g.bind("click",function(c){var f=a(this).parent().parent().children("li").index(a(this).parent());d(b,f,e),a(this).parent().remove(),b.val()?a(e.remove_link).show():a(e.remove_link).hide(),c.stopPropagation()}),g.hover(function(){a(this).parent().toggleClass("grp-autocomplete-preremove")})},h=function(b,d){d.wrapper_search.find("input:first").bind("keydown",function(b){b.keyCode===a.ui.keyCode.TAB&&a(this).data("uiAutocomplete").menu.active&&b.preventDefault()}).bind("focus",function(){d.wrapper_autocomplete.addClass("grp-state-focus")}).bind("blur",function(){d.wrapper_autocomplete.removeClass("grp-state-focus")}).autocomplete({minLength:1,delay:1e3,position:{my:"left top",at:"left bottom",of:d.wrapper_autocomplete},open:function(){a(".ui-menu").width(d.wrapper_autocomplete.outerWidth()-6)},source:function(c,e){a.ajax({url:d.autocomplete_lookup_url,dataType:"json",data:"term="+encodeURIComponent(c.term)+"&app_label="+grappelli.get_app_label(b)+"&model_name="+grappelli.get_model_name(b)+"&query_string="+grappelli.get_query_string(b),beforeSend:function(){d.loader.show()},success:function(b){e(a.map(b,function(a){return{label:a.label,value:a.value}}))},complete:function(){d.loader.hide()}})},focus:function(){return!1},select:function(e,f){return g(b,f.item.label,d),c(b,f.item.value,d),b.val()?a(d.remove_link).show():a(d.remove_link).hide(),a(this).val("").focus(),!1}}).data("ui-autocomplete")._renderItem=function(b,c){return c.value?a("
").data("item.autocomplete",c).append("
"+c.label+"").appendTo(b):a("
").data("item.autocomplete",c).append("
"+c.label+"").appendTo(b)}},i=function(b,c){a.getJSON(c.lookup_url,{object_id:b.val(),app_label:grappelli.get_app_label(b),model_name:grappelli.get_model_name(b)},function(d){c.wrapper_repr.find("li.grp-repr").remove(),c.wrapper_search.find("input").val(""),a.each(d,function(a){d[a].value&&g(b,d[a].label,c)}),b.val()?a(c.remove_link).show():a(c.remove_link).hide()})}}(grp.jQuery),function(a){a.fn.grp_collapsible=function(c){var d={toggle_handler_slctr:".grp-collapse-handler:first",closed_css:"grp-closed",open_css:"grp-open",on_init:function(){},on_toggle:function(){}},e=a.extend(d,c);return this.each(function(){b(a(this),e)})};var b=function(a,b){b.on_init(a,b),c(a,b)},c=function(a,b){d(a,b)},d=function(a,b){a.children(b.toggle_handler_slctr).click(function(){a.toggleClass(b.closed_css).toggleClass(b.open_css),b.on_toggle(a,b)})}}(grp.jQuery),function(a){a.fn.grp_collapsible_group=function(c){var d={open_handler_slctr:".grp-open-handler",close_handler_slctr:".grp-close-handler",collapsible_container_slctr:".grp-collapse",closed_css:"grp-closed",open_css:"grp-open",on_init:function(){},on_open:function(){},on_close:function(){}};return c=a.extend(d,c),this.each(function(){b(a(this),c)})};var b=function(a,b){b.on_init(a,b),c(a,b)},c=function(a,b){d(a,b),e(a,b)},d=function(b,c){b.find(c.open_handler_slctr).each(function(){a(this).click(function(){c.on_open(b,c),b.find(c.collapsible_container_slctr).removeClass(c.closed_css).addClass(c.open_css),b.removeClass(c.closed_css).addClass(c.open_css)})})},e=function(b,c){b.find(c.close_handler_slctr).each(function(){a(this).click(function(){c.on_close(b,c),b.find(c.collapsible_container_slctr).removeClass(c.open_css).addClass(c.closed_css)})})}}(grp.jQuery),function(a){a.fn.grp_inline=function(b){var c={prefix:"form",addText:"add another",deleteText:"remove",addCssClass:"grp-add-handler",removeCssClass:"grp-remove-handler",deleteCssClass:"grp-delete-handler",emptyCssClass:"grp-empty-form",formCssClass:"grp-dynamic-form",predeleteCssClass:"grp-predelete",onBeforeInit:function(){},onBeforeAdded:function(){},onBeforeRemoved:function(){},onBeforeDeleted:function(){},onAfterInit:function(){},onAfterAdded:function(){},onAfterRemoved:function(){},onAfterDeleted:function(){}};return b=a.extend(c,b),this.each(function(){var c=a(this),d=c.find("#id_"+b.prefix+"-TOTAL_FORMS");d.attr("autocomplete","off"),initInlineForms(c,b),initAddButtons(c,b),addButtonHandler(c.find("a."+b.addCssClass),b),removeButtonHandler(c.find("a."+b.removeCssClass),b),deleteButtonHandler(c.find("a."+b.deleteCssClass),b)})},getFormIndex=function(a,b,c){var d=a.find("[id^='id_"+b.prefix+"']").attr("id");return d?parseInt(c.exec(d)[1],10):-1},updateFormIndex=function(b,c,d,e){b.find(":input,span,table,iframe,label,a,ul,p,img,div").each(function(){var b=a(this),c=b.attr("id"),f=b.attr("name"),g=b.attr("for"),h=b.attr("href"),i=b.attr("class"),j=b.attr("onclick");c&&b.attr("id",c.replace(d,e)),f&&b.attr("name",f.replace(d,e)),g&&b.attr("for",g.replace(d,e)),h&&b.attr("href",h.replace(d,e)),i&&b.attr("class",i.replace(d,e)),j&&b.attr("onclick",j.replace(d,e))})},initInlineForms=function(b,c){b.find("div.grp-module").each(function(){var b=a(this);c.onBeforeInit(b),""!==b.attr("id")&&b.not("."+c.emptyCssClass).not(".grp-table").not(".grp-thead").not(".add-item").addClass(c.formCssClass),b.find("li.grp-delete-handler-container input").each(function(){a(this).is(":checked")&&b.hasClass("has_original")&&b.toggleClass(c.predeleteCssClass)}),c.onAfterInit(b)})},initAddButtons=function(a,b){{var c=a.find("#id_"+b.prefix+"-TOTAL_FORMS"),d=a.find("#id_"+b.prefix+"-MAX_NUM_FORMS");a.find("a."+b.addCssClass)}""!==d.val()&&d.val()-c.val()<=0&&hideAddButtons(a,b)},addButtonHandler=function(a,b){a.bind("click",function(){var c=a.parents(".grp-group"),d=c.find("#id_"+b.prefix+"-TOTAL_FORMS"),e=c.find("#id_"+b.prefix+"-MAX_NUM_FORMS"),f=(c.find("a."+b.addCssClass),c.find("#"+b.prefix+"-empty"));b.onBeforeAdded(c);var g=parseInt(d.val(),10),h=f.clone(!0);h.removeClass(b.emptyCssClass).attr("id",f.attr("id").replace("-empty",g));var i=/__prefix__/g;updateFormIndex(h,b,i,g),h.insertBefore(f).addClass(b.formCssClass),d.val(g+1),0!==e.val()&&""!==e.val()&&e.val()-d.val()<=0&&hideAddButtons(c,b),b.onAfterAdded(h)})},removeButtonHandler=function(b,c){b.bind("click",function(){var d=b.parents(".grp-group"),e=a(this).parents("."+c.formCssClass).first(),f=d.find("#id_"+c.prefix+"-TOTAL_FORMS"),g=d.find("#id_"+c.prefix+"-MAX_NUM_FORMS"),h=/-(\d+)-/,i=getFormIndex(e,c,h);c.onBeforeRemoved(e),e.remove(),f.val(parseInt(f.val(),10)-1),0!==g.val()&&g.val()-f.val()>0&&showAddButtons(d,c),d.find("."+c.formCssClass).each(function(){var b=a(this),d=getFormIndex(b,c,h);d>i&&updateFormIndex(b,c,h,"-"+(d-1)+"-")}),c.onAfterRemoved(d)})},deleteButtonHandler=function(b,c){b.bind("click",function(){var b=a(this).prev(),d=a(this).parents("."+c.formCssClass).first();c.onBeforeDeleted(d),d.hasClass("has_original")&&(d.toggleClass(c.predeleteCssClass),b.prop("checked")?b.removeAttr("checked"):b.prop("checked",!0)),c.onAfterDeleted(d)})},hideAddButtons=function(a,b){var c=a.find("a."+b.addCssClass);c.hide().parents(".grp-add-item").hide(),c.closest(".grp-module.grp-transparent").hide()},showAddButtons=function(a,b){var c=a.find("a."+b.addCssClass);c.show().parents(".grp-add-item").show(),c.closest(".grp-module.grp-transparent").show()}}(grp.jQuery),function(a){var b={init:function(b){return b=a.extend({},a.fn.grp_related_fk.defaults,b),this.each(function(){var d=a(this),e=d.parent();e.find("a.related-lookup").next().is("strong")&&(e.find("a.related-lookup").get(0).nextSibling.nodeValue="",e.find("a.related-lookup").next("strong").remove()),e.find("a.related-lookup").after(b.placeholder),d.addClass("grp-has-related-lookup"),c(d,b),d.bind("change focus keyup",function(){c(d,b)})})}};a.fn.grp_related_fk=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?(a.error("Method "+c+" does not exist on jQuery.grp_related_fk"),!1):b.init.apply(this,arguments)};var c=function(b,c){var d=b.parent().find(".grp-placeholder-related-fk");a.getJSON(c.lookup_url,{object_id:b.val(),app_label:grappelli.get_app_label(b),model_name:grappelli.get_model_name(b),query_string:grappelli.get_query_string(b)},function(a){""===a[0].label?d.hide():d.show(),d.html('
'+a[0].label+"")})};a.fn.grp_related_fk.defaults={placeholder:'
',repr_max_length:30,lookup_url:""}}(grp.jQuery),function(a){var b={init:function(b){return b=a.extend({},a.fn.grp_related_generic.defaults,b),this.each(function(){var f=a(this),g=a(b.content_type).val()||a(b.content_type).find(":checked").val();g&&f.after(b.placeholder).after(c(f.attr("id"),g)),f.addClass("grp-has-related-lookup"),g&&e(f,b),f.bind("change focus keyup",function(){e(f,b)}),a(b.content_type).bind("change",function(){d(a(this),b)})})}};a.fn.grp_related_generic=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?(a.error("Method "+c+" does not exist on jQuery.grp_related_generic"),!1):b.init.apply(this,arguments)};var c=function(b,c){var d=a('
');return d.attr("id","lookup_"+b),d.attr("href","../../../"+MODEL_URL_ARRAY[c].app+"/"+MODEL_URL_ARRAY[c].model+"/?"),d.attr("onClick","return showRelatedObjectLookupPopup(this);"),d},d=function(b,d){var e=a(d.object_id);e.val(""),e.parent().find("a.related-lookup").remove(),e.parent().find(".grp-placeholder-related-generic").remove();var f=a(b).val()||a(b).find(":checked").val();f&&e.after(d.placeholder).after(c(e.attr("id"),f))},e=function(b,c){var d=b.next().next();a.getJSON(c.lookup_url,{object_id:b.val(),app_label:grappelli.get_app_label(b),model_name:grappelli.get_model_name(b),query_string:grappelli.get_query_string(b)},function(a){""===a[0].label?d.hide():d.show(),d.html('
'+a[0].label+"")})};a.fn.grp_related_generic.defaults={placeholder:'
',repr_max_length:30,lookup_url:"",content_type:"",object_id:""}}(grp.jQuery),function(a){var b={init:function(b){return b=a.extend({},a.fn.grp_related_m2m.defaults,b),this.each(function(){var d=a(this);d.parent().find("a.related-lookup").after(b.placeholder),d.next().addClass("grp-m2m"),d.addClass("grp-has-related-lookup"),c(d,b),d.bind("change focus keyup",function(){c(d,b)})})}};a.fn.grp_related_m2m=function(c){return b[c]?b[c].apply(this,Array.prototype.slice.call(arguments,1)):"object"!=typeof c&&c?(a.error("Method "+c+" does not exist on jQuery.grp_related_m2m"),!1):b.init.apply(this,arguments)};var c=function(b,c){a.getJSON(c.lookup_url,{object_id:b.val(),app_label:grappelli.get_app_label(b),model_name:grappelli.get_model_name(b),query_string:grappelli.get_query_string(b)},function(c){values=a.map(c,function(a){return'
'+a.label+""}),""===values?b.parent().find(".grp-placeholder-related-m2m").hide():b.parent().find(".grp-placeholder-related-m2m").show(),b.parent().find(".grp-placeholder-related-m2m").html(values.join('
'))})};a.fn.grp_related_m2m.defaults={placeholder:'
',repr_max_length:30,lookup_url:""}}(grp.jQuery),function(a){a.widget("ui.grp_timepicker",{options:{template:'
',timepicker_selector:"#ui-timepicker",offset:{top:0},default_time_list:["now","00:00","01:00","02:00","03:00","04:00","05:00","06:00","07:00","08:00","09:00","10:00","11:00","12:00","13:00","14:00","15:00","16:00","17:00","18:00","19:00","20:00","21:00","22:00","23:00"],time_list:[]},_create:function(){var b=this;a(document).mousedown(function(c){if(b.timepicker.is(":visible")){var d=a(c.target);d[0].id==b.timepicker[0].id||0!==d.parents(b.options.timepicker_selector).length||d.hasClass("hasTimepicker")||d.hasClass("ui-timepicker-trigger")||b.timepicker.hide()}}),a(document).keyup(function(a){27==a.keyCode&&b.timepicker.hide()}),0===a(this.options.timepicker_selector).size()&&a(this.options.template).appendTo("body"),this.timepicker=a(this.options.timepicker_selector),this.timepicker.hide(),this.element.addClass("hasTimepicker"),this.button=a('
'),this.element.after(this.button),this.element.prop("disabled")?this.button.prop("disabled",!0):this.button.click(function(){b._toggleTimepicker()})},_toggleTimepicker:function(){this.timepicker.is(":visible")?this.timepicker.hide():(this.element.focus(),this._generateTimepickerContents(),this._showTimepicker())},_generateTimepickerContents:function(){var b=this,c="
";0===this.options.time_list.length&&(this.options.time_list=this.options.default_time_list);for(var d=0;df?"0"+f:f,g=10>g?"0"+g:g,c+='- '+f+":"+g+"
"}else c+='- '+this.options.time_list[d]+"
";c+="
",this.timepicker.html(c),this.timepicker.find("li").click(function(){a(this).parent().children("li").removeClass("ui-state-active"),a(this).addClass("ui-state-active"),b.element.val(a(this).html()),b.timepicker.hide()})},_showTimepicker:function(){var a=document.documentElement.clientHeight,b=document.documentElement.scrollTop||document.body.scrollTop,c=this.element.outerHeight(),d=this.timepicker.outerHeight()+c,e=this.element.offset().top,f=this.element.offset().left,g=e-b+d+60;if(a>g){var h=e+c;this.timepicker.css("left",f+"px").css("top",h+"px")}else{var i=e-d+c;this.timepicker.css("left",f+"px").css("top",i+"px")}this.timepicker.show()},destroy:function(){a.Widget.prototype.destroy.apply(this,arguments)}})}(grp.jQuery);
\ No newline at end of file
diff --git a/static/grappelli/js/jquery.grp_autocomplete_fk.js b/static/grappelli/js/jquery.grp_autocomplete_fk.js
new file mode 100644
index 0000000..490bc4f
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_autocomplete_fk.js
@@ -0,0 +1,145 @@
+/**
+ * GRAPPELLI AUTOCOMPLETE FK
+ * foreign-key lookup with autocomplete
+ */
+
+(function($){
+
+ var methods = {
+ init: function(options) {
+ options = $.extend({}, $.fn.grp_autocomplete_fk.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ // assign attributes
+ $this.attr({
+ "tabindex": "-1",
+ "readonly": "readonly"
+ }).addClass("grp-autocomplete-hidden-field");
+ // remove djangos object representation (if given)
+ if ($this.next().next() && $this.next().next().attr("class") != "errorlist" && $this.next().next().attr("class") != "grp-help") $this.next().next().remove();
+ // build autocomplete wrapper
+ $this.next().after(loader).after(remove_link($this.attr('id')));
+ $this.parent().wrapInner("
");
+ $this.parent().prepend("
");
+ // extend options
+ options = $.extend({
+ wrapper_autocomplete: $this.parent(),
+ input_field: $this.prev(),
+ remove_link: $this.next().next().hide(),
+ loader: $this.next().next().next().hide()
+ }, $.fn.grp_autocomplete_fk.defaults, options);
+ // lookup
+ lookup_id($this, options); // lookup when loading page
+ lookup_autocomplete($this, options); // autocomplete-handler
+ $this.bind("change focus keyup", function() { // id-handler
+ lookup_id($this, options);
+ });
+ // labels
+ $("label[for='"+$this.attr('id')+"']").each(function() {
+ $(this).attr("for", $this.attr("id")+"-autocomplete");
+ });
+ });
+ }
+ };
+
+ $.fn.grp_autocomplete_fk = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || ! method) {
+ return methods.init.apply(this, arguments);
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.grp_autocomplete_fk');
+ }
+ return false;
+ };
+
+ var loader = function() {
+ var loader = $('
loader
');
+ return loader;
+ };
+
+ var remove_link = function(id) {
+ var removelink = $('
');
+ removelink.attr('id', 'remove_'+id);
+ removelink.attr('href', 'javascript://');
+ removelink.attr('onClick', 'return removeRelatedObject(this);');
+ removelink.hover(function() {
+ $(this).parent().toggleClass("grp-autocomplete-preremove");
+ });
+ return removelink;
+ };
+
+ var lookup_autocomplete = function(elem, options) {
+ options.wrapper_autocomplete.find("input:first")
+ .bind("focus", function() {
+ options.wrapper_autocomplete.addClass("grp-state-focus");
+ })
+ .bind("blur", function() {
+ options.wrapper_autocomplete.removeClass("grp-state-focus");
+ })
+ .autocomplete({
+ minLength: 1,
+ delay: 1000,
+ source: function(request, response) {
+ $.ajax({
+ url: options.autocomplete_lookup_url,
+ dataType: 'json',
+ data: "term=" + encodeURIComponent(request.term) + "&app_label=" + grappelli.get_app_label(elem) + "&model_name=" + grappelli.get_model_name(elem) + "&query_string=" + grappelli.get_query_string(elem),
+ beforeSend: function (XMLHttpRequest) {
+ options.loader.show();
+ },
+ success: function(data){
+ response($.map(data, function(item) {
+ return {label: item.label, value: item.value};
+ }));
+ },
+ complete: function (XMLHttpRequest, textStatus) {
+ options.loader.hide();
+ }
+ });
+ },
+ focus: function() { // prevent value inserted on focus
+ return false;
+ },
+ select: function(event, ui) {
+ options.input_field.val(ui.item.label);
+ elem.val(ui.item.value);
+ elem.trigger('change');
+ elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();
+ return false;
+ }
+ })
+ .data("ui-autocomplete")._renderItem = function(ul,item) {
+ if (!item.value) {
+ return $("
")
+ .data( "item.autocomplete", item )
+ .append( "
" + item.label + "")
+ .appendTo(ul);
+ } else {
+ return $("
")
+ .data( "item.autocomplete", item )
+ .append( "
" + item.label + "")
+ .appendTo(ul);
+ }
+ };
+ };
+
+ var lookup_id = function(elem, options) {
+ $.getJSON(options.lookup_url, {
+ object_id: elem.val(),
+ app_label: grappelli.get_app_label(elem),
+ model_name: grappelli.get_model_name(elem)
+ }, function(data) {
+ $.each(data, function(index) {
+ options.input_field.val(data[index].label);
+ elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();
+ });
+ });
+ };
+
+ $.fn.grp_autocomplete_fk.defaults = {
+ autocomplete_lookup_url: '',
+ lookup_url: ''
+ };
+
+})(grp.jQuery);
diff --git a/static/grappelli/js/jquery.grp_autocomplete_generic.js b/static/grappelli/js/jquery.grp_autocomplete_generic.js
new file mode 100644
index 0000000..49bd1d1
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_autocomplete_generic.js
@@ -0,0 +1,182 @@
+/**
+ * GRAPPELLI AUTOCOMPLETE GENERIC
+ * generic lookup with autocomplete
+ */
+
+(function($){
+
+ var methods = {
+ init: function(options) {
+ options = $.extend({}, $.fn.grp_autocomplete_generic.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ // assign attributes
+ $this.attr({
+ "tabindex": "-1",
+ "readonly": "readonly"
+ }).addClass("grp-autocomplete-hidden-field");
+ // build autocomplete wrapper
+ var val = $(options.content_type).val() || $(options.content_type).find(':checked').val();
+ if (val) {
+ $this.after(loader).after(remove_link($this.attr('id'))).after(lookup_link($this.attr("id"),val));
+ }
+ $this.parent().wrapInner("
");
+ $this.parent().prepend("
");
+ // defaults
+ options = $.extend({
+ wrapper_autocomplete: $(this).parent(),
+ input_field: $(this).prev(),
+ remove_link: $this.nextAll("a.grp-related-remove").hide(),
+ loader: $this.nextAll("div.grp-loader").hide()
+ }, $.fn.grp_autocomplete_generic.defaults, options);
+ // lookup
+ if (val) {
+ lookup_id($this, options); // lookup when loading page
+ }
+ lookup_autocomplete($this, options); // autocomplete-handler
+ $this.bind("change focus keyup", function() { // id-handler
+ lookup_id($this, options);
+ });
+ $(options.content_type).bind("change", function() { // content-type-handler
+ update_lookup($(this), options);
+ });
+ // labels
+ $("label[for='"+$this.attr('id')+"']").each(function() {
+ $(this).attr("for", $this.attr("id")+"-autocomplete");
+ });
+ });
+ }
+ };
+
+ $.fn.grp_autocomplete_generic = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || ! method) {
+ return methods.init.apply(this, arguments);
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.grp_autocomplete_generic');
+ }
+ return false;
+ };
+
+ var loader = function() {
+ var loader = $('
loader
');
+ return loader;
+ };
+
+ var remove_link = function(id) {
+ var removelink = $('
');
+ removelink.attr('id', 'remove_'+id);
+ removelink.attr('href', 'javascript://');
+ removelink.attr('onClick', 'return removeRelatedObject(this);');
+ removelink.hover(function() {
+ $(this).parent().toggleClass("grp-autocomplete-preremove");
+ });
+ return removelink;
+ };
+
+ var lookup_link = function(id, val) {
+ var lookuplink = $('
');
+ lookuplink.attr('id', 'lookup_'+id);
+ lookuplink.attr('href', "../../../" + MODEL_URL_ARRAY[val].app + "/" + MODEL_URL_ARRAY[val].model + '/?');
+ lookuplink.attr('onClick', 'return showRelatedObjectLookupPopup(this);');
+ return lookuplink;
+ };
+
+ var update_lookup = function(elem, options) {
+ var obj = $(options.object_id);
+ obj.val('');
+ obj.prev().val('');
+ // remove loader, a-related, related-lookup
+ obj.nextAll("a.related-lookup").remove();
+ obj.nextAll("a.grp-related-remove").remove();
+ obj.nextAll("div.grp-loader").remove();
+ var val = $(elem).val() || $(elem).find(':checked').val();
+ if (val) {
+ obj.after(loader).after(remove_link(obj.attr('id'))).after(lookup_link(obj.attr('id'),val));
+ options.remove_link = obj.nextAll("a.grp-related-remove").hide();
+ options.loader = obj.nextAll("div.grp-loader").hide();
+ }
+ };
+
+ var lookup_autocomplete = function(elem, options) {
+ options.wrapper_autocomplete.find("input:first")
+ .bind("focus", function() {
+ options.wrapper_autocomplete.addClass("grp-state-focus");
+ })
+ .bind("blur", function() {
+ options.wrapper_autocomplete.removeClass("grp-state-focus");
+ })
+ .autocomplete({
+ minLength: 1,
+ delay: 1000,
+ source: function(request, response) {
+ $.ajax({
+ url: options.autocomplete_lookup_url,
+ dataType: 'json',
+ data: "term=" + encodeURIComponent(request.term) + "&app_label=" + grappelli.get_app_label(elem) + "&model_name=" + grappelli.get_model_name(elem) + "&query_string=" + grappelli.get_query_string(elem),
+ beforeSend: function (XMLHttpRequest) {
+ var val = $(options.content_type).val() || $(options.content_type).find(':checked').val();
+ if (val) {
+ options.loader.show();
+ } else {
+ return false;
+ }
+ },
+ success: function(data){
+ response($.map(data, function(item) {
+ return {label: item.label, value: item.value};
+ }));
+ },
+ complete: function (XMLHttpRequest, textStatus) {
+ options.loader.hide();
+ }
+ });
+ },
+ focus: function() { // prevent value inserted on focus
+ return false;
+ },
+ select: function(event, ui) {
+ options.input_field.val(ui.item.label);
+ elem.val(ui.item.value);
+ elem.trigger('change');
+ elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();
+ return false;
+ }
+ })
+ .data("ui-autocomplete")._renderItem = function(ul,item) {
+ if (!item.value) {
+ return $("
")
+ .data( "item.autocomplete", item )
+ .append( "
" + item.label + "")
+ .appendTo(ul);
+ } else {
+ return $("
")
+ .data( "item.autocomplete", item )
+ .append( "
" + item.label + "")
+ .appendTo(ul);
+ }
+ };
+ };
+
+ var lookup_id = function(elem, options) {
+ $.getJSON(options.lookup_url, {
+ object_id: elem.val(),
+ app_label: grappelli.get_app_label(elem),
+ model_name: grappelli.get_model_name(elem)
+ }, function(data) {
+ $.each(data, function(index) {
+ options.input_field.val(data[index].label);
+ elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();
+ });
+ });
+ };
+
+ $.fn.grp_autocomplete_generic.defaults = {
+ autocomplete_lookup_url: '',
+ lookup_url: '',
+ content_type: '',
+ object_id: ''
+ };
+
+})(grp.jQuery);
diff --git a/static/grappelli/js/jquery.grp_autocomplete_m2m.js b/static/grappelli/js/jquery.grp_autocomplete_m2m.js
new file mode 100644
index 0000000..adc3ff4
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_autocomplete_m2m.js
@@ -0,0 +1,198 @@
+/**
+ * GRAPPELLI AUTOCOMPLETE M2M
+ * many-to-many lookup with autocomplete
+ */
+
+
+(function($){
+
+ var methods = {
+ init: function(options) {
+ options = $.extend({}, $.fn.grp_autocomplete_m2m.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ // assign attributes
+ $this.attr({
+ "tabindex": "-1",
+ "readonly": "readonly"
+ }).addClass("grp-autocomplete-hidden-field");
+ // build autocomplete wrapper
+ $this.next().after(loader).after(remove_link($this.attr('id')));
+ $this.parent().wrapInner("
");
+ //$this.parent().prepend("
").prepend("
");
+ $this.parent().prepend("
");
+ // defaults
+ options = $.extend({
+ wrapper_autocomplete: $this.parent(),
+ wrapper_repr: $this.parent().find("ul.grp-repr"),
+ wrapper_search: $this.parent().find("li.grp-search"),
+ remove_link: $this.next().next().hide(),
+ loader: $this.next().next().next().hide()
+ }, $.fn.grp_autocomplete_m2m.defaults, options);
+ // move errorlist outside the wrapper
+ if ($this.parent().find("ul.errorlist")) {
+ $this.parent().find("ul.errorlist").detach().appendTo($this.parent().parent());
+ }
+ // lookup
+ lookup_id($this, options); // lookup when loading page
+ lookup_autocomplete($this, options); // autocomplete-handler
+ $this.bind("change focus keyup", function() { // id-handler
+ lookup_id($this, options);
+ });
+ // labels
+ $("label[for='"+$this.attr('id')+"']").each(function() {
+ $(this).attr("for", $this.attr("id")+"-autocomplete");
+ });
+ // click on div > focus input
+ options.wrapper_autocomplete.bind("click", function(e) {
+ // prevent focus when clicking on remove/select
+ if (!$(e.target).hasClass("related-lookup") && !$(e.target).hasClass("grp-related-remove")) {
+ options.wrapper_search.find("input:first").focus();
+ }
+ });
+ });
+ }
+ };
+
+ $.fn.grp_autocomplete_m2m = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || ! method) {
+ return methods.init.apply(this, arguments);
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.grp_autocomplete_m2m');
+ }
+ return false;
+ };
+
+ var value_add = function(elem, value, options) {
+ var values = [];
+ if (elem.val()) values = elem.val().split(",");
+ values.push(value);
+ elem.val(values.join(","));
+ elem.trigger('change');
+ return values.join(",");
+ };
+
+ var value_remove = function(elem, position, options) {
+ var values = [];
+ if (elem.val()) values = elem.val().split(",");
+ values.splice(position,1);
+ elem.val(values.join(","));
+ elem.trigger('change');
+ return values.join(",");
+ };
+
+ var loader = function() {
+ var loader = $('
loader
');
+ return loader;
+ };
+
+ var remove_link = function(id) {
+ var removelink = $('
');
+ removelink.attr('id', 'remove_'+id);
+ removelink.attr('href', 'javascript://');
+ removelink.attr('onClick', 'return removeRelatedObject(this);');
+ removelink.hover(function() {
+ $(this).parent().toggleClass("grp-autocomplete-preremove");
+ });
+ return removelink;
+ };
+
+ var repr_add = function(elem, label, options) {
+ var repr = $('
');
+ var removelink = $('
' + label + '');
+ repr.append(removelink);
+ repr.insertBefore(options.wrapper_search);
+ removelink.bind("click", function(e) { // remove-handler
+ var pos = $(this).parent().parent().children("li").index($(this).parent());
+ value_remove(elem, pos, options);
+ $(this).parent().remove();
+ elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();
+ e.stopPropagation(); // prevent focus on input
+ });
+ removelink.hover(function() {
+ $(this).parent().toggleClass("grp-autocomplete-preremove");
+ });
+ };
+
+ var lookup_autocomplete = function(elem, options) {
+ options.wrapper_search.find("input:first")
+ .bind("keydown", function(event) { // don't navigate away from the field on tab when selecting an item
+ if (event.keyCode === $.ui.keyCode.TAB && $(this).data("uiAutocomplete").menu.active) {
+ event.preventDefault();
+ }
+ })
+ .bind("focus", function() {
+ options.wrapper_autocomplete.addClass("grp-state-focus");
+ })
+ .bind("blur", function() {
+ options.wrapper_autocomplete.removeClass("grp-state-focus");
+ })
+ .autocomplete({
+ minLength: 1,
+ delay: 1000,
+ position: {my: "left top", at: "left bottom", of: options.wrapper_autocomplete},
+ open: function(event, ui) {
+ $(".ui-menu").width(options.wrapper_autocomplete.outerWidth()-6);
+ },
+ source: function(request, response) {
+ $.ajax({
+ url: options.autocomplete_lookup_url,
+ dataType: 'json',
+ data: "term=" + encodeURIComponent(request.term) + "&app_label=" + grappelli.get_app_label(elem) + "&model_name=" + grappelli.get_model_name(elem) + "&query_string=" + grappelli.get_query_string(elem),
+ beforeSend: function (XMLHttpRequest) {
+ options.loader.show();
+ },
+ success: function(data){
+ response($.map(data, function(item) {
+ return {label: item.label, value: item.value};
+ }));
+ },
+ complete: function (XMLHttpRequest, textStatus) {
+ options.loader.hide();
+ }
+ });
+ },
+ focus: function() { // prevent value inserted on focus
+ return false;
+ },
+ select: function(event, ui) { // add repr, add value
+ repr_add(elem, ui.item.label, options);
+ value_add(elem, ui.item.value, options);
+ elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();
+ $(this).val("").focus();
+ return false;
+ }
+ })
+ .data("ui-autocomplete")._renderItem = function(ul,item) {
+ if (!item.value) {
+ return $("
")
+ .data( "item.autocomplete", item )
+ .append( "
" + item.label + "")
+ .appendTo(ul);
+ } else {
+ return $("
")
+ .data( "item.autocomplete", item )
+ .append( "
" + item.label + "")
+ .appendTo(ul);
+ }
+ };
+ };
+
+ var lookup_id = function(elem, options) {
+ $.getJSON(options.lookup_url, {
+ object_id: elem.val(),
+ app_label: grappelli.get_app_label(elem),
+ model_name: grappelli.get_model_name(elem)
+ }, function(data) {
+ options.wrapper_repr.find("li.grp-repr").remove();
+ options.wrapper_search.find("input").val("");
+ $.each(data, function(index) {
+ if (data[index].value) repr_add(elem, data[index].label, options);
+ });
+ elem.val() ? $(options.remove_link).show() : $(options.remove_link).hide();
+ });
+ };
+
+})(grp.jQuery);
diff --git a/static/grappelli/js/jquery.grp_collapsible.js b/static/grappelli/js/jquery.grp_collapsible.js
new file mode 100644
index 0000000..b6be960
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_collapsible.js
@@ -0,0 +1,35 @@
+/**
+ * GRAPPELLI COLLAPSIBLES
+ * handles collapsibles,
+ * excluding open/closing all elements
+ * within a group.
+ */
+
+(function($) {
+ $.fn.grp_collapsible = function(options){
+ var defaults = {
+ toggle_handler_slctr: ".grp-collapse-handler:first",
+ closed_css: "grp-closed",
+ open_css: "grp-open",
+ on_init: function() {},
+ on_toggle: function() {}
+ };
+ var opts = $.extend(defaults, options);
+ return this.each(function() {
+ _initialize($(this), opts);
+ });
+ };
+ var _initialize = function(elem, options) {
+ options.on_init(elem, options);
+ _register_handlers(elem, options);
+ };
+ var _register_handlers = function(elem, options) {
+ _register_toggle_handler(elem, options);
+ };
+ var _register_toggle_handler = function(elem, options) {
+ elem.children(options.toggle_handler_slctr).click(function() {
+ elem.toggleClass(options.closed_css).toggleClass(options.open_css);
+ options.on_toggle(elem, options);
+ });
+ };
+})(grp.jQuery);
\ No newline at end of file
diff --git a/static/grappelli/js/jquery.grp_collapsible_group.js b/static/grappelli/js/jquery.grp_collapsible_group.js
new file mode 100644
index 0000000..d61c5db
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_collapsible_group.js
@@ -0,0 +1,54 @@
+/**
+ * GRAPPELLI GROUP COLLAPSIBLES
+ * handles open/closing of all elements
+ * with tabular- and stacked-inlines.
+ */
+
+(function($) {
+ $.fn.grp_collapsible_group = function(options){
+ var defaults = {
+ open_handler_slctr: ".grp-open-handler",
+ close_handler_slctr: ".grp-close-handler",
+ collapsible_container_slctr: ".grp-collapse",
+ closed_css: "grp-closed",
+ open_css: "grp-open",
+ on_init: function() {},
+ on_open: function() {},
+ on_close: function() {}
+ };
+ options = $.extend(defaults, options);
+ return this.each(function() {
+ _initialize($(this), options);
+ });
+ };
+ var _initialize = function(elem, options) {
+ options.on_init(elem, options);
+ _register_handlers(elem, options);
+ };
+ var _register_handlers = function(elem, options) {
+ _register_open_handler(elem, options);
+ _register_close_handler(elem, options);
+ };
+ var _register_open_handler = function(elem, options) {
+ elem.find(options.open_handler_slctr).each(function() {
+ $(this).click(function() {
+ options.on_open(elem, options);
+ elem.find(options.collapsible_container_slctr)
+ .removeClass(options.closed_css)
+ .addClass(options.open_css);
+ elem.removeClass(options.closed_css)
+ .addClass(options.open_css);
+ });
+ });
+ };
+ var _register_close_handler = function(elem, options) {
+ elem.find(options.close_handler_slctr).each(function() {
+ $(this).click(function() {
+ options.on_close(elem, options);
+ elem.find(options.collapsible_container_slctr)
+ .removeClass(options.open_css)
+ .addClass(options.closed_css);
+ });
+ });
+ };
+})(grp.jQuery);
\ No newline at end of file
diff --git a/static/grappelli/js/jquery.grp_inline.js b/static/grappelli/js/jquery.grp_inline.js
new file mode 100644
index 0000000..ac351f9
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_inline.js
@@ -0,0 +1,199 @@
+/**
+ * GRAPPELLI INLINES
+ * jquery-plugin for inlines (stacked and tabular)
+ */
+
+
+(function($) {
+ $.fn.grp_inline = function(options) {
+ var defaults = {
+ prefix: "form", // The form prefix for your django formset
+ addText: "add another", // Text for the add link
+ deleteText: "remove", // Text for the delete link
+ addCssClass: "grp-add-handler", // CSS class applied to the add link
+ removeCssClass: "grp-remove-handler", // CSS class applied to the remove link
+ deleteCssClass: "grp-delete-handler", // CSS class applied to the delete link
+ emptyCssClass: "grp-empty-form", // CSS class applied to the empty row
+ formCssClass: "grp-dynamic-form", // CSS class applied to each form in a formset
+ predeleteCssClass: "grp-predelete",
+ onBeforeInit: function(form) {}, // Function called before a form is initialized
+ onBeforeAdded: function(inline) {}, // Function called before a form is added
+ onBeforeRemoved: function(form) {}, // Function called before a form is removed
+ onBeforeDeleted: function(form) {}, // Function called before a form is deleted
+ onAfterInit: function(form) {}, // Function called after a form has been initialized
+ onAfterAdded: function(form) {}, // Function called after a form has been added
+ onAfterRemoved: function(inline) {}, // Function called after a form has been removed
+ onAfterDeleted: function(form) {} // Function called after a form has been deleted
+ };
+ options = $.extend(defaults, options);
+
+ return this.each(function() {
+ var inline = $(this); // the current inline node
+ var totalForms = inline.find("#id_" + options.prefix + "-TOTAL_FORMS");
+ // set autocomplete to off in order to prevent the browser from keeping the current value after reload
+ totalForms.attr("autocomplete", "off");
+ // init inline and add-buttons
+ initInlineForms(inline, options);
+ initAddButtons(inline, options);
+ // button handlers
+ addButtonHandler(inline.find("a." + options.addCssClass), options);
+ removeButtonHandler(inline.find("a." + options.removeCssClass), options);
+ deleteButtonHandler(inline.find("a." + options.deleteCssClass), options);
+ });
+ };
+
+ getFormIndex = function(elem, options, regex) {
+ var formIndex = elem.find("[id^='id_" + options.prefix + "']").attr('id');
+ if (!formIndex) { return -1; }
+ return parseInt(regex.exec(formIndex)[1], 10);
+ };
+
+ updateFormIndex = function(elem, options, replace_regex, replace_with) {
+ elem.find(':input,span,table,iframe,label,a,ul,p,img,div').each(function() {
+ var node = $(this),
+ node_id = node.attr('id'),
+ node_name = node.attr('name'),
+ node_for = node.attr('for'),
+ node_href = node.attr("href"),
+ node_class = node.attr("class"),
+ node_onclick = node.attr("onclick");
+ if (node_id) { node.attr('id', node_id.replace(replace_regex, replace_with)); }
+ if (node_name) { node.attr('name', node_name.replace(replace_regex, replace_with)); }
+ if (node_for) { node.attr('for', node_for.replace(replace_regex, replace_with)); }
+ if (node_href) { node.attr('href', node_href.replace(replace_regex, replace_with)); }
+ if (node_class) { node.attr('class', node_class.replace(replace_regex, replace_with)); }
+ if (node_onclick) { node.attr('onclick', node_onclick.replace(replace_regex, replace_with)); }
+ });
+ };
+
+ initInlineForms = function(elem, options) {
+ elem.find("div.grp-module").each(function() {
+ var form = $(this);
+ // callback
+ options.onBeforeInit(form);
+ // add options.formCssClass to all forms in the inline
+ // except table/theader/add-item
+ if (form.attr('id') !== "") {
+ form.not("." + options.emptyCssClass).not(".grp-table").not(".grp-thead").not(".add-item").addClass(options.formCssClass);
+ }
+ // add options.predeleteCssClass to forms with the delete checkbox checked
+ form.find("li.grp-delete-handler-container input").each(function() {
+ if ($(this).is(":checked") && form.hasClass("has_original")) {
+ form.toggleClass(options.predeleteCssClass);
+ }
+ });
+ // callback
+ options.onAfterInit(form);
+ });
+ };
+
+ initAddButtons = function(elem, options) {
+ var totalForms = elem.find("#id_" + options.prefix + "-TOTAL_FORMS");
+ var maxForms = elem.find("#id_" + options.prefix + "-MAX_NUM_FORMS");
+ var addButtons = elem.find("a." + options.addCssClass);
+ // hide add button in case we've hit the max, except we want to add infinitely
+ if ((maxForms.val() !== '') && (maxForms.val()-totalForms.val()) <= 0) {
+ hideAddButtons(elem, options);
+ }
+ };
+
+ addButtonHandler = function(elem, options) {
+ elem.bind("click", function() {
+ var inline = elem.parents(".grp-group"),
+ totalForms = inline.find("#id_" + options.prefix + "-TOTAL_FORMS"),
+ maxForms = inline.find("#id_" + options.prefix + "-MAX_NUM_FORMS"),
+ addButtons = inline.find("a." + options.addCssClass),
+ empty_template = inline.find("#" + options.prefix + "-empty");
+ // callback
+ options.onBeforeAdded(inline);
+ // create new form
+ var index = parseInt(totalForms.val(), 10),
+ form = empty_template.clone(true);
+ form.removeClass(options.emptyCssClass)
+ .attr("id", empty_template.attr('id').replace("-empty", index));
+ // update form index
+ var re = /__prefix__/g;
+ updateFormIndex(form, options, re, index);
+ // after "__prefix__" strings has been substituted with the number
+ // of the inline, we can add the form to DOM, not earlier.
+ // This way we can support handlers that track live element
+ // adding/removing, like those used in django-autocomplete-light
+ form.insertBefore(empty_template)
+ .addClass(options.formCssClass);
+ // update total forms
+ totalForms.val(index + 1);
+ // hide add button in case we've hit the max, except we want to add infinitely
+ if ((maxForms.val() !== 0) && (maxForms.val() !== "") && (maxForms.val() - totalForms.val()) <= 0) {
+ hideAddButtons(inline, options);
+ }
+ // callback
+ options.onAfterAdded(form);
+ });
+ };
+
+ removeButtonHandler = function(elem, options) {
+ elem.bind("click", function() {
+ var inline = elem.parents(".grp-group"),
+ form = $(this).parents("." + options.formCssClass).first(),
+ totalForms = inline.find("#id_" + options.prefix + "-TOTAL_FORMS"),
+ maxForms = inline.find("#id_" + options.prefix + "-MAX_NUM_FORMS"),
+ re = /-(\d+)-/,
+ removedFormIndex = getFormIndex(form, options, re);
+ // callback
+ options.onBeforeRemoved(form);
+ // remove form
+ form.remove();
+ // update total forms
+ totalForms.val(parseInt(totalForms.val(), 10) - 1);
+ // show add button in case we've dropped below max
+ if ((maxForms.val() !== 0) && (maxForms.val() - totalForms.val()) > 0) {
+ showAddButtons(inline, options);
+ }
+ // update form index (only forms with a higher index than the removed form)
+ inline.find("." + options.formCssClass).each(function() {
+ var form = $(this),
+ formIndex = getFormIndex(form, options, re);
+ if (formIndex > removedFormIndex) {
+ updateFormIndex(form, options, re, "-" + (formIndex - 1) + "-");
+ }
+ });
+ // callback
+ options.onAfterRemoved(inline);
+ });
+ };
+
+ deleteButtonHandler = function(elem, options) {
+ elem.bind("click", function() {
+ var deleteInput = $(this).prev(),
+ form = $(this).parents("." + options.formCssClass).first();
+ // callback
+ options.onBeforeDeleted(form);
+ // toggle options.predeleteCssClass and toggle checkbox
+ if (form.hasClass("has_original")) {
+ form.toggleClass(options.predeleteCssClass);
+ if (deleteInput.prop("checked")) {
+ deleteInput.removeAttr("checked");
+ } else {
+ deleteInput.prop("checked", true);
+ }
+ }
+ // callback
+ options.onAfterDeleted(form);
+ });
+ };
+
+ hideAddButtons = function(elem, options) {
+ var addButtons = elem.find("a." + options.addCssClass);
+ addButtons.hide().parents('.grp-add-item').hide();
+ // last row with stacked/tabular
+ addButtons.closest('.grp-module.grp-transparent').hide();
+ };
+
+ showAddButtons = function(elem, options) {
+ var addButtons = elem.find("a." + options.addCssClass);
+ addButtons.show().parents('.grp-add-item').show();
+ // last row with stacked/tabular
+ addButtons.closest('.grp-module.grp-transparent').show();
+ };
+
+})(grp.jQuery);
diff --git a/static/grappelli/js/jquery.grp_related_fk.js b/static/grappelli/js/jquery.grp_related_fk.js
new file mode 100644
index 0000000..9091c67
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_related_fk.js
@@ -0,0 +1,66 @@
+/**
+ * GRAPPELLI RELATED FK
+ * foreign-key lookup
+ */
+
+(function($){
+
+ var methods = {
+ init: function(options) {
+ options = $.extend({}, $.fn.grp_related_fk.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ var $parent = $this.parent();
+ // remove djangos object representation
+ if ($parent.find('a.related-lookup').next().is('strong')) {
+ $parent.find('a.related-lookup').get(0).nextSibling.nodeValue="";
+ $parent.find('a.related-lookup').next('strong').remove();
+ }
+ // add placeholder
+ $parent.find('a.related-lookup').after(options.placeholder);
+ // add related class
+ $this.addClass('grp-has-related-lookup');
+ // lookup
+ lookup_id($this, options); // lookup when loading page
+ $this.bind("change focus keyup", function() { // id-handler
+ lookup_id($this, options);
+ });
+ });
+ }
+ };
+
+ $.fn.grp_related_fk = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || ! method) {
+ return methods.init.apply(this, arguments);
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.grp_related_fk');
+ }
+ return false;
+ };
+
+ var lookup_id = function(elem, options) {
+ var text = elem.parent().find('.grp-placeholder-related-fk');
+ $.getJSON(options.lookup_url, {
+ object_id: elem.val(),
+ app_label: grappelli.get_app_label(elem),
+ model_name: grappelli.get_model_name(elem),
+ query_string: grappelli.get_query_string(elem)
+ }, function(data) {
+ if (data[0].label === "") {
+ text.hide();
+ } else {
+ text.show();
+ }
+ text.html('
' + data[0].label + '');
+ });
+ };
+
+ $.fn.grp_related_fk.defaults = {
+ placeholder: '
',
+ repr_max_length: 30,
+ lookup_url: ''
+ };
+
+})(grp.jQuery);
\ No newline at end of file
diff --git a/static/grappelli/js/jquery.grp_related_generic.js b/static/grappelli/js/jquery.grp_related_generic.js
new file mode 100644
index 0000000..138ae18
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_related_generic.js
@@ -0,0 +1,89 @@
+/**
+ * GRAPPELLI RELATED FK
+ * generic lookup
+ */
+
+(function($){
+
+ var methods = {
+ init: function(options) {
+ options = $.extend({}, $.fn.grp_related_generic.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ // add placeholder
+ var val = $(options.content_type).val() || $(options.content_type).find(':checked').val();
+ if (val) {
+ $this.after(options.placeholder).after(lookup_link($this.attr('id'),val));
+ }
+ // add related class
+ $this.addClass('grp-has-related-lookup');
+ // lookup
+ if (val) {
+ lookup_id($this, options); // lookup when loading page
+ }
+ $this.bind("change focus keyup", function() { // id-handler
+ lookup_id($this, options);
+ });
+ $(options.content_type).bind("change", function() { // content-type-handler
+ update_lookup($(this), options);
+ });
+ });
+ }
+ };
+
+ $.fn.grp_related_generic = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || ! method) {
+ return methods.init.apply(this, arguments);
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.grp_related_generic');
+ }
+ return false;
+ };
+
+ var lookup_link = function(id, val) {
+ var lookuplink = $('
');
+ lookuplink.attr('id', 'lookup_'+id);
+ lookuplink.attr('href', "../../../" + MODEL_URL_ARRAY[val].app + "/" + MODEL_URL_ARRAY[val].model + '/?');
+ lookuplink.attr('onClick', 'return showRelatedObjectLookupPopup(this);');
+ return lookuplink;
+ };
+
+ var update_lookup = function(elem, options) {
+ var obj = $(options.object_id);
+ obj.val('');
+ obj.parent().find('a.related-lookup').remove();
+ obj.parent().find('.grp-placeholder-related-generic').remove();
+ var val = $(elem).val() || $(elem).find(':checked').val();
+ if (val) {
+ obj.after(options.placeholder).after(lookup_link(obj.attr('id'),val));
+ }
+ };
+
+ var lookup_id = function(elem, options) {
+ var text = elem.next().next();
+ $.getJSON(options.lookup_url, {
+ object_id: elem.val(),
+ app_label: grappelli.get_app_label(elem),
+ model_name: grappelli.get_model_name(elem),
+ query_string: grappelli.get_query_string(elem)
+ }, function(data) {
+ if (data[0].label === "") {
+ text.hide();
+ } else {
+ text.show();
+ }
+ text.html('
' + data[0].label + '');
+ });
+ };
+
+ $.fn.grp_related_generic.defaults = {
+ placeholder: '
',
+ repr_max_length: 30,
+ lookup_url: '',
+ content_type: '',
+ object_id: ''
+ };
+
+})(grp.jQuery);
\ No newline at end of file
diff --git a/static/grappelli/js/jquery.grp_related_m2m.js b/static/grappelli/js/jquery.grp_related_m2m.js
new file mode 100644
index 0000000..5809874
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_related_m2m.js
@@ -0,0 +1,62 @@
+/**
+ * GRAPPELLI RELATED M2M
+ * m2m lookup
+ */
+
+(function($){
+
+ var methods = {
+ init: function(options) {
+ options = $.extend({}, $.fn.grp_related_m2m.defaults, options);
+ return this.each(function() {
+ var $this = $(this);
+ // add placeholder
+ $this.parent().find('a.related-lookup').after(options.placeholder);
+ // change lookup class
+ $this.next().addClass("grp-m2m");
+ // add related class
+ $this.addClass('grp-has-related-lookup');
+ // lookup
+ lookup_id($this, options); // lookup when loading page
+ $this.bind("change focus keyup", function() { // id-handler
+ lookup_id($this, options);
+ });
+ });
+ }
+ };
+
+ $.fn.grp_related_m2m = function(method) {
+ if (methods[method]) {
+ return methods[method].apply(this, Array.prototype.slice.call(arguments, 1));
+ } else if (typeof method === 'object' || ! method) {
+ return methods.init.apply(this, arguments);
+ } else {
+ $.error('Method ' + method + ' does not exist on jQuery.grp_related_m2m');
+ }
+ return false;
+ };
+
+ var lookup_id = function(elem, options) {
+ $.getJSON(options.lookup_url, {
+ object_id: elem.val(),
+ app_label: grappelli.get_app_label(elem),
+ model_name: grappelli.get_model_name(elem),
+ query_string: grappelli.get_query_string(elem)
+ }, function(data) {
+ values = $.map(data, function (a) { return '
' + a.label + ''; });
+ if (values === "") {
+ elem.parent().find('.grp-placeholder-related-m2m').hide();
+ } else {
+ elem.parent().find('.grp-placeholder-related-m2m').show();
+ }
+ elem.parent().find('.grp-placeholder-related-m2m').html(values.join('
'));
+ });
+ };
+
+ $.fn.grp_related_m2m.defaults = {
+ placeholder: '
',
+ repr_max_length: 30,
+ lookup_url: ''
+ };
+
+})(grp.jQuery);
\ No newline at end of file
diff --git a/static/grappelli/js/jquery.grp_timepicker.js b/static/grappelli/js/jquery.grp_timepicker.js
new file mode 100644
index 0000000..3118d65
--- /dev/null
+++ b/static/grappelli/js/jquery.grp_timepicker.js
@@ -0,0 +1,186 @@
+/**
+ * GRAPPELLI TIMEPICKER
+ * works pretty similar to ui.datepicker:
+ * adds a button to the element
+ * creates a node (div) at the bottom called ui-timepicker
+ * element.onClick fills the ui-timepicker node with the time_list (all times you can select)
+ */
+
+(function($) {
+ $.widget("ui.grp_timepicker", {
+ // default options
+ options: {
+ // template for the container of the timepicker
+ template: '
',
+ // selector to get the ui-timepicker once it's added to the dom
+ timepicker_selector: "#ui-timepicker",
+ // needed offset of the container from the element
+ offset: {
+ top: 0
+ },
+ // if time_list wasn't sent when calling the timepicker we use this
+ default_time_list: [
+ 'now',
+ '00:00',
+ '01:00',
+ '02:00',
+ '03:00',
+ '04:00',
+ '05:00',
+ '06:00',
+ '07:00',
+ '08:00',
+ '09:00',
+ '10:00',
+ '11:00',
+ '12:00',
+ '13:00',
+ '14:00',
+ '15:00',
+ '16:00',
+ '17:00',
+ '18:00',
+ '19:00',
+ '20:00',
+ '21:00',
+ '22:00',
+ '23:00'
+ ],
+ // leave this empty!!!
+ // NOTE: you can't set a default for time_list because if you call:
+ // $("node").timepicker({time_list: ["01:00", "02:00"]})
+ // ui.widget will extend/merge the options.time_list with the one you sent.
+ time_list: []
+ },
+
+ // init timepicker for a specific element
+ _create: function() {
+ // for the events
+ var self = this;
+
+ // to close timpicker if you click somewhere in the document
+ $(document).mousedown(function(evt) {
+ if (self.timepicker.is(":visible")) {
+ var $target = $(evt.target);
+ if ($target[0].id != self.timepicker[0].id && $target.parents(self.options.timepicker_selector).length === 0 && !$target.hasClass('hasTimepicker') && !$target.hasClass('ui-timepicker-trigger')) {
+ self.timepicker.hide();
+ }
+ }
+ });
+ // close on esc
+ $(document).keyup(function(e) {
+ if (e.keyCode == 27) {
+ self.timepicker.hide();
+ }
+ });
+
+ // get/create timepicker's container
+ if ($(this.options.timepicker_selector).size() === 0) {
+ $(this.options.template).appendTo('body');
+ }
+ this.timepicker = $(this.options.timepicker_selector);
+ this.timepicker.hide();
+
+ // modify the element and create the button
+ this.element.addClass("hasTimepicker");
+ this.button = $('
');
+ this.element.after(this.button);
+
+ // disable button if element is disabled
+ if (this.element.prop("disabled")) {
+ this.button.prop("disabled", true);
+ } else {
+ // register event
+ this.button.click(function() {
+ self._toggleTimepicker();
+ });
+ }
+ },
+
+ // called when button is clicked
+ _toggleTimepicker: function() {
+ if (this.timepicker.is(":visible")) {
+ this.timepicker.hide();
+ } else {
+ this.element.focus();
+ this._generateTimepickerContents();
+ this._showTimepicker();
+ }
+ },
+
+ // fills timepicker with time_list of element and shows it.
+ // called by _toggleTimepicker
+ _generateTimepickerContents: function() {
+ var self = this,
+ template_str = "
";
+
+ // there is no time_list for this instance so use the default one
+ if (this.options.time_list.length === 0) {
+ this.options.time_list = this.options.default_time_list;
+ }
+
+ for (var i = 0; i < this.options.time_list.length; i++) {
+ if (this.options.time_list[i] == "now") {
+ var now = new Date(),
+ hours = now.getHours(),
+ minutes = now.getMinutes();
+
+ hours = ((hours < 10) ? "0" + hours : hours);
+ minutes = ((minutes < 10) ? "0" + minutes : minutes);
+
+ template_str += '- ' + hours + ":" + minutes + '
';
+ } else {
+ template_str += '- ' + this.options.time_list[i] + '
';
+ }
+ }
+ template_str += "
";
+
+ // fill timepicker container
+ this.timepicker.html(template_str);
+
+ // click handler for items (times) in timepicker
+ this.timepicker.find('li').click(function() {
+ // remove active class from all items
+ $(this).parent().children('li').removeClass("ui-state-active");
+ // mark clicked item as active
+ $(this).addClass("ui-state-active");
+ // set the new value and hide the timepicker
+ self.element.val($(this).html());
+ self.timepicker.hide();
+ });
+ },
+
+ // sets offset and shows timepicker container
+ _showTimepicker: function() {
+ var browserHeight = document.documentElement.clientHeight;
+ var scrollY = document.documentElement.scrollTop || document.body.scrollTop;
+ var tpInputHeight = this.element.outerHeight();
+ var tpDialogHeight = this.timepicker.outerHeight() + tpInputHeight;
+ var offsetTop = this.element.offset().top;
+ var offsetLeft = this.element.offset().left;
+
+ // check the remaining space within the viewport
+ // 60 counts for fixed header/footer
+ var checkSpace = offsetTop - scrollY + tpDialogHeight + 60;
+
+ // position timepicker below or above the input
+ if (checkSpace < browserHeight) {
+ // place the timepicker below input
+ var below = offsetTop + tpInputHeight;
+ this.timepicker.css('left', offsetLeft + 'px').css('top', below + 'px');
+ } else {
+ // place timepicker above input
+ var above = offsetTop - tpDialogHeight + tpInputHeight;
+ this.timepicker.css('left', offsetLeft + 'px').css('top', above + 'px');
+ }
+ // show timepicker
+ this.timepicker.show();
+ },
+
+ destroy: function() {
+ $.Widget.prototype.destroy.apply(this, arguments); // default destroy
+ // now do other stuff particular to this widget
+ }
+
+ });
+})(grp.jQuery);
diff --git a/static/grappelli/stylesheets/mueller/grid/output-rtl.css b/static/grappelli/stylesheets/mueller/grid/output-rtl.css
new file mode 100644
index 0000000..61d2f32
--- /dev/null
+++ b/static/grappelli/stylesheets/mueller/grid/output-rtl.css
@@ -0,0 +1 @@
+html{font-size:12px;line-height:16px}.g-d-c,.g-all-c{*zoom:1;width:940px}.g-d-c:after,.g-all-c:after{content:"";display:table;clear:both}.g-d-c.g-centered,.g-centered.g-all-c{float:none;margin:0 auto}.g-d{float:right;*zoom:1}.g-d:after{content:"";display:table;clear:both}.g-d-f,.g-all-f,.g-all-fl,.l-2c .c-1,.l-2cr .c-1{margin-right:0 !important;margin-left:20px !important;clear:right}.g-d-l,.g-all-l,.g-all-fl,.l-2c .c-2,.l-2cr .c-2{margin-left:0 !important}.g-d-prepend24{padding-right:960px !important}.g-d-append24,.l-2cr-fluid.l-d-24 .c-2{padding-left:960px !important}.g-d-push24{position:relative;margin-right:960px !important;margin-left:-960px !important;margin-top:0;margin-bottom:0}.g-d-pull24{position:relative;margin-right:-940px !important}.g-d-doublepull24,.l-2cr-fluid.l-d-24 .c-1{position:relative;margin-right:-1960px !important}.g-d-prepend23{padding-right:920px !important}.g-d-append23,.l-2cr-fluid.l-d-23 .c-2{padding-left:920px !important}.g-d-push23{position:relative;margin-right:920px !important;margin-left:-920px !important;margin-top:0;margin-bottom:0}.g-d-pull23{position:relative;margin-right:-900px !important}.g-d-doublepull23,.l-2cr-fluid.l-d-23 .c-1{position:relative;margin-right:-1880px !important}.g-d-prepend22{padding-right:880px !important}.g-d-append22,.l-2cr-fluid.l-d-22 .c-2{padding-left:880px !important}.g-d-push22{position:relative;margin-right:880px !important;margin-left:-880px !important;margin-top:0;margin-bottom:0}.g-d-pull22{position:relative;margin-right:-860px !important}.g-d-doublepull22,.l-2cr-fluid.l-d-22 .c-1{position:relative;margin-right:-1800px !important}.g-d-prepend21{padding-right:840px !important}.g-d-append21,.l-2cr-fluid.l-d-21 .c-2{padding-left:840px !important}.g-d-push21{position:relative;margin-right:840px !important;margin-left:-840px !important;margin-top:0;margin-bottom:0}.g-d-pull21{position:relative;margin-right:-820px !important}.g-d-doublepull21,.l-2cr-fluid.l-d-21 .c-1{position:relative;margin-right:-1720px !important}.g-d-prepend20{padding-right:800px !important}.g-d-append20,.l-2cr-fluid.l-d-20 .c-2{padding-left:800px !important}.g-d-push20{position:relative;margin-right:800px !important;margin-left:-800px !important;margin-top:0;margin-bottom:0}.g-d-pull20{position:relative;margin-right:-780px !important}.g-d-doublepull20,.l-2cr-fluid.l-d-20 .c-1{position:relative;margin-right:-1640px !important}.g-d-prepend19{padding-right:760px !important}.g-d-append19,.l-2cr-fluid.l-d-19 .c-2{padding-left:760px !important}.g-d-push19{position:relative;margin-right:760px !important;margin-left:-760px !important;margin-top:0;margin-bottom:0}.g-d-pull19{position:relative;margin-right:-740px !important}.g-d-doublepull19,.l-2cr-fluid.l-d-19 .c-1{position:relative;margin-right:-1560px !important}.g-d-prepend18{padding-right:720px !important}.g-d-append18,.l-2cr-fluid.l-d-18 .c-2{padding-left:720px !important}.g-d-push18{position:relative;margin-right:720px !important;margin-left:-720px !important;margin-top:0;margin-bottom:0}.g-d-pull18{position:relative;margin-right:-700px !important}.g-d-doublepull18,.l-2cr-fluid.l-d-18 .c-1{position:relative;margin-right:-1480px !important}.g-d-prepend17{padding-right:680px !important}.g-d-append17,.l-2cr-fluid.l-d-17 .c-2{padding-left:680px !important}.g-d-push17{position:relative;margin-right:680px !important;margin-left:-680px !important;margin-top:0;margin-bottom:0}.g-d-pull17{position:relative;margin-right:-660px !important}.g-d-doublepull17,.l-2cr-fluid.l-d-17 .c-1{position:relative;margin-right:-1400px !important}.g-d-prepend16{padding-right:640px !important}.g-d-append16,.l-2cr-fluid.l-d-16 .c-2{padding-left:640px !important}.g-d-push16,.l-2cr .c-1{position:relative;margin-right:640px !important;margin-left:-640px !important;margin-top:0;margin-bottom:0}.g-d-pull16{position:relative;margin-right:-620px !important}.g-d-doublepull16,.l-2cr-fluid.l-d-16 .c-1{position:relative;margin-right:-1320px !important}.g-d-prepend15{padding-right:600px !important}.g-d-append15,.l-2cr-fluid.l-d-15 .c-2{padding-left:600px !important}.g-d-push15{position:relative;margin-right:600px !important;margin-left:-600px !important;margin-top:0;margin-bottom:0}.g-d-pull15{position:relative;margin-right:-580px !important}.g-d-doublepull15,.l-2cr-fluid.l-d-15 .c-1{position:relative;margin-right:-1240px !important}.g-d-prepend14{padding-right:560px !important}.g-d-append14,.l-2cr-fluid.l-d-14 .c-2{padding-left:560px !important}.g-d-push14{position:relative;margin-right:560px !important;margin-left:-560px !important;margin-top:0;margin-bottom:0}.g-d-pull14{position:relative;margin-right:-540px !important}.g-d-doublepull14,.l-2cr-fluid.l-d-14 .c-1{position:relative;margin-right:-1160px !important}.g-d-prepend13{padding-right:520px !important}.g-d-append13,.l-2cr-fluid.l-d-13 .c-2{padding-left:520px !important}.g-d-push13{position:relative;margin-right:520px !important;margin-left:-520px !important;margin-top:0;margin-bottom:0}.g-d-pull13{position:relative;margin-right:-500px !important}.g-d-doublepull13,.l-2cr-fluid.l-d-13 .c-1{position:relative;margin-right:-1080px !important}.g-d-prepend12{padding-right:480px !important}.g-d-append12,.l-2cr-fluid.l-d-12 .c-2{padding-left:480px !important}.g-d-push12{position:relative;margin-right:480px !important;margin-left:-480px !important;margin-top:0;margin-bottom:0}.g-d-pull12{position:relative;margin-right:-460px !important}.g-d-doublepull12,.l-2cr-fluid.l-d-12 .c-1{position:relative;margin-right:-1000px !important}.g-d-prepend11{padding-right:440px !important}.g-d-append11,.l-2cr-fluid.l-d-11 .c-2{padding-left:440px !important}.g-d-push11{position:relative;margin-right:440px !important;margin-left:-440px !important;margin-top:0;margin-bottom:0}.g-d-pull11{position:relative;margin-right:-420px !important}.g-d-doublepull11,.l-2cr-fluid.l-d-11 .c-1{position:relative;margin-right:-920px !important}.g-d-prepend10{padding-right:400px !important}.g-d-append10,.l-2cr-fluid.l-d-10 .c-2{padding-left:400px !important}.g-d-push10{position:relative;margin-right:400px !important;margin-left:-400px !important;margin-top:0;margin-bottom:0}.g-d-pull10{position:relative;margin-right:-380px !important}.g-d-doublepull10,.l-2cr-fluid.l-d-10 .c-1{position:relative;margin-right:-840px !important}.g-d-prepend9{padding-right:360px !important}.g-d-append9,.l-2cr-fluid.l-d-9 .c-2{padding-left:360px !important}.g-d-push9{position:relative;margin-right:360px !important;margin-left:-360px !important;margin-top:0;margin-bottom:0}.g-d-pull9{position:relative;margin-right:-340px !important}.g-d-doublepull9,.l-2cr-fluid.l-d-9 .c-1{position:relative;margin-right:-760px !important}.g-d-prepend8{padding-right:320px !important}.g-d-append8,.l-2cr-fluid.l-d-8 .c-2{padding-left:320px !important}.g-d-push8{position:relative;margin-right:320px !important;margin-left:-320px !important;margin-top:0;margin-bottom:0}.g-d-pull8,.l-2cr .c-2{position:relative;margin-right:-300px !important}.g-d-doublepull8,.l-2cr-fluid.l-d-8 .c-1{position:relative;margin-right:-680px !important}.g-d-prepend7{padding-right:280px !important}.g-d-append7,.l-2cr-fluid.l-d-7 .c-2{padding-left:280px !important}.g-d-push7{position:relative;margin-right:280px !important;margin-left:-280px !important;margin-top:0;margin-bottom:0}.g-d-pull7{position:relative;margin-right:-260px !important}.g-d-doublepull7,.l-2cr-fluid.l-d-7 .c-1{position:relative;margin-right:-600px !important}.g-d-prepend6{padding-right:240px !important}.g-d-append6,.l-2cr-fluid.l-d-6 .c-2{padding-left:240px !important}.g-d-push6{position:relative;margin-right:240px !important;margin-left:-240px !important;margin-top:0;margin-bottom:0}.g-d-pull6{position:relative;margin-right:-220px !important}.g-d-doublepull6,.l-2cr-fluid.l-d-6 .c-1{position:relative;margin-right:-520px !important}.g-d-prepend5{padding-right:200px !important}.g-d-append5,.l-2cr-fluid.l-d-5 .c-2{padding-left:200px !important}.g-d-push5{position:relative;margin-right:200px !important;margin-left:-200px !important;margin-top:0;margin-bottom:0}.g-d-pull5{position:relative;margin-right:-180px !important}.g-d-doublepull5,.l-2cr-fluid.l-d-5 .c-1{position:relative;margin-right:-440px !important}.g-d-prepend4{padding-right:160px !important}.g-d-append4,.l-2cr-fluid.l-d-4 .c-2{padding-left:160px !important}.g-d-push4{position:relative;margin-right:160px !important;margin-left:-160px !important;margin-top:0;margin-bottom:0}.g-d-pull4{position:relative;margin-right:-140px !important}.g-d-doublepull4,.l-2cr-fluid.l-d-4 .c-1{position:relative;margin-right:-360px !important}.g-d-prepend3{padding-right:120px !important}.g-d-append3,.l-2cr-fluid.l-d-3 .c-2{padding-left:120px !important}.g-d-push3{position:relative;margin-right:120px !important;margin-left:-120px !important;margin-top:0;margin-bottom:0}.g-d-pull3{position:relative;margin-right:-100px !important}.g-d-doublepull3,.l-2cr-fluid.l-d-3 .c-1{position:relative;margin-right:-280px !important}.g-d-prepend2{padding-right:80px !important}.g-d-append2,.l-2cr-fluid.l-d-2 .c-2{padding-left:80px !important}.g-d-push2{position:relative;margin-right:80px !important;margin-left:-80px !important;margin-top:0;margin-bottom:0}.g-d-pull2{position:relative;margin-right:-60px !important}.g-d-doublepull2,.l-2cr-fluid.l-d-2 .c-1{position:relative;margin-right:-200px !important}.g-d-prepend1{padding-right:40px !important}.g-d-append1,.l-2cr-fluid.l-d-1 .c-2{padding-left:40px !important}.g-d-push1{position:relative;margin-right:40px !important;margin-left:-40px !important;margin-top:0;margin-bottom:0}.g-d-pull1{position:relative;margin-right:-20px !important}.g-d-doublepull1,.l-2cr-fluid.l-d-1 .c-1{position:relative;margin-right:-120px !important}.g-d-prepend0{padding-right:0px !important}.g-d-append0{padding-left:0px !important}.g-d-push0{position:relative;margin-right:0px !important;margin-left:0px !important;margin-top:0;margin-bottom:0}.g-d-pull0{position:relative;margin-right:20px !important}.g-d-doublepull0{position:relative;margin-right:-40px !important}.g-d-24,.l-2c,.l-2cr,.l-2cr-fluid.l-d-24 .c-1{float:right;*zoom:1;margin-left:0 !important;margin-right:0 !important;clear:both;width:940px}.g-d-24:after,.l-2c:after,.l-2cr:after,.l-2cr-fluid.l-d-24 .c-1:after{content:"";display:table;clear:both}.g-d-23,.l-2cr-fluid.l-d-23 .c-1{float:right;*zoom:1;margin-left:20px;width:900px}.g-d-23:after,.l-2cr-fluid.l-d-23 .c-1:after{content:"";display:table;clear:both}.g-d-22,.l-2cr-fluid.l-d-22 .c-1{float:right;*zoom:1;margin-left:20px;width:860px}.g-d-22:after,.l-2cr-fluid.l-d-22 .c-1:after{content:"";display:table;clear:both}.g-d-21,.l-2cr-fluid.l-d-21 .c-1{float:right;*zoom:1;margin-left:20px;width:820px}.g-d-21:after,.l-2cr-fluid.l-d-21 .c-1:after{content:"";display:table;clear:both}.g-d-20,.l-2cr-fluid.l-d-20 .c-1{float:right;*zoom:1;margin-left:20px;width:780px}.g-d-20:after,.l-2cr-fluid.l-d-20 .c-1:after{content:"";display:table;clear:both}.g-d-19,.l-2cr-fluid.l-d-19 .c-1{float:right;*zoom:1;margin-left:20px;width:740px}.g-d-19:after,.l-2cr-fluid.l-d-19 .c-1:after{content:"";display:table;clear:both}.g-d-18,.l-2cr-fluid.l-d-18 .c-1{float:right;*zoom:1;margin-left:20px;width:700px}.g-d-18:after,.l-2cr-fluid.l-d-18 .c-1:after{content:"";display:table;clear:both}.g-d-17,.l-2cr-fluid.l-d-17 .c-1{float:right;*zoom:1;margin-left:20px;width:660px}.g-d-17:after,.l-2cr-fluid.l-d-17 .c-1:after{content:"";display:table;clear:both}.g-d-16,.l-2c .c-2,.l-2cr .c-2,.l-2cr-fluid.l-d-16 .c-1{float:right;*zoom:1;margin-left:20px;width:620px}.g-d-16:after,.l-2c .c-2:after,.l-2cr .c-2:after,.l-2cr-fluid.l-d-16 .c-1:after{content:"";display:table;clear:both}.g-d-15,.l-2cr-fluid.l-d-15 .c-1{float:right;*zoom:1;margin-left:20px;width:580px}.g-d-15:after,.l-2cr-fluid.l-d-15 .c-1:after{content:"";display:table;clear:both}.g-d-14,.l-2cr-fluid.l-d-14 .c-1{float:right;*zoom:1;margin-left:20px;width:540px}.g-d-14:after,.l-2cr-fluid.l-d-14 .c-1:after{content:"";display:table;clear:both}.g-d-13,.l-2cr-fluid.l-d-13 .c-1{float:right;*zoom:1;margin-left:20px;width:500px}.g-d-13:after,.l-2cr-fluid.l-d-13 .c-1:after{content:"";display:table;clear:both}.g-d-12,.l-2cr-fluid.l-d-12 .c-1{float:right;*zoom:1;margin-left:20px;width:460px}.g-d-12:after,.l-2cr-fluid.l-d-12 .c-1:after{content:"";display:table;clear:both}.g-d-11,.l-2cr-fluid.l-d-11 .c-1{float:right;*zoom:1;margin-left:20px;width:420px}.g-d-11:after,.l-2cr-fluid.l-d-11 .c-1:after{content:"";display:table;clear:both}.g-d-10,.l-2cr-fluid.l-d-10 .c-1{float:right;*zoom:1;margin-left:20px;width:380px}.g-d-10:after,.l-2cr-fluid.l-d-10 .c-1:after{content:"";display:table;clear:both}.g-d-9,.l-2cr-fluid.l-d-9 .c-1{float:right;*zoom:1;margin-left:20px;width:340px}.g-d-9:after,.l-2cr-fluid.l-d-9 .c-1:after{content:"";display:table;clear:both}.g-d-8,.l-2c .c-1,.l-2cr .c-1,.l-2cr-fluid.l-d-8 .c-1{float:right;*zoom:1;margin-left:20px;width:300px}.g-d-8:after,.l-2c .c-1:after,.l-2cr .c-1:after,.l-2cr-fluid.l-d-8 .c-1:after{content:"";display:table;clear:both}.g-d-7,.l-2cr-fluid.l-d-7 .c-1{float:right;*zoom:1;margin-left:20px;width:260px}.g-d-7:after,.l-2cr-fluid.l-d-7 .c-1:after{content:"";display:table;clear:both}.g-d-6,.l-2cr-fluid.l-d-6 .c-1{float:right;*zoom:1;margin-left:20px;width:220px}.g-d-6:after,.l-2cr-fluid.l-d-6 .c-1:after{content:"";display:table;clear:both}.g-d-5,.l-2cr-fluid.l-d-5 .c-1{float:right;*zoom:1;margin-left:20px;width:180px}.g-d-5:after,.l-2cr-fluid.l-d-5 .c-1:after{content:"";display:table;clear:both}.g-d-4,.l-2cr-fluid.l-d-4 .c-1{float:right;*zoom:1;margin-left:20px;width:140px}.g-d-4:after,.l-2cr-fluid.l-d-4 .c-1:after{content:"";display:table;clear:both}.g-d-3,.l-2cr-fluid.l-d-3 .c-1{float:right;*zoom:1;margin-left:20px;width:100px}.g-d-3:after,.l-2cr-fluid.l-d-3 .c-1:after{content:"";display:table;clear:both}.g-d-2,.l-2cr-fluid.l-d-2 .c-1{float:right;*zoom:1;margin-left:20px;width:60px}.g-d-2:after,.l-2cr-fluid.l-d-2 .c-1:after{content:"";display:table;clear:both}.g-d-1,.l-2cr-fluid.l-d-1 .c-1{float:right;*zoom:1;margin-left:20px;width:20px}.g-d-1:after,.l-2cr-fluid.l-d-1 .c-1:after{content:"";display:table;clear:both}.g-d-0{float:right;*zoom:1;margin-left:20px;width:-20px}.g-d-0:after{content:"";display:table;clear:both}.g-d-24-td,.l-2c-fluid:not(.grp-cell).l-d-24 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-24 .c-1{float:right;*zoom:1;margin-left:0 !important;margin-right:0 !important;padding-left:0 !important;clear:both;width:940px;min-width:940px;float:none;display:table-cell}.g-d-24-td:after,.l-2c-fluid:not(.grp-cell).l-d-24 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-24 .c-1:after{content:"";display:table;clear:both}.g-d-23-td,.l-2c-fluid:not(.grp-cell).l-d-23 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-23 .c-1{float:right;*zoom:1;padding-left:20px;width:900px;min-width:900px;float:none;display:table-cell}.g-d-23-td:after,.l-2c-fluid:not(.grp-cell).l-d-23 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-23 .c-1:after{content:"";display:table;clear:both}.g-d-22-td,.l-2c-fluid:not(.grp-cell).l-d-22 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-22 .c-1{float:right;*zoom:1;padding-left:20px;width:860px;min-width:860px;float:none;display:table-cell}.g-d-22-td:after,.l-2c-fluid:not(.grp-cell).l-d-22 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-22 .c-1:after{content:"";display:table;clear:both}.g-d-21-td,.l-2c-fluid:not(.grp-cell).l-d-21 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-21 .c-1{float:right;*zoom:1;padding-left:20px;width:820px;min-width:820px;float:none;display:table-cell}.g-d-21-td:after,.l-2c-fluid:not(.grp-cell).l-d-21 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-21 .c-1:after{content:"";display:table;clear:both}.g-d-20-td,.l-2c-fluid:not(.grp-cell).l-d-20 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-20 .c-1{float:right;*zoom:1;padding-left:20px;width:780px;min-width:780px;float:none;display:table-cell}.g-d-20-td:after,.l-2c-fluid:not(.grp-cell).l-d-20 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-20 .c-1:after{content:"";display:table;clear:both}.g-d-19-td,.l-2c-fluid:not(.grp-cell).l-d-19 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-19 .c-1{float:right;*zoom:1;padding-left:20px;width:740px;min-width:740px;float:none;display:table-cell}.g-d-19-td:after,.l-2c-fluid:not(.grp-cell).l-d-19 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-19 .c-1:after{content:"";display:table;clear:both}.g-d-18-td,.l-2c-fluid:not(.grp-cell).l-d-18 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-18 .c-1{float:right;*zoom:1;padding-left:20px;width:700px;min-width:700px;float:none;display:table-cell}.g-d-18-td:after,.l-2c-fluid:not(.grp-cell).l-d-18 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-18 .c-1:after{content:"";display:table;clear:both}.g-d-17-td,.l-2c-fluid:not(.grp-cell).l-d-17 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-17 .c-1{float:right;*zoom:1;padding-left:20px;width:660px;min-width:660px;float:none;display:table-cell}.g-d-17-td:after,.l-2c-fluid:not(.grp-cell).l-d-17 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-17 .c-1:after{content:"";display:table;clear:both}.g-d-16-td,.l-2c-fluid:not(.grp-cell).l-d-16 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-16 .c-1{float:right;*zoom:1;padding-left:20px;width:620px;min-width:620px;float:none;display:table-cell}.g-d-16-td:after,.l-2c-fluid:not(.grp-cell).l-d-16 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-16 .c-1:after{content:"";display:table;clear:both}.g-d-15-td,.l-2c-fluid:not(.grp-cell).l-d-15 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-15 .c-1{float:right;*zoom:1;padding-left:20px;width:580px;min-width:580px;float:none;display:table-cell}.g-d-15-td:after,.l-2c-fluid:not(.grp-cell).l-d-15 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-15 .c-1:after{content:"";display:table;clear:both}.g-d-14-td,.l-2c-fluid:not(.grp-cell).l-d-14 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-14 .c-1{float:right;*zoom:1;padding-left:20px;width:540px;min-width:540px;float:none;display:table-cell}.g-d-14-td:after,.l-2c-fluid:not(.grp-cell).l-d-14 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-14 .c-1:after{content:"";display:table;clear:both}.g-d-13-td,.l-2c-fluid:not(.grp-cell).l-d-13 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-13 .c-1{float:right;*zoom:1;padding-left:20px;width:500px;min-width:500px;float:none;display:table-cell}.g-d-13-td:after,.l-2c-fluid:not(.grp-cell).l-d-13 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-13 .c-1:after{content:"";display:table;clear:both}.g-d-12-td,.l-2c-fluid:not(.grp-cell).l-d-12 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-12 .c-1{float:right;*zoom:1;padding-left:20px;width:460px;min-width:460px;float:none;display:table-cell}.g-d-12-td:after,.l-2c-fluid:not(.grp-cell).l-d-12 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-12 .c-1:after{content:"";display:table;clear:both}.g-d-11-td,.l-2c-fluid:not(.grp-cell).l-d-11 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-11 .c-1{float:right;*zoom:1;padding-left:20px;width:420px;min-width:420px;float:none;display:table-cell}.g-d-11-td:after,.l-2c-fluid:not(.grp-cell).l-d-11 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-11 .c-1:after{content:"";display:table;clear:both}.g-d-10-td,.l-2c-fluid:not(.grp-cell).l-d-10 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-10 .c-1{float:right;*zoom:1;padding-left:20px;width:380px;min-width:380px;float:none;display:table-cell}.g-d-10-td:after,.l-2c-fluid:not(.grp-cell).l-d-10 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-10 .c-1:after{content:"";display:table;clear:both}.g-d-9-td,.l-2c-fluid:not(.grp-cell).l-d-9 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-9 .c-1{float:right;*zoom:1;padding-left:20px;width:340px;min-width:340px;float:none;display:table-cell}.g-d-9-td:after,.l-2c-fluid:not(.grp-cell).l-d-9 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-9 .c-1:after{content:"";display:table;clear:both}.g-d-8-td,.l-2c-fluid:not(.grp-cell).l-d-8 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-8 .c-1{float:right;*zoom:1;padding-left:20px;width:300px;min-width:300px;float:none;display:table-cell}.g-d-8-td:after,.l-2c-fluid:not(.grp-cell).l-d-8 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-8 .c-1:after{content:"";display:table;clear:both}.g-d-7-td,.l-2c-fluid:not(.grp-cell).l-d-7 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-7 .c-1{float:right;*zoom:1;padding-left:20px;width:260px;min-width:260px;float:none;display:table-cell}.g-d-7-td:after,.l-2c-fluid:not(.grp-cell).l-d-7 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-7 .c-1:after{content:"";display:table;clear:both}.g-d-6-td,.l-2c-fluid:not(.grp-cell).l-d-6 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-6 .c-1{float:right;*zoom:1;padding-left:20px;width:220px;min-width:220px;float:none;display:table-cell}.g-d-6-td:after,.l-2c-fluid:not(.grp-cell).l-d-6 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-6 .c-1:after{content:"";display:table;clear:both}.g-d-5-td,.l-2c-fluid:not(.grp-cell).l-d-5 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-5 .c-1{float:right;*zoom:1;padding-left:20px;width:180px;min-width:180px;float:none;display:table-cell}.g-d-5-td:after,.l-2c-fluid:not(.grp-cell).l-d-5 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-5 .c-1:after{content:"";display:table;clear:both}.g-d-4-td,.l-2c-fluid:not(.grp-cell).l-d-4 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-4 .c-1{float:right;*zoom:1;padding-left:20px;width:140px;min-width:140px;float:none;display:table-cell}.g-d-4-td:after,.l-2c-fluid:not(.grp-cell).l-d-4 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-4 .c-1:after{content:"";display:table;clear:both}.g-d-3-td,.l-2c-fluid:not(.grp-cell).l-d-3 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-3 .c-1{float:right;*zoom:1;padding-left:20px;width:100px;min-width:100px;float:none;display:table-cell}.g-d-3-td:after,.l-2c-fluid:not(.grp-cell).l-d-3 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-3 .c-1:after{content:"";display:table;clear:both}.g-d-2-td,.l-2c-fluid:not(.grp-cell).l-d-2 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-2 .c-1{float:right;*zoom:1;padding-left:20px;width:60px;min-width:60px;float:none;display:table-cell}.g-d-2-td:after,.l-2c-fluid:not(.grp-cell).l-d-2 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-2 .c-1:after{content:"";display:table;clear:both}.g-d-1-td,.l-2c-fluid:not(.grp-cell).l-d-1 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-1 .c-1{float:right;*zoom:1;padding-left:20px;width:20px;min-width:20px;float:none;display:table-cell}.g-d-1-td:after,.l-2c-fluid:not(.grp-cell).l-d-1 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-1 .c-1:after{content:"";display:table;clear:both}.g-d-0-td{float:right;*zoom:1;padding-left:20px;width:-20px;min-width:-20px;float:none;display:table-cell}.g-d-0-td:after{content:"";display:table;clear:both}.g-d-24 input[type="text"],.l-2c input[type="text"],.l-2cr input[type="text"],.l-2cr-fluid.l-d-24 .c-1 input[type="text"],.g-d-24 input[type="email"],.l-2c input[type="email"],.l-2cr input[type="email"],.l-2cr-fluid.l-d-24 .c-1 input[type="email"],.g-d-24 input[type="password"],.l-2c input[type="password"],.l-2cr input[type="password"],.l-2cr-fluid.l-d-24 .c-1 input[type="password"],.g-d-24 select,.l-2c select,.l-2cr select,.l-2cr-fluid.l-d-24 .c-1 select,.g-d-24 textarea,.l-2c textarea,.l-2cr textarea,.l-2cr-fluid.l-d-24 .c-1 textarea{width:100%}.g-d-23 input[type="text"],.l-2cr-fluid.l-d-23 .c-1 input[type="text"],.g-d-23 input[type="email"],.l-2cr-fluid.l-d-23 .c-1 input[type="email"],.g-d-23 input[type="password"],.l-2cr-fluid.l-d-23 .c-1 input[type="password"],.g-d-23 select,.l-2cr-fluid.l-d-23 .c-1 select,.g-d-23 textarea,.l-2cr-fluid.l-d-23 .c-1 textarea{width:100%}.g-d-22 input[type="text"],.l-2cr-fluid.l-d-22 .c-1 input[type="text"],.g-d-22 input[type="email"],.l-2cr-fluid.l-d-22 .c-1 input[type="email"],.g-d-22 input[type="password"],.l-2cr-fluid.l-d-22 .c-1 input[type="password"],.g-d-22 select,.l-2cr-fluid.l-d-22 .c-1 select,.g-d-22 textarea,.l-2cr-fluid.l-d-22 .c-1 textarea{width:100%}.g-d-21 input[type="text"],.l-2cr-fluid.l-d-21 .c-1 input[type="text"],.g-d-21 input[type="email"],.l-2cr-fluid.l-d-21 .c-1 input[type="email"],.g-d-21 input[type="password"],.l-2cr-fluid.l-d-21 .c-1 input[type="password"],.g-d-21 select,.l-2cr-fluid.l-d-21 .c-1 select,.g-d-21 textarea,.l-2cr-fluid.l-d-21 .c-1 textarea{width:100%}.g-d-20 input[type="text"],.l-2cr-fluid.l-d-20 .c-1 input[type="text"],.g-d-20 input[type="email"],.l-2cr-fluid.l-d-20 .c-1 input[type="email"],.g-d-20 input[type="password"],.l-2cr-fluid.l-d-20 .c-1 input[type="password"],.g-d-20 select,.l-2cr-fluid.l-d-20 .c-1 select,.g-d-20 textarea,.l-2cr-fluid.l-d-20 .c-1 textarea{width:100%}.g-d-19 input[type="text"],.l-2cr-fluid.l-d-19 .c-1 input[type="text"],.g-d-19 input[type="email"],.l-2cr-fluid.l-d-19 .c-1 input[type="email"],.g-d-19 input[type="password"],.l-2cr-fluid.l-d-19 .c-1 input[type="password"],.g-d-19 select,.l-2cr-fluid.l-d-19 .c-1 select,.g-d-19 textarea,.l-2cr-fluid.l-d-19 .c-1 textarea{width:100%}.g-d-18 input[type="text"],.l-2cr-fluid.l-d-18 .c-1 input[type="text"],.g-d-18 input[type="email"],.l-2cr-fluid.l-d-18 .c-1 input[type="email"],.g-d-18 input[type="password"],.l-2cr-fluid.l-d-18 .c-1 input[type="password"],.g-d-18 select,.l-2cr-fluid.l-d-18 .c-1 select,.g-d-18 textarea,.l-2cr-fluid.l-d-18 .c-1 textarea{width:100%}.g-d-17 input[type="text"],.l-2cr-fluid.l-d-17 .c-1 input[type="text"],.g-d-17 input[type="email"],.l-2cr-fluid.l-d-17 .c-1 input[type="email"],.g-d-17 input[type="password"],.l-2cr-fluid.l-d-17 .c-1 input[type="password"],.g-d-17 select,.l-2cr-fluid.l-d-17 .c-1 select,.g-d-17 textarea,.l-2cr-fluid.l-d-17 .c-1 textarea{width:100%}.g-d-16 input[type="text"],.l-2c .c-2 input[type="text"],.l-2cr .c-2 input[type="text"],.l-2cr-fluid.l-d-16 .c-1 input[type="text"],.g-d-16 input[type="email"],.l-2c .c-2 input[type="email"],.l-2cr .c-2 input[type="email"],.l-2cr-fluid.l-d-16 .c-1 input[type="email"],.g-d-16 input[type="password"],.l-2c .c-2 input[type="password"],.l-2cr .c-2 input[type="password"],.l-2cr-fluid.l-d-16 .c-1 input[type="password"],.g-d-16 select,.l-2c .c-2 select,.l-2cr .c-2 select,.l-2cr-fluid.l-d-16 .c-1 select,.g-d-16 textarea,.l-2c .c-2 textarea,.l-2cr .c-2 textarea,.l-2cr-fluid.l-d-16 .c-1 textarea{width:100%}.g-d-15 input[type="text"],.l-2cr-fluid.l-d-15 .c-1 input[type="text"],.g-d-15 input[type="email"],.l-2cr-fluid.l-d-15 .c-1 input[type="email"],.g-d-15 input[type="password"],.l-2cr-fluid.l-d-15 .c-1 input[type="password"],.g-d-15 select,.l-2cr-fluid.l-d-15 .c-1 select,.g-d-15 textarea,.l-2cr-fluid.l-d-15 .c-1 textarea{width:100%}.g-d-14 input[type="text"],.l-2cr-fluid.l-d-14 .c-1 input[type="text"],.g-d-14 input[type="email"],.l-2cr-fluid.l-d-14 .c-1 input[type="email"],.g-d-14 input[type="password"],.l-2cr-fluid.l-d-14 .c-1 input[type="password"],.g-d-14 select,.l-2cr-fluid.l-d-14 .c-1 select,.g-d-14 textarea,.l-2cr-fluid.l-d-14 .c-1 textarea{width:100%}.g-d-13 input[type="text"],.l-2cr-fluid.l-d-13 .c-1 input[type="text"],.g-d-13 input[type="email"],.l-2cr-fluid.l-d-13 .c-1 input[type="email"],.g-d-13 input[type="password"],.l-2cr-fluid.l-d-13 .c-1 input[type="password"],.g-d-13 select,.l-2cr-fluid.l-d-13 .c-1 select,.g-d-13 textarea,.l-2cr-fluid.l-d-13 .c-1 textarea{width:100%}.g-d-12 input[type="text"],.l-2cr-fluid.l-d-12 .c-1 input[type="text"],.g-d-12 input[type="email"],.l-2cr-fluid.l-d-12 .c-1 input[type="email"],.g-d-12 input[type="password"],.l-2cr-fluid.l-d-12 .c-1 input[type="password"],.g-d-12 select,.l-2cr-fluid.l-d-12 .c-1 select,.g-d-12 textarea,.l-2cr-fluid.l-d-12 .c-1 textarea{width:100%}.g-d-11 input[type="text"],.l-2cr-fluid.l-d-11 .c-1 input[type="text"],.g-d-11 input[type="email"],.l-2cr-fluid.l-d-11 .c-1 input[type="email"],.g-d-11 input[type="password"],.l-2cr-fluid.l-d-11 .c-1 input[type="password"],.g-d-11 select,.l-2cr-fluid.l-d-11 .c-1 select,.g-d-11 textarea,.l-2cr-fluid.l-d-11 .c-1 textarea{width:100%}.g-d-10 input[type="text"],.l-2cr-fluid.l-d-10 .c-1 input[type="text"],.g-d-10 input[type="email"],.l-2cr-fluid.l-d-10 .c-1 input[type="email"],.g-d-10 input[type="password"],.l-2cr-fluid.l-d-10 .c-1 input[type="password"],.g-d-10 select,.l-2cr-fluid.l-d-10 .c-1 select,.g-d-10 textarea,.l-2cr-fluid.l-d-10 .c-1 textarea{width:100%}.g-d-9 input[type="text"],.l-2cr-fluid.l-d-9 .c-1 input[type="text"],.g-d-9 input[type="email"],.l-2cr-fluid.l-d-9 .c-1 input[type="email"],.g-d-9 input[type="password"],.l-2cr-fluid.l-d-9 .c-1 input[type="password"],.g-d-9 select,.l-2cr-fluid.l-d-9 .c-1 select,.g-d-9 textarea,.l-2cr-fluid.l-d-9 .c-1 textarea{width:100%}.g-d-8 input[type="text"],.l-2c .c-1 input[type="text"],.l-2cr .c-1 input[type="text"],.l-2cr-fluid.l-d-8 .c-1 input[type="text"],.g-d-8 input[type="email"],.l-2c .c-1 input[type="email"],.l-2cr .c-1 input[type="email"],.l-2cr-fluid.l-d-8 .c-1 input[type="email"],.g-d-8 input[type="password"],.l-2c .c-1 input[type="password"],.l-2cr .c-1 input[type="password"],.l-2cr-fluid.l-d-8 .c-1 input[type="password"],.g-d-8 select,.l-2c .c-1 select,.l-2cr .c-1 select,.l-2cr-fluid.l-d-8 .c-1 select,.g-d-8 textarea,.l-2c .c-1 textarea,.l-2cr .c-1 textarea,.l-2cr-fluid.l-d-8 .c-1 textarea{width:100%}.g-d-7 input[type="text"],.l-2cr-fluid.l-d-7 .c-1 input[type="text"],.g-d-7 input[type="email"],.l-2cr-fluid.l-d-7 .c-1 input[type="email"],.g-d-7 input[type="password"],.l-2cr-fluid.l-d-7 .c-1 input[type="password"],.g-d-7 select,.l-2cr-fluid.l-d-7 .c-1 select,.g-d-7 textarea,.l-2cr-fluid.l-d-7 .c-1 textarea{width:100%}.g-d-6 input[type="text"],.l-2cr-fluid.l-d-6 .c-1 input[type="text"],.g-d-6 input[type="email"],.l-2cr-fluid.l-d-6 .c-1 input[type="email"],.g-d-6 input[type="password"],.l-2cr-fluid.l-d-6 .c-1 input[type="password"],.g-d-6 select,.l-2cr-fluid.l-d-6 .c-1 select,.g-d-6 textarea,.l-2cr-fluid.l-d-6 .c-1 textarea{width:100%}.g-d-5 input[type="text"],.l-2cr-fluid.l-d-5 .c-1 input[type="text"],.g-d-5 input[type="email"],.l-2cr-fluid.l-d-5 .c-1 input[type="email"],.g-d-5 input[type="password"],.l-2cr-fluid.l-d-5 .c-1 input[type="password"],.g-d-5 select,.l-2cr-fluid.l-d-5 .c-1 select,.g-d-5 textarea,.l-2cr-fluid.l-d-5 .c-1 textarea{width:100%}.g-d-4 input[type="text"],.l-2cr-fluid.l-d-4 .c-1 input[type="text"],.g-d-4 input[type="email"],.l-2cr-fluid.l-d-4 .c-1 input[type="email"],.g-d-4 input[type="password"],.l-2cr-fluid.l-d-4 .c-1 input[type="password"],.g-d-4 select,.l-2cr-fluid.l-d-4 .c-1 select,.g-d-4 textarea,.l-2cr-fluid.l-d-4 .c-1 textarea{width:100%}.g-d-3 input[type="text"],.l-2cr-fluid.l-d-3 .c-1 input[type="text"],.g-d-3 input[type="email"],.l-2cr-fluid.l-d-3 .c-1 input[type="email"],.g-d-3 input[type="password"],.l-2cr-fluid.l-d-3 .c-1 input[type="password"],.g-d-3 select,.l-2cr-fluid.l-d-3 .c-1 select,.g-d-3 textarea,.l-2cr-fluid.l-d-3 .c-1 textarea{width:100%}.g-d-2 input[type="text"],.l-2cr-fluid.l-d-2 .c-1 input[type="text"],.g-d-2 input[type="email"],.l-2cr-fluid.l-d-2 .c-1 input[type="email"],.g-d-2 input[type="password"],.l-2cr-fluid.l-d-2 .c-1 input[type="password"],.g-d-2 select,.l-2cr-fluid.l-d-2 .c-1 select,.g-d-2 textarea,.l-2cr-fluid.l-d-2 .c-1 textarea{width:100%}.g-d-1 input[type="text"],.l-2cr-fluid.l-d-1 .c-1 input[type="text"],.g-d-1 input[type="email"],.l-2cr-fluid.l-d-1 .c-1 input[type="email"],.g-d-1 input[type="password"],.l-2cr-fluid.l-d-1 .c-1 input[type="password"],.g-d-1 select,.l-2cr-fluid.l-d-1 .c-1 select,.g-d-1 textarea,.l-2cr-fluid.l-d-1 .c-1 textarea{width:100%}.g-d-0 input[type="text"],.g-d-0 input[type="email"],.g-d-0 input[type="password"],.g-d-0 select,.g-d-0 textarea{width:100%}.l-show,.h-show,.hp-show,.hl-show,.t-show,.tp-show,.tl-show{display:none !important}.d-hide{display:none !important}.d-show{display:block !important}a.d-show,abbr.d-show,acronym.d-show,audio.d-show,b.d-show,basefont.d-show,bdo.d-show,big.d-show,br.d-show,canvas.d-show,cite.d-show,code.d-show,command.d-show,datalist.d-show,dfn.d-show,em.d-show,embed.d-show,font.d-show,i.d-show,img.d-show,input.d-show,keygen.d-show,kbd.d-show,label.d-show,mark.d-show,meter.d-show,output.d-show,progress.d-show,q.d-show,rp.d-show,rt.d-show,ruby.d-show,s.d-show,samp.d-show,select.d-show,small.d-show,span.d-show,strike.d-show,strong.d-show,sub.d-show,sup.d-show,textarea.d-show,time.d-show,tt.d-show,u.d-show,var.d-show,video.d-show,wbr.d-show{display:inline !important}.g-d-c,.g-all-c{*zoom:1}.g-d-c:after,.g-all-c:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.g-d-c-fluid,.l-2c-fluid:not(.grp-cell),.l-2cr-fluid{position:relative;float:none;clear:both;display:table;table-layout:fixed;width:100%;*zoom:1}.g-d-c-fluid:after,.l-2c-fluid:not(.grp-cell):after,.l-2cr-fluid:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.g-d-c-fluid>*[class^=g-d],.l-2c-fluid:not(.grp-cell)>*[class^=g-d],.l-2cr-fluid>*[class^=g-d]{position:relative;display:table-cell;float:none;vertical-align:top}body:not(.rtl) .g-d-c-fluid,body:not(.rtl) .l-2c-fluid:not(.grp-cell),body:not(.rtl) .l-2cr-fluid{margin-right:0 !important;padding-right:0 !important}body:not(.rtl) .g-d-c-fluid>*[class^=g-d],body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d],body:not(.rtl) .l-2cr-fluid>*[class^=g-d]{pmargin-right:0 !important;padding-right:20px}body:not(.rtl) .g-d-c-fluid>*[class^=g-d].g-d-l,body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-d-l,body:not(.rtl) .l-2cr-fluid>*[class^=g-d].g-d-l,body:not(.rtl) .g-d-c-fluid>*[class^=g-d].g-all-l,body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-l,body:not(.rtl) .l-2cr-fluid>*[class^=g-d].g-all-l,body:not(.rtl) .g-d-c-fluid>*[class^=g-d].g-all-fl,body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-fl,body:not(.rtl) .l-2cr-fluid>*[class^=g-d].g-all-fl,body:not(.rtl) .l-2c .g-d-c-fluid>*[class^=g-d].c-2,.l-2c body:not(.rtl) .g-d-c-fluid>*[class^=g-d].c-2,body:not(.rtl) .l-2c .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2c body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body:not(.rtl) .l-2c .l-2cr-fluid>*[class^=g-d].c-2,.l-2c body:not(.rtl) .l-2cr-fluid>*[class^=g-d].c-2,body:not(.rtl) .l-2cr .g-d-c-fluid>*[class^=g-d].c-2,.l-2cr body:not(.rtl) .g-d-c-fluid>*[class^=g-d].c-2,body:not(.rtl) .l-2cr .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2cr body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body:not(.rtl) .l-2cr .l-2cr-fluid>*[class^=g-d].c-2,.l-2cr body:not(.rtl) .l-2cr-fluid>*[class^=g-d].c-2{padding-right:0}body.rtl .g-d-c-fluid,body.rtl .l-2c-fluid:not(.grp-cell),body.rtl .l-2cr-fluid{margin-left:0 !important;padding-left:0 !important}body.rtl .g-d-c-fluid>*[class^=g-d],body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d],body.rtl .l-2cr-fluid>*[class^=g-d]{margin-left:0 !important;padding-left:20px}body.rtl .g-d-c-fluid>*[class^=g-d].g-d-l,body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-d-l,body.rtl .l-2cr-fluid>*[class^=g-d].g-d-l,body.rtl .g-d-c-fluid>*[class^=g-d].g-all-l,body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-l,body.rtl .l-2cr-fluid>*[class^=g-d].g-all-l,body.rtl .g-d-c-fluid>*[class^=g-d].g-all-fl,body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-fl,body.rtl .l-2cr-fluid>*[class^=g-d].g-all-fl,body.rtl .l-2c .g-d-c-fluid>*[class^=g-d].c-2,.l-2c body.rtl .g-d-c-fluid>*[class^=g-d].c-2,body.rtl .l-2c .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2c body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body.rtl .l-2c .l-2cr-fluid>*[class^=g-d].c-2,.l-2c body.rtl .l-2cr-fluid>*[class^=g-d].c-2,body.rtl .l-2cr .g-d-c-fluid>*[class^=g-d].c-2,.l-2cr body.rtl .g-d-c-fluid>*[class^=g-d].c-2,body.rtl .l-2cr .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2cr body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body.rtl .l-2cr .l-2cr-fluid>*[class^=g-d].c-2,.l-2cr body.rtl .l-2cr-fluid>*[class^=g-d].c-2{padding-left:0}.g-base-c{*zoom:1}.g-base-c:after{content:"";display:table;clear:both}.g-base-c.g-centered{float:none;margin:0 auto}.l-2c-fluid:not(.grp-cell) .c-1{margin-left:0;padding-left:20px;vertical-align:top}.l-2c-fluid:not(.grp-cell) .c-2{float:none;display:table-cell;width:100%;vertical-align:top}.grp-row>.l-2c-fluid:not(.grp-cell) .c-2{padding-left:0}.l-2cr-fluid .c-1{float:left !important;display:table-cell;margin-left:0 !important;padding-left:0 !important;margin-right:0 !important;padding-right:20px !important;vertical-align:top}.l-2cr-fluid .c-2{float:right !important;display:table-cell;margin-left:0 !important;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:top}.grp-module .l-2c-fluid .c-2{padding-left:10px}.grp-module .l-2c-fluid.grp-cell .c-1{display:table-cell;vertical-align:top}.grp-module .l-2c-fluid.grp-cell .c-2{display:table-cell;float:none;padding-left:0;width:auto !important;vertical-align:top}.grp-module .l-2c-fluid.grp-cell .c-2 *{white-space:normal}
diff --git a/static/grappelli/stylesheets/mueller/grid/output.css b/static/grappelli/stylesheets/mueller/grid/output.css
new file mode 100644
index 0000000..e5a14bb
--- /dev/null
+++ b/static/grappelli/stylesheets/mueller/grid/output.css
@@ -0,0 +1 @@
+html{font-size:12px;line-height:16px}.g-d-c,.g-all-c{*zoom:1;width:940px}.g-d-c:after,.g-all-c:after{content:"";display:table;clear:both}.g-d-c.g-centered,.g-centered.g-all-c{float:none;margin:0 auto}.g-d{float:left;*zoom:1}.g-d:after{content:"";display:table;clear:both}.g-d-f,.g-all-f,.g-all-fl,.l-2c .c-1,.l-2cr .c-1{margin-left:0 !important;margin-right:20px !important;clear:left}.g-d-l,.g-all-l,.g-all-fl,.l-2c .c-2,.l-2cr .c-2{margin-right:0 !important}.g-d-prepend24{padding-left:960px !important}.g-d-append24,.l-2cr-fluid.l-d-24 .c-2{padding-right:960px !important}.g-d-push24{position:relative;margin-left:960px !important;margin-right:-960px !important;margin-top:0;margin-bottom:0}.g-d-pull24{position:relative;margin-left:-940px !important}.g-d-doublepull24,.l-2cr-fluid.l-d-24 .c-1{position:relative;margin-left:-1960px !important}.g-d-prepend23{padding-left:920px !important}.g-d-append23,.l-2cr-fluid.l-d-23 .c-2{padding-right:920px !important}.g-d-push23{position:relative;margin-left:920px !important;margin-right:-920px !important;margin-top:0;margin-bottom:0}.g-d-pull23{position:relative;margin-left:-900px !important}.g-d-doublepull23,.l-2cr-fluid.l-d-23 .c-1{position:relative;margin-left:-1880px !important}.g-d-prepend22{padding-left:880px !important}.g-d-append22,.l-2cr-fluid.l-d-22 .c-2{padding-right:880px !important}.g-d-push22{position:relative;margin-left:880px !important;margin-right:-880px !important;margin-top:0;margin-bottom:0}.g-d-pull22{position:relative;margin-left:-860px !important}.g-d-doublepull22,.l-2cr-fluid.l-d-22 .c-1{position:relative;margin-left:-1800px !important}.g-d-prepend21{padding-left:840px !important}.g-d-append21,.l-2cr-fluid.l-d-21 .c-2{padding-right:840px !important}.g-d-push21{position:relative;margin-left:840px !important;margin-right:-840px !important;margin-top:0;margin-bottom:0}.g-d-pull21{position:relative;margin-left:-820px !important}.g-d-doublepull21,.l-2cr-fluid.l-d-21 .c-1{position:relative;margin-left:-1720px !important}.g-d-prepend20{padding-left:800px !important}.g-d-append20,.l-2cr-fluid.l-d-20 .c-2{padding-right:800px !important}.g-d-push20{position:relative;margin-left:800px !important;margin-right:-800px !important;margin-top:0;margin-bottom:0}.g-d-pull20{position:relative;margin-left:-780px !important}.g-d-doublepull20,.l-2cr-fluid.l-d-20 .c-1{position:relative;margin-left:-1640px !important}.g-d-prepend19{padding-left:760px !important}.g-d-append19,.l-2cr-fluid.l-d-19 .c-2{padding-right:760px !important}.g-d-push19{position:relative;margin-left:760px !important;margin-right:-760px !important;margin-top:0;margin-bottom:0}.g-d-pull19{position:relative;margin-left:-740px !important}.g-d-doublepull19,.l-2cr-fluid.l-d-19 .c-1{position:relative;margin-left:-1560px !important}.g-d-prepend18{padding-left:720px !important}.g-d-append18,.l-2cr-fluid.l-d-18 .c-2{padding-right:720px !important}.g-d-push18{position:relative;margin-left:720px !important;margin-right:-720px !important;margin-top:0;margin-bottom:0}.g-d-pull18{position:relative;margin-left:-700px !important}.g-d-doublepull18,.l-2cr-fluid.l-d-18 .c-1{position:relative;margin-left:-1480px !important}.g-d-prepend17{padding-left:680px !important}.g-d-append17,.l-2cr-fluid.l-d-17 .c-2{padding-right:680px !important}.g-d-push17{position:relative;margin-left:680px !important;margin-right:-680px !important;margin-top:0;margin-bottom:0}.g-d-pull17{position:relative;margin-left:-660px !important}.g-d-doublepull17,.l-2cr-fluid.l-d-17 .c-1{position:relative;margin-left:-1400px !important}.g-d-prepend16{padding-left:640px !important}.g-d-append16,.l-2cr-fluid.l-d-16 .c-2{padding-right:640px !important}.g-d-push16,.l-2cr .c-1{position:relative;margin-left:640px !important;margin-right:-640px !important;margin-top:0;margin-bottom:0}.g-d-pull16{position:relative;margin-left:-620px !important}.g-d-doublepull16,.l-2cr-fluid.l-d-16 .c-1{position:relative;margin-left:-1320px !important}.g-d-prepend15{padding-left:600px !important}.g-d-append15,.l-2cr-fluid.l-d-15 .c-2{padding-right:600px !important}.g-d-push15{position:relative;margin-left:600px !important;margin-right:-600px !important;margin-top:0;margin-bottom:0}.g-d-pull15{position:relative;margin-left:-580px !important}.g-d-doublepull15,.l-2cr-fluid.l-d-15 .c-1{position:relative;margin-left:-1240px !important}.g-d-prepend14{padding-left:560px !important}.g-d-append14,.l-2cr-fluid.l-d-14 .c-2{padding-right:560px !important}.g-d-push14{position:relative;margin-left:560px !important;margin-right:-560px !important;margin-top:0;margin-bottom:0}.g-d-pull14{position:relative;margin-left:-540px !important}.g-d-doublepull14,.l-2cr-fluid.l-d-14 .c-1{position:relative;margin-left:-1160px !important}.g-d-prepend13{padding-left:520px !important}.g-d-append13,.l-2cr-fluid.l-d-13 .c-2{padding-right:520px !important}.g-d-push13{position:relative;margin-left:520px !important;margin-right:-520px !important;margin-top:0;margin-bottom:0}.g-d-pull13{position:relative;margin-left:-500px !important}.g-d-doublepull13,.l-2cr-fluid.l-d-13 .c-1{position:relative;margin-left:-1080px !important}.g-d-prepend12{padding-left:480px !important}.g-d-append12,.l-2cr-fluid.l-d-12 .c-2{padding-right:480px !important}.g-d-push12{position:relative;margin-left:480px !important;margin-right:-480px !important;margin-top:0;margin-bottom:0}.g-d-pull12{position:relative;margin-left:-460px !important}.g-d-doublepull12,.l-2cr-fluid.l-d-12 .c-1{position:relative;margin-left:-1000px !important}.g-d-prepend11{padding-left:440px !important}.g-d-append11,.l-2cr-fluid.l-d-11 .c-2{padding-right:440px !important}.g-d-push11{position:relative;margin-left:440px !important;margin-right:-440px !important;margin-top:0;margin-bottom:0}.g-d-pull11{position:relative;margin-left:-420px !important}.g-d-doublepull11,.l-2cr-fluid.l-d-11 .c-1{position:relative;margin-left:-920px !important}.g-d-prepend10{padding-left:400px !important}.g-d-append10,.l-2cr-fluid.l-d-10 .c-2{padding-right:400px !important}.g-d-push10{position:relative;margin-left:400px !important;margin-right:-400px !important;margin-top:0;margin-bottom:0}.g-d-pull10{position:relative;margin-left:-380px !important}.g-d-doublepull10,.l-2cr-fluid.l-d-10 .c-1{position:relative;margin-left:-840px !important}.g-d-prepend9{padding-left:360px !important}.g-d-append9,.l-2cr-fluid.l-d-9 .c-2{padding-right:360px !important}.g-d-push9{position:relative;margin-left:360px !important;margin-right:-360px !important;margin-top:0;margin-bottom:0}.g-d-pull9{position:relative;margin-left:-340px !important}.g-d-doublepull9,.l-2cr-fluid.l-d-9 .c-1{position:relative;margin-left:-760px !important}.g-d-prepend8{padding-left:320px !important}.g-d-append8,.l-2cr-fluid.l-d-8 .c-2{padding-right:320px !important}.g-d-push8{position:relative;margin-left:320px !important;margin-right:-320px !important;margin-top:0;margin-bottom:0}.g-d-pull8,.l-2cr .c-2{position:relative;margin-left:-300px !important}.g-d-doublepull8,.l-2cr-fluid.l-d-8 .c-1{position:relative;margin-left:-680px !important}.g-d-prepend7{padding-left:280px !important}.g-d-append7,.l-2cr-fluid.l-d-7 .c-2{padding-right:280px !important}.g-d-push7{position:relative;margin-left:280px !important;margin-right:-280px !important;margin-top:0;margin-bottom:0}.g-d-pull7{position:relative;margin-left:-260px !important}.g-d-doublepull7,.l-2cr-fluid.l-d-7 .c-1{position:relative;margin-left:-600px !important}.g-d-prepend6{padding-left:240px !important}.g-d-append6,.l-2cr-fluid.l-d-6 .c-2{padding-right:240px !important}.g-d-push6{position:relative;margin-left:240px !important;margin-right:-240px !important;margin-top:0;margin-bottom:0}.g-d-pull6{position:relative;margin-left:-220px !important}.g-d-doublepull6,.l-2cr-fluid.l-d-6 .c-1{position:relative;margin-left:-520px !important}.g-d-prepend5{padding-left:200px !important}.g-d-append5,.l-2cr-fluid.l-d-5 .c-2{padding-right:200px !important}.g-d-push5{position:relative;margin-left:200px !important;margin-right:-200px !important;margin-top:0;margin-bottom:0}.g-d-pull5{position:relative;margin-left:-180px !important}.g-d-doublepull5,.l-2cr-fluid.l-d-5 .c-1{position:relative;margin-left:-440px !important}.g-d-prepend4{padding-left:160px !important}.g-d-append4,.l-2cr-fluid.l-d-4 .c-2{padding-right:160px !important}.g-d-push4{position:relative;margin-left:160px !important;margin-right:-160px !important;margin-top:0;margin-bottom:0}.g-d-pull4{position:relative;margin-left:-140px !important}.g-d-doublepull4,.l-2cr-fluid.l-d-4 .c-1{position:relative;margin-left:-360px !important}.g-d-prepend3{padding-left:120px !important}.g-d-append3,.l-2cr-fluid.l-d-3 .c-2{padding-right:120px !important}.g-d-push3{position:relative;margin-left:120px !important;margin-right:-120px !important;margin-top:0;margin-bottom:0}.g-d-pull3{position:relative;margin-left:-100px !important}.g-d-doublepull3,.l-2cr-fluid.l-d-3 .c-1{position:relative;margin-left:-280px !important}.g-d-prepend2{padding-left:80px !important}.g-d-append2,.l-2cr-fluid.l-d-2 .c-2{padding-right:80px !important}.g-d-push2{position:relative;margin-left:80px !important;margin-right:-80px !important;margin-top:0;margin-bottom:0}.g-d-pull2{position:relative;margin-left:-60px !important}.g-d-doublepull2,.l-2cr-fluid.l-d-2 .c-1{position:relative;margin-left:-200px !important}.g-d-prepend1{padding-left:40px !important}.g-d-append1,.l-2cr-fluid.l-d-1 .c-2{padding-right:40px !important}.g-d-push1{position:relative;margin-left:40px !important;margin-right:-40px !important;margin-top:0;margin-bottom:0}.g-d-pull1{position:relative;margin-left:-20px !important}.g-d-doublepull1,.l-2cr-fluid.l-d-1 .c-1{position:relative;margin-left:-120px !important}.g-d-prepend0{padding-left:0px !important}.g-d-append0{padding-right:0px !important}.g-d-push0{position:relative;margin-left:0px !important;margin-right:0px !important;margin-top:0;margin-bottom:0}.g-d-pull0{position:relative;margin-left:20px !important}.g-d-doublepull0{position:relative;margin-left:-40px !important}.g-d-24,.l-2c,.l-2cr,.l-2cr-fluid.l-d-24 .c-1{float:left;*zoom:1;margin-left:0 !important;margin-right:0 !important;clear:both;width:940px}.g-d-24:after,.l-2c:after,.l-2cr:after,.l-2cr-fluid.l-d-24 .c-1:after{content:"";display:table;clear:both}.g-d-23,.l-2cr-fluid.l-d-23 .c-1{float:left;*zoom:1;margin-right:20px;width:900px}.g-d-23:after,.l-2cr-fluid.l-d-23 .c-1:after{content:"";display:table;clear:both}.g-d-22,.l-2cr-fluid.l-d-22 .c-1{float:left;*zoom:1;margin-right:20px;width:860px}.g-d-22:after,.l-2cr-fluid.l-d-22 .c-1:after{content:"";display:table;clear:both}.g-d-21,.l-2cr-fluid.l-d-21 .c-1{float:left;*zoom:1;margin-right:20px;width:820px}.g-d-21:after,.l-2cr-fluid.l-d-21 .c-1:after{content:"";display:table;clear:both}.g-d-20,.l-2cr-fluid.l-d-20 .c-1{float:left;*zoom:1;margin-right:20px;width:780px}.g-d-20:after,.l-2cr-fluid.l-d-20 .c-1:after{content:"";display:table;clear:both}.g-d-19,.l-2cr-fluid.l-d-19 .c-1{float:left;*zoom:1;margin-right:20px;width:740px}.g-d-19:after,.l-2cr-fluid.l-d-19 .c-1:after{content:"";display:table;clear:both}.g-d-18,.l-2cr-fluid.l-d-18 .c-1{float:left;*zoom:1;margin-right:20px;width:700px}.g-d-18:after,.l-2cr-fluid.l-d-18 .c-1:after{content:"";display:table;clear:both}.g-d-17,.l-2cr-fluid.l-d-17 .c-1{float:left;*zoom:1;margin-right:20px;width:660px}.g-d-17:after,.l-2cr-fluid.l-d-17 .c-1:after{content:"";display:table;clear:both}.g-d-16,.l-2c .c-2,.l-2cr .c-2,.l-2cr-fluid.l-d-16 .c-1{float:left;*zoom:1;margin-right:20px;width:620px}.g-d-16:after,.l-2c .c-2:after,.l-2cr .c-2:after,.l-2cr-fluid.l-d-16 .c-1:after{content:"";display:table;clear:both}.g-d-15,.l-2cr-fluid.l-d-15 .c-1{float:left;*zoom:1;margin-right:20px;width:580px}.g-d-15:after,.l-2cr-fluid.l-d-15 .c-1:after{content:"";display:table;clear:both}.g-d-14,.l-2cr-fluid.l-d-14 .c-1{float:left;*zoom:1;margin-right:20px;width:540px}.g-d-14:after,.l-2cr-fluid.l-d-14 .c-1:after{content:"";display:table;clear:both}.g-d-13,.l-2cr-fluid.l-d-13 .c-1{float:left;*zoom:1;margin-right:20px;width:500px}.g-d-13:after,.l-2cr-fluid.l-d-13 .c-1:after{content:"";display:table;clear:both}.g-d-12,.l-2cr-fluid.l-d-12 .c-1{float:left;*zoom:1;margin-right:20px;width:460px}.g-d-12:after,.l-2cr-fluid.l-d-12 .c-1:after{content:"";display:table;clear:both}.g-d-11,.l-2cr-fluid.l-d-11 .c-1{float:left;*zoom:1;margin-right:20px;width:420px}.g-d-11:after,.l-2cr-fluid.l-d-11 .c-1:after{content:"";display:table;clear:both}.g-d-10,.l-2cr-fluid.l-d-10 .c-1{float:left;*zoom:1;margin-right:20px;width:380px}.g-d-10:after,.l-2cr-fluid.l-d-10 .c-1:after{content:"";display:table;clear:both}.g-d-9,.l-2cr-fluid.l-d-9 .c-1{float:left;*zoom:1;margin-right:20px;width:340px}.g-d-9:after,.l-2cr-fluid.l-d-9 .c-1:after{content:"";display:table;clear:both}.g-d-8,.l-2c .c-1,.l-2cr .c-1,.l-2cr-fluid.l-d-8 .c-1{float:left;*zoom:1;margin-right:20px;width:300px}.g-d-8:after,.l-2c .c-1:after,.l-2cr .c-1:after,.l-2cr-fluid.l-d-8 .c-1:after{content:"";display:table;clear:both}.g-d-7,.l-2cr-fluid.l-d-7 .c-1{float:left;*zoom:1;margin-right:20px;width:260px}.g-d-7:after,.l-2cr-fluid.l-d-7 .c-1:after{content:"";display:table;clear:both}.g-d-6,.l-2cr-fluid.l-d-6 .c-1{float:left;*zoom:1;margin-right:20px;width:220px}.g-d-6:after,.l-2cr-fluid.l-d-6 .c-1:after{content:"";display:table;clear:both}.g-d-5,.l-2cr-fluid.l-d-5 .c-1{float:left;*zoom:1;margin-right:20px;width:180px}.g-d-5:after,.l-2cr-fluid.l-d-5 .c-1:after{content:"";display:table;clear:both}.g-d-4,.l-2cr-fluid.l-d-4 .c-1{float:left;*zoom:1;margin-right:20px;width:140px}.g-d-4:after,.l-2cr-fluid.l-d-4 .c-1:after{content:"";display:table;clear:both}.g-d-3,.l-2cr-fluid.l-d-3 .c-1{float:left;*zoom:1;margin-right:20px;width:100px}.g-d-3:after,.l-2cr-fluid.l-d-3 .c-1:after{content:"";display:table;clear:both}.g-d-2,.l-2cr-fluid.l-d-2 .c-1{float:left;*zoom:1;margin-right:20px;width:60px}.g-d-2:after,.l-2cr-fluid.l-d-2 .c-1:after{content:"";display:table;clear:both}.g-d-1,.l-2cr-fluid.l-d-1 .c-1{float:left;*zoom:1;margin-right:20px;width:20px}.g-d-1:after,.l-2cr-fluid.l-d-1 .c-1:after{content:"";display:table;clear:both}.g-d-0{float:left;*zoom:1;margin-right:20px;width:-20px}.g-d-0:after{content:"";display:table;clear:both}.g-d-24-td,.l-2c-fluid:not(.grp-cell).l-d-24 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-24 .c-1{float:left;*zoom:1;margin-left:0 !important;margin-right:0 !important;padding-right:0 !important;clear:both;width:940px;min-width:940px;float:none;display:table-cell}.g-d-24-td:after,.l-2c-fluid:not(.grp-cell).l-d-24 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-24 .c-1:after{content:"";display:table;clear:both}.g-d-23-td,.l-2c-fluid:not(.grp-cell).l-d-23 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-23 .c-1{float:left;*zoom:1;padding-right:20px;width:900px;min-width:900px;float:none;display:table-cell}.g-d-23-td:after,.l-2c-fluid:not(.grp-cell).l-d-23 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-23 .c-1:after{content:"";display:table;clear:both}.g-d-22-td,.l-2c-fluid:not(.grp-cell).l-d-22 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-22 .c-1{float:left;*zoom:1;padding-right:20px;width:860px;min-width:860px;float:none;display:table-cell}.g-d-22-td:after,.l-2c-fluid:not(.grp-cell).l-d-22 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-22 .c-1:after{content:"";display:table;clear:both}.g-d-21-td,.l-2c-fluid:not(.grp-cell).l-d-21 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-21 .c-1{float:left;*zoom:1;padding-right:20px;width:820px;min-width:820px;float:none;display:table-cell}.g-d-21-td:after,.l-2c-fluid:not(.grp-cell).l-d-21 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-21 .c-1:after{content:"";display:table;clear:both}.g-d-20-td,.l-2c-fluid:not(.grp-cell).l-d-20 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-20 .c-1{float:left;*zoom:1;padding-right:20px;width:780px;min-width:780px;float:none;display:table-cell}.g-d-20-td:after,.l-2c-fluid:not(.grp-cell).l-d-20 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-20 .c-1:after{content:"";display:table;clear:both}.g-d-19-td,.l-2c-fluid:not(.grp-cell).l-d-19 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-19 .c-1{float:left;*zoom:1;padding-right:20px;width:740px;min-width:740px;float:none;display:table-cell}.g-d-19-td:after,.l-2c-fluid:not(.grp-cell).l-d-19 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-19 .c-1:after{content:"";display:table;clear:both}.g-d-18-td,.l-2c-fluid:not(.grp-cell).l-d-18 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-18 .c-1{float:left;*zoom:1;padding-right:20px;width:700px;min-width:700px;float:none;display:table-cell}.g-d-18-td:after,.l-2c-fluid:not(.grp-cell).l-d-18 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-18 .c-1:after{content:"";display:table;clear:both}.g-d-17-td,.l-2c-fluid:not(.grp-cell).l-d-17 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-17 .c-1{float:left;*zoom:1;padding-right:20px;width:660px;min-width:660px;float:none;display:table-cell}.g-d-17-td:after,.l-2c-fluid:not(.grp-cell).l-d-17 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-17 .c-1:after{content:"";display:table;clear:both}.g-d-16-td,.l-2c-fluid:not(.grp-cell).l-d-16 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-16 .c-1{float:left;*zoom:1;padding-right:20px;width:620px;min-width:620px;float:none;display:table-cell}.g-d-16-td:after,.l-2c-fluid:not(.grp-cell).l-d-16 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-16 .c-1:after{content:"";display:table;clear:both}.g-d-15-td,.l-2c-fluid:not(.grp-cell).l-d-15 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-15 .c-1{float:left;*zoom:1;padding-right:20px;width:580px;min-width:580px;float:none;display:table-cell}.g-d-15-td:after,.l-2c-fluid:not(.grp-cell).l-d-15 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-15 .c-1:after{content:"";display:table;clear:both}.g-d-14-td,.l-2c-fluid:not(.grp-cell).l-d-14 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-14 .c-1{float:left;*zoom:1;padding-right:20px;width:540px;min-width:540px;float:none;display:table-cell}.g-d-14-td:after,.l-2c-fluid:not(.grp-cell).l-d-14 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-14 .c-1:after{content:"";display:table;clear:both}.g-d-13-td,.l-2c-fluid:not(.grp-cell).l-d-13 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-13 .c-1{float:left;*zoom:1;padding-right:20px;width:500px;min-width:500px;float:none;display:table-cell}.g-d-13-td:after,.l-2c-fluid:not(.grp-cell).l-d-13 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-13 .c-1:after{content:"";display:table;clear:both}.g-d-12-td,.l-2c-fluid:not(.grp-cell).l-d-12 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-12 .c-1{float:left;*zoom:1;padding-right:20px;width:460px;min-width:460px;float:none;display:table-cell}.g-d-12-td:after,.l-2c-fluid:not(.grp-cell).l-d-12 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-12 .c-1:after{content:"";display:table;clear:both}.g-d-11-td,.l-2c-fluid:not(.grp-cell).l-d-11 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-11 .c-1{float:left;*zoom:1;padding-right:20px;width:420px;min-width:420px;float:none;display:table-cell}.g-d-11-td:after,.l-2c-fluid:not(.grp-cell).l-d-11 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-11 .c-1:after{content:"";display:table;clear:both}.g-d-10-td,.l-2c-fluid:not(.grp-cell).l-d-10 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-10 .c-1{float:left;*zoom:1;padding-right:20px;width:380px;min-width:380px;float:none;display:table-cell}.g-d-10-td:after,.l-2c-fluid:not(.grp-cell).l-d-10 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-10 .c-1:after{content:"";display:table;clear:both}.g-d-9-td,.l-2c-fluid:not(.grp-cell).l-d-9 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-9 .c-1{float:left;*zoom:1;padding-right:20px;width:340px;min-width:340px;float:none;display:table-cell}.g-d-9-td:after,.l-2c-fluid:not(.grp-cell).l-d-9 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-9 .c-1:after{content:"";display:table;clear:both}.g-d-8-td,.l-2c-fluid:not(.grp-cell).l-d-8 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-8 .c-1{float:left;*zoom:1;padding-right:20px;width:300px;min-width:300px;float:none;display:table-cell}.g-d-8-td:after,.l-2c-fluid:not(.grp-cell).l-d-8 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-8 .c-1:after{content:"";display:table;clear:both}.g-d-7-td,.l-2c-fluid:not(.grp-cell).l-d-7 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-7 .c-1{float:left;*zoom:1;padding-right:20px;width:260px;min-width:260px;float:none;display:table-cell}.g-d-7-td:after,.l-2c-fluid:not(.grp-cell).l-d-7 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-7 .c-1:after{content:"";display:table;clear:both}.g-d-6-td,.l-2c-fluid:not(.grp-cell).l-d-6 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-6 .c-1{float:left;*zoom:1;padding-right:20px;width:220px;min-width:220px;float:none;display:table-cell}.g-d-6-td:after,.l-2c-fluid:not(.grp-cell).l-d-6 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-6 .c-1:after{content:"";display:table;clear:both}.g-d-5-td,.l-2c-fluid:not(.grp-cell).l-d-5 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-5 .c-1{float:left;*zoom:1;padding-right:20px;width:180px;min-width:180px;float:none;display:table-cell}.g-d-5-td:after,.l-2c-fluid:not(.grp-cell).l-d-5 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-5 .c-1:after{content:"";display:table;clear:both}.g-d-4-td,.l-2c-fluid:not(.grp-cell).l-d-4 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-4 .c-1{float:left;*zoom:1;padding-right:20px;width:140px;min-width:140px;float:none;display:table-cell}.g-d-4-td:after,.l-2c-fluid:not(.grp-cell).l-d-4 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-4 .c-1:after{content:"";display:table;clear:both}.g-d-3-td,.l-2c-fluid:not(.grp-cell).l-d-3 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-3 .c-1{float:left;*zoom:1;padding-right:20px;width:100px;min-width:100px;float:none;display:table-cell}.g-d-3-td:after,.l-2c-fluid:not(.grp-cell).l-d-3 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-3 .c-1:after{content:"";display:table;clear:both}.g-d-2-td,.l-2c-fluid:not(.grp-cell).l-d-2 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-2 .c-1{float:left;*zoom:1;padding-right:20px;width:60px;min-width:60px;float:none;display:table-cell}.g-d-2-td:after,.l-2c-fluid:not(.grp-cell).l-d-2 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-2 .c-1:after{content:"";display:table;clear:both}.g-d-1-td,.l-2c-fluid:not(.grp-cell).l-d-1 .c-1,.grp-module .l-2c-fluid.grp-cell.l-d-1 .c-1{float:left;*zoom:1;padding-right:20px;width:20px;min-width:20px;float:none;display:table-cell}.g-d-1-td:after,.l-2c-fluid:not(.grp-cell).l-d-1 .c-1:after,.grp-module .l-2c-fluid.grp-cell.l-d-1 .c-1:after{content:"";display:table;clear:both}.g-d-0-td{float:left;*zoom:1;padding-right:20px;width:-20px;min-width:-20px;float:none;display:table-cell}.g-d-0-td:after{content:"";display:table;clear:both}.g-d-24 input[type="text"],.l-2c input[type="text"],.l-2cr input[type="text"],.l-2cr-fluid.l-d-24 .c-1 input[type="text"],.g-d-24 input[type="email"],.l-2c input[type="email"],.l-2cr input[type="email"],.l-2cr-fluid.l-d-24 .c-1 input[type="email"],.g-d-24 input[type="password"],.l-2c input[type="password"],.l-2cr input[type="password"],.l-2cr-fluid.l-d-24 .c-1 input[type="password"],.g-d-24 select,.l-2c select,.l-2cr select,.l-2cr-fluid.l-d-24 .c-1 select,.g-d-24 textarea,.l-2c textarea,.l-2cr textarea,.l-2cr-fluid.l-d-24 .c-1 textarea{width:100%}.g-d-23 input[type="text"],.l-2cr-fluid.l-d-23 .c-1 input[type="text"],.g-d-23 input[type="email"],.l-2cr-fluid.l-d-23 .c-1 input[type="email"],.g-d-23 input[type="password"],.l-2cr-fluid.l-d-23 .c-1 input[type="password"],.g-d-23 select,.l-2cr-fluid.l-d-23 .c-1 select,.g-d-23 textarea,.l-2cr-fluid.l-d-23 .c-1 textarea{width:100%}.g-d-22 input[type="text"],.l-2cr-fluid.l-d-22 .c-1 input[type="text"],.g-d-22 input[type="email"],.l-2cr-fluid.l-d-22 .c-1 input[type="email"],.g-d-22 input[type="password"],.l-2cr-fluid.l-d-22 .c-1 input[type="password"],.g-d-22 select,.l-2cr-fluid.l-d-22 .c-1 select,.g-d-22 textarea,.l-2cr-fluid.l-d-22 .c-1 textarea{width:100%}.g-d-21 input[type="text"],.l-2cr-fluid.l-d-21 .c-1 input[type="text"],.g-d-21 input[type="email"],.l-2cr-fluid.l-d-21 .c-1 input[type="email"],.g-d-21 input[type="password"],.l-2cr-fluid.l-d-21 .c-1 input[type="password"],.g-d-21 select,.l-2cr-fluid.l-d-21 .c-1 select,.g-d-21 textarea,.l-2cr-fluid.l-d-21 .c-1 textarea{width:100%}.g-d-20 input[type="text"],.l-2cr-fluid.l-d-20 .c-1 input[type="text"],.g-d-20 input[type="email"],.l-2cr-fluid.l-d-20 .c-1 input[type="email"],.g-d-20 input[type="password"],.l-2cr-fluid.l-d-20 .c-1 input[type="password"],.g-d-20 select,.l-2cr-fluid.l-d-20 .c-1 select,.g-d-20 textarea,.l-2cr-fluid.l-d-20 .c-1 textarea{width:100%}.g-d-19 input[type="text"],.l-2cr-fluid.l-d-19 .c-1 input[type="text"],.g-d-19 input[type="email"],.l-2cr-fluid.l-d-19 .c-1 input[type="email"],.g-d-19 input[type="password"],.l-2cr-fluid.l-d-19 .c-1 input[type="password"],.g-d-19 select,.l-2cr-fluid.l-d-19 .c-1 select,.g-d-19 textarea,.l-2cr-fluid.l-d-19 .c-1 textarea{width:100%}.g-d-18 input[type="text"],.l-2cr-fluid.l-d-18 .c-1 input[type="text"],.g-d-18 input[type="email"],.l-2cr-fluid.l-d-18 .c-1 input[type="email"],.g-d-18 input[type="password"],.l-2cr-fluid.l-d-18 .c-1 input[type="password"],.g-d-18 select,.l-2cr-fluid.l-d-18 .c-1 select,.g-d-18 textarea,.l-2cr-fluid.l-d-18 .c-1 textarea{width:100%}.g-d-17 input[type="text"],.l-2cr-fluid.l-d-17 .c-1 input[type="text"],.g-d-17 input[type="email"],.l-2cr-fluid.l-d-17 .c-1 input[type="email"],.g-d-17 input[type="password"],.l-2cr-fluid.l-d-17 .c-1 input[type="password"],.g-d-17 select,.l-2cr-fluid.l-d-17 .c-1 select,.g-d-17 textarea,.l-2cr-fluid.l-d-17 .c-1 textarea{width:100%}.g-d-16 input[type="text"],.l-2c .c-2 input[type="text"],.l-2cr .c-2 input[type="text"],.l-2cr-fluid.l-d-16 .c-1 input[type="text"],.g-d-16 input[type="email"],.l-2c .c-2 input[type="email"],.l-2cr .c-2 input[type="email"],.l-2cr-fluid.l-d-16 .c-1 input[type="email"],.g-d-16 input[type="password"],.l-2c .c-2 input[type="password"],.l-2cr .c-2 input[type="password"],.l-2cr-fluid.l-d-16 .c-1 input[type="password"],.g-d-16 select,.l-2c .c-2 select,.l-2cr .c-2 select,.l-2cr-fluid.l-d-16 .c-1 select,.g-d-16 textarea,.l-2c .c-2 textarea,.l-2cr .c-2 textarea,.l-2cr-fluid.l-d-16 .c-1 textarea{width:100%}.g-d-15 input[type="text"],.l-2cr-fluid.l-d-15 .c-1 input[type="text"],.g-d-15 input[type="email"],.l-2cr-fluid.l-d-15 .c-1 input[type="email"],.g-d-15 input[type="password"],.l-2cr-fluid.l-d-15 .c-1 input[type="password"],.g-d-15 select,.l-2cr-fluid.l-d-15 .c-1 select,.g-d-15 textarea,.l-2cr-fluid.l-d-15 .c-1 textarea{width:100%}.g-d-14 input[type="text"],.l-2cr-fluid.l-d-14 .c-1 input[type="text"],.g-d-14 input[type="email"],.l-2cr-fluid.l-d-14 .c-1 input[type="email"],.g-d-14 input[type="password"],.l-2cr-fluid.l-d-14 .c-1 input[type="password"],.g-d-14 select,.l-2cr-fluid.l-d-14 .c-1 select,.g-d-14 textarea,.l-2cr-fluid.l-d-14 .c-1 textarea{width:100%}.g-d-13 input[type="text"],.l-2cr-fluid.l-d-13 .c-1 input[type="text"],.g-d-13 input[type="email"],.l-2cr-fluid.l-d-13 .c-1 input[type="email"],.g-d-13 input[type="password"],.l-2cr-fluid.l-d-13 .c-1 input[type="password"],.g-d-13 select,.l-2cr-fluid.l-d-13 .c-1 select,.g-d-13 textarea,.l-2cr-fluid.l-d-13 .c-1 textarea{width:100%}.g-d-12 input[type="text"],.l-2cr-fluid.l-d-12 .c-1 input[type="text"],.g-d-12 input[type="email"],.l-2cr-fluid.l-d-12 .c-1 input[type="email"],.g-d-12 input[type="password"],.l-2cr-fluid.l-d-12 .c-1 input[type="password"],.g-d-12 select,.l-2cr-fluid.l-d-12 .c-1 select,.g-d-12 textarea,.l-2cr-fluid.l-d-12 .c-1 textarea{width:100%}.g-d-11 input[type="text"],.l-2cr-fluid.l-d-11 .c-1 input[type="text"],.g-d-11 input[type="email"],.l-2cr-fluid.l-d-11 .c-1 input[type="email"],.g-d-11 input[type="password"],.l-2cr-fluid.l-d-11 .c-1 input[type="password"],.g-d-11 select,.l-2cr-fluid.l-d-11 .c-1 select,.g-d-11 textarea,.l-2cr-fluid.l-d-11 .c-1 textarea{width:100%}.g-d-10 input[type="text"],.l-2cr-fluid.l-d-10 .c-1 input[type="text"],.g-d-10 input[type="email"],.l-2cr-fluid.l-d-10 .c-1 input[type="email"],.g-d-10 input[type="password"],.l-2cr-fluid.l-d-10 .c-1 input[type="password"],.g-d-10 select,.l-2cr-fluid.l-d-10 .c-1 select,.g-d-10 textarea,.l-2cr-fluid.l-d-10 .c-1 textarea{width:100%}.g-d-9 input[type="text"],.l-2cr-fluid.l-d-9 .c-1 input[type="text"],.g-d-9 input[type="email"],.l-2cr-fluid.l-d-9 .c-1 input[type="email"],.g-d-9 input[type="password"],.l-2cr-fluid.l-d-9 .c-1 input[type="password"],.g-d-9 select,.l-2cr-fluid.l-d-9 .c-1 select,.g-d-9 textarea,.l-2cr-fluid.l-d-9 .c-1 textarea{width:100%}.g-d-8 input[type="text"],.l-2c .c-1 input[type="text"],.l-2cr .c-1 input[type="text"],.l-2cr-fluid.l-d-8 .c-1 input[type="text"],.g-d-8 input[type="email"],.l-2c .c-1 input[type="email"],.l-2cr .c-1 input[type="email"],.l-2cr-fluid.l-d-8 .c-1 input[type="email"],.g-d-8 input[type="password"],.l-2c .c-1 input[type="password"],.l-2cr .c-1 input[type="password"],.l-2cr-fluid.l-d-8 .c-1 input[type="password"],.g-d-8 select,.l-2c .c-1 select,.l-2cr .c-1 select,.l-2cr-fluid.l-d-8 .c-1 select,.g-d-8 textarea,.l-2c .c-1 textarea,.l-2cr .c-1 textarea,.l-2cr-fluid.l-d-8 .c-1 textarea{width:100%}.g-d-7 input[type="text"],.l-2cr-fluid.l-d-7 .c-1 input[type="text"],.g-d-7 input[type="email"],.l-2cr-fluid.l-d-7 .c-1 input[type="email"],.g-d-7 input[type="password"],.l-2cr-fluid.l-d-7 .c-1 input[type="password"],.g-d-7 select,.l-2cr-fluid.l-d-7 .c-1 select,.g-d-7 textarea,.l-2cr-fluid.l-d-7 .c-1 textarea{width:100%}.g-d-6 input[type="text"],.l-2cr-fluid.l-d-6 .c-1 input[type="text"],.g-d-6 input[type="email"],.l-2cr-fluid.l-d-6 .c-1 input[type="email"],.g-d-6 input[type="password"],.l-2cr-fluid.l-d-6 .c-1 input[type="password"],.g-d-6 select,.l-2cr-fluid.l-d-6 .c-1 select,.g-d-6 textarea,.l-2cr-fluid.l-d-6 .c-1 textarea{width:100%}.g-d-5 input[type="text"],.l-2cr-fluid.l-d-5 .c-1 input[type="text"],.g-d-5 input[type="email"],.l-2cr-fluid.l-d-5 .c-1 input[type="email"],.g-d-5 input[type="password"],.l-2cr-fluid.l-d-5 .c-1 input[type="password"],.g-d-5 select,.l-2cr-fluid.l-d-5 .c-1 select,.g-d-5 textarea,.l-2cr-fluid.l-d-5 .c-1 textarea{width:100%}.g-d-4 input[type="text"],.l-2cr-fluid.l-d-4 .c-1 input[type="text"],.g-d-4 input[type="email"],.l-2cr-fluid.l-d-4 .c-1 input[type="email"],.g-d-4 input[type="password"],.l-2cr-fluid.l-d-4 .c-1 input[type="password"],.g-d-4 select,.l-2cr-fluid.l-d-4 .c-1 select,.g-d-4 textarea,.l-2cr-fluid.l-d-4 .c-1 textarea{width:100%}.g-d-3 input[type="text"],.l-2cr-fluid.l-d-3 .c-1 input[type="text"],.g-d-3 input[type="email"],.l-2cr-fluid.l-d-3 .c-1 input[type="email"],.g-d-3 input[type="password"],.l-2cr-fluid.l-d-3 .c-1 input[type="password"],.g-d-3 select,.l-2cr-fluid.l-d-3 .c-1 select,.g-d-3 textarea,.l-2cr-fluid.l-d-3 .c-1 textarea{width:100%}.g-d-2 input[type="text"],.l-2cr-fluid.l-d-2 .c-1 input[type="text"],.g-d-2 input[type="email"],.l-2cr-fluid.l-d-2 .c-1 input[type="email"],.g-d-2 input[type="password"],.l-2cr-fluid.l-d-2 .c-1 input[type="password"],.g-d-2 select,.l-2cr-fluid.l-d-2 .c-1 select,.g-d-2 textarea,.l-2cr-fluid.l-d-2 .c-1 textarea{width:100%}.g-d-1 input[type="text"],.l-2cr-fluid.l-d-1 .c-1 input[type="text"],.g-d-1 input[type="email"],.l-2cr-fluid.l-d-1 .c-1 input[type="email"],.g-d-1 input[type="password"],.l-2cr-fluid.l-d-1 .c-1 input[type="password"],.g-d-1 select,.l-2cr-fluid.l-d-1 .c-1 select,.g-d-1 textarea,.l-2cr-fluid.l-d-1 .c-1 textarea{width:100%}.g-d-0 input[type="text"],.g-d-0 input[type="email"],.g-d-0 input[type="password"],.g-d-0 select,.g-d-0 textarea{width:100%}.l-show,.h-show,.hp-show,.hl-show,.t-show,.tp-show,.tl-show{display:none !important}.d-hide{display:none !important}.d-show{display:block !important}a.d-show,abbr.d-show,acronym.d-show,audio.d-show,b.d-show,basefont.d-show,bdo.d-show,big.d-show,br.d-show,canvas.d-show,cite.d-show,code.d-show,command.d-show,datalist.d-show,dfn.d-show,em.d-show,embed.d-show,font.d-show,i.d-show,img.d-show,input.d-show,keygen.d-show,kbd.d-show,label.d-show,mark.d-show,meter.d-show,output.d-show,progress.d-show,q.d-show,rp.d-show,rt.d-show,ruby.d-show,s.d-show,samp.d-show,select.d-show,small.d-show,span.d-show,strike.d-show,strong.d-show,sub.d-show,sup.d-show,textarea.d-show,time.d-show,tt.d-show,u.d-show,var.d-show,video.d-show,wbr.d-show{display:inline !important}.g-d-c,.g-all-c{*zoom:1}.g-d-c:after,.g-all-c:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.g-d-c-fluid,.l-2c-fluid:not(.grp-cell),.l-2cr-fluid{position:relative;float:none;clear:both;display:table;table-layout:fixed;width:100%;*zoom:1}.g-d-c-fluid:after,.l-2c-fluid:not(.grp-cell):after,.l-2cr-fluid:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.g-d-c-fluid>*[class^=g-d],.l-2c-fluid:not(.grp-cell)>*[class^=g-d],.l-2cr-fluid>*[class^=g-d]{position:relative;display:table-cell;float:none;vertical-align:top}body:not(.rtl) .g-d-c-fluid,body:not(.rtl) .l-2c-fluid:not(.grp-cell),body:not(.rtl) .l-2cr-fluid{margin-right:0 !important;padding-right:0 !important}body:not(.rtl) .g-d-c-fluid>*[class^=g-d],body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d],body:not(.rtl) .l-2cr-fluid>*[class^=g-d]{pmargin-right:0 !important;padding-right:20px}body:not(.rtl) .g-d-c-fluid>*[class^=g-d].g-d-l,body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-d-l,body:not(.rtl) .l-2cr-fluid>*[class^=g-d].g-d-l,body:not(.rtl) .g-d-c-fluid>*[class^=g-d].g-all-l,body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-l,body:not(.rtl) .l-2cr-fluid>*[class^=g-d].g-all-l,body:not(.rtl) .g-d-c-fluid>*[class^=g-d].g-all-fl,body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-fl,body:not(.rtl) .l-2cr-fluid>*[class^=g-d].g-all-fl,body:not(.rtl) .l-2c .g-d-c-fluid>*[class^=g-d].c-2,.l-2c body:not(.rtl) .g-d-c-fluid>*[class^=g-d].c-2,body:not(.rtl) .l-2c .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2c body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body:not(.rtl) .l-2c .l-2cr-fluid>*[class^=g-d].c-2,.l-2c body:not(.rtl) .l-2cr-fluid>*[class^=g-d].c-2,body:not(.rtl) .l-2cr .g-d-c-fluid>*[class^=g-d].c-2,.l-2cr body:not(.rtl) .g-d-c-fluid>*[class^=g-d].c-2,body:not(.rtl) .l-2cr .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2cr body:not(.rtl) .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body:not(.rtl) .l-2cr .l-2cr-fluid>*[class^=g-d].c-2,.l-2cr body:not(.rtl) .l-2cr-fluid>*[class^=g-d].c-2{padding-right:0}body.rtl .g-d-c-fluid,body.rtl .l-2c-fluid:not(.grp-cell),body.rtl .l-2cr-fluid{margin-left:0 !important;padding-left:0 !important}body.rtl .g-d-c-fluid>*[class^=g-d],body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d],body.rtl .l-2cr-fluid>*[class^=g-d]{margin-left:0 !important;padding-left:20px}body.rtl .g-d-c-fluid>*[class^=g-d].g-d-l,body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-d-l,body.rtl .l-2cr-fluid>*[class^=g-d].g-d-l,body.rtl .g-d-c-fluid>*[class^=g-d].g-all-l,body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-l,body.rtl .l-2cr-fluid>*[class^=g-d].g-all-l,body.rtl .g-d-c-fluid>*[class^=g-d].g-all-fl,body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].g-all-fl,body.rtl .l-2cr-fluid>*[class^=g-d].g-all-fl,body.rtl .l-2c .g-d-c-fluid>*[class^=g-d].c-2,.l-2c body.rtl .g-d-c-fluid>*[class^=g-d].c-2,body.rtl .l-2c .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2c body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body.rtl .l-2c .l-2cr-fluid>*[class^=g-d].c-2,.l-2c body.rtl .l-2cr-fluid>*[class^=g-d].c-2,body.rtl .l-2cr .g-d-c-fluid>*[class^=g-d].c-2,.l-2cr body.rtl .g-d-c-fluid>*[class^=g-d].c-2,body.rtl .l-2cr .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,.l-2cr body.rtl .l-2c-fluid:not(.grp-cell)>*[class^=g-d].c-2,body.rtl .l-2cr .l-2cr-fluid>*[class^=g-d].c-2,.l-2cr body.rtl .l-2cr-fluid>*[class^=g-d].c-2{padding-left:0}.g-base-c{*zoom:1}.g-base-c:after{content:"";display:table;clear:both}.g-base-c.g-centered{float:none;margin:0 auto}.l-2c-fluid:not(.grp-cell) .c-1{margin-right:0;padding-right:20px;vertical-align:top}.l-2c-fluid:not(.grp-cell) .c-2{float:none;display:table-cell;width:100%;vertical-align:top}.grp-row>.l-2c-fluid:not(.grp-cell) .c-2{padding-right:0}.l-2cr-fluid .c-1{float:right !important;display:table-cell;margin-right:0 !important;padding-right:0 !important;margin-left:0 !important;padding-left:20px !important;vertical-align:top}.l-2cr-fluid .c-2{float:right !important;display:table-cell;margin-right:0 !important;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;vertical-align:top}.grp-module .l-2c-fluid .c-2{padding-right:10px}.grp-module .l-2c-fluid.grp-cell .c-1{display:table-cell;vertical-align:top}.grp-module .l-2c-fluid.grp-cell .c-2{display:table-cell;float:none;padding-right:0;width:auto !important;vertical-align:top}.grp-module .l-2c-fluid.grp-cell .c-2 *{white-space:normal}
diff --git a/static/grappelli/stylesheets/mueller/screen.css b/static/grappelli/stylesheets/mueller/screen.css
new file mode 100644
index 0000000..e69de29
diff --git a/static/grappelli/stylesheets/partials/custom/tinymce.css b/static/grappelli/stylesheets/partials/custom/tinymce.css
new file mode 100644
index 0000000..ae0f5a4
--- /dev/null
+++ b/static/grappelli/stylesheets/partials/custom/tinymce.css
@@ -0,0 +1 @@
+.tabs{position:relative;float:left;clear:both;width:100%;font-size:11px;line-height:normal;background:transparent}.tabs ul{margin:0;padding:0;list-style:none}.tabs ul li{float:left;margin:0 4px 0 0;padding:2px 0 2px 12px;line-height:18px;border:1px solid #d4d4d4;border-bottom:none;-moz-border-radius-topleft:5px;-webkit-border-top-left-radius:5px;border-top-left-radius:5px;-moz-border-radius-topright:5px;-webkit-border-top-right-radius:5px;border-top-right-radius:5px;outline:0;background:#e0f0f5}.tabs ul li span{float:left;display:block;padding:0 10px 0 0;outline:0}.tabs ul li a{font-weight:bold;color:#666}.tabs ul li a:hover{color:#444}.tabs ul li.current{border-color:#c4c4c4;background:#ddd}.tabs ul li.current a{color:#444}.panel_wrapper{position:relative;float:none;clear:both}.panel_wrapper div.panel{display:none;position:relative;float:none;clear:both;padding-top:0}.panel_wrapper div.current{display:block;width:100%;height:auto !important;overflow:visible;padding-top:0}.tabs+.panel_wrapper{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0}.panel_wrapper>div>.grp-module:first-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0}h1,h2,h3,h4{color:#666;margin:0;padding:0;padding-top:5px}h3{font-size:14px}.title{margin-bottom:5px;font-size:12px;font-weight:bold;color:#666}p.helptext{margin:-5px 0 5px}#link .panel_wrapper,#link div.current{height:125px}#image .panel_wrapper,#image div.current{height:200px}#plugintable thead{font-weight:bold;background:#DDD}#plugintable,#about #plugintable td{border:1px solid #919B9C}#plugintable{width:96%;margin-top:10px}#pluginscontainer{height:290px;overflow:auto}#colorpicker #preview{float:right;width:50px;height:14px;line-height:1px;border:1px solid black;margin-left:5px}#colorpicker #colors{float:left;border:1px solid gray;cursor:crosshair}#colorpicker #light{border:1px solid gray;margin-left:5px;float:left;width:15px;height:150px;cursor:crosshair}#colorpicker #light div{overflow:hidden}#colorpicker #previewblock{float:right;padding-left:10px;height:20px}#colorpicker .panel_wrapper div.current{height:175px}#colorpicker #namedcolors{width:150px}#colorpicker #namedcolors a{display:block;float:left;width:10px;height:10px;margin:1px 1px 0 0;overflow:hidden}#colorpicker #colornamecontainer{margin-top:5px}#link .panel_wrapper,#link div.current{height:125px}#image .panel_wrapper,#image div.current{height:190px}legend{margin:20px 0 0;font-size:15px;font-weight:bold;color:#2B6FB6;display:none}legend+.grp-row{border-top:none !important}.required{font-weight:bold}label.msg{display:none}label.invalid{color:#EE0000;display:inline}input.invalid{border:1px solid #EE0000}label.additional{position:relative;display:inline;float:none;top:1px}.description label{margin:0 0 12px !important;padding:0 !important}#constrainlabel{display:inline;float:none;position:relative;top:1px !important}input[type=text],input[type=password],select{width:100% !important}input#src,input#href{width:100% !important;padding-right:28px}input.size,input.number{margin-right:1px;width:50px !important}input#width,input#height{text-align:center;vertical-align:middle;width:50px}input.radio{position:relative;margin:0 5px 13px 0}input.checkbox{position:relative;margin:0 5px 13px 0 !important}.c-2{vertical-align:baseline !important}.c-2>input[type=radio]:first-child,.c-2>input[type=checkbox]:first-child{top:5px !important}.c-2>input[type=radio]:first-child+label,.c-2>input[type=checkbox]:first-child+label{top:4px}.c-2>input[type=radio]:first-child+label+input[type=radio],.c-2>input[type=radio]:first-child+label+input[type=checkbox],.c-2>input[type=checkbox]:first-child+label+input[type=radio],.c-2>input[type=checkbox]:first-child+label+input[type=checkbox]{top:5px;margin-left:30px}.c-2>input[type=radio]:first-child+label+input[type=radio]+label,.c-2>input[type=radio]:first-child+label+input[type=checkbox]+label,.c-2>input[type=checkbox]:first-child+label+input[type=radio]+label,.c-2>input[type=checkbox]:first-child+label+input[type=checkbox]+label{top:4px}input.radio.additional,input.checkbox.additional{margin-left:10px !important}input#constrain{position:relative;margin:0 5px 0 0 !important}input+input#constrain{margin-left:32px !important}p.constrain{padding:5px 0 0 !important}.input_noborder{border:0}#textareaContainer,#iframecontainer{margin-bottom:5px;width:100% !important;border:1px solid #d4d4d4;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}#textareaContainer{border:0}#iframecontainer{padding:2px 0}textarea#htmlSource{width:100% !important;height:100%;color:#444;font-family:'Courier New',Courier,monospace;font-size:12px;font-weight:normal}#iframecontainer iframe{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}input[name="href"]+div{position:absolute;top:0;right:0;display:inline-block}input[name="href"]+div a span{display:none}input[name="src"]+div{position:absolute;top:0;right:0;display:inline-block}input[name="src"]+div a span{display:none}.wordWrapCode{vertical-align:middle;border:1px none #000;background:transparent}.mceActionPanel{margin-top:5px}#charmap table{border:0}#charmap table td{padding:0 !important}#charmap table td.title,#charmap table td#charmapView{border:0 !important}#charmap table td.title>table,#charmap table td#charmapView>table{border-collapse:collapse}#charmap table tbody td{border-bottom:0}#charmap table td#charmapView{border:0 !important}#charmap table a{top:0 !important;display:block;padding:0;width:100%;height:100%;color:#444;font-size:12px;line-height:18px;text-decoration:none;border:none}#charmap table a:hover{color:#444;background:#e0f0f5;outline:1px solid #444 !important}#charmap table td#charmapView>table tr:first-child td.charmap:first-child a{-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px}#charmap table td#charmapView>table tr:first-child td.charmap:last-child a{-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px}#charmap table td#charmapView>table tr:last-child td.charmap:first-child a{-moz-border-radius-bottomleft:4px;-webkit-border-bottom-left-radius:4px;border-bottom-left-radius:4px}#charmap table td#charmapView>table tr:last-child td.charmap:last-child a{-moz-border-radius-bottomright:4px;-webkit-border-bottom-right-radius:4px;border-bottom-right-radius:4px}#charmap table>table tr:last-child table td{border:0 !important}#charmapgroup{margin-right:10px}#charmapgroup table{border:1px solid #d4d4d4 !important;border-collapse:collapse;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:#fff}#charmapgroup table tr{height:18px !important}#charmapgroup table tr td.charmap{padding:0 !important;width:18px;height:18px;text-align:center;vertical-align:middle;border-left:1px solid #d4d4d4;border-bottom:1px solid #d4d4d4;cursor:pointer !important;outline:0 !important}#charmapgroup table tr td.charmap a:focus{color:#444;background:#eee;outline:1px solid #999}#charmapgroup table tr td.charmap a:focus:hover{background:#e0f0f5;outline:1px solid #444 !important}#charmapgroup table tr:first-child td.charmap{border-top:none}#charmapgroup table tr td.charmap:first-child{border-left:none}#charmapgroup table tr:last-child td.charmap{border-bottom:none}.selected-character{position:relative;float:left;margin-left:20px;width:80px}#codeV{height:80px;margin-bottom:5px;text-align:center;font-size:40px;line-height:80px !important;border:1px solid #d4d4d4 !important;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:#e0f0f5;color:#444}#codeN{font-size:10px;line-height:11px;font-family:Arial,Helvetica,sans-serif;text-align:center;color:#444}.legend{position:absolute;float:left;bottom:18px;margin-left:20px;padding:5px;width:70px;border:1px solid #d4d4d4;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.legend span{color:#aaa;font-size:10px}#codeA,#codeB{color:#444}#codeA{margin-bottom:5px}
diff --git a/static/grappelli/stylesheets/rtl.css b/static/grappelli/stylesheets/rtl.css
new file mode 100644
index 0000000..1b3560b
--- /dev/null
+++ b/static/grappelli/stylesheets/rtl.css
@@ -0,0 +1 @@
+.grp-font-family{font-family:Arial,sans-serif}.grp-font-color{color:#444}.grp-font-color-quiet{color:#888}.grp-font-color-error{color:#bf3030}.grp-border-radius{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.grp-border-radius-s{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}.grp-form-field-border-radius{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.grp-form-button-border-radius{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.grp-margin-xl{margin:30px !important}.grp-margin-l{margin:20px !important}.grp-margin-m{margin:15px !important}.grp-margin{margin:10px !important}.grp-margin-s{margin:5px !important}.grp-margin-xs{margin:2px !important}.grp-margin-top-xl{margin-top:30px !important}.grp-margin-top-l{margin-top:20px !important}.grp-margin-top-m{margin-top:15px !important}.grp-margin-top{margin-top:10px !important}.grp-margin-top-s{margin-top:5px !important}.grp-margin-top-xs{margin-top:2px !important}.grp-margin-bottom-xl{margin-bottom:30px !important}.grp-margin-bottom-l{margin-bottom:20px !important}.grp-margin-bottom-m{margin-bottom:15px !important}.grp-margin-bottom{margin-bottom:10px !important}.grp-margin-bottom-s{margin-bottom:5px !important}.grp-margin-bottom-xs{margin-bottom:2px !important}.grp-margin-left-xl{margin-left:30px !important}.grp-margin-left-l{margin-left:20px !important}.grp-margin-left-m{margin-left:15px !important}.grp-margin-left{margin-left:10px !important}.grp-margin-left-s{margin-left:5px !important}.grp-margin-left-xs{margin-left:2px !important}.grp-margin-right-xl{margin-right:30px !important}.grp-margin-right-l{margin-right:20px !important}.grp-margin-right-m{margin-right:15px !important}.grp-margin-right{margin-right:10px !important}.grp-margin-right-s{margin-right:5px !important}.grp-margin-right-xs{margin-right:2px !important}.grp-margin-vertical-xl{margin-top:30px !important;margin-bottom:30px !important}.grp-margin-vertical-l{margin-top:20px !important;margin-bottom:20px !important}.grp-margin-vertical-m{margin-top:15px !important;margin-bottom:15px !important}.grp-margin-vertical{margin-top:10px !important;margin-bottom:10px !important}.grp-margin-vertical-s{margin-top:5px !important;margin-bottom:5px !important}.grp-margin-vertical-xs{margin-top:2px !important;margin-bottom:2px !important}.grp-margin-horizontal-xl{margin-left:30px !important;margin-right:30px !important}.grp-margin-horizontal-l{margin-left:20px !important;margin-right:20px !important}.grp-margin-horizontal-m{margin-left:15px !important;margin-right:15px !important}.grp-margin-horizontal{margin-left:10px !important;margin-right:10px !important}.grp-margin-horizontal-s{margin-left:5px !important;margin-right:5px !important}.grp-margin-horizontal-xs{margin-left:2px !important;margin-right:2px !important}.grp-no-margin{margin:0 !important}.grp-no-margin-top{margin-top:0 !important}.grp-no-margin-right{margin-right:0 !important}.grp-no-margin-bottom{margin-bottom:0 !important}.grp-no-margin-left{margin-left:0 !important}.grp-padding-xl{padding:30px !important}.grp-padding-l{padding:20px !important}.grp-padding-m{padding:15px !important}.grp-padding{padding:10px !important}.grp-padding-s{padding:5px !important}.grp-padding-xs{padding:2px !important}.grp-padding-top-xl{padding-top:30px !important}.grp-padding-top-l{padding-top:20px !important}.grp-padding-top-m{padding-top:15px !important}.grp-padding-top{padding-top:10px !important}.grp-padding-top-s{padding-top:5px !important}.grp-padding-top-xs{padding-top:2px !important}.grp-padding-bottom-xl{padding-bottom:30px !important}.grp-padding-bottom-l{padding-bottom:20px !important}.grp-padding-bottom-m{padding-bottom:15px !important}.grp-padding-bottom{padding-bottom:10px !important}.grp-padding-bottom-s{padding-bottom:5px !important}.grp-padding-bottom-xs{padding-bottom:2px !important}.grp-padding-left-xl{padding-left:30px !important}.grp-padding-left-l{padding-left:20px !important}.grp-padding-left-m{padding-left:15px !important}.grp-padding-left{padding-left:10px !important}.grp-padding-left-s{padding-left:5px !important}.grp-padding-left-xs{padding-left:2px !important}.grp-padding-right-xl{padding-right:30px !important}.grp-padding-right-l{padding-right:20px !important}.grp-padding-right-m{padding-right:15px !important}.grp-padding-right{padding-right:10px !important}.grp-padding-right-s{padding-right:5px !important}.grp-padding-right-xs{padding-right:2px !important}.grp-padding-vertical-xl{padding-top:30px !important;padding-bottom:30px !important}.grp-padding-vertical-l{padding-top:20px !important;padding-bottom:20px !important}.grp-padding-vertical-m{padding-top:15px !important;padding-bottom:15px !important}.grp-padding-vertical{padding-top:10px !important;padding-bottom:10px !important}.grp-padding-vertical-s{padding-top:5px !important;padding-bottom:5px !important}.grp-padding-vertical-xs{padding-top:2px !important;padding-bottom:2px !important}.grp-padding-horizontal-xl{padding-left:30px !important;padding-right:30px !important}.grp-padding-horizontal-l{padding-left:20px !important;padding-right:20px !important}.grp-padding-horizontal-m{padding-left:15px !important;padding-right:15px !important}.grp-padding-horizontal{padding-left:10px !important;padding-right:10px !important}.grp-padding-horizontal-s{padding-left:5px !important;padding-right:5px !important}.grp-padding-horizontal-xs{padding-left:2px !important;padding-right:2px !important}.grp-no-padding{padding:0 !important}.grp-no-padding-top{padding-top:0 !important}.grp-no-padding-right{padding-right:0 !important}.grp-no-padding-bottom{padding-bottom:0 !important}.grp-no-padding-left{padding-left:0 !important}.icons-sprite,.icons-add-another,.icons-back-link,.icons-breadcrumbs-rtl,.icons-breadcrumbs,.icons-date-hierarchy-back-rtl,.icons-date-hierarchy-back,.icons-datepicker,.icons-datetime-now,.icons-form-select,.icons-object-tools-add-link,.icons-object-tools-viewsite-link,.icons-pulldown-handler,.icons-pulldown-handler_selected,.icons-related-lookup-m2m,.icons-related-lookup,.icons-related-remove,.icons-searchbox,.icons-selector-add-m2m-horizontal,.icons-selector-add-m2m-vertical,.icons-selector-filter,.icons-selector-remove-m2m-horizontal,.icons-selector-remove-m2m-vertical,.icons-sort-remove,.icons-sorted-ascending,.icons-sorted-descending,.icons-status-no,.icons-status-unknown,.icons-status-yes,.icons-th-ascending,.icons-th-descending,.icons-timepicker,.icons-tools-add-handler,.icons-tools-arrow-down-handler,.icons-tools-arrow-up-handler,.icons-tools-close-handler,.icons-tools-delete-handler-predelete,.icons-tools-delete-handler,.icons-tools-drag-handler,.icons-tools-open-handler,.icons-tools-remove-handler,.icons-tools-trash-handler,.icons-tools-trash-list-toggle-handler,.icons-tools-viewsite-link,.icons-ui-datepicker-next,.icons-ui-datepicker-prev,body.rtl #grp-breadcrumbs>ul a,body.rtl .grp-date-hierarchy ul li a.grp-date-hierarchy-back,body.rtl .grp-pulldown-container .grp-pulldown-handler,body.rtl .grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler{background-image:url('../images/icons-s846f870921.png');background-repeat:no-repeat}.icons-add-another{background-position:0 0}.icons-add-another:hover,.icons-add-another.add-another-hover{background-position:0 -44px}.icons-back-link{background-position:0 -88px}.icons-back-link:hover,.icons-back-link.back-link-hover{background-position:0 -131px}.icons-breadcrumbs-rtl{background-position:0 -174px}.icons-breadcrumbs-rtl:hover,.icons-breadcrumbs-rtl.breadcrumbs-rtl-hover{background-position:0 -218px}.icons-breadcrumbs{background-position:0 -262px}.icons-breadcrumbs:hover,.icons-breadcrumbs.breadcrumbs-hover{background-position:0 -306px}.icons-date-hierarchy-back-rtl{background-position:0 -350px}.icons-date-hierarchy-back-rtl:hover,.icons-date-hierarchy-back-rtl.date-hierarchy-back-rtl-hover{background-position:0 -393px}.icons-date-hierarchy-back{background-position:0 -436px}.icons-date-hierarchy-back:hover,.icons-date-hierarchy-back.date-hierarchy-back-hover{background-position:0 -479px}.icons-datepicker{background-position:0 -522px}.icons-datepicker:hover,.icons-datepicker.datepicker-hover{background-position:0 -565px}.icons-datetime-now{background-position:0 -608px}.icons-datetime-now:hover,.icons-datetime-now.datetime-now-hover{background-position:0 -651px}.icons-form-select{background-position:0 -694px}.icons-object-tools-add-link{background-position:0 -731px}.icons-object-tools-viewsite-link{background-position:0 -775px}.icons-pulldown-handler{background-position:0 -819px}.icons-pulldown-handler:hover,.icons-pulldown-handler.pulldown-handler-hover{background-position:0 -863px}.icons-pulldown-handler_selected{background-position:0 -907px}.icons-related-lookup-m2m{background-position:0 -951px}.icons-related-lookup-m2m:hover,.icons-related-lookup-m2m.related-lookup-m2m-hover{background-position:0 -994px}.icons-related-lookup{background-position:0 -1037px}.icons-related-lookup:hover,.icons-related-lookup.related-lookup-hover{background-position:0 -1080px}.icons-related-remove{background-position:0 -1123px}.icons-related-remove:hover,.icons-related-remove.related-remove-hover{background-position:0 -1166px}.icons-searchbox{background-position:0 -1209px}.icons-selector-add-m2m-horizontal{background-position:0 -1244px}.icons-selector-add-m2m-horizontal:hover,.icons-selector-add-m2m-horizontal.selector-add-m2m-horizontal-hover{background-position:0 -1276px}.icons-selector-add-m2m-vertical{background-position:0 -1308px}.icons-selector-add-m2m-vertical:hover,.icons-selector-add-m2m-vertical.selector-add-m2m-vertical-hover{background-position:0 -1341px}.icons-selector-filter{background-position:0 -1374px}.icons-selector-remove-m2m-horizontal{background-position:0 -1406px}.icons-selector-remove-m2m-horizontal:hover,.icons-selector-remove-m2m-horizontal.selector-remove-m2m-horizontal-hover{background-position:0 -1438px}.icons-selector-remove-m2m-vertical{background-position:0 -1470px}.icons-selector-remove-m2m-vertical:hover,.icons-selector-remove-m2m-vertical.selector-remove-m2m-vertical-hover{background-position:0 -1503px}.icons-sort-remove{background-position:0 -1536px}.icons-sort-remove:hover,.icons-sort-remove.sort-remove-hover{background-position:0 -1579px}.icons-sorted-ascending{background-position:0 -1622px}.icons-sorted-descending{background-position:0 -1665px}.icons-status-no{background-position:0 -1708px}.icons-status-unknown{background-position:0 -1743px}.icons-status-yes{background-position:0 -1778px}.icons-th-ascending{background-position:0 -1813px}.icons-th-descending{background-position:0 -1839px}.icons-timepicker{background-position:0 -1865px}.icons-timepicker:hover,.icons-timepicker.timepicker-hover{background-position:0 -1908px}.icons-tools-add-handler{background-position:0 -1951px}.icons-tools-add-handler:hover,.icons-tools-add-handler.tools-add-handler-hover{background-position:0 -1995px}.icons-tools-arrow-down-handler{background-position:0 -2039px}.icons-tools-arrow-down-handler:hover,.icons-tools-arrow-down-handler.tools-arrow-down-handler-hover{background-position:0 -2083px}.icons-tools-arrow-up-handler{background-position:0 -2127px}.icons-tools-arrow-up-handler:hover,.icons-tools-arrow-up-handler.tools-arrow-up-handler-hover{background-position:0 -2171px}.icons-tools-close-handler{background-position:0 -2215px}.icons-tools-close-handler:hover,.icons-tools-close-handler.tools-close-handler-hover{background-position:0 -2259px}.icons-tools-delete-handler-predelete{background-position:0 -2303px}.icons-tools-delete-handler{background-position:0 -2347px}.icons-tools-delete-handler:hover,.icons-tools-delete-handler.tools-delete-handler-hover{background-position:0 -2391px}.icons-tools-drag-handler{background-position:0 -2435px}.icons-tools-drag-handler:hover,.icons-tools-drag-handler.tools-drag-handler-hover{background-position:0 -2479px}.icons-tools-open-handler{background-position:0 -2523px}.icons-tools-open-handler:hover,.icons-tools-open-handler.tools-open-handler-hover{background-position:0 -2567px}.icons-tools-remove-handler{background-position:0 -2611px}.icons-tools-remove-handler:hover,.icons-tools-remove-handler.tools-remove-handler-hover{background-position:0 -2655px}.icons-tools-trash-handler{background-position:0 -2699px}.icons-tools-trash-handler:hover,.icons-tools-trash-handler.tools-trash-handler-hover{background-position:0 -2743px}.icons-tools-trash-list-toggle-handler{background-position:0 -2787px}.icons-tools-trash-list-toggle-handler:hover,.icons-tools-trash-list-toggle-handler.tools-trash-list-toggle-handler-hover{background-position:0 -2831px}.icons-tools-viewsite-link{background-position:0 -2875px}.icons-tools-viewsite-link:hover,.icons-tools-viewsite-link.tools-viewsite-link-hover{background-position:0 -2919px}.icons-ui-datepicker-next{background-position:0 -2963px}.icons-ui-datepicker-next:hover,.icons-ui-datepicker-next.ui-datepicker-next-hover{background-position:0 -3006px}.icons-ui-datepicker-prev{background-position:0 -3049px}.icons-ui-datepicker-prev:hover,.icons-ui-datepicker-prev.ui-datepicker-prev-hover{background-position:0 -3092px}.icons-small-sprite,.icons-small-add-link,.icons-small-change-link,.icons-small-delete-link,.icons-small-filter-choice-selected,.icons-small-link-external,.icons-small-link-internal,.icons-small-sort-remove,body.rtl .grp-actions li.grp-add-link a,body.rtl .grp-actions li.grp-change-link a,body.rtl .grp-actions li.grp-delete-link a,body.rtl .grp-actions li.grp-delete-link>span:first-child,body.rtl .grp-listing li.grp-add-link a,body.rtl .grp-listing-small li.grp-add-link a,body.rtl .grp-listing li.grp-change-link a,body.rtl .grp-listing-small li.grp-change-link a,body.rtl .grp-listing li.grp-delete-link a,body.rtl .grp-listing li.grp-delete-link>span:first-child,body.rtl .grp-listing-small li.grp-delete-link a,body.rtl .grp-listing-small li.grp-delete-link>span:first-child,body.rtl .grp-filter .grp-row.grp-selected a{background-image:url('../images/icons-small-scbbb475e49.png');background-repeat:no-repeat}.icons-small-add-link{background-position:0 0}.icons-small-add-link:hover,.icons-small-add-link.add-link-hover{background-position:0 -417px}.icons-small-change-link{background-position:0 -834px}.icons-small-change-link:hover,.icons-small-change-link.change-link-hover{background-position:0 -1251px}.icons-small-delete-link{background-position:0 -1668px}.icons-small-filter-choice-selected{background-position:0 -2085px}.icons-small-link-external{background-position:0 -2502px}.icons-small-link-external:hover,.icons-small-link-external.link-external-hover{background-position:0 -2919px}.icons-small-link-internal{background-position:0 -3336px}.icons-small-link-internal:hover,.icons-small-link-internal.link-internal-hover{background-position:0 -3753px}.icons-small-sort-remove{background-position:0 -4170px}body.rtl header#grp-header #grp-navigation h1#grp-admin-title{float:right}body.rtl header#grp-header #grp-navigation ul#grp-user-tools{float:left;margin:0 0 0 -10px;border-right:1px solid #343434;border-left:0 !important}body.rtl header#grp-header #grp-navigation ul#grp-user-tools li:last-child{border-right:1px solid #090909;border-left:0}body.rtl header#grp-header #grp-navigation ul#grp-user-tools li.grp-user-options-container:last-child{margin-right:0;margin-left:11px}body.rtl header#grp-header #grp-navigation ul li.grp-collapse.grp-open>ul{position:absolute;z-index:1010;display:block;margin:-1px -1px 0 0;width:202px}body.rtl header#grp-header #grp-navigation ul li.grp-collapse.grp-open>ul li{border-right:0 !important}body.rtl #grp-page-tools{float:left;right:0;margin-left:-10px}body.rtl #grp-page-tools li{float:right}body.rtl #grp-page-tools li:first-child{padding-right:5px;padding-left:0}body.rtl #grp-page-tools li:last-child{padding-left:5px;padding-right:0}body.rtl #grp-breadcrumbs{float:right}body.rtl #grp-breadcrumbs>ul{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;padding:5px 20px}body.rtl #grp-breadcrumbs>ul li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:right;padding-left:5px;padding-right:5px}body.rtl #grp-breadcrumbs>ul li:first-child{padding-right:0}body.rtl #grp-breadcrumbs>ul li:last-child{padding-left:0}body.rtl #grp-breadcrumbs>ul li.last{padding-left:0}body.rtl #grp-breadcrumbs>ul a{padding-right:0;padding-left:15px;background-position:0 -174px}body.rtl #grp-breadcrumbs>ul a:hover,body.rtl #grp-breadcrumbs>ul a.breadcrumbs-rtl-hover{background-position:0 -218px}body.rtl .grp-submit-row>ul>li{float:left;margin-left:0;margin-right:10px}body.rtl .grp-submit-row>ul>li.grp-float-left{float:right !important;margin-left:10px;margin-right:0}body.rtl ul.grp-object-tools{float:left}body.rtl ul.grp-object-tools li{float:right;padding-right:5px;padding-left:5px}body.rtl ul.grp-object-tools li:first-child{padding-right:0}body.rtl ul.grp-object-tools li:last-child{padding-left:0}body.rtl ul.grp-object-tools li a.grp-add-link{padding-right:28px;padding-left:15px;background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk5OTk5OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4ODg4OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #999999),color-stop(100%, #888888));background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,-moz-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,-webkit-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,linear-gradient(#999999,#888888)}body.rtl ul.grp-object-tools li a.grp-add-link:hover{background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzM2YjBkOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #36b0d9),color-stop(100%, #309bbf));background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,-moz-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,-webkit-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 95% -731px no-repeat,linear-gradient(#36b0d9,#309bbf)}body.rtl ul.grp-object-tools li a.grp-viewsite-link,body.rtl ul.grp-object-tools li a[target="_blank"]{padding-right:28px;padding-left:15px;background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk5OTk5OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4ODg4OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #999999),color-stop(100%, #888888));background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,-moz-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,-webkit-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,linear-gradient(#999999,#888888)}body.rtl ul.grp-object-tools li a.grp-viewsite-link:hover,body.rtl ul.grp-object-tools li a[target="_blank"]:hover{background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzM2YjBkOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #36b0d9),color-stop(100%, #309bbf));background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,-moz-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,-webkit-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 95% -775px no-repeat,linear-gradient(#36b0d9,#309bbf)}body.rtl .grp-tools{float:left;padding-left:5px}body.rtl .grp-tools li{float:right;padding-right:1px;padding-left:1px}body.rtl .grp-tools li:first-child{padding-right:0}body.rtl .grp-tools li:last-child{padding-left:0}body.rtl .grp-tools-container .grp-tools{right:0}body.rtl .grp-module .grp-row>.grp-tools{right:0;margin-left:-9px}body.rtl .grp-group>h2+.grp-tools{right:0;margin-left:1px}body.rtl input[type="button"],body.rtl button,body.rtl a.fb_show,body.rtl a.related-lookup,body.rtl body.tinyMCE input[name="src"]+div a,body.rtl body.tinyMCE input[name="href"]+div a{margin-left:0;margin-right:-25px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px}body.rtl p.datetime{white-space:nowrap;position:relative;display:inline-block}body.rtl p.datetime input.vTimeField{margin-left:0;margin-right:6px}body.rtl div.grp-readonly+div.grp-readonly{margin-left:0;margin-right:20px}body.rtl a.related-lookup+strong{margin-left:0;margin-right:5px}body.rtl .grp-placeholder-related-fk,body.rtl .grp-placeholder-related-m2m,body.rtl .grp-placeholder-related-generic{margin-left:0;margin-right:123px}body.rtl .grp-placeholder-related-fk .grp-separator:after,body.rtl .grp-placeholder-related-m2m .grp-separator:after,body.rtl .grp-placeholder-related-generic .grp-separator:after{content:" ,"}body.rtl a.add-another{margin-left:0;margin-right:7px}body.rtl .grp-td a.add-another{float:left;margin-left:-10px;margin-right:7px}body.rtl .radiolist.inline+a.add-another,body.rtl .checkboxlist.inline+a.add-another{float:none;margin-left:-10px;margin-right:0}body.rtl .grp-actions{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;float:left}body.rtl .grp-actions li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:right;padding-left:5px;padding-right:5px}body.rtl .grp-actions li:first-child{padding-right:0}body.rtl .grp-actions li:last-child{padding-left:0}body.rtl .grp-actions li.last{padding-left:0}body.rtl .grp-actions li.grp-add-link a,body.rtl .grp-actions li.grp-add-link>span:first-child,body.rtl .grp-actions li.grp-change-link a,body.rtl .grp-actions li.grp-change-link>span:first-child,body.rtl .grp-actions li.grp-delete-link a,body.rtl .grp-actions li.grp-delete-link>span:first-child{padding-right:20px;padding-left:0}body.rtl .grp-actions li.grp-add-link a{background-position:100% 0}body.rtl .grp-actions li.grp-add-link a:hover,body.rtl .grp-actions li.grp-add-link a.add-link-hover{background-position:100% -417px}body.rtl .grp-actions li.grp-change-link a{background-position:100% -834px}body.rtl .grp-actions li.grp-change-link a:hover,body.rtl .grp-actions li.grp-change-link a.change-link-hover{background-position:100% -1251px}body.rtl .grp-actions li.grp-delete-link a,body.rtl .grp-actions li.grp-delete-link>span:first-child{background-position:100% -1668px}body.rtl .grp-listing li.grp-add-link,body.rtl .grp-listing li.grp-change-link,body.rtl .grp-listing li.grp-delete-link,body.rtl .grp-listing-small li.grp-add-link,body.rtl .grp-listing-small li.grp-change-link,body.rtl .grp-listing-small li.grp-delete-link{padding-right:25px;padding-left:0}body.rtl .grp-listing li.grp-add-link a,body.rtl .grp-listing li.grp-add-link>span:first-child,body.rtl .grp-listing li.grp-change-link a,body.rtl .grp-listing li.grp-change-link>span:first-child,body.rtl .grp-listing li.grp-delete-link a,body.rtl .grp-listing li.grp-delete-link>span:first-child,body.rtl .grp-listing-small li.grp-add-link a,body.rtl .grp-listing-small li.grp-add-link>span:first-child,body.rtl .grp-listing-small li.grp-change-link a,body.rtl .grp-listing-small li.grp-change-link>span:first-child,body.rtl .grp-listing-small li.grp-delete-link a,body.rtl .grp-listing-small li.grp-delete-link>span:first-child{margin-right:-20px;margin-left:0;padding-right:20px;padding-left:0}body.rtl .grp-listing li.grp-add-link a,body.rtl .grp-listing-small li.grp-add-link a{background-position:100% 0}body.rtl .grp-listing li.grp-add-link a:hover,body.rtl .grp-listing li.grp-add-link a.add-link-hover,body.rtl .grp-listing-small li.grp-add-link a:hover,body.rtl .grp-listing-small li.grp-add-link a.add-link-hover{background-position:100% -417px}body.rtl .grp-listing li.grp-change-link a,body.rtl .grp-listing-small li.grp-change-link a{background-position:100% -834px}body.rtl .grp-listing li.grp-change-link a:hover,body.rtl .grp-listing li.grp-change-link a.change-link-hover,body.rtl .grp-listing-small li.grp-change-link a:hover,body.rtl .grp-listing-small li.grp-change-link a.change-link-hover{background-position:100% -1251px}body.rtl .grp-listing li.grp-delete-link a,body.rtl .grp-listing li.grp-delete-link>span:first-child,body.rtl .grp-listing-small li.grp-delete-link a,body.rtl .grp-listing-small li.grp-delete-link>span:first-child{background-position:100% -1668px}body.rtl .grp-module .grp-row:not(tr){float:right}body.rtl .grp-module .grp-row:not(tr).grp-cells .grp-cell{display:table-cell;vertical-align:top;position:relative;padding:8px 0 8px 20px;border-left:1px solid #fff;border-right:0}body.rtl .grp-module .grp-row:not(tr).grp-cells .grp-cell+.grp-cell{padding-left:20px;padding-right:0;border-right:1px solid #ddd;border-left:0}body.rtl .grp-module .grp-row:not(tr).grp-cells .grp-cell:last-of-type{padding-left:0;padding-right:20px;border-left:0 !important;border-right:1px solid #ddd !important}body.rtl .grp-tabular .grp-table .grp-th,body.rtl .grp-tabular .grp-table .grp-td{margin-right:0;border-left:1px solid #fff;border-right:1px solid #e0e0e0}body.rtl .grp-tabular .grp-table .grp-th:first-of-type,body.rtl .grp-tabular .grp-table .grp-td:first-of-type{padding-left:20px;padding-right:10px}body.rtl .grp-tabular .grp-table .grp-th:last-child,body.rtl .grp-tabular .grp-table .grp-td:last-child{padding-left:10px}body.rtl .grp-tabular .grp-table .grp-thead .grp-th,body.rtl .grp-tabular .grp-table .grp-thead .grp-td{background:none;border-top:0}body.rtl .grp-tabular .grp-table .grp-tbody .grp-th,body.rtl .grp-tabular .grp-table .grp-tbody .grp-td{border-bottom:1px solid #d4d4d4;border-top:1px solid #d4d4d4}body.rtl .grp-tabular .grp-table .grp-tbody .grp-th:last-of-type,body.rtl .grp-tabular .grp-table .grp-tbody .grp-td:last-of-type{border-left:1px solid #d4d4d4}body.rtl .grp-tabular .grp-table .grp-tbody .grp-th:last-child,body.rtl .grp-tabular .grp-table .grp-tbody .grp-td:last-child{-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}body.rtl .grp-tabular .grp-table .grp-tbody .grp-th:first-of-type,body.rtl .grp-tabular .grp-table .grp-tbody .grp-td:first-of-type{border-left:1px solid #fff;border-right:1px solid #d4d4d4;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}body.rtl .grp-tabular .grp-table .grp-tbody .grp-th.grp-tools-container,body.rtl .grp-tabular .grp-table .grp-tbody .grp-td.grp-tools-container{padding-left:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-bottomleft:2px;-webkit-border-bottom-left-radius:2px;border-bottom-left-radius:2px}body.rtl .grp-tabular .grp-table .grp-tfoot .grp-td:last-of-type{border-right:0}body.rtl table thead th{border-right:1px solid #ccc;border-left:0}body.rtl table thead th:first-child{border-right:0}body.rtl table thead th:first-of-type{-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0}body.rtl table thead th:last-of-type{-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}body.rtl table tbody tr td,body.rtl table tbody tr th{border-right:1px solid #e4e4e4}body.rtl table tbody tr td:first-child,body.rtl table tbody tr th:first-child{border-right:0 !important}body.rtl table tbody tr.grp-row-even td,body.rtl table tbody tr.grp-row-even th,body.rtl table tbody tr.grp-row-odd td,body.rtl table tbody tr.grp-row-odd th{border-left:0;border-right:1px solid #e0e0e0}body.rtl table tbody tr:last-child td:first-child,body.rtl table tbody tr:last-child th:first-child{-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px;-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}body.rtl table tbody tr:last-child td:last-child,body.rtl table tbody tr:last-child th:last-child{-moz-border-radius-bottomleft:2px;-webkit-border-bottom-left-radius:2px;border-bottom-left-radius:2px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}body.rtl table tfoot td:first-child{border-right:0}body.rtl table td a.fb_show,body.rtl table td a.related-lookup,body.rtl table th a.fb_show,body.rtl table th a.related-lookup{margin:-5px -25px -11px 0}body.rtl table.grp-sortable thead th.sortable .grp-sortoptions{float:left;clear:left;margin:0 0 0 5px}body.rtl table.grp-sortable thead th.sortable .grp-sortoptions a{float:left}body.rtl table.grp-sortable thead th.sortable .grp-sortoptions span.grp-sortpriority{float:left}body.rtl table.grp-sortable thead th.sortable.sorted .grp-text a{padding-right:10px;padding-left:60px}body.rtl .grp-pagination ul{float:right}body.rtl .grp-pagination ul li{float:right;margin-left:1px;margin-right:0}body.rtl .grp-pagination ul li.grp-results{margin-left:4px;margin-right:0}body.rtl .grp-pagination ul li:last-child{clear:left}body.rtl .grp-date-hierarchy ul{float:right}body.rtl .grp-date-hierarchy ul li{float:right}body.rtl .grp-date-hierarchy ul li a.grp-date-hierarchy-back{padding-right:10px;padding-left:5px;background-position:100% -350px}body.rtl .grp-date-hierarchy ul li a.grp-date-hierarchy-back:hover,body.rtl .grp-date-hierarchy ul li a.grp-date-hierarchy-back.date-hierarchy-back-rtl-hover{background-position:100% -393px}body.rtl input[type="text"].grp-search-field{margin-left:-5px;margin-right:0;padding-left:30px;padding-right:10px}body.rtl .grp-pulldown-container .grp-pulldown-handler{background-position:0 -819px}body.rtl .grp-pulldown-container .grp-pulldown-handler:hover,body.rtl .grp-pulldown-container .grp-pulldown-handler.pulldown-handler-hover{background-position:0 -863px}body.rtl .grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler{background-position:0 -907px;background-color:#e1f0f5}body.rtl .grp-filter{*zoom:1}body.rtl .grp-filter .grp-row.grp-selected a{padding-right:17px;padding-left:10px;color:#444;background-position:100% -2085px}body.rtl .grp-filter:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}body.rtl li.grp-changelist-actions select{float:right;margin:1px 0 0 5px}body.rtl li.grp-changelist-actions li{margin-left:4px;margin-right:0;float:right !important}body.rtl li.grp-changelist-actions li:first-child{padding-right:0}body.rtl li.grp-changelist-actions li:last-child{padding-left:0}body.rtl .grp-row input[type="checkbox"]+label,body.rtl .grp-row input[type="radio"]+label{margin:0 5px 0 0}body.rtl select{padding:4px 2px 4px 3px}@media screen and (-webkit-min-device-pixel-ratio: 0){body.rtl select,body.rtl select:focus{padding:4px 5px 4px 28px;-webkit-appearance:textfield;background-image:url("../images/icons/form-select.png");background-position:0 50%;background-repeat:no-repeat}body.rtl select[multiple=multiple]{background-image:none}}body.rtl ul.radiolist.inline,body.rtl ul.checkboxlist.inline{float:right;padding-left:20px;padding-right:0}body.rtl ul.radiolist.inline li,body.rtl ul.checkboxlist.inline li{float:right;padding-left:20px;padding-right:0}body.rtl .grp-module.grp-tbody ul.radiolist.inline li,body.rtl .grp-module.grp-tbody ul.checkboxlist.inline li{float:right;padding-left:20px;padding-right:0}body.rtl .grp-autocomplete-wrapper-m2m a.grp-related-remove,body.rtl .grp-autocomplete-wrapper-m2m div.grp-loader,body.rtl .grp-autocomplete-wrapper-fk a.grp-related-remove,body.rtl .grp-autocomplete-wrapper-fk div.grp-loader{display:inline-block;position:absolute;left:24px !important;right:auto}body.rtl .grp-autocomplete-wrapper-m2m div.grp-loader,body.rtl .grp-autocomplete-wrapper-fk div.grp-loader{background:#fdfdfd url("../images/backgrounds/loading-small.gif") 50% 50% no-repeat scroll}body.rtl .grp-autocomplete-wrapper-m2m a.related-lookup,body.rtl .grp-autocomplete-wrapper-fk a.related-lookup{left:0;right:auto}body.rtl .grp-autocomplete-wrapper-m2m ul.grp-repr{float:right;padding-left:55px;padding-right:5px}body.rtl .grp-autocomplete-wrapper-m2m ul.grp-repr li{float:right}body.rtl .grp-autocomplete-wrapper-m2m ul.grp-repr li.grp-repr{margin:3px 1px 0 5px}body.rtl .grp-autocomplete-wrapper-m2m ul.grp-repr li.grp-repr a.grp-m2m-remove{padding-right:5px;padding-left:0}body.rtl .grp-autocomplete-wrapper-m2m a.related-lookup{left:-1px !important}body.rtl .grp-autocomplete-wrapper-m2m a.grp-related-remove+a.grp-related-lookup{-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:0;-webkit-border-bottom-right-radius:0;border-bottom-right-radius:0}body.rtl .grp-autocomplete-wrapper-m2m a.grp-related-remove,body.rtl .grp-autocomplete-wrapper-m2m a.grp-related-remove+div.grp-loader{left:23px !important;right:auto}body.rtl .grp-autocomplete-wrapper-fk input.ui-autocomplete-input{padding-left:55px;padding-right:5px}body.rtl td .grp-autocomplete-wrapper-m2m a.related-lookup,body.rtl td .grp-autocomplete-wrapper-fk a.related-lookup{margin-top:0 !important}body.rtl .selector{float:right}body.rtl .selector .selector-available,body.rtl .selector .selector-chosen{float:right}body.rtl .selector .selector-available h2,body.rtl .selector .selector-chosen h2{padding:7px 7px 6px 5px}body.rtl .selector ul.selector-chooser{float:right}body.rtl .selector .selector-filter{padding:3px 2px 2px 5px;background-position:10px 50%}body.rtl .selector .selector-filter input[type="text"]{float:right;margin-right:3px}body.rtl .selector select[multiple=multiple]{margin:0 -1px 0 0;padding-right:3px;padding-left:0}body.rtl .selector.stacked ul.selector-chooser{margin:4px 356px 0 0}body.rtl .selector.stacked ul.selector-chooser li{float:right}body.rtl caption,body.rtl th,body.rtl td{text-align:right}body.rtl .grp-float-left{float:right !important}body.rtl .grp-float-right{float:left !important}body.rtl.grp-filebrowser table td ul.grp-actions{right:-5px;left:0;margin:0 0 -1px -5px}
diff --git a/static/grappelli/stylesheets/screen.css b/static/grappelli/stylesheets/screen.css
new file mode 100644
index 0000000..5d9299b
--- /dev/null
+++ b/static/grappelli/stylesheets/screen.css
@@ -0,0 +1 @@
+html,body,div,span,applet,object,iframe,h1,h2,h3,h4,h5,h6,p,blockquote,pre,a,abbr,acronym,address,big,cite,code,del,dfn,em,img,ins,kbd,q,s,samp,small,strike,strong,sub,sup,tt,var,b,u,i,center,dl,dt,dd,ol,ul,li,fieldset,form,label,legend,table,caption,tbody,tfoot,thead,tr,th,td,article,aside,canvas,details,embed,figure,figcaption,footer,header,hgroup,menu,nav,output,ruby,section,summary,time,mark,audio,video{margin:0;padding:0;border:0;font:inherit;font-size:100%;vertical-align:baseline}html{line-height:1}ol,ul{list-style:none}table{border-collapse:collapse;border-spacing:0}caption,th,td{text-align:left;font-weight:normal;vertical-align:middle}q,blockquote{quotes:none}q:before,q:after,blockquote:before,blockquote:after{content:"";content:none}a img{border:none}article,aside,details,figcaption,figure,footer,header,hgroup,main,menu,nav,section,summary{display:block}.grp-font-family,.grp-button,input[type="submit"],a.grp-button,button.grp-button,input[type=button].grp-button,.ui-datepicker,#ui-timepicker,.ui-autocomplete,body{font-family:Arial,sans-serif}.grp-font-color,body{color:#444}.grp-font-color-quiet{color:#888}.grp-font-color-error{color:#bf3030}.grp-border-radius{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.grp-border-radius-s{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}.grp-form-field-border-radius{-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.grp-form-button-border-radius{-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px}.grp-margin-xl{margin:30px !important}.grp-margin-l{margin:20px !important}.grp-margin-m{margin:15px !important}.grp-margin{margin:10px !important}.grp-margin-s{margin:5px !important}.grp-margin-xs{margin:2px !important}.grp-margin-top-xl{margin-top:30px !important}.grp-margin-top-l{margin-top:20px !important}.grp-margin-top-m{margin-top:15px !important}.grp-margin-top{margin-top:10px !important}.grp-margin-top-s{margin-top:5px !important}.grp-margin-top-xs{margin-top:2px !important}.grp-margin-bottom-xl{margin-bottom:30px !important}.grp-margin-bottom-l{margin-bottom:20px !important}.grp-margin-bottom-m{margin-bottom:15px !important}.grp-margin-bottom{margin-bottom:10px !important}.grp-margin-bottom-s{margin-bottom:5px !important}.grp-margin-bottom-xs{margin-bottom:2px !important}.grp-margin-left-xl{margin-left:30px !important}.grp-margin-left-l{margin-left:20px !important}.grp-margin-left-m{margin-left:15px !important}.grp-margin-left{margin-left:10px !important}.grp-margin-left-s{margin-left:5px !important}.grp-margin-left-xs{margin-left:2px !important}.grp-margin-right-xl{margin-right:30px !important}.grp-margin-right-l{margin-right:20px !important}.grp-margin-right-m{margin-right:15px !important}.grp-margin-right{margin-right:10px !important}.grp-margin-right-s{margin-right:5px !important}.grp-margin-right-xs{margin-right:2px !important}.grp-margin-vertical-xl{margin-top:30px !important;margin-bottom:30px !important}.grp-margin-vertical-l{margin-top:20px !important;margin-bottom:20px !important}.grp-margin-vertical-m{margin-top:15px !important;margin-bottom:15px !important}.grp-margin-vertical{margin-top:10px !important;margin-bottom:10px !important}.grp-margin-vertical-s{margin-top:5px !important;margin-bottom:5px !important}.grp-margin-vertical-xs{margin-top:2px !important;margin-bottom:2px !important}.grp-margin-horizontal-xl{margin-left:30px !important;margin-right:30px !important}.grp-margin-horizontal-l{margin-left:20px !important;margin-right:20px !important}.grp-margin-horizontal-m{margin-left:15px !important;margin-right:15px !important}.grp-margin-horizontal{margin-left:10px !important;margin-right:10px !important}.grp-margin-horizontal-s{margin-left:5px !important;margin-right:5px !important}.grp-margin-horizontal-xs{margin-left:2px !important;margin-right:2px !important}.grp-no-margin{margin:0 !important}.grp-no-margin-top{margin-top:0 !important}.grp-no-margin-right{margin-right:0 !important}.grp-no-margin-bottom{margin-bottom:0 !important}.grp-no-margin-left{margin-left:0 !important}.grp-padding-xl{padding:30px !important}.grp-padding-l{padding:20px !important}.grp-padding-m{padding:15px !important}.grp-padding{padding:10px !important}.grp-padding-s{padding:5px !important}.grp-padding-xs{padding:2px !important}.grp-padding-top-xl{padding-top:30px !important}.grp-padding-top-l{padding-top:20px !important}.grp-padding-top-m{padding-top:15px !important}.grp-padding-top{padding-top:10px !important}.grp-padding-top-s{padding-top:5px !important}.grp-padding-top-xs{padding-top:2px !important}.grp-padding-bottom-xl{padding-bottom:30px !important}.grp-padding-bottom-l{padding-bottom:20px !important}.grp-padding-bottom-m{padding-bottom:15px !important}.grp-padding-bottom{padding-bottom:10px !important}.grp-padding-bottom-s{padding-bottom:5px !important}.grp-padding-bottom-xs{padding-bottom:2px !important}.grp-padding-left-xl{padding-left:30px !important}.grp-padding-left-l{padding-left:20px !important}.grp-padding-left-m{padding-left:15px !important}.grp-padding-left{padding-left:10px !important}.grp-padding-left-s{padding-left:5px !important}.grp-padding-left-xs{padding-left:2px !important}.grp-padding-right-xl{padding-right:30px !important}.grp-padding-right-l{padding-right:20px !important}.grp-padding-right-m{padding-right:15px !important}.grp-padding-right{padding-right:10px !important}.grp-padding-right-s{padding-right:5px !important}.grp-padding-right-xs{padding-right:2px !important}.grp-padding-vertical-xl{padding-top:30px !important;padding-bottom:30px !important}.grp-padding-vertical-l{padding-top:20px !important;padding-bottom:20px !important}.grp-padding-vertical-m{padding-top:15px !important;padding-bottom:15px !important}.grp-padding-vertical{padding-top:10px !important;padding-bottom:10px !important}.grp-padding-vertical-s{padding-top:5px !important;padding-bottom:5px !important}.grp-padding-vertical-xs{padding-top:2px !important;padding-bottom:2px !important}.grp-padding-horizontal-xl{padding-left:30px !important;padding-right:30px !important}.grp-padding-horizontal-l{padding-left:20px !important;padding-right:20px !important}.grp-padding-horizontal-m{padding-left:15px !important;padding-right:15px !important}.grp-padding-horizontal{padding-left:10px !important;padding-right:10px !important}.grp-padding-horizontal-s{padding-left:5px !important;padding-right:5px !important}.grp-padding-horizontal-xs{padding-left:2px !important;padding-right:2px !important}.grp-no-padding{padding:0 !important}.grp-no-padding-top{padding-top:0 !important}.grp-no-padding-right{padding-right:0 !important}.grp-no-padding-bottom{padding-bottom:0 !important}.grp-no-padding-left{padding-left:0 !important}.icons-sprite,.icons-add-another,.icons-back-link,.icons-breadcrumbs-rtl,.icons-breadcrumbs,.icons-date-hierarchy-back-rtl,.icons-date-hierarchy-back,.icons-datepicker,.icons-datetime-now,.icons-form-select,.icons-object-tools-add-link,.icons-object-tools-viewsite-link,.icons-pulldown-handler,.icons-pulldown-handler_selected,.icons-related-lookup-m2m,.icons-related-lookup,.icons-related-remove,.icons-searchbox,.icons-selector-add-m2m-horizontal,.icons-selector-add-m2m-vertical,.icons-selector-filter,.icons-selector-remove-m2m-horizontal,.icons-selector-remove-m2m-vertical,.icons-sort-remove,.icons-sorted-ascending,.icons-sorted-descending,.icons-status-no,.icons-status-unknown,.icons-status-yes,.icons-th-ascending,.icons-th-descending,.icons-timepicker,.icons-tools-add-handler,.icons-tools-arrow-down-handler,.icons-tools-arrow-up-handler,.icons-tools-close-handler,.icons-tools-delete-handler-predelete,.icons-tools-delete-handler,.icons-tools-drag-handler,.icons-tools-open-handler,.icons-tools-remove-handler,.icons-tools-trash-handler,.icons-tools-trash-list-toggle-handler,.icons-tools-viewsite-link,.icons-ui-datepicker-next,.icons-ui-datepicker-prev,a.grp-back-link,a.grp-back-link:hover,a.fb_show,a.related-lookup,body.tinyMCE input[name="src"]+div a,body.tinyMCE input[name="href"]+div a,a.related-lookup.m2m,.grp-autocomplete-wrapper-m2m a.related-lookup,.grp-autocomplete-wrapper-fk a.related-lookup,a.grp-related-remove,button.ui-datepicker-trigger,button.ui-timepicker-trigger,button.ui-datetime-now,.grp-search-button,a.add-another,img[src*="admin/img/icon-unknown"][src$=".gif"],img[src*="admin/img/icon-no"][src$=".gif"],img[src*="admin/img/icon-yes"][src$=".gif"],.grp-tools li a.grp-add-handler,.grp-tools li a.grp-delete-handler,.grp-predelete .grp-tools li a.grp-delete-handler,.grp-tools li a.grp-remove-handler,.grp-tools li a.grp-drag-handler,.grp-tools li a.grp-viewsite-link,.grp-tools li a.grp-open-handler,.grp-tools li a.grp-close-handler,.grp-tools li a.grp-arrow-down-handler,.grp-tools li a.grp-arrow-up-handler,.grp-tools li a.grp-trash-handler,.grp-tools li a.grp-trash-list-toggle-handler,table.grp-sortable thead th.sortable .grp-sortoptions a.grp-sortremove,table.grp-sortable thead th.sortable .grp-sortoptions a.grp-ascending,table.grp-sortable thead th.sortable .grp-sortoptions a.grp-descending,.grp-date-hierarchy ul li a.grp-date-hierarchy-back,.grp-pulldown-container .grp-pulldown-handler,.grp-pulldown-container .grp-pulldown-handler:hover,.grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler,.grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler:hover,body.grp-filebrowser table td.grp-sorted.grp-ascending a,body.grp-filebrowser table th.grp-sorted.grp-ascending a,body.grp-filebrowser table td.grp-sorted.grp-descending a,body.grp-filebrowser table th.grp-sorted.grp-descending a,.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next,#grp-breadcrumbs>ul a,#grp-breadcrumbs>ul a:hover,#grp-page-tools ul li a#grp-open-all,#grp-page-tools ul li a#grp-close-all{background-image:url('../images/icons-s846f870921.png');background-repeat:no-repeat}.icons-add-another{background-position:0 0}.icons-add-another:hover,.icons-add-another.add-another-hover{background-position:0 -44px}.icons-back-link{background-position:0 -88px}.icons-back-link:hover,.icons-back-link.back-link-hover{background-position:0 -131px}.icons-breadcrumbs-rtl{background-position:0 -174px}.icons-breadcrumbs-rtl:hover,.icons-breadcrumbs-rtl.breadcrumbs-rtl-hover{background-position:0 -218px}.icons-breadcrumbs{background-position:0 -262px}.icons-breadcrumbs:hover,.icons-breadcrumbs.breadcrumbs-hover{background-position:0 -306px}.icons-date-hierarchy-back-rtl{background-position:0 -350px}.icons-date-hierarchy-back-rtl:hover,.icons-date-hierarchy-back-rtl.date-hierarchy-back-rtl-hover{background-position:0 -393px}.icons-date-hierarchy-back{background-position:0 -436px}.icons-date-hierarchy-back:hover,.icons-date-hierarchy-back.date-hierarchy-back-hover{background-position:0 -479px}.icons-datepicker{background-position:0 -522px}.icons-datepicker:hover,.icons-datepicker.datepicker-hover{background-position:0 -565px}.icons-datetime-now{background-position:0 -608px}.icons-datetime-now:hover,.icons-datetime-now.datetime-now-hover{background-position:0 -651px}.icons-form-select{background-position:0 -694px}.icons-object-tools-add-link{background-position:0 -731px}.icons-object-tools-viewsite-link{background-position:0 -775px}.icons-pulldown-handler{background-position:0 -819px}.icons-pulldown-handler:hover,.icons-pulldown-handler.pulldown-handler-hover{background-position:0 -863px}.icons-pulldown-handler_selected{background-position:0 -907px}.icons-related-lookup-m2m{background-position:0 -951px}.icons-related-lookup-m2m:hover,.icons-related-lookup-m2m.related-lookup-m2m-hover{background-position:0 -994px}.icons-related-lookup{background-position:0 -1037px}.icons-related-lookup:hover,.icons-related-lookup.related-lookup-hover{background-position:0 -1080px}.icons-related-remove{background-position:0 -1123px}.icons-related-remove:hover,.icons-related-remove.related-remove-hover{background-position:0 -1166px}.icons-searchbox{background-position:0 -1209px}.icons-selector-add-m2m-horizontal{background-position:0 -1244px}.icons-selector-add-m2m-horizontal:hover,.icons-selector-add-m2m-horizontal.selector-add-m2m-horizontal-hover{background-position:0 -1276px}.icons-selector-add-m2m-vertical{background-position:0 -1308px}.icons-selector-add-m2m-vertical:hover,.icons-selector-add-m2m-vertical.selector-add-m2m-vertical-hover{background-position:0 -1341px}.icons-selector-filter{background-position:0 -1374px}.icons-selector-remove-m2m-horizontal{background-position:0 -1406px}.icons-selector-remove-m2m-horizontal:hover,.icons-selector-remove-m2m-horizontal.selector-remove-m2m-horizontal-hover{background-position:0 -1438px}.icons-selector-remove-m2m-vertical{background-position:0 -1470px}.icons-selector-remove-m2m-vertical:hover,.icons-selector-remove-m2m-vertical.selector-remove-m2m-vertical-hover{background-position:0 -1503px}.icons-sort-remove{background-position:0 -1536px}.icons-sort-remove:hover,.icons-sort-remove.sort-remove-hover{background-position:0 -1579px}.icons-sorted-ascending{background-position:0 -1622px}.icons-sorted-descending{background-position:0 -1665px}.icons-status-no{background-position:0 -1708px}.icons-status-unknown{background-position:0 -1743px}.icons-status-yes{background-position:0 -1778px}.icons-th-ascending{background-position:0 -1813px}.icons-th-descending{background-position:0 -1839px}.icons-timepicker{background-position:0 -1865px}.icons-timepicker:hover,.icons-timepicker.timepicker-hover{background-position:0 -1908px}.icons-tools-add-handler{background-position:0 -1951px}.icons-tools-add-handler:hover,.icons-tools-add-handler.tools-add-handler-hover{background-position:0 -1995px}.icons-tools-arrow-down-handler{background-position:0 -2039px}.icons-tools-arrow-down-handler:hover,.icons-tools-arrow-down-handler.tools-arrow-down-handler-hover{background-position:0 -2083px}.icons-tools-arrow-up-handler{background-position:0 -2127px}.icons-tools-arrow-up-handler:hover,.icons-tools-arrow-up-handler.tools-arrow-up-handler-hover{background-position:0 -2171px}.icons-tools-close-handler{background-position:0 -2215px}.icons-tools-close-handler:hover,.icons-tools-close-handler.tools-close-handler-hover{background-position:0 -2259px}.icons-tools-delete-handler-predelete{background-position:0 -2303px}.icons-tools-delete-handler{background-position:0 -2347px}.icons-tools-delete-handler:hover,.icons-tools-delete-handler.tools-delete-handler-hover{background-position:0 -2391px}.icons-tools-drag-handler{background-position:0 -2435px}.icons-tools-drag-handler:hover,.icons-tools-drag-handler.tools-drag-handler-hover{background-position:0 -2479px}.icons-tools-open-handler{background-position:0 -2523px}.icons-tools-open-handler:hover,.icons-tools-open-handler.tools-open-handler-hover{background-position:0 -2567px}.icons-tools-remove-handler{background-position:0 -2611px}.icons-tools-remove-handler:hover,.icons-tools-remove-handler.tools-remove-handler-hover{background-position:0 -2655px}.icons-tools-trash-handler{background-position:0 -2699px}.icons-tools-trash-handler:hover,.icons-tools-trash-handler.tools-trash-handler-hover{background-position:0 -2743px}.icons-tools-trash-list-toggle-handler{background-position:0 -2787px}.icons-tools-trash-list-toggle-handler:hover,.icons-tools-trash-list-toggle-handler.tools-trash-list-toggle-handler-hover{background-position:0 -2831px}.icons-tools-viewsite-link{background-position:0 -2875px}.icons-tools-viewsite-link:hover,.icons-tools-viewsite-link.tools-viewsite-link-hover{background-position:0 -2919px}.icons-ui-datepicker-next{background-position:0 -2963px}.icons-ui-datepicker-next:hover,.icons-ui-datepicker-next.ui-datepicker-next-hover{background-position:0 -3006px}.icons-ui-datepicker-prev{background-position:0 -3049px}.icons-ui-datepicker-prev:hover,.icons-ui-datepicker-prev.ui-datepicker-prev-hover{background-position:0 -3092px}.icons-small-sprite,.icons-small-add-link,.icons-small-change-link,.icons-small-delete-link,.icons-small-filter-choice-selected,.icons-small-link-external,.icons-small-link-internal,.icons-small-sort-remove,a.grp-link-external,a.grp-link-internal,.grp-actions li.grp-add-link a,.grp-actions li.grp-change-link a,.grp-actions li.grp-delete-link a,.grp-actions li.grp-delete-link>span:first-child,.grp-listing li.grp-add-link a,.grp-listing li.grp-change-link a,.grp-listing li.grp-delete-link a,.grp-listing li.grp-delete-link>span:first-child,.grp-listing-small li.grp-add-link a,.grp-listing-small li.grp-change-link a,.grp-listing-small li.grp-delete-link a,.grp-listing-small li.grp-delete-link>span:first-child,.grp-filter .grp-row.grp-selected a{background-image:url('../images/icons-small-scbbb475e49.png');background-repeat:no-repeat}.icons-small-add-link{background-position:0 0}.icons-small-add-link:hover,.icons-small-add-link.add-link-hover{background-position:0 -417px}.icons-small-change-link{background-position:0 -834px}.icons-small-change-link:hover,.icons-small-change-link.change-link-hover{background-position:0 -1251px}.icons-small-delete-link{background-position:0 -1668px}.icons-small-filter-choice-selected{background-position:0 -2085px}.icons-small-link-external{background-position:0 -2502px}.icons-small-link-external:hover,.icons-small-link-external.link-external-hover{background-position:0 -2919px}.icons-small-link-internal{background-position:0 -3336px}.icons-small-link-internal:hover,.icons-small-link-internal.link-internal-hover{background-position:0 -3753px}.icons-small-sort-remove{background-position:0 -4170px}.grp-font-size-xl,h1,.h1{font-size:20px}.grp-font-size-l,h2{font-size:13px}.grp-font-size-m,h3{font-size:12px}.grp-font-size,h4,.grp-button,input[type="submit"],a.grp-button,button.grp-button,input[type=button].grp-button,body{font-size:12px}.grp-font-size-s,.grp-actions{font-size:11px}.grp-font-size-xs{font-size:10px}.grp-line-height-xl,h1,.h1{line-height:24px}.grp-line-height-l,h2{line-height:18px}.grp-line-height-m,h3{line-height:16px}.grp-line-height,h4,.grp-actions,.grp-button,input[type="submit"],a.grp-button,button.grp-button,input[type=button].grp-button,body{line-height:16px}.grp-line-height-s{line-height:14px}.grp-line-height-xs{line-height:13px}a{text-decoration:none;color:#309bbf}a:hover{color:#444}a.grp-back-link{display:inline-block;width:16px;height:16px;background-position:0 -91px}a.grp-back-link:hover,a.grp-back-link.back-link-hover{background-position:0 -134px}a.grp-back-link:hover{background-position:0 -134px}a.grp-back-link.grp-icon-text{padding-left:24px;width:auto}a.grp-link-external{padding-left:18px;color:#62bbd9;background-position:0 -2502px}a.grp-link-external:hover,a.grp-link-external.link-external-hover{background-position:0 -2919px}a.grp-link-external:hover{color:#444}a.grp-link-internal{padding-left:18px;background-position:0 -3336px}a.grp-link-internal:hover,a.grp-link-internal.link-internal-hover{background-position:0 -3753px}h1,.h1{padding:20px 0 10px;font-weight:bold}h2{font-weight:bold}h3{font-weight:bold}h4{font-weight:bold}h1 span,h2 span,h3 span,h4 span{display:inline-block;margin-left:10px;font-weight:normal}em{font-style:italic}strong{font-weight:bold}.grp-float-left{float:left !important}.grp-float-right{float:right !important}.grp-transparent{border:0 !important;background-color:transparent !important}body.grp-doc article#grp-content section.grp-doc-section{margin-top:40px;border-top:5px solid #d94800}body.grp-doc article#grp-content section.grp-doc-section:first-child{margin-top:0}body.grp-doc span.anchor-helper{position:relative;top:-80px}body.grp-doc .grp-doc-code-source{padding-top:15px;border-top:1px dashed #c30}body.grp-doc .grp-doc-description{margin-bottom:20px}body.grp-doc .grp-doc-description h1{margin-top:30px;padding-top:40px;border-top:3px solid #c30}body.grp-doc .grp-doc-description h2{font-size:16px;line-height:16px;margin:40px 0 10px}body.grp-doc .grp-doc-description h3{font-size:16px;line-height:24px;margin:20px 0 10px}body.grp-doc .grp-doc-description p,body.grp-doc .grp-doc-description ul,body.grp-doc .grp-doc-description ol{margin:10px 0;font-size:14px;line-height:24px}body.grp-doc .grp-doc-description ul{list-style-type:disc}body.grp-doc .grp-doc-description ul li{margin-left:20px}body.grp-doc .grp-doc-description small{font-size:11px}body.grp-doc .grp-doc-class,body.grp-doc .grp-doc-id,body.grp-doc .grp-doc-dom,body.grp-doc .grp-doc-file,body.grp-doc .grp-doc-django{display:inline-block;margin:-2px 0;padding:0 5px;font-size:12px;font-weight:bold;line-height:18px;border:1px solid #d9d9c3;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#f2f2e6}body.grp-doc .grp-doc-dom span:before{content:"<"}body.grp-doc .grp-doc-dom span:after{content:">"}body.grp-doc code{position:relative;display:inline-block;margin:0 5px;padding:0 10px 20px;font-family:Menlo, Monaco, Consolas, "Courier New", monospace;font-size:11px;border:1px solid #d9d9c3;background:#f2f2e6;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body.grp-doc pre{margin:10px 0;padding:0}body.grp-doc pre code{display:block;margin:0;padding:0 20px 15px}p.grp-help{max-width:758px;padding:5px 0 0;color:#9a9a9a;font-size:11px !important;line-height:13px;white-space:normal !important}p.grp-help:first-child{margin-top:5px}.errorlist+p.grp-help{padding-top:2px}.grp-cells p.grp-help,.grp-td p.grp-help{max-width:278px}.grp-row p.grp-help:first-child,.grp-td p.grp-help:first-child{margin:-2px 0 8px}.grp-row p.grp-help{margin-bottom:-2px}.grp-description{font-size:11px}.grp-row img{font-size:1px;line-height:1px;vertical-align:middle}.fb_show+p.grp-help a{display:inline-block;padding:3px;font-size:0;line-height:0}.fb_show+p.grp-help a img{margin:0;font-size:0;line-height:0}p.file-upload{margin:6px 0 3px;font-size:11px;line-height:14px}p.file-upload span.clearable-file-input{display:block;margin:5px 0 -12px}p.file-upload span.clearable-file-input input{margin:1px 0 0}p.file-upload span.clearable-file-input label{margin:0 0 0 5px}tr p.file-upload{margin:1px 0 -2px;line-height:13px}p.preview{margin:5px 0 0}tr p.preview{margin:9px 0 -5px}p.preview a{display:inline-block;padding:3px;font-size:0;line-height:0;border:1px solid #309bbf;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px}p.preview a:hover{border:1px solid #444}.grp-rte{font-size:13px;line-height:18px}.grp-rte h4{margin:5px 0}.grp-rte p,.grp-rte ul,.grp-rte ol,.grp-rte blockquote,.grp-rte dl,.grp-rte dt,.grp-rte dd{margin:10px 0}.grp-rte p:only-child,.grp-rte ul:only-child,.grp-rte ol:only-child,.grp-rte blockquote:only-child,.grp-rte dl:only-child,.grp-rte dt:only-child,.grp-rte dd:only-child{margin:5px 0}.grp-rte ul{margin-left:30px}.grp-rte ul li{margin-left:20px;list-style-type:disc;list-style-position:outside}.grp-rte ul li ul{margin-top:-5px !important}.grp-rte ul li ul li{list-style-type:circle}.grp-docutils .grp-module h4{padding:0;font-size:13px;border:0;background:none}.grp-docutils .grp-module h4 p{margin:0}.grp-docutils table p{margin:0 !important}.grp-docutils code,.grp-docutils pre{font-size:11px;font-family:"Bitstream Vera Sans Mono", Monaco, "Courier New", Courier, monospace}.grp-docutils pre.literal-block{margin:10px;padding:6px 8px;background:#fff}.grp-docutils .grp-group h2+.grp-row>p{padding:3px 10px 0}span.grp-anchor{position:relative;float:left;clear:both;top:-80px}.grp-nowrap{white-space:nowrap}p.datetime{white-space:nowrap !important}p.datetime br{display:none}p.datetime input.vTimeField{margin-left:6px}a.add-another img,a.related-lookup img{opacity:0}a.related-lookup img{display:none}.deletelink{padding-left:12px;background:url(../../admin/img/icon_deletelink.gif) 0 0.25em no-repeat}fieldset.grp-module .grp-row label{margin:6px 0 6px;display:inline-block;font-family:Arial,sans-serif;font-size:11px;line-height:13px;color:#444}fieldset.grp-module .grp-row label.required{font-weight:bold}input[type="text"],input[type="password"],input[type="url"],input[type="email"],input[type="number"],input[type="submit"],input[type="reset"],textarea,select{margin:0;padding:2px 5px;height:25px;font-family:Arial,sans-serif;font-size:12px;line-height:14px;font-weight:bold;color:#555;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#fdfdfd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 1px 3px 0 #eee;-webkit-box-shadow:inset 0 1px 3px 0 #eee;box-shadow:inset 0 1px 3px 0 #eee;overflow:hidden;vertical-align:middle}input[type="text"]:focus,input[type="text"].grp-state-focus,input[type="password"]:focus,input[type="password"].grp-state-focus,input[type="url"]:focus,input[type="url"].grp-state-focus,input[type="email"]:focus,input[type="email"].grp-state-focus,input[type="number"]:focus,input[type="number"].grp-state-focus,input[type="submit"]:focus,input[type="submit"].grp-state-focus,input[type="reset"]:focus,input[type="reset"].grp-state-focus,textarea:focus,textarea.grp-state-focus,select:focus,select.grp-state-focus{border:1px solid #aaa;-moz-box-shadow:#ccc 0 0 6px;-webkit-box-shadow:#ccc 0 0 6px;box-shadow:#ccc 0 0 6px;background:#fff;outline:0}.grp-errors input[type="text"],.grp-errors input[type="password"],.grp-errors input[type="url"],.grp-errors input[type="email"],.grp-errors input[type="number"],.grp-errors input[type="submit"],.grp-errors input[type="reset"],.grp-errors textarea,.grp-errors select{border-color:#bf3030}input[readonly],input[disabled],textarea[readonly],select[disabled]{border:1px solid #ccc !important;border-style:dotted !important;background:transparent !important}input[readonly]:focus,input[disabled]:focus,textarea[readonly]:focus,select[disabled]:focus{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}div.grp-readonly{position:relative;display:inline-block;margin:0;padding:4px 5px 3px !important;min-width:106px;max-width:746px;min-height:16px;font-size:12px;line-height:16px;font-weight:bold;color:#555555;border:1px dotted #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}div.grp-readonly *{white-space:normal !important}div.grp-readonly pre{white-space:pre !important}div.grp-readonly+div.grp-readonly{margin-left:20px}div.grp-readonly:empty{margin-bottom:-5px !important}.grp-errors label{color:#bf3030 !important}.grp-errors ul.radiolist.inline label,.grp-errors ul.checkboxlist.inline label{color:#444 !important}.grp-errors input[type="text"],.grp-errors input[type="password"],.grp-errors input[type="url"],.grp-errors input[type="email"],.grp-errors input[type="number"],.grp-errors input[type="submit"],.grp-errors input[type="reset"],.grp-errors textarea,.grp-errors select{border-color:#bf3030 !important}.grp-errors .selector input,.grp-errors .selector select,.grp-errors .selector textarea{border:1px solid #ccc !important}.grp-errors ul.errorlist{padding:5px 0 0;color:#bf3030;font-size:11px !important;line-height:14px}select{padding:4px 3px 4px 2px;min-width:118px}@media screen and (-webkit-min-device-pixel-ratio: 0){select,select:focus{padding:4px 28px 4px 5px;-webkit-appearance:textfield;background-image:url("../images/icons/form-select.png");background-position:100% 50%;background-repeat:no-repeat}}select[multiple=multiple]{padding-right:5px;height:160px;overflow:auto}@media screen and (-webkit-min-device-pixel-ratio: 0){select[multiple=multiple]{background-image:none}}textarea{vertical-align:top;padding:5px 5px;height:60px;overflow:auto}fieldset.monospace textarea{font-family:"Bitstream Vera Sans Mono",Monaco,"Courier New",Courier,monospace}.grp-row input[type=checkbox],.grp-row input[type=radio]{position:relative;top:1px}.grp-row input[type=checkbox]+label,.grp-row input[type=radio]+label{position:relative;margin:0 0 0 5px}input[type=text].grp-search-field{margin-right:-5px;padding-left:10px;padding-right:30px;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px}ul.radiolist,ul.checkboxlist{position:relative;float:none;display:inline-block;margin:5px 0 0;padding:0;font-size:11px;line-height:15px;font-weight:normal}ul.radiolist label,ul.checkboxlist label{float:none;display:inline-block;margin:0 !important;padding:0 !important;width:auto !important;white-space:nowrap}ul.radiolist li+li,ul.checkboxlist li+li{margin-top:2px}.grp-row>ul.radiolist,.grp-row>ul.checkboxlist{margin:0}ul.radiolist.inline,ul.checkboxlist.inline{position:relative;float:none;display:inline-block;margin:5px 0 0;padding:0;font-size:11px;line-height:15px;font-weight:normal;max-width:760px;float:left;display:inline;margin-top:5px;margin-bottom:3px;padding-right:20px}ul.radiolist.inline label,ul.checkboxlist.inline label{float:none;display:inline-block;margin:0 !important;padding:0 !important;width:auto !important;white-space:nowrap}ul.radiolist.inline li+li,ul.checkboxlist.inline li+li{margin-top:2px}ul.radiolist.inline li,ul.checkboxlist.inline li{float:left;display:inline;margin-top:0 !important;margin-bottom:2px;padding-right:20px}.grp-module.grp-tbody ul.radiolist.inline,.grp-module.grp-tbody ul.checkboxlist.inline{white-space:normal}.grp-module.grp-tbody ul.radiolist.inline li,.grp-module.grp-tbody ul.checkboxlist.inline li{position:relative;float:left;display:inline}.grp-row.grp-cells ul.radiolist.inline li,.grp-row.grp-cells ul.checkboxlist.inline li{float:none}.selector{position:relative;float:left;overflow:hidden;width:758px}.selector .selector-available,.selector .selector-chosen{float:left;width:366px;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#ddd}.selector .selector-available.stacked,.selector .selector-chosen.stacked{width:756px}.selector .selector-available h2,.selector .selector-chosen h2{padding:7px 5px 6px 7px;font-size:12px;line-height:13px;font-weight:bold}.selector .selector-available h2 img,.selector .selector-chosen h2 img{display:none}.selector ul.selector-chooser{float:left;margin:110px 2px 0;padding:0;width:18px}.selector .selector-chosen h2{border-bottom:0 !important}.selector .selector-filter{display:block !important;height:27px;padding:3px 5px 2px 2px;font-weight:bold;color:#666;border-top:1px solid #e4e4e4;border-bottom:1px solid #e4e4e4;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;line-height:25px;text-indent:25px;background:url("../images/icons/searchbox.png") 6px 50% no-repeat}.selector .selector-filter input[type=text]{position:relative;margin:0;width:326px !important;max-width:326px !important}.selector .selector-filter img{display:none}.selector .selector-filter h2+select{position:relative;top:-1px}.selector select[multiple=multiple]{margin:0 0 0 -1px;padding-left:3px;max-width:368px !important;width:368px !important;height:200px;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.selector .selector-chosen select[multiple=multiple]{height:235px}.selector a.selector-add{background-image:url("../images/icons/selector-add-m2m-horizontal.png")}.selector a.selector-add:hover{background-image:url("../images/icons/selector-add-m2m-horizontal_hover.png")}.selector a.selector-remove{background-image:url("../images/icons/selector-remove-m2m-horizontal.png")}.selector a.selector-remove:hover{background-image:url("../images/icons/selector-remove-m2m-horizontal_hover.png")}.selector a.selector-chooseall,.selector a.selector-clearall{display:block;margin:0;padding:2px 7px;font-size:11px;line-height:13px;font-weight:bold}.selector.stacked .selector-available,.selector.stacked .selector-chosen{width:756px}.selector.stacked .selector-filter input[type=text]{width:716px !important;max-width:716px !important}.selector.stacked .selector-chosen .selector-filter:after{content:" " url("../images/icons/selector-add-m2m-vertical_hover.png")}.selector.stacked select[multiple=multiple]{width:758px !important;max-width:758px !important}.selector.stacked ul.selector-chooser{margin:4px 0 0 356px;width:36px}.selector.stacked ul.selector-chooser li{float:left}.selector.stacked a.selector-add{background-image:url("../images/icons/selector-add-m2m-vertical.png")}.selector.stacked a.selector-add:hover{background-image:url("../images/icons/selector-add-m2m-vertical_hover.png")}.selector.stacked a.selector-remove{background-image:url("../images/icons/selector-remove-m2m-vertical.png")}.selector.stacked a.selector-remove:hover{background-image:url("../images/icons/selector-remove-m2m-vertical_hover.png")}.selector a.selector-add,.selector a.selector-remove{display:block;width:18px;height:18px;color:transparent !important;background-position:50% 0;background-repeat:no-repeat}ul.errorlist+.selector{margin-top:8px !important}p.errornote{position:relative;float:left;clear:both;margin:0 0 5px;padding:5px 10px;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;font-weight:bold;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#bf3030}p.errornote+ul.errorlist{*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal;margin:5px 0 0;margin:-5px 0 0}p.errornote+ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}p.errornote+ul.errorlist li{padding:5px 10px}p.errornote+ul.errorlist li+li{border-top:1px solid #bf3030}ul.errorlist{*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal}ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}ul.errorlist+ul.errorlist{padding-top:2px}p.preview+ul.errorlist{margin-top:5px !important}p.preview+ul.errorlist{margin-top:5px !important}.grp-row ul.errorlist{*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal;margin:0}.grp-row ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.grp-row ul.errorlist li{padding:2px 0 0;border-top:0 !important}.grp-row ul.errorlist li:first-child{padding-top:0}.grp-tabular p.errornote{margin:2px 0 0}.grp-tabular p.errornote+ul.errorlist{margin:0}.grp-tabular ul.errorlist{*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal;margin:5px 0 0}.grp-tabular ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.grp-tabular ul.errorlist li{padding:5px 10px}.grp-tabular ul.errorlist li+li{border-top:1px solid #bf3030}.grp-tabular .grp-tbody ul.errorlist{margin:0}.grp-tabular .grp-td ul.errorlist{clear:both;*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal;margin:0}.grp-tabular .grp-td ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.grp-tabular .grp-td ul.errorlist li{padding:2px 0 0;border-top:0 !important}.grp-tabular .grp-td ul.errorlist li:first-child{padding-top:0}.grp-stacked p.errornote{margin:0}.grp-stacked p.errornote+ul.errorlist{margin:0}.grp-stacked ul.errorlist{*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal;margin:5px 0 0;margin:3px 0}.grp-stacked ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.grp-stacked ul.errorlist li{padding:5px 10px}.grp-stacked ul.errorlist li+li{border-top:1px solid #bf3030}.grp-stacked h3+*+ul.errorlist{*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal;margin:0;margin:0 !important;padding:5px 10px 8px;border-top:1px solid #fff;border-bottom:1px solid #ddd}.grp-stacked h3+*+ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.grp-stacked h3+*+ul.errorlist li{padding:2px 0 0;border-top:0 !important}.grp-stacked h3+*+ul.errorlist li:first-child{padding-top:0}.grp-stacked .grp-row ul.errorlist{*zoom:1;font-size:11px;line-height:13px;font-weight:bold;color:#bf3030;white-space:normal;margin:0}.grp-stacked .grp-row ul.errorlist:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}.grp-stacked .grp-row ul.errorlist li{padding:2px 0 0;border-top:0 !important}.grp-stacked .grp-row ul.errorlist li:first-child{padding-top:0}.grp-errors a.add-another+ul.errorlist{clear:both}.grp-errors td.mceIframeContainer{border:1px solid #bf3030 !important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}input[type=text],input[type=password],input[type="number"],.vDateField,.vTimeField,.vIntegerField,.vPositiveSmallIntegerField,.vManyToManyRawIdAdminField,.vForeignKeyRawIdAdminField{width:118px}input.grp-has-related-lookup,input.vDateField.hasDatepicker,input.vTimeField.hasTimepicker,input.vFileBrowseField{padding-right:24px !important}input[type="url"],input[type="email"],input.vTextField,input.vURLField,input.vFileBrowseField,textarea,.vLargeTextField,.vXMLLargeTextField{width:278px}.row select{min-width:118px}.vLargeTextField{height:118px}.grp-row input[type="url"],.grp-row input[type="email"],.grp-row .vTextField,.grp-row .vURLField,.grp-row .vFileBrowseField,.grp-row textarea,.grp-row .vLargeTextField,.grp-row .vXMLLargeTextField,.grp-autocomplete-wrapper-m2m{width:758px}.grp-row select{max-width:758px}.grp-autocomplete-wrapper-m2m ul.grp-repr,.grp-autocomplete-wrapper-m2m ul.grp-repr li{max-width:700px}.grp-changelist-results table input[type="url"],.grp-changelist-results table input[type="email"],.grp-changelist-results table .vTextField,.grp-changelist-results table .vURLField,.grp-changelist-results table .vFileBrowseField,.grp-changelist-results table textarea,.grp-changelist-results table .vLargeTextField,.grp-changelist-results table .vXMLLargeTextField,.grp-changelist-results table select{max-width:278px}.grp-module.grp-table select,.grp-module.grp-table .grp-autocomplete-wrapper-m2m,.grp-module.grp-table .grp-autocomplete-wrapper-fk{max-width:278px}.grp-module.grp-table .grp-autocomplete-wrapper-m2m,.grp-module.grp-table .grp-autocomplete-wrapper-fk{width:278px}.grp-module.grp-table .grp-autocomplete-wrapper-m2m ul.grp-repr,.grp-module.grp-table .grp-autocomplete-wrapper-m2m ul.grp-repr li{max-width:222px}.grp-cell input[type="url"],.grp-cell input[type="email"],.grp-cell input[type="number"],.grp-cell input[type=text],.grp-cell input[type=password],.grp-cell select,.grp-cell input[readonly],.grp-cell input[disabled],.grp-cell textarea[readonly],.grp-cell select[disabled],.grp-cell .grp-autocomplete-wrapper-m2m,.grp-cell .grp-autocomplete-wrapper-fk{max-width:278px}.grp-cell .grp-autocomplete-wrapper-m2m ul.grp-repr,.grp-cell .grp-autocomplete-wrapper-m2m ul.grp-repr li{max-width:220px}.grp-cell div.grp-readonly{max-width:266px}.grp-autocomplete-wrapper-m2m,.grp-autocomplete-wrapper-fk input.ui-autocomplete-input{margin:0;padding:2px 5px;height:25px;font-family:Arial,sans-serif;font-size:12px;line-height:14px;font-weight:bold;color:#555;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#fdfdfd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 1px 3px 0 #eee;-webkit-box-shadow:inset 0 1px 3px 0 #eee;box-shadow:inset 0 1px 3px 0 #eee;overflow:hidden;vertical-align:middle}.grp-autocomplete-wrapper-m2m:focus,.grp-autocomplete-wrapper-m2m.grp-state-focus,.grp-autocomplete-wrapper-fk input.ui-autocomplete-input:focus,.grp-autocomplete-wrapper-fk input.ui-autocomplete-input.grp-state-focus{border:1px solid #aaa;-moz-box-shadow:#ccc 0 0 6px;-webkit-box-shadow:#ccc 0 0 6px;box-shadow:#ccc 0 0 6px;background:#fff;outline:0}.grp-autocomplete-wrapper-m2m:focus,.grp-autocomplete-wrapper-m2m.grp-state-focus,.grp-autocomplete-wrapper-fk input.ui-autocomplete-input:focus,.grp-autocomplete-wrapper-fk input.ui-autocomplete-input.grp-state-focus{background-color:#e1f0f5}.grp-autocomplete-wrapper-m2m a.related-lookup,.grp-autocomplete-wrapper-fk a.related-lookup{position:absolute;right:0}.grp-autocomplete-wrapper-m2m a.related-lookup,.grp-autocomplete-wrapper-m2m input:focus+a.related-lookup,.grp-autocomplete-wrapper-fk a.related-lookup,.grp-autocomplete-wrapper-fk input:focus+a.related-lookup{border:1px solid #ccc !important}.grp-autocomplete-wrapper-m2m.grp-state-focus a.grp-related-remove,.grp-autocomplete-wrapper-m2m.grp-state-focus a.related-lookup,.grp-autocomplete-wrapper-fk.grp-state-focus a.grp-related-remove,.grp-autocomplete-wrapper-fk.grp-state-focus a.related-lookup{border:1px solid #aaa !important}.grp-autocomplete-wrapper-m2m a.grp-related-remove,.grp-autocomplete-wrapper-m2m div.grp-loader,.grp-autocomplete-wrapper-fk a.grp-related-remove,.grp-autocomplete-wrapper-fk div.grp-loader{display:inline-block;position:absolute;right:24px;top:0;font-size:0;line-height:0;width:23px;height:23px;border:1px solid #ccc}.grp-autocomplete-wrapper-m2m div.grp-loader,.grp-autocomplete-wrapper-fk div.grp-loader{background:#fdfdfd url("../images/backgrounds/loading-small.gif") 50% 50% no-repeat scroll}.grp-autocomplete-wrapper-m2m.grp-autocomplete-preremove input.ui-autocomplete-input,.grp-autocomplete-wrapper-m2m.grp-autocomplete-preremove li.grp-repr a,.grp-autocomplete-wrapper-fk.grp-autocomplete-preremove input.ui-autocomplete-input,.grp-autocomplete-wrapper-fk.grp-autocomplete-preremove li.grp-repr a{color:#bf3030 !important;text-decoration:line-through}.grp-autocomplete-wrapper-m2m li.grp-repr.grp-autocomplete-preremove a,.grp-autocomplete-wrapper-fk li.grp-repr.grp-autocomplete-preremove a{color:#bf3030 !important;text-decoration:line-through}.grp-autocomplete-wrapper-m2m li.grp-repr a:after{content:","}.grp-autocomplete-wrapper-m2m li.grp-repr:nth-last-child(2) a:after{content:""}.grp-autocomplete-wrapper-m2m li.grp-repr a:after{content:","}.grp-autocomplete-wrapper-m2m li.grp-repr:nth-last-child(2) a:after{content:""}.grp-autocomplete-wrapper-m2m{display:inline-block;position:relative;padding:0;height:auto !important;vertical-align:top;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;overflow:visible}.grp-autocomplete-wrapper-m2m ul.grp-repr{float:left;padding-right:55px;width:100%;max-width:700px;overflow:hidden;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.grp-autocomplete-wrapper-m2m ul.grp-repr li{float:left;display:inline;overflow:hidden;white-space:nowrap;overflow:hidden;-ms-text-overflow:ellipsis;-o-text-overflow:ellipsis;text-overflow:ellipsis;max-width:700px}.grp-autocomplete-wrapper-m2m ul.grp-repr li.grp-repr{margin:3px 5px 0 1px;font-weight:bold;line-height:18px}.grp-autocomplete-wrapper-m2m ul.grp-repr li.grp-repr a.grp-m2m-remove{color:#555;padding-left:5px}.grp-autocomplete-wrapper-m2m ul.grp-repr li.grp-search{margin-top:1px;margin-bottom:1px;background:transparent}.grp-autocomplete-wrapper-m2m ul.grp-repr li.grp-search input[type=text]{margin:0 0 -1px;padding:0 4px;width:100px;height:22px;font-size:12px;line-height:16px;outline:0;border:0;-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none;background:transparent;cursor:text}.grp-autocomplete-wrapper-m2m a.related-lookup{top:-1px;right:-1px}.grp-autocomplete-wrapper-m2m a.grp-related-remove+a.grp-related-lookup{-moz-border-radius-bottomleft:0;-webkit-border-bottom-left-radius:0;border-bottom-left-radius:0}.grp-autocomplete-wrapper-m2m a.grp-related-remove,.grp-autocomplete-wrapper-m2m a.grp-related-remove+div.grp-loader{top:-1px;right:23px}.grp-autocomplete-wrapper-fk{display:inline-block;position:relative;width:auto !important;height:auto !important;margin:0 !important;padding:0 !important;vertical-align:top;font-size:0 !important;line-height:0 !important;background:transparent !important}.grp-autocomplete-wrapper-fk input.ui-autocomplete-input{padding-right:55px}.grp-errors .grp-autocomplete-wrapper-m2m,.grp-errors .grp-autocomplete-wrapper-fk input.ui-autocomplete-input,.grp-errors a.grp-related-remove{border-color:#bf3030 !important}#changelist table div.autocomplete-wrapper-fk a.grp-related-remove,#changelist table div.autocomplete-wrapper-m2m a.grp-related-remove,#changelist table div.autocomplete-wrapper-fk div.grp-loader,#changelist table div.autocomplete-wrapper-m2m div.grp-loader{top:-5px}.grp-autocomplete-wrapper-m2m .grp-autocomplete-hidden-field,.grp-autocomplete-wrapper-fk .grp-autocomplete-hidden-field{position:absolute !important;z-index:0 !important;padding:0 !important;width:1px !important;height:1px !important;font-size:0 !important;line-height:0 !important;color:transparent !important;border:0 !important;background:transparent !important}.grp-actions{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;float:right;font-weight:bold}.grp-actions li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:5px;padding-right:5px}.grp-actions li:first-child{padding-left:0}.grp-actions li:last-child{padding-right:0}.grp-actions li.last{padding-right:0}.grp-actions li.grp-add-link a,.grp-actions li.grp-add-link>span:first-child,.grp-actions li.grp-change-link a,.grp-actions li.grp-change-link>span:first-child,.grp-actions li.grp-delete-link a,.grp-actions li.grp-delete-link>span:first-child{padding-left:20px;display:block;font-weight:bold}.grp-actions li.grp-add-link a{background-position:0 0}.grp-actions li.grp-add-link a:hover,.grp-actions li.grp-add-link a.add-link-hover{background-position:0 -417px}.grp-actions li.grp-change-link a{background-position:0 -834px}.grp-actions li.grp-change-link a:hover,.grp-actions li.grp-change-link a.change-link-hover{background-position:0 -1251px}.grp-actions li.grp-delete-link a,.grp-actions li.grp-delete-link>span:first-child{background-position:0 -1668px}.grp-group{position:relative;float:left;clear:both;margin:0 -4px 5px;padding:2px;width:100%;border:2px solid #ccc;-moz-border-radius:5px;-webkit-border-radius:5px;border-radius:5px;background:#fff}.grp-group.grp-closed{border:2px solid #ddd}.grp-group.grp-closed:hover{border:2px solid #ccc}.grp-module h2{padding:5px 10px 4px;text-shadow:0 1px 0 #f5f5f5;border-bottom:1px solid #ccc;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U1ZTVlNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2RiZGJkYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e5e5e5),color-stop(100%, #dbdbdb));background-image:-moz-linear-gradient(#e5e5e5,#dbdbdb);background-image:-webkit-linear-gradient(#e5e5e5,#dbdbdb);background-image:linear-gradient(#e5e5e5,#dbdbdb)}.grp-module h3{padding:5px 10px;text-shadow:0 1px 0 #f5f5f5;border-top:1px solid #f5f5f5;border-bottom:1px solid #ccc;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U1ZTVlNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2RiZGJkYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e5e5e5),color-stop(100%, #dbdbdb));background-image:-moz-linear-gradient(#e5e5e5,#dbdbdb);background-image:-webkit-linear-gradient(#e5e5e5,#dbdbdb);background-image:linear-gradient(#e5e5e5,#dbdbdb)}@media screen and (-webkit-min-device-pixel-ratio: 0){.grp-module h3{padding:5px 10px 4px}}.grp-module h4{padding:5px 10px;text-shadow:0 1px 0 #f5f5f5;border-top:1px solid #f5f5f5;border-bottom:1px solid #ccc;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VhZWFlYSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eaeaea),color-stop(100%, #e0e0e0));background-image:-moz-linear-gradient(#eaeaea,#e0e0e0);background-image:-webkit-linear-gradient(#eaeaea,#e0e0e0);background-image:linear-gradient(#eaeaea,#e0e0e0)}@media screen and (-webkit-min-device-pixel-ratio: 0){.grp-module h4{padding:5px 10px 4px}}.grp-group>h2{padding:5px 10px 4px;text-shadow:0 1px 0 #f5f5f5;border-bottom:1px solid #ccc;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2U1ZTVlNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2RiZGJkYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e5e5e5),color-stop(100%, #dbdbdb));background-image:-moz-linear-gradient(#e5e5e5,#dbdbdb);background-image:-webkit-linear-gradient(#e5e5e5,#dbdbdb);background-image:linear-gradient(#e5e5e5,#dbdbdb);border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.grp-group.grp-open>h2{margin-bottom:2px}.grp-group.grp-tabular.grp-open>h2{margin-bottom:0}.grp-group .grp-module>h3{border-top:0 !important;-moz-border-radius-topleft:3px;-webkit-border-top-left-radius:3px;border-top-left-radius:3px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px}.grp-group .grp-module>h3:only-child,.grp-group .grp-module>h3:last-child{border-bottom:0}.grp-module{position:relative;float:left;clear:both;margin:0 0 5px;padding:0;width:100%;border:1px solid #ccc;background:#eee;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.grp-module .grp-module{margin:0;border:0}.grp-module .grp-module+.grp-module{border-top:1px solid #d9d9d9;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}.grp-change-form .grp-module:not(.grp-submit-row){min-width:960px}.grp-empty-form{display:none !important}.grp-collapse.grp-closed *,.grp-collapse.grp-closed .grp-row:not(tr).grp-cells,.grp-collapse.grp-closed .grp-table,.grp-collapse.grp-closed .grp-table *{display:none}.grp-collapse.grp-closed>.grp-collapse-handler,.grp-collapse.grp-closed>.grp-collapse-handler *,.grp-collapse.grp-closed .grp-tools,.grp-collapse.grp-closed .grp-tools *{display:block !important}.grp-collapse.grp-closed .grp-tools li *[style^="display: none"]{display:none !important}.grp-collapse .grp-collapse-handler{cursor:pointer}.grp-collapse h2.grp-collapse-handler{text-shadow:0 1px 0 #c4e9f5}.grp-collapse.grp-open>h2.grp-collapse-handler{border-bottom:1px solid #ccc;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ExZDRlNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2JjZGZlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a1d4e5),color-stop(100%, #bcdfeb));background-image:-moz-linear-gradient(#a1d4e5,#bcdfeb);background-image:-webkit-linear-gradient(#a1d4e5,#bcdfeb);background-image:linear-gradient(#a1d4e5,#bcdfeb)}.grp-collapse.grp-closed>h2.grp-collapse-handler{-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2JjZGZlYiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2ExZDRlNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #bcdfeb),color-stop(100%, #a1d4e5));background-image:-moz-linear-gradient(#bcdfeb,#a1d4e5);background-image:-webkit-linear-gradient(#bcdfeb,#a1d4e5);background-image:linear-gradient(#bcdfeb,#a1d4e5)}.grp-collapse.grp-closed>h2.grp-collapse-handler:hover{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ExZDRlNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2JjZGZlYiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a1d4e5),color-stop(100%, #bcdfeb));background-image:-moz-linear-gradient(#a1d4e5,#bcdfeb);background-image:-webkit-linear-gradient(#a1d4e5,#bcdfeb);background-image:linear-gradient(#a1d4e5,#bcdfeb)}.grp-collapse.grp-module.grp-closed>h2.grp-collapse-handler{border-bottom:0}.grp-collapse h3.grp-collapse-handler{text-shadow:0 1px 0 #fff}.grp-collapse.grp-open>h3.grp-collapse-handler{border-top:1px solid #e2f2f7;border-bottom:1px solid #d9d9d9;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2NlZTlmMiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UxZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #cee9f2),color-stop(100%, #e1f0f5));background-image:-moz-linear-gradient(#cee9f2,#e1f0f5);background-image:-webkit-linear-gradient(#cee9f2,#e1f0f5);background-image:linear-gradient(#cee9f2,#e1f0f5)}.grp-collapse.grp-closed>h3.grp-collapse-handler{border-bottom:0;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UxZjBmNSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2NlZTlmMiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e1f0f5),color-stop(100%, #cee9f2));background-image:-moz-linear-gradient(#e1f0f5,#cee9f2);background-image:-webkit-linear-gradient(#e1f0f5,#cee9f2);background-image:linear-gradient(#e1f0f5,#cee9f2)}.grp-collapse.grp-closed>h3.grp-collapse-handler:hover{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2NlZTlmMiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UxZjBmNSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #cee9f2),color-stop(100%, #e1f0f5));background-image:-moz-linear-gradient(#cee9f2,#e1f0f5);background-image:-webkit-linear-gradient(#cee9f2,#e1f0f5);background-image:linear-gradient(#cee9f2,#e1f0f5)}.grp-module .grp-row:not(tr){position:relative;float:left;clear:both;padding:5px 10px;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border-top:1px solid #fff;border-bottom:1px solid #ddd}.grp-predelete .grp-module .grp-row:not(tr){border-bottom-color:#f2d4d4;border-top-color:#fcf4f4}.grp-module .grp-row:not(tr):first-child,.grp-module .grp-row:not(tr).grp-first{border-top:0;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px}.grp-module .grp-row:not(tr):last-of-type,.grp-module .grp-row:not(tr).grp-last{border-bottom:0;-moz-border-radius-bottomleft:2px;-webkit-border-bottom-left-radius:2px;border-bottom-left-radius:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}.grp-module .grp-row:not(tr).grp-row-hidden{top:-1px;margin-bottom:-1px;padding:0;height:0px;font-size:0;line-height:0;border-top-color:#eee}.grp-module .grp-row:not(tr).grp-row-hidden div{display:none}.grp-module .grp-row:not(tr).grp-cells{display:table-row;padding-top:0;padding-bottom:0}.grp-module .grp-row:not(tr).grp-cells .grp-cell{display:table-cell;vertical-align:top;position:relative;padding:8px 20px 8px 0;height:100%;white-space:nowrap;border-right:1px solid #ddd;overflow:visible}.grp-module .grp-row:not(tr).grp-cells .grp-cell+.grp-cell{padding-left:20px;border-left:1px solid #fff}.grp-module .grp-row:not(tr).grp-cells .grp-cell:last-of-type{padding-right:0;border-right:0 !important}.grp-module .grp-row+.grp-module>.grp-row:first-child,.grp-module h2+.grp-module>.grp-row:first-child,.grp-module .grp-module+.grp-module>.grp-row:first-child{border-top:1px solid #fff}fieldset.grp-module .grp-row{padding:8px 10px;overflow:hidden}.grp-listing{border-top:1px solid #fff}.grp-listing:first-child{border-top:0;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px}.grp-listing li.grp-add-link a,.grp-listing li.grp-add-link>span:first-child,.grp-listing li.grp-change-link a,.grp-listing li.grp-change-link>span:first-child,.grp-listing li.grp-delete-link a,.grp-listing li.grp-delete-link>span:first-child{padding-left:20px;display:block;font-weight:bold}.grp-listing li.grp-add-link a{background-position:0 0}.grp-listing li.grp-add-link a:hover,.grp-listing li.grp-add-link a.add-link-hover{background-position:0 -417px}.grp-listing li.grp-change-link a{background-position:0 -834px}.grp-listing li.grp-change-link a:hover,.grp-listing li.grp-change-link a.change-link-hover{background-position:0 -1251px}.grp-listing li.grp-delete-link a,.grp-listing li.grp-delete-link>span:first-child{background-position:0 -1668px}.grp-listing li.grp-add-link,.grp-listing li.grp-change-link,.grp-listing li.grp-delete-link{padding-left:25px}.grp-listing li.grp-add-link a,.grp-listing li.grp-add-link>span:first-child,.grp-listing li.grp-change-link a,.grp-listing li.grp-change-link>span:first-child,.grp-listing li.grp-delete-link a,.grp-listing li.grp-delete-link>span:first-child{display:block;margin-left:-20px;padding-left:20px}.grp-listing-small{border-top:1px solid #fff;font-size:11px}.grp-listing-small:first-child{border-top:0;-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px}.grp-listing-small li.grp-add-link a,.grp-listing-small li.grp-add-link>span:first-child,.grp-listing-small li.grp-change-link a,.grp-listing-small li.grp-change-link>span:first-child,.grp-listing-small li.grp-delete-link a,.grp-listing-small li.grp-delete-link>span:first-child{padding-left:20px;display:block;font-weight:bold}.grp-listing-small li.grp-add-link a{background-position:0 0}.grp-listing-small li.grp-add-link a:hover,.grp-listing-small li.grp-add-link a.add-link-hover{background-position:0 -417px}.grp-listing-small li.grp-change-link a{background-position:0 -834px}.grp-listing-small li.grp-change-link a:hover,.grp-listing-small li.grp-change-link a.change-link-hover{background-position:0 -1251px}.grp-listing-small li.grp-delete-link a,.grp-listing-small li.grp-delete-link>span:first-child{background-position:0 -1668px}.grp-listing-small li.grp-add-link,.grp-listing-small li.grp-change-link,.grp-listing-small li.grp-delete-link{padding-left:25px}.grp-listing-small li.grp-add-link a,.grp-listing-small li.grp-add-link>span:first-child,.grp-listing-small li.grp-change-link a,.grp-listing-small li.grp-change-link>span:first-child,.grp-listing-small li.grp-delete-link a,.grp-listing-small li.grp-delete-link>span:first-child{display:block;margin-left:-20px;padding-left:20px}.grp-listing-small a+span,.grp-listing-small span+span{position:relative;display:block;line-height:11px;margin:-1px 0 3px}.grp-listing-small p{margin:2px 0 4px;line-height:13px}.grp-stacked .grp-module.grp-add-item,.grp-tabular .grp-module.grp-add-item{margin-bottom:0;height:28px;font-weight:bold;border-color:transparent;background:transparent}.grp-stacked .grp-module.grp-add-item>a,.grp-tabular .grp-module.grp-add-item>a{font-weight:bold;padding:5px 10px;position:relative;top:6px}.grp-group:not(.grp-tabular){padding-bottom:0}.grp-group:not(.grp-tabular) .grp-module{margin-bottom:2px}.grp-group:not(.grp-tabular) .grp-module .grp-module{-moz-border-radius:0 0 2px 2px;-webkit-border-radius:0;border-radius:0 0 2px 2px;border-top:1px solid #fff}.grp-group:not(.grp-tabular) .grp-module.grp-predelete .grp-module{border-top-color:#fdf8f8}.grp-group:not(.grp-tabular) h2{margin-bottom:2px}.grp-group:not(.grp-tabular).grp-closed{padding-bottom:2px}.grp-group:not(.grp-tabular).grp-closed h2{margin-bottom:0}.grp-tabular .grp-table{display:table;margin:0 0 -2px;width:100%;border:0 none;border-collapse:separate;border-spacing:0 2px;background:none}@media screen and (-webkit-min-device-pixel-ratio: 0){.grp-tabular .grp-table{margin-bottom:-1px;border-spacing:0 1px !important}}.grp-tabular .grp-table .grp-tr{display:table-row}.grp-tabular .grp-table .grp-th,.grp-tabular .grp-table .grp-td{display:table-cell;float:none;height:100%;margin-right:0;overflow:hidden;padding:1px 20px;vertical-align:top;white-space:nowrap;border-left:1px solid #fff;border-right:1px solid #e0e0e0}.grp-tabular .grp-table .grp-th:first-of-type,.grp-tabular .grp-table .grp-td:first-of-type{padding-left:10px}.grp-tabular .grp-table .grp-thead{display:table-header-group;color:#aaa;font-size:11px;font-weight:bold}.grp-tabular .grp-table .grp-thead .grp-th,.grp-tabular .grp-table .grp-thead .grp-td{background:none;border-top:0}.grp-tabular .grp-table .grp-thead .grp-th:last-of-type,.grp-tabular .grp-table .grp-thead .grp-td:last-of-type{border-right:0}.grp-tabular .grp-table .grp-tbody{display:table-row-group;margin-top:0}.grp-tabular .grp-table .grp-tbody .grp-th,.grp-tabular .grp-table .grp-tbody .grp-td{padding-bottom:5px;padding-top:5px;border-bottom:1px solid #d4d4d4;border-top:1px solid #d4d4d4;background:#eee}.grp-tabular .grp-table .grp-tbody .grp-th:first-of-type,.grp-tabular .grp-table .grp-tbody .grp-td:first-of-type{border-left:1px solid #d4d4d4}.grp-tabular .grp-table .grp-tbody .grp-th:first-child,.grp-tabular .grp-table .grp-tbody .grp-td:first-child{-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px;-moz-border-radius-bottomleft:2px;-webkit-border-bottom-left-radius:2px;border-bottom-left-radius:2px}.grp-tabular .grp-table .grp-tbody .grp-th:last-of-type,.grp-tabular .grp-table .grp-tbody .grp-td:last-of-type{border-right:1px solid #d4d4d4;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}.grp-tabular .grp-table .grp-tbody .grp-th.grp-tools-container,.grp-tabular .grp-table .grp-tbody .grp-td.grp-tools-container{padding-left:0;width:100%;-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px;-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}.grp-tabular .grp-table .grp-tbody.grp-predelete .grp-th,.grp-tabular .grp-table .grp-tbody.grp-predelete .grp-td{border-right-color:#f2d4d4;border-left-color:#faf0f0;background:#f7e4e4}.grp-tabular .grp-table .grp-tbody.grp-predelete .grp-th:first-of-type,.grp-tabular .grp-table .grp-tbody.grp-predelete .grp-td:first-of-type{border-left:1px solid #d4d4d4}.grp-tabular .grp-table .grp-tbody.grp-predelete .grp-th:last-of-type,.grp-tabular .grp-table .grp-tbody.grp-predelete .grp-td:last-of-type{border-right:1px solid #d4d4d4}.grp-tabular .grp-table .grp-tfoot{display:table-footer-group;color:#aaa}.grp-tabular .grp-table .grp-tfoot .grp-td:last-of-type{border-right:0}.grp-tabular .grp-table .grp-module{float:none;clear:none;background:0;border:0}.grp-tabular .grp-module.grp-transparent{margin:2px 0 0}.grp-horizontal-list-container{margin:0;padding:0;border:0;overflow:hidden;*zoom:1}.grp-horizontal-list{margin:0;padding:0;border:0;overflow:hidden;*zoom:1}.grp-horizontal-list li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:5px;padding-right:5px}.grp-horizontal-list li:first-child{padding-left:0}.grp-horizontal-list li:last-child{padding-right:0}.grp-horizontal-list li.last{padding-right:0}.grp-horizontal-list-right>li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:right;padding-left:5px;padding-right:5px}.grp-horizontal-list-right>li:first-child{padding-right:0}.grp-horizontal-list-right>li:last-child{padding-left:0}.grp-horizontal-list-right>li.last{padding-left:0}.grp-predelete{background:#f7e4e4}.grp-predelete h2,.grp-collapse.grp-predelete>h2.grp-collapse-handler,.grp-predelete h3,.grp-collapse.grp-predelete>h3.grp-collapse-handler,.grp-predelete h4,.grp-collapse.grp-predelete .grp-collapse>h4.grp-collapse-handler{border-bottom-color:#f0cccc;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y3ZTRlNCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2Y0ZDhkOCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f7e4e4),color-stop(100%, #f4d8d8));background-image:-moz-linear-gradient(#f7e4e4,#f4d8d8);background-image:-webkit-linear-gradient(#f7e4e4,#f4d8d8);background-image:linear-gradient(#f7e4e4,#f4d8d8)}.grp-collapse.grp-predelete>h2.grp-collapse-handler:hover,.grp-collapse.grp-predelete>h3.grp-collapse-handler:hover,.grp-predelete .grp-collapse>h4.grp-collapse-handler:hover,.grp-collapse.grp-open.grp-predelete>h2.grp-collapse-handler,.grp-collapse.grp-open.grp-predelete>h3.grp-collapse-handler,.grp-predelete .grp-collapse.grp-open>h4.grp-collapse-handler{border-bottom-color:#f0cccc;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2Y0ZDhkOCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2Y3ZTRlNCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #f4d8d8),color-stop(100%, #f7e4e4));background-image:-moz-linear-gradient(#f4d8d8,#f7e4e4);background-image:-webkit-linear-gradient(#f4d8d8,#f7e4e4);background-image:linear-gradient(#f4d8d8,#f7e4e4)}.grp-predelete,.grp-predelete .grp-module,.grp-predelete .grp-th,.grp-predelete .grp-td{background:#f7e4e4}.button-state-blue,button,a.fb_show,a.related-lookup,body.tinyMCE input[name="src"]+div a,body.tinyMCE input[name="href"]+div a,input[type=button],a.related-lookup.m2m,.grp-autocomplete-wrapper-m2m a.related-lookup,.grp-autocomplete-wrapper-fk a.related-lookup,button.ui-datepicker-trigger,button.ui-timepicker-trigger,button.ui-datetime-now,.grp-pulldown-container .grp-pulldown-handler:hover,.grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler,.grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler:hover{color:#fff;border:1px solid #ccc;background-color:#e1f0f5}.button-state-grey,button:hover,a.fb_show:hover,a.related-lookup:hover,body.tinyMCE input[name="src"]+div a:hover,body.tinyMCE input[name="href"]+div a:hover,input[type=button]:hover,a.related-lookup.m2m:hover,.grp-autocomplete-wrapper-m2m a.related-lookup:hover,.grp-autocomplete-wrapper-fk a.related-lookup:hover,button.ui-datepicker-trigger:hover,button.ui-timepicker-trigger:hover,button.ui-datetime-now:hover,.grp-pulldown-container .grp-pulldown-handler,.grp-pulldown-container .grp-pulldown-content,.grp-pulldown-container .grp-pulldown-content:hover{color:#444;border:1px solid #ccc;background-color:#eee}.button-state-dark-grey{color:#444;border:1px solid #ccc;border-color:#ccc;background-color:#dbdbdb}.button-state-white,a.grp-related-remove,a.grp-related-remove:hover{border:1px solid #ccc;background-color:#fdfdfd}.button-state-red{color:#fff;border:1px solid #ccc;background-color:#bf3030}.button-state-transparent{border:1px solid transparent;background-color:transparent;background-image:none}.grp-button{position:relative;display:inline-block;margin:0;padding:5px;height:28px;font-weight:bold;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;overflow:hidden;vertical-align:top}@media screen and (-webkit-min-device-pixel-ratio: 0){.grp-button{padding:5px 10px}}input[type="submit"]{position:relative;display:inline-block;margin:0;padding:5px;height:28px;font-weight:bold;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;overflow:hidden;vertical-align:top;color:#fff;border:1px solid #2b8aab;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRmYjJkMyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4fb2d3),color-stop(100%, #309bbf));background-image:-moz-linear-gradient(#4fb2d3,#309bbf);background-image:-webkit-linear-gradient(#4fb2d3,#309bbf);background-image:linear-gradient(#4fb2d3,#309bbf)}@media screen and (-webkit-min-device-pixel-ratio: 0){input[type="submit"]{padding:5px 10px}}input[type="submit"]:hover,input[type="submit"]:focus{color:#fff;border:1px solid #373737;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzVlNWU1ZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ0NDQ0NCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5e5e5e),color-stop(100%, #444444));background-image:-moz-linear-gradient(#5e5e5e,#444444);background-image:-webkit-linear-gradient(#5e5e5e,#444444);background-image:linear-gradient(#5e5e5e,#444444)}.grp-fixed-footer input[type="submit"]:hover,.grp-fixed-footer input[type="submit"]:focus{color:#444;border:1px solid #c8c8c8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#ffffff,#eeeeee);background-image:-webkit-linear-gradient(#ffffff,#eeeeee);background-image:linear-gradient(#ffffff,#eeeeee)}a.grp-button,button.grp-button,input[type=button].grp-button{position:relative;display:inline-block;margin:0;padding:5px;height:28px;font-weight:bold;-moz-border-radius:5px !important;-webkit-border-radius:5px;border-radius:5px !important;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;overflow:hidden;vertical-align:top;color:#fff;border:1px solid #2b8aab;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRmYjJkMyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4fb2d3),color-stop(100%, #309bbf));background-image:-moz-linear-gradient(#4fb2d3,#309bbf);background-image:-webkit-linear-gradient(#4fb2d3,#309bbf);background-image:linear-gradient(#4fb2d3,#309bbf);padding:5px 10px}@media screen and (-webkit-min-device-pixel-ratio: 0){a.grp-button,button.grp-button,input[type=button].grp-button{padding:5px 10px}}a.grp-button:hover,a.grp-button:focus,button.grp-button:hover,button.grp-button:focus,input[type=button].grp-button:hover,input[type=button].grp-button:focus{color:#fff;border:1px solid #373737;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzVlNWU1ZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ0NDQ0NCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5e5e5e),color-stop(100%, #444444));background-image:-moz-linear-gradient(#5e5e5e,#444444);background-image:-webkit-linear-gradient(#5e5e5e,#444444);background-image:linear-gradient(#5e5e5e,#444444)}.grp-fixed-footer a.grp-button:hover,.grp-fixed-footer a.grp-button:focus,.grp-fixed-footer button.grp-button:hover,.grp-fixed-footer button.grp-button:focus,.grp-fixed-footer input[type=button].grp-button:hover,.grp-fixed-footer input[type=button].grp-button:focus{color:#444;border:1px solid #c8c8c8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#ffffff,#eeeeee);background-image:-webkit-linear-gradient(#ffffff,#eeeeee);background-image:linear-gradient(#ffffff,#eeeeee)}a.grp-button.grp-delete-link,button.grp-button.grp-delete-link,input[type=button].grp-button.grp-delete-link{color:#fff;border:1px solid #ab2b2b;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2QzNGY0ZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2JmMzAzMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #d34f4f),color-stop(100%, #bf3030));background-image:-moz-linear-gradient(#d34f4f,#bf3030);background-image:-webkit-linear-gradient(#d34f4f,#bf3030);background-image:linear-gradient(#d34f4f,#bf3030)}a.grp-button.grp-delete-link:hover,a.grp-button.grp-delete-link:focus,button.grp-button.grp-delete-link:hover,button.grp-button.grp-delete-link:focus,input[type=button].grp-button.grp-delete-link:hover,input[type=button].grp-button.grp-delete-link:focus{color:#fff;border:1px solid #373737;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzVlNWU1ZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ0NDQ0NCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5e5e5e),color-stop(100%, #444444));background-image:-moz-linear-gradient(#5e5e5e,#444444);background-image:-webkit-linear-gradient(#5e5e5e,#444444);background-image:linear-gradient(#5e5e5e,#444444)}.grp-fixed-footer a.grp-button.grp-delete-link:hover,.grp-fixed-footer a.grp-button.grp-delete-link:focus,.grp-fixed-footer button.grp-button.grp-delete-link:hover,.grp-fixed-footer button.grp-button.grp-delete-link:focus,.grp-fixed-footer input[type=button].grp-button.grp-delete-link:hover,.grp-fixed-footer input[type=button].grp-button.grp-delete-link:focus{color:#444;border:1px solid #c8c8c8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#ffffff,#eeeeee);background-image:-webkit-linear-gradient(#ffffff,#eeeeee);background-image:linear-gradient(#ffffff,#eeeeee)}a.grp-button.grp-cancel-link,button.grp-button.grp-cancel-link,input[type=button].grp-button.grp-cancel-link{color:#fff;border:1px solid #7b7b7b;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2EyYTJhMiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4ODg4OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a2a2a2),color-stop(100%, #888888));background-image:-moz-linear-gradient(#a2a2a2,#888888);background-image:-webkit-linear-gradient(#a2a2a2,#888888);background-image:linear-gradient(#a2a2a2,#888888)}a.grp-button.grp-cancel-link:hover,a.grp-button.grp-cancel-link:focus,button.grp-button.grp-cancel-link:hover,button.grp-button.grp-cancel-link:focus,input[type=button].grp-button.grp-cancel-link:hover,input[type=button].grp-button.grp-cancel-link:focus{color:#fff;border:1px solid #373737;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzVlNWU1ZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ0NDQ0NCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5e5e5e),color-stop(100%, #444444));background-image:-moz-linear-gradient(#5e5e5e,#444444);background-image:-webkit-linear-gradient(#5e5e5e,#444444);background-image:linear-gradient(#5e5e5e,#444444)}.grp-fixed-footer a.grp-button.grp-cancel-link:hover,.grp-fixed-footer a.grp-button.grp-cancel-link:focus,.grp-fixed-footer button.grp-button.grp-cancel-link:hover,.grp-fixed-footer button.grp-button.grp-cancel-link:focus,.grp-fixed-footer input[type=button].grp-button.grp-cancel-link:hover,.grp-fixed-footer input[type=button].grp-button.grp-cancel-link:focus{color:#444;border:1px solid #c8c8c8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#ffffff,#eeeeee);background-image:-webkit-linear-gradient(#ffffff,#eeeeee);background-image:linear-gradient(#ffffff,#eeeeee)}a.grp-button.grp-reset-link,button.grp-button.grp-reset-link,input[type=button].grp-button.grp-reset-link{color:#fff;border:1px solid #7b7b7b;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2EyYTJhMiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4ODg4OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #a2a2a2),color-stop(100%, #888888));background-image:-moz-linear-gradient(#a2a2a2,#888888);background-image:-webkit-linear-gradient(#a2a2a2,#888888);background-image:linear-gradient(#a2a2a2,#888888)}a.grp-button.grp-reset-link:hover,a.grp-button.grp-reset-link:focus,button.grp-button.grp-reset-link:hover,button.grp-button.grp-reset-link:focus,input[type=button].grp-button.grp-reset-link:hover,input[type=button].grp-button.grp-reset-link:focus{color:#fff;border:1px solid #373737;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzVlNWU1ZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzQ0NDQ0NCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #5e5e5e),color-stop(100%, #444444));background-image:-moz-linear-gradient(#5e5e5e,#444444);background-image:-webkit-linear-gradient(#5e5e5e,#444444);background-image:linear-gradient(#5e5e5e,#444444)}.grp-fixed-footer a.grp-button.grp-reset-link:hover,.grp-fixed-footer a.grp-button.grp-reset-link:focus,.grp-fixed-footer button.grp-button.grp-reset-link:hover,.grp-fixed-footer button.grp-button.grp-reset-link:focus,.grp-fixed-footer input[type=button].grp-button.grp-reset-link:hover,.grp-fixed-footer input[type=button].grp-button.grp-reset-link:focus{color:#444;border:1px solid #c8c8c8;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2ZmZmZmZiIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #ffffff),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#ffffff,#eeeeee);background-image:-webkit-linear-gradient(#ffffff,#eeeeee);background-image:linear-gradient(#ffffff,#eeeeee)}button,a.fb_show,a.related-lookup,body.tinyMCE input[name="src"]+div a,body.tinyMCE input[name="href"]+div a{position:relative;display:inline-block;margin:0 0 0 -25px;padding:0;width:25px;height:25px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;overflow:hidden;vertical-align:top}input[type=button]{position:relative;display:inline-block;margin:0 0 0 -25px;padding:0;width:25px;height:25px;-moz-border-radius-topright:3px;-webkit-border-top-right-radius:3px;border-top-right-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;cursor:pointer;overflow:hidden;vertical-align:top;margin:0 0 0 -2px;padding:0 10px;width:auto;font-family:Arial,sans-serif;font-size:11px;line-height:13px;font-weight:bold;color:#309bbf}input[type=button]:hover{color:#444}input:focus+input[type=button]{border:1px solid #aaa}.grp-placeholder-related-fk,.grp-placeholder-related-m2m,.grp-placeholder-related-generic{position:relative;display:block;top:-24px;margin:0 0 -20px 123px;padding:0;font-weight:bold}table .grp-placeholder-related-fk,table .grp-placeholder-related-m2m,table .grp-placeholder-related-generic{top:-20px;margin-bottom:-25px}.grp-placeholder-related-fk .grp-placeholder-label:first-child,.grp-placeholder-related-m2m .grp-placeholder-label:first-child,.grp-placeholder-related-generic .grp-placeholder-label:first-child{display:inline-block;margin-top:4px}.grp-placeholder-related-fk .grp-placeholder-label:first-child *,.grp-placeholder-related-m2m .grp-placeholder-label:first-child *,.grp-placeholder-related-generic .grp-placeholder-label:first-child *{margin-top:-4px}table .grp-placeholder-related-fk .grp-placeholder-label:first-child,table .grp-placeholder-related-m2m .grp-placeholder-label:first-child,table .grp-placeholder-related-generic .grp-placeholder-label:first-child{margin-top:5px}table .grp-placeholder-related-fk .grp-placeholder-label:first-child *,table .grp-placeholder-related-m2m .grp-placeholder-label:first-child *,table .grp-placeholder-related-generic .grp-placeholder-label:first-child *{margin-top:-5px}.grp-placeholder-related-fk img,.grp-placeholder-related-m2m img,.grp-placeholder-related-generic img{vertical-align:top}.grp-errors .grp-placeholder-related-fk,.grp-errors .grp-placeholder-related-m2m,.grp-errors .grp-placeholder-related-generic{display:none}.grp-placeholder-related-fk .grp-separator:after,.grp-placeholder-related-m2m .grp-separator:after,.grp-placeholder-related-generic .grp-separator:after{content:", "}a.fb_show,a.related-lookup,body.tinyMCE input[name="src"]+div a,body.tinyMCE input[name="href"]+div a{display:inline-block;margin-bottom:-5px;background-position:0 -1037px}a.fb_show:hover,a.fb_show.related-lookup-hover,a.related-lookup:hover,a.related-lookup.related-lookup-hover,body.tinyMCE input[name="src"]+div a:hover,body.tinyMCE input[name="src"]+div a.related-lookup-hover,body.tinyMCE input[name="href"]+div a:hover,body.tinyMCE input[name="href"]+div a.related-lookup-hover{background-position:0 -1080px}a.related-lookup+strong{position:relative;top:2px;margin-left:5px}a.related-lookup.m2m,.grp-autocomplete-wrapper-m2m a.related-lookup{background-position:0 -951px}a.related-lookup.m2m:hover,a.related-lookup.m2m.related-lookup-m2m-hover,.grp-autocomplete-wrapper-m2m a.related-lookup:hover,.grp-autocomplete-wrapper-m2m a.related-lookup.related-lookup-m2m-hover{background-position:0 -994px}.grp-autocomplete-wrapper-fk a.related-lookup{background-position:0 -1037px}.grp-autocomplete-wrapper-fk a.related-lookup:hover,.grp-autocomplete-wrapper-fk a.related-lookup.related-lookup-hover{background-position:0 -1080px}a.grp-related-remove{background-position:0 -1123px}a.grp-related-remove:hover,a.grp-related-remove.related-remove-hover{background-position:0 -1166px}button.ui-datepicker-trigger{background-position:0 -522px}button.ui-datepicker-trigger:hover,button.ui-datepicker-trigger.datepicker-hover{background-position:0 -565px}button.ui-timepicker-trigger{background-position:0 -1865px}button.ui-timepicker-trigger:hover,button.ui-timepicker-trigger.timepicker-hover{background-position:0 -1908px}button.ui-timepicker-trigger+button.ui-datetime-now{margin-left:6px !important;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}button.ui-datetime-now{background-position:0 -608px}button.ui-datetime-now:hover,button.ui-datetime-now.datetime-now-hover{background-position:0 -651px}.grp-search-button{background-position:0 -1037px;border-color:transparent !important;background-color:transparent !important}.grp-search-button:hover,.grp-search-button.related-lookup-hover{background-position:0 -1080px}a.add-another{position:relative;display:inline-block;margin-left:3px;width:18px;height:18px;vertical-align:top;font-size:11px;line-height:16px;background-position:0 0}a.add-another:hover,a.add-another.add-another-hover{background-position:0 -44px}.grp-row a.add-another{top:-7px}.grp-row ul.radiolist+a.add-another,.grp-row ul.checkboxlist+a.add-another{top:3px}p.grp-help+*+a.add-another{float:right;top:-20px;margin-bottom:-20px}.grp-td a.add-another{float:none}.grp-td select+a.add-another{top:-6px}.radiolist.inline+a.add-another,.checkboxlist.inline+a.add-another{float:left;margin-left:-20px;margin-right:-10000px}.grp-row.grp-cells ul.radiolist.inline+a.add-another,.grp-row.grp-cells ul.checkboxlist.inline+a.add-another{float:none;margin-right:0}input:focus+button,.vDateField:focus+span a,.vTimeField:focus+span a,input:focus+a.fb_show,input:focus+a.related-lookup,input:focus+*+a.related-lookup,input:focus+a.add-another,.grp-state-focus a.related-lookup,body.tinyMCE input[name="src"]:focus+div a,body.tinyMCE input[name="href"]:focus+div a{border:1px solid #aaa !important}input:focus+.grp-search-button{border-color:transparent !important}.grp-errors input+button,.grp-errors .vDateField+span a,.grp-errors .vTimeField+span a,.grp-errors input+a.fb_show,.grp-errors input+a.related-lookup,.grp-errors input+*+a.related-lookup,.grp-errors input+a.add-another,.grp-errors .grp-state-focus a.related-lookup,.grp-errors a.grp-related-remove,.grp-errors .grp-state-focus a.related-remove{border-color:#bf3030 !important}img[src*="admin/img/icon-unknown"][src$=".gif"],img[src*="admin/img/icon-no"][src$=".gif"],img[src*="admin/img/icon-yes"][src$=".gif"]{position:relative;height:0;width:0;top:0;margin:-2px 0;padding:8px;font-size:0}img[src*="admin/img/icon-unknown"][src$=".gif"]{background-position:0 -1743px}img[src*="admin/img/icon-no"][src$=".gif"]{background-position:0 -1708px}img[src*="admin/img/icon-yes"][src$=".gif"]{background-position:0 -1778px}.grp-object-tools{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;position:relative;float:right;top:-40px;margin:0 0 -40px}.grp-object-tools li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:5px;padding-right:5px}.grp-object-tools li:first-child{padding-left:0}.grp-object-tools li:last-child{padding-right:0}.grp-object-tools li.last{padding-right:0}.grp-object-tools li a{display:block;padding:4px 15px;font-weight:bold;-moz-border-radius:30px;-webkit-border-radius:30px;border-radius:30px;color:#fff;border:1px solid #777;opacity:.5;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk5OTk5OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4ODg4OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #999999),color-stop(100%, #888888));background:-moz-linear-gradient(#999999,#888888);background:-webkit-linear-gradient(#999999,#888888);background:linear-gradient(#999999,#888888)}.grp-object-tools li a.grp-state-focus{opacity:1}.grp-object-tools li a:hover{opacity:1 !important;border:1px solid #2987a6 !important;background:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzM2YjBkOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #36b0d9),color-stop(100%, #309bbf));background:-moz-linear-gradient(#36b0d9,#309bbf);background:-webkit-linear-gradient(#36b0d9,#309bbf);background:linear-gradient(#36b0d9,#309bbf)}.grp-object-tools li a.grp-add-link{padding-left:28px;background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk5OTk5OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4ODg4OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #999999),color-stop(100%, #888888));background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,-moz-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,-webkit-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,linear-gradient(#999999,#888888)}.grp-object-tools li a.grp-add-link:hover{background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzM2YjBkOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #36b0d9),color-stop(100%, #309bbf));background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,-moz-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,-webkit-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 0 -731px no-repeat,linear-gradient(#36b0d9,#309bbf)}.grp-object-tools li a.grp-viewsite-link,.grp-object-tools li a[target="_blank"]{padding-left:28px;background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzk5OTk5OSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzg4ODg4OCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #999999),color-stop(100%, #888888));background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,-moz-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,-webkit-linear-gradient(#999999,#888888);background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,linear-gradient(#999999,#888888)}.grp-object-tools li a.grp-viewsite-link:hover,.grp-object-tools li a[target="_blank"]:hover{background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzM2YjBkOSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #36b0d9),color-stop(100%, #309bbf));background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,-moz-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,-webkit-linear-gradient(#36b0d9,#309bbf);background:url('../images/icons-s846f870921.png') 0 -775px no-repeat,linear-gradient(#36b0d9,#309bbf)}.grp-tools{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;position:relative;float:right;top:-24px;margin:0 0 -24px;padding-right:5px;height:24px;white-space:nowrap}.grp-tools li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:1px;padding-right:1px}.grp-tools li:first-child{padding-left:0}.grp-tools li:last-child{padding-right:0}.grp-tools li.last{padding-right:0}.grp-tools-container .grp-tools li{float:none !important;display:inline-block}.grp-tools li a,.grp-tools li span{display:block;width:24px;height:24px}.grp-tools li a.grp-icon-text,.grp-tools li a.grp-text,.grp-tools li span.grp-icon-text,.grp-tools li span.grp-text{padding-left:24px;padding-right:6px;width:auto;line-height:24px;color:#444}.grp-tools li a.grp-icon-text:hover,.grp-tools li a.grp-text:hover,.grp-tools li span.grp-icon-text:hover,.grp-tools li span.grp-text:hover{color:#309bbf}.grp-tools li a.grp-text,.grp-tools li span.grp-text{padding-left:8px}.grp-tools li a.grp-add-handler{background-position:0 -1951px}.grp-tools li a.grp-add-handler:hover,.grp-tools li a.grp-add-handler.tools-add-handler-hover{background-position:0 -1995px}.grp-tools li a.grp-delete-handler{background-position:0 -2347px}.grp-tools li a.grp-delete-handler:hover,.grp-tools li a.grp-delete-handler.tools-delete-handler-hover{background-position:0 -2391px}.grp-predelete .grp-tools li a.grp-delete-handler{background-position:0 -2303px}.grp-tools li a.grp-remove-handler{background-position:0 -2611px}.grp-tools li a.grp-remove-handler:hover,.grp-tools li a.grp-remove-handler.tools-remove-handler-hover{background-position:0 -2655px}.grp-tools li a.grp-drag-handler{background-position:0 -2435px}.grp-tools li a.grp-drag-handler:hover,.grp-tools li a.grp-drag-handler.tools-drag-handler-hover{background-position:0 -2479px}.grp-tools li a.grp-viewsite-link{background-position:0 -2875px}.grp-tools li a.grp-viewsite-link:hover,.grp-tools li a.grp-viewsite-link.tools-viewsite-link-hover{background-position:0 -2919px}.grp-tools li a.grp-open-handler{background-position:0 -2523px}.grp-tools li a.grp-open-handler:hover,.grp-tools li a.grp-open-handler.tools-open-handler-hover{background-position:0 -2567px}.grp-tools li a.grp-close-handler{background-position:0 -2215px}.grp-tools li a.grp-close-handler:hover,.grp-tools li a.grp-close-handler.tools-close-handler-hover{background-position:0 -2259px}.grp-tools li a.grp-arrow-down-handler{background-position:0 -2039px}.grp-tools li a.grp-arrow-down-handler:hover,.grp-tools li a.grp-arrow-down-handler.tools-arrow-down-handler-hover{background-position:0 -2083px}.grp-tools li a.grp-arrow-up-handler{background-position:0 -2127px}.grp-tools li a.grp-arrow-up-handler:hover,.grp-tools li a.grp-arrow-up-handler.tools-arrow-up-handler-hover{background-position:0 -2171px}.grp-tools li a.grp-trash-handler{background-position:0 -2699px}.grp-tools li a.grp-trash-handler:hover,.grp-tools li a.grp-trash-handler.tools-trash-handler-hover{background-position:0 -2743px}.grp-tools li a.grp-trash-list-toggle-handler{background-position:0 -2787px}.grp-tools li a.grp-trash-list-toggle-handler:hover,.grp-tools li a.grp-trash-list-toggle-handler.tools-trash-list-toggle-handler-hover{background-position:0 -2831px}.grp-tools input{position:absolute;top:-30px}.grp-tools span{color:transparent !important;cursor:default !important}.grp-module>h2+.grp-tools{top:-26px;right:1px;margin-bottom:-26px}.grp-module .grp-row>.grp-tools{top:-4px;right:-9px}.grp-module>h3+.grp-tools{top:-25px;margin-bottom:-25px}.grp-module.grp-closed>h3+.grp-tools{top:-24px;margin-bottom:-24px}fieldset.grp-module .grp-row>.grp-tools{top:0}.grp-group>h2+.grp-tools{top:-28px;right:1px;margin-bottom:-28px}.grp-group.grp-closed>h2+.grp-tools{top:-26px;right:1px;margin-bottom:-26px}.grp-group.grp-tabular h2+.grp-tools{top:-27px;right:1px;margin-bottom:-27px}.grp-tools-container .grp-tools{top:0;right:-20px;margin-bottom:0}.grp-module.grp-add-item .grp-tools{top:2px}table{margin:0;padding:0;border-spacing:none;border-collapse:separate;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}table td,table th{vertical-align:text-top;padding:10px;font-size:11px;line-height:15px}table td.nowrap,table th.nowrap{white-space:nowrap}table thead th{vertical-align:top;padding:6px 10px 6px;font-size:11px;line-height:12px;color:#888;white-space:nowrap;border-left:1px solid #ccc;border-bottom:1px solid #ccc;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee),color-stop(100%, #e0e0e0));background-image:-moz-linear-gradient(#eeeeee,#e0e0e0);background-image:-webkit-linear-gradient(#eeeeee,#e0e0e0);background-image:linear-gradient(#eeeeee,#e0e0e0)}table thead th:first-child{border-left:0}table thead th:first-of-type{-moz-border-radius-topleft:2px;-webkit-border-top-left-radius:2px;border-top-left-radius:2px}table thead th:last-of-type{-moz-border-radius-topright:2px;-webkit-border-top-right-radius:2px;border-top-right-radius:2px}table thead th a{display:block;margin:-6px -10px;padding:6px 10px;height:100%;color:#59afcc}table thead th a:hover{color:#444}table tfoot td{vertical-align:top;padding:6px 10px 6px;font-size:11px;line-height:12px;color:#888;white-space:nowrap}table tbody tr td,table tbody tr th{border-bottom:1px solid #e0e0e0;border-left:1px solid #e4e4e4;vertical-align:top}table tbody tr td:first-child,table tbody tr th:first-child{border-left:0 !important}table tbody tr th{font-size:12px;font-weight:bold}table tbody tr.grp-row-even td,table tbody tr.grp-row-even th,table tbody tr.grp-alt td,table tbody tr.grp-alt th{border-left:1px solid #e0e0e0;background:#f4f4f4}table tbody tr.grp-row-odd td,table tbody tr.grp-row-odd th{background:#fff}table tbody tr.grp-selected{background:#ffd}table tbody tr.grp-row-label td{border-bottom:0;color:#666}table tbody tr:last-child td,table tbody tr:last-child th{border-bottom:0}table tbody tr:last-child td:first-child,table tbody tr:last-child th:first-child{-moz-border-radius-bottomleft:2px;-webkit-border-bottom-left-radius:2px;border-bottom-left-radius:2px}table tbody tr:last-child td:last-child,table tbody tr:last-child th:last-child{-moz-border-radius-bottomright:2px;-webkit-border-bottom-right-radius:2px;border-bottom-right-radius:2px}table tbody tr a.related-lookup+strong{top:0}table tbody tr.grp-errors td,table tbody tr.grp-errors th{padding-top:6px;padding-bottom:0}table tbody tr.grp-errors td ul.errorlist,table tbody tr.grp-errors th ul.errorlist{margin:0 0 3px !important}table tfoot td{border-bottom:0;border-top:1px solid #d4d4d4}table tfoot td:first-child{border-left:0}@media screen and (-webkit-min-device-pixel-ratio: 0){table td>a:first-child,table th>a:first-child{position:relative;top:1px}}table td>input[type="checkbox"],table td>input[type="radio"],table th>input[type="checkbox"],table th>input[type="radio"]{margin:0}table td>input[type="file"],table td>input[type="checkbox"],table td>input[type="radio"],table td>select,table td p input[type="text"],table th>input[type="file"],table th>input[type="checkbox"],table th>input[type="radio"],table th>select,table th p input[type="text"]{position:relative;margin-top:-7px !important;margin-bottom:-5px !important}table td>input[type="text"],table td>input[type="password"],table td>input[type="url"],table td>input[type="email"],table td>input[type="number"],table td>input[type="button"],table td>select,table td p input[type="text"],table td p input[type="url"],table td p input[type="email"],table td p input[type="number"],table td p>input[type="button"],table th>input[type="text"],table th>input[type="password"],table th>input[type="url"],table th>input[type="email"],table th>input[type="number"],table th>input[type="button"],table th>select,table th p input[type="text"],table th p input[type="url"],table th p input[type="email"],table th p input[type="number"],table th p>input[type="button"]{vertical-align:top;margin-top:-5px !important;margin-bottom:-5px !important}table td>textarea,table td div.grp-readonly,table th>textarea,table th div.grp-readonly{position:relative;margin:-5px 0 -5px !important}table td ul.radiolist,table td ul.checkboxlist,table th ul.radiolist,table th ul.checkboxlist{margin:-3px 0 -5px}table td ul.radiolist.inline,table td ul.checkboxlist.inline,table th ul.radiolist.inline,table th ul.checkboxlist.inline{margin:-3px 0 -5px;white-space:normal !important;max-width:400px}table td a.fb_show,table td a.related-lookup,table td .ui-datepicker-trigger,table td .ui-timepicker-trigger,table th a.fb_show,table th a.related-lookup,table th .ui-datepicker-trigger,table th .ui-timepicker-trigger{margin:-5px 0 -11px -25px}table td .grp-autocomplete-wrapper-m2m,table td .grp-autocomplete-wrapper-fk,table th .grp-autocomplete-wrapper-m2m,table th .grp-autocomplete-wrapper-fk{margin:-5px 0 !important}table td .grp-autocomplete-wrapper-m2m a.related-lookup,table td .grp-autocomplete-wrapper-fk a.related-lookup,table th .grp-autocomplete-wrapper-m2m a.related-lookup,table th .grp-autocomplete-wrapper-fk a.related-lookup{top:0;margin-top:0}table td a.add-another,table th a.add-another{top:-13px;margin-bottom:-5px}table td ul.radiolist.inline+a.add-another,table td ul.checkboxlist.inline+a.add-another,table th ul.radiolist.inline+a.add-another,table th ul.checkboxlist.inline+a.add-another{top:-5px}table td>ul.errorlist,table th>ul.errorlist{margin:8px 0 -7px !important}table td>ul.errorlist:first-child,table th>ul.errorlist:first-child{margin:-2px 0 8px !important}table.grp-sortable thead th{margin:0;padding:0}table.grp-sortable thead th div.grp-text span{display:block;padding:6px 10px;white-space:nowrap}table.grp-sortable thead th div.grp-text span input[type="checkbox"]{margin:-6px 0 !important}table.grp-sortable thead th.sortable{white-space:nowrap}table.grp-sortable thead th.sortable .grp-text{position:relative;z-index:400;display:block;margin:0;padding:0;white-space:nowrap}table.grp-sortable thead th.sortable .grp-text a{margin:0;padding:6px 10px;display:block}table.grp-sortable thead th.sortable .grp-sortoptions{position:relative;z-index:410;display:block;float:right;clear:right;margin:0 5px 0 0px;width:50px;white-space:nowrap}table.grp-sortable thead th.sortable .grp-sortoptions a{position:relative;float:right;display:inline-block;margin:0;padding:0}table.grp-sortable thead th.sortable .grp-sortoptions a.grp-sortremove,table.grp-sortable thead th.sortable .grp-sortoptions a.grp-ascending,table.grp-sortable thead th.sortable .grp-sortoptions a.grp-descending{width:21px;height:24px}table.grp-sortable thead th.sortable .grp-sortoptions a.grp-sortremove{visibility:hidden;background-position:0 -1536px}table.grp-sortable thead th.sortable .grp-sortoptions a.grp-sortremove:hover,table.grp-sortable thead th.sortable .grp-sortoptions a.grp-sortremove.sort-remove-hover{background-position:0 -1579px}table.grp-sortable thead th.sortable .grp-sortoptions a.grp-ascending{background-position:0 -1622px}table.grp-sortable thead th.sortable .grp-sortoptions a.grp-descending{background-position:0 -1665px}table.grp-sortable thead th.sortable .grp-sortoptions:hover a.grp-sortremove{visibility:visible}table.grp-sortable thead th.sortable .grp-sortoptions span.grp-sortpriority{position:relative;float:right;display:block;padding:6px 0 0;height:16px;font-weight:bold}table.grp-sortable thead th.sortable:hover{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e0e0e0),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#e0e0e0,#eeeeee);background-image:-webkit-linear-gradient(#e0e0e0,#eeeeee);background-image:linear-gradient(#e0e0e0,#eeeeee)}table.grp-sortable thead th.sortable.sorted.ascending{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e0e0e0),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#e0e0e0,#eeeeee);background-image:-webkit-linear-gradient(#e0e0e0,#eeeeee);background-image:linear-gradient(#e0e0e0,#eeeeee)}table.grp-sortable thead th.sortable.sorted.ascending:hover{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee),color-stop(100%, #e0e0e0));background-image:-moz-linear-gradient(#eeeeee,#e0e0e0);background-image:-webkit-linear-gradient(#eeeeee,#e0e0e0);background-image:linear-gradient(#eeeeee,#e0e0e0)}table.grp-sortable thead th.sortable.sorted.descending{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee),color-stop(100%, #e0e0e0));background-image:-moz-linear-gradient(#eeeeee,#e0e0e0);background-image:-webkit-linear-gradient(#eeeeee,#e0e0e0);background-image:linear-gradient(#eeeeee,#e0e0e0)}table.grp-sortable thead th.sortable.sorted.descending:hover{background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #e0e0e0),color-stop(100%, #eeeeee));background-image:-moz-linear-gradient(#e0e0e0,#eeeeee);background-image:-webkit-linear-gradient(#e0e0e0,#eeeeee);background-image:linear-gradient(#e0e0e0,#eeeeee)}table.grp-sortable thead th.sortable.sorted a{color:#444;font-weight:bold}table.grp-sortable thead th.sortable.sorted .grp-text a{padding-right:60px}thead th.optional{font-weight:normal !important}tr.row-label td{margin-top:-1px;padding-top:2px;padding-bottom:0;font-size:9px}table.xfull,table.grp-full-width{width:100%}table.orderable tbody tr td:hover{cursor:move}table.orderable tbody tr td:first-child{padding-left:14px;background-image:url("../images/backgrounds/nav-grabber.gif");background-repeat:repeat-y}table.orderable-initalized .order-cell,body>tr>td.order-cell{display:none}table#grp-change-history{width:100%}table#grp-change-history tbody th{width:160px}table#grp-change-history tbody td,table#grp-change-history tbody th{background:#eee}table.grp-full{width:100%}.grp-module>table.grp-full{border:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}.model-index table th{padding:7px 10px 8px}.grp-pagination ul{margin:0;padding:0;border:0;overflow:hidden;*zoom:1}.grp-pagination ul li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:0;padding-right:0}.grp-pagination ul li:first-child{padding-left:0}.grp-pagination ul li:last-child{padding-right:0}.grp-pagination ul li.last{padding-right:0}.grp-pagination ul li{margin-right:1px;border:1px solid #fff;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.grp-pagination ul li a,.grp-pagination ul li span{display:inline-block;padding:4px 8px 4px;min-width:25px;font-size:11px;font-weight:bold;text-align:center;border:1px solid;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.grp-pagination ul li a{color:#59afcc;border-color:#d9d9d9}.grp-pagination ul li a:hover{color:#444;border-color:#bdbdbd;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee),color-stop(100%, #e0e0e0));background-image:-moz-linear-gradient(#eeeeee,#e0e0e0);background-image:-webkit-linear-gradient(#eeeeee,#e0e0e0);background-image:linear-gradient(#eeeeee,#e0e0e0)}.grp-pagination ul li span{color:#444;border-color:#bdbdbd;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iI2VlZWVlZSIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iI2UwZTBlMCIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #eeeeee),color-stop(100%, #e0e0e0));background-image:-moz-linear-gradient(#eeeeee,#e0e0e0);background-image:-webkit-linear-gradient(#eeeeee,#e0e0e0);background-image:linear-gradient(#eeeeee,#e0e0e0)}.grp-pagination ul li.grp-results{margin-right:4px}.grp-pagination ul li.grp-separator{border-color:transparent}.grp-pagination ul li.grp-separator span{padding:4px 0;min-width:10px;font-size:14px;border-color:transparent;background:transparent}.grp-pagination ul li.grp-showall{margin-left:4px}.grp-pagination ul li:last-child{clear:right}.grp-date-hierarchy ul{position:relative;float:left;clear:both;font-size:11px;line-height:16px;font-weight:bold}.grp-date-hierarchy ul li{position:relative;float:left}.grp-date-hierarchy ul li a,.grp-date-hierarchy ul li span{padding:2px 5px}.grp-date-hierarchy ul li a.grp-date-hierarchy-back{color:#59afcc;padding-left:10px;background-position:0 -436px}.grp-date-hierarchy ul li a.grp-date-hierarchy-back:hover,.grp-date-hierarchy ul li a.grp-date-hierarchy-back.date-hierarchy-back-hover{background-position:0 -479px}.grp-date-hierarchy ul li a.grp-date-hierarchy-back:hover{color:#444}form#grp-changelist-search-form{margin:1px 0 0;border:1px solid #fff;-moz-border-radius:20px;-webkit-border-radius:20px;border-radius:20px}.grp-pulldown-container{position:relative;top:0;width:inherit;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px;margin:-1px 0 0}.grp-pulldown-container .grp-pulldown-handler{display:block;margin:0;font-weight:bold;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;cursor:pointer;background-position:100% -819px;-webkit-background-size:auto !important;color:#309bbf}.grp-pulldown-container .grp-pulldown-handler:hover,.grp-pulldown-container .grp-pulldown-handler.pulldown-handler-hover{background-position:100% -863px}.grp-pulldown-container .grp-pulldown-handler:hover{color:#444;background-position:100% -863px}.grp-pulldown-container.grp-pulldown-state-open{z-index:910;float:left;clear:both;-moz-box-shadow:0 10px 50px #333;-webkit-box-shadow:0 10px 50px #333;box-shadow:0 10px 50px #333}.grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler{color:#444;text-shadow:0 1px 0 #fff;-moz-border-radius-bottomleft:0 !important;-webkit-border-bottom-left-radius:0 !important;border-bottom-left-radius:0 !important;-moz-border-radius-bottomright:0 !important;-webkit-border-bottom-right-radius:0 !important;border-bottom-right-radius:0 !important;border-bottom:1px solid #ccc !important;background-position:100% -907px}.grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-handler:hover{color:#444;background-position:100% -907px}.grp-pulldown-container.grp-pulldown-state-open .grp-pulldown-content{float:left;clear:both}.grp-pulldown-container .grp-pulldown-content{padding:0;width:100%;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;border-top:1px solid #fff !important;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#444}.grp-pulldown-container .grp-pulldown-content:hover{color:#444}#grp-filters{position:relative}#grp-filters.grp-module{z-index:800}.grp-filter{position:relative;float:left;clear:both;width:100%;*zoom:1}.grp-filter:not(.grp-module){height:28px}.grp-filter .grp-pulldown-container{border:1px solid #fff}.grp-filter .grp-module:first-child h3{border-top:0}.grp-filter .grp-row label{display:inline-block;font-family:Arial,sans-serif;font-size:11px;line-height:13px;color:#444;display:block;margin:0 0 2px;color:#888;font-weight:bold}.grp-filter .grp-row label.required{font-weight:bold}.grp-filter .grp-row select{width:100% !important;max-width:100% !important}.grp-filter .grp-row a{display:block;margin:-5px -10px;padding:2px 10px;color:#59afcc;font-size:11px}.grp-filter .grp-row a:hover{color:#444}.grp-filter .grp-row.grp-selected a{padding-left:17px;color:#444;background-position:0 -2085px}.grp-filter:after{content:"\0020";display:block;height:0;clear:both;overflow:hidden;visibility:hidden}li.grp-changelist-actions{padding:5px 0 !important;background:transparent !important}li.grp-changelist-actions select{position:relative;float:left;margin:1px 5px 0 0}li.grp-changelist-actions .grp-horizontal-list{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;margin:-1px 0}li.grp-changelist-actions .grp-horizontal-list li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:0;padding-right:0}li.grp-changelist-actions .grp-horizontal-list li:first-child{padding-left:0}li.grp-changelist-actions .grp-horizontal-list li:last-child{padding-right:0}li.grp-changelist-actions .grp-horizontal-list li.last{padding-right:0}li.grp-changelist-actions .grp-horizontal-list li{margin-right:4px;border:1px solid #333;-moz-border-radius:4px;-webkit-border-radius:4px;border-radius:4px}li.grp-changelist-actions .grp-horizontal-list .grp-button{padding:5px 10px 4px;height:27px;-moz-border-radius:3px !important;-webkit-border-radius:3px;border-radius:3px !important}li.grp-changelist-actions .grp-horizontal-list a{opacity:1 !important;color:#59afcc;font-weight:bold;border:1px solid #111;background:#222}li.grp-changelist-actions .grp-horizontal-list a:hover{color:#fff;border:1px solid #222;background:#555}li.grp-changelist-actions .grp-horizontal-list span{color:#bbb !important;cursor:default !important;border:1px solid #111 !important;background:#222 !important}li.grp-changelist-actions li.grp-all,li.grp-changelist-actions li.grp-question,li.grp-changelist-actions li.grp-clear-selection{display:none}.grp-submit-row.grp-fixed-footer>ul>li.grp-changelist-actions{padding:5px 0 !important}.grp-changelist-results{background:#eee url("../images/backgrounds/changelist-results.png") repeat scroll !important}.grp-result-overflow-scroll .grp-changelist-results{overflow:auto;overflow-y:hidden;-ms-overflow-y:hidden}.grp-result-overflow-scroll .grp-changelist-results table{border-right:0 !important}body.grp-change-list table{margin:-1px !important}body.grp-change-list table tr.grp-selected th,body.grp-change-list table tr.grp-selected td{background:#ffd}body.grp-delete-confirmation ul.grp-nested-list{position:relative;float:left;clear:both;width:100%;margin:-2px 0 2px}body.grp-delete-confirmation ul.grp-nested-list li{font-size:12px;font-weight:normal}body.grp-delete-confirmation ul.grp-nested-list li>ul li>ul{margin-left:6px}body.grp-delete-confirmation ul.grp-nested-list li>ul li>ul>li{margin:5px 0 5px -4px;padding-left:10px;border-left:4px solid #ddd}body.grp-delete-confirmation ul.grp-nested-list li+li{margin-top:5px}body.grp-delete-confirmation ul.grp-nested-list>li{margin-left:0;font-size:14px;font-weight:bold;position:relative;float:left;clear:both;margin:0 0 5px;padding:0;width:100%;border:1px solid #ccc;background:#eee;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;margin-top:2px !important;margin-bottom:0 !important;padding:8px 10px}body.grp-delete-confirmation ul.grp-nested-list>li .grp-module{margin:0;border:0}body.grp-delete-confirmation ul.grp-nested-list>li .grp-module+.grp-module{border-top:1px solid #d9d9d9;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}body.grp-delete-confirmation ul.grp-nested-list>li+li{margin-top:0}body.grp-delete-confirmation ul.grp-nested-list>li>ul{margin-top:8px;border-top:1px solid #ddd}body.grp-delete-confirmation ul.grp-nested-list>li>ul>li{margin-top:0 !important;padding-top:8px;padding-bottom:8px;font-size:13px;font-weight:bold;border-top:1px solid #fff;border-bottom:1px solid #ddd}body.grp-delete-confirmation ul.grp-nested-list>li>ul>li:last-child{padding-bottom:0;border-bottom:0}body.grp-delete-confirmation ul.grp-nested-list>li>ul>li>ul{margin-top:8px}body.grp-delete-confirmation ul.grp-nested-list>li>ul>li>ul>li{font-weight:bold}body.grp-delete-confirmation ul.grp-nested-list>li>ul>li>ul>li>ul li ul li{color:#888}body.grp-filebrowser table td>a:first-child,body.grp-filebrowser table th>a:first-child{position:relative;top:0}body.grp-filebrowser table td.grp-sorted a,body.grp-filebrowser table th.grp-sorted a{padding-right:30px;color:#444;font-weight:bold}body.grp-filebrowser table td.grp-sorted.grp-ascending a,body.grp-filebrowser table th.grp-sorted.grp-ascending a{background-position:100% -1622px}body.grp-filebrowser table td.grp-sorted.grp-descending a,body.grp-filebrowser table th.grp-sorted.grp-descending a{background-position:100% -1665px}body.grp-filebrowser table td{padding:10px 10px 8px}body.grp-filebrowser table td ul.grp-actions{position:relative;top:-1px;left:-5px;margin:0 -5px -1px 0}.grp-module.ui-widget{border:none}.ui-widget-content{border:1px solid #ccc;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px}.ui-state-default,.ui-widget-content .ui-state-default,.ui-widget-header .ui-state-default{font-weight:bold}.ui-state-hover,.ui-widget-content .ui-state-hover,.ui-widget-header .ui-state-hover,.ui-state-focus,.ui-widget-content .ui-state-focus,.ui-widget-header .ui-state-focus{font-weight:bold}.ui-state-active,.ui-widget-content .ui-state-active,.ui-widget-header .ui-state-active{font-weight:bold}.ui-sortable{position:relative;float:left;clear:both;width:100%}.ui-sortable .ui-sortable-helper,.ui-sortable .ui-sortable-placeholder{opacity:.8}.ui-sortable .ui-sortable-helper{margin:0;width:100% !important;height:auto !important;overflow:visible}.ui-sortable .grp-module.ui-sortable-placeholder{border:1px solid #ccc !important;background:transparent url("../images/backgrounds/ui-sortable-placeholder.png") 0 0 repeat scroll !important}.grp-group.grp-stacked .ui-sortable-placeholder{margin:0 0 2px}.grp-group.grp-stacked .ui-sortable-placeholder:first-child{margin-top:0}.grp-group.grp-tabular .ui-sortable .grp-module.ui-sortable-placeholder{overflow:hidden}.grp-group.grp-tabular .ui-sortable .grp-module.ui-sortable-placeholder .grp-th,.grp-group.grp-tabular .ui-sortable .grp-module.ui-sortable-placeholder .grp-td{padding-top:0 !important;padding-bottom:0 !important;background:transparent !important}.grp-group.grp-tabular .ui-sortable .grp-module.ui-sortable-helper{border-top:0 !important}.grp-group.grp-tabular .ui-sortable .grp-module.ui-sortable-helper .grp-th,.grp-group.grp-tabular .ui-sortable .grp-module.ui-sortable-helper .grp-td{background:#ffffcc !important}.grp-group.grp-stacked .ui-sortable-helper,.grp-group.grp-stacked .ui-sortable-helper .grp-module,.grp-group.grp-stacked .ui-sortable-helper h2,.grp-group.grp-stacked .ui-sortable-helper h3,.grp-group.grp-stacked .ui-sortable-helper h4,.grp-group.grp-stacked .grp-collapse.grp-predelete.ui-sortable-helper>h3.grp-collapse-handler,.grp-group.grp-stacked .grp-collapse.grp-open.predelete.ui-sortable-helper>h3.grp-collapse-handler,.grp-group.grp-stacked .grp-collapse.grp-predelete.ui-sortable-helper h4.grp-collapse-handler,.grp-group.grp-stacked .grp-collapse.grp-open.grp-predelete.ui-sortable-helper h4.grp-collapse-handler{background:#ffffcc !important}.datetime br{display:none}.datetimeshortcuts{width:40px;position:relative;margin-left:10px}.datetimeshortcuts a{margin-left:0 !important}.ui-datepicker{position:absolute;display:none;margin:-1px 0 0 !important;padding:3px 3px 0;width:auto !important;font-size:12px;border:1px solid #888;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#eee;-moz-box-shadow:0 10px 50px #333;-webkit-box-shadow:0 10px 50px #333;box-shadow:0 10px 50px #333}.ui-datepicker input,.ui-datepicker select,.ui-datepicker textarea,.ui-datepicker button{margin:0;padding:2px 5px;height:25px;font-family:Arial,sans-serif;font-size:12px;line-height:14px;font-weight:bold;color:#555;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#fdfdfd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 1px 3px 0 #eee;-webkit-box-shadow:inset 0 1px 3px 0 #eee;box-shadow:inset 0 1px 3px 0 #eee;overflow:hidden;vertical-align:middle}.ui-datepicker input:focus,.ui-datepicker input.grp-state-focus,.ui-datepicker select:focus,.ui-datepicker select.grp-state-focus,.ui-datepicker textarea:focus,.ui-datepicker textarea.grp-state-focus,.ui-datepicker button:focus,.ui-datepicker button.grp-state-focus{border:1px solid #aaa;-moz-box-shadow:#ccc 0 0 6px;-webkit-box-shadow:#ccc 0 0 6px;box-shadow:#ccc 0 0 6px;background:#fff;outline:0}.ui-datepicker .ui-widget-content{background:#eee;color:#222222}.ui-datepicker .ui-widget-content a{color:#444}.ui-datepicker .ui-widget-header{padding:2px 0;height:25px;background:#cccccc;color:#222222;font-weight:bold}.ui-datepicker .ui-widget-header a{color:#444}.ui-datepicker .ui-datepicker-header{position:relative;padding:.2em 0;border:1px solid #bdbdbd}.ui-datepicker .ui-datepicker-prev,.ui-datepicker .ui-datepicker-next{position:absolute;top:4px;width:20px;height:30px;background-color:transparent;background-position:50% 50%;background-repeat:no-repeat;cursor:pointer}.ui-datepicker .ui-datepicker-prev span,.ui-datepicker .ui-datepicker-next span{display:none}.ui-datepicker .ui-datepicker-prev{left:2px;background-position:0 -3049px}.ui-datepicker .ui-datepicker-prev:hover,.ui-datepicker .ui-datepicker-prev.ui-datepicker-prev-hover{background-position:0 -3092px}.ui-datepicker .ui-datepicker-next{right:4px;background-position:0 -2963px}.ui-datepicker .ui-datepicker-next:hover,.ui-datepicker .ui-datepicker-next.ui-datepicker-next-hover{background-position:0 -3006px}.ui-datepicker .ui-datepicker-prev-hover{left:2px;border:none}.ui-datepicker .ui-datepicker-next-hover{right:4px;border:none}.ui-datepicker .ui-datepicker-title{margin:3px 27px 2px;line-height:1.8em;text-align:center}.ui-datepicker .ui-datepicker-title select{float:left;font-size:1em;margin:-3px 0 -1px !important;padding:4px 3px 4px 2px;min-width:30px;border:1px solid #bbb}.ui-datepicker .ui-datepicker-title select.ui-datepicker-month-year{width:100%}.ui-datepicker .ui-datepicker-title select.ui-datepicker-month,.ui-datepicker .ui-datepicker-title select.ui-datepicker-year{width:49%}.ui-datepicker .ui-datepicker-title select.ui-datepicker-year{float:right}@media screen and (-webkit-min-device-pixel-ratio: 0){.ui-datepicker .ui-datepicker-title select,.ui-datepicker .ui-datepicker-title select:focus{padding:4px 28px 4px 5px;-webkit-appearance:textfield;background-image:url("../images/icons/form-select.png");background-position:100% 50%;background-repeat:no-repeat}}.ui-datepicker table{width:100%;font-size:11px;margin:0 0 2px;border:0}.ui-datepicker table th{padding:5px 0;text-align:center;color:#888;font-weight:bold;border:0;background:transparent}.ui-datepicker table td{min-width:25px;border:0;padding:1px}.ui-datepicker table td span,.ui-datepicker table td a{padding:3px 0 3px;margin:0 !important;text-align:center;display:block;color:#444;font-size:11px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.ui-datepicker table td span.ui-state-default,.ui-datepicker table td a.ui-state-default{color:#444;border-color:#ccc}.ui-datepicker table td span.ui-state-hover,.ui-datepicker table td a.ui-state-hover{color:#fff !important;border-color:transparent !important;background:#444 !important}.ui-datepicker table td span.ui-state-active,.ui-datepicker table td a.ui-state-active{background:#fff}.ui-datepicker table td span.ui-state-highlight,.ui-datepicker table td a.ui-state-highlight{border-color:#bababa;background:#d6d6d6}.ui-datepicker .ui-datepicker-buttonpane{position:relative;float:left;clear:both;background-image:none;width:100%;margin:5px 0 1px;padding:0;border:0}.ui-datepicker .ui-datepicker-buttonpane button{float:left;margin:3px 0;padding:4px 5px 5px;height:25px;color:#aaa;font-size:11px;border:1px solid #c7c7c7;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:transparent;cursor:pointer}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current{float:right;opacity:1 !important;color:#444;font-weight:bold;background:#cee9f2}.ui-datepicker .ui-datepicker-buttonpane button.ui-datepicker-current.ui-state-hover{color:#fff !important;border-color:#444 !important;background:#444 !important}.ui-datepicker.ui-datepicker-multi{width:auto}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group{float:left}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group table{width:95%;margin:0 auto .4em}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group-first .ui-datepicker-title{margin-right:5px !important}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group-first table{margin-right:5px !important}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group-middle .ui-datepicker-title{margin-right:5px !important;margin-left:5px !important}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group-middle table{margin-right:5px !important;margin-left:3px !important}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group-last .ui-datepicker-title{margin-left:5px !important}.ui-datepicker.ui-datepicker-multi .ui-datepicker-group-last table{margin-left:5px !important}.ui-datepicker.ui-datepicker-multi .ui-datepicker-buttonpane{border:none}.ui-datepicker.ui-datepicker-multi-2 .ui-datepicker-group{width:50%}.ui-datepicker.ui-datepicker-multi-3 .ui-datepicker-group{width:33.3%}.ui-datepicker.ui-datepicker-multi-4 .ui-datepicker-group{width:25%}.ui-datepicker-row-break{clear:both;width:100%;font-size:0em}.ui-datepicker-append{margin-left:6px;color:#999;font-size:10px}.ui-datepicker td.ui-state-disabled{padding:1px;text-align:center}.ui-datepicker td.ui-state-disabled span{background:#ccc;color:#555 !important;font-weight:bold;font-size:11px;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}button.ui-datepicker-close{float:left !important;margin-right:4px !important}#ui-timepicker{position:absolute;display:none;margin:-1px 0 0 !important;padding:5px 3px 3px 5px;width:216px;font-size:12px;border:1px solid #888;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#eee;-moz-box-shadow:0 10px 50px #333;-webkit-box-shadow:0 10px 50px #333;box-shadow:0 10px 50px #333}#ui-timepicker input,#ui-timepicker select,#ui-timepicker textarea,#ui-timepicker button{margin:0;padding:2px 5px;height:25px;font-family:Arial,sans-serif;font-size:12px;line-height:14px;font-weight:bold;color:#555;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#fdfdfd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 1px 3px 0 #eee;-webkit-box-shadow:inset 0 1px 3px 0 #eee;box-shadow:inset 0 1px 3px 0 #eee;overflow:hidden;vertical-align:middle}#ui-timepicker input:focus,#ui-timepicker input.grp-state-focus,#ui-timepicker select:focus,#ui-timepicker select.grp-state-focus,#ui-timepicker textarea:focus,#ui-timepicker textarea.grp-state-focus,#ui-timepicker button:focus,#ui-timepicker button.grp-state-focus{border:1px solid #aaa;-moz-box-shadow:#ccc 0 0 6px;-webkit-box-shadow:#ccc 0 0 6px;box-shadow:#ccc 0 0 6px;background:#fff;outline:0}#ui-timepicker .ui-widget-content{background:#eee;color:#222222}#ui-timepicker .ui-widget-content a{color:#444}#ui-timepicker .ui-widget-header{padding:2px 0;height:25px;background:#cccccc;color:#222222;font-weight:bold}#ui-timepicker .ui-widget-header a{color:#444}#ui-timepicker ul{position:relative;float:left;clear:both;width:auto}#ui-timepicker ul li.row{position:relative;float:left;display:block;margin:0 2px 2px 0;padding:2px 10px 1px;width:30px;font-size:11px;text-align:center;border:0;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;cursor:pointer}#ui-timepicker ul li.row.ui-state-default{color:#444;border:1px solid #c7c7c7 !important;background:#e1f0f5}#ui-timepicker ul li.row.ui-state-default:hover{color:#fff;border:1px solid #666 !important;background:#444}#ui-timepicker ul li.row.ui-state-active{border:1px solid #bababa !important;background:#d6d6d6}.ui-menu{z-index:1000;display:block;margin:0;padding:2px;list-style:none}.ui-menu li:first-child span{display:block;padding:1px 4px;color:#888;font-weight:bold}.ui-menu li:first-child+li{margin-top:3px}.ui-menu li>span.error{display:block;margin:0;padding:5px 5px 5px;color:#bf3030}.ui-menu li.ui-menu-item{margin:0;padding:0;width:100%}.ui-menu li.ui-menu-item a{display:block;margin:0 !important;padding:3px 4px;color:#444;font-weight:bold !important;border:1px solid #c7c7c7;-moz-border-radius:2px;-webkit-border-radius:2px;border-radius:2px;background:#cee9f2;cursor:pointer}.ui-menu li.ui-menu-item a:hover,.ui-menu li.ui-menu-item a.ui-state-hover,.ui-menu li.ui-menu-item a.ui-state-focus,.ui-menu li.ui-menu-item a.ui-state-active{color:#fff;border:1px solid #333;background:#444}.ui-menu li.ui-menu-item+li.ui-menu-item{margin-top:2px;border-top:0 !important}.ui-menu .ui-menu{margin-top:-3px}.ui-autocomplete{position:absolute;cursor:default;margin:-1px 0 0 !important;padding:3px;font-size:12px;border:1px solid #888;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#eee;-moz-box-shadow:0 10px 50px #333;-webkit-box-shadow:0 10px 50px #333;box-shadow:0 10px 50px #333;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px}.ui-autocomplete input,.ui-autocomplete select,.ui-autocomplete textarea,.ui-autocomplete button{margin:0;padding:2px 5px;height:25px;font-family:Arial,sans-serif;font-size:12px;line-height:14px;font-weight:bold;color:#555;border:1px solid #ccc;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#fdfdfd;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;-moz-box-shadow:inset 0 1px 3px 0 #eee;-webkit-box-shadow:inset 0 1px 3px 0 #eee;box-shadow:inset 0 1px 3px 0 #eee;overflow:hidden;vertical-align:middle}.ui-autocomplete input:focus,.ui-autocomplete input.grp-state-focus,.ui-autocomplete select:focus,.ui-autocomplete select.grp-state-focus,.ui-autocomplete textarea:focus,.ui-autocomplete textarea.grp-state-focus,.ui-autocomplete button:focus,.ui-autocomplete button.grp-state-focus{border:1px solid #aaa;-moz-box-shadow:#ccc 0 0 6px;-webkit-box-shadow:#ccc 0 0 6px;box-shadow:#ccc 0 0 6px;background:#fff;outline:0}.ui-autocomplete .ui-widget-content{background:#eee;color:#222222}.ui-autocomplete .ui-widget-content a{color:#444}.ui-autocomplete .ui-widget-header{padding:2px 0;height:25px;background:#cccccc;color:#222222;font-weight:bold}.ui-autocomplete .ui-widget-header a{color:#444}* html .ui-autocomplete{width:1px}body{position:relative;float:left;clear:both;overflow:hidden;*zoom:1;padding:0;width:100%;height:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;background:#fff;overflow:visible}.grp-column.grp-centered{position:relative;display:block;float:none !important;margin:0 auto !important}.grp-span-fluid{float:none;display:table-cell;width:10000px}body.grp-login #grp-header,body.grp-login #grp-context-navigation,body.grp-login #grp-content-title{display:none}body.grp-login #grp-content{top:140px}body.grp-login .grp-module-login{border:0 !important;-moz-border-radius:6px;-webkit-border-radius:6px;border-radius:6px;background:#222 !important}body.grp-login .grp-module-login>.grp-row{padding:10px;border-top:1px solid #333 !important;border-bottom:1px solid #000 !important}body.grp-login .grp-module-login>.grp-row label{color:#fff}body.grp-login .grp-module-login h1{font-size:18px;padding:35px 0 0;border:1px solid #111;border-bottom:0;-moz-border-radius-topleft:4px;-webkit-border-top-left-radius:4px;border-top-left-radius:4px;-moz-border-radius-topright:4px;-webkit-border-top-right-radius:4px;border-top-right-radius:4px;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMzMzMzMyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzIyMjIyMiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #333333),color-stop(100%, #222222));background-image:-moz-linear-gradient(#333333,#222222);background-image:-webkit-linear-gradient(#333333,#222222);background-image:linear-gradient(#333333,#222222)}body.grp-login .grp-module-login h1 span{display:block;margin:0;color:#eee}body.grp-login .grp-module-login h1 span.grp-admin-title{padding:5px 10px 7px;font-weight:bold}body.grp-login .grp-module-login h1 span.grp-admin-title a{color:#eee}body.grp-login .grp-module-login h1 span.grp-admin-title a:hover{color:#4fb2d3}body.grp-login .grp-module-login h1 span.grp-current-page{margin:0 -1px;padding:5px 11px 4px;border-top:0;border-bottom:0;border-left:1px solid #2c8eaf;border-right:1px solid #2c8eaf;color:#fff;font-size:13px;font-weight:bold;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzRmYjJkMyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzMwOWJiZiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #4fb2d3),color-stop(100%, #309bbf));background-image:-moz-linear-gradient(#4fb2d3,#309bbf);background-image:-webkit-linear-gradient(#4fb2d3,#309bbf);background-image:linear-gradient(#4fb2d3,#309bbf)}body.grp-login .grp-module-login h1+.grp-row{border:0;border-top:1px solid #333}body.grp-login .grp-module-login .grp-module{border:1px solid #ccc;border-top:1px solid #f6f6f6;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}body.grp-login .grp-module-login .grp-module .grp-row{padding-bottom:12px}body.grp-login .grp-module-login .grp-module .grp-row:first-child{border-top:0}body.grp-login .grp-module-login .grp-module .grp-row.grp-connected{margin-top:-5px;padding-top:0;border-top:1px solid #eee;background:#eee}body.grp-login .grp-module-login .grp-module .grp-row.grp-error-row{margin:0 -1px;padding:0;border-left:1px solid #af2c2c;border-right:1px solid #af2c2c;border-bottom:1px solid #ab2b2b;border-top:1px solid #ce3b3b;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}body.grp-login .grp-module-login .grp-module .grp-row.grp-error-row:first-child{margin-top:-1px;border-top:0;-moz-border-radius-topleft:0;-webkit-border-top-left-radius:0;border-top-left-radius:0;-moz-border-radius-topright:0;-webkit-border-top-right-radius:0;border-top-right-radius:0}body.grp-login .grp-module-login .grp-module label{margin:0 0 4px}body.grp-login .grp-module-login .grp-module label:first-child{margin-top:-2px}body.grp-login .grp-module-login .grp-module .grp-description{margin:3px 0 -3px;font-size:13px;line-height:15px}body.grp-login .grp-module-login .grp-module ul.errorlist{margin:5px 0 0;padding:0}body.grp-login .grp-module-login .grp-module ul.errorlist:last-child{margin-bottom:-2px}body.grp-login .grp-module-login .grp-module .errornote{margin:0;padding:9px 10px 7px;font-size:13px;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0}body.grp-login .grp-module-login .grp-module .errornote+.errornote{margin-top:-3px;padding-top:0}body.grp-login .grp-module.grp-submit-row,body.grp-login .grp-module.grp-submit-row ul{padding:0;border:0;background:transparent}body.grp-login .grp-module.grp-submit-row li,body.grp-login .grp-module.grp-submit-row ul li{float:right;background:transparent}header#grp-header{position:fixed;z-index:1000;float:left;clear:both;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}header#grp-header #grp-navigation{position:relative;float:left;clear:both;width:100%;padding:0 20px;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMzMzMzMyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzIyMjIyMiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #333333),color-stop(100%, #222222));background-image:-moz-linear-gradient(#333333,#222222);background-image:-webkit-linear-gradient(#333333,#222222);background-image:linear-gradient(#333333,#222222);overflow:hidden;*zoom:1;overflow:visible}header#grp-header #grp-navigation div#grp-branding{position:relative;float:left;margin:0 10px 0 -20px;max-height:36px;overflow:hidden}header#grp-header #grp-navigation h1#grp-admin-title{position:relative;float:left;margin:0;padding:10px 0;font-size:12px;line-height:16px}header#grp-header #grp-navigation a{color:#4fb2d3}header#grp-header #grp-navigation a:hover{color:#fff}header#grp-header #grp-navigation ul li.grp-collapse{position:relative;z-index:1000}header#grp-header #grp-navigation ul li.grp-collapse>ul{display:none}header#grp-header #grp-navigation ul li.grp-collapse.grp-open>ul{position:absolute;z-index:1010;display:block;margin:-1px 0 0 -1px;width:202px;border-top:1px solid #090909;-moz-border-radius-bottomleft:3px;-webkit-border-bottom-left-radius:3px;border-bottom-left-radius:3px;-moz-border-radius-bottomright:3px;-webkit-border-bottom-right-radius:3px;border-bottom-right-radius:3px;background:#222}header#grp-header #grp-navigation ul li.grp-collapse.grp-open>ul li{border-top:1px solid #3c3c3c;border-bottom:1px solid #090909}header#grp-header #grp-navigation ul li.grp-collapse.grp-open>ul li:last-child{border-bottom:0}header#grp-header #grp-navigation ul li.grp-collapse.grp-open>ul li a{display:block;padding:5px 10px}header#grp-header #grp-navigation ul#grp-user-tools{margin:0 -10px 0 0;border-left:1px solid #090909}header#grp-header #grp-navigation ul#grp-user-tools>li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:0;padding-right:0;border-left:1px solid #343434;border-right:1px solid #090909}header#grp-header #grp-navigation ul#grp-user-tools>li:first-child{padding-left:0}header#grp-header #grp-navigation ul#grp-user-tools>li:last-child{padding-right:0}header#grp-header #grp-navigation ul#grp-user-tools>li.last{padding-right:0}header#grp-header #grp-navigation ul#grp-user-tools>li.grp-user-options-container{width:200px}header#grp-header #grp-navigation ul#grp-user-tools>li.grp-user-options-container:last-child{margin-right:11px}header#grp-header #grp-navigation ul#grp-user-tools>li:last-child{border-right:0}header#grp-header #grp-navigation ul#grp-user-tools>li a{display:block;padding:10px}header#grp-header #grp-user-tools{position:relative;float:right;font-weight:bold}#grp-content{position:relative;float:left;clear:both;top:80px;padding:0 20px 120px;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}body.grp-change-form #grp-content-container>form,body.grp-change-form #grp-content-container>form>div{position:relative;float:left;clear:both}#grp-context-navigation{position:relative;float:left;clear:both;width:100%;font-weight:bold;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;border-bottom:1px solid #ccc;background:#eee}#grp-breadcrumbs{float:left}#grp-breadcrumbs>ul{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;padding:5px 20px;text-shadow:0 1px 0 #f5f5f5}#grp-breadcrumbs>ul li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:5px;padding-right:5px}#grp-breadcrumbs>ul li:first-child{padding-left:0}#grp-breadcrumbs>ul li:last-child{padding-right:0}#grp-breadcrumbs>ul li.last{padding-right:0}#grp-breadcrumbs>ul a{display:block;padding-right:15px;background-position:100% -262px}#grp-breadcrumbs>ul a:hover,#grp-breadcrumbs>ul a.breadcrumbs-hover{background-position:100% -306px}#grp-breadcrumbs>ul a:hover{background-position:100% -306px}#grp-page-tools{float:right;right:20px}#grp-page-tools #grp-toc-handler{display:none}#grp-page-tools #grp-toc-content{display:none}#grp-page-tools ul{margin:0;padding:0;border:0;overflow:hidden;*zoom:1;padding:0 20px;overflow:visible}#grp-page-tools ul li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:left;padding-left:5px;padding-right:5px}#grp-page-tools ul li:first-child{padding-left:0}#grp-page-tools ul li:last-child{padding-right:0}#grp-page-tools ul li.last{padding-right:0}#grp-page-tools ul li{position:relative;padding:1px 0 0}#grp-page-tools ul li a{display:block;padding:4px 5px 4px 0}#grp-page-tools ul li a.grp-tool{padding:0;width:18px;height:24px}#grp-page-tools ul li a#grp-open-all{background-position:0 -2523px}#grp-page-tools ul li a#grp-open-all:hover,#grp-page-tools ul li a#grp-open-all.tools-open-handler-hover{background-position:0 -2567px}#grp-page-tools ul li a#grp-close-all{background-position:0 -2215px}#grp-page-tools ul li a#grp-close-all:hover,#grp-page-tools ul li a#grp-close-all.tools-close-handler-hover{background-position:0 -2259px}.grp-messagelist{position:relative;float:none;clear:both;padding:0 0 20px;width:100%;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box}.grp-messagelist li{font-weight:bold;padding:5px 10px;border:1px solid #8ccde2;-moz-border-radius:3px;-webkit-border-radius:3px;border-radius:3px;background:#b5deec}.grp-messagelist li.grp-success{border:1px solid #b7e28c;background:#d1ecb5}.grp-messagelist li.grp-warning{border:1px solid #f3d988;background:#f8e8b7}.grp-messagelist li.grp-error{border:1px solid #e7a1a1;background:#ecb5b5}.grp-messagelist li+li{margin-top:2px}.grp-submit-row{padding:0;border:0;-moz-border-radius:0;-webkit-border-radius:0;border-radius:0;background:transparent;min-width:auto}.grp-submit-row>ul{margin-top:10px;overflow:visible}.grp-submit-row>ul>li{list-style-image:none;list-style-type:none;margin-left:0;white-space:nowrap;float:right;padding-left:0;padding-right:0;margin-left:10px;-moz-border-radius:7px;-webkit-border-radius:7px;border-radius:7px}.grp-submit-row>ul>li:first-child{padding-right:0}.grp-submit-row>ul>li:last-child{padding-left:0}.grp-submit-row>ul>li.last{padding-left:0}.grp-submit-row>ul>li.grp-float-left{margin-left:0;margin-right:10px}.grp-submit-row>ul>li input[type=button]{margin:0;width:auto;display:block}.grp-submit-row>ul>li input.grp-button,.grp-submit-row>ul>li a.grp-button,.grp-submit-row>ul>li button.grp-button{filter:progid:DXImageTransform.Microsoft.Alpha(Opacity=75);opacity:0.75}.grp-submit-row>ul>li input.grp-button.grp-default,.grp-submit-row>ul>li a.grp-button.grp-default,.grp-submit-row>ul>li button.grp-button.grp-default{filter:progid:DXImageTransform.Microsoft.Alpha(enabled=false);opacity:1}.grp-submit-row>ul>li input.grp-button:hover,.grp-submit-row>ul>li input.grp-button:focus,.grp-submit-row>ul>li a.grp-button:hover,.grp-submit-row>ul>li a.grp-button:focus,.grp-submit-row>ul>li button.grp-button:hover,.grp-submit-row>ul>li button.grp-button:focus{filter:progid:DXImageTransform.Microsoft.Alpha(enabled=false);opacity:1}.grp-submit-row>ul>li button.grp-button{width:auto}.grp-submit-row>ul>li .grp-button{-moz-box-shadow:0 0 10px #bbb;-webkit-box-shadow:0 0 10px #bbb;box-shadow:0 0 10px #bbb}.grp-submit-row.grp-fixed-footer>ul{margin-top:0}.grp-submit-row.grp-fixed-footer>ul>li{margin-bottom:5px;padding:5px !important;background:#444}.grp-submit-row.grp-fixed-footer>ul>li .grp-button{-moz-box-shadow:none;-webkit-box-shadow:none;box-shadow:none}.grp-fixed-footer{position:fixed;z-index:900;float:left;bottom:0;left:0;margin:0;padding:10px 20px 5px;width:100%;border:0;-moz-box-sizing:border-box;-webkit-box-sizing:border-box;box-sizing:border-box;color:#fff;background-image:url('data:image/svg+xml;base64,PD94bWwgdmVyc2lvbj0iMS4wIiBlbmNvZGluZz0idXRmLTgiPz4gPHN2ZyB2ZXJzaW9uPSIxLjEiIHhtbG5zPSJodHRwOi8vd3d3LnczLm9yZy8yMDAwL3N2ZyI+PGRlZnM+PGxpbmVhckdyYWRpZW50IGlkPSJncmFkIiBncmFkaWVudFVuaXRzPSJvYmplY3RCb3VuZGluZ0JveCIgeDE9IjAuNSIgeTE9IjAuMCIgeDI9IjAuNSIgeTI9IjEuMCI+PHN0b3Agb2Zmc2V0PSIwJSIgc3RvcC1jb2xvcj0iIzMzMzMzMyIvPjxzdG9wIG9mZnNldD0iMTAwJSIgc3RvcC1jb2xvcj0iIzIyMjIyMiIvPjwvbGluZWFyR3JhZGllbnQ+PC9kZWZzPjxyZWN0IHg9IjAiIHk9IjAiIHdpZHRoPSIxMDAlIiBoZWlnaHQ9IjEwMCUiIGZpbGw9InVybCgjZ3JhZCkiIC8+PC9zdmc+IA==');background-size:100%;background-image:-webkit-gradient(linear, 50% 0%, 50% 100%, color-stop(0%, #333333),color-stop(100%, #222222));background-image:-moz-linear-gradient(#333333,#222222);background-image:-webkit-linear-gradient(#333333,#222222);background-image:linear-gradient(#333333,#222222)}body.grp-popup #grp-navigation{display:none}body.grp-popup #grp-breadcrumbs{top:0}body.grp-popup #grp-content{top:20px}@media only screen and (max-device-width: 600px) and (max-device-height: 600px){html header#grp-header{position:static;width:100%;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}html #grp-content{top:0;padding-bottom:0}html .grp-fixed-footer{position:static;padding-left:20px;padding-right:20px;width:100%;margin:60px -20px 0 -20px;-moz-box-sizing:content-box;-webkit-box-sizing:content-box;box-sizing:content-box}}
diff --git a/static/grappelli/tinymce/changelog.txt b/static/grappelli/tinymce/changelog.txt
new file mode 100644
index 0000000..69b7ae5
--- /dev/null
+++ b/static/grappelli/tinymce/changelog.txt
@@ -0,0 +1,477 @@
+Version 3.5.8 (2012-11-20)
+ Fixed bug where html5 data attributes where stripped from contents.
+ Fixed bug where toolbar was annouced multiple times with JAWS on Firefox.
+ Fixed bug where the editor view whouldn't scroll to BR elements when using shift+enter or br enter mode.
+ Fixed bug where a JS error would be thrown when trying to paste table rows then the rows clipboard was empty.
+ Fixed bug with auto detection logic for youtube urls in the media plugin.
+ Fixed bug where the formatter would throw errors if you used the jQuery version of TinyMCE and the latest jQuery.
+ Fixed bug where the latest WebKit versions would produce span elements when deleting text between blocks.
+ Fixed bug where the autolink plugin would produce DOM exceptions when pressing shift+enter inside a block element.
+ Fixed bug where toggling of blockquotes when using br enter mode would produce an exception.
+ Fixed bug where focusing out of the body of the editor wouldn't properly add an undo level.
+ Fixed issue with warning message being displayed on IE 9+ about the meta header fix for IE 8.
+Version 3.5.7 (2012-09-20)
+ Changed table row properties dialog to not update multiple rows when row type is header or footer.
+ Fixed bug in hyperlink dialog for IE9 where links with no target attr set had target value of --
+ Changing toolbars to have a toolbar role for FF keyboard navigation works correctly.
+ Fixed bug where applying formatting to an empty block element would produce redundant spans.
+ Fixed bug where caret formatting on IE wouldn't properly apply if you pressed enter/return.
+ Fixed bug where loading TinyMCE using an async script wouldn't properly initialize editors.
+ Fixed bug where some white space would be removed after inline elements before block elements.
+ Fixed bug where it wouldn't properly parse attributes with a single backslash as it's contents.
+ Fixed bug where noscript elements would loose it's contents on older IE versions.
+ Fixed bug where backspace inside empty blockquote wouldn't delete it properly.
+ Fixed bug where custom elements with . in their names wouldn't work properly.
+ Fixed bug where the custom_elements option didn't properly setup the block elements schema structure.
+ Fixed bug where the custom_elements option didn't auto populate the extended_valid_elements.
+ Fixed bug where the whole TD element would get blcok formatted when there where BR elements in it.
+ Fixed bug where IE 9 might crash if the editor was hidden and specific styles where applied to surrounding contents.
+ Fixed bug where shift+enter inside a table cell on Gecko would produce an zero width non breaking space between tr:s.
+ Fixed bug where the advlink dialog wouldn't properly populate the anchors dropdown if the HTML5 schema was used.
+ Fixed issue with missing autofocus attribute on input element when using the HTML5 schema.
+ Fixed issue where enter inside a block contained within an LI element wouldn't produce a new LI.
+Version 3.5.6 (2012-07-26)
+ Added "text" as a valid option to the editor.getContent format option. Makes it easier to get a text representation of the editor contents.
+ Fixed bug where resizing an image to less that 0x0 pixels would display the ghost image at an incorrect position.
+ Fixed bug where the remove format button would produce extra paragraphs on WebKit if all of the contents was selected.
+ Fixed issue where edge resize handles on images of wouldn't scale it with the same aspect ratio.
+ Fixed so force_p_newlines option works again since some users want mixed mode paragraphs.
+ Fixed so directionality plugin modifies the dir attribute of all selected blocks in the editor.
+ Fixed bug where backspace/delete of a custom element would move it's attributes to the parent block on Gecko.
+Version 3.5.5 (2012-07-19)
+ Added full resize support for images and tables on WebKit/Opera. It now behaves just like Gecko.
+ Added automatic embed support for Vimeo, Stream.cz and Google Maps in media plugin. Patch contributed by Jakub Matas.
+ Fixed bug where the lists plugin wouldn't properly remove all li elements when toggling selected items of. Patched by Taku AMANO.
+ Fixed bug where the lists plugin would remove the entire list if you pressed deleted at the beginning of the first element. Patched by Taku AMANO.
+ Fixed bug where the ordered/unordered list buttons could both be enabled if you nested lists. Patch contributed by Craig Petchell.
+ Fixed bug where shift+enter wouldn't produce a BR in a LI when having forced_root_blocks set to false.
+ Fixed bug where scrollbars aren't visible in fullscreen when window is resized.
+ Fixed bug with updating the border size using the advimage dialog on IE 9.
+ Fixed bug where the selection of inner elements on IE 8 in contentEditable mode would select the whole parent element.
+ Fixed bug where the enter key would produce an empty anchor if you pressed it at the space after a link on IE.
+ Fixed bug where autolink plugin would produce an exception for specific html see bug #5365
+ Fixed so the formatChanged function takes an optional "similar" parameter to use while matching the format.
+Version 3.5.4.1 (2012-06-24)
+ Fixed issue with Shift+A selecting all contents on Chrome.
+Version 3.5.4 (2012-06-21)
+ Added missing mouse events to HTML5 schema. Some events needs to be manually defined though since the spec is huge.
+ Added image resizing for WebKit browsers by faking the whole resize behavior.
+ Fixed bug in context menu plugin where listener to hide menu wasn't removed correctly.
+ Fixed bug where media plugin wouldn't use placeholder size for the object/video elements.
+ Fixed bug where jQuery plugin would break attr function in jQuery 1.7.2.
+ Fixed bug where jQuery plugin would throw an error if you used the tinymce pseudo selector when TinyMCE wasn't loaded.
+ Fixed so encoding option gets applied when using jQuery val() or attr() to extract the contents.
+ Fixed so any non valid width/height passed to media plugin would get parsed to proper integer or percent values.
+Version 3.5.3 (2012-06-19)
+ Added missing wbr element to HTML5 schema.
+ Added new mceToggleFormat command. Enabled you to toggle a specific format on/off.
+ Fixed bug where undo/redo state didn't update correctly after executing an execCommand call.
+ Fixed bug where the editor would get auto focused on IE running in quirks mode.
+ Fixed bug where pressing enter before an IMG or INPUT element wouldn't properly split the block.
+ Fixed bug where backspace would navigate back when selecting control types on IE.
+ Fixed bug where the editor remove method would unbind events for controls outside the editor instance UI.
+ Fixed bug where the autosave plugin would try to store a draft copy of editors that where removed.
+ Fixed bug where floated elements wouldn't expand the block created when pressing enter on non IE browsers.
+ Fixed bug where the caret would be placed in the wrong location when pressing enter at the beginning of a block.
+ Fixed bug where it wasn't possible to block events using the handle_event_callback option.
+ Fixed bug where keyboard navigation of the ColorSplitButton.js didn't work correctly.
+ Fixed bug where keyboard navigation didn't work correctly on split buttons.
+ Fixed bug where the legacy Event.add function didn't properly handle multiple id:s passed in.
+ Fixed bug where the caret would disappear on IE when selecting all contents and pressing backspace/delete.
+ Fixed bug where the getStart/getEnd methods would sometimes return elements from the wrong document on IE.
+ Fixed so paragraphs gets created if you press enter inside a form element.
+Version 3.5.2 (2012-05-31)
+ Added new formatChanged method to tinymce.Formatter class. Enables easier state change handling of formats.
+ Added new selectorChanged method to tinymce.dom.Selection class. Enables easier state change handling of matching CSS selectors.
+ Changed the default theme to be advanced instead of simple since most users uses the advanced theme.
+ Changed so the theme_advanced_buttons doesn't have a default set if one button row is specified.
+ Changed the theme_advanced_toolbar_align default value to "left".
+ Changed the theme_advanced_toolbar_location default value to "top".
+ Changed the theme_advanced_statusbar_location default value to "bottom".
+ Fixed bug where the simple link dialog would remove class and target attributes from links when updating them if the drop downs wasn't visible.
+ Fixed bug where the link/unlink buttons wouldn't get disabled once a link was created by the autolink plugin logic.
+ Fixed bug where the border attribute was missing in the HTML5 schema.
+ Fixed bug where the legacyoutput plugin would use inline styles for font color.
+ Fixed bug where editing of anchor names wouldn't produce an undo level.
+ Fixed bug where the table plugin would delete the last empty block element in the editor.
+ Fixed bug where pasting table rows when they where selected would make it impossible to editor that table row.
+ Fixed bug with pressing enter in IE while having a select list focused would produce a JS error.
+ Fixed bug where it wasn't possible to merge table cells by selecting them and using merge from context menu.
+ Removed summary from HTML5 table attributes and fixed so this and other deprecated table fields gets hidden in the table dialog.
+Version 3.5.1.1 (2012-05-25)
+ Fixed bug with control creation where plugin specific controls didn't work as expected.
+Version 3.5.1 (2012-05-25)
+ Added new onBeforeAdd event to UndoManager patch contributed by Dan Rumney.
+ Added support for overriding the theme rendering logic by using a custom function.
+ Fixed bug where links wasn't automatically created by the autolink plugin on old IE versions when pressing enter in BR mode.
+ Fixed bug where enter on older IE versions wouldn't produce a new paragraph if the previous sibling paragraph was empty.
+ Fixed bug where toString on a faked DOM range on older IE versions wouldn't return a proper string.
+ Fixed bug where named anchors wouldn't work properly when schema was set to HTML5.
+ Fixed bug where HTML5 datalist options wasn't correctly parsed or indented.
+ Fixed bug where linking would add anchors around block elements when the HTML5 schema was used.
+ Fixed issue where the autolink plugin wouldn't properly handle mailto:user@domain.com.
+ Optimized initialization and reduced rendering flicker by hiding the target element while initializing.
+Version 3.5.0.1 (2012-05-10)
+ Fixed bug where selection normalization logic would break the selections of parent elements using the element path.
+ Fixed bug where the autolink plugin would include trailing dots in domain names in the link creation.
+ Fixed bug where the autolink plugin would produce an error on older IE versions when pressing enter.
+ Fixed bug where old IE versions would throw an error during initialization when the editor was placed in an size restricted div.
+Version 3.5 (2012-05-03)
+ Fixed menu rendering issue if the document was in rtl mode.
+ Fixed bug where the hide function would throw an error about a missing variable.
+ Fixed bug where autolink wouldn't convert URLs when hitting enter on IE due to the new enter key logic.
+ Fixed bug where formatting using shortcuts like ctrl+b wouldn't work properly the first time.
+ Fixed bug where selection.setContent after a formatter call wouldn't generate formatted contents.
+ Fixed bug where whitespace would be removed before/after invalid_elements when they where removed.
+ Fixed bug where updating styles using the theme image dialog in non inline mode on IE9 would produce errors.
+ Fixed bug where IE 8 would produce an error when using the contextmenu plugin.
+ Fixed bug where delete/backspace could remove contents of noneditable elements.
+ Fixed so background color in style preview gets computed from body element if the current style element is transparent.
+Version 3.5b3 (2012-03-29)
+ Added cancel button to colour picker dialog.
+ Added figure and figcaption to the html5 visualblocks plugin.
+ Added default alignment options for the figure element.
+ Fixed bug where empty inline elements within block elements would sometimes produce a br child element.
+ Fixed bug where urls pointing to the same domain as the current one would cause undefined errors. Patch contributed by Paul Giberson.
+ Fixed bug where enter inside an editable element inside an non editable element would split the element.
+ Fixed bug where cut/copy/paste of noneditable elements didn't work.
+ Fixed bug where backspace would sometimes produce font elements on WebKit.
+ Fixed bug where WebKit would produce spans out of various inline elements when using backspace.
+ Fixed bug where IE9 wouldn't properly update image styles when images where resized.
+ Fixed bug where drag/drop of noneditable elements didn't work correctly.
+ Fixed bug where applying formatting to all contents wouldn't work correctly when an end point was inside an empty bock. Patch contributed by Jose Luiz.
+ Fixed bug where IE10 removed the scopeName from the DOM element interface and there for it produced an undefined string in element path.
+ Fixed bug where the caret would be placed at an incorrect location if you applied block formatting while having the caret at the end of the block.
+ Fixed bug where applying column changes using the cell dialog would only update the first column. Patch contributed by krzyko.
+ Fixed bug where the visualblocks plugin would force editor focus if it was turned on by default.
+ Fixed bug where the tabfocus plugin would tab to iframes these are now ignored.
+ Fixed bug where format drop down list wouldn't show the currently active format for a parent element.
+ Fixed bug where paste of plain text in IE 9 would remove the new line characters from text.
+ Fixed bug where the menu buttons/split button menus wouldn't be opened at the right location on older IE versions.
+ Fixed bug where Gecko browsers wouldn't properly display the right format when having the selection as specific places.
+ Fixed bug where shift+enter inside the body when having forced_root_blocks set to false would throw an error.
+ Fixed bug where the jQuery plugin would break the attr method of jQuery 1.7.2. Patch contributed by Markus Kemmerling.
+ Fixed so options like content_css accepts and array as well as a comma separated string as input.
+ Restructured the internal logic to make it more separate from Editor.js.
+ Updated the Sizzle engine to the latest version.
+Version 3.5b2 (2012-03-15)
+ Rewrote the enter key logic to normalize browser behavior.
+ Fixed so enter within PRE elements produces a BR and shift+enter breaks/end the PRE. Can be disabled using the br_in_pre option.
+ Fixed bug where the selection wouldn't be correct after applying formatting and having the caret at the end of the new format node.
+ Fixed bug where the noneditable plugin would process contents on raw input calls for example on undo/redo calls.
+ Fixed bug where WebKit could produce an exception when a bookmark was requested when there wasn't a proper selection.
+ Fixed bug where WebKit would fail to open the image dialog since it would be returning false for a class name instead of a string.
+ Fixed so alignment and indentation works properly when forced_root_blocks is set to false. It will produce a DIV by default.
+Version 3.5b1 (2012-03-08)
+ Added new event class that is faster and enables support for faking events.
+ Added new self_closing_elements, short_ended_elements, boolean_attributes, non_empty_elements and block_elements options to control the HTML Schema.
+ Added new schema option and support for the HTML5 schema.
+ Added new visualblocks plugin that shows html5 blocks with visual borders.
+ Added new types and selector options to make it easier to create editor instances with different configs.
+ Added new preview of formatting options in various listboxes.
+ Added new preview_styles option that enables control over what gets previewed.
+ Fixed bug where content css would be loaded twice into iframe.
+ Fixed bug where start elements with only whitespace in the attribute part wouldn't be correctly parsed.
+ Fixed bug where the advlink dialog would produce an error about the addSelectAccessibility function not being defined.
+ Fixed bug where the caret would be placed at an incorrect position if span was removed by the invalid_elements setting.
+ Fixed bug where elements inside a white space preserve element like pre didn't inherit the behavior while parsing.
+Version 3.4.9 (2012-02-23)
+ Added settings to wordcount plugin to configure update rate and checking wordcount on backspace and delete using wordcount_update_rate and wordcount_update_on_delete.
+ Fixed bug in Webkit and IE where deleting empty paragraphs would remove entire editor contents.
+ Fixed bug where pressing enter on end of list item with a heading would create a new item with heading.
+ Fixed edit css style dialog text-decoration none checkbox so it disables other text-decoration options when enabled.
+ Fixed bug in Gecko where undo wasn't added when focus was lost.
+ Fixed bug in Gecko where shift-enter in table cell ending with BR doesn't move caret to new line.
+ Fixed bug where right-click on formatted text in IE selected the entire line.
+ Fixed bug where text ending with space could not be unformatted in IE.
+ Fixed bug where caret formatting would be removed when moving the caret when a selector expression was used.
+ Fixed bug where formatting would be applied to the body element when all contents where selected and format had both inline and selector parts.
+ Fixed bug where the media plugin would throw errors if you had iframe set as an invalid element in config.
+ Fixed bug where the caret would be placed at the top of the document if you inserted a table and undo:ed that operation. Patch contributed by Wesley Walser.
+ Fixed bug where content css files where loaded twice into the iframe.
+ Fixed so elements with comments would be trated as non empty elements. Patch contributed by Arjan Scherpenisse.
+Version 3.4.8 (2012-02-02)
+ Fixed bug in IE where selected text ending with space cannot be formatted then formatted again to get original text.
+ Fixed bug in IE where images larger than editor area were being deselected when toolbar buttons are clicked.
+ Fixed bug where wrong text align buttons are active when multiple block elements are selected.
+ Fixed bug where selected link not showing in target field of link dialog in some selection cases.
+ Use settings for remove_trailing_br so this can be turned off instead of hard coding the value.
+ Fixed bug in IE where the media plugin displayed null text when some values aren't filled in.
+ Added API method 'onSetAttrib' that fires when the attribute value on a node changes.
+ Fix font size dropdown value not being updated when text already has a font size in the advanced template.
+ Fixed bug in IE where IE doesn't use ARIA attributes properly on options - causing labels to be read out 2 times.
+ Fixed bug where caret cannot be placed after table if table is at end of document in IE.
+ Fixed bug where adding range isn't always successful so we need to check range count otherwise an exception can occur.
+ Added spacebar onclick handler to toolbar buttons to ensure that the accessibility behaviour works correctly.
+ Fixed bug where a stranded bullet point would get created in WebKit.
+ Fixed bug where selecting text in a blockquote and pressing backspace toggles the style.
+ Fixed bug where pressing enter from a heading in IE, the resulting P tag below it shares the style property.
+ Fix white space in between spans from being deleted.
+ Fixed bug where scrollbars where visible in the character map dialog on Gecko.
+ Fixed issue with missing translation for one of the emoticons.
+ Fixed bug where dots in id:s where causing problems. Patch provided by Abhishek Dev.
+ Fixed bug where urls with an at sign in the path wouldn't be parsed correctly. Patch contributed by Jason Grout.
+ Fixed bug where Opera would remove the first character of a inline formatted word if you pressed backspace.
+ Fixed bugs with the autoresize plugin on various browsers and removed the need for the throbber.
+ Fixed performance issue where the contextmenu plugin would try to remove the menu even if it was removed. Patch contributed by mhu.
+Version 3.4.7 (2011-11-03)
+ Modified the caret formatting behavior to word similar to common desktop wordprocessors like Word or Libre Office.
+ Fixed bug in Webkit - Cursor positioning does not work vertically within a table cell with multiple lines of text.
+ Fixed bug in IE where Inserting a table in IE8 places cursor in the second cell of the first row.
+ Fixed bug in IE where editor in a frame doesn't give focus to the toolbar using ALT-F10.
+ Fix for webkit and gecko so that deleting bullet from start of list outdents inner list items and moves first item into paragraph.
+ Fix new list items in IE8 not displayed on a new line when list contains nested list items.
+ Clear formatting in table cell breaks the cell.
+ Made media type list localisable.
+ Fix out of memory error when using prototype in media dialog.
+ Fixed bug where could not add a space in the middle of a th cell.
+ Fixed bug where adding a bullet between two existing bullets adds an extra one
+ Fixed bug where trying to insert a new entry midway through a bulleted list fails dismally when the next entry is tabbed in.
+ Fixed bug where pressing enter on an empty list item does not outdent properly in FF
+ Fixed bug where adding a heading after a list item in a table cell changes all styles in that cell
+ Fixed bug where hitting enter to exit from a bullet list moves cursor to the top of the page in Firefox.
+ Fixed bug where pressing backspace would not delete HRs in Firefox and IE when next to an empty paragraph.
+ Fixed bug where deleting part of the link text can cause a link with no destination to be saved.
+ Fixed bug where css style border widths wasn't handled correctly in table dialog.
+ Fixed bug where parsing invalid html contents on IE or WebKit could produce an infinite loop.
+ Fixed bug where scripts with custom script types wasn't properly passed though the editor.
+ Fixed issue where some Japanese kanji characters wasn't properly entity encoded when numeric entity mode was enabled.
+ Made emoticons dialog use the keyboard naviation.
+ Added navigation instructions to the symbols dialog.
+ Added ability to set default values for the media plugin.
+ Added new font_size_legacy_values option for converting old font element sizes to span with font-size properties.
+ Fixed bug where the symbols dialog was not accessible.
+ Added quirk for IE ensuring that the body of the document containing tinyMCE has a role="application" for accessibility.
+ Fixed bug where the advanced color picker wasn't working properly on FF 7.
+ Fixed issue where the advanced color picker was producing uppercase hex codes.
+ Fixed bug where IE 8 could throw exceptions if the contents contained resizable content elements.
+ Fixed bug where caret formatting wouldn't be correctly applied to previous sibling on WebKit.
+ Fixed bug where the select boxes for font size/family would loose it's value on WebKit due to recent iOS fixes.
+Version 3.4.6 (2011-09-29)
+ Fixed bug where list items were being created for empty divs.
+ Added support in Media plugin for audio media using the embed tag
+ Fixed accessibility bugs in WebKit and IE8 where toolbar items were not being read.
+ Added new use_accessible_selects option to ensure accessible list boxes are used in all browsers (custom widget in firefox native on other browsers)
+ Fixed bug where classid attribute was not being checked from embed objects.
+ Fixed bug in jsrobot tests with intermittently failing.
+ Fixed bug where anchors wasn't updated properly if you edited them using IE 8.
+ Fixed bug where input method on WebKit on Mac OS X would fail to initialize when sometimes focusing the editor.
+ Fixed bug where it wasn't possible to select HR elements on WebKit by simply clicking on them.
+ Fixed bug where the media plugin wouldn't work on IE9 when not using the inlinepopups plugin.
+ Fixed bug where hspace,vspace,align and bgcolor would be removed from object elements in the media plugin.
+ Fixed bug where the new youtube format wouldn't be properly parsed by the media plugin.
+ Fixed bug where the style attribute of layers wasn't properly updated on IE and Gecko.
+ Fixed bug where editing contents in a layer would fail on Gecko since contentEditable doesn't inherit properly.
+ Fixed bug where IE 6/7 would produce JS errors when serializing contents containing layers.
+Version 3.4.5 (2011-09-06)
+ Fixed accessibility bug in WebKit where the right and left arrow keys would update native list boxes.
+ Added new whitespace_elements option to enable users to specify specific elements where the whitespace is preserved.
+ Added new merge_siblings option to formats. This option makes it possible to disable the auto merging of siblings when applying formats.
+ Fixed bug in IE where trailing comma in paste plugin would cause plugin to not run correctly.
+ Fixed bug in WebKit where console messages would be logged when deleting an empty document.
+ Fixed bug in IE8 where caret positioned is on list item instead of paragraph when outdent splits the list
+ Fixed bug with image dialogs not inserting an image if id was omitted from valid_elements.
+ Fixed bug where the selection normalization logic wouldn't properly handle image elements in specific config cases.
+ Fixed bug where the map elements coords attribute would be messed up by IE when serializing the DOM.
+ Fixed bug where IE wouldn't properly handle custom elements when the contents was serialized.
+ Fixed bug where you couldn't move the caret in Gecko if you focused the editor using the API or a UI control.
+ Fixed bug where adjacent links would get merged on IE due to bugs in their link command.
+ Fixed bug where the color split buttons would loose the selection on IE if the editor was placed in a frame/iframe.
+ Fixed bug where floated images in WebKit wouldn't get properly linked.
+ Fixed bug where the fullscreen mode in a separate window wasn't forced into IE9+ standards mode.
+ Fixed bug where pressing enter in an empty editor on WebKit could produce DIV elements instead of P.
+ Fixed bug where spans would get removed incorrectly when merging two blocks on backspace/delete on WebKit.
+ Fixed bug where the editor contents wouldn't be completely removed on backspace/delete on WebKit.
+ Fixed bug where the fullpage plugin wouldn't properly render style elements in the head on IE 6/7.
+ Fixed bug where the nonbreaking_force_tab option in the nonbreaking plugin wouldn't work on Gecko/WebKit.
+ Fixed bug where the isDirty state would become true on non IE browsers if there was an table at the end of the contents.
+ Fixed bug where entities wasn't properly encoded on WebKit when pasting text as plain text.
+ Fixed bug where empty editors would produce an exception of valid_elements didn't include body and forced_root_blocks where disabled.
+ Fixed bug where the fullscreen mode wouldn't retain the header/footer in the fullpage plugin.
+ Fixed issue where the plaintext_mode and plaintext_mode_sticky language keys where swapped.
+Version 3.4.4 (2011-08-04)
+ Added new html5 audio support. Patch contributed by Ronald M. Clifford.
+ Added mute option for video elements and preload options for video/audio patch contributed by Dmitry Kalinkin.
+ Fixed selection to match visual selection before applying formatting changes.
+ Fixed browser specific bugs in lists for WebKit and IE.
+ Fixed bug where IE would scroll the window if you closed an inline dialog that was larger than the viewport. Patch by Laurence Keijmel.
+ Fixed bug where pasting contents near a span element could remove parts of that span. Patch contributed by Wesley Walser.
+ Fixed bug where formatting change would be lost after pressing enter.
+ Fixed bug in WebKit where deleting across blocks would add extra styles.
+ Fixed bug where moving cursor vertically in tables in WebKit wasn't working.
+ Fixed bug in IE where deleting would cause error in console.
+ Fixed bug where the formatter was not applying formats across list elements.
+ Fixed bug where the wordcount plugin would try and update the wordcount if tinymce had been destroyed.
+ Fixed bug where tabfocus plugin would attempt to focus elements not displayed when their parent element was hidden.
+ Fixed bug where the contentEditable state would sometimes be removed if you deleted contents in Gecko.
+ Fixed bug where inserting contents using mceInsertContent would fail if "span" was disabled in valid_elements.
+ Fixed bug where initialization might fail if some resource on gecko wouldn't load properly and fire the onload event.
+ Fixed bug where ctrl+7/8/9 keys wouldn't properly add the specific formats associated with them.
+ Fixed bug where the HTML tags wasn't properly closed in the style plugins properties dialog.
+ Fixed bug where the list plugin would produce an exception if the user tried to delete an element at the very first location.
+Version 3.4.3.2 (2011-06-30)
+ Fixed bug where deleting all of a paragraph inside a table cell would behave badly in webkit.
+ Fixed bugs in tests in firefox5 and WebKit.
+ Fixed bug where selection of table cells would produce an exception on Gecko.
+ Fixed bug where the caret wasn't properly rendered on Gecko when the editor was hidden.
+ Fixed bug where pasting plain text into WebKit would produce a pre element it will now produce more semantic markup.
+ Fixed bug where selecting list type formats using the advlist plugin on IE8 would loose editor selection.
+ Fixed bug where forced root blocks logic wouldn't properly pad elements created if they contained data attributes.
+ Fixed bug where it would remove all contents of the editor if you inserted an image when not having a caret in the document.
+ Fixed bug where the YUI compressor wouldn't properly encode strings with only a quote in them.
+ Fixed bug where WebKit on iOS5 wouldn't call nodeChanged when the selection was changed.
+ Fixed bug where mceFocus command wouldn't work properly on Gecko since it didn't focus the body element.
+ Fixed performance issue with the noneditable plugin where it would enable/disable controls to often.
+Version 3.4.3.1 (2011-06-16)
+ Fixed bug where listboxes were not being handled correctly by JAWS in firefox with the o2k7 skin.
+ Fixed bug where custom buttons were not being rendered correctly when in high contrast mode.
+ Added support for iOS 5 that now supporting contentEditable in it's latest beta.
+ Fixed bug where urls in style attributes with a _ character followed by a number would cause incorrect output.
+ Fixed bug where custom_elements option wasn't working properly on IE browsers.
+ Fixed bug where custom_elements marked as block elements wouldn't get correctly treated as block elements.
+ Fixed bug where attributes with > wasn't properly encoded as XML entities.
+Version 3.4.3 (2011-06-09)
+ Fixed bug where deleting backwards before an image into a list would put the cursor in the wrong location.
+ Fixed bug where styles plugin would not apply styles across multiple selected block elements correctly.
+ Fixed bug where cursor would jump to start of document when selection contained empty table cells in IE8.
+ Fixed bug where applied styles wouldn't be kept if you pressed enter twice to produce two paragraphs.
+ Fixed bug where a ghost like caret would appear on Gecko when pressing enter while having a text color applied.
+ Fixed bug where IE would produce absolute urls if you inserted a image/link and reloaded the page.
+ Fixed bug where applying a heading style to a list item would cascade style to children list items.
+ Fixed bug where Editor loses focus when backspacing and changing styles in WebKit.
+ Fixed bug where exception was thrown in tinymce.util.URI when parsing a relative URI and no base_uri setting was provided.
+ Fixed bug where alt-f10 was not always giving focus to the toolbar on Safari.
+ Added new 'allow_html_in_named_anchor' option to allow html to occur within a named anchor tag. Use at own risk.
+ Added plugin dependency support. Will autoload plugins specified as a dependency if they haven't been loaded.
+ Fixed bug where the autolink plugin didn't work with non-English keyboards when pressing ).
+ Added possibility to change properties of all table cells in a column.
+ Added external_image_list option to get images list from user-defined variable or function.
+ Fixed bug where the autoresize plugin wouldn't reduce the editors height on Chrome.
+ Fixed bug where table size inputs were to small for values with size units.
+ Fixed bug where table cell/row size input values were not validated.
+ Fixed bug where menu item line-height would be set to wrong value by external styles.
+ Fixed bug where hasUndo() would return wrong answer.
+ Fixed bug where page title would be set to undefined by fullpage plugin.
+ Fixed bug where HTML5 video properties were not updated in embedded media settings.
+ Fixed bug where HTML comment on the first line would cause an error.
+ Fixed bug where spellchecker menu was positioned incorrectly on IE.
+ Fixed bug where breaking out of list elements on WebKit would produce a DIV instead of P after the list.
+ Fixed bug where pasting from Word in IE9 would add extra BR elements when text was word wrapped.
+ Fixed bug where numeric entities with leading zeros would produce incorrect decoding.
+ Fixed bug where hexadecimal entities wasn't properly decoded.
+ Fixed bug where bookmarks wasn't properly stored/restored on undo/redo.
+ Fixed bug where the mceInsertCommand didn't retain the values of links if they contained non url contents.
+ Fixed bug where the valid_styles option wouldn't be properly used on styles for specific elements.
+ Fixed so contentEditable is used for the body of the editor if it's supported.
+ Fixed so trailing BR elements gets removed even when forced_root_blocks option was set to false/null.
+ Fixed performance issue with mceInsertCommand and inserting very simple contents.
+ Fixed performance issue with older IE version and huge documents by optimizing the forced root blocks logic.
+ Fixed performance issue with table plugin where it checked for selected cells to often.
+ Fixed bug where creating a link on centered/floated image would produce an error on WebKit browsers.
+ Fixed bug where Gecko would remove single paragraphs if there where contents before/after it.
+ Fixed bug where the scrollbar would move up/down when pasting contents using the paste plugin.
+Version 3.4.2 (2011-04-07)
+ Added new 'paste_text_sticky_default' option to paste plugin, enables you to set the default state for paste as plain text.
+ Added new autoresize_bottom_margin option to autoresize plugin that enables you to add an extra margin at the bottom. Patch contributed by Andrew Ozz.
+ Rewritten the fullpage plugin to handle style contents better and have a more normalized behavior across browsers.
+ Fixed bug where contents inserted with mceInsertContent wasn't parsed using the default dom parser.
+ Fixed bug where blocks containing a single anchor element would be treated as empty.
+ Fixed bug where merging of table cells on IE 6, 7 wouldn't look correctly until the contents was refreshed.
+ Fixed bug where context menu wouldn't work properly on Safari since it was passing out the ctrl key as pressed.
+ Fixed bug where image border color/style values were overwritten by advimage plugin.
+ Fixed bug where setting border in advimage plugin would throw error in IE.
+ Fixed bug where empty anchors list in link settings wasn't hidden.
+ Fixed bug where xhtmlextras popups were missing localized popup-size parameters.
+ Fixed bug where the context menu wouldn't select images on WebKit browsers.
+ Fixed bug where paste plugin wouldn't properly extract the contents on WebKit due to recent changes in browser behavior.
+ Fixed bug where focus of the editor would get on control contents on IE lost due to a bug in the ColorSplitButton control.
+ Fixed bug where contextmenu wasn't disabled on noneditable elements.
+ Fixed bug where getStyle function would trigger error when called on element without style property.
+ Fixed bug where editor fail to load if Javascript Compressor was used.
+ Fixed bug where list-style-type=lower-greek would produce errors in IE<8.
+ Fixed bug where spellchecker plugin would produce errors on IE6-7.
+ Fixed bug where theme_advanced_containers configuration option causes error.
+ Fixed bug where the mceReplaceContent command would produce an error since it didn't correctly handle a return value.
+ Fixed bug where you couldn't enter float point values for em in dialog input fields since it wouldn't be considered a valid size.
+ Fixed bug in xhtmlxtras plugin where it wasn't possible to remove some attributes in the attributes dialog.
+Version 3.4.1 (2011-03-24)
+ Added significantly improved list handling via the new 'lists' plugin.
+ Added 'autolink' plugin to enable automatically linking URLs. Similar to the behavior IE has by default.
+ Added 'theme_advanced_show_current_color' setting to enable the forecolor and backcolor buttons to continuously show the current text color.
+ Added 'contextmenu_never_use_native' setting to disable the ctrl-right-click showing the native browser context menu behaviour.
+ Added 'paste_enable_default_filters' setting to enable the default paste filters to be disabled.
+ Fixed bug where selection locations on undo/redo didn't work correctly on specific contents.
+ Fixed bug where an exception would be trown on IE when loading TinyMCE inside an iframe.
+ Fixed bug where some ascii numeric entities wasn't properly decoded.
+ Fixed bug where some non western language codes wasn't properly decoded/encoded.
+ Fixed bug where undo levels wasn't created when deleting contents on IE.
+ Fixed bug where the initial undo levels bookmark wasn't updated correctly.
+ Fixed bug where search/replace wouldn't be scoped to editor instances on IE8.
+ Fixed bug where IE9 would produce two br elements after block elements when pasting.
+ Fixed bug where IE would place the caret at an incorrect position after a paste operation.
+ Fixed bug where a paste operation using the keyboard would add an extra undo level.
+ Fixed bug where some attributes/elements wasn't correctly filtered when invalid contents was inserted.
+ Fixed bug where the table plugin couldn't correctly handle invalid table structures.
+ Fixed bug where charset and title of the page were handled incorrectly by the fullpage plugin.
+ Fixed bug where toggle states on some of the list boxes didn't update correctly.
+ Fixed bug where sub/sub wouldn't work correctly when done as a caret action in Chrome 10.
+ Fixed bug where the constrain proportions checkbox wouldn't work in the media plugin.
+ Fixed bug where block elements containing trailing br elements wouldn't treated properly if they where invalid.
+ Fixed bug where the color picker dialog wouldn't be rendered correctly when using the o2k7 theme.
+ Fixed bug where setting border=0 using advimage plugin invalid style attribute content was created in Chrome.
+ Fixed bug with references to non-existing images in css of fullpage plugin.
+ Fixed bug where item could be unselected in spellchecker's language selector.
+ Fixed bug where some mispelled words could be not highlighted using spellchecker plugin.
+ Fixed bug where spellchecking would merge some words on IE.
+ Fixed bug where spellchecker context menu was not always positioned correctly.
+ Fixed bug with empty anchors list in advlink popup when Invisible Elements feature was disabled.
+ Fixed bug where older IE versions wouldn't properly handle some elements if they where placed at the top of editor contents.
+ Fixed bug where selecting the whole table would enable table tools for cells and rows.
+ Fixed bug where it wasn't possible to replace selected contents on IE when pasting using the paste plugin.
+ Fixed bug where setting text color in fullpage plugin doesn't work.
+ Fixed bug where the state of checkboxes in media plugin wouldn't be set correctly.
+ Fixed bug where black spade suit character was not included in special character selector.
+ Fixed bug where setting invalid values for table cell size would throw an error in IE.
+ Fixed bug where spellchecking would remove whitespace characters from PRE block in IE.
+ Fixed bug where HR was inserted inside P elements instead of splitting them.
+ Fixed bug where extra, empty span tags were added when using a format with both selector and inline modes.
+ Fixed bug where bullet lists weren't always detected correctly.
+ Fixed bug where deleting some paragraphs on IE would cause an exception.
+ Fixed bug where the json encoder logic wouldn't properly encode \ characters.
+ Fixed bug where the onChange event would be fired when the editor was first initialized.
+ Fixed bug where mceSelected wouldn't be removed properly from output even if it's an internal class.
+ Fixed issue with table background colors not being transparent. This improves compliance with users browser color preferences.
+ Fixed issue where styles were not included when using the full page plugin.
+ Fixed issue where drag/drop operations wasn't properly added to the undo levels.
+ Fixed issue where colors wasn't correctly applied to elements with underline decoration.
+ Fixed issue where deleting some paragraphs on IE would cause an exception.
+Version 3.4 (2011-03-10)
+ Added accessibility example with various accessibility options contributed by Ephox.
+ Fixed bug where attributes wasn't properly handled in the xhtmlxtras plugin.
+ Fixed bug where the image.htm had some strange td artifacts probably due to auto merging.
+ Fixed bug where the ToolbarGroup had an missing reference to this in it's destroy method.
+ Fixed bug with the resizeBy function in the advanced theme where it was scaled by the wrong parent.
+ Fixed bug where an exception would be thrown by the element if the page was served in xhtml mode.
+ Fixed bug where mceInsertContent would throw an exception when page was served in xhtml mode.
+ Fixed bug where you couldn't select a forground/background color when page was served in xhtml mode.
+ Fixed bug where the editor would scroll to the toolbar when clicked due to a call to focus in ListBox.
+ Fixed bug where pages with rtl dir wouldn't render split buttons correctly when using the o2k7 theme.
+ Fixed bug where anchor elements with names wasn't properly collapsed as they where in 3.3.x.
+ Fixed bug where WebKit wouldn't properly handle image selection if it was done left to right.
+ Fixed bug where the formatter would align images when the selection range was collapsed.
+ Fixed bug where the image button would be active when the selection range was collapsed.
+ Fixed bug where the element_format option wasn't used by the new (X)HTML serializer logic.
+ Fixed bug where the table cell/row dialogs would produce empty attributes.
+ Fixed bug where the tfoot wouldn't be added to the top of the table.
+ Fixed bug where the formatter would merge siblings with white space between them.
+ Fixed bug where pasting headers and paragraphs would produce an extra paragraph.
+ Fixed bug where the ColorSplitButton would throw an exception if you clicked out side a color.
+ Fixed bug where IE9 wouldn't properly produce new paragraphs on enter if the current paragraph had formatting.
+ Fixed bug where multiple BR elements at end of block elements where removed.
+ Fixed bug where fullscreen plugin wouldn't correctly display the edit area on IE6 for long pages.
+ Fixed bug where paste plugin wouldn't properly encode raw entities when pasting in plain text mode.
+ Fixed bug where the search/replace plugin wouldn't work correctly on IE 9.
+ Fixed so the drop menus doesn't get an outline border visible when focused, patch contributed by Ephox.
+ Fixed so the values entered in the color picker are forced to hex values.
+ Removed dialog workaround for IE 9 beta since the RC is now out and people should upgrade.
+ Removed obsolete calls in various plugins to the mceBeginUndoLevel command.
diff --git a/static/grappelli/tinymce/examples/accessibility.html b/static/grappelli/tinymce/examples/accessibility.html
new file mode 100644
index 0000000..6905940
--- /dev/null
+++ b/static/grappelli/tinymce/examples/accessibility.html
@@ -0,0 +1,101 @@
+
+
+
+
Full featured example
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/examples/css/content.css b/static/grappelli/tinymce/examples/css/content.css
new file mode 100644
index 0000000..a76c38a
--- /dev/null
+++ b/static/grappelli/tinymce/examples/css/content.css
@@ -0,0 +1,105 @@
+body {
+ background-color: #FFFFFF;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+pre {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+.example1 {
+ font-weight: bold;
+ font-size: 14px
+}
+
+.example2 {
+ font-weight: bold;
+ font-size: 12px;
+ color: #FF0000
+}
+
+.tablerow1 {
+ background-color: #BBBBBB;
+}
+
+thead {
+ background-color: #FFBBBB;
+}
+
+tfoot {
+ background-color: #BBBBFF;
+}
+
+th {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+}
+
+/* Basic formats */
+
+.bold {
+ font-weight: bold;
+}
+
+.italic {
+ font-style: italic;
+}
+
+.underline {
+ text-decoration: underline;
+}
+
+/* Global align classes */
+
+.left {
+ text-align: inherit;
+}
+
+.center {
+ text-align: center;
+}
+
+.right {
+ text-align: right;
+}
+
+.full {
+ text-align: justify
+}
+
+/* Image and table specific aligns */
+
+img.left, table.left {
+ float: left;
+ text-align: inherit;
+}
+
+img.center, table.center {
+ margin-left: auto;
+ margin-right: auto;
+ text-align: inherit;
+}
+
+img.center {
+ display: block;
+}
+
+img.right, table.right {
+ float: right;
+ text-align: inherit;
+}
diff --git a/static/grappelli/tinymce/examples/css/word.css b/static/grappelli/tinymce/examples/css/word.css
new file mode 100644
index 0000000..049a39f
--- /dev/null
+++ b/static/grappelli/tinymce/examples/css/word.css
@@ -0,0 +1,53 @@
+body {
+ background-color: #FFFFFF;
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
+
+p {margin:0; padding:0;}
+
+td {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+pre {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+.example1 {
+ font-weight: bold;
+ font-size: 14px
+}
+
+.example2 {
+ font-weight: bold;
+ font-size: 12px;
+ color: #FF0000
+}
+
+.tablerow1 {
+ background-color: #BBBBBB;
+}
+
+thead {
+ background-color: #FFBBBB;
+}
+
+tfoot {
+ background-color: #BBBBFF;
+}
+
+th {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 13px;
+}
diff --git a/static/grappelli/tinymce/examples/custom_formats.html b/static/grappelli/tinymce/examples/custom_formats.html
new file mode 100644
index 0000000..ba9d1eb
--- /dev/null
+++ b/static/grappelli/tinymce/examples/custom_formats.html
@@ -0,0 +1,111 @@
+
+
+
+
Custom formats example
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/examples/full.html b/static/grappelli/tinymce/examples/full.html
new file mode 100644
index 0000000..84b76ca
--- /dev/null
+++ b/static/grappelli/tinymce/examples/full.html
@@ -0,0 +1,101 @@
+
+
+
+
Full featured example
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/examples/index.html b/static/grappelli/tinymce/examples/index.html
new file mode 100644
index 0000000..6ebfbea
--- /dev/null
+++ b/static/grappelli/tinymce/examples/index.html
@@ -0,0 +1,10 @@
+
+
+
+
TinyMCE examples
+
+
+
diff --git a/static/grappelli/tinymce/examples/lists/image_list.js b/static/grappelli/tinymce/examples/lists/image_list.js
new file mode 100644
index 0000000..7ba049a
--- /dev/null
+++ b/static/grappelli/tinymce/examples/lists/image_list.js
@@ -0,0 +1,9 @@
+// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
+// There images will be displayed as a dropdown in all image dialogs if the "external_link_image_url"
+// option is defined in TinyMCE init.
+
+var tinyMCEImageList = new Array(
+ // Name, URL
+ ["Logo 1", "media/logo.jpg"],
+ ["Logo 2 Over", "media/logo_over.jpg"]
+);
diff --git a/static/grappelli/tinymce/examples/lists/link_list.js b/static/grappelli/tinymce/examples/lists/link_list.js
new file mode 100644
index 0000000..0d46433
--- /dev/null
+++ b/static/grappelli/tinymce/examples/lists/link_list.js
@@ -0,0 +1,10 @@
+// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
+// There links will be displayed as a dropdown in all link dialogs if the "external_link_list_url"
+// option is defined in TinyMCE init.
+
+var tinyMCELinkList = new Array(
+ // Name, URL
+ ["Moxiecode", "http://www.moxiecode.com"],
+ ["Freshmeat", "http://www.freshmeat.com"],
+ ["Sourceforge", "http://www.sourceforge.com"]
+);
diff --git a/static/grappelli/tinymce/examples/lists/media_list.js b/static/grappelli/tinymce/examples/lists/media_list.js
new file mode 100644
index 0000000..2e04958
--- /dev/null
+++ b/static/grappelli/tinymce/examples/lists/media_list.js
@@ -0,0 +1,14 @@
+// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
+// There flash movies will be displayed as a dropdown in all media dialog if the "media_external_list_url"
+// option is defined in TinyMCE init.
+
+var tinyMCEMediaList = [
+ // Name, URL
+ ["Some Flash", "media/sample.swf"],
+ ["Some Quicktime", "media/sample.mov"],
+ ["Some AVI", "media/sample.avi"],
+ ["Some RealMedia", "media/sample.rm"],
+ ["Some Shockwave", "media/sample.dcr"],
+ ["Some Video", "media/sample.mp4"],
+ ["Some FLV", "media/sample.flv"]
+];
\ No newline at end of file
diff --git a/static/grappelli/tinymce/examples/lists/template_list.js b/static/grappelli/tinymce/examples/lists/template_list.js
new file mode 100644
index 0000000..e06d357
--- /dev/null
+++ b/static/grappelli/tinymce/examples/lists/template_list.js
@@ -0,0 +1,9 @@
+// This list may be created by a server logic page PHP/ASP/ASPX/JSP in some backend system.
+// There templates will be displayed as a dropdown in all media dialog if the "template_external_list_url"
+// option is defined in TinyMCE init.
+
+var tinyMCETemplateList = [
+ // Name, URL, Description
+ ["Simple snippet", "templates/snippet1.htm", "Simple HTML snippet."],
+ ["Layout", "templates/layout1.htm", "HTML Layout."]
+];
\ No newline at end of file
diff --git a/static/grappelli/tinymce/examples/media/logo.jpg b/static/grappelli/tinymce/examples/media/logo.jpg
new file mode 100644
index 0000000..ad535d6
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/logo.jpg differ
diff --git a/static/grappelli/tinymce/examples/media/logo_over.jpg b/static/grappelli/tinymce/examples/media/logo_over.jpg
new file mode 100644
index 0000000..79fcd88
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/logo_over.jpg differ
diff --git a/static/grappelli/tinymce/examples/media/sample.avi b/static/grappelli/tinymce/examples/media/sample.avi
new file mode 100644
index 0000000..238bb68
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/sample.avi differ
diff --git a/static/grappelli/tinymce/examples/media/sample.dcr b/static/grappelli/tinymce/examples/media/sample.dcr
new file mode 100644
index 0000000..353b3ce
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/sample.dcr differ
diff --git a/static/grappelli/tinymce/examples/media/sample.flv b/static/grappelli/tinymce/examples/media/sample.flv
new file mode 100644
index 0000000..799d137
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/sample.flv differ
diff --git a/static/grappelli/tinymce/examples/media/sample.mov b/static/grappelli/tinymce/examples/media/sample.mov
new file mode 100644
index 0000000..9c0a093
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/sample.mov differ
diff --git a/static/grappelli/tinymce/examples/media/sample.ram b/static/grappelli/tinymce/examples/media/sample.ram
new file mode 100644
index 0000000..e2ce04c
--- /dev/null
+++ b/static/grappelli/tinymce/examples/media/sample.ram
@@ -0,0 +1 @@
+http://streaming.uga.edu/samples/ayp_lan.rm
\ No newline at end of file
diff --git a/static/grappelli/tinymce/examples/media/sample.rm b/static/grappelli/tinymce/examples/media/sample.rm
new file mode 100644
index 0000000..8947706
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/sample.rm differ
diff --git a/static/grappelli/tinymce/examples/media/sample.swf b/static/grappelli/tinymce/examples/media/sample.swf
new file mode 100644
index 0000000..9f5fc4a
Binary files /dev/null and b/static/grappelli/tinymce/examples/media/sample.swf differ
diff --git a/static/grappelli/tinymce/examples/menu.html b/static/grappelli/tinymce/examples/menu.html
new file mode 100644
index 0000000..e48650a
--- /dev/null
+++ b/static/grappelli/tinymce/examples/menu.html
@@ -0,0 +1,18 @@
+
+
+
+
Menu
+
+
+
+
Examples
+
Full featured
+
Simple theme
+
Skin support
+
Word processor
+
Custom formats
+
Accessibility Options
+
+
diff --git a/static/grappelli/tinymce/examples/simple.html b/static/grappelli/tinymce/examples/simple.html
new file mode 100644
index 0000000..70720ca
--- /dev/null
+++ b/static/grappelli/tinymce/examples/simple.html
@@ -0,0 +1,47 @@
+
+
+
+
Simple theme example
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/examples/skins.html b/static/grappelli/tinymce/examples/skins.html
new file mode 100644
index 0000000..c150858
--- /dev/null
+++ b/static/grappelli/tinymce/examples/skins.html
@@ -0,0 +1,216 @@
+
+
+
+
Skin support example
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/examples/templates/layout1.htm b/static/grappelli/tinymce/examples/templates/layout1.htm
new file mode 100644
index 0000000..a38df3e
--- /dev/null
+++ b/static/grappelli/tinymce/examples/templates/layout1.htm
@@ -0,0 +1,15 @@
+
+
+
+ | Column 1 |
+ Column 2 |
+
+
+
+
+
+ | Username: {$username} |
+ Staffid: {$staffid} |
+
+
+
diff --git a/static/grappelli/tinymce/examples/templates/snippet1.htm b/static/grappelli/tinymce/examples/templates/snippet1.htm
new file mode 100644
index 0000000..b2520be
--- /dev/null
+++ b/static/grappelli/tinymce/examples/templates/snippet1.htm
@@ -0,0 +1 @@
+This is just some
code.
diff --git a/static/grappelli/tinymce/examples/word.html b/static/grappelli/tinymce/examples/word.html
new file mode 100644
index 0000000..d827b6f
--- /dev/null
+++ b/static/grappelli/tinymce/examples/word.html
@@ -0,0 +1,72 @@
+
+
+
+
Word processor example
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/langs/en.js b/static/grappelli/tinymce/jscripts/tiny_mce/langs/en.js
new file mode 100644
index 0000000..19324f7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/langs/en.js
@@ -0,0 +1 @@
+tinyMCE.addI18n({en:{common:{"more_colors":"More Colors...","invalid_data":"Error: Invalid values entered, these are marked in red.","popup_blocked":"Sorry, but we have noticed that your popup-blocker has disabled a window that provides application functionality. You will need to disable popup blocking on this site in order to fully utilize this tool.","clipboard_no_support":"Currently not supported by your browser, use keyboard shortcuts instead.","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","not_set":"-- Not Set --","class_name":"Class",browse:"Browse",close:"Close",cancel:"Cancel",update:"Update",insert:"Insert",apply:"Apply","edit_confirm":"Do you want to use the WYSIWYG mode for this textarea?","invalid_data_number":"{#field} must be a number","invalid_data_min":"{#field} must be a number greater than {#min}","invalid_data_size":"{#field} must be a number or percentage",value:"(value)"},contextmenu:{full:"Full",right:"Right",center:"Center",left:"Left",align:"Alignment"},insertdatetime:{"day_short":"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun","day_long":"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday","months_short":"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec","months_long":"January,February,March,April,May,June,July,August,September,October,November,December","inserttime_desc":"Insert Time","insertdate_desc":"Insert Date","time_fmt":"%H:%M:%S","date_fmt":"%Y-%m-%d"},print:{"print_desc":"Print"},preview:{"preview_desc":"Preview"},directionality:{"rtl_desc":"Direction Right to Left","ltr_desc":"Direction Left to Right"},layer:{content:"New layer...","absolute_desc":"Toggle Absolute Positioning","backward_desc":"Move Backward","forward_desc":"Move Forward","insertlayer_desc":"Insert New Layer"},save:{"save_desc":"Save","cancel_desc":"Cancel All Changes"},nonbreaking:{"nonbreaking_desc":"Insert Non-Breaking Space Character"},iespell:{download:"ieSpell not detected. Do you want to install it now?","iespell_desc":"Check Spelling"},advhr:{"delta_height":"","delta_width":"","advhr_desc":"Insert Horizontal Line"},emotions:{"delta_height":"","delta_width":"","emotions_desc":"Emotions"},searchreplace:{"replace_desc":"Find/Replace","delta_width":"","delta_height":"","search_desc":"Find"},advimage:{"delta_width":"","image_desc":"Insert/Edit Image","delta_height":""},advlink:{"delta_height":"","delta_width":"","link_desc":"Insert/Edit Link"},xhtmlxtras:{"attribs_delta_height":"","attribs_delta_width":"","ins_delta_height":"","ins_delta_width":"","del_delta_height":"","del_delta_width":"","acronym_delta_height":"","acronym_delta_width":"","abbr_delta_height":"","abbr_delta_width":"","cite_delta_height":"","cite_delta_width":"","attribs_desc":"Insert/Edit Attributes","ins_desc":"Insertion","del_desc":"Deletion","acronym_desc":"Acronym","abbr_desc":"Abbreviation","cite_desc":"Citation"},style:{"delta_height":"","delta_width":"",desc:"Edit CSS Style"},paste:{"plaintext_mode_stick":"Paste is now in plain text mode. Click again to toggle back to regular paste mode.","plaintext_mode":"Paste is now in plain text mode. Click again to toggle back to regular paste mode. After you paste something you will be returned to regular paste mode.","selectall_desc":"Select All","paste_word_desc":"Paste from Word","paste_text_desc":"Paste as Plain Text"},"paste_dlg":{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."},table:{"merge_cells_delta_height":"","merge_cells_delta_width":"","table_delta_height":"","table_delta_width":"","cellprops_delta_height":"","cellprops_delta_width":"","rowprops_delta_height":"","rowprops_delta_width":"",cell:"Cell",col:"Column",row:"Row",del:"Delete Table","copy_row_desc":"Copy Table Row","cut_row_desc":"Cut Table Row","paste_row_after_desc":"Paste Table Row After","paste_row_before_desc":"Paste Table Row Before","props_desc":"Table Properties","cell_desc":"Table Cell Properties","row_desc":"Table Row Properties","merge_cells_desc":"Merge Table Cells","split_cells_desc":"Split Merged Table Cells","delete_col_desc":"Delete Column","col_after_desc":"Insert Column After","col_before_desc":"Insert Column Before","delete_row_desc":"Delete Row","row_after_desc":"Insert Row After","row_before_desc":"Insert Row Before",desc:"Insert/Edit Table"},autosave:{"warning_message":"If you restore the saved content, you will lose all the content that is currently in the editor.\n\nAre you sure you want to restore the saved content?","restore_content":"Restore auto-saved content.","unload_msg":"The changes you made will be lost if you navigate away from this page."},fullscreen:{desc:"Toggle Full Screen Mode"},media:{"delta_height":"","delta_width":"",edit:"Edit Embedded Media",desc:"Insert/Edit Embedded Media"},fullpage:{desc:"Document Properties","delta_width":"","delta_height":""},template:{desc:"Insert Predefined Template Content"},visualchars:{desc:"Show/Hide Visual Control Characters"},spellchecker:{desc:"Toggle Spell Checker",menu:"Spell Checker Settings","ignore_word":"Ignore Word","ignore_words":"Ignore All",langs:"Languages",wait:"Please wait...",sug:"Suggestions","no_sug":"No Suggestions","no_mpell":"No misspellings found.","learn_word":"Learn word"},pagebreak:{desc:"Insert Page Break for Printing"},advlist:{types:"Types",def:"Default","lower_alpha":"Lower Alpha","lower_greek":"Lower Greek","lower_roman":"Lower Roman","upper_alpha":"Upper Alpha","upper_roman":"Upper Roman",circle:"Circle",disc:"Disc",square:"Square"},colors:{"333300":"Dark olive","993300":"Burnt orange","000000":"Black","003300":"Dark green","003366":"Dark azure","000080":"Navy Blue","333399":"Indigo","333333":"Very dark gray","800000":"Maroon",FF6600:"Orange","808000":"Olive","008000":"Green","008080":"Teal","0000FF":"Blue","666699":"Grayish blue","808080":"Gray",FF0000:"Red",FF9900:"Amber","99CC00":"Yellow green","339966":"Sea green","33CCCC":"Turquoise","3366FF":"Royal blue","800080":"Purple","999999":"Medium gray",FF00FF:"Magenta",FFCC00:"Gold",FFFF00:"Yellow","00FF00":"Lime","00FFFF":"Aqua","00CCFF":"Sky blue","993366":"Brown",C0C0C0:"Silver",FF99CC:"Pink",FFCC99:"Peach",FFFF99:"Light yellow",CCFFCC:"Pale green",CCFFFF:"Pale cyan","99CCFF":"Light sky blue",CC99FF:"Plum",FFFFFF:"White"},aria:{"rich_text_area":"Rich Text Area"},wordcount:{words:"Words:"},visualblocks:{desc:'Show/hide block elements'}}});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/license.txt b/static/grappelli/tinymce/jscripts/tiny_mce/license.txt
new file mode 100644
index 0000000..60d6d4c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/license.txt
@@ -0,0 +1,504 @@
+ GNU LESSER GENERAL PUBLIC LICENSE
+ Version 2.1, February 1999
+
+ Copyright (C) 1991, 1999 Free Software Foundation, Inc.
+ 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+ Everyone is permitted to copy and distribute verbatim copies
+ of this license document, but changing it is not allowed.
+
+[This is the first released version of the Lesser GPL. It also counts
+ as the successor of the GNU Library Public License, version 2, hence
+ the version number 2.1.]
+
+ Preamble
+
+ The licenses for most software are designed to take away your
+freedom to share and change it. By contrast, the GNU General Public
+Licenses are intended to guarantee your freedom to share and change
+free software--to make sure the software is free for all its users.
+
+ This license, the Lesser General Public License, applies to some
+specially designated software packages--typically libraries--of the
+Free Software Foundation and other authors who decide to use it. You
+can use it too, but we suggest you first think carefully about whether
+this license or the ordinary General Public License is the better
+strategy to use in any particular case, based on the explanations below.
+
+ When we speak of free software, we are referring to freedom of use,
+not price. Our General Public Licenses are designed to make sure that
+you have the freedom to distribute copies of free software (and charge
+for this service if you wish); that you receive source code or can get
+it if you want it; that you can change the software and use pieces of
+it in new free programs; and that you are informed that you can do
+these things.
+
+ To protect your rights, we need to make restrictions that forbid
+distributors to deny you these rights or to ask you to surrender these
+rights. These restrictions translate to certain responsibilities for
+you if you distribute copies of the library or if you modify it.
+
+ For example, if you distribute copies of the library, whether gratis
+or for a fee, you must give the recipients all the rights that we gave
+you. You must make sure that they, too, receive or can get the source
+code. If you link other code with the library, you must provide
+complete object files to the recipients, so that they can relink them
+with the library after making changes to the library and recompiling
+it. And you must show them these terms so they know their rights.
+
+ We protect your rights with a two-step method: (1) we copyright the
+library, and (2) we offer you this license, which gives you legal
+permission to copy, distribute and/or modify the library.
+
+ To protect each distributor, we want to make it very clear that
+there is no warranty for the free library. Also, if the library is
+modified by someone else and passed on, the recipients should know
+that what they have is not the original version, so that the original
+author's reputation will not be affected by problems that might be
+introduced by others.
+
+ Finally, software patents pose a constant threat to the existence of
+any free program. We wish to make sure that a company cannot
+effectively restrict the users of a free program by obtaining a
+restrictive license from a patent holder. Therefore, we insist that
+any patent license obtained for a version of the library must be
+consistent with the full freedom of use specified in this license.
+
+ Most GNU software, including some libraries, is covered by the
+ordinary GNU General Public License. This license, the GNU Lesser
+General Public License, applies to certain designated libraries, and
+is quite different from the ordinary General Public License. We use
+this license for certain libraries in order to permit linking those
+libraries into non-free programs.
+
+ When a program is linked with a library, whether statically or using
+a shared library, the combination of the two is legally speaking a
+combined work, a derivative of the original library. The ordinary
+General Public License therefore permits such linking only if the
+entire combination fits its criteria of freedom. The Lesser General
+Public License permits more lax criteria for linking other code with
+the library.
+
+ We call this license the "Lesser" General Public License because it
+does Less to protect the user's freedom than the ordinary General
+Public License. It also provides other free software developers Less
+of an advantage over competing non-free programs. These disadvantages
+are the reason we use the ordinary General Public License for many
+libraries. However, the Lesser license provides advantages in certain
+special circumstances.
+
+ For example, on rare occasions, there may be a special need to
+encourage the widest possible use of a certain library, so that it becomes
+a de-facto standard. To achieve this, non-free programs must be
+allowed to use the library. A more frequent case is that a free
+library does the same job as widely used non-free libraries. In this
+case, there is little to gain by limiting the free library to free
+software only, so we use the Lesser General Public License.
+
+ In other cases, permission to use a particular library in non-free
+programs enables a greater number of people to use a large body of
+free software. For example, permission to use the GNU C Library in
+non-free programs enables many more people to use the whole GNU
+operating system, as well as its variant, the GNU/Linux operating
+system.
+
+ Although the Lesser General Public License is Less protective of the
+users' freedom, it does ensure that the user of a program that is
+linked with the Library has the freedom and the wherewithal to run
+that program using a modified version of the Library.
+
+ The precise terms and conditions for copying, distribution and
+modification follow. Pay close attention to the difference between a
+"work based on the library" and a "work that uses the library". The
+former contains code derived from the library, whereas the latter must
+be combined with the library in order to run.
+
+ GNU LESSER GENERAL PUBLIC LICENSE
+ TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION
+
+ 0. This License Agreement applies to any software library or other
+program which contains a notice placed by the copyright holder or
+other authorized party saying it may be distributed under the terms of
+this Lesser General Public License (also called "this License").
+Each licensee is addressed as "you".
+
+ A "library" means a collection of software functions and/or data
+prepared so as to be conveniently linked with application programs
+(which use some of those functions and data) to form executables.
+
+ The "Library", below, refers to any such software library or work
+which has been distributed under these terms. A "work based on the
+Library" means either the Library or any derivative work under
+copyright law: that is to say, a work containing the Library or a
+portion of it, either verbatim or with modifications and/or translated
+straightforwardly into another language. (Hereinafter, translation is
+included without limitation in the term "modification".)
+
+ "Source code" for a work means the preferred form of the work for
+making modifications to it. For a library, complete source code means
+all the source code for all modules it contains, plus any associated
+interface definition files, plus the scripts used to control compilation
+and installation of the library.
+
+ Activities other than copying, distribution and modification are not
+covered by this License; they are outside its scope. The act of
+running a program using the Library is not restricted, and output from
+such a program is covered only if its contents constitute a work based
+on the Library (independent of the use of the Library in a tool for
+writing it). Whether that is true depends on what the Library does
+and what the program that uses the Library does.
+
+ 1. You may copy and distribute verbatim copies of the Library's
+complete source code as you receive it, in any medium, provided that
+you conspicuously and appropriately publish on each copy an
+appropriate copyright notice and disclaimer of warranty; keep intact
+all the notices that refer to this License and to the absence of any
+warranty; and distribute a copy of this License along with the
+Library.
+
+ You may charge a fee for the physical act of transferring a copy,
+and you may at your option offer warranty protection in exchange for a
+fee.
+
+ 2. You may modify your copy or copies of the Library or any portion
+of it, thus forming a work based on the Library, and copy and
+distribute such modifications or work under the terms of Section 1
+above, provided that you also meet all of these conditions:
+
+ a) The modified work must itself be a software library.
+
+ b) You must cause the files modified to carry prominent notices
+ stating that you changed the files and the date of any change.
+
+ c) You must cause the whole of the work to be licensed at no
+ charge to all third parties under the terms of this License.
+
+ d) If a facility in the modified Library refers to a function or a
+ table of data to be supplied by an application program that uses
+ the facility, other than as an argument passed when the facility
+ is invoked, then you must make a good faith effort to ensure that,
+ in the event an application does not supply such function or
+ table, the facility still operates, and performs whatever part of
+ its purpose remains meaningful.
+
+ (For example, a function in a library to compute square roots has
+ a purpose that is entirely well-defined independent of the
+ application. Therefore, Subsection 2d requires that any
+ application-supplied function or table used by this function must
+ be optional: if the application does not supply it, the square
+ root function must still compute square roots.)
+
+These requirements apply to the modified work as a whole. If
+identifiable sections of that work are not derived from the Library,
+and can be reasonably considered independent and separate works in
+themselves, then this License, and its terms, do not apply to those
+sections when you distribute them as separate works. But when you
+distribute the same sections as part of a whole which is a work based
+on the Library, the distribution of the whole must be on the terms of
+this License, whose permissions for other licensees extend to the
+entire whole, and thus to each and every part regardless of who wrote
+it.
+
+Thus, it is not the intent of this section to claim rights or contest
+your rights to work written entirely by you; rather, the intent is to
+exercise the right to control the distribution of derivative or
+collective works based on the Library.
+
+In addition, mere aggregation of another work not based on the Library
+with the Library (or with a work based on the Library) on a volume of
+a storage or distribution medium does not bring the other work under
+the scope of this License.
+
+ 3. You may opt to apply the terms of the ordinary GNU General Public
+License instead of this License to a given copy of the Library. To do
+this, you must alter all the notices that refer to this License, so
+that they refer to the ordinary GNU General Public License, version 2,
+instead of to this License. (If a newer version than version 2 of the
+ordinary GNU General Public License has appeared, then you can specify
+that version instead if you wish.) Do not make any other change in
+these notices.
+
+ Once this change is made in a given copy, it is irreversible for
+that copy, so the ordinary GNU General Public License applies to all
+subsequent copies and derivative works made from that copy.
+
+ This option is useful when you wish to copy part of the code of
+the Library into a program that is not a library.
+
+ 4. You may copy and distribute the Library (or a portion or
+derivative of it, under Section 2) in object code or executable form
+under the terms of Sections 1 and 2 above provided that you accompany
+it with the complete corresponding machine-readable source code, which
+must be distributed under the terms of Sections 1 and 2 above on a
+medium customarily used for software interchange.
+
+ If distribution of object code is made by offering access to copy
+from a designated place, then offering equivalent access to copy the
+source code from the same place satisfies the requirement to
+distribute the source code, even though third parties are not
+compelled to copy the source along with the object code.
+
+ 5. A program that contains no derivative of any portion of the
+Library, but is designed to work with the Library by being compiled or
+linked with it, is called a "work that uses the Library". Such a
+work, in isolation, is not a derivative work of the Library, and
+therefore falls outside the scope of this License.
+
+ However, linking a "work that uses the Library" with the Library
+creates an executable that is a derivative of the Library (because it
+contains portions of the Library), rather than a "work that uses the
+library". The executable is therefore covered by this License.
+Section 6 states terms for distribution of such executables.
+
+ When a "work that uses the Library" uses material from a header file
+that is part of the Library, the object code for the work may be a
+derivative work of the Library even though the source code is not.
+Whether this is true is especially significant if the work can be
+linked without the Library, or if the work is itself a library. The
+threshold for this to be true is not precisely defined by law.
+
+ If such an object file uses only numerical parameters, data
+structure layouts and accessors, and small macros and small inline
+functions (ten lines or less in length), then the use of the object
+file is unrestricted, regardless of whether it is legally a derivative
+work. (Executables containing this object code plus portions of the
+Library will still fall under Section 6.)
+
+ Otherwise, if the work is a derivative of the Library, you may
+distribute the object code for the work under the terms of Section 6.
+Any executables containing that work also fall under Section 6,
+whether or not they are linked directly with the Library itself.
+
+ 6. As an exception to the Sections above, you may also combine or
+link a "work that uses the Library" with the Library to produce a
+work containing portions of the Library, and distribute that work
+under terms of your choice, provided that the terms permit
+modification of the work for the customer's own use and reverse
+engineering for debugging such modifications.
+
+ You must give prominent notice with each copy of the work that the
+Library is used in it and that the Library and its use are covered by
+this License. You must supply a copy of this License. If the work
+during execution displays copyright notices, you must include the
+copyright notice for the Library among them, as well as a reference
+directing the user to the copy of this License. Also, you must do one
+of these things:
+
+ a) Accompany the work with the complete corresponding
+ machine-readable source code for the Library including whatever
+ changes were used in the work (which must be distributed under
+ Sections 1 and 2 above); and, if the work is an executable linked
+ with the Library, with the complete machine-readable "work that
+ uses the Library", as object code and/or source code, so that the
+ user can modify the Library and then relink to produce a modified
+ executable containing the modified Library. (It is understood
+ that the user who changes the contents of definitions files in the
+ Library will not necessarily be able to recompile the application
+ to use the modified definitions.)
+
+ b) Use a suitable shared library mechanism for linking with the
+ Library. A suitable mechanism is one that (1) uses at run time a
+ copy of the library already present on the user's computer system,
+ rather than copying library functions into the executable, and (2)
+ will operate properly with a modified version of the library, if
+ the user installs one, as long as the modified version is
+ interface-compatible with the version that the work was made with.
+
+ c) Accompany the work with a written offer, valid for at
+ least three years, to give the same user the materials
+ specified in Subsection 6a, above, for a charge no more
+ than the cost of performing this distribution.
+
+ d) If distribution of the work is made by offering access to copy
+ from a designated place, offer equivalent access to copy the above
+ specified materials from the same place.
+
+ e) Verify that the user has already received a copy of these
+ materials or that you have already sent this user a copy.
+
+ For an executable, the required form of the "work that uses the
+Library" must include any data and utility programs needed for
+reproducing the executable from it. However, as a special exception,
+the materials to be distributed need not include anything that is
+normally distributed (in either source or binary form) with the major
+components (compiler, kernel, and so on) of the operating system on
+which the executable runs, unless that component itself accompanies
+the executable.
+
+ It may happen that this requirement contradicts the license
+restrictions of other proprietary libraries that do not normally
+accompany the operating system. Such a contradiction means you cannot
+use both them and the Library together in an executable that you
+distribute.
+
+ 7. You may place library facilities that are a work based on the
+Library side-by-side in a single library together with other library
+facilities not covered by this License, and distribute such a combined
+library, provided that the separate distribution of the work based on
+the Library and of the other library facilities is otherwise
+permitted, and provided that you do these two things:
+
+ a) Accompany the combined library with a copy of the same work
+ based on the Library, uncombined with any other library
+ facilities. This must be distributed under the terms of the
+ Sections above.
+
+ b) Give prominent notice with the combined library of the fact
+ that part of it is a work based on the Library, and explaining
+ where to find the accompanying uncombined form of the same work.
+
+ 8. You may not copy, modify, sublicense, link with, or distribute
+the Library except as expressly provided under this License. Any
+attempt otherwise to copy, modify, sublicense, link with, or
+distribute the Library is void, and will automatically terminate your
+rights under this License. However, parties who have received copies,
+or rights, from you under this License will not have their licenses
+terminated so long as such parties remain in full compliance.
+
+ 9. You are not required to accept this License, since you have not
+signed it. However, nothing else grants you permission to modify or
+distribute the Library or its derivative works. These actions are
+prohibited by law if you do not accept this License. Therefore, by
+modifying or distributing the Library (or any work based on the
+Library), you indicate your acceptance of this License to do so, and
+all its terms and conditions for copying, distributing or modifying
+the Library or works based on it.
+
+ 10. Each time you redistribute the Library (or any work based on the
+Library), the recipient automatically receives a license from the
+original licensor to copy, distribute, link with or modify the Library
+subject to these terms and conditions. You may not impose any further
+restrictions on the recipients' exercise of the rights granted herein.
+You are not responsible for enforcing compliance by third parties with
+this License.
+
+ 11. If, as a consequence of a court judgment or allegation of patent
+infringement or for any other reason (not limited to patent issues),
+conditions are imposed on you (whether by court order, agreement or
+otherwise) that contradict the conditions of this License, they do not
+excuse you from the conditions of this License. If you cannot
+distribute so as to satisfy simultaneously your obligations under this
+License and any other pertinent obligations, then as a consequence you
+may not distribute the Library at all. For example, if a patent
+license would not permit royalty-free redistribution of the Library by
+all those who receive copies directly or indirectly through you, then
+the only way you could satisfy both it and this License would be to
+refrain entirely from distribution of the Library.
+
+If any portion of this section is held invalid or unenforceable under any
+particular circumstance, the balance of the section is intended to apply,
+and the section as a whole is intended to apply in other circumstances.
+
+It is not the purpose of this section to induce you to infringe any
+patents or other property right claims or to contest validity of any
+such claims; this section has the sole purpose of protecting the
+integrity of the free software distribution system which is
+implemented by public license practices. Many people have made
+generous contributions to the wide range of software distributed
+through that system in reliance on consistent application of that
+system; it is up to the author/donor to decide if he or she is willing
+to distribute software through any other system and a licensee cannot
+impose that choice.
+
+This section is intended to make thoroughly clear what is believed to
+be a consequence of the rest of this License.
+
+ 12. If the distribution and/or use of the Library is restricted in
+certain countries either by patents or by copyrighted interfaces, the
+original copyright holder who places the Library under this License may add
+an explicit geographical distribution limitation excluding those countries,
+so that distribution is permitted only in or among countries not thus
+excluded. In such case, this License incorporates the limitation as if
+written in the body of this License.
+
+ 13. The Free Software Foundation may publish revised and/or new
+versions of the Lesser General Public License from time to time.
+Such new versions will be similar in spirit to the present version,
+but may differ in detail to address new problems or concerns.
+
+Each version is given a distinguishing version number. If the Library
+specifies a version number of this License which applies to it and
+"any later version", you have the option of following the terms and
+conditions either of that version or of any later version published by
+the Free Software Foundation. If the Library does not specify a
+license version number, you may choose any version ever published by
+the Free Software Foundation.
+
+ 14. If you wish to incorporate parts of the Library into other free
+programs whose distribution conditions are incompatible with these,
+write to the author to ask for permission. For software which is
+copyrighted by the Free Software Foundation, write to the Free
+Software Foundation; we sometimes make exceptions for this. Our
+decision will be guided by the two goals of preserving the free status
+of all derivatives of our free software and of promoting the sharing
+and reuse of software generally.
+
+ NO WARRANTY
+
+ 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO
+WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.
+EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR
+OTHER PARTIES PROVIDE THE LIBRARY "AS IS" WITHOUT WARRANTY OF ANY
+KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE
+LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME
+THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.
+
+ 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN
+WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY
+AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU
+FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR
+CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE
+LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING
+RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A
+FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF
+SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH
+DAMAGES.
+
+ END OF TERMS AND CONDITIONS
+
+ How to Apply These Terms to Your New Libraries
+
+ If you develop a new library, and you want it to be of the greatest
+possible use to the public, we recommend making it free software that
+everyone can redistribute and change. You can do so by permitting
+redistribution under these terms (or, alternatively, under the terms of the
+ordinary General Public License).
+
+ To apply these terms, attach the following notices to the library. It is
+safest to attach them to the start of each source file to most effectively
+convey the exclusion of warranty; and each file should have at least the
+"copyright" line and a pointer to where the full notice is found.
+
+
+ Copyright (C)
+
+ This library is free software; you can redistribute it and/or
+ modify it under the terms of the GNU Lesser General Public
+ License as published by the Free Software Foundation; either
+ version 2.1 of the License, or (at your option) any later version.
+
+ This library is distributed in the hope that it will be useful,
+ but WITHOUT ANY WARRANTY; without even the implied warranty of
+ MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
+ Lesser General Public License for more details.
+
+ You should have received a copy of the GNU Lesser General Public
+ License along with this library; if not, write to the Free Software
+ Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
+
+Also add information on how to contact you by electronic and paper mail.
+
+You should also get your employer (if you work as a programmer) or your
+school, if any, to sign a "copyright disclaimer" for the library, if
+necessary. Here is a sample; alter the names:
+
+ Yoyodyne, Inc., hereby disclaims all copyright interest in the
+ library `Frob' (a library for tweaking knobs) written by James Random Hacker.
+
+ , 1 April 1990
+ Ty Coon, President of Vice
+
+That's all there is to it!
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css
new file mode 100644
index 0000000..0e22834
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/css/advhr.css
@@ -0,0 +1,5 @@
+input.radio {border:1px none #000; background:transparent; vertical-align:middle;}
+.panel_wrapper div.current {height:80px;}
+#width {width:50px; vertical-align:middle;}
+#width2 {width:50px; vertical-align:middle;}
+#size {width:100px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin.js
new file mode 100644
index 0000000..4d3b062
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedHRPlugin",{init:function(a,b){a.addCommand("mceAdvancedHr",function(){a.windowManager.open({file:b+"/rule.htm",width:250+parseInt(a.getLang("advhr.delta_width",0)),height:160+parseInt(a.getLang("advhr.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("advhr",{title:"advhr.advhr_desc",cmd:"mceAdvancedHr"});a.onNodeChange.add(function(d,c,e){c.setActive("advhr",e.nodeName=="HR")});a.onClick.add(function(c,d){d=d.target;if(d.nodeName==="HR"){c.selection.select(d)}})},getInfo:function(){return{longname:"Advanced HR",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advhr",tinymce.plugins.AdvancedHRPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js
new file mode 100644
index 0000000..0c652d3
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/editor_plugin_src.js
@@ -0,0 +1,57 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.AdvancedHRPlugin', {
+ init : function(ed, url) {
+ // Register commands
+ ed.addCommand('mceAdvancedHr', function() {
+ ed.windowManager.open({
+ file : url + '/rule.htm',
+ width : 250 + parseInt(ed.getLang('advhr.delta_width', 0)),
+ height : 160 + parseInt(ed.getLang('advhr.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ // Register buttons
+ ed.addButton('advhr', {
+ title : 'advhr.advhr_desc',
+ cmd : 'mceAdvancedHr'
+ });
+
+ ed.onNodeChange.add(function(ed, cm, n) {
+ cm.setActive('advhr', n.nodeName == 'HR');
+ });
+
+ ed.onClick.add(function(ed, e) {
+ e = e.target;
+
+ if (e.nodeName === 'HR')
+ ed.selection.select(e);
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Advanced HR',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advhr',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('advhr', tinymce.plugins.AdvancedHRPlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js
new file mode 100644
index 0000000..b6cbd66
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/js/rule.js
@@ -0,0 +1,43 @@
+var AdvHRDialog = {
+ init : function(ed) {
+ var dom = ed.dom, f = document.forms[0], n = ed.selection.getNode(), w;
+
+ w = dom.getAttrib(n, 'width');
+ f.width.value = w ? parseInt(w) : (dom.getStyle('width') || '');
+ f.size.value = dom.getAttrib(n, 'size') || parseInt(dom.getStyle('height')) || '';
+ f.noshade.checked = !!dom.getAttrib(n, 'noshade') || !!dom.getStyle('border-width');
+ selectByValue(f, 'width2', w.indexOf('%') != -1 ? '%' : 'px');
+ },
+
+ update : function() {
+ var ed = tinyMCEPopup.editor, h, f = document.forms[0], st = '';
+
+ h = '
';
+
+ ed.execCommand("mceInsertContent", false, h);
+ tinyMCEPopup.close();
+ }
+};
+
+tinyMCEPopup.requireLangPack();
+tinyMCEPopup.onInit.add(AdvHRDialog.init, AdvHRDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js
new file mode 100644
index 0000000..0c3bf15
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advhr_dlg',{size:"Height",noshade:"No Shadow",width:"Width",normal:"Normal",widthunits:"Units"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm
new file mode 100644
index 0000000..843e1f8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advhr/rule.htm
@@ -0,0 +1,58 @@
+
+
+
+ {#advhr.advhr_desc}
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css
new file mode 100644
index 0000000..54dc843
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/css/advimage.css
@@ -0,0 +1,12 @@
+#src_list, #over_list, #out_list {width:280px;}
+.mceActionPanel {margin-top:7px;}
+.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;}
+.checkbox {border:0;}
+.panel_wrapper div.current {height:305px;}
+#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;}
+#align, #classlist {width:150px;}
+#width, #height {vertical-align:middle; width:50px; text-align:center;}
+#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;}
+#class_list {width:180px;}
+#constrain, #onmousemovecheck {width:auto;}
+#id, #dir, #lang, #usemap, #longdesc {width:200px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin.js
new file mode 100644
index 0000000..d613a61
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js
new file mode 100644
index 0000000..d2678cb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/editor_plugin_src.js
@@ -0,0 +1,50 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.AdvancedImagePlugin', {
+ init : function(ed, url) {
+ // Register commands
+ ed.addCommand('mceAdvImage', function() {
+ // Internal image object like a flash placeholder
+ if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1)
+ return;
+
+ ed.windowManager.open({
+ file : url + '/image.htm',
+ width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)),
+ height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ // Register buttons
+ ed.addButton('image', {
+ title : 'advimage.image_desc',
+ cmd : 'mceAdvImage'
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Advanced image',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm
new file mode 100644
index 0000000..870af47
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/image.htm
@@ -0,0 +1,222 @@
+
+
+
+ {#advimage_dlg.dialog_title}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/img/sample.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/img/sample.gif
new file mode 100644
index 0000000..53bf689
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/img/sample.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js
new file mode 100644
index 0000000..f0b7c6e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/js/image.js
@@ -0,0 +1,464 @@
+var ImageDialog = {
+ preInit : function() {
+ var url;
+
+ tinyMCEPopup.requireLangPack();
+
+ if (url = tinyMCEPopup.getParam("external_image_list_url"))
+ document.write('');
+ },
+
+ init : function(ed) {
+ var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList');
+
+ tinyMCEPopup.resizeToInnerSize();
+ this.fillClassList('class_list');
+ this.fillFileList('src_list', fl);
+ this.fillFileList('over_list', fl);
+ this.fillFileList('out_list', fl);
+ TinyMCE_EditableSelects.init();
+
+ if (n.nodeName == 'IMG') {
+ nl.src.value = dom.getAttrib(n, 'src');
+ nl.width.value = dom.getAttrib(n, 'width');
+ nl.height.value = dom.getAttrib(n, 'height');
+ nl.alt.value = dom.getAttrib(n, 'alt');
+ nl.title.value = dom.getAttrib(n, 'title');
+ nl.vspace.value = this.getAttrib(n, 'vspace');
+ nl.hspace.value = this.getAttrib(n, 'hspace');
+ nl.border.value = this.getAttrib(n, 'border');
+ selectByValue(f, 'align', this.getAttrib(n, 'align'));
+ selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true);
+ nl.style.value = dom.getAttrib(n, 'style');
+ nl.id.value = dom.getAttrib(n, 'id');
+ nl.dir.value = dom.getAttrib(n, 'dir');
+ nl.lang.value = dom.getAttrib(n, 'lang');
+ nl.usemap.value = dom.getAttrib(n, 'usemap');
+ nl.longdesc.value = dom.getAttrib(n, 'longdesc');
+ nl.insert.value = ed.getLang('update');
+
+ if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover')))
+ nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');
+
+ if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout')))
+ nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');
+
+ if (ed.settings.inline_styles) {
+ // Move attribs to styles
+ if (dom.getAttrib(n, 'align'))
+ this.updateStyle('align');
+
+ if (dom.getAttrib(n, 'hspace'))
+ this.updateStyle('hspace');
+
+ if (dom.getAttrib(n, 'border'))
+ this.updateStyle('border');
+
+ if (dom.getAttrib(n, 'vspace'))
+ this.updateStyle('vspace');
+ }
+ }
+
+ // Setup browse button
+ document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+ if (isVisible('srcbrowser'))
+ document.getElementById('src').style.width = '260px';
+
+ // Setup browse button
+ document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image');
+ if (isVisible('overbrowser'))
+ document.getElementById('onmouseoversrc').style.width = '260px';
+
+ // Setup browse button
+ document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image');
+ if (isVisible('outbrowser'))
+ document.getElementById('onmouseoutsrc').style.width = '260px';
+
+ // If option enabled default contrain proportions to checked
+ if (ed.getParam("advimage_constrain_proportions", true))
+ f.constrain.checked = true;
+
+ // Check swap image if valid data
+ if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value)
+ this.setSwapImage(true);
+ else
+ this.setSwapImage(false);
+
+ this.changeAppearance();
+ this.showPreviewImage(nl.src.value, 1);
+ },
+
+ insert : function(file, title) {
+ var ed = tinyMCEPopup.editor, t = this, f = document.forms[0];
+
+ if (f.src.value === '') {
+ if (ed.selection.getNode().nodeName == 'IMG') {
+ ed.dom.remove(ed.selection.getNode());
+ ed.execCommand('mceRepaint');
+ }
+
+ tinyMCEPopup.close();
+ return;
+ }
+
+ if (tinyMCEPopup.getParam("accessibility_warnings", 1)) {
+ if (!f.alt.value) {
+ tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) {
+ if (s)
+ t.insertAndClose();
+ });
+
+ return;
+ }
+ }
+
+ t.insertAndClose();
+ },
+
+ insertAndClose : function() {
+ var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el;
+
+ tinyMCEPopup.restoreSelection();
+
+ // Fixes crash in Safari
+ if (tinymce.isWebKit)
+ ed.getWin().focus();
+
+ if (!ed.settings.inline_styles) {
+ args = {
+ vspace : nl.vspace.value,
+ hspace : nl.hspace.value,
+ border : nl.border.value,
+ align : getSelectValue(f, 'align')
+ };
+ } else {
+ // Remove deprecated values
+ args = {
+ vspace : '',
+ hspace : '',
+ border : '',
+ align : ''
+ };
+ }
+
+ tinymce.extend(args, {
+ src : nl.src.value.replace(/ /g, '%20'),
+ width : nl.width.value,
+ height : nl.height.value,
+ alt : nl.alt.value,
+ title : nl.title.value,
+ 'class' : getSelectValue(f, 'class_list'),
+ style : nl.style.value,
+ id : nl.id.value,
+ dir : nl.dir.value,
+ lang : nl.lang.value,
+ usemap : nl.usemap.value,
+ longdesc : nl.longdesc.value
+ });
+
+ args.onmouseover = args.onmouseout = '';
+
+ if (f.onmousemovecheck.checked) {
+ if (nl.onmouseoversrc.value)
+ args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';";
+
+ if (nl.onmouseoutsrc.value)
+ args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';";
+ }
+
+ el = ed.selection.getNode();
+
+ if (el && el.nodeName == 'IMG') {
+ ed.dom.setAttribs(el, args);
+ } else {
+ tinymce.each(args, function(value, name) {
+ if (value === "") {
+ delete args[name];
+ }
+ });
+
+ ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1});
+ ed.undoManager.add();
+ }
+
+ tinyMCEPopup.editor.execCommand('mceRepaint');
+ tinyMCEPopup.editor.focus();
+ tinyMCEPopup.close();
+ },
+
+ getAttrib : function(e, at) {
+ var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;
+
+ if (ed.settings.inline_styles) {
+ switch (at) {
+ case 'align':
+ if (v = dom.getStyle(e, 'float'))
+ return v;
+
+ if (v = dom.getStyle(e, 'vertical-align'))
+ return v;
+
+ break;
+
+ case 'hspace':
+ v = dom.getStyle(e, 'margin-left')
+ v2 = dom.getStyle(e, 'margin-right');
+
+ if (v && v == v2)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+
+ case 'vspace':
+ v = dom.getStyle(e, 'margin-top')
+ v2 = dom.getStyle(e, 'margin-bottom');
+ if (v && v == v2)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+
+ case 'border':
+ v = 0;
+
+ tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {
+ sv = dom.getStyle(e, 'border-' + sv + '-width');
+
+ // False or not the same as prev
+ if (!sv || (sv != v && v !== 0)) {
+ v = 0;
+ return false;
+ }
+
+ if (sv)
+ v = sv;
+ });
+
+ if (v)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+ }
+ }
+
+ if (v = dom.getAttrib(e, at))
+ return v;
+
+ return '';
+ },
+
+ setSwapImage : function(st) {
+ var f = document.forms[0];
+
+ f.onmousemovecheck.checked = st;
+ setBrowserDisabled('overbrowser', !st);
+ setBrowserDisabled('outbrowser', !st);
+
+ if (f.over_list)
+ f.over_list.disabled = !st;
+
+ if (f.out_list)
+ f.out_list.disabled = !st;
+
+ f.onmouseoversrc.disabled = !st;
+ f.onmouseoutsrc.disabled = !st;
+ },
+
+ fillClassList : function(id) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+ if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
+ cl = [];
+
+ tinymce.each(v.split(';'), function(v) {
+ var p = v.split('=');
+
+ cl.push({'title' : p[0], 'class' : p[1]});
+ });
+ } else
+ cl = tinyMCEPopup.editor.dom.getClasses();
+
+ if (cl.length > 0) {
+ lst.options.length = 0;
+ lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+
+ tinymce.each(cl, function(o) {
+ lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
+ });
+ } else
+ dom.remove(dom.getParent(id, 'tr'));
+ },
+
+ fillFileList : function(id, l) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+ l = typeof(l) === 'function' ? l() : window[l];
+ lst.options.length = 0;
+
+ if (l && l.length > 0) {
+ lst.options[lst.options.length] = new Option('', '');
+
+ tinymce.each(l, function(o) {
+ lst.options[lst.options.length] = new Option(o[0], o[1]);
+ });
+ } else
+ dom.remove(dom.getParent(id, 'tr'));
+ },
+
+ resetImageData : function() {
+ var f = document.forms[0];
+
+ f.elements.width.value = f.elements.height.value = '';
+ },
+
+ updateImageData : function(img, st) {
+ var f = document.forms[0];
+
+ if (!st) {
+ f.elements.width.value = img.width;
+ f.elements.height.value = img.height;
+ }
+
+ this.preloadImg = img;
+ },
+
+ changeAppearance : function() {
+ var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg');
+
+ if (img) {
+ if (ed.getParam('inline_styles')) {
+ ed.dom.setAttrib(img, 'style', f.style.value);
+ } else {
+ img.align = f.align.value;
+ img.border = f.border.value;
+ img.hspace = f.hspace.value;
+ img.vspace = f.vspace.value;
+ }
+ }
+ },
+
+ changeHeight : function() {
+ var f = document.forms[0], tp, t = this;
+
+ if (!f.constrain.checked || !t.preloadImg) {
+ return;
+ }
+
+ if (f.width.value == "" || f.height.value == "")
+ return;
+
+ tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height;
+ f.height.value = tp.toFixed(0);
+ },
+
+ changeWidth : function() {
+ var f = document.forms[0], tp, t = this;
+
+ if (!f.constrain.checked || !t.preloadImg) {
+ return;
+ }
+
+ if (f.width.value == "" || f.height.value == "")
+ return;
+
+ tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width;
+ f.width.value = tp.toFixed(0);
+ },
+
+ updateStyle : function(ty) {
+ var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value});
+
+ if (tinyMCEPopup.editor.settings.inline_styles) {
+ // Handle align
+ if (ty == 'align') {
+ dom.setStyle(img, 'float', '');
+ dom.setStyle(img, 'vertical-align', '');
+
+ v = getSelectValue(f, 'align');
+ if (v) {
+ if (v == 'left' || v == 'right')
+ dom.setStyle(img, 'float', v);
+ else
+ img.style.verticalAlign = v;
+ }
+ }
+
+ // Handle border
+ if (ty == 'border') {
+ b = img.style.border ? img.style.border.split(' ') : [];
+ bStyle = dom.getStyle(img, 'border-style');
+ bColor = dom.getStyle(img, 'border-color');
+
+ dom.setStyle(img, 'border', '');
+
+ v = f.border.value;
+ if (v || v == '0') {
+ if (v == '0')
+ img.style.border = isIE ? '0' : '0 none none';
+ else {
+ var isOldIE = tinymce.isIE && (!document.documentMode || document.documentMode < 9);
+
+ if (b.length == 3 && b[isOldIE ? 2 : 1])
+ bStyle = b[isOldIE ? 2 : 1];
+ else if (!bStyle || bStyle == 'none')
+ bStyle = 'solid';
+ if (b.length == 3 && b[isIE ? 0 : 2])
+ bColor = b[isOldIE ? 0 : 2];
+ else if (!bColor || bColor == 'none')
+ bColor = 'black';
+ img.style.border = v + 'px ' + bStyle + ' ' + bColor;
+ }
+ }
+ }
+
+ // Handle hspace
+ if (ty == 'hspace') {
+ dom.setStyle(img, 'marginLeft', '');
+ dom.setStyle(img, 'marginRight', '');
+
+ v = f.hspace.value;
+ if (v) {
+ img.style.marginLeft = v + 'px';
+ img.style.marginRight = v + 'px';
+ }
+ }
+
+ // Handle vspace
+ if (ty == 'vspace') {
+ dom.setStyle(img, 'marginTop', '');
+ dom.setStyle(img, 'marginBottom', '');
+
+ v = f.vspace.value;
+ if (v) {
+ img.style.marginTop = v + 'px';
+ img.style.marginBottom = v + 'px';
+ }
+ }
+
+ // Merge
+ dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img');
+ }
+ },
+
+ changeMouseMove : function() {
+ },
+
+ showPreviewImage : function(u, st) {
+ if (!u) {
+ tinyMCEPopup.dom.setHTML('prev', '');
+ return;
+ }
+
+ if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true))
+ this.resetImageData();
+
+ u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u);
+
+ if (!st)
+ tinyMCEPopup.dom.setHTML('prev', '
');
+ else
+ tinyMCEPopup.dom.setHTML('prev', '
');
+ }
+};
+
+ImageDialog.preInit();
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js
new file mode 100644
index 0000000..5f122e2
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advimage_dlg',{"image_list":"Image List","align_right":"Right","align_left":"Left","align_textbottom":"Text Bottom","align_texttop":"Text Top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"Alignment",hspace:"Horizontal Space",vspace:"Vertical Space",dimensions:"Dimensions",border:"Border",list:"Image List",alt:"Image Description",src:"Image URL","dialog_title":"Insert/Edit Image","missing_alt":"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.","example_img":"Appearance Preview Image",misc:"Miscellaneous",mouseout:"For Mouse Out",mouseover:"For Mouse Over","alt_image":"Alternative Image","swap_image":"Swap Image",map:"Image Map",id:"ID",rtl:"Right to Left",ltr:"Left to Right",classes:"Classes",style:"Style","long_desc":"Long Description Link",langcode:"Language Code",langdir:"Language Direction","constrain_proportions":"Constrain Proportions",preview:"Preview",title:"Title",general:"General","tab_advanced":"Advanced","tab_appearance":"Appearance","tab_general":"General",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/css/advimage.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/css/advimage.css
new file mode 100644
index 0000000..0a6251a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/css/advimage.css
@@ -0,0 +1,13 @@
+#src_list, #over_list, #out_list {width:280px;}
+.mceActionPanel {margin-top:7px;}
+.alignPreview {border:1px solid #000; width:140px; height:140px; overflow:hidden; padding:5px;}
+.checkbox {border:0;}
+.panel_wrapper div.current {height:305px;}
+#prev {margin:0; border:1px solid #000; width:428px; height:150px; overflow:auto;}
+#align, #classlist {width:150px;}
+#width, #height {vertical-align:middle; width:50px; text-align:center;}
+#vspace, #hspace, #border {vertical-align:middle; width:30px; text-align:center;}
+#class_list {width:180px;}
+input {width: 280px;}
+#constrain, #onmousemovecheck {width:auto;}
+#id, #dir, #lang, #usemap, #longdesc {width:200px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin.js
new file mode 100644
index 0000000..d613a61
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedImagePlugin",{init:function(a,b){a.addCommand("mceAdvImage",function(){if(a.dom.getAttrib(a.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}a.windowManager.open({file:b+"/image.htm",width:480+parseInt(a.getLang("advimage.delta_width",0)),height:385+parseInt(a.getLang("advimage.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("image",{title:"advimage.image_desc",cmd:"mceAdvImage"})},getInfo:function(){return{longname:"Advanced image",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advimage",tinymce.plugins.AdvancedImagePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin_src.js
new file mode 100644
index 0000000..d2678cb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/editor_plugin_src.js
@@ -0,0 +1,50 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.AdvancedImagePlugin', {
+ init : function(ed, url) {
+ // Register commands
+ ed.addCommand('mceAdvImage', function() {
+ // Internal image object like a flash placeholder
+ if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1)
+ return;
+
+ ed.windowManager.open({
+ file : url + '/image.htm',
+ width : 480 + parseInt(ed.getLang('advimage.delta_width', 0)),
+ height : 385 + parseInt(ed.getLang('advimage.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ // Register buttons
+ ed.addButton('image', {
+ title : 'advimage.image_desc',
+ cmd : 'mceAdvImage'
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Advanced image',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advimage',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('advimage', tinymce.plugins.AdvancedImagePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/image.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/image.htm
new file mode 100644
index 0000000..ed16b3d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/image.htm
@@ -0,0 +1,235 @@
+
+
+
+ {#advimage_dlg.dialog_title}
+
+
+
+
+
+
+
+
+
+ {#advimage_dlg.dialog_title}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/img/sample.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/img/sample.gif
new file mode 100644
index 0000000..53bf689
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/img/sample.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/js/image.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/js/image.js
new file mode 100644
index 0000000..f0b7c6e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/js/image.js
@@ -0,0 +1,464 @@
+var ImageDialog = {
+ preInit : function() {
+ var url;
+
+ tinyMCEPopup.requireLangPack();
+
+ if (url = tinyMCEPopup.getParam("external_image_list_url"))
+ document.write('');
+ },
+
+ init : function(ed) {
+ var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode(), fl = tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList');
+
+ tinyMCEPopup.resizeToInnerSize();
+ this.fillClassList('class_list');
+ this.fillFileList('src_list', fl);
+ this.fillFileList('over_list', fl);
+ this.fillFileList('out_list', fl);
+ TinyMCE_EditableSelects.init();
+
+ if (n.nodeName == 'IMG') {
+ nl.src.value = dom.getAttrib(n, 'src');
+ nl.width.value = dom.getAttrib(n, 'width');
+ nl.height.value = dom.getAttrib(n, 'height');
+ nl.alt.value = dom.getAttrib(n, 'alt');
+ nl.title.value = dom.getAttrib(n, 'title');
+ nl.vspace.value = this.getAttrib(n, 'vspace');
+ nl.hspace.value = this.getAttrib(n, 'hspace');
+ nl.border.value = this.getAttrib(n, 'border');
+ selectByValue(f, 'align', this.getAttrib(n, 'align'));
+ selectByValue(f, 'class_list', dom.getAttrib(n, 'class'), true, true);
+ nl.style.value = dom.getAttrib(n, 'style');
+ nl.id.value = dom.getAttrib(n, 'id');
+ nl.dir.value = dom.getAttrib(n, 'dir');
+ nl.lang.value = dom.getAttrib(n, 'lang');
+ nl.usemap.value = dom.getAttrib(n, 'usemap');
+ nl.longdesc.value = dom.getAttrib(n, 'longdesc');
+ nl.insert.value = ed.getLang('update');
+
+ if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseover')))
+ nl.onmouseoversrc.value = dom.getAttrib(n, 'onmouseover').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');
+
+ if (/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/.test(dom.getAttrib(n, 'onmouseout')))
+ nl.onmouseoutsrc.value = dom.getAttrib(n, 'onmouseout').replace(/^\s*this.src\s*=\s*\'([^\']+)\';?\s*$/, '$1');
+
+ if (ed.settings.inline_styles) {
+ // Move attribs to styles
+ if (dom.getAttrib(n, 'align'))
+ this.updateStyle('align');
+
+ if (dom.getAttrib(n, 'hspace'))
+ this.updateStyle('hspace');
+
+ if (dom.getAttrib(n, 'border'))
+ this.updateStyle('border');
+
+ if (dom.getAttrib(n, 'vspace'))
+ this.updateStyle('vspace');
+ }
+ }
+
+ // Setup browse button
+ document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+ if (isVisible('srcbrowser'))
+ document.getElementById('src').style.width = '260px';
+
+ // Setup browse button
+ document.getElementById('onmouseoversrccontainer').innerHTML = getBrowserHTML('overbrowser','onmouseoversrc','image','theme_advanced_image');
+ if (isVisible('overbrowser'))
+ document.getElementById('onmouseoversrc').style.width = '260px';
+
+ // Setup browse button
+ document.getElementById('onmouseoutsrccontainer').innerHTML = getBrowserHTML('outbrowser','onmouseoutsrc','image','theme_advanced_image');
+ if (isVisible('outbrowser'))
+ document.getElementById('onmouseoutsrc').style.width = '260px';
+
+ // If option enabled default contrain proportions to checked
+ if (ed.getParam("advimage_constrain_proportions", true))
+ f.constrain.checked = true;
+
+ // Check swap image if valid data
+ if (nl.onmouseoversrc.value || nl.onmouseoutsrc.value)
+ this.setSwapImage(true);
+ else
+ this.setSwapImage(false);
+
+ this.changeAppearance();
+ this.showPreviewImage(nl.src.value, 1);
+ },
+
+ insert : function(file, title) {
+ var ed = tinyMCEPopup.editor, t = this, f = document.forms[0];
+
+ if (f.src.value === '') {
+ if (ed.selection.getNode().nodeName == 'IMG') {
+ ed.dom.remove(ed.selection.getNode());
+ ed.execCommand('mceRepaint');
+ }
+
+ tinyMCEPopup.close();
+ return;
+ }
+
+ if (tinyMCEPopup.getParam("accessibility_warnings", 1)) {
+ if (!f.alt.value) {
+ tinyMCEPopup.confirm(tinyMCEPopup.getLang('advimage_dlg.missing_alt'), function(s) {
+ if (s)
+ t.insertAndClose();
+ });
+
+ return;
+ }
+ }
+
+ t.insertAndClose();
+ },
+
+ insertAndClose : function() {
+ var ed = tinyMCEPopup.editor, f = document.forms[0], nl = f.elements, v, args = {}, el;
+
+ tinyMCEPopup.restoreSelection();
+
+ // Fixes crash in Safari
+ if (tinymce.isWebKit)
+ ed.getWin().focus();
+
+ if (!ed.settings.inline_styles) {
+ args = {
+ vspace : nl.vspace.value,
+ hspace : nl.hspace.value,
+ border : nl.border.value,
+ align : getSelectValue(f, 'align')
+ };
+ } else {
+ // Remove deprecated values
+ args = {
+ vspace : '',
+ hspace : '',
+ border : '',
+ align : ''
+ };
+ }
+
+ tinymce.extend(args, {
+ src : nl.src.value.replace(/ /g, '%20'),
+ width : nl.width.value,
+ height : nl.height.value,
+ alt : nl.alt.value,
+ title : nl.title.value,
+ 'class' : getSelectValue(f, 'class_list'),
+ style : nl.style.value,
+ id : nl.id.value,
+ dir : nl.dir.value,
+ lang : nl.lang.value,
+ usemap : nl.usemap.value,
+ longdesc : nl.longdesc.value
+ });
+
+ args.onmouseover = args.onmouseout = '';
+
+ if (f.onmousemovecheck.checked) {
+ if (nl.onmouseoversrc.value)
+ args.onmouseover = "this.src='" + nl.onmouseoversrc.value + "';";
+
+ if (nl.onmouseoutsrc.value)
+ args.onmouseout = "this.src='" + nl.onmouseoutsrc.value + "';";
+ }
+
+ el = ed.selection.getNode();
+
+ if (el && el.nodeName == 'IMG') {
+ ed.dom.setAttribs(el, args);
+ } else {
+ tinymce.each(args, function(value, name) {
+ if (value === "") {
+ delete args[name];
+ }
+ });
+
+ ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1});
+ ed.undoManager.add();
+ }
+
+ tinyMCEPopup.editor.execCommand('mceRepaint');
+ tinyMCEPopup.editor.focus();
+ tinyMCEPopup.close();
+ },
+
+ getAttrib : function(e, at) {
+ var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;
+
+ if (ed.settings.inline_styles) {
+ switch (at) {
+ case 'align':
+ if (v = dom.getStyle(e, 'float'))
+ return v;
+
+ if (v = dom.getStyle(e, 'vertical-align'))
+ return v;
+
+ break;
+
+ case 'hspace':
+ v = dom.getStyle(e, 'margin-left')
+ v2 = dom.getStyle(e, 'margin-right');
+
+ if (v && v == v2)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+
+ case 'vspace':
+ v = dom.getStyle(e, 'margin-top')
+ v2 = dom.getStyle(e, 'margin-bottom');
+ if (v && v == v2)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+
+ case 'border':
+ v = 0;
+
+ tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {
+ sv = dom.getStyle(e, 'border-' + sv + '-width');
+
+ // False or not the same as prev
+ if (!sv || (sv != v && v !== 0)) {
+ v = 0;
+ return false;
+ }
+
+ if (sv)
+ v = sv;
+ });
+
+ if (v)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+ }
+ }
+
+ if (v = dom.getAttrib(e, at))
+ return v;
+
+ return '';
+ },
+
+ setSwapImage : function(st) {
+ var f = document.forms[0];
+
+ f.onmousemovecheck.checked = st;
+ setBrowserDisabled('overbrowser', !st);
+ setBrowserDisabled('outbrowser', !st);
+
+ if (f.over_list)
+ f.over_list.disabled = !st;
+
+ if (f.out_list)
+ f.out_list.disabled = !st;
+
+ f.onmouseoversrc.disabled = !st;
+ f.onmouseoutsrc.disabled = !st;
+ },
+
+ fillClassList : function(id) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+ if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
+ cl = [];
+
+ tinymce.each(v.split(';'), function(v) {
+ var p = v.split('=');
+
+ cl.push({'title' : p[0], 'class' : p[1]});
+ });
+ } else
+ cl = tinyMCEPopup.editor.dom.getClasses();
+
+ if (cl.length > 0) {
+ lst.options.length = 0;
+ lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+
+ tinymce.each(cl, function(o) {
+ lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
+ });
+ } else
+ dom.remove(dom.getParent(id, 'tr'));
+ },
+
+ fillFileList : function(id, l) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+ l = typeof(l) === 'function' ? l() : window[l];
+ lst.options.length = 0;
+
+ if (l && l.length > 0) {
+ lst.options[lst.options.length] = new Option('', '');
+
+ tinymce.each(l, function(o) {
+ lst.options[lst.options.length] = new Option(o[0], o[1]);
+ });
+ } else
+ dom.remove(dom.getParent(id, 'tr'));
+ },
+
+ resetImageData : function() {
+ var f = document.forms[0];
+
+ f.elements.width.value = f.elements.height.value = '';
+ },
+
+ updateImageData : function(img, st) {
+ var f = document.forms[0];
+
+ if (!st) {
+ f.elements.width.value = img.width;
+ f.elements.height.value = img.height;
+ }
+
+ this.preloadImg = img;
+ },
+
+ changeAppearance : function() {
+ var ed = tinyMCEPopup.editor, f = document.forms[0], img = document.getElementById('alignSampleImg');
+
+ if (img) {
+ if (ed.getParam('inline_styles')) {
+ ed.dom.setAttrib(img, 'style', f.style.value);
+ } else {
+ img.align = f.align.value;
+ img.border = f.border.value;
+ img.hspace = f.hspace.value;
+ img.vspace = f.vspace.value;
+ }
+ }
+ },
+
+ changeHeight : function() {
+ var f = document.forms[0], tp, t = this;
+
+ if (!f.constrain.checked || !t.preloadImg) {
+ return;
+ }
+
+ if (f.width.value == "" || f.height.value == "")
+ return;
+
+ tp = (parseInt(f.width.value) / parseInt(t.preloadImg.width)) * t.preloadImg.height;
+ f.height.value = tp.toFixed(0);
+ },
+
+ changeWidth : function() {
+ var f = document.forms[0], tp, t = this;
+
+ if (!f.constrain.checked || !t.preloadImg) {
+ return;
+ }
+
+ if (f.width.value == "" || f.height.value == "")
+ return;
+
+ tp = (parseInt(f.height.value) / parseInt(t.preloadImg.height)) * t.preloadImg.width;
+ f.width.value = tp.toFixed(0);
+ },
+
+ updateStyle : function(ty) {
+ var dom = tinyMCEPopup.dom, b, bStyle, bColor, v, isIE = tinymce.isIE, f = document.forms[0], img = dom.create('img', {style : dom.get('style').value});
+
+ if (tinyMCEPopup.editor.settings.inline_styles) {
+ // Handle align
+ if (ty == 'align') {
+ dom.setStyle(img, 'float', '');
+ dom.setStyle(img, 'vertical-align', '');
+
+ v = getSelectValue(f, 'align');
+ if (v) {
+ if (v == 'left' || v == 'right')
+ dom.setStyle(img, 'float', v);
+ else
+ img.style.verticalAlign = v;
+ }
+ }
+
+ // Handle border
+ if (ty == 'border') {
+ b = img.style.border ? img.style.border.split(' ') : [];
+ bStyle = dom.getStyle(img, 'border-style');
+ bColor = dom.getStyle(img, 'border-color');
+
+ dom.setStyle(img, 'border', '');
+
+ v = f.border.value;
+ if (v || v == '0') {
+ if (v == '0')
+ img.style.border = isIE ? '0' : '0 none none';
+ else {
+ var isOldIE = tinymce.isIE && (!document.documentMode || document.documentMode < 9);
+
+ if (b.length == 3 && b[isOldIE ? 2 : 1])
+ bStyle = b[isOldIE ? 2 : 1];
+ else if (!bStyle || bStyle == 'none')
+ bStyle = 'solid';
+ if (b.length == 3 && b[isIE ? 0 : 2])
+ bColor = b[isOldIE ? 0 : 2];
+ else if (!bColor || bColor == 'none')
+ bColor = 'black';
+ img.style.border = v + 'px ' + bStyle + ' ' + bColor;
+ }
+ }
+ }
+
+ // Handle hspace
+ if (ty == 'hspace') {
+ dom.setStyle(img, 'marginLeft', '');
+ dom.setStyle(img, 'marginRight', '');
+
+ v = f.hspace.value;
+ if (v) {
+ img.style.marginLeft = v + 'px';
+ img.style.marginRight = v + 'px';
+ }
+ }
+
+ // Handle vspace
+ if (ty == 'vspace') {
+ dom.setStyle(img, 'marginTop', '');
+ dom.setStyle(img, 'marginBottom', '');
+
+ v = f.vspace.value;
+ if (v) {
+ img.style.marginTop = v + 'px';
+ img.style.marginBottom = v + 'px';
+ }
+ }
+
+ // Merge
+ dom.get('style').value = dom.serializeStyle(dom.parseStyle(img.style.cssText), 'img');
+ }
+ },
+
+ changeMouseMove : function() {
+ },
+
+ showPreviewImage : function(u, st) {
+ if (!u) {
+ tinyMCEPopup.dom.setHTML('prev', '');
+ return;
+ }
+
+ if (!st && tinyMCEPopup.getParam("advimage_update_dimensions_onchange", true))
+ this.resetImageData();
+
+ u = tinyMCEPopup.editor.documentBaseURI.toAbsolute(u);
+
+ if (!st)
+ tinyMCEPopup.dom.setHTML('prev', '
');
+ else
+ tinyMCEPopup.dom.setHTML('prev', '
');
+ }
+};
+
+ImageDialog.preInit();
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/langs/en_dlg.js
new file mode 100644
index 0000000..5f122e2
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advimage_orig/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advimage_dlg',{"image_list":"Image List","align_right":"Right","align_left":"Left","align_textbottom":"Text Bottom","align_texttop":"Text Top","align_bottom":"Bottom","align_middle":"Middle","align_top":"Top","align_baseline":"Baseline",align:"Alignment",hspace:"Horizontal Space",vspace:"Vertical Space",dimensions:"Dimensions",border:"Border",list:"Image List",alt:"Image Description",src:"Image URL","dialog_title":"Insert/Edit Image","missing_alt":"Are you sure you want to continue without including an Image Description? Without it the image may not be accessible to some users with disabilities, or to those using a text browser, or browsing the Web with images turned off.","example_img":"Appearance Preview Image",misc:"Miscellaneous",mouseout:"For Mouse Out",mouseover:"For Mouse Over","alt_image":"Alternative Image","swap_image":"Swap Image",map:"Image Map",id:"ID",rtl:"Right to Left",ltr:"Left to Right",classes:"Classes",style:"Style","long_desc":"Long Description Link",langcode:"Language Code",langdir:"Language Direction","constrain_proportions":"Constrain Proportions",preview:"Preview",title:"Title",general:"General","tab_advanced":"Advanced","tab_appearance":"Appearance","tab_general":"General",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css
new file mode 100644
index 0000000..1436431
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/css/advlink.css
@@ -0,0 +1,8 @@
+.mceLinkList, .mceAnchorList, #targetlist {width:280px;}
+.mceActionPanel {margin-top:7px;}
+.panel_wrapper div.current {height:320px;}
+#classlist, #title, #href {width:280px;}
+#popupurl, #popupname {width:200px;}
+#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;}
+#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;}
+#events_panel input {width:200px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin.js
new file mode 100644
index 0000000..983fe5a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js
new file mode 100644
index 0000000..14e46a7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/editor_plugin_src.js
@@ -0,0 +1,61 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.AdvancedLinkPlugin', {
+ init : function(ed, url) {
+ this.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceAdvLink', function() {
+ var se = ed.selection;
+
+ // No selection and not in link
+ if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A'))
+ return;
+
+ ed.windowManager.open({
+ file : url + '/link.htm',
+ width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)),
+ height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ // Register buttons
+ ed.addButton('link', {
+ title : 'advlink.link_desc',
+ cmd : 'mceAdvLink'
+ });
+
+ ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink');
+
+ ed.onNodeChange.add(function(ed, cm, n, co) {
+ cm.setDisabled('link', co && n.nodeName != 'A');
+ cm.setActive('link', n.nodeName == 'A' && !n.name);
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Advanced link',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js
new file mode 100644
index 0000000..f013aac
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/js/advlink.js
@@ -0,0 +1,543 @@
+/* Functions for the advlink plugin popup */
+
+tinyMCEPopup.requireLangPack();
+
+var templates = {
+ "window.open" : "window.open('${url}','${target}','${options}')"
+};
+
+function preinit() {
+ var url;
+
+ if (url = tinyMCEPopup.getParam("external_link_list_url"))
+ document.write('');
+}
+
+function changeClass() {
+ var f = document.forms[0];
+
+ f.classes.value = getSelectValue(f, 'classlist');
+}
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ var formObj = document.forms[0];
+ var inst = tinyMCEPopup.editor;
+ var elm = inst.selection.getNode();
+ var action = "insert";
+ var html;
+
+ document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');
+ document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');
+ document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');
+
+ // Link list
+ html = getLinkListHTML('linklisthref','href');
+ if (html == "")
+ document.getElementById("linklisthrefrow").style.display = 'none';
+ else
+ document.getElementById("linklisthrefcontainer").innerHTML = html;
+
+ // Anchor list
+ html = getAnchorListHTML('anchorlist','href');
+ if (html == "")
+ document.getElementById("anchorlistrow").style.display = 'none';
+ else
+ document.getElementById("anchorlistcontainer").innerHTML = html;
+
+ // Resize some elements
+ if (isVisible('hrefbrowser'))
+ document.getElementById('href').style.width = '260px';
+
+ if (isVisible('popupurlbrowser'))
+ document.getElementById('popupurl').style.width = '180px';
+
+ elm = inst.dom.getParent(elm, "A");
+ if (elm == null) {
+ var prospect = inst.dom.create("p", null, inst.selection.getContent());
+ if (prospect.childNodes.length === 1) {
+ elm = prospect.firstChild;
+ }
+ }
+
+ if (elm != null && elm.nodeName == "A")
+ action = "update";
+
+ formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true);
+
+ setPopupControlsDisabled(true);
+
+ if (action == "update") {
+ var href = inst.dom.getAttrib(elm, 'href');
+ var onclick = inst.dom.getAttrib(elm, 'onclick');
+ var linkTarget = inst.dom.getAttrib(elm, 'target') ? inst.dom.getAttrib(elm, 'target') : "_self";
+
+ // Setup form data
+ setFormValue('href', href);
+ setFormValue('title', inst.dom.getAttrib(elm, 'title'));
+ setFormValue('id', inst.dom.getAttrib(elm, 'id'));
+ setFormValue('style', inst.dom.getAttrib(elm, "style"));
+ setFormValue('rel', inst.dom.getAttrib(elm, 'rel'));
+ setFormValue('rev', inst.dom.getAttrib(elm, 'rev'));
+ setFormValue('charset', inst.dom.getAttrib(elm, 'charset'));
+ setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang'));
+ setFormValue('dir', inst.dom.getAttrib(elm, 'dir'));
+ setFormValue('lang', inst.dom.getAttrib(elm, 'lang'));
+ setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
+ setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
+ setFormValue('type', inst.dom.getAttrib(elm, 'type'));
+ setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus'));
+ setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur'));
+ setFormValue('onclick', onclick);
+ setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick'));
+ setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown'));
+ setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup'));
+ setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover'));
+ setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove'));
+ setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout'));
+ setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress'));
+ setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown'));
+ setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup'));
+ setFormValue('target', linkTarget);
+ setFormValue('classes', inst.dom.getAttrib(elm, 'class'));
+
+ // Parse onclick data
+ if (onclick != null && onclick.indexOf('window.open') != -1)
+ parseWindowOpen(onclick);
+ else
+ parseFunction(onclick);
+
+ // Select by the values
+ selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir'));
+ selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel'));
+ selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev'));
+ selectByValue(formObj, 'linklisthref', href);
+
+ if (href.charAt(0) == '#')
+ selectByValue(formObj, 'anchorlist', href);
+
+ addClassesToList('classlist', 'advlink_styles');
+
+ selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true);
+ selectByValue(formObj, 'targetlist', linkTarget, true);
+ } else
+ addClassesToList('classlist', 'advlink_styles');
+}
+
+function checkPrefix(n) {
+ if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email')))
+ n.value = 'mailto:' + n.value;
+
+ if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external')))
+ n.value = 'http://' + n.value;
+}
+
+function setFormValue(name, value) {
+ document.forms[0].elements[name].value = value;
+}
+
+function parseWindowOpen(onclick) {
+ var formObj = document.forms[0];
+
+ // Preprocess center code
+ if (onclick.indexOf('return false;') != -1) {
+ formObj.popupreturn.checked = true;
+ onclick = onclick.replace('return false;', '');
+ } else
+ formObj.popupreturn.checked = false;
+
+ var onClickData = parseLink(onclick);
+
+ if (onClickData != null) {
+ formObj.ispopup.checked = true;
+ setPopupControlsDisabled(false);
+
+ var onClickWindowOptions = parseOptions(onClickData['options']);
+ var url = onClickData['url'];
+
+ formObj.popupname.value = onClickData['target'];
+ formObj.popupurl.value = url;
+ formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');
+ formObj.popupheight.value = getOption(onClickWindowOptions, 'height');
+
+ formObj.popupleft.value = getOption(onClickWindowOptions, 'left');
+ formObj.popuptop.value = getOption(onClickWindowOptions, 'top');
+
+ if (formObj.popupleft.value.indexOf('screen') != -1)
+ formObj.popupleft.value = "c";
+
+ if (formObj.popuptop.value.indexOf('screen') != -1)
+ formObj.popuptop.value = "c";
+
+ formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";
+ formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";
+ formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";
+ formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";
+ formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";
+ formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";
+ formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";
+
+ buildOnClick();
+ }
+}
+
+function parseFunction(onclick) {
+ var formObj = document.forms[0];
+ var onClickData = parseLink(onclick);
+
+ // TODO: Add stuff here
+}
+
+function getOption(opts, name) {
+ return typeof(opts[name]) == "undefined" ? "" : opts[name];
+}
+
+function setPopupControlsDisabled(state) {
+ var formObj = document.forms[0];
+
+ formObj.popupname.disabled = state;
+ formObj.popupurl.disabled = state;
+ formObj.popupwidth.disabled = state;
+ formObj.popupheight.disabled = state;
+ formObj.popupleft.disabled = state;
+ formObj.popuptop.disabled = state;
+ formObj.popuplocation.disabled = state;
+ formObj.popupscrollbars.disabled = state;
+ formObj.popupmenubar.disabled = state;
+ formObj.popupresizable.disabled = state;
+ formObj.popuptoolbar.disabled = state;
+ formObj.popupstatus.disabled = state;
+ formObj.popupreturn.disabled = state;
+ formObj.popupdependent.disabled = state;
+
+ setBrowserDisabled('popupurlbrowser', state);
+}
+
+function parseLink(link) {
+ link = link.replace(new RegExp(''', 'g'), "'");
+
+ var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");
+
+ // Is function name a template function
+ var template = templates[fnName];
+ if (template) {
+ // Build regexp
+ var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));
+ var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";
+ var replaceStr = "";
+ for (var i=0; i";
+ } else
+ regExp += ".*";
+ }
+
+ regExp += "\\);?";
+
+ // Build variable array
+ var variables = [];
+ variables["_function"] = fnName;
+ var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('');
+ for (var i=0; i' + name + '';
+
+ if ((name = nodes[i].id) != "" && !nodes[i].href)
+ html += '';
+ }
+
+ if (html == "")
+ return "";
+
+ html = '';
+
+ return html;
+}
+
+function insertAction() {
+ var inst = tinyMCEPopup.editor;
+ var elm, elementArray, i;
+
+ elm = inst.selection.getNode();
+ checkPrefix(document.forms[0].href);
+
+ elm = inst.dom.getParent(elm, "A");
+
+ // Remove element if there is no href
+ if (!document.forms[0].href.value) {
+ i = inst.selection.getBookmark();
+ inst.dom.remove(elm, 1);
+ inst.selection.moveToBookmark(i);
+ tinyMCEPopup.execCommand("mceEndUndoLevel");
+ tinyMCEPopup.close();
+ return;
+ }
+
+ // Create new anchor elements
+ if (elm == null) {
+ inst.getDoc().execCommand("unlink", false, null);
+ tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});
+
+ elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';});
+ for (i=0; i';
+
+ for (var i=0; i' + tinyMCELinkList[i][0] + '';
+
+ html += '';
+
+ return html;
+
+ // tinyMCE.debug('-- image list start --', html, '-- image list end --');
+}
+
+function getTargetListHTML(elm_id, target_form_element) {
+ var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';');
+ var html = '';
+
+ html += '';
+
+ return html;
+}
+
+// While loading
+preinit();
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js
new file mode 100644
index 0000000..3169a56
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advlink_dlg',{"target_name":"Target Name",classes:"Classes",style:"Style",id:"ID","popup_position":"Position (X/Y)",langdir:"Language Direction","popup_size":"Size","popup_dependent":"Dependent (Mozilla/Firefox Only)","popup_resizable":"Make Window Resizable","popup_location":"Show Location Bar","popup_menubar":"Show Menu Bar","popup_toolbar":"Show Toolbars","popup_statusbar":"Show Status Bar","popup_scrollbars":"Show Scrollbars","popup_return":"Insert \'return false\'","popup_name":"Window Name","popup_url":"Popup URL",popup:"JavaScript Popup","target_blank":"Open in New Window","target_top":"Open in Top Frame (Replaces All Frames)","target_parent":"Open in Parent Window/Frame","target_same":"Open in This Window/Frame","anchor_names":"Anchors","popup_opts":"Options","advanced_props":"Advanced Properties","event_props":"Events","popup_props":"Popup Properties","general_props":"General Properties","advanced_tab":"Advanced","events_tab":"Events","popup_tab":"Popup","general_tab":"General",list:"Link List","is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/Edit Link","link_list":"Link List",rtl:"Right to Left",ltr:"Left to Right",accesskey:"AccessKey",tabindex:"TabIndex",rev:"Relationship Target to Page",rel:"Relationship Page to Target",mime:"Target MIME Type",encoding:"Target Character Encoding",langcode:"Language Code","target_langcode":"Target Language",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm
new file mode 100644
index 0000000..cd0b605
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink/link.htm
@@ -0,0 +1,371 @@
+
+
+
+ {#advlink_dlg.title}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/css/advlink.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/css/advlink.css
new file mode 100644
index 0000000..1436431
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/css/advlink.css
@@ -0,0 +1,8 @@
+.mceLinkList, .mceAnchorList, #targetlist {width:280px;}
+.mceActionPanel {margin-top:7px;}
+.panel_wrapper div.current {height:320px;}
+#classlist, #title, #href {width:280px;}
+#popupurl, #popupname {width:200px;}
+#popupwidth, #popupheight, #popupleft, #popuptop {width:30px;vertical-align:middle;text-align:center;}
+#id, #style, #classes, #target, #dir, #hreflang, #lang, #charset, #type, #rel, #rev, #tabindex, #accesskey {width:200px;}
+#events_panel input {width:200px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin.js
new file mode 100644
index 0000000..983fe5a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AdvancedLinkPlugin",{init:function(a,b){this.editor=a;a.addCommand("mceAdvLink",function(){var c=a.selection;if(c.isCollapsed()&&!a.dom.getParent(c.getNode(),"A")){return}a.windowManager.open({file:b+"/link.htm",width:480+parseInt(a.getLang("advlink.delta_width",0)),height:400+parseInt(a.getLang("advlink.delta_height",0)),inline:1},{plugin_url:b})});a.addButton("link",{title:"advlink.link_desc",cmd:"mceAdvLink"});a.addShortcut("ctrl+k","advlink.advlink_desc","mceAdvLink");a.onNodeChange.add(function(d,c,f,e){c.setDisabled("link",e&&f.nodeName!="A");c.setActive("link",f.nodeName=="A"&&!f.name)})},getInfo:function(){return{longname:"Advanced link",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlink",tinymce.plugins.AdvancedLinkPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin_src.js
new file mode 100644
index 0000000..14e46a7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/editor_plugin_src.js
@@ -0,0 +1,61 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.AdvancedLinkPlugin', {
+ init : function(ed, url) {
+ this.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceAdvLink', function() {
+ var se = ed.selection;
+
+ // No selection and not in link
+ if (se.isCollapsed() && !ed.dom.getParent(se.getNode(), 'A'))
+ return;
+
+ ed.windowManager.open({
+ file : url + '/link.htm',
+ width : 480 + parseInt(ed.getLang('advlink.delta_width', 0)),
+ height : 400 + parseInt(ed.getLang('advlink.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ // Register buttons
+ ed.addButton('link', {
+ title : 'advlink.link_desc',
+ cmd : 'mceAdvLink'
+ });
+
+ ed.addShortcut('ctrl+k', 'advlink.advlink_desc', 'mceAdvLink');
+
+ ed.onNodeChange.add(function(ed, cm, n, co) {
+ cm.setDisabled('link', co && n.nodeName != 'A');
+ cm.setActive('link', n.nodeName == 'A' && !n.name);
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Advanced link',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlink',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('advlink', tinymce.plugins.AdvancedLinkPlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/js/advlink.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/js/advlink.js
new file mode 100644
index 0000000..f013aac
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/js/advlink.js
@@ -0,0 +1,543 @@
+/* Functions for the advlink plugin popup */
+
+tinyMCEPopup.requireLangPack();
+
+var templates = {
+ "window.open" : "window.open('${url}','${target}','${options}')"
+};
+
+function preinit() {
+ var url;
+
+ if (url = tinyMCEPopup.getParam("external_link_list_url"))
+ document.write('');
+}
+
+function changeClass() {
+ var f = document.forms[0];
+
+ f.classes.value = getSelectValue(f, 'classlist');
+}
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ var formObj = document.forms[0];
+ var inst = tinyMCEPopup.editor;
+ var elm = inst.selection.getNode();
+ var action = "insert";
+ var html;
+
+ document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser','href','file','advlink');
+ document.getElementById('popupurlbrowsercontainer').innerHTML = getBrowserHTML('popupurlbrowser','popupurl','file','advlink');
+ document.getElementById('targetlistcontainer').innerHTML = getTargetListHTML('targetlist','target');
+
+ // Link list
+ html = getLinkListHTML('linklisthref','href');
+ if (html == "")
+ document.getElementById("linklisthrefrow").style.display = 'none';
+ else
+ document.getElementById("linklisthrefcontainer").innerHTML = html;
+
+ // Anchor list
+ html = getAnchorListHTML('anchorlist','href');
+ if (html == "")
+ document.getElementById("anchorlistrow").style.display = 'none';
+ else
+ document.getElementById("anchorlistcontainer").innerHTML = html;
+
+ // Resize some elements
+ if (isVisible('hrefbrowser'))
+ document.getElementById('href').style.width = '260px';
+
+ if (isVisible('popupurlbrowser'))
+ document.getElementById('popupurl').style.width = '180px';
+
+ elm = inst.dom.getParent(elm, "A");
+ if (elm == null) {
+ var prospect = inst.dom.create("p", null, inst.selection.getContent());
+ if (prospect.childNodes.length === 1) {
+ elm = prospect.firstChild;
+ }
+ }
+
+ if (elm != null && elm.nodeName == "A")
+ action = "update";
+
+ formObj.insert.value = tinyMCEPopup.getLang(action, 'Insert', true);
+
+ setPopupControlsDisabled(true);
+
+ if (action == "update") {
+ var href = inst.dom.getAttrib(elm, 'href');
+ var onclick = inst.dom.getAttrib(elm, 'onclick');
+ var linkTarget = inst.dom.getAttrib(elm, 'target') ? inst.dom.getAttrib(elm, 'target') : "_self";
+
+ // Setup form data
+ setFormValue('href', href);
+ setFormValue('title', inst.dom.getAttrib(elm, 'title'));
+ setFormValue('id', inst.dom.getAttrib(elm, 'id'));
+ setFormValue('style', inst.dom.getAttrib(elm, "style"));
+ setFormValue('rel', inst.dom.getAttrib(elm, 'rel'));
+ setFormValue('rev', inst.dom.getAttrib(elm, 'rev'));
+ setFormValue('charset', inst.dom.getAttrib(elm, 'charset'));
+ setFormValue('hreflang', inst.dom.getAttrib(elm, 'hreflang'));
+ setFormValue('dir', inst.dom.getAttrib(elm, 'dir'));
+ setFormValue('lang', inst.dom.getAttrib(elm, 'lang'));
+ setFormValue('tabindex', inst.dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
+ setFormValue('accesskey', inst.dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
+ setFormValue('type', inst.dom.getAttrib(elm, 'type'));
+ setFormValue('onfocus', inst.dom.getAttrib(elm, 'onfocus'));
+ setFormValue('onblur', inst.dom.getAttrib(elm, 'onblur'));
+ setFormValue('onclick', onclick);
+ setFormValue('ondblclick', inst.dom.getAttrib(elm, 'ondblclick'));
+ setFormValue('onmousedown', inst.dom.getAttrib(elm, 'onmousedown'));
+ setFormValue('onmouseup', inst.dom.getAttrib(elm, 'onmouseup'));
+ setFormValue('onmouseover', inst.dom.getAttrib(elm, 'onmouseover'));
+ setFormValue('onmousemove', inst.dom.getAttrib(elm, 'onmousemove'));
+ setFormValue('onmouseout', inst.dom.getAttrib(elm, 'onmouseout'));
+ setFormValue('onkeypress', inst.dom.getAttrib(elm, 'onkeypress'));
+ setFormValue('onkeydown', inst.dom.getAttrib(elm, 'onkeydown'));
+ setFormValue('onkeyup', inst.dom.getAttrib(elm, 'onkeyup'));
+ setFormValue('target', linkTarget);
+ setFormValue('classes', inst.dom.getAttrib(elm, 'class'));
+
+ // Parse onclick data
+ if (onclick != null && onclick.indexOf('window.open') != -1)
+ parseWindowOpen(onclick);
+ else
+ parseFunction(onclick);
+
+ // Select by the values
+ selectByValue(formObj, 'dir', inst.dom.getAttrib(elm, 'dir'));
+ selectByValue(formObj, 'rel', inst.dom.getAttrib(elm, 'rel'));
+ selectByValue(formObj, 'rev', inst.dom.getAttrib(elm, 'rev'));
+ selectByValue(formObj, 'linklisthref', href);
+
+ if (href.charAt(0) == '#')
+ selectByValue(formObj, 'anchorlist', href);
+
+ addClassesToList('classlist', 'advlink_styles');
+
+ selectByValue(formObj, 'classlist', inst.dom.getAttrib(elm, 'class'), true);
+ selectByValue(formObj, 'targetlist', linkTarget, true);
+ } else
+ addClassesToList('classlist', 'advlink_styles');
+}
+
+function checkPrefix(n) {
+ if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_email')))
+ n.value = 'mailto:' + n.value;
+
+ if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advlink_dlg.is_external')))
+ n.value = 'http://' + n.value;
+}
+
+function setFormValue(name, value) {
+ document.forms[0].elements[name].value = value;
+}
+
+function parseWindowOpen(onclick) {
+ var formObj = document.forms[0];
+
+ // Preprocess center code
+ if (onclick.indexOf('return false;') != -1) {
+ formObj.popupreturn.checked = true;
+ onclick = onclick.replace('return false;', '');
+ } else
+ formObj.popupreturn.checked = false;
+
+ var onClickData = parseLink(onclick);
+
+ if (onClickData != null) {
+ formObj.ispopup.checked = true;
+ setPopupControlsDisabled(false);
+
+ var onClickWindowOptions = parseOptions(onClickData['options']);
+ var url = onClickData['url'];
+
+ formObj.popupname.value = onClickData['target'];
+ formObj.popupurl.value = url;
+ formObj.popupwidth.value = getOption(onClickWindowOptions, 'width');
+ formObj.popupheight.value = getOption(onClickWindowOptions, 'height');
+
+ formObj.popupleft.value = getOption(onClickWindowOptions, 'left');
+ formObj.popuptop.value = getOption(onClickWindowOptions, 'top');
+
+ if (formObj.popupleft.value.indexOf('screen') != -1)
+ formObj.popupleft.value = "c";
+
+ if (formObj.popuptop.value.indexOf('screen') != -1)
+ formObj.popuptop.value = "c";
+
+ formObj.popuplocation.checked = getOption(onClickWindowOptions, 'location') == "yes";
+ formObj.popupscrollbars.checked = getOption(onClickWindowOptions, 'scrollbars') == "yes";
+ formObj.popupmenubar.checked = getOption(onClickWindowOptions, 'menubar') == "yes";
+ formObj.popupresizable.checked = getOption(onClickWindowOptions, 'resizable') == "yes";
+ formObj.popuptoolbar.checked = getOption(onClickWindowOptions, 'toolbar') == "yes";
+ formObj.popupstatus.checked = getOption(onClickWindowOptions, 'status') == "yes";
+ formObj.popupdependent.checked = getOption(onClickWindowOptions, 'dependent') == "yes";
+
+ buildOnClick();
+ }
+}
+
+function parseFunction(onclick) {
+ var formObj = document.forms[0];
+ var onClickData = parseLink(onclick);
+
+ // TODO: Add stuff here
+}
+
+function getOption(opts, name) {
+ return typeof(opts[name]) == "undefined" ? "" : opts[name];
+}
+
+function setPopupControlsDisabled(state) {
+ var formObj = document.forms[0];
+
+ formObj.popupname.disabled = state;
+ formObj.popupurl.disabled = state;
+ formObj.popupwidth.disabled = state;
+ formObj.popupheight.disabled = state;
+ formObj.popupleft.disabled = state;
+ formObj.popuptop.disabled = state;
+ formObj.popuplocation.disabled = state;
+ formObj.popupscrollbars.disabled = state;
+ formObj.popupmenubar.disabled = state;
+ formObj.popupresizable.disabled = state;
+ formObj.popuptoolbar.disabled = state;
+ formObj.popupstatus.disabled = state;
+ formObj.popupreturn.disabled = state;
+ formObj.popupdependent.disabled = state;
+
+ setBrowserDisabled('popupurlbrowser', state);
+}
+
+function parseLink(link) {
+ link = link.replace(new RegExp(''', 'g'), "'");
+
+ var fnName = link.replace(new RegExp("\\s*([A-Za-z0-9\.]*)\\s*\\(.*", "gi"), "$1");
+
+ // Is function name a template function
+ var template = templates[fnName];
+ if (template) {
+ // Build regexp
+ var variableNames = template.match(new RegExp("'?\\$\\{[A-Za-z0-9\.]*\\}'?", "gi"));
+ var regExp = "\\s*[A-Za-z0-9\.]*\\s*\\(";
+ var replaceStr = "";
+ for (var i=0; i";
+ } else
+ regExp += ".*";
+ }
+
+ regExp += "\\);?";
+
+ // Build variable array
+ var variables = [];
+ variables["_function"] = fnName;
+ var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('');
+ for (var i=0; i' + name + '';
+
+ if ((name = nodes[i].id) != "" && !nodes[i].href)
+ html += '';
+ }
+
+ if (html == "")
+ return "";
+
+ html = '';
+
+ return html;
+}
+
+function insertAction() {
+ var inst = tinyMCEPopup.editor;
+ var elm, elementArray, i;
+
+ elm = inst.selection.getNode();
+ checkPrefix(document.forms[0].href);
+
+ elm = inst.dom.getParent(elm, "A");
+
+ // Remove element if there is no href
+ if (!document.forms[0].href.value) {
+ i = inst.selection.getBookmark();
+ inst.dom.remove(elm, 1);
+ inst.selection.moveToBookmark(i);
+ tinyMCEPopup.execCommand("mceEndUndoLevel");
+ tinyMCEPopup.close();
+ return;
+ }
+
+ // Create new anchor elements
+ if (elm == null) {
+ inst.getDoc().execCommand("unlink", false, null);
+ tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});
+
+ elementArray = tinymce.grep(inst.dom.select("a"), function(n) {return inst.dom.getAttrib(n, 'href') == '#mce_temp_url#';});
+ for (i=0; i';
+
+ for (var i=0; i' + tinyMCELinkList[i][0] + '';
+
+ html += '';
+
+ return html;
+
+ // tinyMCE.debug('-- image list start --', html, '-- image list end --');
+}
+
+function getTargetListHTML(elm_id, target_form_element) {
+ var targets = tinyMCEPopup.getParam('theme_advanced_link_targets', '').split(';');
+ var html = '';
+
+ html += '';
+
+ return html;
+}
+
+// While loading
+preinit();
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/langs/en_dlg.js
new file mode 100644
index 0000000..3169a56
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advlink_dlg',{"target_name":"Target Name",classes:"Classes",style:"Style",id:"ID","popup_position":"Position (X/Y)",langdir:"Language Direction","popup_size":"Size","popup_dependent":"Dependent (Mozilla/Firefox Only)","popup_resizable":"Make Window Resizable","popup_location":"Show Location Bar","popup_menubar":"Show Menu Bar","popup_toolbar":"Show Toolbars","popup_statusbar":"Show Status Bar","popup_scrollbars":"Show Scrollbars","popup_return":"Insert \'return false\'","popup_name":"Window Name","popup_url":"Popup URL",popup:"JavaScript Popup","target_blank":"Open in New Window","target_top":"Open in Top Frame (Replaces All Frames)","target_parent":"Open in Parent Window/Frame","target_same":"Open in This Window/Frame","anchor_names":"Anchors","popup_opts":"Options","advanced_props":"Advanced Properties","event_props":"Events","popup_props":"Popup Properties","general_props":"General Properties","advanced_tab":"Advanced","events_tab":"Events","popup_tab":"Popup","general_tab":"General",list:"Link List","is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?",titlefield:"Title",target:"Target",url:"Link URL",title:"Insert/Edit Link","link_list":"Link List",rtl:"Right to Left",ltr:"Left to Right",accesskey:"AccessKey",tabindex:"TabIndex",rev:"Relationship Target to Page",rel:"Relationship Page to Target",mime:"Target MIME Type",encoding:"Target Character Encoding",langcode:"Language Code","target_langcode":"Target Language",width:"Width",height:"Height"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/link.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/link.htm
new file mode 100644
index 0000000..8ab7c2a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlink_orig/link.htm
@@ -0,0 +1,338 @@
+
+
+
+ {#advlink_dlg.title}
+
+
+
+
+
+
+
+
+ {#advlink_dlg.title}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js
new file mode 100644
index 0000000..57ecce6
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.AdvListPlugin",{init:function(b,c){var d=this;d.editor=b;function e(g){var f=[];a(g.split(/,/),function(h){f.push({title:"advlist."+(h=="default"?"def":h.replace(/-/g,"_")),styles:{listStyleType:h=="default"?"":h}})});return f}d.numlist=b.getParam("advlist_number_styles")||e("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");d.bullist=b.getParam("advlist_bullet_styles")||e("default,circle,disc,square");if(tinymce.isIE&&/MSIE [2-7]/.test(navigator.userAgent)){d.isIE7=true}},createControl:function(d,b){var f=this,e,i,g=f.editor;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){i=f[d][0]}function c(j,l){var k=true;a(l.styles,function(n,m){if(g.dom.getStyle(j,m)!=n){k=false;return false}});return k}function h(){var k,l=g.dom,j=g.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,i)){g.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(i){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,i.styles);k.removeAttribute("data-mce-style")}}g.focus()}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){h()}});e.onRenderMenu.add(function(j,k){k.onHideMenu.add(function(){if(f.bookmark){g.selection.moveToBookmark(f.bookmark);f.bookmark=0}});k.onShowMenu.add(function(){var n=g.dom,m=n.getParent(g.selection.getNode(),"ol,ul"),l;if(m||i){l=f[d];a(k.items,function(o){var p=true;o.setSelected(0);if(m&&!o.isDisabled()){a(l,function(q){if(q.id==o.id){if(!c(m,q)){p=false;return false}}});if(p){o.setSelected(1)}}});if(!m){k.items[i.id].setSelected(1)}}g.focus();if(tinymce.isIE){f.bookmark=g.selection.getBookmark(1)}});k.add({id:g.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle",titleItem:true}).setDisabled(1);a(f[d],function(l){if(f.isIE7&&l.styles.listStyleType=="lower-greek"){return}l.id=g.dom.uniqueId();k.add({id:l.id,title:l.title,onclick:function(){i=l;h()}})})});return e}},getInfo:function(){return{longname:"Advanced lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("advlist",tinymce.plugins.AdvListPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js
new file mode 100644
index 0000000..a8f046b
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/advlist/editor_plugin_src.js
@@ -0,0 +1,176 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var each = tinymce.each;
+
+ tinymce.create('tinymce.plugins.AdvListPlugin', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+
+ function buildFormats(str) {
+ var formats = [];
+
+ each(str.split(/,/), function(type) {
+ formats.push({
+ title : 'advlist.' + (type == 'default' ? 'def' : type.replace(/-/g, '_')),
+ styles : {
+ listStyleType : type == 'default' ? '' : type
+ }
+ });
+ });
+
+ return formats;
+ };
+
+ // Setup number formats from config or default
+ t.numlist = ed.getParam("advlist_number_styles") || buildFormats("default,lower-alpha,lower-greek,lower-roman,upper-alpha,upper-roman");
+ t.bullist = ed.getParam("advlist_bullet_styles") || buildFormats("default,circle,disc,square");
+
+ if (tinymce.isIE && /MSIE [2-7]/.test(navigator.userAgent))
+ t.isIE7 = true;
+ },
+
+ createControl: function(name, cm) {
+ var t = this, btn, format, editor = t.editor;
+
+ if (name == 'numlist' || name == 'bullist') {
+ // Default to first item if it's a default item
+ if (t[name][0].title == 'advlist.def')
+ format = t[name][0];
+
+ function hasFormat(node, format) {
+ var state = true;
+
+ each(format.styles, function(value, name) {
+ // Format doesn't match
+ if (editor.dom.getStyle(node, name) != value) {
+ state = false;
+ return false;
+ }
+ });
+
+ return state;
+ };
+
+ function applyListFormat() {
+ var list, dom = editor.dom, sel = editor.selection;
+
+ // Check for existing list element
+ list = dom.getParent(sel.getNode(), 'ol,ul');
+
+ // Switch/add list type if needed
+ if (!list || list.nodeName == (name == 'bullist' ? 'OL' : 'UL') || hasFormat(list, format))
+ editor.execCommand(name == 'bullist' ? 'InsertUnorderedList' : 'InsertOrderedList');
+
+ // Append styles to new list element
+ if (format) {
+ list = dom.getParent(sel.getNode(), 'ol,ul');
+ if (list) {
+ dom.setStyles(list, format.styles);
+ list.removeAttribute('data-mce-style');
+ }
+ }
+
+ editor.focus();
+ };
+
+ btn = cm.createSplitButton(name, {
+ title : 'advanced.' + name + '_desc',
+ 'class' : 'mce_' + name,
+ onclick : function() {
+ applyListFormat();
+ }
+ });
+
+ btn.onRenderMenu.add(function(btn, menu) {
+ menu.onHideMenu.add(function() {
+ if (t.bookmark) {
+ editor.selection.moveToBookmark(t.bookmark);
+ t.bookmark = 0;
+ }
+ });
+
+ menu.onShowMenu.add(function() {
+ var dom = editor.dom, list = dom.getParent(editor.selection.getNode(), 'ol,ul'), fmtList;
+
+ if (list || format) {
+ fmtList = t[name];
+
+ // Unselect existing items
+ each(menu.items, function(item) {
+ var state = true;
+
+ item.setSelected(0);
+
+ if (list && !item.isDisabled()) {
+ each(fmtList, function(fmt) {
+ if (fmt.id == item.id) {
+ if (!hasFormat(list, fmt)) {
+ state = false;
+ return false;
+ }
+ }
+ });
+
+ if (state)
+ item.setSelected(1);
+ }
+ });
+
+ // Select the current format
+ if (!list)
+ menu.items[format.id].setSelected(1);
+ }
+
+ editor.focus();
+
+ // IE looses it's selection so store it away and restore it later
+ if (tinymce.isIE) {
+ t.bookmark = editor.selection.getBookmark(1);
+ }
+ });
+
+ menu.add({id : editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle', titleItem: true}).setDisabled(1);
+
+ each(t[name], function(item) {
+ // IE<8 doesn't support lower-greek, skip it
+ if (t.isIE7 && item.styles.listStyleType == 'lower-greek')
+ return;
+
+ item.id = editor.dom.uniqueId();
+
+ menu.add({id : item.id, title : item.title, onclick : function() {
+ format = item;
+ applyListFormat();
+ }});
+ });
+ });
+
+ return btn;
+ }
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Advanced lists',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/advlist',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('advlist', tinymce.plugins.AdvListPlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js
new file mode 100644
index 0000000..71d86bb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AutolinkPlugin",{init:function(a,b){var c=this;a.onKeyDown.addToTop(function(d,f){if(f.keyCode==13){return c.handleEnter(d)}});if(tinyMCE.isIE){return}a.onKeyPress.add(function(d,f){if(f.which==41){return c.handleEclipse(d)}});a.onKeyUp.add(function(d,f){if(f.keyCode==32){return c.handleSpacebar(d)}})},handleEclipse:function(a){this.parseCurrentLine(a,-1,"(",true)},handleSpacebar:function(a){this.parseCurrentLine(a,0,"",true)},handleEnter:function(a){this.parseCurrentLine(a,-1,"",false)},parseCurrentLine:function(i,d,b,g){var a,f,c,n,k,m,h,e,j;a=i.selection.getRng(true).cloneRange();if(a.startOffset<5){e=a.endContainer.previousSibling;if(e==null){if(a.endContainer.firstChild==null||a.endContainer.firstChild.nextSibling==null){return}e=a.endContainer.firstChild.nextSibling}j=e.length;a.setStart(e,j);a.setEnd(e,j);if(a.endOffset<5){return}f=a.endOffset;n=e}else{n=a.endContainer;if(n.nodeType!=3&&n.firstChild){while(n.nodeType!=3&&n.firstChild){n=n.firstChild}if(n.nodeType==3){a.setStart(n,0);a.setEnd(n,n.nodeValue.length)}}if(a.endOffset==1){f=2}else{f=a.endOffset-1-d}}c=f;do{a.setStart(n,f>=2?f-2:0);a.setEnd(n,f>=1?f-1:0);f-=1}while(a.toString()!=" "&&a.toString()!=""&&a.toString().charCodeAt(0)!=160&&(f-2)>=0&&a.toString()!=b);if(a.toString()==b||a.toString().charCodeAt(0)==160){a.setStart(n,f);a.setEnd(n,c);f+=1}else{if(a.startOffset==0){a.setStart(n,0);a.setEnd(n,c)}else{a.setStart(n,f);a.setEnd(n,c)}}var m=a.toString();if(m.charAt(m.length-1)=="."){a.setEnd(n,c-1)}m=a.toString();h=m.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+-]+@)(.+)$/i);if(h){if(h[1]=="www."){h[1]="http://www."}else{if(/@$/.test(h[1])&&!/^mailto:/.test(h[1])){h[1]="mailto:"+h[1]}}k=i.selection.getBookmark();i.selection.setRng(a);tinyMCE.execCommand("createlink",false,h[1]+h[2]);i.selection.moveToBookmark(k);i.nodeChanged();if(tinyMCE.isWebKit){i.selection.collapse(false);var l=Math.min(n.length,c+1);a.setStart(n,l);a.setEnd(n,l);i.selection.setRng(a)}}},getInfo:function(){return{longname:"Autolink",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autolink",tinymce.plugins.AutolinkPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js
new file mode 100644
index 0000000..5b61f7a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autolink/editor_plugin_src.js
@@ -0,0 +1,184 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2011, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.AutolinkPlugin', {
+ /**
+ * Initializes the plugin, this will be executed after the plugin has been created.
+ * This call is done before the editor instance has finished it's initialization so use the onInit event
+ * of the editor instance to intercept that event.
+ *
+ * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+ * @param {string} url Absolute URL to where the plugin is located.
+ */
+
+ init : function(ed, url) {
+ var t = this;
+
+ // Add a key down handler
+ ed.onKeyDown.addToTop(function(ed, e) {
+ if (e.keyCode == 13)
+ return t.handleEnter(ed);
+ });
+
+ // Internet Explorer has built-in automatic linking for most cases
+ if (tinyMCE.isIE)
+ return;
+
+ ed.onKeyPress.add(function(ed, e) {
+ if (e.which == 41)
+ return t.handleEclipse(ed);
+ });
+
+ // Add a key up handler
+ ed.onKeyUp.add(function(ed, e) {
+ if (e.keyCode == 32)
+ return t.handleSpacebar(ed);
+ });
+ },
+
+ handleEclipse : function(ed) {
+ this.parseCurrentLine(ed, -1, '(', true);
+ },
+
+ handleSpacebar : function(ed) {
+ this.parseCurrentLine(ed, 0, '', true);
+ },
+
+ handleEnter : function(ed) {
+ this.parseCurrentLine(ed, -1, '', false);
+ },
+
+ parseCurrentLine : function(ed, end_offset, delimiter, goback) {
+ var r, end, start, endContainer, bookmark, text, matches, prev, len;
+
+ // We need at least five characters to form a URL,
+ // hence, at minimum, five characters from the beginning of the line.
+ r = ed.selection.getRng(true).cloneRange();
+ if (r.startOffset < 5) {
+ // During testing, the caret is placed inbetween two text nodes.
+ // The previous text node contains the URL.
+ prev = r.endContainer.previousSibling;
+ if (prev == null) {
+ if (r.endContainer.firstChild == null || r.endContainer.firstChild.nextSibling == null)
+ return;
+
+ prev = r.endContainer.firstChild.nextSibling;
+ }
+ len = prev.length;
+ r.setStart(prev, len);
+ r.setEnd(prev, len);
+
+ if (r.endOffset < 5)
+ return;
+
+ end = r.endOffset;
+ endContainer = prev;
+ } else {
+ endContainer = r.endContainer;
+
+ // Get a text node
+ if (endContainer.nodeType != 3 && endContainer.firstChild) {
+ while (endContainer.nodeType != 3 && endContainer.firstChild)
+ endContainer = endContainer.firstChild;
+
+ // Move range to text node
+ if (endContainer.nodeType == 3) {
+ r.setStart(endContainer, 0);
+ r.setEnd(endContainer, endContainer.nodeValue.length);
+ }
+ }
+
+ if (r.endOffset == 1)
+ end = 2;
+ else
+ end = r.endOffset - 1 - end_offset;
+ }
+
+ start = end;
+
+ do
+ {
+ // Move the selection one character backwards.
+ r.setStart(endContainer, end >= 2 ? end - 2 : 0);
+ r.setEnd(endContainer, end >= 1 ? end - 1 : 0);
+ end -= 1;
+
+ // Loop until one of the following is found: a blank space, , delimeter, (end-2) >= 0
+ } while (r.toString() != ' ' && r.toString() != '' && r.toString().charCodeAt(0) != 160 && (end -2) >= 0 && r.toString() != delimiter);
+
+ if (r.toString() == delimiter || r.toString().charCodeAt(0) == 160) {
+ r.setStart(endContainer, end);
+ r.setEnd(endContainer, start);
+ end += 1;
+ } else if (r.startOffset == 0) {
+ r.setStart(endContainer, 0);
+ r.setEnd(endContainer, start);
+ }
+ else {
+ r.setStart(endContainer, end);
+ r.setEnd(endContainer, start);
+ }
+
+ // Exclude last . from word like "www.site.com."
+ var text = r.toString();
+ if (text.charAt(text.length - 1) == '.') {
+ r.setEnd(endContainer, start - 1);
+ }
+
+ text = r.toString();
+ matches = text.match(/^(https?:\/\/|ssh:\/\/|ftp:\/\/|file:\/|www\.|(?:mailto:)?[A-Z0-9._%+-]+@)(.+)$/i);
+
+ if (matches) {
+ if (matches[1] == 'www.') {
+ matches[1] = 'http://www.';
+ } else if (/@$/.test(matches[1]) && !/^mailto:/.test(matches[1])) {
+ matches[1] = 'mailto:' + matches[1];
+ }
+
+ bookmark = ed.selection.getBookmark();
+
+ ed.selection.setRng(r);
+ tinyMCE.execCommand('createlink',false, matches[1] + matches[2]);
+ ed.selection.moveToBookmark(bookmark);
+ ed.nodeChanged();
+
+ // TODO: Determine if this is still needed.
+ if (tinyMCE.isWebKit) {
+ // move the caret to its original position
+ ed.selection.collapse(false);
+ var max = Math.min(endContainer.length, start + 1);
+ r.setStart(endContainer, max);
+ r.setEnd(endContainer, max);
+ ed.selection.setRng(r);
+ }
+ }
+ },
+
+ /**
+ * Returns information about the plugin as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @return {Object} Name/value array containing information about the plugin.
+ */
+ getInfo : function() {
+ return {
+ longname : 'Autolink',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autolink',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('autolink', tinymce.plugins.AutolinkPlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js
new file mode 100644
index 0000000..46d9dc3
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this,e=0;if(a.getParam("fullscreen_is_enabled")){return}function b(){var j,i=a.getDoc(),f=i.body,l=i.documentElement,h=tinymce.DOM,k=d.autoresize_min_height,g;g=tinymce.isIE?f.scrollHeight:(tinymce.isWebKit&&f.clientHeight==0?0:f.offsetHeight);if(g>d.autoresize_min_height){k=g}if(d.autoresize_max_height&&g>d.autoresize_max_height){k=d.autoresize_max_height;f.style.overflowY="auto";l.style.overflowY="auto"}else{f.style.overflowY="hidden";l.style.overflowY="hidden";f.scrollTop=0}if(k!==e){j=k-e;h.setStyle(h.get(a.id+"_ifr"),"height",k+"px");e=k;if(tinymce.isWebKit&&j<0){b()}}}d.editor=a;d.autoresize_min_height=parseInt(a.getParam("autoresize_min_height",a.getElement().offsetHeight));d.autoresize_max_height=parseInt(a.getParam("autoresize_max_height",0));a.onInit.add(function(f){f.dom.setStyle(f.getBody(),"paddingBottom",f.getParam("autoresize_bottom_margin",50)+"px")});a.onChange.add(b);a.onSetContent.add(b);a.onPaste.add(b);a.onKeyUp.add(b);a.onPostRender.add(b);if(a.getParam("autoresize_on_init",true)){a.onLoad.add(b);a.onLoadContent.add(b)}a.addCommand("mceAutoResize",b)},getInfo:function(){return{longname:"Auto Resize",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("autoresize",tinymce.plugins.AutoResizePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js
new file mode 100644
index 0000000..7673bcf
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autoresize/editor_plugin_src.js
@@ -0,0 +1,119 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ /**
+ * Auto Resize
+ *
+ * This plugin automatically resizes the content area to fit its content height.
+ * It will retain a minimum height, which is the height of the content area when
+ * it's initialized.
+ */
+ tinymce.create('tinymce.plugins.AutoResizePlugin', {
+ /**
+ * Initializes the plugin, this will be executed after the plugin has been created.
+ * This call is done before the editor instance has finished it's initialization so use the onInit event
+ * of the editor instance to intercept that event.
+ *
+ * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+ * @param {string} url Absolute URL to where the plugin is located.
+ */
+ init : function(ed, url) {
+ var t = this, oldSize = 0;
+
+ if (ed.getParam('fullscreen_is_enabled'))
+ return;
+
+ /**
+ * This method gets executed each time the editor needs to resize.
+ */
+ function resize() {
+ var deltaSize, d = ed.getDoc(), body = d.body, de = d.documentElement, DOM = tinymce.DOM, resizeHeight = t.autoresize_min_height, myHeight;
+
+ // Get height differently depending on the browser used
+ myHeight = tinymce.isIE ? body.scrollHeight : (tinymce.isWebKit && body.clientHeight == 0 ? 0 : body.offsetHeight);
+
+ // Don't make it smaller than the minimum height
+ if (myHeight > t.autoresize_min_height)
+ resizeHeight = myHeight;
+
+ // If a maximum height has been defined don't exceed this height
+ if (t.autoresize_max_height && myHeight > t.autoresize_max_height) {
+ resizeHeight = t.autoresize_max_height;
+ body.style.overflowY = "auto";
+ de.style.overflowY = "auto"; // Old IE
+ } else {
+ body.style.overflowY = "hidden";
+ de.style.overflowY = "hidden"; // Old IE
+ body.scrollTop = 0;
+ }
+
+ // Resize content element
+ if (resizeHeight !== oldSize) {
+ deltaSize = resizeHeight - oldSize;
+ DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px');
+ oldSize = resizeHeight;
+
+ // WebKit doesn't decrease the size of the body element until the iframe gets resized
+ // So we need to continue to resize the iframe down until the size gets fixed
+ if (tinymce.isWebKit && deltaSize < 0)
+ resize();
+ }
+ };
+
+ t.editor = ed;
+
+ // Define minimum height
+ t.autoresize_min_height = parseInt(ed.getParam('autoresize_min_height', ed.getElement().offsetHeight));
+
+ // Define maximum height
+ t.autoresize_max_height = parseInt(ed.getParam('autoresize_max_height', 0));
+
+ // Add padding at the bottom for better UX
+ ed.onInit.add(function(ed){
+ ed.dom.setStyle(ed.getBody(), 'paddingBottom', ed.getParam('autoresize_bottom_margin', 50) + 'px');
+ });
+
+ // Add appropriate listeners for resizing content area
+ ed.onChange.add(resize);
+ ed.onSetContent.add(resize);
+ ed.onPaste.add(resize);
+ ed.onKeyUp.add(resize);
+ ed.onPostRender.add(resize);
+
+ if (ed.getParam('autoresize_on_init', true)) {
+ ed.onLoad.add(resize);
+ ed.onLoadContent.add(resize);
+ }
+
+ // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
+ ed.addCommand('mceAutoResize', resize);
+ },
+
+ /**
+ * Returns information about the plugin as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @return {Object} Name/value array containing information about the plugin.
+ */
+ getInfo : function() {
+ return {
+ longname : 'Auto Resize',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autoresize',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('autoresize', tinymce.plugins.AutoResizePlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js
new file mode 100644
index 0000000..6da98ff
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/autosave/editor_plugin.js
@@ -0,0 +1 @@
+(function(e){var c="autosave",g="restoredraft",b=true,f,d,a=e.util.Dispatcher;e.create("tinymce.plugins.AutoSave",{init:function(i,j){var h=this,l=i.settings;h.editor=i;function k(n){var m={s:1000,m:60000};n=/^(\d+)([ms]?)$/.exec(""+n);return(n[2]?m[n[2]]:1)*parseInt(n)}e.each({ask_before_unload:b,interval:"30s",retention:"20m",minlength:50},function(n,m){m=c+"_"+m;if(l[m]===f){l[m]=n}});l.autosave_interval=k(l.autosave_interval);l.autosave_retention=k(l.autosave_retention);i.addButton(g,{title:c+".restore_content",onclick:function(){if(i.getContent({draft:true}).replace(/\s| |<\/?p[^>]*>|
]*>/gi,"").length>0){i.windowManager.confirm(c+".warning_message",function(m){if(m){h.restoreDraft()}})}else{h.restoreDraft()}}});i.onNodeChange.add(function(){var m=i.controlManager;if(m.get(g)){m.setDisabled(g,!h.hasDraft())}});i.onInit.add(function(){if(i.controlManager.get(g)){h.setupStorage(i);setInterval(function(){if(!i.removed){h.storeDraft();i.nodeChanged()}},l.autosave_interval)}});h.onStoreDraft=new a(h);h.onRestoreDraft=new a(h);h.onRemoveDraft=new a(h);if(!d){window.onbeforeunload=e.plugins.AutoSave._beforeUnloadHandler;d=b}},getInfo:function(){return{longname:"Auto save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave",version:e.majorVersion+"."+e.minorVersion}},getExpDate:function(){return new Date(new Date().getTime()+this.editor.settings.autosave_retention).toUTCString()},setupStorage:function(i){var h=this,k=c+"_test",j="OK";h.key=c+i.id;e.each([function(){if(localStorage){localStorage.setItem(k,j);if(localStorage.getItem(k)===j){localStorage.removeItem(k);return localStorage}}},function(){if(sessionStorage){sessionStorage.setItem(k,j);if(sessionStorage.getItem(k)===j){sessionStorage.removeItem(k);return sessionStorage}}},function(){if(e.isIE){i.getElement().style.behavior="url('#default#userData')";return{autoExpires:b,setItem:function(l,n){var m=i.getElement();m.setAttribute(l,n);m.expires=h.getExpDate();try{m.save("TinyMCE")}catch(o){}},getItem:function(l){var m=i.getElement();try{m.load("TinyMCE");return m.getAttribute(l)}catch(n){return null}},removeItem:function(l){i.getElement().removeAttribute(l)}}}},],function(l){try{h.storage=l();if(h.storage){return false}}catch(m){}})},storeDraft:function(){var i=this,l=i.storage,j=i.editor,h,k;if(l){if(!l.getItem(i.key)&&!j.isDirty()){return}k=j.getContent({draft:true});if(k.length>j.settings.autosave_minlength){h=i.getExpDate();if(!i.storage.autoExpires){i.storage.setItem(i.key+"_expires",h)}i.storage.setItem(i.key,k);i.onStoreDraft.dispatch(i,{expires:h,content:k})}}},restoreDraft:function(){var h=this,j=h.storage,i;if(j){i=j.getItem(h.key);if(i){h.editor.setContent(i);h.onRestoreDraft.dispatch(h,{content:i})}}},hasDraft:function(){var h=this,k=h.storage,i,j;if(k){j=!!k.getItem(h.key);if(j){if(!h.storage.autoExpires){i=new Date(k.getItem(h.key+"_expires"));if(new Date().getTime()]*>|
]*>/gi, "").length > 0) {
+ // Show confirm dialog if the editor isn't empty
+ ed.windowManager.confirm(
+ PLUGIN_NAME + ".warning_message",
+ function(ok) {
+ if (ok)
+ self.restoreDraft();
+ }
+ );
+ } else
+ self.restoreDraft();
+ }
+ });
+
+ // Enable/disable restoredraft button depending on if there is a draft stored or not
+ ed.onNodeChange.add(function() {
+ var controlManager = ed.controlManager;
+
+ if (controlManager.get(RESTORE_DRAFT))
+ controlManager.setDisabled(RESTORE_DRAFT, !self.hasDraft());
+ });
+
+ ed.onInit.add(function() {
+ // Check if the user added the restore button, then setup auto storage logic
+ if (ed.controlManager.get(RESTORE_DRAFT)) {
+ // Setup storage engine
+ self.setupStorage(ed);
+
+ // Auto save contents each interval time
+ setInterval(function() {
+ if (!ed.removed) {
+ self.storeDraft();
+ ed.nodeChanged();
+ }
+ }, settings.autosave_interval);
+ }
+ });
+
+ /**
+ * This event gets fired when a draft is stored to local storage.
+ *
+ * @event onStoreDraft
+ * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
+ * @param {Object} draft Draft object containing the HTML contents of the editor.
+ */
+ self.onStoreDraft = new Dispatcher(self);
+
+ /**
+ * This event gets fired when a draft is restored from local storage.
+ *
+ * @event onStoreDraft
+ * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
+ * @param {Object} draft Draft object containing the HTML contents of the editor.
+ */
+ self.onRestoreDraft = new Dispatcher(self);
+
+ /**
+ * This event gets fired when a draft removed/expired.
+ *
+ * @event onRemoveDraft
+ * @param {tinymce.plugins.AutoSave} sender Plugin instance sending the event.
+ * @param {Object} draft Draft object containing the HTML contents of the editor.
+ */
+ self.onRemoveDraft = new Dispatcher(self);
+
+ // Add ask before unload dialog only add one unload handler
+ if (!unloadHandlerAdded) {
+ window.onbeforeunload = tinymce.plugins.AutoSave._beforeUnloadHandler;
+ unloadHandlerAdded = TRUE;
+ }
+ },
+
+ /**
+ * Returns information about the plugin as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @method getInfo
+ * @return {Object} Name/value array containing information about the plugin.
+ */
+ getInfo : function() {
+ return {
+ longname : 'Auto save',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/autosave',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ /**
+ * Returns an expiration date UTC string.
+ *
+ * @method getExpDate
+ * @return {String} Expiration date UTC string.
+ */
+ getExpDate : function() {
+ return new Date(
+ new Date().getTime() + this.editor.settings.autosave_retention
+ ).toUTCString();
+ },
+
+ /**
+ * This method will setup the storage engine. If the browser has support for it.
+ *
+ * @method setupStorage
+ */
+ setupStorage : function(ed) {
+ var self = this, testKey = PLUGIN_NAME + '_test', testVal = "OK";
+
+ self.key = PLUGIN_NAME + ed.id;
+
+ // Loop though each storage engine type until we find one that works
+ tinymce.each([
+ function() {
+ // Try HTML5 Local Storage
+ if (localStorage) {
+ localStorage.setItem(testKey, testVal);
+
+ if (localStorage.getItem(testKey) === testVal) {
+ localStorage.removeItem(testKey);
+
+ return localStorage;
+ }
+ }
+ },
+
+ function() {
+ // Try HTML5 Session Storage
+ if (sessionStorage) {
+ sessionStorage.setItem(testKey, testVal);
+
+ if (sessionStorage.getItem(testKey) === testVal) {
+ sessionStorage.removeItem(testKey);
+
+ return sessionStorage;
+ }
+ }
+ },
+
+ function() {
+ // Try IE userData
+ if (tinymce.isIE) {
+ ed.getElement().style.behavior = "url('#default#userData')";
+
+ // Fake localStorage on old IE
+ return {
+ autoExpires : TRUE,
+
+ setItem : function(key, value) {
+ var userDataElement = ed.getElement();
+
+ userDataElement.setAttribute(key, value);
+ userDataElement.expires = self.getExpDate();
+
+ try {
+ userDataElement.save("TinyMCE");
+ } catch (e) {
+ // Ignore, saving might fail if "Userdata Persistence" is disabled in IE
+ }
+ },
+
+ getItem : function(key) {
+ var userDataElement = ed.getElement();
+
+ try {
+ userDataElement.load("TinyMCE");
+ return userDataElement.getAttribute(key);
+ } catch (e) {
+ // Ignore, loading might fail if "Userdata Persistence" is disabled in IE
+ return null;
+ }
+ },
+
+ removeItem : function(key) {
+ ed.getElement().removeAttribute(key);
+ }
+ };
+ }
+ },
+ ], function(setup) {
+ // Try executing each function to find a suitable storage engine
+ try {
+ self.storage = setup();
+
+ if (self.storage)
+ return false;
+ } catch (e) {
+ // Ignore
+ }
+ });
+ },
+
+ /**
+ * This method will store the current contents in the the storage engine.
+ *
+ * @method storeDraft
+ */
+ storeDraft : function() {
+ var self = this, storage = self.storage, editor = self.editor, expires, content;
+
+ // Is the contents dirty
+ if (storage) {
+ // If there is no existing key and the contents hasn't been changed since
+ // it's original value then there is no point in saving a draft
+ if (!storage.getItem(self.key) && !editor.isDirty())
+ return;
+
+ // Store contents if the contents if longer than the minlength of characters
+ content = editor.getContent({draft: true});
+ if (content.length > editor.settings.autosave_minlength) {
+ expires = self.getExpDate();
+
+ // Store expiration date if needed IE userData has auto expire built in
+ if (!self.storage.autoExpires)
+ self.storage.setItem(self.key + "_expires", expires);
+
+ self.storage.setItem(self.key, content);
+ self.onStoreDraft.dispatch(self, {
+ expires : expires,
+ content : content
+ });
+ }
+ }
+ },
+
+ /**
+ * This method will restore the contents from the storage engine back to the editor.
+ *
+ * @method restoreDraft
+ */
+ restoreDraft : function() {
+ var self = this, storage = self.storage, content;
+
+ if (storage) {
+ content = storage.getItem(self.key);
+
+ if (content) {
+ self.editor.setContent(content);
+ self.onRestoreDraft.dispatch(self, {
+ content : content
+ });
+ }
+ }
+ },
+
+ /**
+ * This method will return true/false if there is a local storage draft available.
+ *
+ * @method hasDraft
+ * @return {boolean} true/false state if there is a local draft.
+ */
+ hasDraft : function() {
+ var self = this, storage = self.storage, expDate, exists;
+
+ if (storage) {
+ // Does the item exist at all
+ exists = !!storage.getItem(self.key);
+ if (exists) {
+ // Storage needs autoexpire
+ if (!self.storage.autoExpires) {
+ expDate = new Date(storage.getItem(self.key + "_expires"));
+
+ // Contents hasn't expired
+ if (new Date().getTime() < expDate.getTime())
+ return TRUE;
+
+ // Remove it if it has
+ self.removeDraft();
+ } else
+ return TRUE;
+ }
+ }
+
+ return false;
+ },
+
+ /**
+ * Removes the currently stored draft.
+ *
+ * @method removeDraft
+ */
+ removeDraft : function() {
+ var self = this, storage = self.storage, key = self.key, content;
+
+ if (storage) {
+ // Get current contents and remove the existing draft
+ content = storage.getItem(key);
+ storage.removeItem(key);
+ storage.removeItem(key + "_expires");
+
+ // Dispatch remove event if we had any contents
+ if (content) {
+ self.onRemoveDraft.dispatch(self, {
+ content : content
+ });
+ }
+ }
+ },
+
+ "static" : {
+ // Internal unload handler will be called before the page is unloaded
+ _beforeUnloadHandler : function(e) {
+ var msg;
+
+ tinymce.each(tinyMCE.editors, function(ed) {
+ // Store a draft for each editor instance
+ if (ed.plugins.autosave)
+ ed.plugins.autosave.storeDraft();
+
+ // Never ask in fullscreen mode
+ if (ed.getParam("fullscreen_is_enabled"))
+ return;
+
+ // Setup a return message if the editor is dirty
+ if (!msg && ed.isDirty() && ed.getParam("autosave_ask_before_unload"))
+ msg = ed.getLang("autosave.unload_msg");
+ });
+
+ return msg;
+ }
+ }
+ });
+
+ tinymce.PluginManager.add('autosave', tinymce.plugins.AutoSave);
+})(tinymce);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
new file mode 100644
index 0000000..8f8821f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.BBCodePlugin",{init:function(a,b){var d=this,c=a.getParam("bbcode_dialect","punbb").toLowerCase();a.onBeforeSetContent.add(function(e,f){f.content=d["_"+c+"_bbcode2html"](f.content)});a.onPostProcess.add(function(e,f){if(f.set){f.content=d["_"+c+"_bbcode2html"](f.content)}if(f.get){f.content=d["_"+c+"_html2bbcode"](f.content)}})},getInfo:function(){return{longname:"BBCode Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_punbb_html2bbcode:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/(.*?)<\/font>/gi,"$1");b(//gi,"[img]$1[/img]");b(/(.*?)<\/span>/gi,"[code]$1[/code]");b(/(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");b(/<\/(strong|b)>/gi,"[/b]");b(/<(strong|b)>/gi,"[b]");b(/<\/(em|i)>/gi,"[/i]");b(/<(em|i)>/gi,"[i]");b(/<\/u>/gi,"[/u]");b(/(.*?)<\/span>/gi,"[u]$1[/u]");b(//gi,"[u]");b(/]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/
/gi,"\n");b(/
/gi,"\n");b(/
/gi,"\n");b(//gi,"");b(/<\/p>/gi,"\n");b(/ |\u00a0/gi," ");b(/"/gi,'"');b(/</gi,"<");b(/>/gi,">");b(/&/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"
");b(/\[b\]/gi,"");b(/\[\/b\]/gi,"");b(/\[i\]/gi,"");b(/\[\/i\]/gi,"");b(/\[u\]/gi,"");b(/\[\/u\]/gi,"");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'$2');b(/\[url\](.*?)\[\/url\]/gi,'$1');b(/\[img\](.*?)\[\/img\]/gi,'
');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'$2');b(/\[code\](.*?)\[\/code\]/gi,'$1 ');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'$1 ');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
new file mode 100644
index 0000000..4e7eb33
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/bbcode/editor_plugin_src.js
@@ -0,0 +1,120 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.BBCodePlugin', {
+ init : function(ed, url) {
+ var t = this, dialect = ed.getParam('bbcode_dialect', 'punbb').toLowerCase();
+
+ ed.onBeforeSetContent.add(function(ed, o) {
+ o.content = t['_' + dialect + '_bbcode2html'](o.content);
+ });
+
+ ed.onPostProcess.add(function(ed, o) {
+ if (o.set)
+ o.content = t['_' + dialect + '_bbcode2html'](o.content);
+
+ if (o.get)
+ o.content = t['_' + dialect + '_html2bbcode'](o.content);
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'BBCode Plugin',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/bbcode',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ // Private methods
+
+ // HTML -> BBCode in PunBB dialect
+ _punbb_html2bbcode : function(s) {
+ s = tinymce.trim(s);
+
+ function rep(re, str) {
+ s = s.replace(re, str);
+ };
+
+ // example: to [b]
+ rep(/(.*?)<\/a>/gi,"[url=$1]$2[/url]");
+ rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");
+ rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");
+ rep(/(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");
+ rep(/(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");
+ rep(/(.*?)<\/span>/gi,"[color=$1]$2[/color]");
+ rep(/(.*?)<\/font>/gi,"[color=$1]$2[/color]");
+ rep(/(.*?)<\/span>/gi,"[size=$1]$2[/size]");
+ rep(/(.*?)<\/font>/gi,"$1");
+ rep(//gi,"[img]$1[/img]");
+ rep(/(.*?)<\/span>/gi,"[code]$1[/code]");
+ rep(/(.*?)<\/span>/gi,"[quote]$1[/quote]");
+ rep(/(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");
+ rep(/(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");
+ rep(/(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");
+ rep(/(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");
+ rep(/(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");
+ rep(/(.*?)<\/u>/gi,"[quote][u]$1[/u][/quote]");
+ rep(/<\/(strong|b)>/gi,"[/b]");
+ rep(/<(strong|b)>/gi,"[b]");
+ rep(/<\/(em|i)>/gi,"[/i]");
+ rep(/<(em|i)>/gi,"[i]");
+ rep(/<\/u>/gi,"[/u]");
+ rep(/(.*?)<\/span>/gi,"[u]$1[/u]");
+ rep(//gi,"[u]");
+ rep(/]*>/gi,"[quote]");
+ rep(/<\/blockquote>/gi,"[/quote]");
+ rep(/
/gi,"\n");
+ rep(/
/gi,"\n");
+ rep(/
/gi,"\n");
+ rep(//gi,"");
+ rep(/<\/p>/gi,"\n");
+ rep(/ |\u00a0/gi," ");
+ rep(/"/gi,"\"");
+ rep(/</gi,"<");
+ rep(/>/gi,">");
+ rep(/&/gi,"&");
+
+ return s;
+ },
+
+ // BBCode -> HTML from PunBB dialect
+ _punbb_bbcode2html : function(s) {
+ s = tinymce.trim(s);
+
+ function rep(re, str) {
+ s = s.replace(re, str);
+ };
+
+ // example: [b] to
+ rep(/\n/gi,"
");
+ rep(/\[b\]/gi,"");
+ rep(/\[\/b\]/gi,"");
+ rep(/\[i\]/gi,"");
+ rep(/\[\/i\]/gi,"");
+ rep(/\[u\]/gi,"");
+ rep(/\[\/u\]/gi,"");
+ rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"$2");
+ rep(/\[url\](.*?)\[\/url\]/gi,"$1");
+ rep(/\[img\](.*?)\[\/img\]/gi,"
");
+ rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"$2");
+ rep(/\[code\](.*?)\[\/code\]/gi,"$1 ");
+ rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"$1 ");
+
+ return s;
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js
new file mode 100644
index 0000000..2ed042c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(f){var i=this,g,d,j,e;i.editor=f;d=f.settings.contextmenu_never_use_native;i.onContextMenu=new tinymce.util.Dispatcher(this);e=function(k){h(f,k)};g=f.onContextMenu.add(function(k,l){if((j!==0?j:l.ctrlKey)&&!d){return}a.cancel(l);if(l.target.nodeName=="IMG"){k.selection.select(l.target)}i._getMenu(k).showMenu(l.clientX||l.pageX,l.clientY||l.pageY);a.add(k.getDoc(),"click",e);k.nodeChanged()});f.onRemove.add(function(){if(i._menu){i._menu.removeAll()}});function h(k,l){j=0;if(l&&l.button==2){j=l.ctrlKey;return}if(i._menu){i._menu.removeAll();i._menu.destroy();a.remove(k.getDoc(),"click",e);i._menu=null}}f.onMouseDown.add(h);f.onKeyDown.add(h);f.onKeyDown.add(function(k,l){if(l.shiftKey&&!l.ctrlKey&&!l.altKey&&l.keyCode===121){a.cancel(l);g(k,l)}})},getInfo:function(){return{longname:"Contextmenu",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getMenu:function(e){var g=this,d=g._menu,j=e.selection,f=j.isCollapsed(),h=j.getNode()||e.getBody(),i,k;if(d){d.removeAll();d.destroy()}k=b.getPos(e.getContentAreaContainer());d=e.controlManager.createDropMenu("contextmenu",{offset_x:k.x+e.getParam("contextmenu_offset_x",0),offset_y:k.y+e.getParam("contextmenu_offset_y",0),constrain:1,keyboard_focus:true});g._menu=d;d.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(f);d.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(f);d.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((h.nodeName=="A"&&!e.dom.getAttrib(h,"name"))||!f){d.addSeparator();d.add({title:"advanced.link_desc",icon:"link",cmd:e.plugins.advlink?"mceAdvLink":"mceLink",ui:true});d.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}d.addSeparator();d.add({title:"advanced.image_desc",icon:"image",cmd:e.plugins.advimage?"mceAdvImage":"mceImage",ui:true});d.addSeparator();i=d.addMenu({title:"contextmenu.align"});i.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});i.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});i.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});i.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});g.onContextMenu.dispatch(g,d,h,f);return d}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js
new file mode 100644
index 0000000..48b0fff
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/contextmenu/editor_plugin_src.js
@@ -0,0 +1,163 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM;
+
+ /**
+ * This plugin a context menu to TinyMCE editor instances.
+ *
+ * @class tinymce.plugins.ContextMenu
+ */
+ tinymce.create('tinymce.plugins.ContextMenu', {
+ /**
+ * Initializes the plugin, this will be executed after the plugin has been created.
+ * This call is done before the editor instance has finished it's initialization so use the onInit event
+ * of the editor instance to intercept that event.
+ *
+ * @method init
+ * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+ * @param {string} url Absolute URL to where the plugin is located.
+ */
+ init : function(ed) {
+ var t = this, showMenu, contextmenuNeverUseNative, realCtrlKey, hideMenu;
+
+ t.editor = ed;
+
+ contextmenuNeverUseNative = ed.settings.contextmenu_never_use_native;
+
+ /**
+ * This event gets fired when the context menu is shown.
+ *
+ * @event onContextMenu
+ * @param {tinymce.plugins.ContextMenu} sender Plugin instance sending the event.
+ * @param {tinymce.ui.DropMenu} menu Drop down menu to fill with more items if needed.
+ */
+ t.onContextMenu = new tinymce.util.Dispatcher(this);
+
+ hideMenu = function(e) {
+ hide(ed, e);
+ };
+
+ showMenu = ed.onContextMenu.add(function(ed, e) {
+ // Block TinyMCE menu on ctrlKey and work around Safari issue
+ if ((realCtrlKey !== 0 ? realCtrlKey : e.ctrlKey) && !contextmenuNeverUseNative)
+ return;
+
+ Event.cancel(e);
+
+ // Select the image if it's clicked. WebKit would other wise expand the selection
+ if (e.target.nodeName == 'IMG')
+ ed.selection.select(e.target);
+
+ t._getMenu(ed).showMenu(e.clientX || e.pageX, e.clientY || e.pageY);
+ Event.add(ed.getDoc(), 'click', hideMenu);
+
+ ed.nodeChanged();
+ });
+
+ ed.onRemove.add(function() {
+ if (t._menu)
+ t._menu.removeAll();
+ });
+
+ function hide(ed, e) {
+ realCtrlKey = 0;
+
+ // Since the contextmenu event moves
+ // the selection we need to store it away
+ if (e && e.button == 2) {
+ realCtrlKey = e.ctrlKey;
+ return;
+ }
+
+ if (t._menu) {
+ t._menu.removeAll();
+ t._menu.destroy();
+ Event.remove(ed.getDoc(), 'click', hideMenu);
+ t._menu = null;
+ }
+ };
+
+ ed.onMouseDown.add(hide);
+ ed.onKeyDown.add(hide);
+ ed.onKeyDown.add(function(ed, e) {
+ if (e.shiftKey && !e.ctrlKey && !e.altKey && e.keyCode === 121) {
+ Event.cancel(e);
+ showMenu(ed, e);
+ }
+ });
+ },
+
+ /**
+ * Returns information about the plugin as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @method getInfo
+ * @return {Object} Name/value array containing information about the plugin.
+ */
+ getInfo : function() {
+ return {
+ longname : 'Contextmenu',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/contextmenu',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ _getMenu : function(ed) {
+ var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p;
+
+ if (m) {
+ m.removeAll();
+ m.destroy();
+ }
+
+ p = DOM.getPos(ed.getContentAreaContainer());
+
+ m = ed.controlManager.createDropMenu('contextmenu', {
+ offset_x : p.x + ed.getParam('contextmenu_offset_x', 0),
+ offset_y : p.y + ed.getParam('contextmenu_offset_y', 0),
+ constrain : 1,
+ keyboard_focus: true
+ });
+
+ t._menu = m;
+
+ m.add({title : 'advanced.cut_desc', icon : 'cut', cmd : 'Cut'}).setDisabled(col);
+ m.add({title : 'advanced.copy_desc', icon : 'copy', cmd : 'Copy'}).setDisabled(col);
+ m.add({title : 'advanced.paste_desc', icon : 'paste', cmd : 'Paste'});
+
+ if ((el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) || !col) {
+ m.addSeparator();
+ m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
+ m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
+ }
+
+ m.addSeparator();
+ m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
+
+ m.addSeparator();
+ am = m.addMenu({title : 'contextmenu.align'});
+ am.add({title : 'contextmenu.left', icon : 'justifyleft', cmd : 'JustifyLeft'});
+ am.add({title : 'contextmenu.center', icon : 'justifycenter', cmd : 'JustifyCenter'});
+ am.add({title : 'contextmenu.right', icon : 'justifyright', cmd : 'JustifyRight'});
+ am.add({title : 'contextmenu.full', icon : 'justifyfull', cmd : 'JustifyFull'});
+
+ t.onContextMenu.dispatch(t, m, el, col);
+
+ return m;
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('contextmenu', tinymce.plugins.ContextMenu);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js
new file mode 100644
index 0000000..90847e7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(b,c){var d=this;d.editor=b;function a(e){var h=b.dom,g,f=b.selection.getSelectedBlocks();if(f.length){g=h.getAttrib(f[0],"dir");tinymce.each(f,function(i){if(!h.getParent(i.parentNode,"*[dir='"+e+"']",h.getRoot())){if(g!=e){h.setAttrib(i,"dir",e)}else{h.setAttrib(i,"dir",null)}}});b.nodeChanged()}}b.addCommand("mceDirectionLTR",function(){a("ltr")});b.addCommand("mceDirectionRTL",function(){a("rtl")});b.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});b.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});b.onNodeChange.add(d._nodeChange,d)},getInfo:function(){return{longname:"Directionality",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,e){var d=b.dom,c;e=d.getParent(e,d.isBlock);if(!e){a.setDisabled("ltr",1);a.setDisabled("rtl",1);return}c=d.getAttrib(e,"dir");a.setActive("ltr",c=="ltr");a.setDisabled("ltr",0);a.setActive("rtl",c=="rtl");a.setDisabled("rtl",0)}});tinymce.PluginManager.add("directionality",tinymce.plugins.Directionality)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js
new file mode 100644
index 0000000..b134014
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/directionality/editor_plugin_src.js
@@ -0,0 +1,85 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.Directionality', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+
+ function setDir(dir) {
+ var dom = ed.dom, curDir, blocks = ed.selection.getSelectedBlocks();
+
+ if (blocks.length) {
+ curDir = dom.getAttrib(blocks[0], "dir");
+
+ tinymce.each(blocks, function(block) {
+ // Add dir to block if the parent block doesn't already have that dir
+ if (!dom.getParent(block.parentNode, "*[dir='" + dir + "']", dom.getRoot())) {
+ if (curDir != dir) {
+ dom.setAttrib(block, "dir", dir);
+ } else {
+ dom.setAttrib(block, "dir", null);
+ }
+ }
+ });
+
+ ed.nodeChanged();
+ }
+ }
+
+ ed.addCommand('mceDirectionLTR', function() {
+ setDir("ltr");
+ });
+
+ ed.addCommand('mceDirectionRTL', function() {
+ setDir("rtl");
+ });
+
+ ed.addButton('ltr', {title : 'directionality.ltr_desc', cmd : 'mceDirectionLTR'});
+ ed.addButton('rtl', {title : 'directionality.rtl_desc', cmd : 'mceDirectionRTL'});
+
+ ed.onNodeChange.add(t._nodeChange, t);
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Directionality',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/directionality',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ // Private methods
+
+ _nodeChange : function(ed, cm, n) {
+ var dom = ed.dom, dir;
+
+ n = dom.getParent(n, dom.isBlock);
+ if (!n) {
+ cm.setDisabled('ltr', 1);
+ cm.setDisabled('rtl', 1);
+ return;
+ }
+
+ dir = dom.getAttrib(n, 'dir');
+ cm.setActive('ltr', dir == "ltr");
+ cm.setDisabled('ltr', 0);
+ cm.setActive('rtl', dir == "rtl");
+ cm.setDisabled('rtl', 0);
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('directionality', tinymce.plugins.Directionality);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js
new file mode 100644
index 0000000..dbdd8ff
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin.js
@@ -0,0 +1 @@
+(function(a){a.create("tinymce.plugins.EmotionsPlugin",{init:function(b,c){b.addCommand("mceEmotion",function(){b.windowManager.open({file:c+"/emotions.htm",width:250+parseInt(b.getLang("emotions.delta_width",0)),height:160+parseInt(b.getLang("emotions.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("emotions",{title:"emotions.emotions_desc",cmd:"mceEmotion"})},getInfo:function(){return{longname:"Emotions",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("emotions",a.plugins.EmotionsPlugin)})(tinymce);
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js
new file mode 100644
index 0000000..71d5416
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/editor_plugin_src.js
@@ -0,0 +1,43 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function(tinymce) {
+ tinymce.create('tinymce.plugins.EmotionsPlugin', {
+ init : function(ed, url) {
+ // Register commands
+ ed.addCommand('mceEmotion', function() {
+ ed.windowManager.open({
+ file : url + '/emotions.htm',
+ width : 250 + parseInt(ed.getLang('emotions.delta_width', 0)),
+ height : 160 + parseInt(ed.getLang('emotions.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ // Register buttons
+ ed.addButton('emotions', {title : 'emotions.emotions_desc', cmd : 'mceEmotion'});
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Emotions',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/emotions',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('emotions', tinymce.plugins.EmotionsPlugin);
+})(tinymce);
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm
new file mode 100644
index 0000000..1013556
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/emotions.htm
@@ -0,0 +1,42 @@
+
+
+
+ {#emotions_dlg.title}
+
+
+
+
+{#emotions_dlg.title}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif
new file mode 100644
index 0000000..ba90cc3
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cool.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif
new file mode 100644
index 0000000..74d897a
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-cry.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif
new file mode 100644
index 0000000..963a96b
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-embarassed.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif
new file mode 100644
index 0000000..c7cf101
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif
new file mode 100644
index 0000000..716f55e
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-frown.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif
new file mode 100644
index 0000000..334d49e
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-innocent.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif
new file mode 100644
index 0000000..4efd549
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-kiss.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif
new file mode 100644
index 0000000..82c5b18
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-laughing.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif
new file mode 100644
index 0000000..ca2451e
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif
new file mode 100644
index 0000000..fe66220
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-sealed.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif
new file mode 100644
index 0000000..fd27edf
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-smile.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif
new file mode 100644
index 0000000..0cc9bb7
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-surprised.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif
new file mode 100644
index 0000000..2075dc1
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif
new file mode 100644
index 0000000..bef7e25
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-undecided.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif
new file mode 100644
index 0000000..0631c76
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-wink.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif
new file mode 100644
index 0000000..648e6e8
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/img/smiley-yell.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js
new file mode 100644
index 0000000..b360f20
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/js/emotions.js
@@ -0,0 +1,43 @@
+tinyMCEPopup.requireLangPack();
+
+var EmotionsDialog = {
+ addKeyboardNavigation: function(){
+ var tableElm, cells, settings;
+
+ cells = tinyMCEPopup.dom.select("a.emoticon_link", "emoticon_table");
+
+ settings ={
+ root: "emoticon_table",
+ items: cells
+ };
+ cells[0].tabindex=0;
+ tinyMCEPopup.dom.addClass(cells[0], "mceFocus");
+ if (tinymce.isGecko) {
+ cells[0].focus();
+ } else {
+ setTimeout(function(){
+ cells[0].focus();
+ }, 100);
+ }
+ tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom);
+ },
+ init : function(ed) {
+ tinyMCEPopup.resizeToInnerSize();
+ this.addKeyboardNavigation();
+ },
+
+ insert : function(file, title) {
+ var ed = tinyMCEPopup.editor, dom = ed.dom;
+
+ tinyMCEPopup.execCommand('mceInsertContent', false, dom.createHTML('img', {
+ src : tinyMCEPopup.getWindowArg('plugin_url') + '/img/' + file,
+ alt : ed.getLang(title),
+ title : ed.getLang(title),
+ border : 0
+ }));
+
+ tinyMCEPopup.close();
+ }
+};
+
+tinyMCEPopup.onInit.add(EmotionsDialog.init, EmotionsDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js
new file mode 100644
index 0000000..037c4b5
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/emotions/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.emotions_dlg',{cry:"Cry",cool:"Cool",desc:"Emotions",title:"Insert Emotion",usage:"Use left and right arrows to navigate.",yell:"Yell",wink:"Wink",undecided:"Undecided","tongue_out":"Tongue Out",surprised:"Surprised",smile:"Smile",sealed:"Sealed","money_mouth":"Money Mouth",laughing:"Laughing",kiss:"Kiss",innocent:"Innocent",frown:"Frown","foot_in_mouth":"Foot in Mouth",embarassed:"Embarassed"});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm
new file mode 100644
index 0000000..50b2b34
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/dialog.htm
@@ -0,0 +1,22 @@
+
+
+
+ {#example_dlg.title}
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin.js
new file mode 100644
index 0000000..ec1f81e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.PluginManager.requireLangPack("example");tinymce.create("tinymce.plugins.ExamplePlugin",{init:function(a,b){a.addCommand("mceExample",function(){a.windowManager.open({file:b+"/dialog.htm",width:320+parseInt(a.getLang("example.delta_width",0)),height:120+parseInt(a.getLang("example.delta_height",0)),inline:1},{plugin_url:b,some_custom_arg:"custom arg"})});a.addButton("example",{title:"example.desc",cmd:"mceExample",image:b+"/img/example.gif"});a.onNodeChange.add(function(d,c,e){c.setActive("example",e.nodeName=="IMG")})},createControl:function(b,a){return null},getInfo:function(){return{longname:"Example plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example",version:"1.0"}}});tinymce.PluginManager.add("example",tinymce.plugins.ExamplePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js
new file mode 100644
index 0000000..9a0e7da
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/editor_plugin_src.js
@@ -0,0 +1,84 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ // Load plugin specific language pack
+ tinymce.PluginManager.requireLangPack('example');
+
+ tinymce.create('tinymce.plugins.ExamplePlugin', {
+ /**
+ * Initializes the plugin, this will be executed after the plugin has been created.
+ * This call is done before the editor instance has finished it's initialization so use the onInit event
+ * of the editor instance to intercept that event.
+ *
+ * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+ * @param {string} url Absolute URL to where the plugin is located.
+ */
+ init : function(ed, url) {
+ // Register the command so that it can be invoked by using tinyMCE.activeEditor.execCommand('mceExample');
+ ed.addCommand('mceExample', function() {
+ ed.windowManager.open({
+ file : url + '/dialog.htm',
+ width : 320 + parseInt(ed.getLang('example.delta_width', 0)),
+ height : 120 + parseInt(ed.getLang('example.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url, // Plugin absolute URL
+ some_custom_arg : 'custom arg' // Custom argument
+ });
+ });
+
+ // Register example button
+ ed.addButton('example', {
+ title : 'example.desc',
+ cmd : 'mceExample',
+ image : url + '/img/example.gif'
+ });
+
+ // Add a node change handler, selects the button in the UI when a image is selected
+ ed.onNodeChange.add(function(ed, cm, n) {
+ cm.setActive('example', n.nodeName == 'IMG');
+ });
+ },
+
+ /**
+ * Creates control instances based in the incomming name. This method is normally not
+ * needed since the addButton method of the tinymce.Editor class is a more easy way of adding buttons
+ * but you sometimes need to create more complex controls like listboxes, split buttons etc then this
+ * method can be used to create those.
+ *
+ * @param {String} n Name of the control to create.
+ * @param {tinymce.ControlManager} cm Control manager to use inorder to create new control.
+ * @return {tinymce.ui.Control} New control instance or null if no control was created.
+ */
+ createControl : function(n, cm) {
+ return null;
+ },
+
+ /**
+ * Returns information about the plugin as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @return {Object} Name/value array containing information about the plugin.
+ */
+ getInfo : function() {
+ return {
+ longname : 'Example plugin',
+ author : 'Some author',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example',
+ version : "1.0"
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('example', tinymce.plugins.ExamplePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/img/example.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/img/example.gif
new file mode 100644
index 0000000..1ab5da4
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/img/example.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/js/dialog.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/js/dialog.js
new file mode 100644
index 0000000..fa83411
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/js/dialog.js
@@ -0,0 +1,19 @@
+tinyMCEPopup.requireLangPack();
+
+var ExampleDialog = {
+ init : function() {
+ var f = document.forms[0];
+
+ // Get the selected contents as text and place it in the input
+ f.someval.value = tinyMCEPopup.editor.selection.getContent({format : 'text'});
+ f.somearg.value = tinyMCEPopup.getWindowArg('some_custom_arg');
+ },
+
+ insert : function() {
+ // Insert the contents from the input into the document
+ tinyMCEPopup.editor.execCommand('mceInsertContent', false, document.forms[0].someval.value);
+ tinyMCEPopup.close();
+ }
+};
+
+tinyMCEPopup.onInit.add(ExampleDialog.init, ExampleDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js
new file mode 100644
index 0000000..e0784f8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en.js
@@ -0,0 +1,3 @@
+tinyMCE.addI18n('en.example',{
+ desc : 'This is just a template button'
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js
new file mode 100644
index 0000000..ebcf948
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example/langs/en_dlg.js
@@ -0,0 +1,3 @@
+tinyMCE.addI18n('en.example_dlg',{
+ title : 'This is just a example title'
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js
new file mode 100644
index 0000000..0a4551d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.ExampleDependencyPlugin",{init:function(a,b){},getInfo:function(){return{longname:"Example Dependency plugin",author:"Some author",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency",version:"1.0"}}});tinymce.PluginManager.add("example_dependency",tinymce.plugins.ExampleDependencyPlugin,["example"])})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js
new file mode 100644
index 0000000..e1c55e4
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/example_dependency/editor_plugin_src.js
@@ -0,0 +1,50 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+
+ tinymce.create('tinymce.plugins.ExampleDependencyPlugin', {
+ /**
+ * Initializes the plugin, this will be executed after the plugin has been created.
+ * This call is done before the editor instance has finished it's initialization so use the onInit event
+ * of the editor instance to intercept that event.
+ *
+ * @param {tinymce.Editor} ed Editor instance that the plugin is initialized in.
+ * @param {string} url Absolute URL to where the plugin is located.
+ */
+ init : function(ed, url) {
+ },
+
+
+ /**
+ * Returns information about the plugin as a name/value array.
+ * The current keys are longname, author, authorurl, infourl and version.
+ *
+ * @return {Object} Name/value array containing information about the plugin.
+ */
+ getInfo : function() {
+ return {
+ longname : 'Example Dependency plugin',
+ author : 'Some author',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/example_dependency',
+ version : "1.0"
+ };
+ }
+ });
+
+ /**
+ * Register the plugin, specifying the list of the plugins that this plugin depends on. They are specified in a list, with the list loaded in order.
+ * plugins in this list will be initialised when this plugin is initialized. (before the init method is called).
+ * plugins in a depends list should typically be specified using the short name). If neccesary this can be done
+ * with an object which has the url to the plugin and the shortname.
+ */
+ tinymce.PluginManager.add('example_dependency', tinymce.plugins.ExampleDependencyPlugin, ['example']);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css
new file mode 100644
index 0000000..2675cec
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/css/fullpage.css
@@ -0,0 +1,143 @@
+/* Hide the advanced tab */
+#advanced_tab {
+ display: none;
+}
+
+#metatitle, #metakeywords, #metadescription, #metaauthor, #metacopyright {
+ width: 280px;
+}
+
+#doctype, #docencoding {
+ width: 200px;
+}
+
+#langcode {
+ width: 30px;
+}
+
+#bgimage {
+ width: 220px;
+}
+
+#fontface {
+ width: 240px;
+}
+
+#leftmargin, #rightmargin, #topmargin, #bottommargin {
+ width: 50px;
+}
+
+.panel_wrapper div.current {
+ height: 400px;
+}
+
+#stylesheet, #style {
+ width: 240px;
+}
+
+#doctypes {
+ width: 200px;
+}
+
+/* Head list classes */
+
+.headlistwrapper {
+ width: 100%;
+}
+
+.selected {
+ border: 1px solid #0A246A;
+ background-color: #B6BDD2;
+}
+
+.toolbar {
+ width: 100%;
+}
+
+#headlist {
+ width: 100%;
+ margin-top: 3px;
+ font-size: 11px;
+}
+
+#info, #title_element, #meta_element, #script_element, #style_element, #base_element, #link_element, #comment_element, #unknown_element {
+ display: none;
+}
+
+#addmenu {
+ position: absolute;
+ border: 1px solid gray;
+ display: none;
+ z-index: 100;
+ background-color: white;
+}
+
+#addmenu a {
+ display: block;
+ width: 100%;
+ line-height: 20px;
+ text-decoration: none;
+ background-color: white;
+}
+
+#addmenu a:hover {
+ background-color: #B6BDD2;
+ color: black;
+}
+
+#addmenu span {
+ padding-left: 10px;
+ padding-right: 10px;
+}
+
+#updateElementPanel {
+ display: none;
+}
+
+#script_element .panel_wrapper div.current {
+ height: 108px;
+}
+
+#style_element .panel_wrapper div.current {
+ height: 108px;
+}
+
+#link_element .panel_wrapper div.current {
+ height: 140px;
+}
+
+#element_script_value {
+ width: 100%;
+ height: 100px;
+}
+
+#element_comment_value {
+ width: 100%;
+ height: 120px;
+}
+
+#element_style_value {
+ width: 100%;
+ height: 100px;
+}
+
+#element_title, #element_script_src, #element_meta_name, #element_meta_content, #element_base_href, #element_link_href, #element_link_title {
+ width: 250px;
+}
+
+.updateElementButton {
+ margin-top: 3px;
+}
+
+/* MSIE specific styles */
+
+* html .addbutton, * html .removebutton, * html .moveupbutton, * html .movedownbutton {
+ width: 22px;
+ height: 22px;
+}
+
+textarea {
+ height: 55px;
+}
+
+.panel_wrapper div.current {height:420px;}
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js
new file mode 100644
index 0000000..dcf7602
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var b=tinymce.each,a=tinymce.html.Node;tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(c,d){var e=this;e.editor=c;c.addCommand("mceFullPageProperties",function(){c.windowManager.open({file:d+"/fullpage.htm",width:430+parseInt(c.getLang("fullpage.delta_width",0)),height:495+parseInt(c.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:d,data:e._htmlToData()})});c.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});c.onBeforeSetContent.add(e._setContent,e);c.onGetContent.add(e._getContent,e)},getInfo:function(){return{longname:"Fullpage",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_htmlToData:function(){var f=this._parseHeader(),h={},c,i,g,e=this.editor;function d(l,j){var k=l.attr(j);return k||""}h.fontface=e.getParam("fullpage_default_fontface","");h.fontsize=e.getParam("fullpage_default_fontsize","");i=f.firstChild;if(i.type==7){h.xml_pi=true;g=/encoding="([^"]+)"/.exec(i.value);if(g){h.docencoding=g[1]}}i=f.getAll("#doctype")[0];if(i){h.doctype=""}i=f.getAll("title")[0];if(i&&i.firstChild){h.metatitle=i.firstChild.value}b(f.getAll("meta"),function(m){var k=m.attr("name"),j=m.attr("http-equiv"),l;if(k){h["meta"+k.toLowerCase()]=m.attr("content")}else{if(j=="Content-Type"){l=/charset\s*=\s*(.*)\s*/gi.exec(m.attr("content"));if(l){h.docencoding=l[1]}}}});i=f.getAll("html")[0];if(i){h.langcode=d(i,"lang")||d(i,"xml:lang")}i=f.getAll("link")[0];if(i&&i.attr("rel")=="stylesheet"){h.stylesheet=i.attr("href")}i=f.getAll("body")[0];if(i){h.langdir=d(i,"dir");h.style=d(i,"style");h.visited_color=d(i,"vlink");h.link_color=d(i,"link");h.active_color=d(i,"alink")}return h},_dataToHtml:function(g){var f,d,h,j,k,e=this.editor.dom;function c(n,l,m){n.attr(l,m?m:undefined)}function i(l){if(d.firstChild){d.insert(l,d.firstChild)}else{d.append(l)}}f=this._parseHeader();d=f.getAll("head")[0];if(!d){j=f.getAll("html")[0];d=new a("head",1);if(j.firstChild){j.insert(d,j.firstChild,true)}else{j.append(d)}}j=f.firstChild;if(g.xml_pi){k='version="1.0"';if(g.docencoding){k+=' encoding="'+g.docencoding+'"'}if(j.type!=7){j=new a("xml",7);f.insert(j,f.firstChild,true)}j.value=k}else{if(j&&j.type==7){j.remove()}}j=f.getAll("#doctype")[0];if(g.doctype){if(!j){j=new a("#doctype",10);if(g.xml_pi){f.insert(j,f.firstChild)}else{i(j)}}j.value=g.doctype.substring(9,g.doctype.length-1)}else{if(j){j.remove()}}j=f.getAll("title")[0];if(g.metatitle){if(!j){j=new a("title",1);j.append(new a("#text",3)).value=g.metatitle;i(j)}}if(g.docencoding){j=null;b(f.getAll("meta"),function(l){if(l.attr("http-equiv")=="Content-Type"){j=l}});if(!j){j=new a("meta",1);j.attr("http-equiv","Content-Type");j.shortEnded=true;i(j)}j.attr("content","text/html; charset="+g.docencoding)}b("keywords,description,author,copyright,robots".split(","),function(m){var l=f.getAll("meta"),n,p,o=g["meta"+m];for(n=0;n"))},_parseHeader:function(){return new tinymce.html.DomParser({validate:false,root_name:"#document"}).parse(this.head)},_setContent:function(g,d){var m=this,i,c,h=d.content,f,l="",e=m.editor.dom,j;function k(n){return n.replace(/<\/?[A-Z]+/g,function(o){return o.toLowerCase()})}if(d.format=="raw"&&m.head){return}if(d.source_view&&g.getParam("fullpage_hide_in_source_view")){return}h=h.replace(/<(\/?)BODY/gi,"<$1body");i=h.indexOf("",i);m.head=k(h.substring(0,i+1));c=h.indexOf("\n"}f=m._parseHeader();b(f.getAll("style"),function(n){if(n.firstChild){l+=n.firstChild.value}});j=f.getAll("body")[0];if(j){e.setAttribs(m.editor.getBody(),{style:j.attr("style")||"",dir:j.attr("dir")||"",vLink:j.attr("vlink")||"",link:j.attr("link")||"",aLink:j.attr("alink")||""})}e.remove("fullpage_styles");if(l){e.add(m.editor.getDoc().getElementsByTagName("head")[0],"style",{id:"fullpage_styles"},l);j=e.get("fullpage_styles");if(j.styleSheet){j.styleSheet.cssText=l}}},_getDefaultHeader:function(){var f="",c=this.editor,e,d="";if(c.getParam("fullpage_default_xml_pi")){f+='\n'}f+=c.getParam("fullpage_default_doctype",'');f+="\n\n\n";if(e=c.getParam("fullpage_default_title")){f+=""+e+"\n"}if(e=c.getParam("fullpage_default_encoding")){f+='\n'}if(e=c.getParam("fullpage_default_font_family")){d+="font-family: "+e+";"}if(e=c.getParam("fullpage_default_font_size")){d+="font-size: "+e+";"}if(e=c.getParam("fullpage_default_text_color")){d+="color: "+e+";"}f+="\n\n";return f},_getContent:function(d,e){var c=this;if(!e.source_view||!d.getParam("fullpage_hide_in_source_view")){e.content=tinymce.trim(c.head)+"\n"+tinymce.trim(e.content)+"\n"+tinymce.trim(c.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js
new file mode 100644
index 0000000..23de7c5
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/editor_plugin_src.js
@@ -0,0 +1,405 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var each = tinymce.each, Node = tinymce.html.Node;
+
+ tinymce.create('tinymce.plugins.FullPagePlugin', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceFullPageProperties', function() {
+ ed.windowManager.open({
+ file : url + '/fullpage.htm',
+ width : 430 + parseInt(ed.getLang('fullpage.delta_width', 0)),
+ height : 495 + parseInt(ed.getLang('fullpage.delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url,
+ data : t._htmlToData()
+ });
+ });
+
+ // Register buttons
+ ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'});
+
+ ed.onBeforeSetContent.add(t._setContent, t);
+ ed.onGetContent.add(t._getContent, t);
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Fullpage',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullpage',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ // Private plugin internal methods
+
+ _htmlToData : function() {
+ var headerFragment = this._parseHeader(), data = {}, nodes, elm, matches, editor = this.editor;
+
+ function getAttr(elm, name) {
+ var value = elm.attr(name);
+
+ return value || '';
+ };
+
+ // Default some values
+ data.fontface = editor.getParam("fullpage_default_fontface", "");
+ data.fontsize = editor.getParam("fullpage_default_fontsize", "");
+
+ // Parse XML PI
+ elm = headerFragment.firstChild;
+ if (elm.type == 7) {
+ data.xml_pi = true;
+ matches = /encoding="([^"]+)"/.exec(elm.value);
+ if (matches)
+ data.docencoding = matches[1];
+ }
+
+ // Parse doctype
+ elm = headerFragment.getAll('#doctype')[0];
+ if (elm)
+ data.doctype = '";
+
+ // Parse title element
+ elm = headerFragment.getAll('title')[0];
+ if (elm && elm.firstChild) {
+ data.metatitle = elm.firstChild.value;
+ }
+
+ // Parse meta elements
+ each(headerFragment.getAll('meta'), function(meta) {
+ var name = meta.attr('name'), httpEquiv = meta.attr('http-equiv'), matches;
+
+ if (name)
+ data['meta' + name.toLowerCase()] = meta.attr('content');
+ else if (httpEquiv == "Content-Type") {
+ matches = /charset\s*=\s*(.*)\s*/gi.exec(meta.attr('content'));
+
+ if (matches)
+ data.docencoding = matches[1];
+ }
+ });
+
+ // Parse html attribs
+ elm = headerFragment.getAll('html')[0];
+ if (elm)
+ data.langcode = getAttr(elm, 'lang') || getAttr(elm, 'xml:lang');
+
+ // Parse stylesheet
+ elm = headerFragment.getAll('link')[0];
+ if (elm && elm.attr('rel') == 'stylesheet')
+ data.stylesheet = elm.attr('href');
+
+ // Parse body parts
+ elm = headerFragment.getAll('body')[0];
+ if (elm) {
+ data.langdir = getAttr(elm, 'dir');
+ data.style = getAttr(elm, 'style');
+ data.visited_color = getAttr(elm, 'vlink');
+ data.link_color = getAttr(elm, 'link');
+ data.active_color = getAttr(elm, 'alink');
+ }
+
+ return data;
+ },
+
+ _dataToHtml : function(data) {
+ var headerFragment, headElement, html, elm, value, dom = this.editor.dom;
+
+ function setAttr(elm, name, value) {
+ elm.attr(name, value ? value : undefined);
+ };
+
+ function addHeadNode(node) {
+ if (headElement.firstChild)
+ headElement.insert(node, headElement.firstChild);
+ else
+ headElement.append(node);
+ };
+
+ headerFragment = this._parseHeader();
+ headElement = headerFragment.getAll('head')[0];
+ if (!headElement) {
+ elm = headerFragment.getAll('html')[0];
+ headElement = new Node('head', 1);
+
+ if (elm.firstChild)
+ elm.insert(headElement, elm.firstChild, true);
+ else
+ elm.append(headElement);
+ }
+
+ // Add/update/remove XML-PI
+ elm = headerFragment.firstChild;
+ if (data.xml_pi) {
+ value = 'version="1.0"';
+
+ if (data.docencoding)
+ value += ' encoding="' + data.docencoding + '"';
+
+ if (elm.type != 7) {
+ elm = new Node('xml', 7);
+ headerFragment.insert(elm, headerFragment.firstChild, true);
+ }
+
+ elm.value = value;
+ } else if (elm && elm.type == 7)
+ elm.remove();
+
+ // Add/update/remove doctype
+ elm = headerFragment.getAll('#doctype')[0];
+ if (data.doctype) {
+ if (!elm) {
+ elm = new Node('#doctype', 10);
+
+ if (data.xml_pi)
+ headerFragment.insert(elm, headerFragment.firstChild);
+ else
+ addHeadNode(elm);
+ }
+
+ elm.value = data.doctype.substring(9, data.doctype.length - 1);
+ } else if (elm)
+ elm.remove();
+
+ // Add/update/remove title
+ elm = headerFragment.getAll('title')[0];
+ if (data.metatitle) {
+ if (!elm) {
+ elm = new Node('title', 1);
+ elm.append(new Node('#text', 3)).value = data.metatitle;
+ addHeadNode(elm);
+ }
+ }
+
+ // Add meta encoding
+ if (data.docencoding) {
+ elm = null;
+ each(headerFragment.getAll('meta'), function(meta) {
+ if (meta.attr('http-equiv') == 'Content-Type')
+ elm = meta;
+ });
+
+ if (!elm) {
+ elm = new Node('meta', 1);
+ elm.attr('http-equiv', 'Content-Type');
+ elm.shortEnded = true;
+ addHeadNode(elm);
+ }
+
+ elm.attr('content', 'text/html; charset=' + data.docencoding);
+ }
+
+ // Add/update/remove meta
+ each('keywords,description,author,copyright,robots'.split(','), function(name) {
+ var nodes = headerFragment.getAll('meta'), i, meta, value = data['meta' + name];
+
+ for (i = 0; i < nodes.length; i++) {
+ meta = nodes[i];
+
+ if (meta.attr('name') == name) {
+ if (value)
+ meta.attr('content', value);
+ else
+ meta.remove();
+
+ return;
+ }
+ }
+
+ if (value) {
+ elm = new Node('meta', 1);
+ elm.attr('name', name);
+ elm.attr('content', value);
+ elm.shortEnded = true;
+
+ addHeadNode(elm);
+ }
+ });
+
+ // Add/update/delete link
+ elm = headerFragment.getAll('link')[0];
+ if (elm && elm.attr('rel') == 'stylesheet') {
+ if (data.stylesheet)
+ elm.attr('href', data.stylesheet);
+ else
+ elm.remove();
+ } else if (data.stylesheet) {
+ elm = new Node('link', 1);
+ elm.attr({
+ rel : 'stylesheet',
+ text : 'text/css',
+ href : data.stylesheet
+ });
+ elm.shortEnded = true;
+
+ addHeadNode(elm);
+ }
+
+ // Update body attributes
+ elm = headerFragment.getAll('body')[0];
+ if (elm) {
+ setAttr(elm, 'dir', data.langdir);
+ setAttr(elm, 'style', data.style);
+ setAttr(elm, 'vlink', data.visited_color);
+ setAttr(elm, 'link', data.link_color);
+ setAttr(elm, 'alink', data.active_color);
+
+ // Update iframe body as well
+ dom.setAttribs(this.editor.getBody(), {
+ style : data.style,
+ dir : data.dir,
+ vLink : data.visited_color,
+ link : data.link_color,
+ aLink : data.active_color
+ });
+ }
+
+ // Set html attributes
+ elm = headerFragment.getAll('html')[0];
+ if (elm) {
+ setAttr(elm, 'lang', data.langcode);
+ setAttr(elm, 'xml:lang', data.langcode);
+ }
+
+ // Serialize header fragment and crop away body part
+ html = new tinymce.html.Serializer({
+ validate: false,
+ indent: true,
+ apply_source_formatting : true,
+ indent_before: 'head,html,body,meta,title,script,link,style',
+ indent_after: 'head,html,body,meta,title,script,link,style'
+ }).serialize(headerFragment);
+
+ this.head = html.substring(0, html.indexOf(''));
+ },
+
+ _parseHeader : function() {
+ // Parse the contents with a DOM parser
+ return new tinymce.html.DomParser({
+ validate: false,
+ root_name: '#document'
+ }).parse(this.head);
+ },
+
+ _setContent : function(ed, o) {
+ var self = this, startPos, endPos, content = o.content, headerFragment, styles = '', dom = self.editor.dom, elm;
+
+ function low(s) {
+ return s.replace(/<\/?[A-Z]+/g, function(a) {
+ return a.toLowerCase();
+ })
+ };
+
+ // Ignore raw updated if we already have a head, this will fix issues with undo/redo keeping the head/foot separate
+ if (o.format == 'raw' && self.head)
+ return;
+
+ if (o.source_view && ed.getParam('fullpage_hide_in_source_view'))
+ return;
+
+ // Parse out head, body and footer
+ content = content.replace(/<(\/?)BODY/gi, '<$1body');
+ startPos = content.indexOf('', startPos);
+ self.head = low(content.substring(0, startPos + 1));
+
+ endPos = content.indexOf('\n';
+ }
+
+ // Parse header and update iframe
+ headerFragment = self._parseHeader();
+ each(headerFragment.getAll('style'), function(node) {
+ if (node.firstChild)
+ styles += node.firstChild.value;
+ });
+
+ elm = headerFragment.getAll('body')[0];
+ if (elm) {
+ dom.setAttribs(self.editor.getBody(), {
+ style : elm.attr('style') || '',
+ dir : elm.attr('dir') || '',
+ vLink : elm.attr('vlink') || '',
+ link : elm.attr('link') || '',
+ aLink : elm.attr('alink') || ''
+ });
+ }
+
+ dom.remove('fullpage_styles');
+
+ if (styles) {
+ dom.add(self.editor.getDoc().getElementsByTagName('head')[0], 'style', {id : 'fullpage_styles'}, styles);
+
+ // Needed for IE 6/7
+ elm = dom.get('fullpage_styles');
+ if (elm.styleSheet)
+ elm.styleSheet.cssText = styles;
+ }
+ },
+
+ _getDefaultHeader : function() {
+ var header = '', editor = this.editor, value, styles = '';
+
+ if (editor.getParam('fullpage_default_xml_pi'))
+ header += '\n';
+
+ header += editor.getParam('fullpage_default_doctype', '');
+ header += '\n\n\n';
+
+ if (value = editor.getParam('fullpage_default_title'))
+ header += '' + value + '\n';
+
+ if (value = editor.getParam('fullpage_default_encoding'))
+ header += '\n';
+
+ if (value = editor.getParam('fullpage_default_font_family'))
+ styles += 'font-family: ' + value + ';';
+
+ if (value = editor.getParam('fullpage_default_font_size'))
+ styles += 'font-size: ' + value + ';';
+
+ if (value = editor.getParam('fullpage_default_text_color'))
+ styles += 'color: ' + value + ';';
+
+ header += '\n\n';
+
+ return header;
+ },
+
+ _getContent : function(ed, o) {
+ var self = this;
+
+ if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view'))
+ o.content = tinymce.trim(self.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(self.foot);
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm
new file mode 100644
index 0000000..14ab865
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/fullpage.htm
@@ -0,0 +1,259 @@
+
+
+
+ {#fullpage_dlg.title}
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js
new file mode 100644
index 0000000..3f672ad
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/js/fullpage.js
@@ -0,0 +1,232 @@
+/**
+ * fullpage.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinyMCEPopup.requireLangPack();
+
+ var defaultDocTypes =
+ 'XHTML 1.0 Transitional=,' +
+ 'XHTML 1.0 Frameset=,' +
+ 'XHTML 1.0 Strict=,' +
+ 'XHTML 1.1=,' +
+ 'HTML 4.01 Transitional=,' +
+ 'HTML 4.01 Strict=,' +
+ 'HTML 4.01 Frameset=';
+
+ var defaultEncodings =
+ 'Western european (iso-8859-1)=iso-8859-1,' +
+ 'Central European (iso-8859-2)=iso-8859-2,' +
+ 'Unicode (UTF-8)=utf-8,' +
+ 'Chinese traditional (Big5)=big5,' +
+ 'Cyrillic (iso-8859-5)=iso-8859-5,' +
+ 'Japanese (iso-2022-jp)=iso-2022-jp,' +
+ 'Greek (iso-8859-7)=iso-8859-7,' +
+ 'Korean (iso-2022-kr)=iso-2022-kr,' +
+ 'ASCII (us-ascii)=us-ascii';
+
+ var defaultFontNames = 'Arial=arial,helvetica,sans-serif;Courier New=courier new,courier,monospace;Georgia=georgia,times new roman,times,serif;Tahoma=tahoma,arial,helvetica,sans-serif;Times New Roman=times new roman,times,serif;Verdana=verdana,arial,helvetica,sans-serif;Impact=impact;WingDings=wingdings';
+ var defaultFontSizes = '10px,11px,12px,13px,14px,15px,16px';
+
+ function setVal(id, value) {
+ var elm = document.getElementById(id);
+
+ if (elm) {
+ value = value || '';
+
+ if (elm.nodeName == "SELECT")
+ selectByValue(document.forms[0], id, value);
+ else if (elm.type == "checkbox")
+ elm.checked = !!value;
+ else
+ elm.value = value;
+ }
+ };
+
+ function getVal(id) {
+ var elm = document.getElementById(id);
+
+ if (elm.nodeName == "SELECT")
+ return elm.options[elm.selectedIndex].value;
+
+ if (elm.type == "checkbox")
+ return elm.checked;
+
+ return elm.value;
+ };
+
+ window.FullPageDialog = {
+ changedStyle : function() {
+ var val, styles = tinyMCEPopup.editor.dom.parseStyle(getVal('style'));
+
+ setVal('fontface', styles['font-face']);
+ setVal('fontsize', styles['font-size']);
+ setVal('textcolor', styles['color']);
+
+ if (val = styles['background-image'])
+ setVal('bgimage', val.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1"));
+ else
+ setVal('bgimage', '');
+
+ setVal('bgcolor', styles['background-color']);
+
+ // Reset margin form elements
+ setVal('topmargin', '');
+ setVal('rightmargin', '');
+ setVal('bottommargin', '');
+ setVal('leftmargin', '');
+
+ // Expand margin
+ if (val = styles['margin']) {
+ val = val.split(' ');
+ styles['margin-top'] = val[0] || '';
+ styles['margin-right'] = val[1] || val[0] || '';
+ styles['margin-bottom'] = val[2] || val[0] || '';
+ styles['margin-left'] = val[3] || val[0] || '';
+ }
+
+ if (val = styles['margin-top'])
+ setVal('topmargin', val.replace(/px/, ''));
+
+ if (val = styles['margin-right'])
+ setVal('rightmargin', val.replace(/px/, ''));
+
+ if (val = styles['margin-bottom'])
+ setVal('bottommargin', val.replace(/px/, ''));
+
+ if (val = styles['margin-left'])
+ setVal('leftmargin', val.replace(/px/, ''));
+
+ updateColor('bgcolor_pick', 'bgcolor');
+ updateColor('textcolor_pick', 'textcolor');
+ },
+
+ changedStyleProp : function() {
+ var val, dom = tinyMCEPopup.editor.dom, styles = dom.parseStyle(getVal('style'));
+
+ styles['font-face'] = getVal('fontface');
+ styles['font-size'] = getVal('fontsize');
+ styles['color'] = getVal('textcolor');
+ styles['background-color'] = getVal('bgcolor');
+
+ if (val = getVal('bgimage'))
+ styles['background-image'] = "url('" + val + "')";
+ else
+ styles['background-image'] = '';
+
+ delete styles['margin'];
+
+ if (val = getVal('topmargin'))
+ styles['margin-top'] = val + "px";
+ else
+ styles['margin-top'] = '';
+
+ if (val = getVal('rightmargin'))
+ styles['margin-right'] = val + "px";
+ else
+ styles['margin-right'] = '';
+
+ if (val = getVal('bottommargin'))
+ styles['margin-bottom'] = val + "px";
+ else
+ styles['margin-bottom'] = '';
+
+ if (val = getVal('leftmargin'))
+ styles['margin-left'] = val + "px";
+ else
+ styles['margin-left'] = '';
+
+ // Serialize, parse and reserialize this will compress redundant styles
+ setVal('style', dom.serializeStyle(dom.parseStyle(dom.serializeStyle(styles))));
+ this.changedStyle();
+ },
+
+ update : function() {
+ var data = {};
+
+ tinymce.each(tinyMCEPopup.dom.select('select,input,textarea'), function(node) {
+ data[node.id] = getVal(node.id);
+ });
+
+ tinyMCEPopup.editor.plugins.fullpage._dataToHtml(data);
+ tinyMCEPopup.close();
+ }
+ };
+
+ function init() {
+ var form = document.forms[0], i, item, list, editor = tinyMCEPopup.editor;
+
+ // Setup doctype select box
+ list = editor.getParam("fullpage_doctypes", defaultDocTypes).split(',');
+ for (i = 0; i < list.length; i++) {
+ item = list[i].split('=');
+
+ if (item.length > 1)
+ addSelectValue(form, 'doctype', item[0], item[1]);
+ }
+
+ // Setup fonts select box
+ list = editor.getParam("fullpage_fonts", defaultFontNames).split(';');
+ for (i = 0; i < list.length; i++) {
+ item = list[i].split('=');
+
+ if (item.length > 1)
+ addSelectValue(form, 'fontface', item[0], item[1]);
+ }
+
+ // Setup fontsize select box
+ list = editor.getParam("fullpage_fontsizes", defaultFontSizes).split(',');
+ for (i = 0; i < list.length; i++)
+ addSelectValue(form, 'fontsize', list[i], list[i]);
+
+ // Setup encodings select box
+ list = editor.getParam("fullpage_encodings", defaultEncodings).split(',');
+ for (i = 0; i < list.length; i++) {
+ item = list[i].split('=');
+
+ if (item.length > 1)
+ addSelectValue(form, 'docencoding', item[0], item[1]);
+ }
+
+ // Setup color pickers
+ document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+ document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');
+ document.getElementById('visited_color_pickcontainer').innerHTML = getColorPickerHTML('visited_color_pick','visited_color');
+ document.getElementById('active_color_pickcontainer').innerHTML = getColorPickerHTML('active_color_pick','active_color');
+ document.getElementById('textcolor_pickcontainer').innerHTML = getColorPickerHTML('textcolor_pick','textcolor');
+ document.getElementById('stylesheet_browsercontainer').innerHTML = getBrowserHTML('stylesheetbrowser','stylesheet','file','fullpage');
+ document.getElementById('bgimage_pickcontainer').innerHTML = getBrowserHTML('bgimage_browser','bgimage','image','fullpage');
+
+ // Resize some elements
+ if (isVisible('stylesheetbrowser'))
+ document.getElementById('stylesheet').style.width = '220px';
+
+ if (isVisible('link_href_browser'))
+ document.getElementById('element_link_href').style.width = '230px';
+
+ if (isVisible('bgimage_browser'))
+ document.getElementById('bgimage').style.width = '210px';
+
+ // Update form
+ tinymce.each(tinyMCEPopup.getWindowArg('data'), function(value, key) {
+ setVal(key, value);
+ });
+
+ FullPageDialog.changedStyle();
+
+ // Update colors
+ updateColor('textcolor_pick', 'textcolor');
+ updateColor('bgcolor_pick', 'bgcolor');
+ updateColor('visited_color_pick', 'visited_color');
+ updateColor('active_color_pick', 'active_color');
+ updateColor('link_color_pick', 'link_color');
+ };
+
+ tinyMCEPopup.onInit.add(init);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js
new file mode 100644
index 0000000..516edc7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullpage/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.fullpage_dlg',{title:"Document Properties","meta_tab":"General","appearance_tab":"Appearance","advanced_tab":"Advanced","meta_props":"Meta Information",langprops:"Language and Encoding","meta_title":"Title","meta_keywords":"Keywords","meta_description":"Description","meta_robots":"Robots",doctypes:"Doctype",langcode:"Language Code",langdir:"Language Direction",ltr:"Left to Right",rtl:"Right to Left","xml_pi":"XML Declaration",encoding:"Character Encoding","appearance_bgprops":"Background Properties","appearance_marginprops":"Body Margins","appearance_linkprops":"Link Colors","appearance_textprops":"Text Properties",bgcolor:"Background Color",bgimage:"Background Image","left_margin":"Left Margin","right_margin":"Right Margin","top_margin":"Top Margin","bottom_margin":"Bottom Margin","text_color":"Text Color","font_size":"Font Size","font_face":"Font Face","link_color":"Link Color","hover_color":"Hover Color","visited_color":"Visited Color","active_color":"Active Color",textcolor:"Color",fontsize:"Font Size",fontface:"Font Family","meta_index_follow":"Index and Follow the Links","meta_index_nofollow":"Index and Don\'t Follow the Links","meta_noindex_follow":"Do Not Index but Follow the Links","meta_noindex_nofollow":"Do Not Index and Don\'t Follow the Links","appearance_style":"Stylesheet and Style Properties",stylesheet:"Stylesheet",style:"Style",author:"Author",copyright:"Copyright",add:"Add New Element",remove:"Remove Selected Element",moveup:"Move Selected Element Up",movedown:"Move Selected Element Down","head_elements":"Head Elements",info:"Information","add_title":"Title Element","add_meta":"Meta Element","add_script":"Script Element","add_style":"Style Element","add_link":"Link Element","add_base":"Base Element","add_comment":"Comment Node","title_element":"Title Element","script_element":"Script Element","style_element":"Style Element","base_element":"Base Element","link_element":"Link Element","meta_element":"Meta Element","comment_element":"Comment",src:"Source",language:"Language",href:"HREF",target:"Target",type:"Type",charset:"Charset",defer:"Defer",media:"Media",properties:"Properties",name:"Name",value:"Value",content:"Content",rel:"Rel",rev:"Rev",hreflang:"HREF Lang","general_props":"General","advanced_props":"Advanced"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js
new file mode 100644
index 0000000..a2eb034
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(d,e){var f=this,g={},c,b;f.editor=d;d.addCommand("mceFullScreen",function(){var i,j=a.doc.documentElement;if(d.getParam("fullscreen_is_enabled")){if(d.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",f.resizeFunc);tinyMCE.get(d.getParam("fullscreen_editor_id")).setContent(d.getContent());tinyMCE.remove(d);a.remove("mce_fullscreen_container");j.style.overflow=d.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",d.getParam("fullscreen_overflow"));a.win.scrollTo(d.getParam("fullscreen_scrollx"),d.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(d.getParam("fullscreen_new_window")){i=a.win.open(e+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{i.resizeTo(screen.availWidth,screen.availHeight)}catch(h){}}else{tinyMCE.oldSettings=tinyMCE.settings;g.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";g.fullscreen_html_overflow=a.getStyle(j,"overflow",1);c=a.getViewPort();g.fullscreen_scrollx=c.x;g.fullscreen_scrolly=c.y;if(tinymce.isOpera&&g.fullscreen_overflow=="visible"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&g.fullscreen_overflow=="scroll"){g.fullscreen_overflow="auto"}if(tinymce.isIE&&(g.fullscreen_html_overflow=="visible"||g.fullscreen_html_overflow=="scroll")){g.fullscreen_html_overflow="auto"}if(g.fullscreen_overflow=="0px"){g.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");j.style.overflow="hidden";c=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){c.h-=1}if(tinymce.isIE6||document.compatMode=="BackCompat"){b="absolute;top:"+c.y}else{b="fixed;top:0"}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+b+";left:0;width:"+c.w+"px;height:"+c.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(d.settings,function(k,l){g[l]=k});g.id="mce_fullscreen";g.width=n.clientWidth;g.height=n.clientHeight-15;g.fullscreen_is_enabled=true;g.fullscreen_editor_id=d.id;g.theme_advanced_resizing=false;g.save_onsavecallback=function(){d.setContent(tinyMCE.get(g.id).getContent());d.execCommand("mceSave")};tinymce.each(d.getParam("fullscreen_settings"),function(m,l){g[l]=m});if(g.theme_advanced_toolbar_location==="external"){g.theme_advanced_toolbar_location="top"}f.fullscreenEditor=new tinymce.Editor("mce_fullscreen",g);f.fullscreenEditor.onInit.add(function(){f.fullscreenEditor.setContent(d.getContent());f.fullscreenEditor.focus()});f.fullscreenEditor.render();f.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");f.fullscreenElement.update();f.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var o=tinymce.DOM.getViewPort(),l=f.fullscreenEditor,k,m;k=l.dom.getSize(l.getContainer().getElementsByTagName("table")[0]);m=l.dom.getSize(l.getContainer().getElementsByTagName("iframe")[0]);l.theme.resizeTo(o.w-k.w+m.w,o.h-k.h+m.h)})}});d.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});d.onNodeChange.add(function(i,h){h.setActive("fullscreen",i.getParam("fullscreen_is_enabled"))})},getInfo:function(){return{longname:"Fullscreen",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("fullscreen",tinymce.plugins.FullScreenPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js
new file mode 100644
index 0000000..524b487
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/editor_plugin_src.js
@@ -0,0 +1,159 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var DOM = tinymce.DOM;
+
+ tinymce.create('tinymce.plugins.FullScreenPlugin', {
+ init : function(ed, url) {
+ var t = this, s = {}, vp, posCss;
+
+ t.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceFullScreen', function() {
+ var win, de = DOM.doc.documentElement;
+
+ if (ed.getParam('fullscreen_is_enabled')) {
+ if (ed.getParam('fullscreen_new_window'))
+ closeFullscreen(); // Call to close in new window
+ else {
+ DOM.win.setTimeout(function() {
+ tinymce.dom.Event.remove(DOM.win, 'resize', t.resizeFunc);
+ tinyMCE.get(ed.getParam('fullscreen_editor_id')).setContent(ed.getContent());
+ tinyMCE.remove(ed);
+ DOM.remove('mce_fullscreen_container');
+ de.style.overflow = ed.getParam('fullscreen_html_overflow');
+ DOM.setStyle(DOM.doc.body, 'overflow', ed.getParam('fullscreen_overflow'));
+ DOM.win.scrollTo(ed.getParam('fullscreen_scrollx'), ed.getParam('fullscreen_scrolly'));
+ tinyMCE.settings = tinyMCE.oldSettings; // Restore old settings
+ }, 10);
+ }
+
+ return;
+ }
+
+ if (ed.getParam('fullscreen_new_window')) {
+ win = DOM.win.open(url + "/fullscreen.htm", "mceFullScreenPopup", "fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width=" + screen.availWidth + ",height=" + screen.availHeight);
+ try {
+ win.resizeTo(screen.availWidth, screen.availHeight);
+ } catch (e) {
+ // Ignore
+ }
+ } else {
+ tinyMCE.oldSettings = tinyMCE.settings; // Store old settings
+ s.fullscreen_overflow = DOM.getStyle(DOM.doc.body, 'overflow', 1) || 'auto';
+ s.fullscreen_html_overflow = DOM.getStyle(de, 'overflow', 1);
+ vp = DOM.getViewPort();
+ s.fullscreen_scrollx = vp.x;
+ s.fullscreen_scrolly = vp.y;
+
+ // Fixes an Opera bug where the scrollbars doesn't reappear
+ if (tinymce.isOpera && s.fullscreen_overflow == 'visible')
+ s.fullscreen_overflow = 'auto';
+
+ // Fixes an IE bug where horizontal scrollbars would appear
+ if (tinymce.isIE && s.fullscreen_overflow == 'scroll')
+ s.fullscreen_overflow = 'auto';
+
+ // Fixes an IE bug where the scrollbars doesn't reappear
+ if (tinymce.isIE && (s.fullscreen_html_overflow == 'visible' || s.fullscreen_html_overflow == 'scroll'))
+ s.fullscreen_html_overflow = 'auto';
+
+ if (s.fullscreen_overflow == '0px')
+ s.fullscreen_overflow = '';
+
+ DOM.setStyle(DOM.doc.body, 'overflow', 'hidden');
+ de.style.overflow = 'hidden'; //Fix for IE6/7
+ vp = DOM.getViewPort();
+ DOM.win.scrollTo(0, 0);
+
+ if (tinymce.isIE)
+ vp.h -= 1;
+
+ // Use fixed position if it exists
+ if (tinymce.isIE6 || document.compatMode == 'BackCompat')
+ posCss = 'absolute;top:' + vp.y;
+ else
+ posCss = 'fixed;top:0';
+
+ n = DOM.add(DOM.doc.body, 'div', {
+ id : 'mce_fullscreen_container',
+ style : 'position:' + posCss + ';left:0;width:' + vp.w + 'px;height:' + vp.h + 'px;z-index:200000;'});
+ DOM.add(n, 'div', {id : 'mce_fullscreen'});
+
+ tinymce.each(ed.settings, function(v, n) {
+ s[n] = v;
+ });
+
+ s.id = 'mce_fullscreen';
+ s.width = n.clientWidth;
+ s.height = n.clientHeight - 15;
+ s.fullscreen_is_enabled = true;
+ s.fullscreen_editor_id = ed.id;
+ s.theme_advanced_resizing = false;
+ s.save_onsavecallback = function() {
+ ed.setContent(tinyMCE.get(s.id).getContent());
+ ed.execCommand('mceSave');
+ };
+
+ tinymce.each(ed.getParam('fullscreen_settings'), function(v, k) {
+ s[k] = v;
+ });
+
+ if (s.theme_advanced_toolbar_location === 'external')
+ s.theme_advanced_toolbar_location = 'top';
+
+ t.fullscreenEditor = new tinymce.Editor('mce_fullscreen', s);
+ t.fullscreenEditor.onInit.add(function() {
+ t.fullscreenEditor.setContent(ed.getContent());
+ t.fullscreenEditor.focus();
+ });
+
+ t.fullscreenEditor.render();
+
+ t.fullscreenElement = new tinymce.dom.Element('mce_fullscreen_container');
+ t.fullscreenElement.update();
+ //document.body.overflow = 'hidden';
+
+ t.resizeFunc = tinymce.dom.Event.add(DOM.win, 'resize', function() {
+ var vp = tinymce.DOM.getViewPort(), fed = t.fullscreenEditor, outerSize, innerSize;
+
+ // Get outer/inner size to get a delta size that can be used to calc the new iframe size
+ outerSize = fed.dom.getSize(fed.getContainer().getElementsByTagName('table')[0]);
+ innerSize = fed.dom.getSize(fed.getContainer().getElementsByTagName('iframe')[0]);
+
+ fed.theme.resizeTo(vp.w - outerSize.w + innerSize.w, vp.h - outerSize.h + innerSize.h);
+ });
+ }
+ });
+
+ // Register buttons
+ ed.addButton('fullscreen', {title : 'fullscreen.desc', cmd : 'mceFullScreen'});
+
+ ed.onNodeChange.add(function(ed, cm) {
+ cm.setActive('fullscreen', ed.getParam('fullscreen_is_enabled'));
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Fullscreen',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/fullscreen',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('fullscreen', tinymce.plugins.FullScreenPlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm
new file mode 100644
index 0000000..ffe528e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/fullscreen/fullscreen.htm
@@ -0,0 +1,110 @@
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/editor_plugin.js
new file mode 100644
index 0000000..b2ce927
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.PluginManager.requireLangPack("grappelli");var e=tinymce.DOM;tinymce.create("tinymce.plugins.Grappelli",{init:function(t,n){var r=this;tb=t.getParam("grappelli_adv_toolbar","toolbar2");documentstructure_css=n+"../../../themes/advanced/skins/grappelli/content_documentstructure_"+t.settings.language+".css";cookie_date=new Date;var s=cookie_date.getFullYear();cookie_date.setYear(s+1);cookie_grappelli_show_documentstructure=tinymce.util.Cookie.get("grappelli_show_documentstructure");cookie_grappelli_show_documentstructure!=null?t.settings.grappelli_show_documentstructure=cookie_grappelli_show_documentstructure:tinymce.util.Cookie.set("grappelli_show_documentstructure",t.settings.grappelli_show_documentstructure,cookie_date,"/");t.onInit.add(function(){"mce_fullscreen"==t.id&&t.dom.addClass(t.dom.select("body"),"fullscreen");t.settings.grappelli_adv_hidden?r._hide_adv_menu(t):r._show_adv_menu(t);t.settings.grappelli_show_documentstructure=="on"?r._show_documentstructure(t):r._hide_documentstructure(t)});t.addCommand("Grappelli_Adv",function(){e.isHidden(t.controlManager.get(tb).id)?r._show_adv_menu(t):r._hide_adv_menu(t)});t.addCommand("Grappelli_DocumentStructure",function(){i=t.controlManager;t.settings.grappelli_show_documentstructure=="on"?r._hide_documentstructure(t):r._show_documentstructure(t)});t.addButton("grappelli_adv",{title:"grappelli.grappelli_adv_desc",cmd:"Grappelli_Adv"});t.addButton("grappelli_documentstructure",{title:"grappelli.grappelli_documentstructure_desc",cmd:"Grappelli_DocumentStructure"});t.onBeforeExecCommand.add(function(e,t,n,i){if("mceFullScreen"!=t)return;if("mce_fullscreen"==e.id){base_ed=tinyMCE.get(e.settings.fullscreen_editor_id);e.settings.grappelli_adv_hidden?r._hide_adv_menu(base_ed):r._show_adv_menu(base_ed);e.settings.grappelli_show_documentstructure=="on"?r._show_documentstructure(base_ed):r._hide_documentstructure(base_ed)}});t.addShortcut("alt+shift+z",t.getLang("grappelli_adv_desc"),"Grappelli_Adv")},_resizeIframe:function(t,n,r){var i=t.getContentAreaContainer().firstChild;e.setStyle(i,"height",i.clientHeight+r);t.theme.deltaHeight+=r},_show_documentstructure:function(e){head=e.getBody().previousSibling;var t=head.childNodes;for(var n=0;n= 0; i--) {
+ // c_cn = cn[i];
+ // if (c_cn.nodeType == 3 || (!ed.dom.isBlock(c_cn) && c_cn.nodeType != 8)) {
+ // if (c_cn.nodeType != 3 || /[^\s]/g.test(c_cn.nodeValue)) {
+ // bl = ed.dom.create('p');
+ // bl.appendChild(c_cn.cloneNode(1));
+ // new_cn = c_cn.parentNode.replaceChild(bl, c_cn);
+ // // move caret
+ // r = ed.getDoc().createRange();
+ // r.setStart(bl, bl.nodeValue ? bl.nodeValue.length : 0);
+ // r.setEnd(bl, bl.nodeValue ? bl.nodeValue.length : 0);
+ // ed.selection.setRng(r);
+ // }
+ // }
+ // }
+ // }
+ // });
+
+ },
+
+ // INTERNAL: RESIZE
+ _resizeIframe: function(ed, tb, b) {
+ var iframe = ed.getContentAreaContainer().firstChild;
+ DOM.setStyle(iframe, "height", iframe.clientHeight + b);
+ ed.theme.deltaHeight += b
+ },
+
+ // INTERNAL: SHOW/HIDE DOCUMENT STRUCTURE
+ _show_documentstructure: function(ed) {
+ head = ed.getBody().previousSibling;
+ var headChilds = head.childNodes;
+
+ for (var i = 0; i < headChilds.length; i++) {
+ if (headChilds[i].nodeName == "LINK"
+ && headChilds[i].getAttribute('href') == documentstructure_css) {
+ // documentstructure_css is already set so...
+ return;
+ }
+ }
+ var vs_link = document.createElement("link");
+ vs_link.rel="stylesheet";
+ vs_link.mce_href = documentstructure_css;
+ vs_link.href = documentstructure_css;
+ head.appendChild(vs_link);
+ ed.settings.grappelli_show_documentstructure = 'on';
+ tinymce.util.Cookie.set('grappelli_show_documentstructure', 'on', cookie_date, '/');
+ ed.controlManager.setActive('grappelli_documentstructure', true);
+ },
+ _hide_documentstructure: function(ed) {
+ head = ed.getBody().previousSibling;
+ vs_link = null;
+
+ var headChilds = head.childNodes;
+
+ for (var i = 0; i < headChilds.length; i++) {
+ if (headChilds[i].nodeName == "LINK"
+ && headChilds[i].getAttribute('href') == documentstructure_css) {
+ // found the node with documentstructure_css
+ vs_link = headChilds[i];
+ break;
+ }
+ }
+
+ if (vs_link !== null) {
+ // if we found the node with documentstructure_css, delete it
+ head.removeChild(vs_link);
+ ed.settings.grappelli_show_documentstructure = 'off';
+ tinymce.util.Cookie.set('grappelli_show_documentstructure', 'off', cookie_date, '/');
+ ed.controlManager.setActive('grappelli_documentstructure', false);
+ }
+ },
+
+ // INTERNAL: SHOW/HIDE ADVANCED MENU
+ _show_adv_menu: function(ed) {
+ if (ed.controlManager.get(tb, false)) {
+ ed.controlManager.setActive("grappelli_adv", 1);
+ DOM.show(ed.controlManager.get(tb).id);
+ this._resizeIframe(ed, tb, -28);
+ ed.settings.grappelli_adv_hidden = 0;
+ }
+ },
+ _hide_adv_menu: function(ed) {
+ if (ed.controlManager.get(tb, false)) {
+ ed.controlManager.setActive("grappelli_adv", 0);
+ DOM.hide(ed.controlManager.get(tb).id);
+ this._resizeIframe(ed, tb, 28);
+ ed.settings.grappelli_adv_hidden = 1;
+ }
+ },
+
+ // GET INFO
+ getInfo: function() {
+ return {
+ longname: "Grappelli Plugin",
+ author: "vonautomatisch (patrick kranzlmueller)",
+ authorurl: "http://vonautomatisch.at",
+ infourl: "http://code.google.com/p/django-grappelli/",
+ version: "1.1"
+ }
+ }
+
+ });
+
+ tinymce.PluginManager.add("grappelli", tinymce.plugins.Grappelli)
+
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/show_advanced.png b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/show_advanced.png
new file mode 100644
index 0000000..466d68a
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/show_advanced.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/visualchars.png b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/visualchars.png
new file mode 100644
index 0000000..3a6e6a9
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/img/visualchars.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/cs.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/cs.js
new file mode 100644
index 0000000..95322fe
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/cs.js
@@ -0,0 +1,4 @@
+tinyMCE.addI18n("cs.grappelli",{
+grappelli_adv_desc:"Zobrazit/Skrýt pokroÄilé možnosti",
+grappelli_documentstructure_desc:"Zobrazit/Skrýt strukturu dokumentu",
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/de.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/de.js
new file mode 100644
index 0000000..b72068c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/de.js
@@ -0,0 +1,4 @@
+tinyMCE.addI18n("de.grappelli",{
+grappelli_adv_desc:"Erweitertes Menü anzeigen/verbergen",
+grappelli_documentstructure_desc:"Dokumentenstruktur anzeigen/verbergen",
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/en.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/en.js
new file mode 100644
index 0000000..c264768
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/en.js
@@ -0,0 +1,4 @@
+tinyMCE.addI18n("en.grappelli",{
+grappelli_adv_desc:"Show/Hide Advanced Menu",
+grappelli_documentstructure_desc:"Show/Hide Document Structure",
+});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/fr.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/fr.js
new file mode 100644
index 0000000..bbcccac
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/fr.js
@@ -0,0 +1,4 @@
+tinyMCE.addI18n("fr.grappelli",{
+grappelli_adv_desc:"Basculer le menu avancé",
+grappelli_documentstructure_desc:"Basculé la structure de document",
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/pl.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/pl.js
new file mode 100644
index 0000000..a34b028
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/pl.js
@@ -0,0 +1,4 @@
+tinyMCE.addI18n("pl.grappelli",{
+grappelli_adv_desc:"Pokaż/Ukryj zaawansowane menu",
+grappelli_documentstructure_desc:"Pokaż/Ukryj strukturę dokumentu"
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/ru.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/ru.js
new file mode 100644
index 0000000..6ecdf06
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli/langs/ru.js
@@ -0,0 +1,4 @@
+tinyMCE.addI18n("ru.grappelli",{
+grappelli_adv_desc:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u002f\u0421\u043a\u0440\u044b\u0442\u044c\u0020\u0420\u0430\u0441\u0448\u0438\u0440\u0435\u043d\u043d\u043e\u0435\u0020\u041c\u0435\u043d\u044e",
+grappelli_documentstructure_desc:"\u041f\u043e\u043a\u0430\u0437\u0430\u0442\u044c\u002f\u0421\u043a\u0440\u044b\u0442\u044c\u0020\u0421\u0442\u0440\u0443\u043a\u0442\u0443\u0440\u0443\u0020\u0414\u043e\u043a\u0443\u043c\u0435\u043d\u0442\u0430",
+});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin.js
new file mode 100644
index 0000000..17077ad
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.PluginManager.requireLangPack("grappelli_contextmenu");var a=tinymce.dom.Event,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.ContextMenu",{init:function(d){var f=this;f.editor=d;f.onContextMenu=new tinymce.util.Dispatcher(this);d.onContextMenu.add(function(g,h){if(!h.ctrlKey){f._getMenu(g).showMenu(h.clientX,h.clientY);a.add(g.getDoc(),"click",e);a.cancel(h)}});function e(){if(f._menu){f._menu.removeAll();f._menu.destroy();a.remove(d.getDoc(),"click",e)}}d.onMouseDown.add(e);d.onKeyDown.add(e);d.addCommand("mcePBefore",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;if(nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE"){return g}},d.dom.getRoot());if(pe){new_p=d.dom.create("p",{},"
");pe.parentNode.insertBefore(new_p,pe)}});d.addCommand("mcePAfter",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;if(nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE"){return g}},d.dom.getRoot());if(pe){new_p=d.dom.create("p",{},"
");d.dom.insertAfter(new_p,pe)}});d.addCommand("mcePBeforeRoot",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;nn_p=g.parentNode.nodeName;if((nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE")&&nn_p=="BODY"){return g}},d.dom.getRoot());if(pe){new_p=d.dom.create("p",{},"
");pe.parentNode.insertBefore(new_p,pe)}});d.addCommand("mcePAfterRoot",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;nn_p=g.parentNode.nodeName;if((nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE")&&nn_p=="BODY"){return g}},d.dom.getRoot());if(pe){new_p=d.dom.create("p",{},"
");d.dom.insertAfter(new_p,pe)}});d.addCommand("mceDelete",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;if(nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE"){return g}},d.dom.getRoot());if(pe){d.dom.remove(pe)}});d.addCommand("mceDeleteRoot",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;nn_p=g.parentNode.nodeName;if((nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE")&&nn_p=="BODY"){return g}},d.dom.getRoot());if(pe){d.dom.remove(pe)}});d.addCommand("mceMoveUp",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;if(nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE"){return g}},d.dom.getRoot());if(pe){pre_prev=f._getPreviousSibling(pe);if(pre_prev){pre_prev.parentNode.insertBefore(pe,pre_prev)}}});d.addCommand("mceMoveUpRoot",function(){ce=d.selection.getNode();pe=d.dom.getParent(ce,function(g){nn=g.nodeName;nn_p=g.parentNode.nodeName;if((nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE")&&nn_p=="BODY"){return g}},d.dom.getRoot());if(pe){pre_prev=f._getPreviousSibling(pe);if(pre_prev){pre_prev.parentNode.insertBefore(pe,pre_prev)}}})},getInfo:function(){return{longname:"Grappelli (Contextmenu)",author:"Patrick Kranzlmueller",authorurl:"http://vonautomatisch.at",infourl:"http://code.google.com/p/django-grappelli/",version:"0.1"}},_getMenu:function(h){var l=this,f=l._menu,i=h.selection,e=i.isCollapsed(),d=i.getNode()||h.getBody(),g,k,j;if(f){f.removeAll();f.destroy()}k=b.getPos(h.getContentAreaContainer());j=b.getPos(h.getContainer());f=h.controlManager.createDropMenu("contextmenu",{offset_x:k.x+h.getParam("contextmenu_offset_x",0),offset_y:k.y+h.getParam("contextmenu_offset_y",0),constrain:1});l._menu=f;pe=h.dom.getParent(d,function(m){nn=m.nodeName;if(nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE"){return m}},h.dom.getRoot());re=h.dom.getParent(d,function(m){nn=m.nodeName;nn_p=m.parentNode.nodeName;if(nn=="P"||nn=="H1"||nn=="H2"||nn=="H3"||nn=="H4"||nn=="H5"||nn=="H6"||nn=="UL"||nn=="OL"||nn=="BLOCKQUOTE"&&nn_p=="BODY"){return m}},h.dom.getRoot());title_prefix=pe.nodeName;title_prefix_root=re.nodeName;title_b_before="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_insertpbefore_desc";title_b_after="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_insertpafter_desc";title_b_before_root="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_insertpbeforeroot_desc";title_b_after_root="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_insertpafterroot_desc";title_b_delete="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_delete_desc";title_b_delete_root="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_deleteroot_desc";title_b_moveup="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_moveup_desc";title_b_moveup_root="grappelli_contextmenu."+title_prefix+"_grappelli_contextmenu_moveuproot_desc";f.add({title:title_b_before,icon:"",cmd:"mcePBefore"});f.add({title:title_b_after,icon:"",cmd:"mcePAfter"});if(pe.parentNode.nodeName!="BODY"){f.addSeparator();f.add({title:title_b_before_root,icon:"",cmd:"mcePBeforeRoot"});f.add({title:title_b_after_root,icon:"",cmd:"mcePAfterRoot"})}f.addSeparator();f.add({title:title_b_delete,icon:"",cmd:"mceDelete"});if(pe.parentNode.nodeName!="BODY"){f.add({title:title_b_delete_root,icon:"",cmd:"mceDeleteRoot"})}f.addSeparator();f.add({title:title_b_moveup,icon:"",cmd:"mceMoveUp"});if(pe.parentNode.nodeName!="BODY"){f.add({title:title_b_moveup_root,icon:"",cmd:"mceMoveUpRoot"})}l.onContextMenu.dispatch(l,f,d,e);return f},_getPreviousSibling:function(e){var d=e.previousSibling;while(d&&(d.nodeType==document.TEXT_NODE||d.nodeType==document.CDATA_NODE)&&d.nodeValue.match(/^\s*$/)){d=d.previousSibling}return d}});tinymce.PluginManager.add("grappelli_contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin_src.js
new file mode 100644
index 0000000..87b81d6
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/editor_plugin_src.js
@@ -0,0 +1,250 @@
+(function() {
+
+ tinymce.PluginManager.requireLangPack('grappelli_contextmenu');
+ var Event = tinymce.dom.Event, each = tinymce.each, DOM = tinymce.DOM;
+
+ tinymce.create('tinymce.plugins.ContextMenu', {
+ init : function(ed) {
+ var t = this;
+
+ t.editor = ed;
+ t.onContextMenu = new tinymce.util.Dispatcher(this);
+
+ ed.onContextMenu.add(function(ed, e) {
+ if (!e.ctrlKey) {
+ t._getMenu(ed).showMenu(e.clientX, e.clientY);
+ Event.add(ed.getDoc(), 'click', hide);
+ Event.cancel(e);
+ }
+ });
+
+ function hide() {
+ if (t._menu) {
+ t._menu.removeAll();
+ t._menu.destroy();
+ Event.remove(ed.getDoc(), 'click', hide);
+ }
+ };
+
+ ed.onMouseDown.add(hide);
+ ed.onKeyDown.add(hide);
+
+ // Register commands
+ // INSERT ELEMENTS
+ ed.addCommand('mcePBefore', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ if (nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ new_p = ed.dom.create('p', {}, '
');
+ pe.parentNode.insertBefore(new_p, pe);
+ }
+ });
+ ed.addCommand('mcePAfter', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ if (nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ new_p = ed.dom.create('p', {}, '
');
+ ed.dom.insertAfter(new_p, pe);
+ }
+ });
+
+ // INSERT ROOT ELEMENTS
+ ed.addCommand('mcePBeforeRoot', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ nn_p = n.parentNode.nodeName;
+ if ((nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') && nn_p == 'BODY') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ new_p = ed.dom.create('p', {}, '
');
+ pe.parentNode.insertBefore(new_p, pe);
+ }
+ });
+ ed.addCommand('mcePAfterRoot', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ nn_p = n.parentNode.nodeName;
+ if ((nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') && nn_p == 'BODY') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ new_p = ed.dom.create('p', {}, '
');
+ ed.dom.insertAfter(new_p, pe);
+ }
+ });
+
+ // DELETE
+ ed.addCommand('mceDelete', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ if (nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ ed.dom.remove(pe);
+ }
+ });
+
+ ed.addCommand('mceDeleteRoot', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ nn_p = n.parentNode.nodeName;
+ if ((nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') && nn_p == 'BODY') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ ed.dom.remove(pe);
+ }
+ });
+
+ // MOVE
+ ed.addCommand('mceMoveUp', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ if (nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ pre_prev = t._getPreviousSibling(pe);
+ if (pre_prev) {
+ pre_prev.parentNode.insertBefore(pe, pre_prev);
+ }
+ }
+ });
+ ed.addCommand('mceMoveUpRoot', function() {
+ ce = ed.selection.getNode();
+ pe = ed.dom.getParent(ce, function(n) {
+ nn = n.nodeName;
+ nn_p = n.parentNode.nodeName;
+ if ((nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') && nn_p == 'BODY') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ if (pe) {
+ pre_prev = t._getPreviousSibling(pe);
+ if (pre_prev) {
+ pre_prev.parentNode.insertBefore(pe, pre_prev);
+ }
+ }
+ });
+
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Grappelli (Contextmenu)',
+ author : 'Patrick Kranzlmueller',
+ authorurl : 'http://vonautomatisch.at',
+ infourl : 'http://code.google.com/p/django-grappelli/',
+ version : '0.1'
+ };
+ },
+
+ _getMenu : function(ed) {
+ var t = this, m = t._menu, se = ed.selection, col = se.isCollapsed(), el = se.getNode() || ed.getBody(), am, p1, p2;
+
+ if (m) {
+ m.removeAll();
+ m.destroy();
+ }
+
+ p1 = DOM.getPos(ed.getContentAreaContainer());
+ p2 = DOM.getPos(ed.getContainer());
+
+ m = ed.controlManager.createDropMenu('contextmenu', {
+ offset_x : p1.x + ed.getParam('contextmenu_offset_x', 0),
+ offset_y : p1.y + ed.getParam('contextmenu_offset_y', 0),
+ constrain : 1
+ });
+
+ t._menu = m;
+
+ // parent element
+ pe = ed.dom.getParent(el, function(n) {
+ nn = n.nodeName;
+ if (nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+ // root element
+ re = ed.dom.getParent(el, function(n) {
+ nn = n.nodeName;
+ nn_p = n.parentNode.nodeName;
+ if (nn == 'P' || nn == 'H1' || nn == 'H2' || nn == 'H3' || nn == 'H4' || nn == 'H5' || nn == 'H6' || nn == 'UL' || nn == 'OL' || nn == 'BLOCKQUOTE' && nn_p == 'BODY') {
+ return n;
+ }
+ }, ed.dom.getRoot());
+
+ title_prefix = pe.nodeName;
+ title_prefix_root = re.nodeName;
+
+ title_b_before = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_insertpbefore_desc';
+ title_b_after = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_insertpafter_desc';
+ title_b_before_root = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_insertpbeforeroot_desc';
+ title_b_after_root = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_insertpafterroot_desc';
+ title_b_delete = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_delete_desc';
+ title_b_delete_root = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_deleteroot_desc';
+ title_b_moveup = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_moveup_desc';
+ title_b_moveup_root = 'grappelli_contextmenu.' + title_prefix + '_grappelli_contextmenu_moveuproot_desc';
+
+ m.add({title : title_b_before, icon : '', cmd : 'mcePBefore'});
+ m.add({title : title_b_after, icon : '', cmd : 'mcePAfter'});
+
+ if (pe.parentNode.nodeName != "BODY") {
+ m.addSeparator();
+ m.add({title : title_b_before_root, icon : '', cmd : 'mcePBeforeRoot'});
+ m.add({title : title_b_after_root, icon : '', cmd : 'mcePAfterRoot'});
+ }
+
+ m.addSeparator();
+ m.add({title : title_b_delete, icon : '', cmd : 'mceDelete'});
+ if (pe.parentNode.nodeName != "BODY") {
+ m.add({title : title_b_delete_root, icon : '', cmd : 'mceDeleteRoot'});
+ }
+
+ m.addSeparator();
+ m.add({title : title_b_moveup, icon : '', cmd : 'mceMoveUp'});
+ if (pe.parentNode.nodeName != "BODY") {
+ m.add({title : title_b_moveup_root, icon : '', cmd : 'mceMoveUpRoot'});
+ }
+
+ t.onContextMenu.dispatch(t, m, el, col);
+
+ return m;
+
+ },
+
+ _getPreviousSibling: function(obj) {
+ var prevNode = obj.previousSibling;
+ while(prevNode && (prevNode.nodeType == document.TEXT_NODE || prevNode.nodeType == document.CDATA_NODE) && prevNode.nodeValue.match(/^\s*$/)) {
+ prevNode = prevNode.previousSibling;
+ }
+ return prevNode;
+ }
+
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('grappelli_contextmenu', tinymce.plugins.ContextMenu);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/cs.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/cs.js
new file mode 100644
index 0000000..8845bdd
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/cs.js
@@ -0,0 +1,19 @@
+tinyMCE.addI18n("cs.grappelli_contextmenu",{
+grappelli_contextmenu_insertpbefore_desc:"Vlož odstavec PŘED aktuálnà element",
+grappelli_contextmenu_insertpafter_desc:"Vlož odstavec ZA aktuálnà element",
+grappelli_contextmenu_insertpbeforeroot_desc:"Vlož odstavec PŘED aktuálnà KOŘENOVà element",
+grappelli_contextmenu_insertpafterroot_desc:"Vlož odstavec ZA aktuálnà KOŘENOVà element",
+grappelli_contextmenu_delete_desc:"Smazat aktuálnà element",
+grappelli_contextmenu_deleteroot_desc:"Smazat aktuálnà KOŘENOVà element",
+grappelli_contextmenu_moveup_desc:"Posunout element NAHORU",
+grappelli_contextmenu_moveuproot_desc:"Posunout aktuálnà kořenový element NAHORU",
+
+P_grappelli_contextmenu_insertpbefore_desc:"Vlož odstavec PŘED aktuálnà element",
+P_grappelli_contextmenu_insertpafter_desc:"Vlož odstavec ZA aktuálnà element",
+P_grappelli_contextmenu_insertpbeforeroot_desc:"Vlož odstavec PŘED aktuálnà KOŘENOVà element",
+P_grappelli_contextmenu_insertpafterroot_desc:"Vlož odstavec ZA aktuálnà KOŘENOVà element",
+P_grappelli_contextmenu_delete_desc:"Smazat aktuálnà element",
+P_grappelli_contextmenu_deleteroot_desc:"Smazat aktuálnà KOŘENOVà element",
+P_grappelli_contextmenu_moveup_desc:"Posunout element NAHORU",
+P_grappelli_contextmenu_moveuproot_desc:"Posunout aktuálnà kořenový element NAHORU",
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/de.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/de.js
new file mode 100644
index 0000000..b4b6080
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/de.js
@@ -0,0 +1,20 @@
+tinyMCE.addI18n("de.grappelli_contextmenu",{
+grappelli_contextmenu_insertpbefore_desc:"Absatz VOR aktuellem ELEMENT einfügen",
+grappelli_contextmenu_insertpafter_desc:"Absatz NACH aktuellen ELEMENT einfügen",
+grappelli_contextmenu_insertpbeforeroot_desc:"Absatz VOR aktuellem HAUPTELEMENT einfügen",
+grappelli_contextmenu_insertpafterroot_desc:"Absatz NACH aktuellen HAUPTELEMENT einfügen",
+grappelli_contextmenu_delete_desc:"Aktuelles ELEMENT löschen",
+grappelli_contextmenu_deleteroot_desc:"Aktuelles HAUPTELEMENT löschen",
+grappelli_contextmenu_moveup_desc:"Aktuelles ELEMENT NACH OBEN verschieben",
+grappelli_contextmenu_moveuproot_desc:"Aktuelles HAUPTELEMENT NACH OBEN verschieben",
+
+P_grappelli_contextmenu_insertpbefore_desc:"Absatz VOR Absatz einfügen",
+P_grappelli_contextmenu_insertpafter_desc:"Absatz NACH Absatz einfügen",
+P_grappelli_contextmenu_insertpbeforeroot_desc:"Absatz VOR Template einfügen",
+P_grappelli_contextmenu_insertpafterroot_desc:"Absatz NACH Template einfügen",
+P_grappelli_contextmenu_delete_desc:"Absatz löschen",
+P_grappelli_contextmenu_deleteroot_desc:"Template löschen",
+P_grappelli_contextmenu_moveup_desc:"Absatz NACH OBEN verschieben",
+P_grappelli_contextmenu_moveuproot_desc:"Template NACH OBEN verschieben",
+
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/en.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/en.js
new file mode 100644
index 0000000..29de91b
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/en.js
@@ -0,0 +1,20 @@
+tinyMCE.addI18n("en.grappelli_contextmenu",{
+grappelli_contextmenu_insertpbefore_desc:"Insert Paragraph BEFORE current element",
+grappelli_contextmenu_insertpafter_desc:"Insert Paragraph AFTER current element",
+grappelli_contextmenu_insertpbeforeroot_desc:"Insert Paragraph BEFORE current ROOT-LEVEL element",
+grappelli_contextmenu_insertpafterroot_desc:"Insert Paragraph AFTER current ROOT-LEVEL element",
+grappelli_contextmenu_delete_desc:"Delete current element",
+grappelli_contextmenu_deleteroot_desc:"Delete current ROOT-LEVEL element",
+grappelli_contextmenu_moveup_desc:"MOVE UP current ELEMENT",
+grappelli_contextmenu_moveuproot_desc:"MOVE UP current ROOT-LEVEL element",
+
+P_grappelli_contextmenu_insertpbefore_desc:"Insert Paragraph BEFORE current element",
+P_grappelli_contextmenu_insertpafter_desc:"Insert Paragraph AFTER current element",
+P_grappelli_contextmenu_insertpbeforeroot_desc:"Insert Paragraph BEFORE current ROOT-LEVEL element",
+P_grappelli_contextmenu_insertpafterroot_desc:"Insert Paragraph AFTER current ROOT-LEVEL element",
+P_grappelli_contextmenu_delete_desc:"Delete current element",
+P_grappelli_contextmenu_deleteroot_desc:"Delete current ROOT-LEVEL element",
+P_grappelli_contextmenu_moveup_desc:"MOVE UP current ELEMENT",
+P_grappelli_contextmenu_moveuproot_desc:"MOVE UP current ROOT-LEVEL element",
+
+});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/fr.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/fr.js
new file mode 100644
index 0000000..168e4b8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/fr.js
@@ -0,0 +1,10 @@
+tinyMCE.addI18n("fr.grappelli_contextmenu",{
+grappelli_contextmenu_insertpbefore_desc:"Insérer Paragraph AVANT la sélection",
+grappelli_contextmenu_insertpafter_desc:"Insérer Paragraph APRÈS la sélection",
+grappelli_contextmenu_insertpbeforeroot_desc:"Insérer Paragraph AVANT la racine de la sélection",
+grappelli_contextmenu_insertpafterroot_desc:"Insérer Paragraph APRÈS la racine de la sélection",
+grappelli_contextmenu_delete_desc:"Supprimer la sélection",
+grappelli_contextmenu_deleteroot_desc:"Supprimer la racine de la sélection",
+grappelli_contextmenu_moveup_desc:"Monter la sélection",
+grappelli_contextmenu_moveuproot_desc:"Monter la racine de la sélection",
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/pl.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/pl.js
new file mode 100644
index 0000000..0d90c7c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/pl.js
@@ -0,0 +1,19 @@
+tinyMCE.addI18n("pl.grappelli_contextmenu",{
+grappelli_contextmenu_insertpbefore_desc:"Wstaw paragraf PRZED aktualnym elementem",
+grappelli_contextmenu_insertpafter_desc:"Wstaw paragraf PO aktualnym elemencie",
+grappelli_contextmenu_insertpbeforeroot_desc:"Wstaw paragraf PRZED aktualnym BAZOWYM elementem",
+grappelli_contextmenu_insertpafterroot_desc:"Wstaw paragraf PO aktualnym BAZOWYM elemencie",
+grappelli_contextmenu_delete_desc:"Usuń aktualny element",
+grappelli_contextmenu_deleteroot_desc:"Usuń aktualny BAZOWY element",
+grappelli_contextmenu_moveup_desc:"PRZENIEŚ aktualny ELEMENT WYŻEJ",
+grappelli_contextmenu_moveuproot_desc:"PRZENIEŚ aktualny BAZOWY element WYŻEJ",
+
+P_grappelli_contextmenu_insertpbefore_desc:"Wstaw paragraf PRZED aktualnym elementem",
+P_grappelli_contextmenu_insertpafter_desc:"Wstaw paragraf PO aktualnym elemencie",
+P_grappelli_contextmenu_insertpbeforeroot_desc:"Wstaw paragraf PRZED aktualnym BAZOWYM elementem",
+P_grappelli_contextmenu_insertpafterroot_desc:"Wstaw paragraf PO aktualnym BAZOWYM elemencie",
+P_grappelli_contextmenu_delete_desc:"Usuń aktualny element",
+P_grappelli_contextmenu_deleteroot_desc:"Usuń aktualny BAZOWY element",
+P_grappelli_contextmenu_moveup_desc:"PRZENIEŚ aktualny ELEMENT WYŻEJ",
+P_grappelli_contextmenu_moveuproot_desc:"PRZENIEŚ aktualny BAZOWY element WYŻEJ"
+});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/ru.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/ru.js
new file mode 100644
index 0000000..c069407
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/grappelli_contextmenu/langs/ru.js
@@ -0,0 +1,20 @@
+tinyMCE.addI18n("ru.grappelli_contextmenu",{
+grappelli_contextmenu_insertpbefore_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u0415\u0420\u0415\u0414\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c",
+grappelli_contextmenu_insertpafter_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u041e\u0421\u041b\u0415\u0020\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
+grappelli_contextmenu_insertpbeforeroot_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u0415\u0420\u0415\u0414\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u042b\u041c\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c",
+grappelli_contextmenu_insertpafterroot_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u041e\u0421\u041b\u0415\u0020\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u041e\u0413\u041e\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
+grappelli_contextmenu_delete_desc:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442",
+grappelli_contextmenu_deleteroot_desc:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u041e\u0419\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442",
+grappelli_contextmenu_moveup_desc:"\u0421\u0414\u0412\u0418\u041d\u0423\u0422\u042c\u0020\u0412\u0412\u0415\u0420\u0425\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u042d\u041b\u0415\u041c\u0415\u041d\u0422",
+grappelli_contextmenu_moveuproot_desc:"\u0421\u0414\u0412\u0418\u041d\u0423\u0422\u042c\u0020\u0412\u0412\u0415\u0420\u0425\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u041e\u0419\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442",
+
+P_grappelli_contextmenu_insertpbefore_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u0415\u0420\u0415\u0414\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c",
+P_grappelli_contextmenu_insertpafter_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u041e\u0421\u041b\u0415\u0020\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
+P_grappelli_contextmenu_insertpbeforeroot_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u0415\u0420\u0415\u0414\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u043c\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u042b\u041c\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u043e\u043c",
+P_grappelli_contextmenu_insertpafterroot_desc:"\u0412\u0441\u0442\u0430\u0432\u0438\u0442\u044c\u0020\u041f\u0430\u0440\u0430\u0433\u0440\u0430\u0444\u0020\u041f\u041e\u0421\u041b\u0415\u0020\u0442\u0435\u043a\u0443\u0449\u0435\u0433\u043e\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u041e\u0413\u041e\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442\u0430",
+P_grappelli_contextmenu_delete_desc:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442",
+P_grappelli_contextmenu_deleteroot_desc:"\u0423\u0434\u0430\u043b\u0438\u0442\u044c\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u041e\u0419\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442",
+P_grappelli_contextmenu_moveup_desc:"\u0421\u0414\u0412\u0418\u041d\u0423\u0422\u042c\u0020\u0412\u0412\u0415\u0420\u0425\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u042d\u041b\u0415\u041c\u0415\u041d\u0422",
+P_grappelli_contextmenu_moveuproot_desc:"\u0421\u0414\u0412\u0418\u041d\u0423\u0422\u042c\u0020\u0412\u0412\u0415\u0420\u0425\u0020\u0442\u0435\u043a\u0443\u0449\u0438\u0439\u0020\u041a\u041e\u0420\u041d\u0415\u0412\u041e\u0419\u0020\u044d\u043b\u0435\u043c\u0435\u043d\u0442",
+
+});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin.js
new file mode 100644
index 0000000..e9cba10
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.IESpell",{init:function(a,b){var c=this,d;if(!tinymce.isIE){return}c.editor=a;a.addCommand("mceIESpell",function(){try{d=new ActiveXObject("ieSpell.ieSpellExtension");d.CheckDocumentNode(a.getDoc().documentElement)}catch(f){if(f.number==-2146827859){a.windowManager.confirm(a.getLang("iespell.download"),function(e){if(e){window.open("http://www.iespell.com/download.php","ieSpellDownload","")}})}else{a.windowManager.alert("Error Loading ieSpell: Exception "+f.number)}}});a.addButton("iespell",{title:"iespell.iespell_desc",cmd:"mceIESpell"})},getInfo:function(){return{longname:"IESpell (IE Only)",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("iespell",tinymce.plugins.IESpell)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js
new file mode 100644
index 0000000..1b2bb98
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/iespell/editor_plugin_src.js
@@ -0,0 +1,54 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.IESpell', {
+ init : function(ed, url) {
+ var t = this, sp;
+
+ if (!tinymce.isIE)
+ return;
+
+ t.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceIESpell', function() {
+ try {
+ sp = new ActiveXObject("ieSpell.ieSpellExtension");
+ sp.CheckDocumentNode(ed.getDoc().documentElement);
+ } catch (e) {
+ if (e.number == -2146827859) {
+ ed.windowManager.confirm(ed.getLang("iespell.download"), function(s) {
+ if (s)
+ window.open('http://www.iespell.com/download.php', 'ieSpellDownload', '');
+ });
+ } else
+ ed.windowManager.alert("Error Loading ieSpell: Exception " + e.number);
+ }
+ });
+
+ // Register buttons
+ ed.addButton('iespell', {title : 'iespell.iespell_desc', cmd : 'mceIESpell'});
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'IESpell (IE Only)',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/iespell',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('iespell', tinymce.plugins.IESpell);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js
new file mode 100644
index 0000000..8bb96f9
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var d=tinymce.DOM,b=tinymce.dom.Element,a=tinymce.dom.Event,e=tinymce.each,c=tinymce.is;tinymce.create("tinymce.plugins.InlinePopups",{init:function(f,g){f.onBeforeRenderUI.add(function(){f.windowManager=new tinymce.InlineWindowManager(f);d.loadCSS(g+"/skins/"+(f.settings.inlinepopups_skin||"clearlooks2")+"/window.css")})},getInfo:function(){return{longname:"InlinePopups",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.create("tinymce.InlineWindowManager:tinymce.WindowManager",{InlineWindowManager:function(f){var g=this;g.parent(f);g.zIndex=300000;g.count=0;g.windows={}},open:function(s,j){var z=this,i,k="",r=z.editor,g=0,v=0,h,m,o,q,l,x,y,n;s=s||{};j=j||{};if(!s.inline){return z.parent(s,j)}n=z._frontWindow();if(n&&d.get(n.id+"_ifr")){n.focussedElement=d.get(n.id+"_ifr").contentWindow.document.activeElement}if(!s.type){z.bookmark=r.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();s.width=parseInt(s.width||320);s.height=parseInt(s.height||240)+(tinymce.isIE?8:0);s.min_width=parseInt(s.min_width||150);s.min_height=parseInt(s.min_height||100);s.max_width=parseInt(s.max_width||2000);s.max_height=parseInt(s.max_height||2000);s.left=s.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(s.width/2)));s.top=s.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(s.height/2)));s.movable=s.resizable=true;j.mce_width=s.width;j.mce_height=s.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=s.auto_focus;z.features=s;z.params=j;z.onOpen.dispatch(z,s,j);if(s.type){k+=" mceModal";if(s.type){k+=" mce"+s.type.substring(0,1).toUpperCase()+s.type.substring(1)}s.resizable=false}if(s.statusbar){k+=" mceStatusbar"}if(s.resizable){k+=" mceResizable"}if(s.minimizable){k+=" mceMinimizable"}if(s.maximizable){k+=" mceMaximizable"}if(s.movable){k+=" mceMovable"}z._addAll(d.doc.body,["div",{id:i,role:"dialog","aria-labelledby":s.type?i+"_content":i+"_title","class":(r.settings.inlinepopups_skin||"clearlooks2")+(tinymce.isIE&&window.getSelection?" ie9":""),style:"width:100px;height:100px"},["div",{id:i+"_wrapper","class":"mceWrapper"+k},["div",{id:i+"_top","class":"mceTop"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_title"},s.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft",tabindex:"0"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight",tabindex:"0"}]],["div",{id:i+"_bottom","class":"mceBottom"},["div",{"class":"mceLeft"}],["div",{"class":"mceCenter"}],["div",{"class":"mceRight"}],["span",{id:i+"_status"},"Content"]],["a",{"class":"mceMove",tabindex:"-1",href:"javascript:;"}],["a",{"class":"mceMin",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMax",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceMed",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{"class":"mceClose",tabindex:"-1",href:"javascript:;",onmousedown:"return false;"}],["a",{id:i+"_resize_n","class":"mceResize mceResizeN",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_s","class":"mceResize mceResizeS",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_w","class":"mceResize mceResizeW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_e","class":"mceResize mceResizeE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_nw","class":"mceResize mceResizeNW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_ne","class":"mceResize mceResizeNE",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_sw","class":"mceResize mceResizeSW",tabindex:"-1",href:"javascript:;"}],["a",{id:i+"_resize_se","class":"mceResize mceResizeSE",tabindex:"-1",href:"javascript:;"}]]]);d.setStyles(i,{top:-10000,left:-10000});if(tinymce.isGecko){d.setStyle(i,"overflow","auto")}if(!s.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;v+=d.get(i+"_top").clientHeight;v+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:s.top,left:s.left,width:s.width+g,height:s.height+v});y=s.url||s.file;if(y){if(tinymce.relaxedDomain){y+=(y.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}y=tinymce._addVer(y)}if(!s.type){d.add(i+"_content","iframe",{id:i+"_ifr",src:'javascript:""',frameBorder:0,style:"border:0;width:10px;height:10px"});d.setStyles(i+"_ifr",{width:s.width,height:s.height});d.setAttrib(i+"_ifr","src",y)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(s.type=="confirm"){d.add(i+"_wrapper","a",{"class":"mceButton mceCancel",href:"javascript:;",onmousedown:"return false;"},"Cancel")}d.add(i+"_middle","div",{"class":"mceIcon"});d.setHTML(i+"_content",s.content.replace("\n","
"));a.add(i,"keyup",function(f){var p=27;if(f.keyCode===p){s.button_func(false);return a.cancel(f)}});a.add(i,"keydown",function(f){var t,p=9;if(f.keyCode===p){t=d.select("a.mceCancel",i+"_wrapper")[0];if(t&&t!==f.target){t.focus()}else{d.get(i+"_ok").focus()}return a.cancel(f)}})}o=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=z.windows[i];z.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){if(u.className=="mceClose"){z.close(null,i);return a.cancel(t)}else{if(u.className=="mceMax"){f.oldPos=f.element.getXY();f.oldSize=f.element.getSize();p=d.getViewPort();p.w-=2;p.h-=2;f.element.moveTo(p.x,p.y);f.element.resizeTo(p.w,p.h);d.setStyles(i+"_ifr",{width:p.w-f.deltaWidth,height:p.h-f.deltaHeight});d.addClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMed"){f.element.moveTo(f.oldPos.x,f.oldPos.y);f.element.resizeTo(f.oldSize.w,f.oldSize.h);f.iframeElement.resizeTo(f.oldSize.w-f.deltaWidth,f.oldSize.h-f.deltaHeight);d.removeClass(i+"_wrapper","mceMaximized")}else{if(u.className=="mceMove"){return z._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return z._startDrag(i,t,u.className.substring(13))}}}}}}});q=a.add(i,"click",function(f){var p=f.target;z.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":z.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":s.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});a.add([i+"_left",i+"_right"],"focus",function(p){var t=d.get(i+"_ifr");if(t){var f=t.contentWindow.document.body;var u=d.select(":input:enabled,*[tabindex=0]",f);if(p.target.id===(i+"_left")){u[u.length-1].focus()}else{u[0].focus()}}else{d.get(i+"_ok").focus()}});x=z.windows[i]={id:i,mousedown_func:o,click_func:q,element:new b(i,{blocker:1,container:r.getContainer()}),iframeElement:new b(i+"_ifr"),features:s,deltaWidth:g,deltaHeight:v};x.iframeElement.on("focus",function(){z.focus(i)});if(z.count==0&&z.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(z.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:z.zIndex-1}});d.show("mceModalBlocker");d.setAttrib(d.doc.body,"aria-hidden","true")}else{d.setStyle("mceModalBlocker","z-index",z.zIndex-1)}if(tinymce.isIE6||/Firefox\/2\./.test(navigator.userAgent)||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceModalBlocker",{position:"absolute",left:h.x,top:h.y,width:h.w-2,height:h.h-2})}d.setAttrib(i,"aria-hidden","false");z.focus(i);z._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}z.count++;return x},focus:function(h){var g=this,f;if(f=g.windows[h]){f.zIndex=this.zIndex++;f.element.setStyle("zIndex",f.zIndex);f.element.update();h=h+"_wrapper";d.removeClass(g.lastId,"mceFocus");d.addClass(h,"mceFocus");g.lastId=h;if(f.focussedElement){f.focussedElement.focus()}else{if(d.get(h+"_ok")){d.get(f.id+"_ok").focus()}else{if(d.get(f.id+"_ifr")){d.get(f.id+"_ifr").focus()}}}}},_addAll:function(k,h){var g,l,f=this,j=tinymce.DOM;if(c(h,"string")){k.appendChild(j.doc.createTextNode(h))}else{if(h.length){k=k.appendChild(j.create(h[0],h[1]));for(g=2;gf){g=h;f=h.zIndex}});return g},setTitle:function(f,g){var h;f=this._findId(f);if(h=d.get(f+"_title")){h.innerHTML=d.encode(g)}},alert:function(g,f,j){var i=this,h;h=i.open({title:i,type:"alert",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},confirm:function(g,f,j){var i=this,h;h=i.open({title:i,type:"confirm",button_func:function(k){if(f){f.call(k||i,k)}i.close(null,h.id)},content:d.encode(i.editor.getLang(g,g)),inline:1,width:400,height:130})},_findId:function(f){var g=this;if(typeof(f)=="string"){return f}e(g.windows,function(h){var i=d.get(h.id+"_ifr");if(i&&f==i.contentWindow){f=h.id;return false}});return f},_fixIELayout:function(i,h){var f,g;if(!tinymce.isIE6){return}e(["n","s","w","e","nw","ne","sw","se"],function(j){var k=d.get(i+"_resize_"+j);d.setStyles(k,{width:h?k.clientWidth:"",height:h?k.clientHeight:"",cursor:d.getStyle(k,"cursor",1)});d.setStyle(i+"_bottom","bottom","-1px");k=0});if(f=this.windows[i]){f.element.hide();f.element.show();e(d.select("div,a",i),function(k,j){if(k.currentStyle.backgroundImage!="none"){g=new Image();g.src=k.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/,"$1")}});d.get(i).style.filter=""}}});tinymce.PluginManager.add("inlinepopups",tinymce.plugins.InlinePopups)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js
new file mode 100644
index 0000000..67123ca
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/editor_plugin_src.js
@@ -0,0 +1,699 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var DOM = tinymce.DOM, Element = tinymce.dom.Element, Event = tinymce.dom.Event, each = tinymce.each, is = tinymce.is;
+
+ tinymce.create('tinymce.plugins.InlinePopups', {
+ init : function(ed, url) {
+ // Replace window manager
+ ed.onBeforeRenderUI.add(function() {
+ ed.windowManager = new tinymce.InlineWindowManager(ed);
+ DOM.loadCSS(url + '/skins/' + (ed.settings.inlinepopups_skin || 'clearlooks2') + "/window.css");
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'InlinePopups',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/inlinepopups',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ tinymce.create('tinymce.InlineWindowManager:tinymce.WindowManager', {
+ InlineWindowManager : function(ed) {
+ var t = this;
+
+ t.parent(ed);
+ t.zIndex = 300000;
+ t.count = 0;
+ t.windows = {};
+ },
+
+ open : function(f, p) {
+ var t = this, id, opt = '', ed = t.editor, dw = 0, dh = 0, vp, po, mdf, clf, we, w, u, parentWindow;
+
+ f = f || {};
+ p = p || {};
+
+ // Run native windows
+ if (!f.inline)
+ return t.parent(f, p);
+
+ parentWindow = t._frontWindow();
+ if (parentWindow && DOM.get(parentWindow.id + '_ifr')) {
+ parentWindow.focussedElement = DOM.get(parentWindow.id + '_ifr').contentWindow.document.activeElement;
+ }
+
+ // Only store selection if the type is a normal window
+ if (!f.type)
+ t.bookmark = ed.selection.getBookmark(1);
+
+ id = DOM.uniqueId();
+ vp = DOM.getViewPort();
+ f.width = parseInt(f.width || 320);
+ f.height = parseInt(f.height || 240) + (tinymce.isIE ? 8 : 0);
+ f.min_width = parseInt(f.min_width || 150);
+ f.min_height = parseInt(f.min_height || 100);
+ f.max_width = parseInt(f.max_width || 2000);
+ f.max_height = parseInt(f.max_height || 2000);
+ f.left = f.left || Math.round(Math.max(vp.x, vp.x + (vp.w / 2.0) - (f.width / 2.0)));
+ f.top = f.top || Math.round(Math.max(vp.y, vp.y + (vp.h / 2.0) - (f.height / 2.0)));
+ f.movable = f.resizable = true;
+ p.mce_width = f.width;
+ p.mce_height = f.height;
+ p.mce_inline = true;
+ p.mce_window_id = id;
+ p.mce_auto_focus = f.auto_focus;
+
+ // Transpose
+// po = DOM.getPos(ed.getContainer());
+// f.left -= po.x;
+// f.top -= po.y;
+
+ t.features = f;
+ t.params = p;
+ t.onOpen.dispatch(t, f, p);
+
+ if (f.type) {
+ opt += ' mceModal';
+
+ if (f.type)
+ opt += ' mce' + f.type.substring(0, 1).toUpperCase() + f.type.substring(1);
+
+ f.resizable = false;
+ }
+
+ if (f.statusbar)
+ opt += ' mceStatusbar';
+
+ if (f.resizable)
+ opt += ' mceResizable';
+
+ if (f.minimizable)
+ opt += ' mceMinimizable';
+
+ if (f.maximizable)
+ opt += ' mceMaximizable';
+
+ if (f.movable)
+ opt += ' mceMovable';
+
+ // Create DOM objects
+ t._addAll(DOM.doc.body,
+ ['div', {id : id, role : 'dialog', 'aria-labelledby': f.type ? id + '_content' : id + '_title', 'class' : (ed.settings.inlinepopups_skin || 'clearlooks2') + (tinymce.isIE && window.getSelection ? ' ie9' : ''), style : 'width:100px;height:100px'},
+ ['div', {id : id + '_wrapper', 'class' : 'mceWrapper' + opt},
+ ['div', {id : id + '_top', 'class' : 'mceTop'},
+ ['div', {'class' : 'mceLeft'}],
+ ['div', {'class' : 'mceCenter'}],
+ ['div', {'class' : 'mceRight'}],
+ ['span', {id : id + '_title'}, f.title || '']
+ ],
+
+ ['div', {id : id + '_middle', 'class' : 'mceMiddle'},
+ ['div', {id : id + '_left', 'class' : 'mceLeft', tabindex : '0'}],
+ ['span', {id : id + '_content'}],
+ ['div', {id : id + '_right', 'class' : 'mceRight', tabindex : '0'}]
+ ],
+
+ ['div', {id : id + '_bottom', 'class' : 'mceBottom'},
+ ['div', {'class' : 'mceLeft'}],
+ ['div', {'class' : 'mceCenter'}],
+ ['div', {'class' : 'mceRight'}],
+ ['span', {id : id + '_status'}, 'Content']
+ ],
+
+ ['a', {'class' : 'mceMove', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {'class' : 'mceMin', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+ ['a', {'class' : 'mceMax', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+ ['a', {'class' : 'mceMed', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+ ['a', {'class' : 'mceClose', tabindex : '-1', href : 'javascript:;', onmousedown : 'return false;'}],
+ ['a', {id : id + '_resize_n', 'class' : 'mceResize mceResizeN', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {id : id + '_resize_s', 'class' : 'mceResize mceResizeS', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {id : id + '_resize_w', 'class' : 'mceResize mceResizeW', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {id : id + '_resize_e', 'class' : 'mceResize mceResizeE', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {id : id + '_resize_nw', 'class' : 'mceResize mceResizeNW', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {id : id + '_resize_ne', 'class' : 'mceResize mceResizeNE', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {id : id + '_resize_sw', 'class' : 'mceResize mceResizeSW', tabindex : '-1', href : 'javascript:;'}],
+ ['a', {id : id + '_resize_se', 'class' : 'mceResize mceResizeSE', tabindex : '-1', href : 'javascript:;'}]
+ ]
+ ]
+ );
+
+ DOM.setStyles(id, {top : -10000, left : -10000});
+
+ // Fix gecko rendering bug, where the editors iframe messed with window contents
+ if (tinymce.isGecko)
+ DOM.setStyle(id, 'overflow', 'auto');
+
+ // Measure borders
+ if (!f.type) {
+ dw += DOM.get(id + '_left').clientWidth;
+ dw += DOM.get(id + '_right').clientWidth;
+ dh += DOM.get(id + '_top').clientHeight;
+ dh += DOM.get(id + '_bottom').clientHeight;
+ }
+
+ // Resize window
+ DOM.setStyles(id, {top : f.top, left : f.left, width : f.width + dw, height : f.height + dh});
+
+ u = f.url || f.file;
+ if (u) {
+ if (tinymce.relaxedDomain)
+ u += (u.indexOf('?') == -1 ? '?' : '&') + 'mce_rdomain=' + tinymce.relaxedDomain;
+
+ u = tinymce._addVer(u);
+ }
+
+ if (!f.type) {
+ DOM.add(id + '_content', 'iframe', {id : id + '_ifr', src : 'javascript:""', frameBorder : 0, style : 'border:0;width:10px;height:10px'});
+ DOM.setStyles(id + '_ifr', {width : f.width, height : f.height});
+ DOM.setAttrib(id + '_ifr', 'src', u);
+ } else {
+ DOM.add(id + '_wrapper', 'a', {id : id + '_ok', 'class' : 'mceButton mceOk', href : 'javascript:;', onmousedown : 'return false;'}, 'Ok');
+
+ if (f.type == 'confirm')
+ DOM.add(id + '_wrapper', 'a', {'class' : 'mceButton mceCancel', href : 'javascript:;', onmousedown : 'return false;'}, 'Cancel');
+
+ DOM.add(id + '_middle', 'div', {'class' : 'mceIcon'});
+ DOM.setHTML(id + '_content', f.content.replace('\n', '
'));
+
+ Event.add(id, 'keyup', function(evt) {
+ var VK_ESCAPE = 27;
+ if (evt.keyCode === VK_ESCAPE) {
+ f.button_func(false);
+ return Event.cancel(evt);
+ }
+ });
+
+ Event.add(id, 'keydown', function(evt) {
+ var cancelButton, VK_TAB = 9;
+ if (evt.keyCode === VK_TAB) {
+ cancelButton = DOM.select('a.mceCancel', id + '_wrapper')[0];
+ if (cancelButton && cancelButton !== evt.target) {
+ cancelButton.focus();
+ } else {
+ DOM.get(id + '_ok').focus();
+ }
+ return Event.cancel(evt);
+ }
+ });
+ }
+
+ // Register events
+ mdf = Event.add(id, 'mousedown', function(e) {
+ var n = e.target, w, vp;
+
+ w = t.windows[id];
+ t.focus(id);
+
+ if (n.nodeName == 'A' || n.nodeName == 'a') {
+ if (n.className == 'mceClose') {
+ t.close(null, id);
+ return Event.cancel(e);
+ } else if (n.className == 'mceMax') {
+ w.oldPos = w.element.getXY();
+ w.oldSize = w.element.getSize();
+
+ vp = DOM.getViewPort();
+
+ // Reduce viewport size to avoid scrollbars
+ vp.w -= 2;
+ vp.h -= 2;
+
+ w.element.moveTo(vp.x, vp.y);
+ w.element.resizeTo(vp.w, vp.h);
+ DOM.setStyles(id + '_ifr', {width : vp.w - w.deltaWidth, height : vp.h - w.deltaHeight});
+ DOM.addClass(id + '_wrapper', 'mceMaximized');
+ } else if (n.className == 'mceMed') {
+ // Reset to old size
+ w.element.moveTo(w.oldPos.x, w.oldPos.y);
+ w.element.resizeTo(w.oldSize.w, w.oldSize.h);
+ w.iframeElement.resizeTo(w.oldSize.w - w.deltaWidth, w.oldSize.h - w.deltaHeight);
+
+ DOM.removeClass(id + '_wrapper', 'mceMaximized');
+ } else if (n.className == 'mceMove')
+ return t._startDrag(id, e, n.className);
+ else if (DOM.hasClass(n, 'mceResize'))
+ return t._startDrag(id, e, n.className.substring(13));
+ }
+ });
+
+ clf = Event.add(id, 'click', function(e) {
+ var n = e.target;
+
+ t.focus(id);
+
+ if (n.nodeName == 'A' || n.nodeName == 'a') {
+ switch (n.className) {
+ case 'mceClose':
+ t.close(null, id);
+ return Event.cancel(e);
+
+ case 'mceButton mceOk':
+ case 'mceButton mceCancel':
+ f.button_func(n.className == 'mceButton mceOk');
+ return Event.cancel(e);
+ }
+ }
+ });
+
+ // Make sure the tab order loops within the dialog.
+ Event.add([id + '_left', id + '_right'], 'focus', function(evt) {
+ var iframe = DOM.get(id + '_ifr');
+ if (iframe) {
+ var body = iframe.contentWindow.document.body;
+ var focusable = DOM.select(':input:enabled,*[tabindex=0]', body);
+ if (evt.target.id === (id + '_left')) {
+ focusable[focusable.length - 1].focus();
+ } else {
+ focusable[0].focus();
+ }
+ } else {
+ DOM.get(id + '_ok').focus();
+ }
+ });
+
+ // Add window
+ w = t.windows[id] = {
+ id : id,
+ mousedown_func : mdf,
+ click_func : clf,
+ element : new Element(id, {blocker : 1, container : ed.getContainer()}),
+ iframeElement : new Element(id + '_ifr'),
+ features : f,
+ deltaWidth : dw,
+ deltaHeight : dh
+ };
+
+ w.iframeElement.on('focus', function() {
+ t.focus(id);
+ });
+
+ // Setup blocker
+ if (t.count == 0 && t.editor.getParam('dialog_type', 'modal') == 'modal') {
+ DOM.add(DOM.doc.body, 'div', {
+ id : 'mceModalBlocker',
+ 'class' : (t.editor.settings.inlinepopups_skin || 'clearlooks2') + '_modalBlocker',
+ style : {zIndex : t.zIndex - 1}
+ });
+
+ DOM.show('mceModalBlocker'); // Reduces flicker in IE
+ DOM.setAttrib(DOM.doc.body, 'aria-hidden', 'true');
+ } else
+ DOM.setStyle('mceModalBlocker', 'z-index', t.zIndex - 1);
+
+ if (tinymce.isIE6 || /Firefox\/2\./.test(navigator.userAgent) || (tinymce.isIE && !DOM.boxModel))
+ DOM.setStyles('mceModalBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2});
+
+ DOM.setAttrib(id, 'aria-hidden', 'false');
+ t.focus(id);
+ t._fixIELayout(id, 1);
+
+ // Focus ok button
+ if (DOM.get(id + '_ok'))
+ DOM.get(id + '_ok').focus();
+ t.count++;
+
+ return w;
+ },
+
+ focus : function(id) {
+ var t = this, w;
+
+ if (w = t.windows[id]) {
+ w.zIndex = this.zIndex++;
+ w.element.setStyle('zIndex', w.zIndex);
+ w.element.update();
+
+ id = id + '_wrapper';
+ DOM.removeClass(t.lastId, 'mceFocus');
+ DOM.addClass(id, 'mceFocus');
+ t.lastId = id;
+
+ if (w.focussedElement) {
+ w.focussedElement.focus();
+ } else if (DOM.get(id + '_ok')) {
+ DOM.get(w.id + '_ok').focus();
+ } else if (DOM.get(w.id + '_ifr')) {
+ DOM.get(w.id + '_ifr').focus();
+ }
+ }
+ },
+
+ _addAll : function(te, ne) {
+ var i, n, t = this, dom = tinymce.DOM;
+
+ if (is(ne, 'string'))
+ te.appendChild(dom.doc.createTextNode(ne));
+ else if (ne.length) {
+ te = te.appendChild(dom.create(ne[0], ne[1]));
+
+ for (i=2; i ix) {
+ fw = w;
+ ix = w.zIndex;
+ }
+ });
+ return fw;
+ },
+
+ setTitle : function(w, ti) {
+ var e;
+
+ w = this._findId(w);
+
+ if (e = DOM.get(w + '_title'))
+ e.innerHTML = DOM.encode(ti);
+ },
+
+ alert : function(txt, cb, s) {
+ var t = this, w;
+
+ w = t.open({
+ title : t,
+ type : 'alert',
+ button_func : function(s) {
+ if (cb)
+ cb.call(s || t, s);
+
+ t.close(null, w.id);
+ },
+ content : DOM.encode(t.editor.getLang(txt, txt)),
+ inline : 1,
+ width : 400,
+ height : 130
+ });
+ },
+
+ confirm : function(txt, cb, s) {
+ var t = this, w;
+
+ w = t.open({
+ title : t,
+ type : 'confirm',
+ button_func : function(s) {
+ if (cb)
+ cb.call(s || t, s);
+
+ t.close(null, w.id);
+ },
+ content : DOM.encode(t.editor.getLang(txt, txt)),
+ inline : 1,
+ width : 400,
+ height : 130
+ });
+ },
+
+ // Internal functions
+
+ _findId : function(w) {
+ var t = this;
+
+ if (typeof(w) == 'string')
+ return w;
+
+ each(t.windows, function(wo) {
+ var ifr = DOM.get(wo.id + '_ifr');
+
+ if (ifr && w == ifr.contentWindow) {
+ w = wo.id;
+ return false;
+ }
+ });
+
+ return w;
+ },
+
+ _fixIELayout : function(id, s) {
+ var w, img;
+
+ if (!tinymce.isIE6)
+ return;
+
+ // Fixes the bug where hover flickers and does odd things in IE6
+ each(['n','s','w','e','nw','ne','sw','se'], function(v) {
+ var e = DOM.get(id + '_resize_' + v);
+
+ DOM.setStyles(e, {
+ width : s ? e.clientWidth : '',
+ height : s ? e.clientHeight : '',
+ cursor : DOM.getStyle(e, 'cursor', 1)
+ });
+
+ DOM.setStyle(id + "_bottom", 'bottom', '-1px');
+
+ e = 0;
+ });
+
+ // Fixes graphics glitch
+ if (w = this.windows[id]) {
+ // Fixes rendering bug after resize
+ w.element.hide();
+ w.element.show();
+
+ // Forced a repaint of the window
+ //DOM.get(id).style.filter = '';
+
+ // IE has a bug where images used in CSS won't get loaded
+ // sometimes when the cache in the browser is disabled
+ // This fix tries to solve it by loading the images using the image object
+ each(DOM.select('div,a', id), function(e, i) {
+ if (e.currentStyle.backgroundImage != 'none') {
+ img = new Image();
+ img.src = e.currentStyle.backgroundImage.replace(/url\(\"(.+)\"\)/, '$1');
+ }
+ });
+
+ DOM.get(id).style.filter = '';
+ }
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('inlinepopups', tinymce.plugins.InlinePopups);
+})();
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif
new file mode 100644
index 0000000..2191398
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif
new file mode 100644
index 0000000..f957e49
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif
new file mode 100644
index 0000000..6baf64a
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif
new file mode 100644
index 0000000..20acbbf
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif
new file mode 100644
index 0000000..d5de1cc
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif
new file mode 100644
index 0000000..c2a2ad4
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif
new file mode 100644
index 0000000..0b4cc36
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css
new file mode 100644
index 0000000..a50d4fc
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css
@@ -0,0 +1,90 @@
+/* Clearlooks 2 */
+
+/* Reset */
+.clearlooks2, .clearlooks2 div, .clearlooks2 span, .clearlooks2 a {vertical-align:baseline; text-align:left; position:absolute; border:0; padding:0; margin:0; background:transparent; font-family:Arial,Verdana; font-size:11px; color:#000; text-decoration:none; font-weight:normal; width:auto; height:auto; overflow:hidden; display:block}
+
+/* General */
+.clearlooks2 {position:absolute; direction:ltr}
+.clearlooks2 .mceWrapper {position:static}
+.mceEventBlocker {position:fixed; left:0; top:0; background:url(img/horizontal.gif) no-repeat 0 -75px; width:100%; height:100%}
+.clearlooks2 .mcePlaceHolder {border:1px solid #000; background:#888; top:0; left:0; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50)}
+.clearlooks2_modalBlocker {position:fixed; left:0; top:0; width:100%; height:100%; background:#FFF; opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60); display:none}
+
+/* Top */
+.clearlooks2 .mceTop, .clearlooks2 .mceTop div {top:0; width:100%; height:23px}
+.clearlooks2 .mceTop .mceLeft {width:6px; background:url(img/corners.gif)}
+.clearlooks2 .mceTop .mceCenter {right:6px; width:100%; height:23px; background:url(img/horizontal.gif) 12px 0; clip:rect(auto auto auto 12px)}
+.clearlooks2 .mceTop .mceRight {right:0; width:6px; height:23px; background:url(img/corners.gif) -12px 0}
+.clearlooks2 .mceTop span {width:100%; text-align:center; vertical-align:middle; line-height:23px; font-weight:bold}
+.clearlooks2 .mceFocus .mceTop .mceLeft {background:url(img/corners.gif) -6px 0}
+.clearlooks2 .mceFocus .mceTop .mceCenter {background:url(img/horizontal.gif) 0 -23px}
+.clearlooks2 .mceFocus .mceTop .mceRight {background:url(img/corners.gif) -18px 0}
+.clearlooks2 .mceFocus .mceTop span {color:#FFF}
+
+/* Middle */
+.clearlooks2 .mceMiddle, .clearlooks2 .mceMiddle div {top:0}
+.clearlooks2 .mceMiddle {width:100%; height:100%; clip:rect(23px auto auto auto)}
+.clearlooks2 .mceMiddle .mceLeft {left:0; width:5px; height:100%; background:url(img/vertical.gif) -5px 0}
+.clearlooks2 .mceMiddle span {top:23px; left:5px; width:100%; height:100%; background:#FFF}
+.clearlooks2 .mceMiddle .mceRight {right:0; width:5px; height:100%; background:url(img/vertical.gif)}
+
+/* Bottom */
+.clearlooks2 .mceBottom, .clearlooks2 .mceBottom div {height:6px}
+.clearlooks2 .mceBottom {left:0; bottom:0; width:100%}
+.clearlooks2 .mceBottom div {top:0}
+.clearlooks2 .mceBottom .mceLeft {left:0; width:5px; background:url(img/corners.gif) -34px -6px}
+.clearlooks2 .mceBottom .mceCenter {left:5px; width:100%; background:url(img/horizontal.gif) 0 -46px}
+.clearlooks2 .mceBottom .mceRight {right:0; width:5px; background: url(img/corners.gif) -34px 0}
+.clearlooks2 .mceBottom span {display:none}
+.clearlooks2 .mceStatusbar .mceBottom, .clearlooks2 .mceStatusbar .mceBottom div {height:23px}
+.clearlooks2 .mceStatusbar .mceBottom .mceLeft {background:url(img/corners.gif) -29px 0}
+.clearlooks2 .mceStatusbar .mceBottom .mceCenter {background:url(img/horizontal.gif) 0 -52px}
+.clearlooks2 .mceStatusbar .mceBottom .mceRight {background:url(img/corners.gif) -24px 0}
+.clearlooks2 .mceStatusbar .mceBottom span {display:block; left:7px; font-family:Arial, Verdana; font-size:11px; line-height:23px}
+
+/* Actions */
+.clearlooks2 a {width:29px; height:16px; top:3px;}
+.clearlooks2 .mceClose {right:6px; background:url(img/buttons.gif) -87px 0}
+.clearlooks2 .mceMin {display:none; right:68px; background:url(img/buttons.gif) 0 0}
+.clearlooks2 .mceMed {display:none; right:37px; background:url(img/buttons.gif) -29px 0}
+.clearlooks2 .mceMax {display:none; right:37px; background:url(img/buttons.gif) -58px 0}
+.clearlooks2 .mceMove {display:none;width:100%;cursor:move;background:url(img/corners.gif) no-repeat -100px -100px}
+.clearlooks2 .mceMovable .mceMove {display:block}
+.clearlooks2 .mceFocus .mceClose {right:6px; background:url(img/buttons.gif) -87px -16px}
+.clearlooks2 .mceFocus .mceMin {right:68px; background:url(img/buttons.gif) 0 -16px}
+.clearlooks2 .mceFocus .mceMed {right:37px; background:url(img/buttons.gif) -29px -16px}
+.clearlooks2 .mceFocus .mceMax {right:37px; background:url(img/buttons.gif) -58px -16px}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
+.clearlooks2 .mceFocus .mceClose:hover {right:6px; background:url(img/buttons.gif) -87px -32px}
+.clearlooks2 .mceFocus .mceMin:hover {right:68px; background:url(img/buttons.gif) 0 -32px}
+.clearlooks2 .mceFocus .mceMed:hover {right:37px; background:url(img/buttons.gif) -29px -32px}
+.clearlooks2 .mceFocus .mceMax:hover {right:37px; background:url(img/buttons.gif) -58px -32px}
+
+/* Resize */
+.clearlooks2 .mceResize {top:auto; left:auto; display:none; width:5px; height:5px; background:url(img/horizontal.gif) no-repeat 0 -75px}
+.clearlooks2 .mceResizable .mceResize {display:block}
+.clearlooks2 .mceResizable .mceMin, .clearlooks2 .mceMax {display:none}
+.clearlooks2 .mceMinimizable .mceMin {display:block}
+.clearlooks2 .mceMaximizable .mceMax {display:block}
+.clearlooks2 .mceMaximized .mceMed {display:block}
+.clearlooks2 .mceMaximized .mceMax {display:none}
+.clearlooks2 a.mceResizeN {top:0; left:0; width:100%; cursor:n-resize}
+.clearlooks2 a.mceResizeNW {top:0; left:0; cursor:nw-resize}
+.clearlooks2 a.mceResizeNE {top:0; right:0; cursor:ne-resize}
+.clearlooks2 a.mceResizeW {top:0; left:0; height:100%; cursor:w-resize;}
+.clearlooks2 a.mceResizeE {top:0; right:0; height:100%; cursor:e-resize}
+.clearlooks2 a.mceResizeS {bottom:0; left:0; width:100%; cursor:s-resize}
+.clearlooks2 a.mceResizeSW {bottom:0; left:0; cursor:sw-resize}
+.clearlooks2 a.mceResizeSE {bottom:0; right:0; cursor:se-resize}
+
+/* Alert/Confirm */
+.clearlooks2 .mceButton {font-weight:bold; bottom:10px; width:80px; height:30px; background:url(img/button.gif); line-height:30px; vertical-align:middle; text-align:center; outline:0}
+.clearlooks2 .mceMiddle .mceIcon {left:15px; top:35px; width:32px; height:32px}
+.clearlooks2 .mceAlert .mceMiddle span, .clearlooks2 .mceConfirm .mceMiddle span {background:transparent;left:60px; top:35px; width:320px; height:50px; font-weight:bold; overflow:auto; white-space:normal}
+.clearlooks2 a:hover {font-weight:bold;}
+.clearlooks2 .mceAlert .mceMiddle, .clearlooks2 .mceConfirm .mceMiddle {background:#D6D7D5}
+.clearlooks2 .mceAlert .mceOk {left:50%; top:auto; margin-left: -40px}
+.clearlooks2 .mceAlert .mceIcon {background:url(img/alert.gif)}
+.clearlooks2 .mceConfirm .mceOk {left:50%; top:auto; margin-left: -90px}
+.clearlooks2 .mceConfirm .mceCancel {left:50%; top:auto}
+.clearlooks2 .mceConfirm .mceIcon {background:url(img/confirm.gif)}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm
new file mode 100644
index 0000000..f9ec642
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/inlinepopups/template.htm
@@ -0,0 +1,387 @@
+
+
+
+Template for dialogs
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Statusbar, Resizable
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Resizable, Maximizable
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Blurred, Maximizable, Statusbar, Resizable
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Maximized, Maximizable, Minimizable
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
Statusbar text.
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+
+
+
+
+
+
+
+
+
Ok
+
+
+
+
+
+
+
+
+
+
+
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+ This is a very long error message. This is a very long error message.
+
+
+
+
+
+
+
+
+
Ok
+
Cancel
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js
new file mode 100644
index 0000000..938ce6b
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/insertdatetime/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.InsertDateTime",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertDate",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_dateFormat",a.getLang("insertdatetime.date_fmt")));a.execCommand("mceInsertContent",false,d)});a.addCommand("mceInsertTime",function(){var d=c._getDateTime(new Date(),a.getParam("plugin_insertdate_timeFormat",a.getLang("insertdatetime.time_fmt")));a.execCommand("mceInsertContent",false,d)});a.addButton("insertdate",{title:"insertdatetime.insertdate_desc",cmd:"mceInsertDate"});a.addButton("inserttime",{title:"insertdatetime.inserttime_desc",cmd:"mceInsertTime"})},getInfo:function(){return{longname:"Insert date/time",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/insertdatetime",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_getDateTime:function(e,a){var c=this.editor;function b(g,d){g=""+g;if(g.length-1){b[e].style.zIndex=h[k];b[k].style.zIndex=h[e]}else{if(h[e]>0){b[e].style.zIndex=h[e]-1}}}else{for(g=0;gh[e]){k=g;break}}if(k>-1){b[e].style.zIndex=h[k];b[k].style.zIndex=h[e]}else{b[e].style.zIndex=h[e]+1}}c.execCommand("mceRepaint")},_getParentLayer:function(b){return this.editor.dom.getParent(b,function(c){return c.nodeType==1&&/^(absolute|relative|static)$/i.test(c.style.position)})},_insertLayer:function(){var c=this.editor,e=c.dom,d=e.getPos(e.getParent(c.selection.getNode(),"*")),b=c.getBody();c.dom.add(b,"div",{style:{position:"absolute",left:d.x,top:(d.y>20?d.y:20),width:100,height:100},"class":"mceItemVisualAid mceItemLayer"},c.selection.getContent()||c.getLang("layer.content"));if(tinymce.isIE){e.setHTML(b,b.innerHTML)}},_toggleAbsolute:function(){var b=this.editor,c=this._getParentLayer(b.selection.getNode());if(!c){c=b.dom.getParent(b.selection.getNode(),"DIV,P,IMG")}if(c){if(c.style.position.toLowerCase()=="absolute"){b.dom.setStyles(c,{position:"",left:"",top:"",width:"",height:""});b.dom.removeClass(c,"mceItemVisualAid");b.dom.removeClass(c,"mceItemLayer")}else{if(c.style.left==""){c.style.left=20+"px"}if(c.style.top==""){c.style.top=20+"px"}if(c.style.width==""){c.style.width=c.width?(c.width+"px"):"100px"}if(c.style.height==""){c.style.height=c.height?(c.height+"px"):"100px"}c.style.position="absolute";b.dom.setAttrib(c,"data-mce-style","");b.addVisual(b.getBody())}b.execCommand("mceRepaint");b.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js
new file mode 100644
index 0000000..daed280
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/layer/editor_plugin_src.js
@@ -0,0 +1,262 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ function findParentLayer(node) {
+ do {
+ if (node.className && node.className.indexOf('mceItemLayer') != -1) {
+ return node;
+ }
+ } while (node = node.parentNode);
+ };
+
+ tinymce.create('tinymce.plugins.Layer', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceInsertLayer', t._insertLayer, t);
+
+ ed.addCommand('mceMoveForward', function() {
+ t._move(1);
+ });
+
+ ed.addCommand('mceMoveBackward', function() {
+ t._move(-1);
+ });
+
+ ed.addCommand('mceMakeAbsolute', function() {
+ t._toggleAbsolute();
+ });
+
+ // Register buttons
+ ed.addButton('moveforward', {title : 'layer.forward_desc', cmd : 'mceMoveForward'});
+ ed.addButton('movebackward', {title : 'layer.backward_desc', cmd : 'mceMoveBackward'});
+ ed.addButton('absolute', {title : 'layer.absolute_desc', cmd : 'mceMakeAbsolute'});
+ ed.addButton('insertlayer', {title : 'layer.insertlayer_desc', cmd : 'mceInsertLayer'});
+
+ ed.onInit.add(function() {
+ var dom = ed.dom;
+
+ if (tinymce.isIE)
+ ed.getDoc().execCommand('2D-Position', false, true);
+ });
+
+ // Remove serialized styles when selecting a layer since it might be changed by a drag operation
+ ed.onMouseUp.add(function(ed, e) {
+ var layer = findParentLayer(e.target);
+
+ if (layer) {
+ ed.dom.setAttrib(layer, 'data-mce-style', '');
+ }
+ });
+
+ // Fixes edit focus issues with layers on Gecko
+ // This will enable designMode while inside a layer and disable it when outside
+ ed.onMouseDown.add(function(ed, e) {
+ var node = e.target, doc = ed.getDoc(), parent;
+
+ if (tinymce.isGecko) {
+ if (findParentLayer(node)) {
+ if (doc.designMode !== 'on') {
+ doc.designMode = 'on';
+
+ // Repaint caret
+ node = doc.body;
+ parent = node.parentNode;
+ parent.removeChild(node);
+ parent.appendChild(node);
+ }
+ } else if (doc.designMode == 'on') {
+ doc.designMode = 'off';
+ }
+ }
+ });
+
+ ed.onNodeChange.add(t._nodeChange, t);
+ ed.onVisualAid.add(t._visualAid, t);
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Layer',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/layer',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ // Private methods
+
+ _nodeChange : function(ed, cm, n) {
+ var le, p;
+
+ le = this._getParentLayer(n);
+ p = ed.dom.getParent(n, 'DIV,P,IMG');
+
+ if (!p) {
+ cm.setDisabled('absolute', 1);
+ cm.setDisabled('moveforward', 1);
+ cm.setDisabled('movebackward', 1);
+ } else {
+ cm.setDisabled('absolute', 0);
+ cm.setDisabled('moveforward', !le);
+ cm.setDisabled('movebackward', !le);
+ cm.setActive('absolute', le && le.style.position.toLowerCase() == "absolute");
+ }
+ },
+
+ // Private methods
+
+ _visualAid : function(ed, e, s) {
+ var dom = ed.dom;
+
+ tinymce.each(dom.select('div,p', e), function(e) {
+ if (/^(absolute|relative|fixed)$/i.test(e.style.position)) {
+ if (s)
+ dom.addClass(e, 'mceItemVisualAid');
+ else
+ dom.removeClass(e, 'mceItemVisualAid');
+
+ dom.addClass(e, 'mceItemLayer');
+ }
+ });
+ },
+
+ _move : function(d) {
+ var ed = this.editor, i, z = [], le = this._getParentLayer(ed.selection.getNode()), ci = -1, fi = -1, nl;
+
+ nl = [];
+ tinymce.walk(ed.getBody(), function(n) {
+ if (n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position))
+ nl.push(n);
+ }, 'childNodes');
+
+ // Find z-indexes
+ for (i=0; i -1) {
+ nl[ci].style.zIndex = z[fi];
+ nl[fi].style.zIndex = z[ci];
+ } else {
+ if (z[ci] > 0)
+ nl[ci].style.zIndex = z[ci] - 1;
+ }
+ } else {
+ // Move forward
+
+ // Try find a higher one
+ for (i=0; i z[ci]) {
+ fi = i;
+ break;
+ }
+ }
+
+ if (fi > -1) {
+ nl[ci].style.zIndex = z[fi];
+ nl[fi].style.zIndex = z[ci];
+ } else
+ nl[ci].style.zIndex = z[ci] + 1;
+ }
+
+ ed.execCommand('mceRepaint');
+ },
+
+ _getParentLayer : function(n) {
+ return this.editor.dom.getParent(n, function(n) {
+ return n.nodeType == 1 && /^(absolute|relative|static)$/i.test(n.style.position);
+ });
+ },
+
+ _insertLayer : function() {
+ var ed = this.editor, dom = ed.dom, p = dom.getPos(dom.getParent(ed.selection.getNode(), '*')), body = ed.getBody();
+
+ ed.dom.add(body, 'div', {
+ style : {
+ position : 'absolute',
+ left : p.x,
+ top : (p.y > 20 ? p.y : 20),
+ width : 100,
+ height : 100
+ },
+ 'class' : 'mceItemVisualAid mceItemLayer'
+ }, ed.selection.getContent() || ed.getLang('layer.content'));
+
+ // Workaround for IE where it messes up the JS engine if you insert a layer on IE 6,7
+ if (tinymce.isIE)
+ dom.setHTML(body, body.innerHTML);
+ },
+
+ _toggleAbsolute : function() {
+ var ed = this.editor, le = this._getParentLayer(ed.selection.getNode());
+
+ if (!le)
+ le = ed.dom.getParent(ed.selection.getNode(), 'DIV,P,IMG');
+
+ if (le) {
+ if (le.style.position.toLowerCase() == "absolute") {
+ ed.dom.setStyles(le, {
+ position : '',
+ left : '',
+ top : '',
+ width : '',
+ height : ''
+ });
+
+ ed.dom.removeClass(le, 'mceItemVisualAid');
+ ed.dom.removeClass(le, 'mceItemLayer');
+ } else {
+ if (le.style.left == "")
+ le.style.left = 20 + 'px';
+
+ if (le.style.top == "")
+ le.style.top = 20 + 'px';
+
+ if (le.style.width == "")
+ le.style.width = le.width ? (le.width + 'px') : '100px';
+
+ if (le.style.height == "")
+ le.style.height = le.height ? (le.height + 'px') : '100px';
+
+ le.style.position = "absolute";
+
+ ed.dom.setAttrib(le, 'data-mce-style', '');
+ ed.addVisual(ed.getBody());
+ }
+
+ ed.execCommand('mceRepaint');
+ ed.nodeChanged();
+ }
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('layer', tinymce.plugins.Layer);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js
new file mode 100644
index 0000000..2ed5f41
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin.js
@@ -0,0 +1 @@
+(function(a){a.onAddEditor.addToTop(function(c,b){b.settings.inline_styles=false});a.create("tinymce.plugins.LegacyOutput",{init:function(b){b.onInit.add(function(){var c="p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img",e=a.explode(b.settings.font_size_style_values),d=b.schema;b.formatter.register({alignleft:{selector:c,attributes:{align:"left"}},aligncenter:{selector:c,attributes:{align:"center"}},alignright:{selector:c,attributes:{align:"right"}},alignfull:{selector:c,attributes:{align:"justify"}},bold:[{inline:"b",remove:"all"},{inline:"strong",remove:"all"},{inline:"span",styles:{fontWeight:"bold"}}],italic:[{inline:"i",remove:"all"},{inline:"em",remove:"all"},{inline:"span",styles:{fontStyle:"italic"}}],underline:[{inline:"u",remove:"all"},{inline:"span",styles:{textDecoration:"underline"},exact:true}],strikethrough:[{inline:"strike",remove:"all"},{inline:"span",styles:{textDecoration:"line-through"},exact:true}],fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",attributes:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});a.each("b,i,u,strike".split(","),function(f){d.addValidElements(f+"[*]")});if(!d.getElementRule("font")){d.addValidElements("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.getElementRule(f),g;if(h){if(!h.attributes.align){h.attributes.align={};h.attributesOrder.push("align")}}});b.onNodeChange.add(function(g,k){var j,f,h,i;f=g.dom.getParent(g.selection.getNode(),"font");if(f){h=f.face;i=f.size}if(j=k.get("fontselect")){j.select(function(l){return l==h})}if(j=k.get("fontsizeselect")){j.select(function(m){var l=a.inArray(e,m.fontSize);return l+1==i})}})})},getInfo:function(){return{longname:"LegacyOutput",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput",version:a.majorVersion+"."+a.minorVersion}}});a.PluginManager.add("legacyoutput",a.plugins.LegacyOutput)})(tinymce);
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js
new file mode 100644
index 0000000..3cdcde5
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/legacyoutput/editor_plugin_src.js
@@ -0,0 +1,139 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ *
+ * This plugin will force TinyMCE to produce deprecated legacy output such as font elements, u elements, align
+ * attributes and so forth. There are a few cases where these old items might be needed for example in email applications or with Flash
+ *
+ * However you should NOT use this plugin if you are building some system that produces web contents such as a CMS. All these elements are
+ * not apart of the newer specifications for HTML and XHTML.
+ */
+
+(function(tinymce) {
+ // Override inline_styles setting to force TinyMCE to produce deprecated contents
+ tinymce.onAddEditor.addToTop(function(tinymce, editor) {
+ editor.settings.inline_styles = false;
+ });
+
+ // Create the legacy ouput plugin
+ tinymce.create('tinymce.plugins.LegacyOutput', {
+ init : function(editor) {
+ editor.onInit.add(function() {
+ var alignElements = 'p,h1,h2,h3,h4,h5,h6,td,th,div,ul,ol,li,table,img',
+ fontSizes = tinymce.explode(editor.settings.font_size_style_values),
+ schema = editor.schema;
+
+ // Override some internal formats to produce legacy elements and attributes
+ editor.formatter.register({
+ // Change alignment formats to use the deprecated align attribute
+ alignleft : {selector : alignElements, attributes : {align : 'left'}},
+ aligncenter : {selector : alignElements, attributes : {align : 'center'}},
+ alignright : {selector : alignElements, attributes : {align : 'right'}},
+ alignfull : {selector : alignElements, attributes : {align : 'justify'}},
+
+ // Change the basic formatting elements to use deprecated element types
+ bold : [
+ {inline : 'b', remove : 'all'},
+ {inline : 'strong', remove : 'all'},
+ {inline : 'span', styles : {fontWeight : 'bold'}}
+ ],
+ italic : [
+ {inline : 'i', remove : 'all'},
+ {inline : 'em', remove : 'all'},
+ {inline : 'span', styles : {fontStyle : 'italic'}}
+ ],
+ underline : [
+ {inline : 'u', remove : 'all'},
+ {inline : 'span', styles : {textDecoration : 'underline'}, exact : true}
+ ],
+ strikethrough : [
+ {inline : 'strike', remove : 'all'},
+ {inline : 'span', styles : {textDecoration: 'line-through'}, exact : true}
+ ],
+
+ // Change font size and font family to use the deprecated font element
+ fontname : {inline : 'font', attributes : {face : '%value'}},
+ fontsize : {
+ inline : 'font',
+ attributes : {
+ size : function(vars) {
+ return tinymce.inArray(fontSizes, vars.value) + 1;
+ }
+ }
+ },
+
+ // Setup font elements for colors as well
+ forecolor : {inline : 'font', attributes : {color : '%value'}},
+ hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}}
+ });
+
+ // Check that deprecated elements are allowed if not add them
+ tinymce.each('b,i,u,strike'.split(','), function(name) {
+ schema.addValidElements(name + '[*]');
+ });
+
+ // Add font element if it's missing
+ if (!schema.getElementRule("font"))
+ schema.addValidElements("font[face|size|color|style]");
+
+ // Add the missing and depreacted align attribute for the serialization engine
+ tinymce.each(alignElements.split(','), function(name) {
+ var rule = schema.getElementRule(name), found;
+
+ if (rule) {
+ if (!rule.attributes.align) {
+ rule.attributes.align = {};
+ rule.attributesOrder.push('align');
+ }
+ }
+ });
+
+ // Listen for the onNodeChange event so that we can do special logic for the font size and font name drop boxes
+ editor.onNodeChange.add(function(editor, control_manager) {
+ var control, fontElm, fontName, fontSize;
+
+ // Find font element get it's name and size
+ fontElm = editor.dom.getParent(editor.selection.getNode(), 'font');
+ if (fontElm) {
+ fontName = fontElm.face;
+ fontSize = fontElm.size;
+ }
+
+ // Select/unselect the font name in droplist
+ if (control = control_manager.get('fontselect')) {
+ control.select(function(value) {
+ return value == fontName;
+ });
+ }
+
+ // Select/unselect the font size in droplist
+ if (control = control_manager.get('fontsizeselect')) {
+ control.select(function(value) {
+ var index = tinymce.inArray(fontSizes, value.fontSize);
+
+ return index + 1 == fontSize;
+ });
+ }
+ });
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'LegacyOutput',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/legacyoutput',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('legacyoutput', tinymce.plugins.LegacyOutput);
+})(tinymce);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js
new file mode 100644
index 0000000..ec21b25
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var e=tinymce.each,r=tinymce.dom.Event,g;function p(t,s){while(t&&(t.nodeType===8||(t.nodeType===3&&/^[ \t\n\r]*$/.test(t.nodeValue)))){t=s(t)}return t}function b(s){return p(s,function(t){return t.previousSibling})}function i(s){return p(s,function(t){return t.nextSibling})}function d(s,u,t){return s.dom.getParent(u,function(v){return tinymce.inArray(t,v)!==-1})}function n(s){return s&&(s.tagName==="OL"||s.tagName==="UL")}function c(u,v){var t,w,s;t=b(u.lastChild);while(n(t)){w=t;t=b(w.previousSibling)}if(w){s=v.create("li",{style:"list-style-type: none;"});v.split(u,w);v.insertAfter(s,w);s.appendChild(w);s.appendChild(w);u=s.previousSibling}return u}function m(t,s,u){t=a(t,s,u);return o(t,s,u)}function a(u,s,v){var t=b(u.previousSibling);if(t){return h(t,u,s?t:false,v)}else{return u}}function o(u,t,v){var s=i(u.nextSibling);if(s){return h(u,s,t?s:false,v)}else{return u}}function h(u,s,t,v){if(l(u,s,!!t,v)){return f(u,s,t)}else{if(u&&u.tagName==="LI"&&n(s)){u.appendChild(s)}}return s}function l(u,t,s,v){if(!u||!t){return false}else{if(u.tagName==="LI"&&t.tagName==="LI"){return t.style.listStyleType==="none"||j(t)}else{if(n(u)){return(u.tagName===t.tagName&&(s||u.style.listStyleType===t.style.listStyleType))||q(t)}else{return v&&u.tagName==="P"&&t.tagName==="P"}}}}function q(t){var s=i(t.firstChild),u=b(t.lastChild);return s&&u&&n(t)&&s===u&&(n(s)||s.style.listStyleType==="none"||j(s))}function j(u){var t=i(u.firstChild),s=b(u.lastChild);return t&&s&&t===s&&n(t)}function f(w,v,s){var u=b(w.lastChild),t=i(v.firstChild);if(w.tagName==="P"){w.appendChild(w.ownerDocument.createElement("br"))}while(v.firstChild){w.appendChild(v.firstChild)}if(s){w.style.listStyleType=s.style.listStyleType}v.parentNode.removeChild(v);h(u,t,false);return w}function k(t,u){var s;if(!u.is(t,"li,ol,ul")){s=u.getParent(t,"li");if(s){t=s}}return t}tinymce.create("tinymce.plugins.Lists",{init:function(y){var v="TABBING";var s="EMPTY";var J="ESCAPE";var z="PARAGRAPH";var N="UNKNOWN";var x=N;function E(U){return U.keyCode===tinymce.VK.TAB&&!(U.altKey||U.ctrlKey)&&(y.queryCommandState("InsertUnorderedList")||y.queryCommandState("InsertOrderedList"))}function w(){var U=B();var W=U.parentNode.parentNode;var V=U.parentNode.lastChild===U;return V&&!t(W)&&P(U)}function t(U){if(n(U)){return U.parentNode&&U.parentNode.tagName==="LI"}else{return U.tagName==="LI"}}function F(){return y.selection.isCollapsed()&&P(B())}function B(){var U=y.selection.getStart();return((U.tagName=="BR"||U.tagName=="")&&U.parentNode.tagName=="LI")?U.parentNode:U}function P(U){var V=U.childNodes.length;if(U.tagName==="LI"){return V==0?true:V==1&&(U.firstChild.tagName==""||U.firstChild.tagName=="BR"||H(U))}return false}function H(U){var V=tinymce.grep(U.parentNode.childNodes,function(Y){return Y.tagName=="LI"});var W=U==V[V.length-1];var X=U.firstChild;return tinymce.isIE9&&W&&(X.nodeValue==String.fromCharCode(160)||X.nodeValue==String.fromCharCode(32))}function T(U){return U.keyCode===tinymce.VK.ENTER}function A(U){return T(U)&&!U.shiftKey}function M(U){if(E(U)){return v}else{if(A(U)&&w()){return N}else{if(A(U)&&F()){return s}else{return N}}}}function D(U,V){if(x==v||x==s||tinymce.isGecko&&x==J){r.cancel(V)}}function C(){var U=y.selection.getRng(true);var V=U.startContainer;if(V.nodeType==3){var W=V.nodeValue;if(tinymce.isIE9&&W.length>1&&W.charCodeAt(W.length-1)==32){return(U.endOffset==W.length-1)}else{return(U.endOffset==W.length)}}else{if(V.nodeType==1){return U.endOffset==V.childNodes.length}}return false}function I(){var W=y.selection.getNode();var V="h1,h2,h3,h4,h5,h6,p,div";var U=y.dom.is(W,V)&&W.parentNode.tagName==="LI"&&W.parentNode.lastChild===W;return y.selection.isCollapsed()&&U&&C()}function K(W,Y){if(A(Y)&&I()){var X=W.selection.getNode();var V=W.dom.create("li");var U=W.dom.getParent(X,"li");W.dom.insertAfter(V,U);if(tinymce.isIE6||tinymce.isIE7||tinyMCE.isIE8){W.selection.setCursorLocation(V,1)}else{W.selection.setCursorLocation(V,0)}Y.preventDefault()}}function u(X,Z){var ac;if(!tinymce.isGecko){return}var V=X.selection.getStart();if(Z.keyCode!=tinymce.VK.BACKSPACE||V.tagName!=="IMG"){return}function W(ag){var ah=ag.firstChild;var af=null;do{if(!ah){break}if(ah.tagName==="LI"){af=ah}}while(ah=ah.nextSibling);return af}function ae(ag,af){while(ag.childNodes.length>0){af.appendChild(ag.childNodes[0])}}ac=V.parentNode.previousSibling;if(!ac){return}var aa;if(ac.tagName==="UL"||ac.tagName==="OL"){aa=ac}else{if(ac.previousSibling&&(ac.previousSibling.tagName==="UL"||ac.previousSibling.tagName==="OL")){aa=ac.previousSibling}else{return}}var ad=W(aa);var U=X.dom.createRng();U.setStart(ad,1);U.setEnd(ad,1);X.selection.setRng(U);X.selection.collapse(true);var Y=X.selection.getBookmark();var ab=V.parentNode.cloneNode(true);if(ab.tagName==="P"||ab.tagName==="DIV"){ae(ab,ad)}else{ad.appendChild(ab)}V.parentNode.parentNode.removeChild(V.parentNode);X.selection.moveToBookmark(Y)}function G(U){var V=y.dom.getParent(U,"ol,ul");if(V!=null){var W=V.lastChild;y.selection.setCursorLocation(W,0)}}this.ed=y;y.addCommand("Indent",this.indent,this);y.addCommand("Outdent",this.outdent,this);y.addCommand("InsertUnorderedList",function(){this.applyList("UL","OL")},this);y.addCommand("InsertOrderedList",function(){this.applyList("OL","UL")},this);y.onInit.add(function(){y.editorCommands.addCommands({outdent:function(){var V=y.selection,W=y.dom;function U(X){X=W.getParent(X,W.isBlock);return X&&(parseInt(y.dom.getStyle(X,"margin-left")||0,10)+parseInt(y.dom.getStyle(X,"padding-left")||0,10))>0}return U(V.getStart())||U(V.getEnd())||y.queryCommandState("InsertOrderedList")||y.queryCommandState("InsertUnorderedList")}},"state")});y.onKeyUp.add(function(V,W){if(x==v){V.execCommand(W.shiftKey?"Outdent":"Indent",true,null);x=N;return r.cancel(W)}else{if(x==s){var U=B();var Y=V.settings.list_outdent_on_enter===true||W.shiftKey;V.execCommand(Y?"Outdent":"Indent",true,null);if(tinymce.isIE){G(U)}return r.cancel(W)}else{if(x==J){if(tinymce.isIE6||tinymce.isIE7||tinymce.isIE8){var X=V.getDoc().createTextNode("\uFEFF");V.selection.getNode().appendChild(X)}else{if(tinymce.isIE9||tinymce.isGecko){V.execCommand("Outdent");return r.cancel(W)}}}}}});function L(V,U){var W=y.getDoc().createTextNode("\uFEFF");V.insertBefore(W,U);y.selection.setCursorLocation(W,0);y.execCommand("mceRepaint")}function R(V,X){if(T(X)){var U=B();if(U){var W=U.parentNode;var Y=W&&W.parentNode;if(Y&&Y.nodeName=="LI"&&Y.firstChild==W&&U==W.firstChild){L(Y,W)}}}}function S(V,X){if(T(X)){var U=B();if(V.dom.select("ul li",U).length===1){var W=U.firstChild;L(U,W)}}}function Q(W,aa){function X(ab){var ad=[];var ae=new tinymce.dom.TreeWalker(ab.firstChild,ab);for(var ac=ae.current();ac;ac=ae.next()){if(W.dom.is(ac,"ol,ul,li")){ad.push(ac)}}return ad}if(aa.keyCode==tinymce.VK.BACKSPACE){var U=B();if(U){var Z=W.dom.getParent(U,"ol,ul"),V=W.selection.getRng();if(Z&&Z.firstChild===U&&V.startOffset==0){var Y=X(U);Y.unshift(U);W.execCommand("Outdent",false,Y);W.undoManager.add();return r.cancel(aa)}}}}function O(V,X){var U=B();if(X.keyCode===tinymce.VK.BACKSPACE&&V.dom.is(U,"li")&&U.parentNode.firstChild!==U){if(V.dom.select("ul,ol",U).length===1){var Z=U.previousSibling;V.dom.remove(V.dom.select("br",U));V.dom.remove(U,true);var W=tinymce.grep(Z.childNodes,function(aa){return aa.nodeType===3});if(W.length===1){var Y=W[0];V.selection.setCursorLocation(Y,Y.length)}V.undoManager.add();return r.cancel(X)}}}y.onKeyDown.add(function(U,V){x=M(V)});y.onKeyDown.add(D);y.onKeyDown.add(u);y.onKeyDown.add(K);if(tinymce.isGecko){y.onKeyUp.add(R)}if(tinymce.isIE8){y.onKeyUp.add(S)}if(tinymce.isGecko||tinymce.isWebKit){y.onKeyDown.add(Q)}if(tinymce.isWebKit){y.onKeyDown.add(O)}},applyList:function(y,v){var C=this,z=C.ed,I=z.dom,s=[],H=false,u=false,w=false,B,G=z.selection.getSelectedBlocks();function E(t){if(t&&t.tagName==="BR"){I.remove(t)}}function F(M){var N=I.create(y),t;function L(O){if(O.style.marginLeft||O.style.paddingLeft){C.adjustPaddingFunction(false)(O)}}if(M.tagName==="LI"){}else{if(M.tagName==="P"||M.tagName==="DIV"||M.tagName==="BODY"){K(M,function(P,O){J(P,O,M.tagName==="BODY"?null:P.parentNode);t=P.parentNode;L(t);E(O)});if(t){if(t.tagName==="LI"&&(M.tagName==="P"||G.length>1)){I.split(t.parentNode.parentNode,t.parentNode)}m(t.parentNode,true)}return}else{t=I.create("li");I.insertAfter(t,M);t.appendChild(M);L(M);M=t}}I.insertAfter(N,M);N.appendChild(M);m(N,true);s.push(M)}function J(P,L,N){var t,O=P,M;while(!I.isBlock(P.parentNode)&&P.parentNode!==I.getRoot()){P=I.split(P.parentNode,P.previousSibling);P=P.nextSibling;O=P}if(N){t=N.cloneNode(true);P.parentNode.insertBefore(t,P);while(t.firstChild){I.remove(t.firstChild)}t=I.rename(t,"li")}else{t=I.create("li");P.parentNode.insertBefore(t,P)}while(O&&O!=L){M=O.nextSibling;t.appendChild(O);O=M}if(t.childNodes.length===0){t.innerHTML='
'}F(t)}function K(Q,T){var N,R,O=3,L=1,t="br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl";function P(X,U){var V=I.createRng(),W;g.keep=true;z.selection.moveToBookmark(g);g.keep=false;W=z.selection.getRng(true);if(!U){U=X.parentNode.lastChild}V.setStartBefore(X);V.setEndAfter(U);return !(V.compareBoundaryPoints(O,W)>0||V.compareBoundaryPoints(L,W)<=0)}function S(U){if(U.nextSibling){return U.nextSibling}if(!I.isBlock(U.parentNode)&&U.parentNode!==I.getRoot()){return S(U.parentNode)}}N=Q.firstChild;var M=false;e(I.select(t,Q),function(U){if(U.hasAttribute&&U.hasAttribute("_mce_bogus")){return true}if(P(N,U)){I.addClass(U,"_mce_tagged_br");N=S(U)}});M=(N&&P(N,undefined));N=Q.firstChild;e(I.select(t,Q),function(V){var U=S(V);if(V.hasAttribute&&V.hasAttribute("_mce_bogus")){return true}if(I.hasClass(V,"_mce_tagged_br")){T(N,V,R);R=null}else{R=V}N=U});if(M){T(N,undefined,R)}}function D(t){K(t,function(M,L,N){J(M,L);E(L);E(N)})}function A(t){if(tinymce.inArray(s,t)!==-1){return}if(t.parentNode.tagName===v){I.split(t.parentNode,t);F(t);o(t.parentNode,false)}s.push(t)}function x(M){var O,N,L,t;if(tinymce.inArray(s,M)!==-1){return}M=c(M,I);while(I.is(M.parentNode,"ol,ul,li")){I.split(M.parentNode,M)}s.push(M);M=I.rename(M,"p");L=m(M,false,z.settings.force_br_newlines);if(L===M){O=M.firstChild;while(O){if(I.isBlock(O)){O=I.split(O.parentNode,O);t=true;N=O.nextSibling&&O.nextSibling.firstChild}else{N=O.nextSibling;if(t&&O.tagName==="BR"){I.remove(O)}t=false}O=N}}}e(G,function(t){t=k(t,I);if(t.tagName===v||(t.tagName==="LI"&&t.parentNode.tagName===v)){u=true}else{if(t.tagName===y||(t.tagName==="LI"&&t.parentNode.tagName===y)){H=true}else{w=true}}});if(w&&!H||u||G.length===0){B={LI:A,H1:F,H2:F,H3:F,H4:F,H5:F,H6:F,P:F,BODY:F,DIV:G.length>1?F:D,defaultAction:D,elements:this.selectedBlocks()}}else{B={defaultAction:x,elements:this.selectedBlocks(),processEvenIfEmpty:true}}this.process(B)},indent:function(){var u=this.ed,w=u.dom,x=[];function s(z){var y=w.create("li",{style:"list-style-type: none;"});w.insertAfter(y,z);return y}function t(B){var y=s(B),D=w.getParent(B,"ol,ul"),C=D.tagName,E=w.getStyle(D,"list-style-type"),A={},z;if(E!==""){A.style="list-style-type: "+E+";"}z=w.create(C,A);y.appendChild(z);return z}function v(z){if(!d(u,z,x)){z=c(z,w);var y=t(z);y.appendChild(z);m(y.parentNode,false);m(y,false);x.push(z)}}this.process({LI:v,defaultAction:this.adjustPaddingFunction(true),elements:this.selectedBlocks()})},outdent:function(y,x){var w=this,u=w.ed,z=u.dom,s=[];function A(t){var C,B,D;if(!d(u,t,s)){if(z.getStyle(t,"margin-left")!==""||z.getStyle(t,"padding-left")!==""){return w.adjustPaddingFunction(false)(t)}D=z.getStyle(t,"text-align",true);if(D==="center"||D==="right"){z.setStyle(t,"text-align","left");return}t=c(t,z);C=t.parentNode;B=t.parentNode.parentNode;if(B.tagName==="P"){z.split(B,t.parentNode)}else{z.split(C,t);if(B.tagName==="LI"){z.split(B,t)}else{if(!z.is(B,"ol,ul")){z.rename(t,"p")}}}s.push(t)}}var v=x&&tinymce.is(x,"array")?x:this.selectedBlocks();this.process({LI:A,defaultAction:this.adjustPaddingFunction(false),elements:v});e(s,m)},process:function(y){var F=this,w=F.ed.selection,z=F.ed.dom,E,u;function B(t){var s=tinymce.grep(t.childNodes,function(H){return !(H.nodeName==="BR"||H.nodeName==="SPAN"&&z.getAttrib(H,"data-mce-type")=="bookmark"||H.nodeType==3&&(H.nodeValue==String.fromCharCode(160)||H.nodeValue==""))});return s.length===0}function x(s){z.removeClass(s,"_mce_act_on");if(!s||s.nodeType!==1||!y.processEvenIfEmpty&&E.length>1&&B(s)){return}s=k(s,z);var t=y[s.tagName];if(!t){t=y.defaultAction}t(s)}function v(s){F.splitSafeEach(s.childNodes,x,true)}function C(s,t){return t>=0&&s.hasChildNodes()&&t0){t=s.shift();w.removeClass(t,"_mce_act_on");u(t);s=w.select("._mce_act_on")}},adjustPaddingFunction:function(u){var s,v,t=this.ed;s=t.settings.indentation;v=/[a-z%]+/i.exec(s);s=parseInt(s,10);return function(w){var y,x;y=parseInt(t.dom.getStyle(w,"margin-left")||0,10)+parseInt(t.dom.getStyle(w,"padding-left")||0,10);if(u){x=y+s}else{x=y-s}t.dom.setStyle(w,"padding-left","");t.dom.setStyle(w,"margin-left",x>0?x+v:"")}},selectedBlocks:function(){var s=this.ed,t=s.selection.getSelectedBlocks();return t.length==0?[s.dom.getRoot()]:t},getInfo:function(){return{longname:"Lists",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("lists",tinymce.plugins.Lists)}());
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js
new file mode 100644
index 0000000..1000ef7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/lists/editor_plugin_src.js
@@ -0,0 +1,955 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2011, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var each = tinymce.each, Event = tinymce.dom.Event, bookmark;
+
+ // Skips text nodes that only contain whitespace since they aren't semantically important.
+ function skipWhitespaceNodes(e, next) {
+ while (e && (e.nodeType === 8 || (e.nodeType === 3 && /^[ \t\n\r]*$/.test(e.nodeValue)))) {
+ e = next(e);
+ }
+ return e;
+ }
+
+ function skipWhitespaceNodesBackwards(e) {
+ return skipWhitespaceNodes(e, function(e) {
+ return e.previousSibling;
+ });
+ }
+
+ function skipWhitespaceNodesForwards(e) {
+ return skipWhitespaceNodes(e, function(e) {
+ return e.nextSibling;
+ });
+ }
+
+ function hasParentInList(ed, e, list) {
+ return ed.dom.getParent(e, function(p) {
+ return tinymce.inArray(list, p) !== -1;
+ });
+ }
+
+ function isList(e) {
+ return e && (e.tagName === 'OL' || e.tagName === 'UL');
+ }
+
+ function splitNestedLists(element, dom) {
+ var tmp, nested, wrapItem;
+ tmp = skipWhitespaceNodesBackwards(element.lastChild);
+ while (isList(tmp)) {
+ nested = tmp;
+ tmp = skipWhitespaceNodesBackwards(nested.previousSibling);
+ }
+ if (nested) {
+ wrapItem = dom.create('li', { style: 'list-style-type: none;'});
+ dom.split(element, nested);
+ dom.insertAfter(wrapItem, nested);
+ wrapItem.appendChild(nested);
+ wrapItem.appendChild(nested);
+ element = wrapItem.previousSibling;
+ }
+ return element;
+ }
+
+ function attemptMergeWithAdjacent(e, allowDifferentListStyles, mergeParagraphs) {
+ e = attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs);
+ return attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs);
+ }
+
+ function attemptMergeWithPrevious(e, allowDifferentListStyles, mergeParagraphs) {
+ var prev = skipWhitespaceNodesBackwards(e.previousSibling);
+ if (prev) {
+ return attemptMerge(prev, e, allowDifferentListStyles ? prev : false, mergeParagraphs);
+ } else {
+ return e;
+ }
+ }
+
+ function attemptMergeWithNext(e, allowDifferentListStyles, mergeParagraphs) {
+ var next = skipWhitespaceNodesForwards(e.nextSibling);
+ if (next) {
+ return attemptMerge(e, next, allowDifferentListStyles ? next : false, mergeParagraphs);
+ } else {
+ return e;
+ }
+ }
+
+ function attemptMerge(e1, e2, differentStylesMasterElement, mergeParagraphs) {
+ if (canMerge(e1, e2, !!differentStylesMasterElement, mergeParagraphs)) {
+ return merge(e1, e2, differentStylesMasterElement);
+ } else if (e1 && e1.tagName === 'LI' && isList(e2)) {
+ // Fix invalidly nested lists.
+ e1.appendChild(e2);
+ }
+ return e2;
+ }
+
+ function canMerge(e1, e2, allowDifferentListStyles, mergeParagraphs) {
+ if (!e1 || !e2) {
+ return false;
+ } else if (e1.tagName === 'LI' && e2.tagName === 'LI') {
+ return e2.style.listStyleType === 'none' || containsOnlyAList(e2);
+ } else if (isList(e1)) {
+ return (e1.tagName === e2.tagName && (allowDifferentListStyles || e1.style.listStyleType === e2.style.listStyleType)) || isListForIndent(e2);
+ } else return mergeParagraphs && e1.tagName === 'P' && e2.tagName === 'P';
+ }
+
+ function isListForIndent(e) {
+ var firstLI = skipWhitespaceNodesForwards(e.firstChild), lastLI = skipWhitespaceNodesBackwards(e.lastChild);
+ return firstLI && lastLI && isList(e) && firstLI === lastLI && (isList(firstLI) || firstLI.style.listStyleType === 'none' || containsOnlyAList(firstLI));
+ }
+
+ function containsOnlyAList(e) {
+ var firstChild = skipWhitespaceNodesForwards(e.firstChild), lastChild = skipWhitespaceNodesBackwards(e.lastChild);
+ return firstChild && lastChild && firstChild === lastChild && isList(firstChild);
+ }
+
+ function merge(e1, e2, masterElement) {
+ var lastOriginal = skipWhitespaceNodesBackwards(e1.lastChild), firstNew = skipWhitespaceNodesForwards(e2.firstChild);
+ if (e1.tagName === 'P') {
+ e1.appendChild(e1.ownerDocument.createElement('br'));
+ }
+ while (e2.firstChild) {
+ e1.appendChild(e2.firstChild);
+ }
+ if (masterElement) {
+ e1.style.listStyleType = masterElement.style.listStyleType;
+ }
+ e2.parentNode.removeChild(e2);
+ attemptMerge(lastOriginal, firstNew, false);
+ return e1;
+ }
+
+ function findItemToOperateOn(e, dom) {
+ var item;
+ if (!dom.is(e, 'li,ol,ul')) {
+ item = dom.getParent(e, 'li');
+ if (item) {
+ e = item;
+ }
+ }
+ return e;
+ }
+
+ tinymce.create('tinymce.plugins.Lists', {
+ init: function(ed) {
+ var LIST_TABBING = 'TABBING';
+ var LIST_EMPTY_ITEM = 'EMPTY';
+ var LIST_ESCAPE = 'ESCAPE';
+ var LIST_PARAGRAPH = 'PARAGRAPH';
+ var LIST_UNKNOWN = 'UNKNOWN';
+ var state = LIST_UNKNOWN;
+
+ function isTabInList(e) {
+ // Don't indent on Ctrl+Tab or Alt+Tab
+ return e.keyCode === tinymce.VK.TAB && !(e.altKey || e.ctrlKey) &&
+ (ed.queryCommandState('InsertUnorderedList') || ed.queryCommandState('InsertOrderedList'));
+ }
+
+ function isOnLastListItem() {
+ var li = getLi();
+ var grandParent = li.parentNode.parentNode;
+ var isLastItem = li.parentNode.lastChild === li;
+ return isLastItem && !isNestedList(grandParent) && isEmptyListItem(li);
+ }
+
+ function isNestedList(grandParent) {
+ if (isList(grandParent)) {
+ return grandParent.parentNode && grandParent.parentNode.tagName === 'LI';
+ } else {
+ return grandParent.tagName === 'LI';
+ }
+ }
+
+ function isInEmptyListItem() {
+ return ed.selection.isCollapsed() && isEmptyListItem(getLi());
+ }
+
+ function getLi() {
+ var n = ed.selection.getStart();
+ // Get start will return BR if the LI only contains a BR or an empty element as we use these to fix caret position
+ return ((n.tagName == 'BR' || n.tagName == '') && n.parentNode.tagName == 'LI') ? n.parentNode : n;
+ }
+
+ function isEmptyListItem(li) {
+ var numChildren = li.childNodes.length;
+ if (li.tagName === 'LI') {
+ return numChildren == 0 ? true : numChildren == 1 && (li.firstChild.tagName == '' || li.firstChild.tagName == 'BR' || isEmptyIE9Li(li));
+ }
+ return false;
+ }
+
+ function isEmptyIE9Li(li) {
+ // only consider this to be last item if there is no list item content or that content is nbsp or space since IE9 creates these
+ var lis = tinymce.grep(li.parentNode.childNodes, function(n) {return n.tagName == 'LI'});
+ var isLastLi = li == lis[lis.length - 1];
+ var child = li.firstChild;
+ return tinymce.isIE9 && isLastLi && (child.nodeValue == String.fromCharCode(160) || child.nodeValue == String.fromCharCode(32));
+ }
+
+ function isEnter(e) {
+ return e.keyCode === tinymce.VK.ENTER;
+ }
+
+ function isEnterWithoutShift(e) {
+ return isEnter(e) && !e.shiftKey;
+ }
+
+ function getListKeyState(e) {
+ if (isTabInList(e)) {
+ return LIST_TABBING;
+ } else if (isEnterWithoutShift(e) && isOnLastListItem()) {
+ // Returns LIST_UNKNOWN since breaking out of lists is handled by the EnterKey.js logic now
+ //return LIST_ESCAPE;
+ return LIST_UNKNOWN;
+ } else if (isEnterWithoutShift(e) && isInEmptyListItem()) {
+ return LIST_EMPTY_ITEM;
+ } else {
+ return LIST_UNKNOWN;
+ }
+ }
+
+ function cancelDefaultEvents(ed, e) {
+ // list escape is done manually using outdent as it does not create paragraphs correctly in td's
+ if (state == LIST_TABBING || state == LIST_EMPTY_ITEM || tinymce.isGecko && state == LIST_ESCAPE) {
+ Event.cancel(e);
+ }
+ }
+
+ function isCursorAtEndOfContainer() {
+ var range = ed.selection.getRng(true);
+ var startContainer = range.startContainer;
+ if (startContainer.nodeType == 3) {
+ var value = startContainer.nodeValue;
+ if (tinymce.isIE9 && value.length > 1 && value.charCodeAt(value.length-1) == 32) {
+ // IE9 places a space on the end of the text in some cases so ignore last char
+ return (range.endOffset == value.length-1);
+ } else {
+ return (range.endOffset == value.length);
+ }
+ } else if (startContainer.nodeType == 1) {
+ return range.endOffset == startContainer.childNodes.length;
+ }
+ return false;
+ }
+
+ /*
+ If we are at the end of a list item surrounded with an element, pressing enter should create a
+ new list item instead without splitting the element e.g. don't want to create new P or H1 tag
+ */
+ function isEndOfListItem() {
+ var node = ed.selection.getNode();
+ var validElements = 'h1,h2,h3,h4,h5,h6,p,div';
+ var isLastParagraphOfLi = ed.dom.is(node, validElements) && node.parentNode.tagName === 'LI' && node.parentNode.lastChild === node;
+ return ed.selection.isCollapsed() && isLastParagraphOfLi && isCursorAtEndOfContainer();
+ }
+
+ // Creates a new list item after the current selection's list item parent
+ function createNewLi(ed, e) {
+ if (isEnterWithoutShift(e) && isEndOfListItem()) {
+ var node = ed.selection.getNode();
+ var li = ed.dom.create("li");
+ var parentLi = ed.dom.getParent(node, 'li');
+ ed.dom.insertAfter(li, parentLi);
+
+ // Move caret to new list element.
+ if (tinymce.isIE6 || tinymce.isIE7 || tinyMCE.isIE8) {
+ // Removed this line since it would create an odd < > tag and placing the caret inside an empty LI is handled and should be handled by the selection logic
+ //li.appendChild(ed.dom.create(" ")); // IE needs an element within the bullet point
+ ed.selection.setCursorLocation(li, 1);
+ } else {
+ ed.selection.setCursorLocation(li, 0);
+ }
+ e.preventDefault();
+ }
+ }
+
+ function imageJoiningListItem(ed, e) {
+ var prevSibling;
+
+ if (!tinymce.isGecko)
+ return;
+
+ var n = ed.selection.getStart();
+ if (e.keyCode != tinymce.VK.BACKSPACE || n.tagName !== 'IMG')
+ return;
+
+ function lastLI(node) {
+ var child = node.firstChild;
+ var li = null;
+ do {
+ if (!child)
+ break;
+
+ if (child.tagName === 'LI')
+ li = child;
+ } while (child = child.nextSibling);
+
+ return li;
+ }
+
+ function addChildren(parentNode, destination) {
+ while (parentNode.childNodes.length > 0)
+ destination.appendChild(parentNode.childNodes[0]);
+ }
+
+ // Check if there is a previous sibling
+ prevSibling = n.parentNode.previousSibling;
+ if (!prevSibling)
+ return;
+
+ var ul;
+ if (prevSibling.tagName === 'UL' || prevSibling.tagName === 'OL')
+ ul = prevSibling;
+ else if (prevSibling.previousSibling && (prevSibling.previousSibling.tagName === 'UL' || prevSibling.previousSibling.tagName === 'OL'))
+ ul = prevSibling.previousSibling;
+ else
+ return;
+
+ var li = lastLI(ul);
+
+ // move the caret to the end of the list item
+ var rng = ed.dom.createRng();
+ rng.setStart(li, 1);
+ rng.setEnd(li, 1);
+ ed.selection.setRng(rng);
+ ed.selection.collapse(true);
+
+ // save a bookmark at the end of the list item
+ var bookmark = ed.selection.getBookmark();
+
+ // copy the image an its text to the list item
+ var clone = n.parentNode.cloneNode(true);
+ if (clone.tagName === 'P' || clone.tagName === 'DIV')
+ addChildren(clone, li);
+ else
+ li.appendChild(clone);
+
+ // remove the old copy of the image
+ n.parentNode.parentNode.removeChild(n.parentNode);
+
+ // move the caret where we saved the bookmark
+ ed.selection.moveToBookmark(bookmark);
+ }
+
+ // fix the cursor position to ensure it is correct in IE
+ function setCursorPositionToOriginalLi(li) {
+ var list = ed.dom.getParent(li, 'ol,ul');
+ if (list != null) {
+ var lastLi = list.lastChild;
+ // Removed this line since IE9 would report an DOM character error and placing the caret inside an empty LI is handled and should be handled by the selection logic
+ //lastLi.appendChild(ed.getDoc().createElement(''));
+ ed.selection.setCursorLocation(lastLi, 0);
+ }
+ }
+
+ this.ed = ed;
+ ed.addCommand('Indent', this.indent, this);
+ ed.addCommand('Outdent', this.outdent, this);
+ ed.addCommand('InsertUnorderedList', function() {
+ this.applyList('UL', 'OL');
+ }, this);
+ ed.addCommand('InsertOrderedList', function() {
+ this.applyList('OL', 'UL');
+ }, this);
+
+ ed.onInit.add(function() {
+ ed.editorCommands.addCommands({
+ 'outdent': function() {
+ var sel = ed.selection, dom = ed.dom;
+
+ function hasStyleIndent(n) {
+ n = dom.getParent(n, dom.isBlock);
+ return n && (parseInt(ed.dom.getStyle(n, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(n, 'padding-left') || 0, 10)) > 0;
+ }
+
+ return hasStyleIndent(sel.getStart()) || hasStyleIndent(sel.getEnd()) || ed.queryCommandState('InsertOrderedList') || ed.queryCommandState('InsertUnorderedList');
+ }
+ }, 'state');
+ });
+
+ ed.onKeyUp.add(function(ed, e) {
+ if (state == LIST_TABBING) {
+ ed.execCommand(e.shiftKey ? 'Outdent' : 'Indent', true, null);
+ state = LIST_UNKNOWN;
+ return Event.cancel(e);
+ } else if (state == LIST_EMPTY_ITEM) {
+ var li = getLi();
+ var shouldOutdent = ed.settings.list_outdent_on_enter === true || e.shiftKey;
+ ed.execCommand(shouldOutdent ? 'Outdent' : 'Indent', true, null);
+ if (tinymce.isIE) {
+ setCursorPositionToOriginalLi(li);
+ }
+
+ return Event.cancel(e);
+ } else if (state == LIST_ESCAPE) {
+ if (tinymce.isIE6 || tinymce.isIE7 || tinymce.isIE8) {
+ // append a zero sized nbsp so that caret is positioned correctly in IE after escaping and applying formatting.
+ // if there is no text then applying formatting for e.g a H1 to the P tag immediately following list after
+ // escaping from it will cause the caret to be positioned on the last li instead of staying the in P tag.
+ var n = ed.getDoc().createTextNode('\uFEFF');
+ ed.selection.getNode().appendChild(n);
+ } else if (tinymce.isIE9 || tinymce.isGecko) {
+ // IE9 does not escape the list so we use outdent to do this and cancel the default behaviour
+ // Gecko does not create a paragraph outdenting inside a TD so default behaviour is cancelled and we outdent ourselves
+ ed.execCommand('Outdent');
+ return Event.cancel(e);
+ }
+ }
+ });
+
+ function fixListItem(parent, reference) {
+ // a zero-sized non-breaking space is placed in the empty list item so that the nested list is
+ // displayed on the below line instead of next to it
+ var n = ed.getDoc().createTextNode('\uFEFF');
+ parent.insertBefore(n, reference);
+ ed.selection.setCursorLocation(n, 0);
+ // repaint to remove rendering artifact. only visible when creating new list
+ ed.execCommand('mceRepaint');
+ }
+
+ function fixIndentedListItemForGecko(ed, e) {
+ if (isEnter(e)) {
+ var li = getLi();
+ if (li) {
+ var parent = li.parentNode;
+ var grandParent = parent && parent.parentNode;
+ if (grandParent && grandParent.nodeName == 'LI' && grandParent.firstChild == parent && li == parent.firstChild) {
+ fixListItem(grandParent, parent);
+ }
+ }
+ }
+ }
+
+ function fixIndentedListItemForIE8(ed, e) {
+ if (isEnter(e)) {
+ var li = getLi();
+ if (ed.dom.select('ul li', li).length === 1) {
+ var list = li.firstChild;
+ fixListItem(li, list);
+ }
+ }
+ }
+
+ function fixDeletingFirstCharOfList(ed, e) {
+ function listElements(li) {
+ var elements = [];
+ var walker = new tinymce.dom.TreeWalker(li.firstChild, li);
+ for (var node = walker.current(); node; node = walker.next()) {
+ if (ed.dom.is(node, 'ol,ul,li')) {
+ elements.push(node);
+ }
+ }
+ return elements;
+ }
+
+ if (e.keyCode == tinymce.VK.BACKSPACE) {
+ var li = getLi();
+ if (li) {
+ var list = ed.dom.getParent(li, 'ol,ul'),
+ rng = ed.selection.getRng();
+ if (list && list.firstChild === li && rng.startOffset == 0) {
+ var elements = listElements(li);
+ elements.unshift(li);
+ ed.execCommand("Outdent", false, elements);
+ ed.undoManager.add();
+ return Event.cancel(e);
+ }
+ }
+ }
+ }
+
+ function fixDeletingEmptyLiInWebkit(ed, e) {
+ var li = getLi();
+ if (e.keyCode === tinymce.VK.BACKSPACE && ed.dom.is(li, 'li') && li.parentNode.firstChild!==li) {
+ if (ed.dom.select('ul,ol', li).length === 1) {
+ var prevLi = li.previousSibling;
+ ed.dom.remove(ed.dom.select('br', li));
+ ed.dom.remove(li, true);
+ var textNodes = tinymce.grep(prevLi.childNodes, function(n){ return n.nodeType === 3 });
+ if (textNodes.length === 1) {
+ var textNode = textNodes[0];
+ ed.selection.setCursorLocation(textNode, textNode.length);
+ }
+ ed.undoManager.add();
+ return Event.cancel(e);
+ }
+ }
+ }
+
+ ed.onKeyDown.add(function(_, e) { state = getListKeyState(e); });
+ ed.onKeyDown.add(cancelDefaultEvents);
+ ed.onKeyDown.add(imageJoiningListItem);
+ ed.onKeyDown.add(createNewLi);
+
+ if (tinymce.isGecko) {
+ ed.onKeyUp.add(fixIndentedListItemForGecko);
+ }
+ if (tinymce.isIE8) {
+ ed.onKeyUp.add(fixIndentedListItemForIE8);
+ }
+ if (tinymce.isGecko || tinymce.isWebKit) {
+ ed.onKeyDown.add(fixDeletingFirstCharOfList);
+ }
+ if (tinymce.isWebKit) {
+ ed.onKeyDown.add(fixDeletingEmptyLiInWebkit);
+ }
+ },
+
+ applyList: function(targetListType, oppositeListType) {
+ var t = this, ed = t.ed, dom = ed.dom, applied = [], hasSameType = false, hasOppositeType = false, hasNonList = false, actions,
+ selectedBlocks = ed.selection.getSelectedBlocks();
+
+ function cleanupBr(e) {
+ if (e && e.tagName === 'BR') {
+ dom.remove(e);
+ }
+ }
+
+ function makeList(element) {
+ var list = dom.create(targetListType), li;
+
+ function adjustIndentForNewList(element) {
+ // If there's a margin-left, outdent one level to account for the extra list margin.
+ if (element.style.marginLeft || element.style.paddingLeft) {
+ t.adjustPaddingFunction(false)(element);
+ }
+ }
+
+ if (element.tagName === 'LI') {
+ // No change required.
+ } else if (element.tagName === 'P' || element.tagName === 'DIV' || element.tagName === 'BODY') {
+ processBrs(element, function(startSection, br) {
+ doWrapList(startSection, br, element.tagName === 'BODY' ? null : startSection.parentNode);
+ li = startSection.parentNode;
+ adjustIndentForNewList(li);
+ cleanupBr(br);
+ });
+ if (li) {
+ if (li.tagName === 'LI' && (element.tagName === 'P' || selectedBlocks.length > 1)) {
+ dom.split(li.parentNode.parentNode, li.parentNode);
+ }
+ attemptMergeWithAdjacent(li.parentNode, true);
+ }
+ return;
+ } else {
+ // Put the list around the element.
+ li = dom.create('li');
+ dom.insertAfter(li, element);
+ li.appendChild(element);
+ adjustIndentForNewList(element);
+ element = li;
+ }
+ dom.insertAfter(list, element);
+ list.appendChild(element);
+ attemptMergeWithAdjacent(list, true);
+ applied.push(element);
+ }
+
+ function doWrapList(start, end, template) {
+ var li, n = start, tmp;
+ while (!dom.isBlock(start.parentNode) && start.parentNode !== dom.getRoot()) {
+ start = dom.split(start.parentNode, start.previousSibling);
+ start = start.nextSibling;
+ n = start;
+ }
+ if (template) {
+ li = template.cloneNode(true);
+ start.parentNode.insertBefore(li, start);
+ while (li.firstChild) dom.remove(li.firstChild);
+ li = dom.rename(li, 'li');
+ } else {
+ li = dom.create('li');
+ start.parentNode.insertBefore(li, start);
+ }
+ while (n && n != end) {
+ tmp = n.nextSibling;
+ li.appendChild(n);
+ n = tmp;
+ }
+ if (li.childNodes.length === 0) {
+ li.innerHTML = '
';
+ }
+ makeList(li);
+ }
+
+ function processBrs(element, callback) {
+ var startSection, previousBR, END_TO_START = 3, START_TO_END = 1,
+ breakElements = 'br,ul,ol,p,div,h1,h2,h3,h4,h5,h6,table,blockquote,address,pre,form,center,dl';
+
+ function isAnyPartSelected(start, end) {
+ var r = dom.createRng(), sel;
+ bookmark.keep = true;
+ ed.selection.moveToBookmark(bookmark);
+ bookmark.keep = false;
+ sel = ed.selection.getRng(true);
+ if (!end) {
+ end = start.parentNode.lastChild;
+ }
+ r.setStartBefore(start);
+ r.setEndAfter(end);
+ return !(r.compareBoundaryPoints(END_TO_START, sel) > 0 || r.compareBoundaryPoints(START_TO_END, sel) <= 0);
+ }
+
+ function nextLeaf(br) {
+ if (br.nextSibling)
+ return br.nextSibling;
+ if (!dom.isBlock(br.parentNode) && br.parentNode !== dom.getRoot())
+ return nextLeaf(br.parentNode);
+ }
+
+ // Split on BRs within the range and process those.
+ startSection = element.firstChild;
+ // First mark the BRs that have any part of the previous section selected.
+ var trailingContentSelected = false;
+ each(dom.select(breakElements, element), function(br) {
+ if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
+ return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
+ }
+ if (isAnyPartSelected(startSection, br)) {
+ dom.addClass(br, '_mce_tagged_br');
+ startSection = nextLeaf(br);
+ }
+ });
+ trailingContentSelected = (startSection && isAnyPartSelected(startSection, undefined));
+ startSection = element.firstChild;
+ each(dom.select(breakElements, element), function(br) {
+ // Got a section from start to br.
+ var tmp = nextLeaf(br);
+ if (br.hasAttribute && br.hasAttribute('_mce_bogus')) {
+ return true; // Skip the bogus Brs that are put in to appease Firefox and Safari.
+ }
+ if (dom.hasClass(br, '_mce_tagged_br')) {
+ callback(startSection, br, previousBR);
+ previousBR = null;
+ } else {
+ previousBR = br;
+ }
+ startSection = tmp;
+ });
+ if (trailingContentSelected) {
+ callback(startSection, undefined, previousBR);
+ }
+ }
+
+ function wrapList(element) {
+ processBrs(element, function(startSection, br, previousBR) {
+ // Need to indent this part
+ doWrapList(startSection, br);
+ cleanupBr(br);
+ cleanupBr(previousBR);
+ });
+ }
+
+ function changeList(element) {
+ if (tinymce.inArray(applied, element) !== -1) {
+ return;
+ }
+ if (element.parentNode.tagName === oppositeListType) {
+ dom.split(element.parentNode, element);
+ makeList(element);
+ attemptMergeWithNext(element.parentNode, false);
+ }
+ applied.push(element);
+ }
+
+ function convertListItemToParagraph(element) {
+ var child, nextChild, mergedElement, splitLast;
+ if (tinymce.inArray(applied, element) !== -1) {
+ return;
+ }
+ element = splitNestedLists(element, dom);
+ while (dom.is(element.parentNode, 'ol,ul,li')) {
+ dom.split(element.parentNode, element);
+ }
+ // Push the original element we have from the selection, not the renamed one.
+ applied.push(element);
+ element = dom.rename(element, 'p');
+ mergedElement = attemptMergeWithAdjacent(element, false, ed.settings.force_br_newlines);
+ if (mergedElement === element) {
+ // Now split out any block elements that can't be contained within a P.
+ // Manually iterate to ensure we handle modifications correctly (doesn't work with tinymce.each)
+ child = element.firstChild;
+ while (child) {
+ if (dom.isBlock(child)) {
+ child = dom.split(child.parentNode, child);
+ splitLast = true;
+ nextChild = child.nextSibling && child.nextSibling.firstChild;
+ } else {
+ nextChild = child.nextSibling;
+ if (splitLast && child.tagName === 'BR') {
+ dom.remove(child);
+ }
+ splitLast = false;
+ }
+ child = nextChild;
+ }
+ }
+ }
+
+ each(selectedBlocks, function(e) {
+ e = findItemToOperateOn(e, dom);
+ if (e.tagName === oppositeListType || (e.tagName === 'LI' && e.parentNode.tagName === oppositeListType)) {
+ hasOppositeType = true;
+ } else if (e.tagName === targetListType || (e.tagName === 'LI' && e.parentNode.tagName === targetListType)) {
+ hasSameType = true;
+ } else {
+ hasNonList = true;
+ }
+ });
+
+ if (hasNonList &&!hasSameType || hasOppositeType || selectedBlocks.length === 0) {
+ actions = {
+ 'LI': changeList,
+ 'H1': makeList,
+ 'H2': makeList,
+ 'H3': makeList,
+ 'H4': makeList,
+ 'H5': makeList,
+ 'H6': makeList,
+ 'P': makeList,
+ 'BODY': makeList,
+ 'DIV': selectedBlocks.length > 1 ? makeList : wrapList,
+ defaultAction: wrapList,
+ elements: this.selectedBlocks()
+ };
+ } else {
+ actions = {
+ defaultAction: convertListItemToParagraph,
+ elements: this.selectedBlocks(),
+ processEvenIfEmpty: true
+ };
+ }
+ this.process(actions);
+ },
+
+ indent: function() {
+ var ed = this.ed, dom = ed.dom, indented = [];
+
+ function createWrapItem(element) {
+ var wrapItem = dom.create('li', { style: 'list-style-type: none;'});
+ dom.insertAfter(wrapItem, element);
+ return wrapItem;
+ }
+
+ function createWrapList(element) {
+ var wrapItem = createWrapItem(element),
+ list = dom.getParent(element, 'ol,ul'),
+ listType = list.tagName,
+ listStyle = dom.getStyle(list, 'list-style-type'),
+ attrs = {},
+ wrapList;
+ if (listStyle !== '') {
+ attrs.style = 'list-style-type: ' + listStyle + ';';
+ }
+ wrapList = dom.create(listType, attrs);
+ wrapItem.appendChild(wrapList);
+ return wrapList;
+ }
+
+ function indentLI(element) {
+ if (!hasParentInList(ed, element, indented)) {
+ element = splitNestedLists(element, dom);
+ var wrapList = createWrapList(element);
+ wrapList.appendChild(element);
+ attemptMergeWithAdjacent(wrapList.parentNode, false);
+ attemptMergeWithAdjacent(wrapList, false);
+ indented.push(element);
+ }
+ }
+
+ this.process({
+ 'LI': indentLI,
+ defaultAction: this.adjustPaddingFunction(true),
+ elements: this.selectedBlocks()
+ });
+
+ },
+
+ outdent: function(ui, elements) {
+ var t = this, ed = t.ed, dom = ed.dom, outdented = [];
+
+ function outdentLI(element) {
+ var listElement, targetParent, align;
+ if (!hasParentInList(ed, element, outdented)) {
+ if (dom.getStyle(element, 'margin-left') !== '' || dom.getStyle(element, 'padding-left') !== '') {
+ return t.adjustPaddingFunction(false)(element);
+ }
+ align = dom.getStyle(element, 'text-align', true);
+ if (align === 'center' || align === 'right') {
+ dom.setStyle(element, 'text-align', 'left');
+ return;
+ }
+ element = splitNestedLists(element, dom);
+ listElement = element.parentNode;
+ targetParent = element.parentNode.parentNode;
+ if (targetParent.tagName === 'P') {
+ dom.split(targetParent, element.parentNode);
+ } else {
+ dom.split(listElement, element);
+ if (targetParent.tagName === 'LI') {
+ // Nested list, need to split the LI and go back out to the OL/UL element.
+ dom.split(targetParent, element);
+ } else if (!dom.is(targetParent, 'ol,ul')) {
+ dom.rename(element, 'p');
+ }
+ }
+ outdented.push(element);
+ }
+ }
+
+ var listElements = elements && tinymce.is(elements, 'array') ? elements : this.selectedBlocks();
+ this.process({
+ 'LI': outdentLI,
+ defaultAction: this.adjustPaddingFunction(false),
+ elements: listElements
+ });
+
+ each(outdented, attemptMergeWithAdjacent);
+ },
+
+ process: function(actions) {
+ var t = this, sel = t.ed.selection, dom = t.ed.dom, selectedBlocks, r;
+
+ function isEmptyElement(element) {
+ var excludeBrsAndBookmarks = tinymce.grep(element.childNodes, function(n) {
+ return !(n.nodeName === 'BR' || n.nodeName === 'SPAN' && dom.getAttrib(n, 'data-mce-type') == 'bookmark'
+ || n.nodeType == 3 && (n.nodeValue == String.fromCharCode(160) || n.nodeValue == ''));
+ });
+ return excludeBrsAndBookmarks.length === 0;
+ }
+
+ function processElement(element) {
+ dom.removeClass(element, '_mce_act_on');
+ if (!element || element.nodeType !== 1 || ! actions.processEvenIfEmpty && selectedBlocks.length > 1 && isEmptyElement(element)) {
+ return;
+ }
+ element = findItemToOperateOn(element, dom);
+ var action = actions[element.tagName];
+ if (!action) {
+ action = actions.defaultAction;
+ }
+ action(element);
+ }
+
+ function recurse(element) {
+ t.splitSafeEach(element.childNodes, processElement, true);
+ }
+
+ function brAtEdgeOfSelection(container, offset) {
+ return offset >= 0 && container.hasChildNodes() && offset < container.childNodes.length &&
+ container.childNodes[offset].tagName === 'BR';
+ }
+
+ function isInTable() {
+ var n = sel.getNode();
+ var p = dom.getParent(n, 'td');
+ return p !== null;
+ }
+
+ selectedBlocks = actions.elements;
+
+ r = sel.getRng(true);
+ if (!r.collapsed) {
+ if (brAtEdgeOfSelection(r.endContainer, r.endOffset - 1)) {
+ r.setEnd(r.endContainer, r.endOffset - 1);
+ sel.setRng(r);
+ }
+ if (brAtEdgeOfSelection(r.startContainer, r.startOffset)) {
+ r.setStart(r.startContainer, r.startOffset + 1);
+ sel.setRng(r);
+ }
+ }
+
+
+ if (tinymce.isIE8) {
+ // append a zero sized nbsp so that caret is restored correctly using bookmark
+ var s = t.ed.selection.getNode();
+ if (s.tagName === 'LI' && !(s.parentNode.lastChild === s)) {
+ var i = t.ed.getDoc().createTextNode('\uFEFF');
+ s.appendChild(i);
+ }
+ }
+
+ bookmark = sel.getBookmark();
+ actions.OL = actions.UL = recurse;
+ t.splitSafeEach(selectedBlocks, processElement);
+ sel.moveToBookmark(bookmark);
+ bookmark = null;
+
+ // we avoid doing repaint in a table as this will move the caret out of the table in Firefox 3.6
+ if (!isInTable()) {
+ // Avoids table or image handles being left behind in Firefox.
+ t.ed.execCommand('mceRepaint');
+ }
+ },
+
+ splitSafeEach: function(elements, f, forceClassBase) {
+ if (forceClassBase ||
+ (tinymce.isGecko &&
+ (/Firefox\/[12]\.[0-9]/.test(navigator.userAgent) ||
+ /Firefox\/3\.[0-4]/.test(navigator.userAgent)))) {
+ this.classBasedEach(elements, f);
+ } else {
+ each(elements, f);
+ }
+ },
+
+ classBasedEach: function(elements, f) {
+ var dom = this.ed.dom, nodes, element;
+ // Mark nodes
+ each(elements, function(element) {
+ dom.addClass(element, '_mce_act_on');
+ });
+ nodes = dom.select('._mce_act_on');
+ while (nodes.length > 0) {
+ element = nodes.shift();
+ dom.removeClass(element, '_mce_act_on');
+ f(element);
+ nodes = dom.select('._mce_act_on');
+ }
+ },
+
+ adjustPaddingFunction: function(isIndent) {
+ var indentAmount, indentUnits, ed = this.ed;
+ indentAmount = ed.settings.indentation;
+ indentUnits = /[a-z%]+/i.exec(indentAmount);
+ indentAmount = parseInt(indentAmount, 10);
+ return function(element) {
+ var currentIndent, newIndentAmount;
+ currentIndent = parseInt(ed.dom.getStyle(element, 'margin-left') || 0, 10) + parseInt(ed.dom.getStyle(element, 'padding-left') || 0, 10);
+ if (isIndent) {
+ newIndentAmount = currentIndent + indentAmount;
+ } else {
+ newIndentAmount = currentIndent - indentAmount;
+ }
+ ed.dom.setStyle(element, 'padding-left', '');
+ ed.dom.setStyle(element, 'margin-left', newIndentAmount > 0 ? newIndentAmount + indentUnits : '');
+ };
+ },
+
+ selectedBlocks: function() {
+ var ed = this.ed, selectedBlocks = ed.selection.getSelectedBlocks();
+ return selectedBlocks.length == 0 ? [ ed.dom.getRoot() ] : selectedBlocks;
+ },
+
+ getInfo: function() {
+ return {
+ longname : 'Lists',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/lists',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+ tinymce.PluginManager.add("lists", tinymce.plugins.Lists);
+}());
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/css/media.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/css/media.css
new file mode 100644
index 0000000..0c45c7f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/css/media.css
@@ -0,0 +1,17 @@
+#id, #name, #hspace, #vspace, #class_name, #align { width: 100px }
+#hspace, #vspace { width: 50px }
+#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px }
+#flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px }
+#width, #height { width: 40px }
+#src, #media_type { width: 250px }
+#class { width: 120px }
+#prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto }
+.panel_wrapper div.current { height: 420px; overflow: auto }
+#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none }
+.mceAddSelectValue { background-color: #DDDDDD }
+#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px }
+#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px }
+#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px }
+#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px }
+#qt_qtsrc { width: 200px }
+iframe {border: 1px solid gray}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js
new file mode 100644
index 0000000..9ac42e0
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var b=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),a=tinymce.makeMap(b.join(",")),f=tinymce.html.Node,d,i,h=tinymce.util.JSON,g;d=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"],["EmbeddedAudio"],["Audio"]];function e(j){return typeof(j)=="string"?j.replace(/[^0-9%]/g,""):j}function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(s){return s&&s.nodeName==="IMG"&&n.dom.hasClass(s,"mceItemMedia")}r.editor=n;r.url=j;i="";for(m=0;m0){O+=(O?"&":"")+P+"="+escape(Q)}});if(O.length){G.params.flashvars=O}L=p.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(L,function(Q,P){G.params[P]=""+Q})}}G=z.attr("data-mce-json");if(!G){return}G=h.parse(G);q=this.getType(z.attr("class"));B=z.attr("data-mce-style");if(!B){B=z.attr("style");if(B){B=p.dom.serializeStyle(p.dom.parseStyle(B,"img"))}}G.width=z.attr("width")||G.width;G.height=z.attr("height")||G.height;if(q.name==="Iframe"){x=new f("iframe",1);tinymce.each(b,function(n){var J=z.attr(n);if(n=="class"&&J){J=J.replace(/mceItem.+ ?/g,"")}if(J&&J.length>0){x.attr(n,J)}});for(I in G.params){x.attr(I,G.params[I])}x.attr({style:B,src:G.params.src});z.replace(x);return}if(this.editor.settings.media_use_script){x=new f("script",1).attr("type","text/javascript");y=new f("#text",3);y.value="write"+q.name+"("+h.serialize(tinymce.extend(G.params,{width:z.attr("width"),height:z.attr("height")}))+");";x.append(y);z.replace(x);return}if(q.name==="Video"&&G.video.sources[0]){C=new f("video",1).attr(tinymce.extend({id:z.attr("id"),width:e(z.attr("width")),height:e(z.attr("height")),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);for(A=0;A 0)
+ flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value);
+ });
+
+ if (flashVarsOutput.length)
+ data.params.flashvars = flashVarsOutput;
+
+ params = editor.getParam('flash_video_player_params', {
+ allowfullscreen: true,
+ allowscriptaccess: true
+ });
+
+ tinymce.each(params, function(value, name) {
+ data.params[name] = "" + value;
+ });
+ }
+ };
+
+ data = node.attr('data-mce-json');
+ if (!data)
+ return;
+
+ data = JSON.parse(data);
+ typeItem = this.getType(node.attr('class'));
+
+ style = node.attr('data-mce-style');
+ if (!style) {
+ style = node.attr('style');
+
+ if (style)
+ style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img'));
+ }
+
+ // Use node width/height to override the data width/height when the placeholder is resized
+ data.width = node.attr('width') || data.width;
+ data.height = node.attr('height') || data.height;
+
+ // Handle iframe
+ if (typeItem.name === 'Iframe') {
+ replacement = new Node('iframe', 1);
+
+ tinymce.each(rootAttributes, function(name) {
+ var value = node.attr(name);
+
+ if (name == 'class' && value)
+ value = value.replace(/mceItem.+ ?/g, '');
+
+ if (value && value.length > 0)
+ replacement.attr(name, value);
+ });
+
+ for (name in data.params)
+ replacement.attr(name, data.params[name]);
+
+ replacement.attr({
+ style: style,
+ src: data.params.src
+ });
+
+ node.replace(replacement);
+
+ return;
+ }
+
+ // Handle scripts
+ if (this.editor.settings.media_use_script) {
+ replacement = new Node('script', 1).attr('type', 'text/javascript');
+
+ value = new Node('#text', 3);
+ value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, {
+ width: node.attr('width'),
+ height: node.attr('height')
+ })) + ');';
+
+ replacement.append(value);
+ node.replace(replacement);
+
+ return;
+ }
+
+ // Add HTML5 video element
+ if (typeItem.name === 'Video' && data.video.sources[0]) {
+ // Create new object element
+ video = new Node('video', 1).attr(tinymce.extend({
+ id : node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style
+ }, data.video.attrs));
+
+ // Get poster source and use that for flash fallback
+ if (data.video.attrs)
+ posterSrc = data.video.attrs.poster;
+
+ sources = data.video.sources = toArray(data.video.sources);
+ for (i = 0; i < sources.length; i++) {
+ if (/\.mp4$/.test(sources[i].src))
+ mp4Source = sources[i].src;
+ }
+
+ if (!sources[0].type) {
+ video.attr('src', sources[0].src);
+ sources.splice(0, 1);
+ }
+
+ for (i = 0; i < sources.length; i++) {
+ source = new Node('source', 1).attr(sources[i]);
+ source.shortEnded = true;
+ video.append(source);
+ }
+
+ // Create flash fallback for video if we have a mp4 source
+ if (mp4Source) {
+ addPlayer(mp4Source, posterSrc);
+ typeItem = self.getType('flash');
+ } else
+ data.params.src = '';
+ }
+
+ // Add HTML5 audio element
+ if (typeItem.name === 'Audio' && data.video.sources[0]) {
+ // Create new object element
+ audio = new Node('audio', 1).attr(tinymce.extend({
+ id : node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style
+ }, data.video.attrs));
+
+ // Get poster source and use that for flash fallback
+ if (data.video.attrs)
+ posterSrc = data.video.attrs.poster;
+
+ sources = data.video.sources = toArray(data.video.sources);
+ if (!sources[0].type) {
+ audio.attr('src', sources[0].src);
+ sources.splice(0, 1);
+ }
+
+ for (i = 0; i < sources.length; i++) {
+ source = new Node('source', 1).attr(sources[i]);
+ source.shortEnded = true;
+ audio.append(source);
+ }
+
+ data.params.src = '';
+ }
+
+ if (typeItem.name === 'EmbeddedAudio') {
+ embed = new Node('embed', 1);
+ embed.shortEnded = true;
+ embed.attr({
+ id: node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style,
+ type: node.attr('type')
+ });
+
+ for (name in data.params)
+ embed.attr(name, data.params[name]);
+
+ tinymce.each(rootAttributes, function(name) {
+ if (data[name] && name != 'type')
+ embed.attr(name, data[name]);
+ });
+
+ data.params.src = '';
+ }
+
+ // Do we have a params src then we can generate object
+ if (data.params.src) {
+ // Is flv movie add player for it
+ if (/\.flv$/i.test(data.params.src))
+ addPlayer(data.params.src, '');
+
+ if (args && args.force_absolute)
+ data.params.src = editor.documentBaseURI.toAbsolute(data.params.src);
+
+ // Create new object element
+ object = new Node('object', 1).attr({
+ id : node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style
+ });
+
+ tinymce.each(rootAttributes, function(name) {
+ var value = data[name];
+
+ if (name == 'class' && value)
+ value = value.replace(/mceItem.+ ?/g, '');
+
+ if (value && name != 'type')
+ object.attr(name, value);
+ });
+
+ // Add params
+ for (name in data.params) {
+ param = new Node('param', 1);
+ param.shortEnded = true;
+ value = data.params[name];
+
+ // Windows media needs to use url instead of src for the media URL
+ if (name === 'src' && typeItem.name === 'WindowsMedia')
+ name = 'url';
+
+ param.attr({name: name, value: value});
+ object.append(param);
+ }
+
+ // Setup add type and classid if strict is disabled
+ if (this.editor.getParam('media_strict', true)) {
+ object.attr({
+ data: data.params.src,
+ type: typeItem.mimes[0]
+ });
+ } else {
+ object.attr({
+ classid: "clsid:" + typeItem.clsids[0],
+ codebase: typeItem.codebase
+ });
+
+ embed = new Node('embed', 1);
+ embed.shortEnded = true;
+ embed.attr({
+ id: node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style,
+ type: typeItem.mimes[0]
+ });
+
+ for (name in data.params)
+ embed.attr(name, data.params[name]);
+
+ tinymce.each(rootAttributes, function(name) {
+ if (data[name] && name != 'type')
+ embed.attr(name, data[name]);
+ });
+
+ object.append(embed);
+ }
+
+ // Insert raw HTML
+ if (data.object_html) {
+ value = new Node('#text', 3);
+ value.raw = true;
+ value.value = data.object_html;
+ object.append(value);
+ }
+
+ // Append object to video element if it exists
+ if (video)
+ video.append(object);
+ }
+
+ if (video) {
+ // Insert raw HTML
+ if (data.video_html) {
+ value = new Node('#text', 3);
+ value.raw = true;
+ value.value = data.video_html;
+ video.append(value);
+ }
+ }
+
+ if (audio) {
+ // Insert raw HTML
+ if (data.video_html) {
+ value = new Node('#text', 3);
+ value.raw = true;
+ value.value = data.video_html;
+ audio.append(value);
+ }
+ }
+
+ var n = video || audio || object || embed;
+ if (n)
+ node.replace(n);
+ else
+ node.remove();
+ },
+
+ /**
+ * Converts a tinymce.html.Node video/object/embed to an img element.
+ *
+ * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this:
+ *
+ *
+ * The JSON structure will be like this:
+ * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}}
+ */
+ objectToImg : function(node) {
+ var object, embed, video, iframe, img, name, id, width, height, style, i, html,
+ param, params, source, sources, data, type, lookup = this.lookup,
+ matches, attrs, urlConverter = this.editor.settings.url_converter,
+ urlConverterScope = this.editor.settings.url_converter_scope,
+ hspace, vspace, align, bgcolor;
+
+ function getInnerHTML(node) {
+ return new tinymce.html.Serializer({
+ inner: true,
+ validate: false
+ }).serialize(node);
+ };
+
+ function lookupAttribute(o, attr) {
+ return lookup[(o.attr(attr) || '').toLowerCase()];
+ }
+
+ function lookupExtension(src) {
+ var ext = src.replace(/^.*\.([^.]+)$/, '$1');
+ return lookup[ext.toLowerCase() || ''];
+ }
+
+ // If node isn't in document
+ if (!node.parent)
+ return;
+
+ // Handle media scripts
+ if (node.name === 'script') {
+ if (node.firstChild)
+ matches = scriptRegExp.exec(node.firstChild.value);
+
+ if (!matches)
+ return;
+
+ type = matches[1];
+ data = {video : {}, params : JSON.parse(matches[2])};
+ width = data.params.width;
+ height = data.params.height;
+ }
+
+ // Setup data objects
+ data = data || {
+ video : {},
+ params : {}
+ };
+
+ // Setup new image object
+ img = new Node('img', 1);
+ img.attr({
+ src : this.editor.theme.url + '/img/trans.gif'
+ });
+
+ // Video element
+ name = node.name;
+ if (name === 'video' || name == 'audio') {
+ video = node;
+ object = node.getAll('object')[0];
+ embed = node.getAll('embed')[0];
+ width = video.attr('width');
+ height = video.attr('height');
+ id = video.attr('id');
+ data.video = {attrs : {}, sources : []};
+
+ // Get all video attributes
+ attrs = data.video.attrs;
+ for (name in video.attributes.map)
+ attrs[name] = video.attributes.map[name];
+
+ source = node.attr('src');
+ if (source)
+ data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)});
+
+ // Get all sources
+ sources = video.getAll("source");
+ for (i = 0; i < sources.length; i++) {
+ source = sources[i].remove();
+
+ data.video.sources.push({
+ src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'),
+ type: source.attr('type'),
+ media: source.attr('media')
+ });
+ }
+
+ // Convert the poster URL
+ if (attrs.poster)
+ attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name);
+ }
+
+ // Object element
+ if (node.name === 'object') {
+ object = node;
+ embed = node.getAll('embed')[0];
+ }
+
+ // Embed element
+ if (node.name === 'embed')
+ embed = node;
+
+ // Iframe element
+ if (node.name === 'iframe') {
+ iframe = node;
+ type = 'Iframe';
+ }
+
+ if (object) {
+ // Get width/height
+ width = width || object.attr('width');
+ height = height || object.attr('height');
+ style = style || object.attr('style');
+ id = id || object.attr('id');
+ hspace = hspace || object.attr('hspace');
+ vspace = vspace || object.attr('vspace');
+ align = align || object.attr('align');
+ bgcolor = bgcolor || object.attr('bgcolor');
+ data.name = object.attr('name');
+
+ // Get all object params
+ params = object.getAll("param");
+ for (i = 0; i < params.length; i++) {
+ param = params[i];
+ name = param.remove().attr('name');
+
+ if (!excludedAttrs[name])
+ data.params[name] = param.attr('value');
+ }
+
+ data.params.src = data.params.src || object.attr('data');
+ }
+
+ if (embed) {
+ // Get width/height
+ width = width || embed.attr('width');
+ height = height || embed.attr('height');
+ style = style || embed.attr('style');
+ id = id || embed.attr('id');
+ hspace = hspace || embed.attr('hspace');
+ vspace = vspace || embed.attr('vspace');
+ align = align || embed.attr('align');
+ bgcolor = bgcolor || embed.attr('bgcolor');
+
+ // Get all embed attributes
+ for (name in embed.attributes.map) {
+ if (!excludedAttrs[name] && !data.params[name])
+ data.params[name] = embed.attributes.map[name];
+ }
+ }
+
+ if (iframe) {
+ // Get width/height
+ width = normalizeSize(iframe.attr('width'));
+ height = normalizeSize(iframe.attr('height'));
+ style = style || iframe.attr('style');
+ id = iframe.attr('id');
+ hspace = iframe.attr('hspace');
+ vspace = iframe.attr('vspace');
+ align = iframe.attr('align');
+ bgcolor = iframe.attr('bgcolor');
+
+ tinymce.each(rootAttributes, function(name) {
+ img.attr(name, iframe.attr(name));
+ });
+
+ // Get all iframe attributes
+ for (name in iframe.attributes.map) {
+ if (!excludedAttrs[name] && !data.params[name])
+ data.params[name] = iframe.attributes.map[name];
+ }
+ }
+
+ // Use src not movie
+ if (data.params.movie) {
+ data.params.src = data.params.src || data.params.movie;
+ delete data.params.movie;
+ }
+
+ // Convert the URL to relative/absolute depending on configuration
+ if (data.params.src)
+ data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object');
+
+ if (video) {
+ if (node.name === 'video')
+ type = lookup.video.name;
+ else if (node.name === 'audio')
+ type = lookup.audio.name;
+ }
+
+ if (object && !type)
+ type = (lookupAttribute(object, 'clsid') || lookupAttribute(object, 'classid') || lookupAttribute(object, 'type') || {}).name;
+
+ if (embed && !type)
+ type = (lookupAttribute(embed, 'type') || lookupExtension(data.params.src) || {}).name;
+
+ // for embedded audio we preserve the original specified type
+ if (embed && type == 'EmbeddedAudio') {
+ data.params.type = embed.attr('type');
+ }
+
+ // Replace the video/object/embed element with a placeholder image containing the data
+ node.replace(img);
+
+ // Remove embed
+ if (embed)
+ embed.remove();
+
+ // Serialize the inner HTML of the object element
+ if (object) {
+ html = getInnerHTML(object.remove());
+
+ if (html)
+ data.object_html = html;
+ }
+
+ // Serialize the inner HTML of the video element
+ if (video) {
+ html = getInnerHTML(video.remove());
+
+ if (html)
+ data.video_html = html;
+ }
+
+ data.hspace = hspace;
+ data.vspace = vspace;
+ data.align = align;
+ data.bgcolor = bgcolor;
+
+ // Set width/height of placeholder
+ img.attr({
+ id : id,
+ 'class' : 'mceItemMedia mceItem' + (type || 'Flash'),
+ style : style,
+ width : width || (node.name == 'audio' ? "300" : "320"),
+ height : height || (node.name == 'audio' ? "32" : "240"),
+ hspace : hspace,
+ vspace : vspace,
+ align : align,
+ bgcolor : bgcolor,
+ "data-mce-json" : JSON.serialize(data, "'")
+ });
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js
new file mode 100644
index 0000000..f8dc810
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/embed.js
@@ -0,0 +1,73 @@
+/**
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.
+ */
+
+function writeFlash(p) {
+ writeEmbed(
+ 'D27CDB6E-AE6D-11cf-96B8-444553540000',
+ 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+ 'application/x-shockwave-flash',
+ p
+ );
+}
+
+function writeShockWave(p) {
+ writeEmbed(
+ '166B1BCA-3F9C-11CF-8075-444553540000',
+ 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
+ 'application/x-director',
+ p
+ );
+}
+
+function writeQuickTime(p) {
+ writeEmbed(
+ '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+ 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
+ 'video/quicktime',
+ p
+ );
+}
+
+function writeRealMedia(p) {
+ writeEmbed(
+ 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
+ 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+ 'audio/x-pn-realaudio-plugin',
+ p
+ );
+}
+
+function writeWindowsMedia(p) {
+ p.url = p.src;
+ writeEmbed(
+ '6BF52A52-394A-11D3-B153-00C04F79FAA6',
+ 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
+ 'application/x-mplayer2',
+ p
+ );
+}
+
+function writeEmbed(cls, cb, mt, p) {
+ var h = '', n;
+
+ h += '';
+
+ document.write(h);
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/media.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/media.js
new file mode 100644
index 0000000..89cea2a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/js/media.js
@@ -0,0 +1,513 @@
+(function() {
+ var url;
+
+ if (url = tinyMCEPopup.getParam("media_external_list_url"))
+ document.write('');
+
+ function get(id) {
+ return document.getElementById(id);
+ }
+
+ function clone(obj) {
+ var i, len, copy, attr;
+
+ if (null == obj || "object" != typeof obj)
+ return obj;
+
+ // Handle Array
+ if ('length' in obj) {
+ copy = [];
+
+ for (i = 0, len = obj.length; i < len; ++i) {
+ copy[i] = clone(obj[i]);
+ }
+
+ return copy;
+ }
+
+ // Handle Object
+ copy = {};
+ for (attr in obj) {
+ if (obj.hasOwnProperty(attr))
+ copy[attr] = clone(obj[attr]);
+ }
+
+ return copy;
+ }
+
+ function getVal(id) {
+ var elm = get(id);
+
+ if (elm.nodeName == "SELECT")
+ return elm.options[elm.selectedIndex].value;
+
+ if (elm.type == "checkbox")
+ return elm.checked;
+
+ return elm.value;
+ }
+
+ function setVal(id, value, name) {
+ if (typeof(value) != 'undefined' && value != null) {
+ var elm = get(id);
+
+ if (elm.nodeName == "SELECT")
+ selectByValue(document.forms[0], id, value);
+ else if (elm.type == "checkbox") {
+ if (typeof(value) == 'string') {
+ value = value.toLowerCase();
+ value = (!name && value === 'true') || (name && value === name.toLowerCase());
+ }
+ elm.checked = !!value;
+ } else
+ elm.value = value;
+ }
+ }
+
+ window.Media = {
+ init : function() {
+ var html, editor, self = this;
+
+ self.editor = editor = tinyMCEPopup.editor;
+
+ // Setup file browsers and color pickers
+ get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');
+ get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media');
+ get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+ get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource1','video_altsource1','media','media');
+ get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource2','video_altsource2','media','media');
+ get('audio_altsource1_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource1','audio_altsource1','media','media');
+ get('audio_altsource2_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource2','audio_altsource2','media','media');
+ get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','image','media');
+
+ html = self.getMediaListHTML('medialist', 'src', 'media', 'media');
+ if (html == "")
+ get("linklistrow").style.display = 'none';
+ else
+ get("linklistcontainer").innerHTML = html;
+
+ if (isVisible('filebrowser'))
+ get('src').style.width = '230px';
+
+ if (isVisible('video_filebrowser_altsource1'))
+ get('video_altsource1').style.width = '220px';
+
+ if (isVisible('video_filebrowser_altsource2'))
+ get('video_altsource2').style.width = '220px';
+
+ if (isVisible('audio_filebrowser_altsource1'))
+ get('audio_altsource1').style.width = '220px';
+
+ if (isVisible('audio_filebrowser_altsource2'))
+ get('audio_altsource2').style.width = '220px';
+
+ if (isVisible('filebrowser_poster'))
+ get('video_poster').style.width = '220px';
+
+ editor.dom.setOuterHTML(get('media_type'), self.getMediaTypeHTML(editor));
+
+ self.setDefaultDialogSettings(editor);
+ self.data = clone(tinyMCEPopup.getWindowArg('data'));
+ self.dataToForm();
+ self.preview();
+
+ updateColor('bgcolor_pick', 'bgcolor');
+ },
+
+ insert : function() {
+ var editor = tinyMCEPopup.editor;
+
+ this.formToData();
+ editor.execCommand('mceRepaint');
+ tinyMCEPopup.restoreSelection();
+ editor.selection.setNode(editor.plugins.media.dataToImg(this.data));
+ tinyMCEPopup.close();
+ },
+
+ preview : function() {
+ get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true);
+ },
+
+ moveStates : function(to_form, field) {
+ var data = this.data, editor = this.editor,
+ mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src;
+
+ defaultStates = {
+ // QuickTime
+ quicktime_autoplay : true,
+ quicktime_controller : true,
+
+ // Flash
+ flash_play : true,
+ flash_loop : true,
+ flash_menu : true,
+
+ // WindowsMedia
+ windowsmedia_autostart : true,
+ windowsmedia_enablecontextmenu : true,
+ windowsmedia_invokeurls : true,
+
+ // RealMedia
+ realmedia_autogotourl : true,
+ realmedia_imagestatus : true
+ };
+
+ function parseQueryParams(str) {
+ var out = {};
+
+ if (str) {
+ tinymce.each(str.split('&'), function(item) {
+ var parts = item.split('=');
+
+ out[unescape(parts[0])] = unescape(parts[1]);
+ });
+ }
+
+ return out;
+ };
+
+ function setOptions(type, names) {
+ var i, name, formItemName, value, list;
+
+ if (type == data.type || type == 'global') {
+ names = tinymce.explode(names);
+ for (i = 0; i < names.length; i++) {
+ name = names[i];
+ formItemName = type == 'global' ? name : type + '_' + name;
+
+ if (type == 'global')
+ list = data;
+ else if (type == 'video' || type == 'audio') {
+ list = data.video.attrs;
+
+ if (!list && !to_form)
+ data.video.attrs = list = {};
+ } else
+ list = data.params;
+
+ if (list) {
+ if (to_form) {
+ setVal(formItemName, list[name], type == 'video' || type == 'audio' ? name : '');
+ } else {
+ delete list[name];
+
+ value = getVal(formItemName);
+ if ((type == 'video' || type == 'audio') && value === true)
+ value = name;
+
+ if (defaultStates[formItemName]) {
+ if (value !== defaultStates[formItemName]) {
+ value = "" + value;
+ list[name] = value;
+ }
+ } else if (value) {
+ value = "" + value;
+ list[name] = value;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!to_form) {
+ data.type = get('media_type').options[get('media_type').selectedIndex].value;
+ data.width = getVal('width');
+ data.height = getVal('height');
+
+ // Switch type based on extension
+ src = getVal('src');
+ if (field == 'src') {
+ ext = src.replace(/^.*\.([^.]+)$/, '$1');
+ if (typeInfo = mediaPlugin.getType(ext))
+ data.type = typeInfo.name.toLowerCase();
+
+ setVal('media_type', data.type);
+ }
+
+ if (data.type == "video" || data.type == "audio") {
+ if (!data.video.sources)
+ data.video.sources = [];
+
+ data.video.sources[0] = {src: getVal('src')};
+ }
+ }
+
+ // Hide all fieldsets and show the one active
+ get('video_options').style.display = 'none';
+ get('audio_options').style.display = 'none';
+ get('flash_options').style.display = 'none';
+ get('quicktime_options').style.display = 'none';
+ get('shockwave_options').style.display = 'none';
+ get('windowsmedia_options').style.display = 'none';
+ get('realmedia_options').style.display = 'none';
+ get('embeddedaudio_options').style.display = 'none';
+
+ if (get(data.type + '_options'))
+ get(data.type + '_options').style.display = 'block';
+
+ setVal('media_type', data.type);
+
+ setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars');
+ setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc');
+ setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign');
+ setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume');
+ setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks');
+ setOptions('video', 'poster,autoplay,loop,muted,preload,controls');
+ setOptions('audio', 'autoplay,loop,preload,controls');
+ setOptions('embeddedaudio', 'autoplay,loop,controls');
+ setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height');
+
+ if (to_form) {
+ if (data.type == 'video') {
+ if (data.video.sources[0])
+ setVal('src', data.video.sources[0].src);
+
+ src = data.video.sources[1];
+ if (src)
+ setVal('video_altsource1', src.src);
+
+ src = data.video.sources[2];
+ if (src)
+ setVal('video_altsource2', src.src);
+ } else if (data.type == 'audio') {
+ if (data.video.sources[0])
+ setVal('src', data.video.sources[0].src);
+
+ src = data.video.sources[1];
+ if (src)
+ setVal('audio_altsource1', src.src);
+
+ src = data.video.sources[2];
+ if (src)
+ setVal('audio_altsource2', src.src);
+ } else {
+ // Check flash vars
+ if (data.type == 'flash') {
+ tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) {
+ if (value == '$url')
+ data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src || '';
+ });
+ }
+
+ setVal('src', data.params.src);
+ }
+ } else {
+ src = getVal("src");
+
+ // YouTube Embed
+ if (src.match(/youtube\.com\/embed\/\w+/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ setVal('src', src);
+ setVal('media_type', data.type);
+ } else {
+ // YouTube *NEW*
+ if (src.match(/youtu\.be\/[a-z1-9.-_]+/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://www.youtube.com/embed/' + src.match(/youtu.be\/([a-z1-9.-_]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // YouTube
+ if (src.match(/youtube\.com(.+)v=([^&]+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+ }
+
+ // Google video
+ if (src.match(/video\.google\.com(.+)docid=([^&]+)/)) {
+ data.width = 425;
+ data.height = 326;
+ data.type = 'flash';
+ src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en';
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // Vimeo
+ if (src.match(/vimeo\.com\/([0-9]+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://player.vimeo.com/video/' + src.match(/vimeo.com\/([0-9]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // stream.cz
+ if (src.match(/stream\.cz\/((?!object).)*\/([0-9]+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://www.stream.cz/object/' + src.match(/stream.cz\/[^/]+\/([0-9]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // Google maps
+ if (src.match(/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://maps.google.com/maps/ms?msid=' + src.match(/msid=(.+)/)[1] + "&output=embed";
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ if (data.type == 'video') {
+ if (!data.video.sources)
+ data.video.sources = [];
+
+ data.video.sources[0] = {src : src};
+
+ src = getVal("video_altsource1");
+ if (src)
+ data.video.sources[1] = {src : src};
+
+ src = getVal("video_altsource2");
+ if (src)
+ data.video.sources[2] = {src : src};
+ } else if (data.type == 'audio') {
+ if (!data.video.sources)
+ data.video.sources = [];
+
+ data.video.sources[0] = {src : src};
+
+ src = getVal("audio_altsource1");
+ if (src)
+ data.video.sources[1] = {src : src};
+
+ src = getVal("audio_altsource2");
+ if (src)
+ data.video.sources[2] = {src : src};
+ } else
+ data.params.src = src;
+
+ // Set default size
+ setVal('width', data.width || (data.type == 'audio' ? 300 : 320));
+ setVal('height', data.height || (data.type == 'audio' ? 32 : 240));
+ }
+ },
+
+ dataToForm : function() {
+ this.moveStates(true);
+ },
+
+ formToData : function(field) {
+ if (field == "width" || field == "height")
+ this.changeSize(field);
+
+ if (field == 'source') {
+ this.moveStates(false, field);
+ setVal('source', this.editor.plugins.media.dataToHtml(this.data));
+ this.panel = 'source';
+ } else {
+ if (this.panel == 'source') {
+ this.data = clone(this.editor.plugins.media.htmlToData(getVal('source')));
+ this.dataToForm();
+ this.panel = '';
+ }
+
+ this.moveStates(false, field);
+ this.preview();
+ }
+ },
+
+ beforeResize : function() {
+ this.width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
+ this.height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
+ },
+
+ changeSize : function(type) {
+ var width, height, scale, size;
+
+ if (get('constrain').checked) {
+ width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
+ height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
+
+ if (type == 'width') {
+ this.height = Math.round((width / this.width) * height);
+ setVal('height', this.height);
+ } else {
+ this.width = Math.round((height / this.height) * width);
+ setVal('width', this.width);
+ }
+ }
+ },
+
+ getMediaListHTML : function() {
+ if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {
+ var html = "";
+
+ html += '';
+
+ return html;
+ }
+
+ return "";
+ },
+
+ getMediaTypeHTML : function(editor) {
+ function option(media_type, element) {
+ if (!editor.schema.getElementRule(element || media_type)) {
+ return '';
+ }
+
+ return ''
+ }
+
+ var html = "";
+
+ html += '';
+ return html;
+ },
+
+ setDefaultDialogSettings : function(editor) {
+ var defaultDialogSettings = editor.getParam("media_dialog_defaults", {});
+ tinymce.each(defaultDialogSettings, function(v, k) {
+ setVal(k, v);
+ });
+ }
+ };
+
+ tinyMCEPopup.requireLangPack();
+ tinyMCEPopup.onInit.add(function() {
+ Media.init();
+ });
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js
new file mode 100644
index 0000000..ecef3a8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert/Edit Embedded Media","align_top_left":"Top Left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed RTSP resources should be added to the QT Source field under the Advanced tab.\nYou should also add a non-streamed version to the Source field.",qtsrc:"QT Source",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch Style",scriptcallbacks:"Script Callbacks","align_top_right":"Top Right",uimode:"UI Mode",rate:"Rate",playcount:"Play Count",defaultframe:"Default Frame",currentposition:"Current Position",currentmarker:"Current Marker",captioningid:"Captioning ID",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless Video",stretchtofit:"Stretch to Fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Full Screen",enabled:"Enabled",autostart:"Auto Start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"End Time",starttime:"Start Time",enablejavascript:"Enable JavaScript",correction:"No Correction",targetcache:"Target Cache",playeveryframe:"Play Every Frame",kioskmode:"Kiosk Mode",controller:"Controller",menu:"Show Menu",loop:"Loop",play:"Auto Play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"ID",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain Proportions",controls:"Controls",numloop:"Num Loops",console:"Console",cache:"Cache",autohref:"Auto HREF",liveconnect:"SWLiveConnect",flashvars:"Flash Vars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain Aspect",imagestatus:"Image Status",center:"Center",autogotourl:"Auto Goto URL","shockwave_options":"Shockwave Options","rmp_options":"Real Media Player Options","wmp_options":"Windows Media Player Options","qt_options":"QuickTime Options","flash_options":"Flash Options",hidden:"Hidden","align_bottom_left":"Bottom Left","align_bottom_right":"Bottom Right","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide", "embedded_audio_options":"Embedded Audio Options", video:"HTML5 Video", audio:"HTML5 Audio", flash:"Flash", quicktime:"QuickTime", shockwave:"Shockwave", windowsmedia:"Windows Media", realmedia:"Real Media", iframe:"Iframe", embeddedaudio:"Embedded Audio" });
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/media.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/media.htm
new file mode 100644
index 0000000..06a67f7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/media.htm
@@ -0,0 +1,819 @@
+
+
+
+ {#media_dlg.title}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf
new file mode 100644
index 0000000..585d772
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media/moxieplayer.swf differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/css/media.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/css/media.css
new file mode 100644
index 0000000..0c45c7f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/css/media.css
@@ -0,0 +1,17 @@
+#id, #name, #hspace, #vspace, #class_name, #align { width: 100px }
+#hspace, #vspace { width: 50px }
+#flash_quality, #flash_align, #flash_scale, #flash_salign, #flash_wmode { width: 100px }
+#flash_base, #flash_flashvars, #html5_altsource1, #html5_altsource2, #html5_poster { width: 240px }
+#width, #height { width: 40px }
+#src, #media_type { width: 250px }
+#class { width: 120px }
+#prev { margin: 0; border: 1px solid black; width: 380px; height: 260px; overflow: auto }
+.panel_wrapper div.current { height: 420px; overflow: auto }
+#flash_options, #shockwave_options, #qt_options, #wmp_options, #rmp_options { display: none }
+.mceAddSelectValue { background-color: #DDDDDD }
+#qt_starttime, #qt_endtime, #qt_fov, #qt_href, #qt_moveid, #qt_moviename, #qt_node, #qt_pan, #qt_qtsrc, #qt_qtsrcchokespeed, #qt_target, #qt_tilt, #qt_urlsubstituten, #qt_volume { width: 70px }
+#wmp_balance, #wmp_baseurl, #wmp_captioningid, #wmp_currentmarker, #wmp_currentposition, #wmp_defaultframe, #wmp_playcount, #wmp_rate, #wmp_uimode, #wmp_volume { width: 70px }
+#rmp_console, #rmp_numloop, #rmp_controls, #rmp_scriptcallbacks { width: 70px }
+#shockwave_swvolume, #shockwave_swframe, #shockwave_swurl, #shockwave_swstretchvalign, #shockwave_swstretchhalign, #shockwave_swstretchstyle { width: 90px }
+#qt_qtsrc { width: 200px }
+iframe {border: 1px solid gray}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/editor_plugin.js
new file mode 100644
index 0000000..9ac42e0
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var b=tinymce.explode("id,name,width,height,style,align,class,hspace,vspace,bgcolor,type"),a=tinymce.makeMap(b.join(",")),f=tinymce.html.Node,d,i,h=tinymce.util.JSON,g;d=[["Flash","d27cdb6e-ae6d-11cf-96b8-444553540000","application/x-shockwave-flash","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["ShockWave","166b1bca-3f9c-11cf-8075-444553540000","application/x-director","http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0"],["WindowsMedia","6bf52a52-394a-11d3-b153-00c04f79faa6,22d6f312-b0f6-11d0-94ab-0080c74c7e95,05589fa1-c356-11ce-bf01-00aa0055595a","application/x-mplayer2","http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701"],["QuickTime","02bf25d5-8c17-4b23-bc80-d3488abddc6b","video/quicktime","http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0"],["RealMedia","cfcdaa03-8be4-11cf-b84b-0020afbbccfa","audio/x-pn-realaudio-plugin","http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"],["Java","8ad9c840-044e-11d1-b3e9-00805f499d93","application/x-java-applet","http://java.sun.com/products/plugin/autodl/jinstall-1_5_0-windows-i586.cab#Version=1,5,0,0"],["Silverlight","dfeaf541-f3e1-4c24-acac-99c30715084a","application/x-silverlight-2"],["Iframe"],["Video"],["EmbeddedAudio"],["Audio"]];function e(j){return typeof(j)=="string"?j.replace(/[^0-9%]/g,""):j}function c(m){var l,j,k;if(m&&!m.splice){j=[];for(k=0;true;k++){if(m[k]){j[k]=m[k]}else{break}}return j}return m}tinymce.create("tinymce.plugins.MediaPlugin",{init:function(n,j){var r=this,l={},m,p,q,k;function o(s){return s&&s.nodeName==="IMG"&&n.dom.hasClass(s,"mceItemMedia")}r.editor=n;r.url=j;i="";for(m=0;m0){O+=(O?"&":"")+P+"="+escape(Q)}});if(O.length){G.params.flashvars=O}L=p.getParam("flash_video_player_params",{allowfullscreen:true,allowscriptaccess:true});tinymce.each(L,function(Q,P){G.params[P]=""+Q})}}G=z.attr("data-mce-json");if(!G){return}G=h.parse(G);q=this.getType(z.attr("class"));B=z.attr("data-mce-style");if(!B){B=z.attr("style");if(B){B=p.dom.serializeStyle(p.dom.parseStyle(B,"img"))}}G.width=z.attr("width")||G.width;G.height=z.attr("height")||G.height;if(q.name==="Iframe"){x=new f("iframe",1);tinymce.each(b,function(n){var J=z.attr(n);if(n=="class"&&J){J=J.replace(/mceItem.+ ?/g,"")}if(J&&J.length>0){x.attr(n,J)}});for(I in G.params){x.attr(I,G.params[I])}x.attr({style:B,src:G.params.src});z.replace(x);return}if(this.editor.settings.media_use_script){x=new f("script",1).attr("type","text/javascript");y=new f("#text",3);y.value="write"+q.name+"("+h.serialize(tinymce.extend(G.params,{width:z.attr("width"),height:z.attr("height")}))+");";x.append(y);z.replace(x);return}if(q.name==="Video"&&G.video.sources[0]){C=new f("video",1).attr(tinymce.extend({id:z.attr("id"),width:e(z.attr("width")),height:e(z.attr("height")),style:B},G.video.attrs));if(G.video.attrs){l=G.video.attrs.poster}k=G.video.sources=c(G.video.sources);for(A=0;A 0)
+ flashVarsOutput += (flashVarsOutput ? '&' : '') + name + '=' + escape(value);
+ });
+
+ if (flashVarsOutput.length)
+ data.params.flashvars = flashVarsOutput;
+
+ params = editor.getParam('flash_video_player_params', {
+ allowfullscreen: true,
+ allowscriptaccess: true
+ });
+
+ tinymce.each(params, function(value, name) {
+ data.params[name] = "" + value;
+ });
+ }
+ };
+
+ data = node.attr('data-mce-json');
+ if (!data)
+ return;
+
+ data = JSON.parse(data);
+ typeItem = this.getType(node.attr('class'));
+
+ style = node.attr('data-mce-style');
+ if (!style) {
+ style = node.attr('style');
+
+ if (style)
+ style = editor.dom.serializeStyle(editor.dom.parseStyle(style, 'img'));
+ }
+
+ // Use node width/height to override the data width/height when the placeholder is resized
+ data.width = node.attr('width') || data.width;
+ data.height = node.attr('height') || data.height;
+
+ // Handle iframe
+ if (typeItem.name === 'Iframe') {
+ replacement = new Node('iframe', 1);
+
+ tinymce.each(rootAttributes, function(name) {
+ var value = node.attr(name);
+
+ if (name == 'class' && value)
+ value = value.replace(/mceItem.+ ?/g, '');
+
+ if (value && value.length > 0)
+ replacement.attr(name, value);
+ });
+
+ for (name in data.params)
+ replacement.attr(name, data.params[name]);
+
+ replacement.attr({
+ style: style,
+ src: data.params.src
+ });
+
+ node.replace(replacement);
+
+ return;
+ }
+
+ // Handle scripts
+ if (this.editor.settings.media_use_script) {
+ replacement = new Node('script', 1).attr('type', 'text/javascript');
+
+ value = new Node('#text', 3);
+ value.value = 'write' + typeItem.name + '(' + JSON.serialize(tinymce.extend(data.params, {
+ width: node.attr('width'),
+ height: node.attr('height')
+ })) + ');';
+
+ replacement.append(value);
+ node.replace(replacement);
+
+ return;
+ }
+
+ // Add HTML5 video element
+ if (typeItem.name === 'Video' && data.video.sources[0]) {
+ // Create new object element
+ video = new Node('video', 1).attr(tinymce.extend({
+ id : node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style
+ }, data.video.attrs));
+
+ // Get poster source and use that for flash fallback
+ if (data.video.attrs)
+ posterSrc = data.video.attrs.poster;
+
+ sources = data.video.sources = toArray(data.video.sources);
+ for (i = 0; i < sources.length; i++) {
+ if (/\.mp4$/.test(sources[i].src))
+ mp4Source = sources[i].src;
+ }
+
+ if (!sources[0].type) {
+ video.attr('src', sources[0].src);
+ sources.splice(0, 1);
+ }
+
+ for (i = 0; i < sources.length; i++) {
+ source = new Node('source', 1).attr(sources[i]);
+ source.shortEnded = true;
+ video.append(source);
+ }
+
+ // Create flash fallback for video if we have a mp4 source
+ if (mp4Source) {
+ addPlayer(mp4Source, posterSrc);
+ typeItem = self.getType('flash');
+ } else
+ data.params.src = '';
+ }
+
+ // Add HTML5 audio element
+ if (typeItem.name === 'Audio' && data.video.sources[0]) {
+ // Create new object element
+ audio = new Node('audio', 1).attr(tinymce.extend({
+ id : node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style
+ }, data.video.attrs));
+
+ // Get poster source and use that for flash fallback
+ if (data.video.attrs)
+ posterSrc = data.video.attrs.poster;
+
+ sources = data.video.sources = toArray(data.video.sources);
+ if (!sources[0].type) {
+ audio.attr('src', sources[0].src);
+ sources.splice(0, 1);
+ }
+
+ for (i = 0; i < sources.length; i++) {
+ source = new Node('source', 1).attr(sources[i]);
+ source.shortEnded = true;
+ audio.append(source);
+ }
+
+ data.params.src = '';
+ }
+
+ if (typeItem.name === 'EmbeddedAudio') {
+ embed = new Node('embed', 1);
+ embed.shortEnded = true;
+ embed.attr({
+ id: node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style,
+ type: node.attr('type')
+ });
+
+ for (name in data.params)
+ embed.attr(name, data.params[name]);
+
+ tinymce.each(rootAttributes, function(name) {
+ if (data[name] && name != 'type')
+ embed.attr(name, data[name]);
+ });
+
+ data.params.src = '';
+ }
+
+ // Do we have a params src then we can generate object
+ if (data.params.src) {
+ // Is flv movie add player for it
+ if (/\.flv$/i.test(data.params.src))
+ addPlayer(data.params.src, '');
+
+ if (args && args.force_absolute)
+ data.params.src = editor.documentBaseURI.toAbsolute(data.params.src);
+
+ // Create new object element
+ object = new Node('object', 1).attr({
+ id : node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style
+ });
+
+ tinymce.each(rootAttributes, function(name) {
+ var value = data[name];
+
+ if (name == 'class' && value)
+ value = value.replace(/mceItem.+ ?/g, '');
+
+ if (value && name != 'type')
+ object.attr(name, value);
+ });
+
+ // Add params
+ for (name in data.params) {
+ param = new Node('param', 1);
+ param.shortEnded = true;
+ value = data.params[name];
+
+ // Windows media needs to use url instead of src for the media URL
+ if (name === 'src' && typeItem.name === 'WindowsMedia')
+ name = 'url';
+
+ param.attr({name: name, value: value});
+ object.append(param);
+ }
+
+ // Setup add type and classid if strict is disabled
+ if (this.editor.getParam('media_strict', true)) {
+ object.attr({
+ data: data.params.src,
+ type: typeItem.mimes[0]
+ });
+ } else {
+ object.attr({
+ classid: "clsid:" + typeItem.clsids[0],
+ codebase: typeItem.codebase
+ });
+
+ embed = new Node('embed', 1);
+ embed.shortEnded = true;
+ embed.attr({
+ id: node.attr('id'),
+ width: normalizeSize(node.attr('width')),
+ height: normalizeSize(node.attr('height')),
+ style : style,
+ type: typeItem.mimes[0]
+ });
+
+ for (name in data.params)
+ embed.attr(name, data.params[name]);
+
+ tinymce.each(rootAttributes, function(name) {
+ if (data[name] && name != 'type')
+ embed.attr(name, data[name]);
+ });
+
+ object.append(embed);
+ }
+
+ // Insert raw HTML
+ if (data.object_html) {
+ value = new Node('#text', 3);
+ value.raw = true;
+ value.value = data.object_html;
+ object.append(value);
+ }
+
+ // Append object to video element if it exists
+ if (video)
+ video.append(object);
+ }
+
+ if (video) {
+ // Insert raw HTML
+ if (data.video_html) {
+ value = new Node('#text', 3);
+ value.raw = true;
+ value.value = data.video_html;
+ video.append(value);
+ }
+ }
+
+ if (audio) {
+ // Insert raw HTML
+ if (data.video_html) {
+ value = new Node('#text', 3);
+ value.raw = true;
+ value.value = data.video_html;
+ audio.append(value);
+ }
+ }
+
+ var n = video || audio || object || embed;
+ if (n)
+ node.replace(n);
+ else
+ node.remove();
+ },
+
+ /**
+ * Converts a tinymce.html.Node video/object/embed to an img element.
+ *
+ * The video/object/embed will be converted into an image placeholder with a JSON data attribute like this:
+ *
+ *
+ * The JSON structure will be like this:
+ * {'params':{'flashvars':'something','quality':'high','src':'someurl'}, 'video':{'sources':[{src: 'someurl', type: 'video/mp4'}]}}
+ */
+ objectToImg : function(node) {
+ var object, embed, video, iframe, img, name, id, width, height, style, i, html,
+ param, params, source, sources, data, type, lookup = this.lookup,
+ matches, attrs, urlConverter = this.editor.settings.url_converter,
+ urlConverterScope = this.editor.settings.url_converter_scope,
+ hspace, vspace, align, bgcolor;
+
+ function getInnerHTML(node) {
+ return new tinymce.html.Serializer({
+ inner: true,
+ validate: false
+ }).serialize(node);
+ };
+
+ function lookupAttribute(o, attr) {
+ return lookup[(o.attr(attr) || '').toLowerCase()];
+ }
+
+ function lookupExtension(src) {
+ var ext = src.replace(/^.*\.([^.]+)$/, '$1');
+ return lookup[ext.toLowerCase() || ''];
+ }
+
+ // If node isn't in document
+ if (!node.parent)
+ return;
+
+ // Handle media scripts
+ if (node.name === 'script') {
+ if (node.firstChild)
+ matches = scriptRegExp.exec(node.firstChild.value);
+
+ if (!matches)
+ return;
+
+ type = matches[1];
+ data = {video : {}, params : JSON.parse(matches[2])};
+ width = data.params.width;
+ height = data.params.height;
+ }
+
+ // Setup data objects
+ data = data || {
+ video : {},
+ params : {}
+ };
+
+ // Setup new image object
+ img = new Node('img', 1);
+ img.attr({
+ src : this.editor.theme.url + '/img/trans.gif'
+ });
+
+ // Video element
+ name = node.name;
+ if (name === 'video' || name == 'audio') {
+ video = node;
+ object = node.getAll('object')[0];
+ embed = node.getAll('embed')[0];
+ width = video.attr('width');
+ height = video.attr('height');
+ id = video.attr('id');
+ data.video = {attrs : {}, sources : []};
+
+ // Get all video attributes
+ attrs = data.video.attrs;
+ for (name in video.attributes.map)
+ attrs[name] = video.attributes.map[name];
+
+ source = node.attr('src');
+ if (source)
+ data.video.sources.push({src : urlConverter.call(urlConverterScope, source, 'src', node.name)});
+
+ // Get all sources
+ sources = video.getAll("source");
+ for (i = 0; i < sources.length; i++) {
+ source = sources[i].remove();
+
+ data.video.sources.push({
+ src: urlConverter.call(urlConverterScope, source.attr('src'), 'src', 'source'),
+ type: source.attr('type'),
+ media: source.attr('media')
+ });
+ }
+
+ // Convert the poster URL
+ if (attrs.poster)
+ attrs.poster = urlConverter.call(urlConverterScope, attrs.poster, 'poster', node.name);
+ }
+
+ // Object element
+ if (node.name === 'object') {
+ object = node;
+ embed = node.getAll('embed')[0];
+ }
+
+ // Embed element
+ if (node.name === 'embed')
+ embed = node;
+
+ // Iframe element
+ if (node.name === 'iframe') {
+ iframe = node;
+ type = 'Iframe';
+ }
+
+ if (object) {
+ // Get width/height
+ width = width || object.attr('width');
+ height = height || object.attr('height');
+ style = style || object.attr('style');
+ id = id || object.attr('id');
+ hspace = hspace || object.attr('hspace');
+ vspace = vspace || object.attr('vspace');
+ align = align || object.attr('align');
+ bgcolor = bgcolor || object.attr('bgcolor');
+ data.name = object.attr('name');
+
+ // Get all object params
+ params = object.getAll("param");
+ for (i = 0; i < params.length; i++) {
+ param = params[i];
+ name = param.remove().attr('name');
+
+ if (!excludedAttrs[name])
+ data.params[name] = param.attr('value');
+ }
+
+ data.params.src = data.params.src || object.attr('data');
+ }
+
+ if (embed) {
+ // Get width/height
+ width = width || embed.attr('width');
+ height = height || embed.attr('height');
+ style = style || embed.attr('style');
+ id = id || embed.attr('id');
+ hspace = hspace || embed.attr('hspace');
+ vspace = vspace || embed.attr('vspace');
+ align = align || embed.attr('align');
+ bgcolor = bgcolor || embed.attr('bgcolor');
+
+ // Get all embed attributes
+ for (name in embed.attributes.map) {
+ if (!excludedAttrs[name] && !data.params[name])
+ data.params[name] = embed.attributes.map[name];
+ }
+ }
+
+ if (iframe) {
+ // Get width/height
+ width = normalizeSize(iframe.attr('width'));
+ height = normalizeSize(iframe.attr('height'));
+ style = style || iframe.attr('style');
+ id = iframe.attr('id');
+ hspace = iframe.attr('hspace');
+ vspace = iframe.attr('vspace');
+ align = iframe.attr('align');
+ bgcolor = iframe.attr('bgcolor');
+
+ tinymce.each(rootAttributes, function(name) {
+ img.attr(name, iframe.attr(name));
+ });
+
+ // Get all iframe attributes
+ for (name in iframe.attributes.map) {
+ if (!excludedAttrs[name] && !data.params[name])
+ data.params[name] = iframe.attributes.map[name];
+ }
+ }
+
+ // Use src not movie
+ if (data.params.movie) {
+ data.params.src = data.params.src || data.params.movie;
+ delete data.params.movie;
+ }
+
+ // Convert the URL to relative/absolute depending on configuration
+ if (data.params.src)
+ data.params.src = urlConverter.call(urlConverterScope, data.params.src, 'src', 'object');
+
+ if (video) {
+ if (node.name === 'video')
+ type = lookup.video.name;
+ else if (node.name === 'audio')
+ type = lookup.audio.name;
+ }
+
+ if (object && !type)
+ type = (lookupAttribute(object, 'clsid') || lookupAttribute(object, 'classid') || lookupAttribute(object, 'type') || {}).name;
+
+ if (embed && !type)
+ type = (lookupAttribute(embed, 'type') || lookupExtension(data.params.src) || {}).name;
+
+ // for embedded audio we preserve the original specified type
+ if (embed && type == 'EmbeddedAudio') {
+ data.params.type = embed.attr('type');
+ }
+
+ // Replace the video/object/embed element with a placeholder image containing the data
+ node.replace(img);
+
+ // Remove embed
+ if (embed)
+ embed.remove();
+
+ // Serialize the inner HTML of the object element
+ if (object) {
+ html = getInnerHTML(object.remove());
+
+ if (html)
+ data.object_html = html;
+ }
+
+ // Serialize the inner HTML of the video element
+ if (video) {
+ html = getInnerHTML(video.remove());
+
+ if (html)
+ data.video_html = html;
+ }
+
+ data.hspace = hspace;
+ data.vspace = vspace;
+ data.align = align;
+ data.bgcolor = bgcolor;
+
+ // Set width/height of placeholder
+ img.attr({
+ id : id,
+ 'class' : 'mceItemMedia mceItem' + (type || 'Flash'),
+ style : style,
+ width : width || (node.name == 'audio' ? "300" : "320"),
+ height : height || (node.name == 'audio' ? "32" : "240"),
+ hspace : hspace,
+ vspace : vspace,
+ align : align,
+ bgcolor : bgcolor,
+ "data-mce-json" : JSON.serialize(data, "'")
+ });
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/embed.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/embed.js
new file mode 100644
index 0000000..f8dc810
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/embed.js
@@ -0,0 +1,73 @@
+/**
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.
+ */
+
+function writeFlash(p) {
+ writeEmbed(
+ 'D27CDB6E-AE6D-11cf-96B8-444553540000',
+ 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+ 'application/x-shockwave-flash',
+ p
+ );
+}
+
+function writeShockWave(p) {
+ writeEmbed(
+ '166B1BCA-3F9C-11CF-8075-444553540000',
+ 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
+ 'application/x-director',
+ p
+ );
+}
+
+function writeQuickTime(p) {
+ writeEmbed(
+ '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+ 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
+ 'video/quicktime',
+ p
+ );
+}
+
+function writeRealMedia(p) {
+ writeEmbed(
+ 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
+ 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+ 'audio/x-pn-realaudio-plugin',
+ p
+ );
+}
+
+function writeWindowsMedia(p) {
+ p.url = p.src;
+ writeEmbed(
+ '6BF52A52-394A-11D3-B153-00C04F79FAA6',
+ 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
+ 'application/x-mplayer2',
+ p
+ );
+}
+
+function writeEmbed(cls, cb, mt, p) {
+ var h = '', n;
+
+ h += '';
+
+ document.write(h);
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/media.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/media.js
new file mode 100644
index 0000000..89cea2a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/js/media.js
@@ -0,0 +1,513 @@
+(function() {
+ var url;
+
+ if (url = tinyMCEPopup.getParam("media_external_list_url"))
+ document.write('');
+
+ function get(id) {
+ return document.getElementById(id);
+ }
+
+ function clone(obj) {
+ var i, len, copy, attr;
+
+ if (null == obj || "object" != typeof obj)
+ return obj;
+
+ // Handle Array
+ if ('length' in obj) {
+ copy = [];
+
+ for (i = 0, len = obj.length; i < len; ++i) {
+ copy[i] = clone(obj[i]);
+ }
+
+ return copy;
+ }
+
+ // Handle Object
+ copy = {};
+ for (attr in obj) {
+ if (obj.hasOwnProperty(attr))
+ copy[attr] = clone(obj[attr]);
+ }
+
+ return copy;
+ }
+
+ function getVal(id) {
+ var elm = get(id);
+
+ if (elm.nodeName == "SELECT")
+ return elm.options[elm.selectedIndex].value;
+
+ if (elm.type == "checkbox")
+ return elm.checked;
+
+ return elm.value;
+ }
+
+ function setVal(id, value, name) {
+ if (typeof(value) != 'undefined' && value != null) {
+ var elm = get(id);
+
+ if (elm.nodeName == "SELECT")
+ selectByValue(document.forms[0], id, value);
+ else if (elm.type == "checkbox") {
+ if (typeof(value) == 'string') {
+ value = value.toLowerCase();
+ value = (!name && value === 'true') || (name && value === name.toLowerCase());
+ }
+ elm.checked = !!value;
+ } else
+ elm.value = value;
+ }
+ }
+
+ window.Media = {
+ init : function() {
+ var html, editor, self = this;
+
+ self.editor = editor = tinyMCEPopup.editor;
+
+ // Setup file browsers and color pickers
+ get('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');
+ get('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','quicktime_qtsrc','media','media');
+ get('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+ get('video_altsource1_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource1','video_altsource1','media','media');
+ get('video_altsource2_filebrowser').innerHTML = getBrowserHTML('video_filebrowser_altsource2','video_altsource2','media','media');
+ get('audio_altsource1_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource1','audio_altsource1','media','media');
+ get('audio_altsource2_filebrowser').innerHTML = getBrowserHTML('audio_filebrowser_altsource2','audio_altsource2','media','media');
+ get('video_poster_filebrowser').innerHTML = getBrowserHTML('filebrowser_poster','video_poster','image','media');
+
+ html = self.getMediaListHTML('medialist', 'src', 'media', 'media');
+ if (html == "")
+ get("linklistrow").style.display = 'none';
+ else
+ get("linklistcontainer").innerHTML = html;
+
+ if (isVisible('filebrowser'))
+ get('src').style.width = '230px';
+
+ if (isVisible('video_filebrowser_altsource1'))
+ get('video_altsource1').style.width = '220px';
+
+ if (isVisible('video_filebrowser_altsource2'))
+ get('video_altsource2').style.width = '220px';
+
+ if (isVisible('audio_filebrowser_altsource1'))
+ get('audio_altsource1').style.width = '220px';
+
+ if (isVisible('audio_filebrowser_altsource2'))
+ get('audio_altsource2').style.width = '220px';
+
+ if (isVisible('filebrowser_poster'))
+ get('video_poster').style.width = '220px';
+
+ editor.dom.setOuterHTML(get('media_type'), self.getMediaTypeHTML(editor));
+
+ self.setDefaultDialogSettings(editor);
+ self.data = clone(tinyMCEPopup.getWindowArg('data'));
+ self.dataToForm();
+ self.preview();
+
+ updateColor('bgcolor_pick', 'bgcolor');
+ },
+
+ insert : function() {
+ var editor = tinyMCEPopup.editor;
+
+ this.formToData();
+ editor.execCommand('mceRepaint');
+ tinyMCEPopup.restoreSelection();
+ editor.selection.setNode(editor.plugins.media.dataToImg(this.data));
+ tinyMCEPopup.close();
+ },
+
+ preview : function() {
+ get('prev').innerHTML = this.editor.plugins.media.dataToHtml(this.data, true);
+ },
+
+ moveStates : function(to_form, field) {
+ var data = this.data, editor = this.editor,
+ mediaPlugin = editor.plugins.media, ext, src, typeInfo, defaultStates, src;
+
+ defaultStates = {
+ // QuickTime
+ quicktime_autoplay : true,
+ quicktime_controller : true,
+
+ // Flash
+ flash_play : true,
+ flash_loop : true,
+ flash_menu : true,
+
+ // WindowsMedia
+ windowsmedia_autostart : true,
+ windowsmedia_enablecontextmenu : true,
+ windowsmedia_invokeurls : true,
+
+ // RealMedia
+ realmedia_autogotourl : true,
+ realmedia_imagestatus : true
+ };
+
+ function parseQueryParams(str) {
+ var out = {};
+
+ if (str) {
+ tinymce.each(str.split('&'), function(item) {
+ var parts = item.split('=');
+
+ out[unescape(parts[0])] = unescape(parts[1]);
+ });
+ }
+
+ return out;
+ };
+
+ function setOptions(type, names) {
+ var i, name, formItemName, value, list;
+
+ if (type == data.type || type == 'global') {
+ names = tinymce.explode(names);
+ for (i = 0; i < names.length; i++) {
+ name = names[i];
+ formItemName = type == 'global' ? name : type + '_' + name;
+
+ if (type == 'global')
+ list = data;
+ else if (type == 'video' || type == 'audio') {
+ list = data.video.attrs;
+
+ if (!list && !to_form)
+ data.video.attrs = list = {};
+ } else
+ list = data.params;
+
+ if (list) {
+ if (to_form) {
+ setVal(formItemName, list[name], type == 'video' || type == 'audio' ? name : '');
+ } else {
+ delete list[name];
+
+ value = getVal(formItemName);
+ if ((type == 'video' || type == 'audio') && value === true)
+ value = name;
+
+ if (defaultStates[formItemName]) {
+ if (value !== defaultStates[formItemName]) {
+ value = "" + value;
+ list[name] = value;
+ }
+ } else if (value) {
+ value = "" + value;
+ list[name] = value;
+ }
+ }
+ }
+ }
+ }
+ }
+
+ if (!to_form) {
+ data.type = get('media_type').options[get('media_type').selectedIndex].value;
+ data.width = getVal('width');
+ data.height = getVal('height');
+
+ // Switch type based on extension
+ src = getVal('src');
+ if (field == 'src') {
+ ext = src.replace(/^.*\.([^.]+)$/, '$1');
+ if (typeInfo = mediaPlugin.getType(ext))
+ data.type = typeInfo.name.toLowerCase();
+
+ setVal('media_type', data.type);
+ }
+
+ if (data.type == "video" || data.type == "audio") {
+ if (!data.video.sources)
+ data.video.sources = [];
+
+ data.video.sources[0] = {src: getVal('src')};
+ }
+ }
+
+ // Hide all fieldsets and show the one active
+ get('video_options').style.display = 'none';
+ get('audio_options').style.display = 'none';
+ get('flash_options').style.display = 'none';
+ get('quicktime_options').style.display = 'none';
+ get('shockwave_options').style.display = 'none';
+ get('windowsmedia_options').style.display = 'none';
+ get('realmedia_options').style.display = 'none';
+ get('embeddedaudio_options').style.display = 'none';
+
+ if (get(data.type + '_options'))
+ get(data.type + '_options').style.display = 'block';
+
+ setVal('media_type', data.type);
+
+ setOptions('flash', 'play,loop,menu,swliveconnect,quality,scale,salign,wmode,base,flashvars');
+ setOptions('quicktime', 'loop,autoplay,cache,controller,correction,enablejavascript,kioskmode,autohref,playeveryframe,targetcache,scale,starttime,endtime,target,qtsrcchokespeed,volume,qtsrc');
+ setOptions('shockwave', 'sound,progress,autostart,swliveconnect,swvolume,swstretchstyle,swstretchhalign,swstretchvalign');
+ setOptions('windowsmedia', 'autostart,enabled,enablecontextmenu,fullscreen,invokeurls,mute,stretchtofit,windowlessvideo,balance,baseurl,captioningid,currentmarker,currentposition,defaultframe,playcount,rate,uimode,volume');
+ setOptions('realmedia', 'autostart,loop,autogotourl,center,imagestatus,maintainaspect,nojava,prefetch,shuffle,console,controls,numloop,scriptcallbacks');
+ setOptions('video', 'poster,autoplay,loop,muted,preload,controls');
+ setOptions('audio', 'autoplay,loop,preload,controls');
+ setOptions('embeddedaudio', 'autoplay,loop,controls');
+ setOptions('global', 'id,name,vspace,hspace,bgcolor,align,width,height');
+
+ if (to_form) {
+ if (data.type == 'video') {
+ if (data.video.sources[0])
+ setVal('src', data.video.sources[0].src);
+
+ src = data.video.sources[1];
+ if (src)
+ setVal('video_altsource1', src.src);
+
+ src = data.video.sources[2];
+ if (src)
+ setVal('video_altsource2', src.src);
+ } else if (data.type == 'audio') {
+ if (data.video.sources[0])
+ setVal('src', data.video.sources[0].src);
+
+ src = data.video.sources[1];
+ if (src)
+ setVal('audio_altsource1', src.src);
+
+ src = data.video.sources[2];
+ if (src)
+ setVal('audio_altsource2', src.src);
+ } else {
+ // Check flash vars
+ if (data.type == 'flash') {
+ tinymce.each(editor.getParam('flash_video_player_flashvars', {url : '$url', poster : '$poster'}), function(value, name) {
+ if (value == '$url')
+ data.params.src = parseQueryParams(data.params.flashvars)[name] || data.params.src || '';
+ });
+ }
+
+ setVal('src', data.params.src);
+ }
+ } else {
+ src = getVal("src");
+
+ // YouTube Embed
+ if (src.match(/youtube\.com\/embed\/\w+/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ setVal('src', src);
+ setVal('media_type', data.type);
+ } else {
+ // YouTube *NEW*
+ if (src.match(/youtu\.be\/[a-z1-9.-_]+/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://www.youtube.com/embed/' + src.match(/youtu.be\/([a-z1-9.-_]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // YouTube
+ if (src.match(/youtube\.com(.+)v=([^&]+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://www.youtube.com/embed/' + src.match(/v=([^&]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+ }
+
+ // Google video
+ if (src.match(/video\.google\.com(.+)docid=([^&]+)/)) {
+ data.width = 425;
+ data.height = 326;
+ data.type = 'flash';
+ src = 'http://video.google.com/googleplayer.swf?docId=' + src.match(/docid=([^&]+)/)[1] + '&hl=en';
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // Vimeo
+ if (src.match(/vimeo\.com\/([0-9]+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://player.vimeo.com/video/' + src.match(/vimeo.com\/([0-9]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // stream.cz
+ if (src.match(/stream\.cz\/((?!object).)*\/([0-9]+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://www.stream.cz/object/' + src.match(/stream.cz\/[^/]+\/([0-9]+)/)[1];
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ // Google maps
+ if (src.match(/maps\.google\.([a-z]{2,3})\/maps\/(.+)msid=(.+)/)) {
+ data.width = 425;
+ data.height = 350;
+ data.params.frameborder = '0';
+ data.type = 'iframe';
+ src = 'http://maps.google.com/maps/ms?msid=' + src.match(/msid=(.+)/)[1] + "&output=embed";
+ setVal('src', src);
+ setVal('media_type', data.type);
+ }
+
+ if (data.type == 'video') {
+ if (!data.video.sources)
+ data.video.sources = [];
+
+ data.video.sources[0] = {src : src};
+
+ src = getVal("video_altsource1");
+ if (src)
+ data.video.sources[1] = {src : src};
+
+ src = getVal("video_altsource2");
+ if (src)
+ data.video.sources[2] = {src : src};
+ } else if (data.type == 'audio') {
+ if (!data.video.sources)
+ data.video.sources = [];
+
+ data.video.sources[0] = {src : src};
+
+ src = getVal("audio_altsource1");
+ if (src)
+ data.video.sources[1] = {src : src};
+
+ src = getVal("audio_altsource2");
+ if (src)
+ data.video.sources[2] = {src : src};
+ } else
+ data.params.src = src;
+
+ // Set default size
+ setVal('width', data.width || (data.type == 'audio' ? 300 : 320));
+ setVal('height', data.height || (data.type == 'audio' ? 32 : 240));
+ }
+ },
+
+ dataToForm : function() {
+ this.moveStates(true);
+ },
+
+ formToData : function(field) {
+ if (field == "width" || field == "height")
+ this.changeSize(field);
+
+ if (field == 'source') {
+ this.moveStates(false, field);
+ setVal('source', this.editor.plugins.media.dataToHtml(this.data));
+ this.panel = 'source';
+ } else {
+ if (this.panel == 'source') {
+ this.data = clone(this.editor.plugins.media.htmlToData(getVal('source')));
+ this.dataToForm();
+ this.panel = '';
+ }
+
+ this.moveStates(false, field);
+ this.preview();
+ }
+ },
+
+ beforeResize : function() {
+ this.width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
+ this.height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
+ },
+
+ changeSize : function(type) {
+ var width, height, scale, size;
+
+ if (get('constrain').checked) {
+ width = parseInt(getVal('width') || (this.data.type == 'audio' ? "300" : "320"), 10);
+ height = parseInt(getVal('height') || (this.data.type == 'audio' ? "32" : "240"), 10);
+
+ if (type == 'width') {
+ this.height = Math.round((width / this.width) * height);
+ setVal('height', this.height);
+ } else {
+ this.width = Math.round((height / this.height) * width);
+ setVal('width', this.width);
+ }
+ }
+ },
+
+ getMediaListHTML : function() {
+ if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {
+ var html = "";
+
+ html += '';
+
+ return html;
+ }
+
+ return "";
+ },
+
+ getMediaTypeHTML : function(editor) {
+ function option(media_type, element) {
+ if (!editor.schema.getElementRule(element || media_type)) {
+ return '';
+ }
+
+ return ''
+ }
+
+ var html = "";
+
+ html += '';
+ return html;
+ },
+
+ setDefaultDialogSettings : function(editor) {
+ var defaultDialogSettings = editor.getParam("media_dialog_defaults", {});
+ tinymce.each(defaultDialogSettings, function(v, k) {
+ setVal(k, v);
+ });
+ }
+ };
+
+ tinyMCEPopup.requireLangPack();
+ tinyMCEPopup.onInit.add(function() {
+ Media.init();
+ });
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/langs/en_dlg.js
new file mode 100644
index 0000000..ecef3a8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.media_dlg',{list:"List",file:"File/URL",advanced:"Advanced",general:"General",title:"Insert/Edit Embedded Media","align_top_left":"Top Left","align_center":"Center","align_left":"Left","align_bottom":"Bottom","align_right":"Right","align_top":"Top","qt_stream_warn":"Streamed RTSP resources should be added to the QT Source field under the Advanced tab.\nYou should also add a non-streamed version to the Source field.",qtsrc:"QT Source",progress:"Progress",sound:"Sound",swstretchvalign:"Stretch V-Align",swstretchhalign:"Stretch H-Align",swstretchstyle:"Stretch Style",scriptcallbacks:"Script Callbacks","align_top_right":"Top Right",uimode:"UI Mode",rate:"Rate",playcount:"Play Count",defaultframe:"Default Frame",currentposition:"Current Position",currentmarker:"Current Marker",captioningid:"Captioning ID",baseurl:"Base URL",balance:"Balance",windowlessvideo:"Windowless Video",stretchtofit:"Stretch to Fit",mute:"Mute",invokeurls:"Invoke URLs",fullscreen:"Full Screen",enabled:"Enabled",autostart:"Auto Start",volume:"Volume",target:"Target",qtsrcchokespeed:"Choke Speed",href:"HREF",endtime:"End Time",starttime:"Start Time",enablejavascript:"Enable JavaScript",correction:"No Correction",targetcache:"Target Cache",playeveryframe:"Play Every Frame",kioskmode:"Kiosk Mode",controller:"Controller",menu:"Show Menu",loop:"Loop",play:"Auto Play",hspace:"H-Space",vspace:"V-Space","class_name":"Class",name:"Name",id:"ID",type:"Type",size:"Dimensions",preview:"Preview","constrain_proportions":"Constrain Proportions",controls:"Controls",numloop:"Num Loops",console:"Console",cache:"Cache",autohref:"Auto HREF",liveconnect:"SWLiveConnect",flashvars:"Flash Vars",base:"Base",bgcolor:"Background",wmode:"WMode",salign:"SAlign",align:"Align",scale:"Scale",quality:"Quality",shuffle:"Shuffle",prefetch:"Prefetch",nojava:"No Java",maintainaspect:"Maintain Aspect",imagestatus:"Image Status",center:"Center",autogotourl:"Auto Goto URL","shockwave_options":"Shockwave Options","rmp_options":"Real Media Player Options","wmp_options":"Windows Media Player Options","qt_options":"QuickTime Options","flash_options":"Flash Options",hidden:"Hidden","align_bottom_left":"Bottom Left","align_bottom_right":"Bottom Right","html5_video_options":"HTML5 Video Options",altsource1:"Alternative source 1",altsource2:"Alternative source 2",preload:"Preload",poster:"Poster",source:"Source","html5_audio_options":"Audio Options","preload_none":"Don\'t Preload","preload_metadata":"Preload video metadata","preload_auto":"Let user\'s browser decide", "embedded_audio_options":"Embedded Audio Options", video:"HTML5 Video", audio:"HTML5 Audio", flash:"Flash", quicktime:"QuickTime", shockwave:"Shockwave", windowsmedia:"Windows Media", realmedia:"Real Media", iframe:"Iframe", embeddedaudio:"Embedded Audio" });
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/media.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/media.htm
new file mode 100644
index 0000000..957d83a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/media.htm
@@ -0,0 +1,922 @@
+
+
+
+ {#media_dlg.title}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/moxieplayer.swf b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/moxieplayer.swf
new file mode 100644
index 0000000..585d772
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/media_orig/moxieplayer.swf differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js
new file mode 100644
index 0000000..687f548
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Nonbreaking",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceNonBreaking",function(){a.execCommand("mceInsertContent",false,(a.plugins.visualchars&&a.plugins.visualchars.state)?' ':" ")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(f.keyCode==9){f.preventDefault();d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking")}})}},getInfo:function(){return{longname:"Nonbreaking space",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("nonbreaking",tinymce.plugins.Nonbreaking)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
new file mode 100644
index 0000000..d492fbe
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
@@ -0,0 +1,54 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.Nonbreaking', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceNonBreaking', function() {
+ ed.execCommand('mceInsertContent', false, (ed.plugins.visualchars && ed.plugins.visualchars.state) ? ' ' : ' ');
+ });
+
+ // Register buttons
+ ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'});
+
+ if (ed.getParam('nonbreaking_force_tab')) {
+ ed.onKeyDown.add(function(ed, e) {
+ if (e.keyCode == 9) {
+ e.preventDefault();
+
+ ed.execCommand('mceNonBreaking');
+ ed.execCommand('mceNonBreaking');
+ ed.execCommand('mceNonBreaking');
+ }
+ });
+ }
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Nonbreaking space',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/nonbreaking',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+
+ // Private methods
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('nonbreaking', tinymce.plugins.Nonbreaking);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js
new file mode 100644
index 0000000..da411eb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var c=tinymce.dom.TreeWalker;var a="contenteditable",d="data-mce-"+a;var e=tinymce.VK;function b(n){var j=n.dom,p=n.selection,r,o="mce_noneditablecaret",r="\uFEFF";function m(t){var s;if(t.nodeType===1){s=t.getAttribute(d);if(s&&s!=="inherit"){return s}s=t.contentEditable;if(s!=="inherit"){return s}}return null}function g(s){var t;while(s){t=m(s);if(t){return t==="false"?s:null}s=s.parentNode}}function l(s){while(s){if(s.id===o){return s}s=s.parentNode}}function k(s){var t;if(s){t=new c(s,s);for(s=t.current();s;s=t.next()){if(s.nodeType===3){return s}}}}function f(v,u){var s,t;if(m(v)==="false"){if(j.isBlock(v)){p.select(v);return}}t=j.createRng();if(m(v)==="true"){if(!v.firstChild){v.appendChild(n.getDoc().createTextNode("\u00a0"))}v=v.firstChild;u=true}s=j.create("span",{id:o,"data-mce-bogus":true},r);if(u){v.parentNode.insertBefore(s,v)}else{j.insertAfter(s,v)}t.setStart(s.firstChild,1);t.collapse(true);p.setRng(t);return s}function i(s){var v,t,u;if(s){rng=p.getRng(true);rng.setStartBefore(s);rng.setEndBefore(s);v=k(s);if(v&&v.nodeValue.charAt(0)==r){v=v.deleteData(0,1)}j.remove(s,true);p.setRng(rng)}else{t=l(p.getStart());while((s=j.get(o))&&s!==u){if(t!==s){v=k(s);if(v&&v.nodeValue.charAt(0)==r){v=v.deleteData(0,1)}j.remove(s,true)}u=s}}}function q(){var s,w,u,t,v;function x(B,D){var A,F,E,C,z;A=t.startContainer;F=t.startOffset;if(A.nodeType==3){z=A.nodeValue.length;if((F>0&&F0?F-1:F;A=A.childNodes[G];if(A.hasChildNodes()){A=A.firstChild}}else{return !D?B:null}}E=new c(A,B);while(C=E[D?"prev":"next"]()){if(C.nodeType===3&&C.nodeValue.length>0){return}else{if(m(C)==="true"){return C}}}return B}i();u=p.isCollapsed();s=g(p.getStart());w=g(p.getEnd());if(s||w){t=p.getRng(true);if(u){s=s||w;var y=p.getStart();if(v=x(s,true)){f(v,true)}else{if(v=x(s,false)){f(v,false)}else{p.select(s)}}}else{t=p.getRng(true);if(s){t.setStartBefore(s)}if(w){t.setEndAfter(w)}p.setRng(t)}}}function h(z,B){var F=B.keyCode,x,C,D,v;function u(H,G){while(H=H[G?"previousSibling":"nextSibling"]){if(H.nodeType!==3||H.nodeValue.length>0){return H}}}function y(G,H){p.select(G);p.collapse(H)}function t(K){var J,I,M,H;function G(O){var N=I;while(N){if(N===O){return}N=N.parentNode}j.remove(O);q()}function L(){var O,P,N=z.schema.getNonEmptyElements();P=new tinymce.dom.TreeWalker(I,z.getBody());while(O=(K?P.prev():P.next())){if(N[O.nodeName.toLowerCase()]){break}if(O.nodeType===3&&tinymce.trim(O.nodeValue).length>0){break}if(m(O)==="false"){G(O);return true}}if(g(O)){return true}return false}if(p.isCollapsed()){J=p.getRng(true);I=J.startContainer;M=J.startOffset;I=l(I)||I;if(H=g(I)){G(H);return false}if(I.nodeType==3&&(K?M>0:M124)&&F!=e.DELETE&&F!=e.BACKSPACE){if((tinymce.isMac?B.metaKey:B.ctrlKey)&&(F==67||F==88||F==86)){return}B.preventDefault();if(F==e.LEFT||F==e.RIGHT){var w=F==e.LEFT;if(z.dom.isBlock(x)){var A=w?x.previousSibling:x.nextSibling;var s=new c(A,A);var E=w?s.prev():s.next();y(E,!w)}else{y(x,w)}}}else{if(F==e.LEFT||F==e.RIGHT||F==e.BACKSPACE||F==e.DELETE){C=l(D);if(C){if(F==e.LEFT||F==e.BACKSPACE){x=u(C,true);if(x&&m(x)==="false"){B.preventDefault();if(F==e.LEFT){y(x,true)}else{j.remove(x);return}}else{i(C)}}if(F==e.RIGHT||F==e.DELETE){x=u(C);if(x&&m(x)==="false"){B.preventDefault();if(F==e.RIGHT){y(x,false)}else{j.remove(x);return}}else{i(C)}}}if((F==e.BACKSPACE||F==e.DELETE)&&!t(F==e.BACKSPACE)){B.preventDefault();return false}}}}n.onMouseDown.addToTop(function(s,u){var t=s.selection.getNode();if(m(t)==="false"&&t==u.target){q()}});n.onMouseUp.addToTop(q);n.onKeyDown.addToTop(h);n.onKeyUp.addToTop(q)}tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(i,k){var h,g,j;function f(m,n){var o=j.length,p=n.content,l=tinymce.trim(g);if(n.format=="raw"){return}while(o--){p=p.replace(j[o],function(s){var r=arguments,q=r[r.length-2];if(q>0&&p.charAt(q-1)=='"'){return s}return''+m.dom.encode(typeof(r[1])==="string"?r[1]:r[0])+""})}n.content=p}h=" "+tinymce.trim(i.getParam("noneditable_editable_class","mceEditable"))+" ";g=" "+tinymce.trim(i.getParam("noneditable_noneditable_class","mceNonEditable"))+" ";j=i.getParam("noneditable_regexp");if(j&&!j.length){j=[j]}i.onPreInit.add(function(){b(i);if(j){i.selection.onBeforeSetContent.add(f);i.onBeforeSetContent.add(f)}i.parser.addAttributeFilter("class",function(l){var m=l.length,n,o;while(m--){o=l[m];n=" "+o.attr("class")+" ";if(n.indexOf(h)!==-1){o.attr(d,"true")}else{if(n.indexOf(g)!==-1){o.attr(d,"false")}}}});i.serializer.addAttributeFilter(d,function(l,m){var n=l.length,o;while(n--){o=l[n];if(j&&o.attr("data-mce-content")){o.name="#text";o.type=3;o.raw=true;o.value=o.attr("data-mce-content")}else{o.attr(a,null);o.attr(d,null)}}});i.parser.addAttributeFilter(a,function(l,m){var n=l.length,o;while(n--){o=l[n];o.attr(d,o.attr(a));o.attr(a,null)}})})},getInfo:function(){return{longname:"Non editable elements",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js
new file mode 100644
index 0000000..a18bcd7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/noneditable/editor_plugin_src.js
@@ -0,0 +1,537 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var TreeWalker = tinymce.dom.TreeWalker;
+ var externalName = 'contenteditable', internalName = 'data-mce-' + externalName;
+ var VK = tinymce.VK;
+
+ function handleContentEditableSelection(ed) {
+ var dom = ed.dom, selection = ed.selection, invisibleChar, caretContainerId = 'mce_noneditablecaret', invisibleChar = '\uFEFF';
+
+ // Returns the content editable state of a node "true/false" or null
+ function getContentEditable(node) {
+ var contentEditable;
+
+ // Ignore non elements
+ if (node.nodeType === 1) {
+ // Check for fake content editable
+ contentEditable = node.getAttribute(internalName);
+ if (contentEditable && contentEditable !== "inherit") {
+ return contentEditable;
+ }
+
+ // Check for real content editable
+ contentEditable = node.contentEditable;
+ if (contentEditable !== "inherit") {
+ return contentEditable;
+ }
+ }
+
+ return null;
+ };
+
+ // Returns the noneditable parent or null if there is a editable before it or if it wasn't found
+ function getNonEditableParent(node) {
+ var state;
+
+ while (node) {
+ state = getContentEditable(node);
+ if (state) {
+ return state === "false" ? node : null;
+ }
+
+ node = node.parentNode;
+ }
+ };
+
+ // Get caret container parent for the specified node
+ function getParentCaretContainer(node) {
+ while (node) {
+ if (node.id === caretContainerId) {
+ return node;
+ }
+
+ node = node.parentNode;
+ }
+ };
+
+ // Finds the first text node in the specified node
+ function findFirstTextNode(node) {
+ var walker;
+
+ if (node) {
+ walker = new TreeWalker(node, node);
+
+ for (node = walker.current(); node; node = walker.next()) {
+ if (node.nodeType === 3) {
+ return node;
+ }
+ }
+ }
+ };
+
+ // Insert caret container before/after target or expand selection to include block
+ function insertCaretContainerOrExpandToBlock(target, before) {
+ var caretContainer, rng;
+
+ // Select block
+ if (getContentEditable(target) === "false") {
+ if (dom.isBlock(target)) {
+ selection.select(target);
+ return;
+ }
+ }
+
+ rng = dom.createRng();
+
+ if (getContentEditable(target) === "true") {
+ if (!target.firstChild) {
+ target.appendChild(ed.getDoc().createTextNode('\u00a0'));
+ }
+
+ target = target.firstChild;
+ before = true;
+ }
+
+ //caretContainer = dom.create('span', {id: caretContainerId, 'data-mce-bogus': true, style:'border: 1px solid red'}, invisibleChar);
+ caretContainer = dom.create('span', {id: caretContainerId, 'data-mce-bogus': true}, invisibleChar);
+
+ if (before) {
+ target.parentNode.insertBefore(caretContainer, target);
+ } else {
+ dom.insertAfter(caretContainer, target);
+ }
+
+ rng.setStart(caretContainer.firstChild, 1);
+ rng.collapse(true);
+ selection.setRng(rng);
+
+ return caretContainer;
+ };
+
+ // Removes any caret container except the one we might be in
+ function removeCaretContainer(caretContainer) {
+ var child, currentCaretContainer, lastContainer;
+
+ if (caretContainer) {
+ rng = selection.getRng(true);
+ rng.setStartBefore(caretContainer);
+ rng.setEndBefore(caretContainer);
+
+ child = findFirstTextNode(caretContainer);
+ if (child && child.nodeValue.charAt(0) == invisibleChar) {
+ child = child.deleteData(0, 1);
+ }
+
+ dom.remove(caretContainer, true);
+
+ selection.setRng(rng);
+ } else {
+ currentCaretContainer = getParentCaretContainer(selection.getStart());
+ while ((caretContainer = dom.get(caretContainerId)) && caretContainer !== lastContainer) {
+ if (currentCaretContainer !== caretContainer) {
+ child = findFirstTextNode(caretContainer);
+ if (child && child.nodeValue.charAt(0) == invisibleChar) {
+ child = child.deleteData(0, 1);
+ }
+
+ dom.remove(caretContainer, true);
+ }
+
+ lastContainer = caretContainer;
+ }
+ }
+ };
+
+ // Modifies the selection to include contentEditable false elements or insert caret containers
+ function moveSelection() {
+ var nonEditableStart, nonEditableEnd, isCollapsed, rng, element;
+
+ // Checks if there is any contents to the left/right side of caret returns the noneditable element or any editable element if it finds one inside
+ function hasSideContent(element, left) {
+ var container, offset, walker, node, len;
+
+ container = rng.startContainer;
+ offset = rng.startOffset;
+
+ // If endpoint is in middle of text node then expand to beginning/end of element
+ if (container.nodeType == 3) {
+ len = container.nodeValue.length;
+ if ((offset > 0 && offset < len) || (left ? offset == len : offset == 0)) {
+ return;
+ }
+ } else {
+ // Can we resolve the node by index
+ if (offset < container.childNodes.length) {
+ // Browser represents caret position as the offset at the start of an element. When moving right
+ // this is the element we are moving into so we consider our container to be child node at offset-1
+ var pos = !left && offset > 0 ? offset-1 : offset;
+ container = container.childNodes[pos];
+ if (container.hasChildNodes()) {
+ container = container.firstChild;
+ }
+ } else {
+ // If not then the caret is at the last position in it's container and the caret container should be inserted after the noneditable element
+ return !left ? element : null;
+ }
+ }
+
+ // Walk left/right to look for contents
+ walker = new TreeWalker(container, element);
+ while (node = walker[left ? 'prev' : 'next']()) {
+ if (node.nodeType === 3 && node.nodeValue.length > 0) {
+ return;
+ } else if (getContentEditable(node) === "true") {
+ // Found contentEditable=true element return this one to we can move the caret inside it
+ return node;
+ }
+ }
+
+ return element;
+ };
+
+ // Remove any existing caret containers
+ removeCaretContainer();
+
+ // Get noneditable start/end elements
+ isCollapsed = selection.isCollapsed();
+ nonEditableStart = getNonEditableParent(selection.getStart());
+ nonEditableEnd = getNonEditableParent(selection.getEnd());
+
+ // Is any fo the range endpoints noneditable
+ if (nonEditableStart || nonEditableEnd) {
+ rng = selection.getRng(true);
+
+ // If it's a caret selection then look left/right to see if we need to move the caret out side or expand
+ if (isCollapsed) {
+ nonEditableStart = nonEditableStart || nonEditableEnd;
+ var start = selection.getStart();
+ if (element = hasSideContent(nonEditableStart, true)) {
+ // We have no contents to the left of the caret then insert a caret container before the noneditable element
+ insertCaretContainerOrExpandToBlock(element, true);
+ } else if (element = hasSideContent(nonEditableStart, false)) {
+ // We have no contents to the right of the caret then insert a caret container after the noneditable element
+ insertCaretContainerOrExpandToBlock(element, false);
+ } else {
+ // We are in the middle of a noneditable so expand to select it
+ selection.select(nonEditableStart);
+ }
+ } else {
+ rng = selection.getRng(true);
+
+ // Expand selection to include start non editable element
+ if (nonEditableStart) {
+ rng.setStartBefore(nonEditableStart);
+ }
+
+ // Expand selection to include end non editable element
+ if (nonEditableEnd) {
+ rng.setEndAfter(nonEditableEnd);
+ }
+
+ selection.setRng(rng);
+ }
+ }
+ };
+
+ function handleKey(ed, e) {
+ var keyCode = e.keyCode, nonEditableParent, caretContainer, startElement, endElement;
+
+ function getNonEmptyTextNodeSibling(node, prev) {
+ while (node = node[prev ? 'previousSibling' : 'nextSibling']) {
+ if (node.nodeType !== 3 || node.nodeValue.length > 0) {
+ return node;
+ }
+ }
+ };
+
+ function positionCaretOnElement(element, start) {
+ selection.select(element);
+ selection.collapse(start);
+ }
+
+ function canDelete(backspace) {
+ var rng, container, offset, nonEditableParent;
+
+ function removeNodeIfNotParent(node) {
+ var parent = container;
+
+ while (parent) {
+ if (parent === node) {
+ return;
+ }
+
+ parent = parent.parentNode;
+ }
+
+ dom.remove(node);
+ moveSelection();
+ }
+
+ function isNextPrevTreeNodeNonEditable() {
+ var node, walker, nonEmptyElements = ed.schema.getNonEmptyElements();
+
+ walker = new tinymce.dom.TreeWalker(container, ed.getBody());
+ while (node = (backspace ? walker.prev() : walker.next())) {
+ // Found IMG/INPUT etc
+ if (nonEmptyElements[node.nodeName.toLowerCase()]) {
+ break;
+ }
+
+ // Found text node with contents
+ if (node.nodeType === 3 && tinymce.trim(node.nodeValue).length > 0) {
+ break;
+ }
+
+ // Found non editable node
+ if (getContentEditable(node) === "false") {
+ removeNodeIfNotParent(node);
+ return true;
+ }
+ }
+
+ // Check if the content node is within a non editable parent
+ if (getNonEditableParent(node)) {
+ return true;
+ }
+
+ return false;
+ }
+
+ if (selection.isCollapsed()) {
+ rng = selection.getRng(true);
+ container = rng.startContainer;
+ offset = rng.startOffset;
+ container = getParentCaretContainer(container) || container;
+
+ // Is in noneditable parent
+ if (nonEditableParent = getNonEditableParent(container)) {
+ removeNodeIfNotParent(nonEditableParent);
+ return false;
+ }
+
+ // Check if the caret is in the middle of a text node
+ if (container.nodeType == 3 && (backspace ? offset > 0 : offset < container.nodeValue.length)) {
+ return true;
+ }
+
+ // Resolve container index
+ if (container.nodeType == 1) {
+ container = container.childNodes[offset] || container;
+ }
+
+ // Check if previous or next tree node is non editable then block the event
+ if (isNextPrevTreeNodeNonEditable()) {
+ return false;
+ }
+ }
+
+ return true;
+ }
+
+ startElement = selection.getStart()
+ endElement = selection.getEnd();
+
+ // Disable all key presses in contentEditable=false except delete or backspace
+ nonEditableParent = getNonEditableParent(startElement) || getNonEditableParent(endElement);
+ if (nonEditableParent && (keyCode < 112 || keyCode > 124) && keyCode != VK.DELETE && keyCode != VK.BACKSPACE) {
+ // Is Ctrl+c, Ctrl+v or Ctrl+x then use default browser behavior
+ if ((tinymce.isMac ? e.metaKey : e.ctrlKey) && (keyCode == 67 || keyCode == 88 || keyCode == 86)) {
+ return;
+ }
+
+ e.preventDefault();
+
+ // Arrow left/right select the element and collapse left/right
+ if (keyCode == VK.LEFT || keyCode == VK.RIGHT) {
+ var left = keyCode == VK.LEFT;
+ // If a block element find previous or next element to position the caret
+ if (ed.dom.isBlock(nonEditableParent)) {
+ var targetElement = left ? nonEditableParent.previousSibling : nonEditableParent.nextSibling;
+ var walker = new TreeWalker(targetElement, targetElement);
+ var caretElement = left ? walker.prev() : walker.next();
+ positionCaretOnElement(caretElement, !left);
+ } else {
+ positionCaretOnElement(nonEditableParent, left);
+ }
+ }
+ } else {
+ // Is arrow left/right, backspace or delete
+ if (keyCode == VK.LEFT || keyCode == VK.RIGHT || keyCode == VK.BACKSPACE || keyCode == VK.DELETE) {
+ caretContainer = getParentCaretContainer(startElement);
+ if (caretContainer) {
+ // Arrow left or backspace
+ if (keyCode == VK.LEFT || keyCode == VK.BACKSPACE) {
+ nonEditableParent = getNonEmptyTextNodeSibling(caretContainer, true);
+
+ if (nonEditableParent && getContentEditable(nonEditableParent) === "false") {
+ e.preventDefault();
+
+ if (keyCode == VK.LEFT) {
+ positionCaretOnElement(nonEditableParent, true);
+ } else {
+ dom.remove(nonEditableParent);
+ return;
+ }
+ } else {
+ removeCaretContainer(caretContainer);
+ }
+ }
+
+ // Arrow right or delete
+ if (keyCode == VK.RIGHT || keyCode == VK.DELETE) {
+ nonEditableParent = getNonEmptyTextNodeSibling(caretContainer);
+
+ if (nonEditableParent && getContentEditable(nonEditableParent) === "false") {
+ e.preventDefault();
+
+ if (keyCode == VK.RIGHT) {
+ positionCaretOnElement(nonEditableParent, false);
+ } else {
+ dom.remove(nonEditableParent);
+ return;
+ }
+ } else {
+ removeCaretContainer(caretContainer);
+ }
+ }
+ }
+
+ if ((keyCode == VK.BACKSPACE || keyCode == VK.DELETE) && !canDelete(keyCode == VK.BACKSPACE)) {
+ e.preventDefault();
+ return false;
+ }
+ }
+ }
+ };
+
+ ed.onMouseDown.addToTop(function(ed, e) {
+ var node = ed.selection.getNode();
+
+ if (getContentEditable(node) === "false" && node == e.target) {
+ // Expand selection on mouse down we can't block the default event since it's used for drag/drop
+ moveSelection();
+ }
+ });
+
+ ed.onMouseUp.addToTop(moveSelection);
+ ed.onKeyDown.addToTop(handleKey);
+ ed.onKeyUp.addToTop(moveSelection);
+ };
+
+ tinymce.create('tinymce.plugins.NonEditablePlugin', {
+ init : function(ed, url) {
+ var editClass, nonEditClass, nonEditableRegExps;
+
+ // Converts configured regexps to noneditable span items
+ function convertRegExpsToNonEditable(ed, args) {
+ var i = nonEditableRegExps.length, content = args.content, cls = tinymce.trim(nonEditClass);
+
+ // Don't replace the variables when raw is used for example on undo/redo
+ if (args.format == "raw") {
+ return;
+ }
+
+ while (i--) {
+ content = content.replace(nonEditableRegExps[i], function(match) {
+ var args = arguments, index = args[args.length - 2];
+
+ // Is value inside an attribute then don't replace
+ if (index > 0 && content.charAt(index - 1) == '"') {
+ return match;
+ }
+
+ return '' + ed.dom.encode(typeof(args[1]) === "string" ? args[1] : args[0]) + '';
+ });
+ }
+
+ args.content = content;
+ };
+
+ editClass = " " + tinymce.trim(ed.getParam("noneditable_editable_class", "mceEditable")) + " ";
+ nonEditClass = " " + tinymce.trim(ed.getParam("noneditable_noneditable_class", "mceNonEditable")) + " ";
+
+ // Setup noneditable regexps array
+ nonEditableRegExps = ed.getParam("noneditable_regexp");
+ if (nonEditableRegExps && !nonEditableRegExps.length) {
+ nonEditableRegExps = [nonEditableRegExps];
+ }
+
+ ed.onPreInit.add(function() {
+ handleContentEditableSelection(ed);
+
+ if (nonEditableRegExps) {
+ ed.selection.onBeforeSetContent.add(convertRegExpsToNonEditable);
+ ed.onBeforeSetContent.add(convertRegExpsToNonEditable);
+ }
+
+ // Apply contentEditable true/false on elements with the noneditable/editable classes
+ ed.parser.addAttributeFilter('class', function(nodes) {
+ var i = nodes.length, className, node;
+
+ while (i--) {
+ node = nodes[i];
+ className = " " + node.attr("class") + " ";
+
+ if (className.indexOf(editClass) !== -1) {
+ node.attr(internalName, "true");
+ } else if (className.indexOf(nonEditClass) !== -1) {
+ node.attr(internalName, "false");
+ }
+ }
+ });
+
+ // Remove internal name
+ ed.serializer.addAttributeFilter(internalName, function(nodes, name) {
+ var i = nodes.length, node;
+
+ while (i--) {
+ node = nodes[i];
+
+ if (nonEditableRegExps && node.attr('data-mce-content')) {
+ node.name = "#text";
+ node.type = 3;
+ node.raw = true;
+ node.value = node.attr('data-mce-content');
+ } else {
+ node.attr(externalName, null);
+ node.attr(internalName, null);
+ }
+ }
+ });
+
+ // Convert external name into internal name
+ ed.parser.addAttributeFilter(externalName, function(nodes, name) {
+ var i = nodes.length, node;
+
+ while (i--) {
+ node = nodes[i];
+ node.attr(internalName, node.attr(externalName));
+ node.attr(externalName, null);
+ }
+ });
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Non editable elements',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/noneditable',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js
new file mode 100644
index 0000000..35085e8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='
',a="mcePageBreak",c=b.getParam("pagebreak_separator",""),e;e=new RegExp(c.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g,function(g){return"\\"+g}),"g");b.addCommand("mcePageBreak",function(){b.execCommand("mceInsertContent",0,f)});b.addButton("pagebreak",{title:"pagebreak.desc",cmd:a});b.onInit.add(function(){if(b.theme.onResolveName){b.theme.onResolveName.add(function(g,h){if(h.node.nodeName=="IMG"&&b.dom.hasClass(h.node,a)){h.name="pagebreak"}})}});b.onClick.add(function(g,h){h=h.target;if(h.nodeName==="IMG"&&g.dom.hasClass(h,a)){g.selection.select(h)}});b.onNodeChange.add(function(h,g,i){g.setActive("pagebreak",i.nodeName==="IMG"&&h.dom.hasClass(i,a))});b.onBeforeSetContent.add(function(g,h){h.content=h.content.replace(e,f)});b.onPostProcess.add(function(g,h){if(h.get){h.content=h.content.replace(/
]+>/g,function(i){if(i.indexOf('class="mcePageBreak')!==-1){i=c}return i})}})},getInfo:function(){return{longname:"PageBreak",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("pagebreak",tinymce.plugins.PageBreakPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js
new file mode 100644
index 0000000..a094c19
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/pagebreak/editor_plugin_src.js
@@ -0,0 +1,74 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.PageBreakPlugin', {
+ init : function(ed, url) {
+ var pb = '
', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', ''), pbRE;
+
+ pbRE = new RegExp(sep.replace(/[\?\.\*\[\]\(\)\{\}\+\^\$\:]/g, function(a) {return '\\' + a;}), 'g');
+
+ // Register commands
+ ed.addCommand('mcePageBreak', function() {
+ ed.execCommand('mceInsertContent', 0, pb);
+ });
+
+ // Register buttons
+ ed.addButton('pagebreak', {title : 'pagebreak.desc', cmd : cls});
+
+ ed.onInit.add(function() {
+ if (ed.theme.onResolveName) {
+ ed.theme.onResolveName.add(function(th, o) {
+ if (o.node.nodeName == 'IMG' && ed.dom.hasClass(o.node, cls))
+ o.name = 'pagebreak';
+ });
+ }
+ });
+
+ ed.onClick.add(function(ed, e) {
+ e = e.target;
+
+ if (e.nodeName === 'IMG' && ed.dom.hasClass(e, cls))
+ ed.selection.select(e);
+ });
+
+ ed.onNodeChange.add(function(ed, cm, n) {
+ cm.setActive('pagebreak', n.nodeName === 'IMG' && ed.dom.hasClass(n, cls));
+ });
+
+ ed.onBeforeSetContent.add(function(ed, o) {
+ o.content = o.content.replace(pbRE, pb);
+ });
+
+ ed.onPostProcess.add(function(ed, o) {
+ if (o.get)
+ o.content = o.content.replace(/
]+>/g, function(im) {
+ if (im.indexOf('class="mcePageBreak') !== -1)
+ im = sep;
+
+ return im;
+ });
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'PageBreak',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/pagebreak',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('pagebreak', tinymce.plugins.PageBreakPlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js
new file mode 100644
index 0000000..0ab05eb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_max_consecutive_linebreaks:2,paste_text_use_dialog:false,paste_text_sticky:false,paste_text_sticky_default:false,paste_text_notifyalways:false,paste_text_linebreaktype:"combined",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=b(d,"paste_text_sticky_default");function h(l,j){var k=d.dom,i;f.onPreProcess.dispatch(f,l);l.node=k.create("div",0,l.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){if(l.node.childNodes.length===1&&/^(p|h[1-6]|pre)$/i.test(l.node.firstChild.nodeName)&&l.content.indexOf("__MCE_ITEM__")===-1){k.remove(l.node.firstChild,true)}}}f.onPostProcess.dispatch(f,l);l.content=d.serializer.serialize(l.node,{getInner:1,forced_root_block:""});if((!j)&&(d.pasteAsPlainText)){f._insertPlainText(l.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(l.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:o.encode(r).replace(/\r?\n/g,"
")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort(d.getWin()).y}o.setStyles(l,{position:"absolute",left:tinymce.isGecko?-40:0,top:i-25,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u=""+o.encode(r).replace(/\r?\n\r?\n/g,"
").replace(/\r?\n/g,"
")+"
"}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9&&/<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/.test(e.content)){d([[/(?:
[\s\r\n]+|
)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
[\s\r\n]+|
)*/g,"$1"]]);d([[/
/g,"
"],[/
/g," "],[/
/g,"
"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*( )+/gi,/( |
]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"
$1
")}if(b(k,"paste_convert_middot_lists")){d([[//gi,"$&__MCE_ITEM__"],[/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/"/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/]*>/gi,""],[/<\/h[1-6][^>]*>/gi,"
"]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(j){var h=this.editor,f=b(h,"paste_text_linebreaktype"),k=b(h,"paste_text_replacements"),g=tinymce.is;function e(m){c(m,function(n){if(n.constructor==RegExp){j=j.replace(n,"")}else{j=j.replace(n[0],n[1])}})}if((typeof(j)==="string")&&(j.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(j)){e([/[\n\r]+/g])}else{e([/\r+/g])}e([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/
]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"]]);var d=Number(b(h,"paste_max_consecutive_linebreaks"));if(d>-1){var l=new RegExp("\n{"+(d+1)+",}","g");var i="";while(i.length"]])}else{if(f=="p"){e([[/\n+/g,"
"],[/^(.*<\/p>)(
)$/,"
$1"]])}else{e([[/\n\n/g,"
"],[/^(.*<\/p>)(
)$/,"
$1"],[/\n/g,"
"]])}}}h.execCommand("mceInsertContent",false,j)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js
new file mode 100644
index 0000000..0154ece
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/editor_plugin_src.js
@@ -0,0 +1,885 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var each = tinymce.each,
+ defs = {
+ paste_auto_cleanup_on_paste : true,
+ paste_enable_default_filters : true,
+ paste_block_drop : false,
+ paste_retain_style_properties : "none",
+ paste_strip_class_attributes : "mso",
+ paste_remove_spans : false,
+ paste_remove_styles : false,
+ paste_remove_styles_if_webkit : true,
+ paste_convert_middot_lists : true,
+ paste_convert_headers_to_strong : false,
+ paste_dialog_width : "450",
+ paste_dialog_height : "400",
+ paste_max_consecutive_linebreaks: 2,
+ paste_text_use_dialog : false,
+ paste_text_sticky : false,
+ paste_text_sticky_default : false,
+ paste_text_notifyalways : false,
+ paste_text_linebreaktype : "combined",
+ paste_text_replacements : [
+ [/\u2026/g, "..."],
+ [/[\x93\x94\u201c\u201d]/g, '"'],
+ [/[\x60\x91\x92\u2018\u2019]/g, "'"]
+ ]
+ };
+
+ function getParam(ed, name) {
+ return ed.getParam(name, defs[name]);
+ }
+
+ tinymce.create('tinymce.plugins.PastePlugin', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+ t.url = url;
+
+ // Setup plugin events
+ t.onPreProcess = new tinymce.util.Dispatcher(t);
+ t.onPostProcess = new tinymce.util.Dispatcher(t);
+
+ // Register default handlers
+ t.onPreProcess.add(t._preProcess);
+ t.onPostProcess.add(t._postProcess);
+
+ // Register optional preprocess handler
+ t.onPreProcess.add(function(pl, o) {
+ ed.execCallback('paste_preprocess', pl, o);
+ });
+
+ // Register optional postprocess
+ t.onPostProcess.add(function(pl, o) {
+ ed.execCallback('paste_postprocess', pl, o);
+ });
+
+ ed.onKeyDown.addToTop(function(ed, e) {
+ // Block ctrl+v from adding an undo level since the default logic in tinymce.Editor will add that
+ if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
+ return false; // Stop other listeners
+ });
+
+ // Initialize plain text flag
+ ed.pasteAsPlainText = getParam(ed, 'paste_text_sticky_default');
+
+ // This function executes the process handlers and inserts the contents
+ // force_rich overrides plain text mode set by user, important for pasting with execCommand
+ function process(o, force_rich) {
+ var dom = ed.dom, rng;
+
+ // Execute pre process handlers
+ t.onPreProcess.dispatch(t, o);
+
+ // Create DOM structure
+ o.node = dom.create('div', 0, o.content);
+
+ // If pasting inside the same element and the contents is only one block
+ // remove the block and keep the text since Firefox will copy parts of pre and h1-h6 as a pre element
+ if (tinymce.isGecko) {
+ rng = ed.selection.getRng(true);
+ if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) {
+ // Is only one block node and it doesn't contain word stuff
+ if (o.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(o.node.firstChild.nodeName) && o.content.indexOf('__MCE_ITEM__') === -1)
+ dom.remove(o.node.firstChild, true);
+ }
+ }
+
+ // Execute post process handlers
+ t.onPostProcess.dispatch(t, o);
+
+ // Serialize content
+ o.content = ed.serializer.serialize(o.node, {getInner : 1, forced_root_block : ''});
+
+ // Plain text option active?
+ if ((!force_rich) && (ed.pasteAsPlainText)) {
+ t._insertPlainText(o.content);
+
+ if (!getParam(ed, "paste_text_sticky")) {
+ ed.pasteAsPlainText = false;
+ ed.controlManager.setActive("pastetext", false);
+ }
+ } else {
+ t._insert(o.content);
+ }
+ }
+
+ // Add command for external usage
+ ed.addCommand('mceInsertClipboardContent', function(u, o) {
+ process(o, true);
+ });
+
+ if (!getParam(ed, "paste_text_use_dialog")) {
+ ed.addCommand('mcePasteText', function(u, v) {
+ var cookie = tinymce.util.Cookie;
+
+ ed.pasteAsPlainText = !ed.pasteAsPlainText;
+ ed.controlManager.setActive('pastetext', ed.pasteAsPlainText);
+
+ if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) {
+ if (getParam(ed, "paste_text_sticky")) {
+ ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));
+ } else {
+ ed.windowManager.alert(ed.translate('paste.plaintext_mode'));
+ }
+
+ if (!getParam(ed, "paste_text_notifyalways")) {
+ cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31))
+ }
+ }
+ });
+ }
+
+ ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'});
+ ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'});
+
+ // This function grabs the contents from the clipboard by adding a
+ // hidden div and placing the caret inside it and after the browser paste
+ // is done it grabs that contents and processes that
+ function grabContent(e) {
+ var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent;
+
+ // Check if browser supports direct plaintext access
+ if (e.clipboardData || dom.doc.dataTransfer) {
+ textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');
+
+ if (ed.pasteAsPlainText) {
+ e.preventDefault();
+ process({content : dom.encode(textContent).replace(/\r?\n/g, '
')});
+ return;
+ }
+ }
+
+ if (dom.get('_mcePaste'))
+ return;
+
+ // Create container to paste into
+ n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');
+
+ // If contentEditable mode we need to find out the position of the closest element
+ if (body != ed.getDoc().body)
+ posY = dom.getPos(ed.selection.getStart(), body).y;
+ else
+ posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;
+
+ // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
+ // If also needs to be in view on IE or the paste would fail
+ dom.setStyles(n, {
+ position : 'absolute',
+ left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
+ top : posY - 25,
+ width : 1,
+ height : 1,
+ overflow : 'hidden'
+ });
+
+ if (tinymce.isIE) {
+ // Store away the old range
+ oldRng = sel.getRng();
+
+ // Select the container
+ rng = dom.doc.body.createTextRange();
+ rng.moveToElementText(n);
+ rng.execCommand('Paste');
+
+ // Remove container
+ dom.remove(n);
+
+ // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
+ // to IE security settings so we pass the junk though better than nothing right
+ if (n.innerHTML === '\uFEFF\uFEFF') {
+ ed.execCommand('mcePasteWord');
+ e.preventDefault();
+ return;
+ }
+
+ // Restore the old range and clear the contents before pasting
+ sel.setRng(oldRng);
+ sel.setContent('');
+
+ // For some odd reason we need to detach the the mceInsertContent call from the paste event
+ // It's like IE has a reference to the parent element that you paste in and the selection gets messed up
+ // when it tries to restore the selection
+ setTimeout(function() {
+ // Process contents
+ process({content : n.innerHTML});
+ }, 0);
+
+ // Block the real paste event
+ return tinymce.dom.Event.cancel(e);
+ } else {
+ function block(e) {
+ e.preventDefault();
+ };
+
+ // Block mousedown and click to prevent selection change
+ dom.bind(ed.getDoc(), 'mousedown', block);
+ dom.bind(ed.getDoc(), 'keydown', block);
+
+ or = ed.selection.getRng();
+
+ // Move select contents inside DIV
+ n = n.firstChild;
+ rng = ed.getDoc().createRange();
+ rng.setStart(n, 0);
+ rng.setEnd(n, 2);
+ sel.setRng(rng);
+
+ // Wait a while and grab the pasted contents
+ window.setTimeout(function() {
+ var h = '', nl;
+
+ // Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit
+ if (!dom.select('div.mcePaste > div.mcePaste').length) {
+ nl = dom.select('div.mcePaste');
+
+ // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string
+ each(nl, function(n) {
+ var child = n.firstChild;
+
+ // WebKit inserts a DIV container with lots of odd styles
+ if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
+ dom.remove(child, 1);
+ }
+
+ // Remove apply style spans
+ each(dom.select('span.Apple-style-span', n), function(n) {
+ dom.remove(n, 1);
+ });
+
+ // Remove bogus br elements
+ each(dom.select('br[data-mce-bogus]', n), function(n) {
+ dom.remove(n);
+ });
+
+ // WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV
+ if (n.parentNode.className != 'mcePaste')
+ h += n.innerHTML;
+ });
+ } else {
+ // Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
+ // So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
+ h = '
' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '
').replace(/\r?\n/g, '
') + '
';
+ }
+
+ // Remove the nodes
+ each(dom.select('div.mcePaste'), function(n) {
+ dom.remove(n);
+ });
+
+ // Restore the old selection
+ if (or)
+ sel.setRng(or);
+
+ process({content : h});
+
+ // Unblock events ones we got the contents
+ dom.unbind(ed.getDoc(), 'mousedown', block);
+ dom.unbind(ed.getDoc(), 'keydown', block);
+ }, 0);
+ }
+ }
+
+ // Check if we should use the new auto process method
+ if (getParam(ed, "paste_auto_cleanup_on_paste")) {
+ // Is it's Opera or older FF use key handler
+ if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
+ ed.onKeyDown.addToTop(function(ed, e) {
+ if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
+ grabContent(e);
+ });
+ } else {
+ // Grab contents on paste event on Gecko and WebKit
+ ed.onPaste.addToTop(function(ed, e) {
+ return grabContent(e);
+ });
+ }
+ }
+
+ ed.onInit.add(function() {
+ ed.controlManager.setActive("pastetext", ed.pasteAsPlainText);
+
+ // Block all drag/drop events
+ if (getParam(ed, "paste_block_drop")) {
+ ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ return false;
+ });
+ }
+ });
+
+ // Add legacy support
+ t._legacySupport();
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Paste text/word',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ _preProcess : function(pl, o) {
+ var ed = this.editor,
+ h = o.content,
+ grep = tinymce.grep,
+ explode = tinymce.explode,
+ trim = tinymce.trim,
+ len, stripClass;
+
+ //console.log('Before preprocess:' + o.content);
+
+ function process(items) {
+ each(items, function(v) {
+ // Remove or replace
+ if (v.constructor == RegExp)
+ h = h.replace(v, '');
+ else
+ h = h.replace(v[0], v[1]);
+ });
+ }
+
+ if (ed.settings.paste_enable_default_filters == false) {
+ return;
+ }
+
+ // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
+ if (tinymce.isIE && document.documentMode >= 9 && /<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/.test(o.content)) {
+ // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
+ process([[/(?:
[\s\r\n]+|
)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
[\s\r\n]+|
)*/g, '$1']]);
+
+ // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
+ process([
+ [/
/g, '
'], // Replace multiple BR elements with uppercase BR to keep them intact
+ [/
/g, ' '], // Replace single br elements with space since they are word wrap BR:s
+ [/
/g, '
'] // Replace back the double brs but into a single BR
+ ]);
+ }
+
+ // Detect Word content and process it more aggressive
+ if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) {
+ o.wordContent = true; // Mark the pasted contents as word specific content
+ //console.log('Word contents detected.');
+
+ // Process away some basic content
+ process([
+ /^\s*( )+/gi, // entities at the start of contents
+ /( |
]*>)+\s*$/gi // entities at the end of contents
+ ]);
+
+ if (getParam(ed, "paste_convert_headers_to_strong")) {
+ h = h.replace(/]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "
$1
");
+ }
+
+ if (getParam(ed, "paste_convert_middot_lists")) {
+ process([
+ [//gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker
+ [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item markers
+ [/(]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to item markers (FF)
+ ]);
+ }
+
+ process([
+ // Word comments like conditional comments etc
+ //gi,
+
+ // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags
+ /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,
+
+ // Convert into for line-though
+ [/<(\/?)s>/gi, "<$1strike>"],
+
+ // Replace nsbp entites to char since it's easier to handle
+ [/ /gi, "\u00a0"]
+ ]);
+
+ // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag.
+ // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot.
+ do {
+ len = h.length;
+ h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1");
+ } while (len != h.length);
+
+ // Remove all spans if no styles is to be retained
+ if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) {
+ h = h.replace(/<\/?span[^>]*>/gi, "");
+ } else {
+ // We're keeping styles, so at least clean them up.
+ // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx
+
+ process([
+ // Convert ___ to string of alternating breaking/non-breaking spaces of same length
+ [/([\s\u00a0]*)<\/span>/gi,
+ function(str, spaces) {
+ return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : "";
+ }
+ ],
+
+ // Examine all styles: delete junk, transform some, and keep the rest
+ [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,
+ function(str, tag, style) {
+ var n = [],
+ i = 0,
+ s = explode(trim(style).replace(/"/gi, "'"), ";");
+
+ // Examine each style definition within the tag's style attribute
+ each(s, function(v) {
+ var name, value,
+ parts = explode(v, ":");
+
+ function ensureUnits(v) {
+ return v + ((v !== "0") && (/\d$/.test(v)))? "px" : "";
+ }
+
+ if (parts.length == 2) {
+ name = parts[0].toLowerCase();
+ value = parts[1].toLowerCase();
+
+ // Translate certain MS Office styles into their CSS equivalents
+ switch (name) {
+ case "mso-padding-alt":
+ case "mso-padding-top-alt":
+ case "mso-padding-right-alt":
+ case "mso-padding-bottom-alt":
+ case "mso-padding-left-alt":
+ case "mso-margin-alt":
+ case "mso-margin-top-alt":
+ case "mso-margin-right-alt":
+ case "mso-margin-bottom-alt":
+ case "mso-margin-left-alt":
+ case "mso-table-layout-alt":
+ case "mso-height":
+ case "mso-width":
+ case "mso-vertical-align-alt":
+ n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value);
+ return;
+
+ case "horiz-align":
+ n[i++] = "text-align:" + value;
+ return;
+
+ case "vert-align":
+ n[i++] = "vertical-align:" + value;
+ return;
+
+ case "font-color":
+ case "mso-foreground":
+ n[i++] = "color:" + value;
+ return;
+
+ case "mso-background":
+ case "mso-highlight":
+ n[i++] = "background:" + value;
+ return;
+
+ case "mso-default-height":
+ n[i++] = "min-height:" + ensureUnits(value);
+ return;
+
+ case "mso-default-width":
+ n[i++] = "min-width:" + ensureUnits(value);
+ return;
+
+ case "mso-padding-between-alt":
+ n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value);
+ return;
+
+ case "text-line-through":
+ if ((value == "single") || (value == "double")) {
+ n[i++] = "text-decoration:line-through";
+ }
+ return;
+
+ case "mso-zero-height":
+ if (value == "yes") {
+ n[i++] = "display:none";
+ }
+ return;
+ }
+
+ // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name
+ if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) {
+ return;
+ }
+
+ // If it reached this point, it must be a valid CSS style
+ n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case
+ }
+ });
+
+ // If style attribute contained any valid styles the re-write it; otherwise delete style attribute.
+ if (i > 0) {
+ return tag + ' style="' + n.join(';') + '"';
+ } else {
+ return tag;
+ }
+ }
+ ]
+ ]);
+ }
+ }
+
+ // Replace headers with
+ if (getParam(ed, "paste_convert_headers_to_strong")) {
+ process([
+ [/]*>/gi, ""],
+ [/<\/h[1-6][^>]*>/gi, "
"]
+ ]);
+ }
+
+ process([
+ // Copy paste from Java like Open Office will produce this junk on FF
+ [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, '']
+ ]);
+
+ // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso").
+ // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation.
+ stripClass = getParam(ed, "paste_strip_class_attributes");
+
+ if (stripClass !== "none") {
+ function removeClasses(match, g1) {
+ if (stripClass === "all")
+ return '';
+
+ var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "),
+ function(v) {
+ return (/^(?!mso)/i.test(v));
+ }
+ );
+
+ return cls.length ? ' class="' + cls.join(" ") + '"' : '';
+ };
+
+ h = h.replace(/ class="([^"]+)"/gi, removeClasses);
+ h = h.replace(/ class=([\-\w]+)/gi, removeClasses);
+ }
+
+ // Remove spans option
+ if (getParam(ed, "paste_remove_spans")) {
+ h = h.replace(/<\/?span[^>]*>/gi, "");
+ }
+
+ //console.log('After preprocess:' + h);
+
+ o.content = h;
+ },
+
+ /**
+ * Various post process items.
+ */
+ _postProcess : function(pl, o) {
+ var t = this, ed = t.editor, dom = ed.dom, styleProps;
+
+ if (ed.settings.paste_enable_default_filters == false) {
+ return;
+ }
+
+ if (o.wordContent) {
+ // Remove named anchors or TOC links
+ each(dom.select('a', o.node), function(a) {
+ if (!a.href || a.href.indexOf('#_Toc') != -1)
+ dom.remove(a, 1);
+ });
+
+ if (getParam(ed, "paste_convert_middot_lists")) {
+ t._convertLists(pl, o);
+ }
+
+ // Process styles
+ styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties
+
+ // Process only if a string was specified and not equal to "all" or "*"
+ if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) {
+ styleProps = tinymce.explode(styleProps.replace(/^none$/i, ""));
+
+ // Retains some style properties
+ each(dom.select('*', o.node), function(el) {
+ var newStyle = {}, npc = 0, i, sp, sv;
+
+ // Store a subset of the existing styles
+ if (styleProps) {
+ for (i = 0; i < styleProps.length; i++) {
+ sp = styleProps[i];
+ sv = dom.getStyle(el, sp);
+
+ if (sv) {
+ newStyle[sp] = sv;
+ npc++;
+ }
+ }
+ }
+
+ // Remove all of the existing styles
+ dom.setAttrib(el, 'style', '');
+
+ if (styleProps && npc > 0)
+ dom.setStyles(el, newStyle); // Add back the stored subset of styles
+ else // Remove empty span tags that do not have class attributes
+ if (el.nodeName == 'SPAN' && !el.className)
+ dom.remove(el, true);
+ });
+ }
+ }
+
+ // Remove all style information or only specifically on WebKit to avoid the style bug on that browser
+ if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) {
+ each(dom.select('*[style]', o.node), function(el) {
+ el.removeAttribute('style');
+ el.removeAttribute('data-mce-style');
+ });
+ } else {
+ if (tinymce.isWebKit) {
+ // We need to compress the styles on WebKit since if you paste
it will become
+ // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles
+ each(dom.select('*', o.node), function(el) {
+ el.removeAttribute('data-mce-style');
+ });
+ }
+ }
+ },
+
+ /**
+ * Converts the most common bullet and number formats in Office into a real semantic UL/LI list.
+ */
+ _convertLists : function(pl, o) {
+ var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html;
+
+ // Convert middot lists into real semantic lists
+ each(dom.select('p', o.node), function(p) {
+ var sib, val = '', type, html, idx, parents;
+
+ // Get text node value at beginning of paragraph
+ for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling)
+ val += sib.nodeValue;
+
+ val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/ /g, '\u00a0');
+
+ // Detect unordered lists look for bullets
+ if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val))
+ type = 'ul';
+
+ // Detect ordered lists 1., a. or ixv.
+ if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val))
+ type = 'ol';
+
+ // Check if node value matches the list pattern: o
+ if (type) {
+ margin = parseFloat(p.style.marginLeft || 0);
+
+ if (margin > lastMargin)
+ levels.push(margin);
+
+ if (!listElm || type != lastType) {
+ listElm = dom.create(type);
+ dom.insertAfter(listElm, p);
+ } else {
+ // Nested list element
+ if (margin > lastMargin) {
+ listElm = li.appendChild(dom.create(type));
+ } else if (margin < lastMargin) {
+ // Find parent level based on margin value
+ idx = tinymce.inArray(levels, margin);
+ parents = dom.getParents(listElm.parentNode, type);
+ listElm = parents[parents.length - 1 - idx] || listElm;
+ }
+ }
+
+ // Remove middot or number spans if they exists
+ each(dom.select('span', p), function(span) {
+ var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, '');
+
+ // Remove span with the middot or the number
+ if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html))
+ dom.remove(span);
+ else if (/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(html))
+ dom.remove(span);
+ });
+
+ html = p.innerHTML;
+
+ // Remove middot/list items
+ if (type == 'ul')
+ html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/, '');
+ else
+ html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, '');
+
+ // Create li and add paragraph data into the new li
+ li = listElm.appendChild(dom.create('li', 0, html));
+ dom.remove(p);
+
+ lastMargin = margin;
+ lastType = type;
+ } else
+ listElm = lastMargin = 0; // End list element
+ });
+
+ // Remove any left over makers
+ html = o.node.innerHTML;
+ if (html.indexOf('__MCE_ITEM__') != -1)
+ o.node.innerHTML = html.replace(/__MCE_ITEM__/g, '');
+ },
+
+ /**
+ * Inserts the specified contents at the caret position.
+ */
+ _insert : function(h, skip_undo) {
+ var ed = this.editor, r = ed.selection.getRng();
+
+ // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells.
+ if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer)
+ ed.getDoc().execCommand('Delete', false, null);
+
+ ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo});
+ },
+
+ /**
+ * Instead of the old plain text method which tried to re-create a paste operation, the
+ * new approach adds a plain text mode toggle switch that changes the behavior of paste.
+ * This function is passed the same input that the regular paste plugin produces.
+ * It performs additional scrubbing and produces (and inserts) the plain text.
+ * This approach leverages all of the great existing functionality in the paste
+ * plugin, and requires minimal changes to add the new functionality.
+ * Speednet - June 2009
+ */
+ _insertPlainText : function(content) {
+ var ed = this.editor,
+ linebr = getParam(ed, "paste_text_linebreaktype"),
+ rl = getParam(ed, "paste_text_replacements"),
+ is = tinymce.is;
+
+ function process(items) {
+ each(items, function(v) {
+ if (v.constructor == RegExp)
+ content = content.replace(v, "");
+ else
+ content = content.replace(v[0], v[1]);
+ });
+ };
+
+ if ((typeof(content) === "string") && (content.length > 0)) {
+ // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line
+ if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(content)) {
+ process([
+ /[\n\r]+/g
+ ]);
+ } else {
+ // Otherwise just get rid of carriage returns (only need linefeeds)
+ process([
+ /\r+/g
+ ]);
+ }
+
+ process([
+ [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them
+ [/
]*>|<\/tr>/gi, "\n"], // Single linebreak for
tags and table rows
+ [/<\/t[dh]>\s*]*>/gi, "\t"], // Table cells get tabs betweem them
+ /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags
+ [/ /gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*)
+ [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"] // Cool little RegExp deletes whitespace around linebreak chars.
+ ]);
+
+ var maxLinebreaks = Number(getParam(ed, "paste_max_consecutive_linebreaks"));
+ if (maxLinebreaks > -1) {
+ var maxLinebreaksRegex = new RegExp("\n{" + (maxLinebreaks + 1) + ",}", "g");
+ var linebreakReplacement = "";
+
+ while (linebreakReplacement.length < maxLinebreaks) {
+ linebreakReplacement += "\n";
+ }
+
+ process([
+ [maxLinebreaksRegex, linebreakReplacement] // Limit max consecutive linebreaks
+ ]);
+ }
+
+ content = ed.dom.decode(tinymce.html.Entities.encodeRaw(content));
+
+ // Perform default or custom replacements
+ if (is(rl, "array")) {
+ process(rl);
+ } else if (is(rl, "string")) {
+ process(new RegExp(rl, "gi"));
+ }
+
+ // Treat paragraphs as specified in the config
+ if (linebr == "none") {
+ // Convert all line breaks to space
+ process([
+ [/\n+/g, " "]
+ ]);
+ } else if (linebr == "br") {
+ // Convert all line breaks to
+ process([
+ [/\n/g, "
"]
+ ]);
+ } else if (linebr == "p") {
+ // Convert all line breaks to ...
+ process([
+ [/\n+/g, "
"],
+ [/^(.*<\/p>)(
)$/, '
$1']
+ ]);
+ } else {
+ // defaults to "combined"
+ // Convert single line breaks to
and double line breaks to
...
+ process([
+ [/\n\n/g, "
"],
+ [/^(.*<\/p>)(
)$/, '
$1'],
+ [/\n/g, "
"]
+ ]);
+ }
+
+ ed.execCommand('mceInsertContent', false, content);
+ }
+ },
+
+ /**
+ * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine.
+ */
+ _legacySupport : function() {
+ var t = this, ed = t.editor;
+
+ // Register command(s) for backwards compatibility
+ ed.addCommand("mcePasteWord", function() {
+ ed.windowManager.open({
+ file: t.url + "/pasteword.htm",
+ width: parseInt(getParam(ed, "paste_dialog_width")),
+ height: parseInt(getParam(ed, "paste_dialog_height")),
+ inline: 1
+ });
+ });
+
+ if (getParam(ed, "paste_text_use_dialog")) {
+ ed.addCommand("mcePasteText", function() {
+ ed.windowManager.open({
+ file : t.url + "/pastetext.htm",
+ width: parseInt(getParam(ed, "paste_dialog_width")),
+ height: parseInt(getParam(ed, "paste_dialog_height")),
+ inline : 1
+ });
+ });
+ }
+
+ // Register button for backwards compatibility
+ ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"});
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js
new file mode 100644
index 0000000..c524f9e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pastetext.js
@@ -0,0 +1,36 @@
+tinyMCEPopup.requireLangPack();
+
+var PasteTextDialog = {
+ init : function() {
+ this.resize();
+ },
+
+ insert : function() {
+ var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines;
+
+ // Convert linebreaks into paragraphs
+ if (document.getElementById('linebreaks').checked) {
+ lines = h.split(/\r?\n/);
+ if (lines.length > 1) {
+ h = '';
+ tinymce.each(lines, function(row) {
+ h += '
' + row + '
';
+ });
+ }
+ }
+
+ tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h});
+ tinyMCEPopup.close();
+ },
+
+ resize : function() {
+ var vp = tinyMCEPopup.dom.getViewPort(window), el;
+
+ el = document.getElementById('content');
+
+ el.style.width = (vp.w - 20) + 'px';
+ el.style.height = (vp.h - 90) + 'px';
+ }
+};
+
+tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js
new file mode 100644
index 0000000..151f459
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/js/pasteword.js
@@ -0,0 +1,51 @@
+tinyMCEPopup.requireLangPack();
+
+var PasteWordDialog = {
+ init : function() {
+ var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = '';
+
+ // Create iframe
+ el.innerHTML = '';
+ ifr = document.getElementById('iframe');
+ doc = ifr.contentWindow.document;
+
+ // Force absolute CSS urls
+ css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")];
+ css = css.concat(tinymce.explode(ed.settings.content_css) || []);
+ tinymce.each(css, function(u) {
+ cssHTML += '';
+ });
+
+ // Write content into iframe
+ doc.open();
+ doc.write('' + cssHTML + '');
+ doc.close();
+
+ doc.designMode = 'on';
+ this.resize();
+
+ window.setTimeout(function() {
+ ifr.contentWindow.focus();
+ }, 10);
+ },
+
+ insert : function() {
+ var h = document.getElementById('iframe').contentWindow.document.body.innerHTML;
+
+ tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true});
+ tinyMCEPopup.close();
+ },
+
+ resize : function() {
+ var vp = tinyMCEPopup.dom.getViewPort(window), el;
+
+ el = document.getElementById('iframe');
+
+ if (el) {
+ el.style.width = (vp.w - 44) + 'px';
+ el.style.height = (vp.h - 190) + 'px';
+ }
+ }
+};
+
+tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js
new file mode 100644
index 0000000..bc74daf
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm
new file mode 100644
index 0000000..88989da
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pastetext.htm
@@ -0,0 +1,33 @@
+
+
+ {#paste.paste_text_desc}
+
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm
new file mode 100644
index 0000000..4d497a9
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste/pasteword.htm
@@ -0,0 +1,21 @@
+
+
+ {#paste.paste_word_desc}
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin.js
new file mode 100644
index 0000000..0ab05eb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var c=tinymce.each,a={paste_auto_cleanup_on_paste:true,paste_enable_default_filters:true,paste_block_drop:false,paste_retain_style_properties:"none",paste_strip_class_attributes:"mso",paste_remove_spans:false,paste_remove_styles:false,paste_remove_styles_if_webkit:true,paste_convert_middot_lists:true,paste_convert_headers_to_strong:false,paste_dialog_width:"450",paste_dialog_height:"400",paste_max_consecutive_linebreaks:2,paste_text_use_dialog:false,paste_text_sticky:false,paste_text_sticky_default:false,paste_text_notifyalways:false,paste_text_linebreaktype:"combined",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(d,e){return d.getParam(e,a[e])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(d,e){var f=this;f.editor=d;f.url=e;f.onPreProcess=new tinymce.util.Dispatcher(f);f.onPostProcess=new tinymce.util.Dispatcher(f);f.onPreProcess.add(f._preProcess);f.onPostProcess.add(f._postProcess);f.onPreProcess.add(function(i,j){d.execCallback("paste_preprocess",i,j)});f.onPostProcess.add(function(i,j){d.execCallback("paste_postprocess",i,j)});d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){return false}});d.pasteAsPlainText=b(d,"paste_text_sticky_default");function h(l,j){var k=d.dom,i;f.onPreProcess.dispatch(f,l);l.node=k.create("div",0,l.content);if(tinymce.isGecko){i=d.selection.getRng(true);if(i.startContainer==i.endContainer&&i.startContainer.nodeType==3){if(l.node.childNodes.length===1&&/^(p|h[1-6]|pre)$/i.test(l.node.firstChild.nodeName)&&l.content.indexOf("__MCE_ITEM__")===-1){k.remove(l.node.firstChild,true)}}}f.onPostProcess.dispatch(f,l);l.content=d.serializer.serialize(l.node,{getInner:1,forced_root_block:""});if((!j)&&(d.pasteAsPlainText)){f._insertPlainText(l.content);if(!b(d,"paste_text_sticky")){d.pasteAsPlainText=false;d.controlManager.setActive("pastetext",false)}}else{f._insert(l.content)}}d.addCommand("mceInsertClipboardContent",function(i,j){h(j,true)});if(!b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(j,i){var k=tinymce.util.Cookie;d.pasteAsPlainText=!d.pasteAsPlainText;d.controlManager.setActive("pastetext",d.pasteAsPlainText);if((d.pasteAsPlainText)&&(!k.get("tinymcePasteText"))){if(b(d,"paste_text_sticky")){d.windowManager.alert(d.translate("paste.plaintext_mode_sticky"))}else{d.windowManager.alert(d.translate("paste.plaintext_mode"))}if(!b(d,"paste_text_notifyalways")){k.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}d.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});d.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function g(s){var l,p,j,t,k=d.selection,o=d.dom,q=d.getBody(),i,r;if(s.clipboardData||o.doc.dataTransfer){r=(s.clipboardData||o.doc.dataTransfer).getData("Text");if(d.pasteAsPlainText){s.preventDefault();h({content:o.encode(r).replace(/\r?\n/g,"
")});return}}if(o.get("_mcePaste")){return}l=o.add(q,"div",{id:"_mcePaste","class":"mcePaste","data-mce-bogus":"1"},"\uFEFF\uFEFF");if(q!=d.getDoc().body){i=o.getPos(d.selection.getStart(),q).y}else{i=q.scrollTop+o.getViewPort(d.getWin()).y}o.setStyles(l,{position:"absolute",left:tinymce.isGecko?-40:0,top:i-25,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){t=k.getRng();j=o.doc.body.createTextRange();j.moveToElementText(l);j.execCommand("Paste");o.remove(l);if(l.innerHTML==="\uFEFF\uFEFF"){d.execCommand("mcePasteWord");s.preventDefault();return}k.setRng(t);k.setContent("");setTimeout(function(){h({content:l.innerHTML})},0);return tinymce.dom.Event.cancel(s)}else{function m(n){n.preventDefault()}o.bind(d.getDoc(),"mousedown",m);o.bind(d.getDoc(),"keydown",m);p=d.selection.getRng();l=l.firstChild;j=d.getDoc().createRange();j.setStart(l,0);j.setEnd(l,2);k.setRng(j);window.setTimeout(function(){var u="",n;if(!o.select("div.mcePaste > div.mcePaste").length){n=o.select("div.mcePaste");c(n,function(w){var v=w.firstChild;if(v&&v.nodeName=="DIV"&&v.style.marginTop&&v.style.backgroundColor){o.remove(v,1)}c(o.select("span.Apple-style-span",w),function(x){o.remove(x,1)});c(o.select("br[data-mce-bogus]",w),function(x){o.remove(x)});if(w.parentNode.className!="mcePaste"){u+=w.innerHTML}})}else{u=""+o.encode(r).replace(/\r?\n\r?\n/g,"
").replace(/\r?\n/g,"
")+"
"}c(o.select("div.mcePaste"),function(v){o.remove(v)});if(p){k.setRng(p)}h({content:u});o.unbind(d.getDoc(),"mousedown",m);o.unbind(d.getDoc(),"keydown",m)},0)}}if(b(d,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){d.onKeyDown.addToTop(function(i,j){if(((tinymce.isMac?j.metaKey:j.ctrlKey)&&j.keyCode==86)||(j.shiftKey&&j.keyCode==45)){g(j)}})}else{d.onPaste.addToTop(function(i,j){return g(j)})}}d.onInit.add(function(){d.controlManager.setActive("pastetext",d.pasteAsPlainText);if(b(d,"paste_block_drop")){d.dom.bind(d.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(i){i.preventDefault();i.stopPropagation();return false})}});f._legacySupport()},getInfo:function(){return{longname:"Paste text/word",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_preProcess:function(g,e){var k=this.editor,j=e.content,p=tinymce.grep,n=tinymce.explode,f=tinymce.trim,l,i;function d(h){c(h,function(o){if(o.constructor==RegExp){j=j.replace(o,"")}else{j=j.replace(o[0],o[1])}})}if(k.settings.paste_enable_default_filters==false){return}if(tinymce.isIE&&document.documentMode>=9&&/<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/.test(e.content)){d([[/(?:
[\s\r\n]+|
)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
[\s\r\n]+|
)*/g,"$1"]]);d([[/
/g,"
"],[/
/g," "],[/
/g,"
"]])}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(j)||e.wordContent){e.wordContent=true;d([/^\s*( )+/gi,/( |
]*>)+\s*$/gi]);if(b(k,"paste_convert_headers_to_strong")){j=j.replace(/]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"
$1
")}if(b(k,"paste_convert_middot_lists")){d([[//gi,"$&__MCE_ITEM__"],[/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"],[/(]+(?:MsoListParagraph)[^>]+>)/gi,"$1__MCE_ITEM__"]])}d([//gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/ /gi,"\u00a0"]]);do{l=j.length;j=j.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(l!=j.length);if(b(k,"paste_retain_style_properties").replace(/^none$/i,"").length==0){j=j.replace(/<\/?span[^>]*>/gi,"")}else{d([[/([\s\u00a0]*)<\/span>/gi,function(o,h){return(h.length>0)?h.replace(/./," ").slice(Math.floor(h.length/2)).split("").join("\u00a0"):""}],[/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,function(t,h,r){var u=[],o=0,q=n(f(r).replace(/"/gi,"'"),";");c(q,function(s){var w,y,z=n(s,":");function x(A){return A+((A!=="0")&&(/\d$/.test(A)))?"px":""}if(z.length==2){w=z[0].toLowerCase();y=z[1].toLowerCase();switch(w){case"mso-padding-alt":case"mso-padding-top-alt":case"mso-padding-right-alt":case"mso-padding-bottom-alt":case"mso-padding-left-alt":case"mso-margin-alt":case"mso-margin-top-alt":case"mso-margin-right-alt":case"mso-margin-bottom-alt":case"mso-margin-left-alt":case"mso-table-layout-alt":case"mso-height":case"mso-width":case"mso-vertical-align-alt":u[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":u[o++]="text-align:"+y;return;case"vert-align":u[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":u[o++]="color:"+y;return;case"mso-background":case"mso-highlight":u[o++]="background:"+y;return;case"mso-default-height":u[o++]="min-height:"+x(y);return;case"mso-default-width":u[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":u[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){u[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){u[o++]="display:none"}return}if(/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(w)){return}u[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+u.join(";")+'"'}else{return h}}]])}}if(b(k,"paste_convert_headers_to_strong")){d([[/]*>/gi,""],[/<\/h[1-6][^>]*>/gi,"
"]])}d([[/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi,""]]);i=b(k,"paste_strip_class_attributes");if(i!=="none"){function m(q,o){if(i==="all"){return""}var h=p(n(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(r){return(/^(?!mso)/i.test(r))});return h.length?' class="'+h.join(" ")+'"':""}j=j.replace(/ class="([^"]+)"/gi,m);j=j.replace(/ class=([\-\w]+)/gi,m)}if(b(k,"paste_remove_spans")){j=j.replace(/<\/?span[^>]*>/gi,"")}e.content=j},_postProcess:function(g,i){var f=this,e=f.editor,h=e.dom,d;if(e.settings.paste_enable_default_filters==false){return}if(i.wordContent){c(h.select("a",i.node),function(j){if(!j.href||j.href.indexOf("#_Toc")!=-1){h.remove(j,1)}});if(b(e,"paste_convert_middot_lists")){f._convertLists(g,i)}d=b(e,"paste_retain_style_properties");if((tinymce.is(d,"string"))&&(d!=="all")&&(d!=="*")){d=tinymce.explode(d.replace(/^none$/i,""));c(h.select("*",i.node),function(m){var n={},k=0,l,o,j;if(d){for(l=0;l0){h.setStyles(m,n)}else{if(m.nodeName=="SPAN"&&!m.className){h.remove(m,true)}}})}}if(b(e,"paste_remove_styles")||(b(e,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(h.select("*[style]",i.node),function(j){j.removeAttribute("style");j.removeAttribute("data-mce-style")})}else{if(tinymce.isWebKit){c(h.select("*",i.node),function(j){j.removeAttribute("data-mce-style")})}}},_convertLists:function(g,e){var i=g.editor.dom,h,l,d=-1,f,m=[],k,j;c(i.select("p",e.node),function(t){var q,u="",s,r,n,o;for(q=t.firstChild;q&&q.nodeType==3;q=q.nextSibling){u+=q.nodeValue}u=t.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/ /g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(u)){s="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(u)){s="ol"}if(s){f=parseFloat(t.style.marginLeft||0);if(f>d){m.push(f)}if(!h||s!=k){h=i.create(s);i.insertAfter(h,t)}else{if(f>d){h=l.appendChild(i.create(s))}else{if(f]*>/gi,"");if(s=="ul"&&/^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(p)){i.remove(v)}else{if(/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(p)){i.remove(v)}}});r=t.innerHTML;if(s=="ul"){r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/,"")}else{r=t.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.( |\u00a0)+\s*/,"")}l=h.appendChild(i.create("li",0,r));i.remove(t);d=f;k=s}else{h=d=0}});j=e.node.innerHTML;if(j.indexOf("__MCE_ITEM__")!=-1){e.node.innerHTML=j.replace(/__MCE_ITEM__/g,"")}},_insert:function(f,d){var e=this.editor,g=e.selection.getRng();if(!e.selection.isCollapsed()&&g.startContainer!=g.endContainer){e.getDoc().execCommand("Delete",false,null)}e.execCommand("mceInsertContent",false,f,{skip_undo:d})},_insertPlainText:function(j){var h=this.editor,f=b(h,"paste_text_linebreaktype"),k=b(h,"paste_text_replacements"),g=tinymce.is;function e(m){c(m,function(n){if(n.constructor==RegExp){j=j.replace(n,"")}else{j=j.replace(n[0],n[1])}})}if((typeof(j)==="string")&&(j.length>0)){if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(j)){e([/[\n\r]+/g])}else{e([/\r+/g])}e([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/
]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/ /gi," "],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"]]);var d=Number(b(h,"paste_max_consecutive_linebreaks"));if(d>-1){var l=new RegExp("\n{"+(d+1)+",}","g");var i="";while(i.length"]])}else{if(f=="p"){e([[/\n+/g,"
"],[/^(.*<\/p>)(
)$/,"
$1"]])}else{e([[/\n\n/g,"
"],[/^(.*<\/p>)(
)$/,"
$1"],[/\n/g,"
"]])}}}h.execCommand("mceInsertContent",false,j)}},_legacySupport:function(){var e=this,d=e.editor;d.addCommand("mcePasteWord",function(){d.windowManager.open({file:e.url+"/pasteword.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})});if(b(d,"paste_text_use_dialog")){d.addCommand("mcePasteText",function(){d.windowManager.open({file:e.url+"/pastetext.htm",width:parseInt(b(d,"paste_dialog_width")),height:parseInt(b(d,"paste_dialog_height")),inline:1})})}d.addButton("pasteword",{title:"paste.paste_word_desc",cmd:"mcePasteWord"})}});tinymce.PluginManager.add("paste",tinymce.plugins.PastePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin_src.js
new file mode 100644
index 0000000..0154ece
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/editor_plugin_src.js
@@ -0,0 +1,885 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var each = tinymce.each,
+ defs = {
+ paste_auto_cleanup_on_paste : true,
+ paste_enable_default_filters : true,
+ paste_block_drop : false,
+ paste_retain_style_properties : "none",
+ paste_strip_class_attributes : "mso",
+ paste_remove_spans : false,
+ paste_remove_styles : false,
+ paste_remove_styles_if_webkit : true,
+ paste_convert_middot_lists : true,
+ paste_convert_headers_to_strong : false,
+ paste_dialog_width : "450",
+ paste_dialog_height : "400",
+ paste_max_consecutive_linebreaks: 2,
+ paste_text_use_dialog : false,
+ paste_text_sticky : false,
+ paste_text_sticky_default : false,
+ paste_text_notifyalways : false,
+ paste_text_linebreaktype : "combined",
+ paste_text_replacements : [
+ [/\u2026/g, "..."],
+ [/[\x93\x94\u201c\u201d]/g, '"'],
+ [/[\x60\x91\x92\u2018\u2019]/g, "'"]
+ ]
+ };
+
+ function getParam(ed, name) {
+ return ed.getParam(name, defs[name]);
+ }
+
+ tinymce.create('tinymce.plugins.PastePlugin', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+ t.url = url;
+
+ // Setup plugin events
+ t.onPreProcess = new tinymce.util.Dispatcher(t);
+ t.onPostProcess = new tinymce.util.Dispatcher(t);
+
+ // Register default handlers
+ t.onPreProcess.add(t._preProcess);
+ t.onPostProcess.add(t._postProcess);
+
+ // Register optional preprocess handler
+ t.onPreProcess.add(function(pl, o) {
+ ed.execCallback('paste_preprocess', pl, o);
+ });
+
+ // Register optional postprocess
+ t.onPostProcess.add(function(pl, o) {
+ ed.execCallback('paste_postprocess', pl, o);
+ });
+
+ ed.onKeyDown.addToTop(function(ed, e) {
+ // Block ctrl+v from adding an undo level since the default logic in tinymce.Editor will add that
+ if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
+ return false; // Stop other listeners
+ });
+
+ // Initialize plain text flag
+ ed.pasteAsPlainText = getParam(ed, 'paste_text_sticky_default');
+
+ // This function executes the process handlers and inserts the contents
+ // force_rich overrides plain text mode set by user, important for pasting with execCommand
+ function process(o, force_rich) {
+ var dom = ed.dom, rng;
+
+ // Execute pre process handlers
+ t.onPreProcess.dispatch(t, o);
+
+ // Create DOM structure
+ o.node = dom.create('div', 0, o.content);
+
+ // If pasting inside the same element and the contents is only one block
+ // remove the block and keep the text since Firefox will copy parts of pre and h1-h6 as a pre element
+ if (tinymce.isGecko) {
+ rng = ed.selection.getRng(true);
+ if (rng.startContainer == rng.endContainer && rng.startContainer.nodeType == 3) {
+ // Is only one block node and it doesn't contain word stuff
+ if (o.node.childNodes.length === 1 && /^(p|h[1-6]|pre)$/i.test(o.node.firstChild.nodeName) && o.content.indexOf('__MCE_ITEM__') === -1)
+ dom.remove(o.node.firstChild, true);
+ }
+ }
+
+ // Execute post process handlers
+ t.onPostProcess.dispatch(t, o);
+
+ // Serialize content
+ o.content = ed.serializer.serialize(o.node, {getInner : 1, forced_root_block : ''});
+
+ // Plain text option active?
+ if ((!force_rich) && (ed.pasteAsPlainText)) {
+ t._insertPlainText(o.content);
+
+ if (!getParam(ed, "paste_text_sticky")) {
+ ed.pasteAsPlainText = false;
+ ed.controlManager.setActive("pastetext", false);
+ }
+ } else {
+ t._insert(o.content);
+ }
+ }
+
+ // Add command for external usage
+ ed.addCommand('mceInsertClipboardContent', function(u, o) {
+ process(o, true);
+ });
+
+ if (!getParam(ed, "paste_text_use_dialog")) {
+ ed.addCommand('mcePasteText', function(u, v) {
+ var cookie = tinymce.util.Cookie;
+
+ ed.pasteAsPlainText = !ed.pasteAsPlainText;
+ ed.controlManager.setActive('pastetext', ed.pasteAsPlainText);
+
+ if ((ed.pasteAsPlainText) && (!cookie.get("tinymcePasteText"))) {
+ if (getParam(ed, "paste_text_sticky")) {
+ ed.windowManager.alert(ed.translate('paste.plaintext_mode_sticky'));
+ } else {
+ ed.windowManager.alert(ed.translate('paste.plaintext_mode'));
+ }
+
+ if (!getParam(ed, "paste_text_notifyalways")) {
+ cookie.set("tinymcePasteText", "1", new Date(new Date().getFullYear() + 1, 12, 31))
+ }
+ }
+ });
+ }
+
+ ed.addButton('pastetext', {title: 'paste.paste_text_desc', cmd: 'mcePasteText'});
+ ed.addButton('selectall', {title: 'paste.selectall_desc', cmd: 'selectall'});
+
+ // This function grabs the contents from the clipboard by adding a
+ // hidden div and placing the caret inside it and after the browser paste
+ // is done it grabs that contents and processes that
+ function grabContent(e) {
+ var n, or, rng, oldRng, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY, textContent;
+
+ // Check if browser supports direct plaintext access
+ if (e.clipboardData || dom.doc.dataTransfer) {
+ textContent = (e.clipboardData || dom.doc.dataTransfer).getData('Text');
+
+ if (ed.pasteAsPlainText) {
+ e.preventDefault();
+ process({content : dom.encode(textContent).replace(/\r?\n/g, '
')});
+ return;
+ }
+ }
+
+ if (dom.get('_mcePaste'))
+ return;
+
+ // Create container to paste into
+ n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste', 'data-mce-bogus' : '1'}, '\uFEFF\uFEFF');
+
+ // If contentEditable mode we need to find out the position of the closest element
+ if (body != ed.getDoc().body)
+ posY = dom.getPos(ed.selection.getStart(), body).y;
+ else
+ posY = body.scrollTop + dom.getViewPort(ed.getWin()).y;
+
+ // Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles
+ // If also needs to be in view on IE or the paste would fail
+ dom.setStyles(n, {
+ position : 'absolute',
+ left : tinymce.isGecko ? -40 : 0, // Need to move it out of site on Gecko since it will othewise display a ghost resize rect for the div
+ top : posY - 25,
+ width : 1,
+ height : 1,
+ overflow : 'hidden'
+ });
+
+ if (tinymce.isIE) {
+ // Store away the old range
+ oldRng = sel.getRng();
+
+ // Select the container
+ rng = dom.doc.body.createTextRange();
+ rng.moveToElementText(n);
+ rng.execCommand('Paste');
+
+ // Remove container
+ dom.remove(n);
+
+ // Check if the contents was changed, if it wasn't then clipboard extraction failed probably due
+ // to IE security settings so we pass the junk though better than nothing right
+ if (n.innerHTML === '\uFEFF\uFEFF') {
+ ed.execCommand('mcePasteWord');
+ e.preventDefault();
+ return;
+ }
+
+ // Restore the old range and clear the contents before pasting
+ sel.setRng(oldRng);
+ sel.setContent('');
+
+ // For some odd reason we need to detach the the mceInsertContent call from the paste event
+ // It's like IE has a reference to the parent element that you paste in and the selection gets messed up
+ // when it tries to restore the selection
+ setTimeout(function() {
+ // Process contents
+ process({content : n.innerHTML});
+ }, 0);
+
+ // Block the real paste event
+ return tinymce.dom.Event.cancel(e);
+ } else {
+ function block(e) {
+ e.preventDefault();
+ };
+
+ // Block mousedown and click to prevent selection change
+ dom.bind(ed.getDoc(), 'mousedown', block);
+ dom.bind(ed.getDoc(), 'keydown', block);
+
+ or = ed.selection.getRng();
+
+ // Move select contents inside DIV
+ n = n.firstChild;
+ rng = ed.getDoc().createRange();
+ rng.setStart(n, 0);
+ rng.setEnd(n, 2);
+ sel.setRng(rng);
+
+ // Wait a while and grab the pasted contents
+ window.setTimeout(function() {
+ var h = '', nl;
+
+ // Paste divs duplicated in paste divs seems to happen when you paste plain text so lets first look for that broken behavior in WebKit
+ if (!dom.select('div.mcePaste > div.mcePaste').length) {
+ nl = dom.select('div.mcePaste');
+
+ // WebKit will split the div into multiple ones so this will loop through then all and join them to get the whole HTML string
+ each(nl, function(n) {
+ var child = n.firstChild;
+
+ // WebKit inserts a DIV container with lots of odd styles
+ if (child && child.nodeName == 'DIV' && child.style.marginTop && child.style.backgroundColor) {
+ dom.remove(child, 1);
+ }
+
+ // Remove apply style spans
+ each(dom.select('span.Apple-style-span', n), function(n) {
+ dom.remove(n, 1);
+ });
+
+ // Remove bogus br elements
+ each(dom.select('br[data-mce-bogus]', n), function(n) {
+ dom.remove(n);
+ });
+
+ // WebKit will make a copy of the DIV for each line of plain text pasted and insert them into the DIV
+ if (n.parentNode.className != 'mcePaste')
+ h += n.innerHTML;
+ });
+ } else {
+ // Found WebKit weirdness so force the content into paragraphs this seems to happen when you paste plain text from Nodepad etc
+ // So this logic will replace double enter with paragraphs and single enter with br so it kind of looks the same
+ h = '
' + dom.encode(textContent).replace(/\r?\n\r?\n/g, '
').replace(/\r?\n/g, '
') + '
';
+ }
+
+ // Remove the nodes
+ each(dom.select('div.mcePaste'), function(n) {
+ dom.remove(n);
+ });
+
+ // Restore the old selection
+ if (or)
+ sel.setRng(or);
+
+ process({content : h});
+
+ // Unblock events ones we got the contents
+ dom.unbind(ed.getDoc(), 'mousedown', block);
+ dom.unbind(ed.getDoc(), 'keydown', block);
+ }, 0);
+ }
+ }
+
+ // Check if we should use the new auto process method
+ if (getParam(ed, "paste_auto_cleanup_on_paste")) {
+ // Is it's Opera or older FF use key handler
+ if (tinymce.isOpera || /Firefox\/2/.test(navigator.userAgent)) {
+ ed.onKeyDown.addToTop(function(ed, e) {
+ if (((tinymce.isMac ? e.metaKey : e.ctrlKey) && e.keyCode == 86) || (e.shiftKey && e.keyCode == 45))
+ grabContent(e);
+ });
+ } else {
+ // Grab contents on paste event on Gecko and WebKit
+ ed.onPaste.addToTop(function(ed, e) {
+ return grabContent(e);
+ });
+ }
+ }
+
+ ed.onInit.add(function() {
+ ed.controlManager.setActive("pastetext", ed.pasteAsPlainText);
+
+ // Block all drag/drop events
+ if (getParam(ed, "paste_block_drop")) {
+ ed.dom.bind(ed.getBody(), ['dragend', 'dragover', 'draggesture', 'dragdrop', 'drop', 'drag'], function(e) {
+ e.preventDefault();
+ e.stopPropagation();
+
+ return false;
+ });
+ }
+ });
+
+ // Add legacy support
+ t._legacySupport();
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Paste text/word',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/paste',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ _preProcess : function(pl, o) {
+ var ed = this.editor,
+ h = o.content,
+ grep = tinymce.grep,
+ explode = tinymce.explode,
+ trim = tinymce.trim,
+ len, stripClass;
+
+ //console.log('Before preprocess:' + o.content);
+
+ function process(items) {
+ each(items, function(v) {
+ // Remove or replace
+ if (v.constructor == RegExp)
+ h = h.replace(v, '');
+ else
+ h = h.replace(v[0], v[1]);
+ });
+ }
+
+ if (ed.settings.paste_enable_default_filters == false) {
+ return;
+ }
+
+ // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
+ if (tinymce.isIE && document.documentMode >= 9 && /<(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)/.test(o.content)) {
+ // IE9 adds BRs before/after block elements when contents is pasted from word or for example another browser
+ process([[/(?:
[\s\r\n]+|
)*(<\/?(h[1-6r]|p|div|address|pre|form|table|tbody|thead|tfoot|th|tr|td|li|ol|ul|caption|blockquote|center|dl|dt|dd|dir|fieldset)[^>]*>)(?:
[\s\r\n]+|
)*/g, '$1']]);
+
+ // IE9 also adds an extra BR element for each soft-linefeed and it also adds a BR for each word wrap break
+ process([
+ [/
/g, '
'], // Replace multiple BR elements with uppercase BR to keep them intact
+ [/
/g, ' '], // Replace single br elements with space since they are word wrap BR:s
+ [/
/g, '
'] // Replace back the double brs but into a single BR
+ ]);
+ }
+
+ // Detect Word content and process it more aggressive
+ if (/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(h) || o.wordContent) {
+ o.wordContent = true; // Mark the pasted contents as word specific content
+ //console.log('Word contents detected.');
+
+ // Process away some basic content
+ process([
+ /^\s*( )+/gi, // entities at the start of contents
+ /( |
]*>)+\s*$/gi // entities at the end of contents
+ ]);
+
+ if (getParam(ed, "paste_convert_headers_to_strong")) {
+ h = h.replace(/]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "
$1
");
+ }
+
+ if (getParam(ed, "paste_convert_middot_lists")) {
+ process([
+ [//gi, '$&__MCE_ITEM__'], // Convert supportLists to a list item marker
+ [/(]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__'], // Convert mso-list and symbol spans to item markers
+ [/(]+(?:MsoListParagraph)[^>]+>)/gi, '$1__MCE_ITEM__'] // Convert mso-list and symbol paragraphs to item markers (FF)
+ ]);
+ }
+
+ process([
+ // Word comments like conditional comments etc
+ //gi,
+
+ // Remove comments, scripts (e.g., msoShowComment), XML tag, VML content, MS Office namespaced tags, and a few other tags
+ /<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,
+
+ // Convert into for line-though
+ [/<(\/?)s>/gi, "<$1strike>"],
+
+ // Replace nsbp entites to char since it's easier to handle
+ [/ /gi, "\u00a0"]
+ ]);
+
+ // Remove bad attributes, with or without quotes, ensuring that attribute text is really inside a tag.
+ // If JavaScript had a RegExp look-behind, we could have integrated this with the last process() array and got rid of the loop. But alas, it does not, so we cannot.
+ do {
+ len = h.length;
+ h = h.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi, "$1");
+ } while (len != h.length);
+
+ // Remove all spans if no styles is to be retained
+ if (getParam(ed, "paste_retain_style_properties").replace(/^none$/i, "").length == 0) {
+ h = h.replace(/<\/?span[^>]*>/gi, "");
+ } else {
+ // We're keeping styles, so at least clean them up.
+ // CSS Reference: http://msdn.microsoft.com/en-us/library/aa155477.aspx
+
+ process([
+ // Convert ___ to string of alternating breaking/non-breaking spaces of same length
+ [/([\s\u00a0]*)<\/span>/gi,
+ function(str, spaces) {
+ return (spaces.length > 0)? spaces.replace(/./, " ").slice(Math.floor(spaces.length/2)).split("").join("\u00a0") : "";
+ }
+ ],
+
+ // Examine all styles: delete junk, transform some, and keep the rest
+ [/(<[a-z][^>]*)\sstyle="([^"]*)"/gi,
+ function(str, tag, style) {
+ var n = [],
+ i = 0,
+ s = explode(trim(style).replace(/"/gi, "'"), ";");
+
+ // Examine each style definition within the tag's style attribute
+ each(s, function(v) {
+ var name, value,
+ parts = explode(v, ":");
+
+ function ensureUnits(v) {
+ return v + ((v !== "0") && (/\d$/.test(v)))? "px" : "";
+ }
+
+ if (parts.length == 2) {
+ name = parts[0].toLowerCase();
+ value = parts[1].toLowerCase();
+
+ // Translate certain MS Office styles into their CSS equivalents
+ switch (name) {
+ case "mso-padding-alt":
+ case "mso-padding-top-alt":
+ case "mso-padding-right-alt":
+ case "mso-padding-bottom-alt":
+ case "mso-padding-left-alt":
+ case "mso-margin-alt":
+ case "mso-margin-top-alt":
+ case "mso-margin-right-alt":
+ case "mso-margin-bottom-alt":
+ case "mso-margin-left-alt":
+ case "mso-table-layout-alt":
+ case "mso-height":
+ case "mso-width":
+ case "mso-vertical-align-alt":
+ n[i++] = name.replace(/^mso-|-alt$/g, "") + ":" + ensureUnits(value);
+ return;
+
+ case "horiz-align":
+ n[i++] = "text-align:" + value;
+ return;
+
+ case "vert-align":
+ n[i++] = "vertical-align:" + value;
+ return;
+
+ case "font-color":
+ case "mso-foreground":
+ n[i++] = "color:" + value;
+ return;
+
+ case "mso-background":
+ case "mso-highlight":
+ n[i++] = "background:" + value;
+ return;
+
+ case "mso-default-height":
+ n[i++] = "min-height:" + ensureUnits(value);
+ return;
+
+ case "mso-default-width":
+ n[i++] = "min-width:" + ensureUnits(value);
+ return;
+
+ case "mso-padding-between-alt":
+ n[i++] = "border-collapse:separate;border-spacing:" + ensureUnits(value);
+ return;
+
+ case "text-line-through":
+ if ((value == "single") || (value == "double")) {
+ n[i++] = "text-decoration:line-through";
+ }
+ return;
+
+ case "mso-zero-height":
+ if (value == "yes") {
+ n[i++] = "display:none";
+ }
+ return;
+ }
+
+ // Eliminate all MS Office style definitions that have no CSS equivalent by examining the first characters in the name
+ if (/^(mso|column|font-emph|lang|layout|line-break|list-image|nav|panose|punct|row|ruby|sep|size|src|tab-|table-border|text-(?!align|decor|indent|trans)|top-bar|version|vnd|word-break)/.test(name)) {
+ return;
+ }
+
+ // If it reached this point, it must be a valid CSS style
+ n[i++] = name + ":" + parts[1]; // Lower-case name, but keep value case
+ }
+ });
+
+ // If style attribute contained any valid styles the re-write it; otherwise delete style attribute.
+ if (i > 0) {
+ return tag + ' style="' + n.join(';') + '"';
+ } else {
+ return tag;
+ }
+ }
+ ]
+ ]);
+ }
+ }
+
+ // Replace headers with
+ if (getParam(ed, "paste_convert_headers_to_strong")) {
+ process([
+ [/]*>/gi, ""],
+ [/<\/h[1-6][^>]*>/gi, "
"]
+ ]);
+ }
+
+ process([
+ // Copy paste from Java like Open Office will produce this junk on FF
+ [/Version:[\d.]+\nStartHTML:\d+\nEndHTML:\d+\nStartFragment:\d+\nEndFragment:\d+/gi, '']
+ ]);
+
+ // Class attribute options are: leave all as-is ("none"), remove all ("all"), or remove only those starting with mso ("mso").
+ // Note:- paste_strip_class_attributes: "none", verify_css_classes: true is also a good variation.
+ stripClass = getParam(ed, "paste_strip_class_attributes");
+
+ if (stripClass !== "none") {
+ function removeClasses(match, g1) {
+ if (stripClass === "all")
+ return '';
+
+ var cls = grep(explode(g1.replace(/^(["'])(.*)\1$/, "$2"), " "),
+ function(v) {
+ return (/^(?!mso)/i.test(v));
+ }
+ );
+
+ return cls.length ? ' class="' + cls.join(" ") + '"' : '';
+ };
+
+ h = h.replace(/ class="([^"]+)"/gi, removeClasses);
+ h = h.replace(/ class=([\-\w]+)/gi, removeClasses);
+ }
+
+ // Remove spans option
+ if (getParam(ed, "paste_remove_spans")) {
+ h = h.replace(/<\/?span[^>]*>/gi, "");
+ }
+
+ //console.log('After preprocess:' + h);
+
+ o.content = h;
+ },
+
+ /**
+ * Various post process items.
+ */
+ _postProcess : function(pl, o) {
+ var t = this, ed = t.editor, dom = ed.dom, styleProps;
+
+ if (ed.settings.paste_enable_default_filters == false) {
+ return;
+ }
+
+ if (o.wordContent) {
+ // Remove named anchors or TOC links
+ each(dom.select('a', o.node), function(a) {
+ if (!a.href || a.href.indexOf('#_Toc') != -1)
+ dom.remove(a, 1);
+ });
+
+ if (getParam(ed, "paste_convert_middot_lists")) {
+ t._convertLists(pl, o);
+ }
+
+ // Process styles
+ styleProps = getParam(ed, "paste_retain_style_properties"); // retained properties
+
+ // Process only if a string was specified and not equal to "all" or "*"
+ if ((tinymce.is(styleProps, "string")) && (styleProps !== "all") && (styleProps !== "*")) {
+ styleProps = tinymce.explode(styleProps.replace(/^none$/i, ""));
+
+ // Retains some style properties
+ each(dom.select('*', o.node), function(el) {
+ var newStyle = {}, npc = 0, i, sp, sv;
+
+ // Store a subset of the existing styles
+ if (styleProps) {
+ for (i = 0; i < styleProps.length; i++) {
+ sp = styleProps[i];
+ sv = dom.getStyle(el, sp);
+
+ if (sv) {
+ newStyle[sp] = sv;
+ npc++;
+ }
+ }
+ }
+
+ // Remove all of the existing styles
+ dom.setAttrib(el, 'style', '');
+
+ if (styleProps && npc > 0)
+ dom.setStyles(el, newStyle); // Add back the stored subset of styles
+ else // Remove empty span tags that do not have class attributes
+ if (el.nodeName == 'SPAN' && !el.className)
+ dom.remove(el, true);
+ });
+ }
+ }
+
+ // Remove all style information or only specifically on WebKit to avoid the style bug on that browser
+ if (getParam(ed, "paste_remove_styles") || (getParam(ed, "paste_remove_styles_if_webkit") && tinymce.isWebKit)) {
+ each(dom.select('*[style]', o.node), function(el) {
+ el.removeAttribute('style');
+ el.removeAttribute('data-mce-style');
+ });
+ } else {
+ if (tinymce.isWebKit) {
+ // We need to compress the styles on WebKit since if you paste
it will become
+ // Removing the mce_style that contains the real value will force the Serializer engine to compress the styles
+ each(dom.select('*', o.node), function(el) {
+ el.removeAttribute('data-mce-style');
+ });
+ }
+ }
+ },
+
+ /**
+ * Converts the most common bullet and number formats in Office into a real semantic UL/LI list.
+ */
+ _convertLists : function(pl, o) {
+ var dom = pl.editor.dom, listElm, li, lastMargin = -1, margin, levels = [], lastType, html;
+
+ // Convert middot lists into real semantic lists
+ each(dom.select('p', o.node), function(p) {
+ var sib, val = '', type, html, idx, parents;
+
+ // Get text node value at beginning of paragraph
+ for (sib = p.firstChild; sib && sib.nodeType == 3; sib = sib.nextSibling)
+ val += sib.nodeValue;
+
+ val = p.innerHTML.replace(/<\/?\w+[^>]*>/gi, '').replace(/ /g, '\u00a0');
+
+ // Detect unordered lists look for bullets
+ if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*\u00a0*/.test(val))
+ type = 'ul';
+
+ // Detect ordered lists 1., a. or ixv.
+ if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0+/.test(val))
+ type = 'ol';
+
+ // Check if node value matches the list pattern: o
+ if (type) {
+ margin = parseFloat(p.style.marginLeft || 0);
+
+ if (margin > lastMargin)
+ levels.push(margin);
+
+ if (!listElm || type != lastType) {
+ listElm = dom.create(type);
+ dom.insertAfter(listElm, p);
+ } else {
+ // Nested list element
+ if (margin > lastMargin) {
+ listElm = li.appendChild(dom.create(type));
+ } else if (margin < lastMargin) {
+ // Find parent level based on margin value
+ idx = tinymce.inArray(levels, margin);
+ parents = dom.getParents(listElm.parentNode, type);
+ listElm = parents[parents.length - 1 - idx] || listElm;
+ }
+ }
+
+ // Remove middot or number spans if they exists
+ each(dom.select('span', p), function(span) {
+ var html = span.innerHTML.replace(/<\/?\w+[^>]*>/gi, '');
+
+ // Remove span with the middot or the number
+ if (type == 'ul' && /^__MCE_ITEM__[\u2022\u00b7\u00a7\u00d8o\u25CF]/.test(html))
+ dom.remove(span);
+ else if (/^__MCE_ITEM__[\s\S]*\w+\.( |\u00a0)*\s*/.test(html))
+ dom.remove(span);
+ });
+
+ html = p.innerHTML;
+
+ // Remove middot/list items
+ if (type == 'ul')
+ html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^[\u2022\u00b7\u00a7\u00d8o\u25CF]\s*( |\u00a0)+\s*/, '');
+ else
+ html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.( |\u00a0)+\s*/, '');
+
+ // Create li and add paragraph data into the new li
+ li = listElm.appendChild(dom.create('li', 0, html));
+ dom.remove(p);
+
+ lastMargin = margin;
+ lastType = type;
+ } else
+ listElm = lastMargin = 0; // End list element
+ });
+
+ // Remove any left over makers
+ html = o.node.innerHTML;
+ if (html.indexOf('__MCE_ITEM__') != -1)
+ o.node.innerHTML = html.replace(/__MCE_ITEM__/g, '');
+ },
+
+ /**
+ * Inserts the specified contents at the caret position.
+ */
+ _insert : function(h, skip_undo) {
+ var ed = this.editor, r = ed.selection.getRng();
+
+ // First delete the contents seems to work better on WebKit when the selection spans multiple list items or multiple table cells.
+ if (!ed.selection.isCollapsed() && r.startContainer != r.endContainer)
+ ed.getDoc().execCommand('Delete', false, null);
+
+ ed.execCommand('mceInsertContent', false, h, {skip_undo : skip_undo});
+ },
+
+ /**
+ * Instead of the old plain text method which tried to re-create a paste operation, the
+ * new approach adds a plain text mode toggle switch that changes the behavior of paste.
+ * This function is passed the same input that the regular paste plugin produces.
+ * It performs additional scrubbing and produces (and inserts) the plain text.
+ * This approach leverages all of the great existing functionality in the paste
+ * plugin, and requires minimal changes to add the new functionality.
+ * Speednet - June 2009
+ */
+ _insertPlainText : function(content) {
+ var ed = this.editor,
+ linebr = getParam(ed, "paste_text_linebreaktype"),
+ rl = getParam(ed, "paste_text_replacements"),
+ is = tinymce.is;
+
+ function process(items) {
+ each(items, function(v) {
+ if (v.constructor == RegExp)
+ content = content.replace(v, "");
+ else
+ content = content.replace(v[0], v[1]);
+ });
+ };
+
+ if ((typeof(content) === "string") && (content.length > 0)) {
+ // If HTML content with line-breaking tags, then remove all cr/lf chars because only tags will break a line
+ if (/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(content)) {
+ process([
+ /[\n\r]+/g
+ ]);
+ } else {
+ // Otherwise just get rid of carriage returns (only need linefeeds)
+ process([
+ /\r+/g
+ ]);
+ }
+
+ process([
+ [/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi, "\n\n"], // Block tags get a blank line after them
+ [/
]*>|<\/tr>/gi, "\n"], // Single linebreak for
tags and table rows
+ [/<\/t[dh]>\s*]*>/gi, "\t"], // Table cells get tabs betweem them
+ /<[a-z!\/?][^>]*>/gi, // Delete all remaining tags
+ [/ /gi, " "], // Convert non-break spaces to regular spaces (remember, *plain text*)
+ [/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"] // Cool little RegExp deletes whitespace around linebreak chars.
+ ]);
+
+ var maxLinebreaks = Number(getParam(ed, "paste_max_consecutive_linebreaks"));
+ if (maxLinebreaks > -1) {
+ var maxLinebreaksRegex = new RegExp("\n{" + (maxLinebreaks + 1) + ",}", "g");
+ var linebreakReplacement = "";
+
+ while (linebreakReplacement.length < maxLinebreaks) {
+ linebreakReplacement += "\n";
+ }
+
+ process([
+ [maxLinebreaksRegex, linebreakReplacement] // Limit max consecutive linebreaks
+ ]);
+ }
+
+ content = ed.dom.decode(tinymce.html.Entities.encodeRaw(content));
+
+ // Perform default or custom replacements
+ if (is(rl, "array")) {
+ process(rl);
+ } else if (is(rl, "string")) {
+ process(new RegExp(rl, "gi"));
+ }
+
+ // Treat paragraphs as specified in the config
+ if (linebr == "none") {
+ // Convert all line breaks to space
+ process([
+ [/\n+/g, " "]
+ ]);
+ } else if (linebr == "br") {
+ // Convert all line breaks to
+ process([
+ [/\n/g, "
"]
+ ]);
+ } else if (linebr == "p") {
+ // Convert all line breaks to ...
+ process([
+ [/\n+/g, "
"],
+ [/^(.*<\/p>)(
)$/, '
$1']
+ ]);
+ } else {
+ // defaults to "combined"
+ // Convert single line breaks to
and double line breaks to
...
+ process([
+ [/\n\n/g, "
"],
+ [/^(.*<\/p>)(
)$/, '
$1'],
+ [/\n/g, "
"]
+ ]);
+ }
+
+ ed.execCommand('mceInsertContent', false, content);
+ }
+ },
+
+ /**
+ * This method will open the old style paste dialogs. Some users might want the old behavior but still use the new cleanup engine.
+ */
+ _legacySupport : function() {
+ var t = this, ed = t.editor;
+
+ // Register command(s) for backwards compatibility
+ ed.addCommand("mcePasteWord", function() {
+ ed.windowManager.open({
+ file: t.url + "/pasteword.htm",
+ width: parseInt(getParam(ed, "paste_dialog_width")),
+ height: parseInt(getParam(ed, "paste_dialog_height")),
+ inline: 1
+ });
+ });
+
+ if (getParam(ed, "paste_text_use_dialog")) {
+ ed.addCommand("mcePasteText", function() {
+ ed.windowManager.open({
+ file : t.url + "/pastetext.htm",
+ width: parseInt(getParam(ed, "paste_dialog_width")),
+ height: parseInt(getParam(ed, "paste_dialog_height")),
+ inline : 1
+ });
+ });
+ }
+
+ // Register button for backwards compatibility
+ ed.addButton("pasteword", {title : "paste.paste_word_desc", cmd : "mcePasteWord"});
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add("paste", tinymce.plugins.PastePlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pastetext.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pastetext.js
new file mode 100644
index 0000000..c524f9e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pastetext.js
@@ -0,0 +1,36 @@
+tinyMCEPopup.requireLangPack();
+
+var PasteTextDialog = {
+ init : function() {
+ this.resize();
+ },
+
+ insert : function() {
+ var h = tinyMCEPopup.dom.encode(document.getElementById('content').value), lines;
+
+ // Convert linebreaks into paragraphs
+ if (document.getElementById('linebreaks').checked) {
+ lines = h.split(/\r?\n/);
+ if (lines.length > 1) {
+ h = '';
+ tinymce.each(lines, function(row) {
+ h += '
' + row + '
';
+ });
+ }
+ }
+
+ tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h});
+ tinyMCEPopup.close();
+ },
+
+ resize : function() {
+ var vp = tinyMCEPopup.dom.getViewPort(window), el;
+
+ el = document.getElementById('content');
+
+ el.style.width = (vp.w - 20) + 'px';
+ el.style.height = (vp.h - 90) + 'px';
+ }
+};
+
+tinyMCEPopup.onInit.add(PasteTextDialog.init, PasteTextDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pasteword.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pasteword.js
new file mode 100644
index 0000000..a52731c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/js/pasteword.js
@@ -0,0 +1,51 @@
+tinyMCEPopup.requireLangPack();
+
+var PasteWordDialog = {
+ init : function() {
+ var ed = tinyMCEPopup.editor, el = document.getElementById('iframecontainer'), ifr, doc, css, cssHTML = '';
+
+ // Create iframe
+ el.innerHTML = '';
+ ifr = document.getElementById('iframe');
+ doc = ifr.contentWindow.document;
+
+ // Force absolute CSS urls
+ css = [ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css")];
+ css = css.concat(tinymce.explode(ed.settings.content_css) || []);
+ tinymce.each(css, function(u) {
+ cssHTML += '';
+ });
+
+ // Write content into iframe
+ doc.open();
+ doc.write('' + cssHTML + '');
+ doc.close();
+
+ doc.designMode = 'on';
+ this.resize();
+
+ window.setTimeout(function() {
+ ifr.contentWindow.focus();
+ }, 10);
+ },
+
+ insert : function() {
+ var h = document.getElementById('iframe').contentWindow.document.body.innerHTML;
+
+ tinyMCEPopup.editor.execCommand('mceInsertClipboardContent', false, {content : h, wordContent : true});
+ tinyMCEPopup.close();
+ },
+
+ resize : function() {
+ var vp = tinyMCEPopup.dom.getViewPort(window), el;
+
+ el = document.getElementById('iframe');
+
+ if (el) {
+ el.style.width = (vp.w - 20) + 'px';
+ el.style.height = (vp.h - 90) + 'px';
+ }
+ }
+};
+
+tinyMCEPopup.onInit.add(PasteWordDialog.init, PasteWordDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/langs/en_dlg.js
new file mode 100644
index 0000000..bc74daf
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.paste_dlg',{"word_title":"Use Ctrl+V on your keyboard to paste the text into the window.","text_linebreaks":"Keep Linebreaks","text_title":"Use Ctrl+V on your keyboard to paste the text into the window."});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pastetext.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pastetext.htm
new file mode 100644
index 0000000..b655945
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pastetext.htm
@@ -0,0 +1,27 @@
+
+
+ {#paste.paste_text_desc}
+
+
+
+
+
+
+
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pasteword.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pasteword.htm
new file mode 100644
index 0000000..0f6bb41
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/paste_orig/pasteword.htm
@@ -0,0 +1,21 @@
+
+
+ {#paste.paste_word_desc}
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin.js
new file mode 100644
index 0000000..507909c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Preview",{init:function(a,b){var d=this,c=tinymce.explode(a.settings.content_css);d.editor=a;tinymce.each(c,function(f,e){c[e]=a.documentBaseURI.toAbsolute(f)});a.addCommand("mcePreview",function(){a.windowManager.open({file:a.getParam("plugin_preview_pageurl",b+"/preview.html"),width:parseInt(a.getParam("plugin_preview_width","550")),height:parseInt(a.getParam("plugin_preview_height","600")),resizable:"yes",scrollbars:"yes",popup_css:c?c.join(","):a.baseURI.toAbsolute("themes/"+a.settings.theme+"/skins/"+a.settings.skin+"/content.css"),inline:a.getParam("plugin_preview_inline",1)},{base:a.documentBaseURI.getURI()})});a.addButton("preview",{title:"preview.preview_desc",cmd:"mcePreview"})},getInfo:function(){return{longname:"Preview",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("preview",tinymce.plugins.Preview)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js
new file mode 100644
index 0000000..80f00f0
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/editor_plugin_src.js
@@ -0,0 +1,53 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.Preview', {
+ init : function(ed, url) {
+ var t = this, css = tinymce.explode(ed.settings.content_css);
+
+ t.editor = ed;
+
+ // Force absolute CSS urls
+ tinymce.each(css, function(u, k) {
+ css[k] = ed.documentBaseURI.toAbsolute(u);
+ });
+
+ ed.addCommand('mcePreview', function() {
+ ed.windowManager.open({
+ file : ed.getParam("plugin_preview_pageurl", url + "/preview.html"),
+ width : parseInt(ed.getParam("plugin_preview_width", "550")),
+ height : parseInt(ed.getParam("plugin_preview_height", "600")),
+ resizable : "yes",
+ scrollbars : "yes",
+ popup_css : css ? css.join(',') : ed.baseURI.toAbsolute("themes/" + ed.settings.theme + "/skins/" + ed.settings.skin + "/content.css"),
+ inline : ed.getParam("plugin_preview_inline", 1)
+ }, {
+ base : ed.documentBaseURI.getURI()
+ });
+ });
+
+ ed.addButton('preview', {title : 'preview.preview_desc', cmd : 'mcePreview'});
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Preview',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/preview',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('preview', tinymce.plugins.Preview);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/example.html b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/example.html
new file mode 100644
index 0000000..b2c3d90
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/example.html
@@ -0,0 +1,28 @@
+
+
+
+
+
+Example of a custom preview page
+
+
+
+Editor contents:
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js
new file mode 100644
index 0000000..f8dc810
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/jscripts/embed.js
@@ -0,0 +1,73 @@
+/**
+ * This script contains embed functions for common plugins. This scripts are complety free to use for any purpose.
+ */
+
+function writeFlash(p) {
+ writeEmbed(
+ 'D27CDB6E-AE6D-11cf-96B8-444553540000',
+ 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+ 'application/x-shockwave-flash',
+ p
+ );
+}
+
+function writeShockWave(p) {
+ writeEmbed(
+ '166B1BCA-3F9C-11CF-8075-444553540000',
+ 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0',
+ 'application/x-director',
+ p
+ );
+}
+
+function writeQuickTime(p) {
+ writeEmbed(
+ '02BF25D5-8C17-4B23-BC80-D3488ABDDC6B',
+ 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0',
+ 'video/quicktime',
+ p
+ );
+}
+
+function writeRealMedia(p) {
+ writeEmbed(
+ 'CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA',
+ 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0',
+ 'audio/x-pn-realaudio-plugin',
+ p
+ );
+}
+
+function writeWindowsMedia(p) {
+ p.url = p.src;
+ writeEmbed(
+ '6BF52A52-394A-11D3-B153-00C04F79FAA6',
+ 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701',
+ 'application/x-mplayer2',
+ p
+ );
+}
+
+function writeEmbed(cls, cb, mt, p) {
+ var h = '', n;
+
+ h += '';
+
+ document.write(h);
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/preview.html b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/preview.html
new file mode 100644
index 0000000..67e7b14
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/preview/preview.html
@@ -0,0 +1,17 @@
+
+
+
+
+
+
+{#preview.preview_desc}
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin.js
new file mode 100644
index 0000000..b5b3a55
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Print",{init:function(a,b){a.addCommand("mcePrint",function(){a.getWin().print()});a.addButton("print",{title:"print.print_desc",cmd:"mcePrint"})},getInfo:function(){return{longname:"Print",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("print",tinymce.plugins.Print)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js
new file mode 100644
index 0000000..3933fe6
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/print/editor_plugin_src.js
@@ -0,0 +1,34 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.Print', {
+ init : function(ed, url) {
+ ed.addCommand('mcePrint', function() {
+ ed.getWin().print();
+ });
+
+ ed.addButton('print', {title : 'print.print_desc', cmd : 'mcePrint'});
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Print',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/print',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('print', tinymce.plugins.Print);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin.js
new file mode 100644
index 0000000..8e93996
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Save",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceSave",c._save,c);a.addCommand("mceCancel",c._cancel,c);a.addButton("save",{title:"save.save_desc",cmd:"mceSave"});a.addButton("cancel",{title:"save.cancel_desc",cmd:"mceCancel"});a.onNodeChange.add(c._nodeChange,c);a.addShortcut("ctrl+s",a.getLang("save.save_desc"),"mceSave")},getInfo:function(){return{longname:"Save",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_nodeChange:function(b,a,c){var b=this.editor;if(b.getParam("save_enablewhendirty")){a.setDisabled("save",!b.isDirty());a.setDisabled("cancel",!b.isDirty())}},_save:function(){var c=this.editor,a,e,d,b;a=tinymce.DOM.get(c.id).form||tinymce.DOM.getParent(c.id,"form");if(c.getParam("save_enablewhendirty")&&!c.isDirty()){return}tinyMCE.triggerSave();if(e=c.getParam("save_onsavecallback")){if(c.execCallback("save_onsavecallback",c)){c.startContent=tinymce.trim(c.getContent({format:"raw"}));c.nodeChanged()}return}if(a){c.isNotDirty=true;if(a.onsubmit==null||a.onsubmit()!=false){a.submit()}c.nodeChanged()}else{c.windowManager.alert("Error: No form element found.")}},_cancel:function(){var a=this.editor,c,b=tinymce.trim(a.startContent);if(c=a.getParam("save_oncancelcallback")){a.execCallback("save_oncancelcallback",a);return}a.setContent(b);a.undoManager.clear();a.nodeChanged()}});tinymce.PluginManager.add("save",tinymce.plugins.Save)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js
new file mode 100644
index 0000000..f5a3de8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/save/editor_plugin_src.js
@@ -0,0 +1,101 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.Save', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceSave', t._save, t);
+ ed.addCommand('mceCancel', t._cancel, t);
+
+ // Register buttons
+ ed.addButton('save', {title : 'save.save_desc', cmd : 'mceSave'});
+ ed.addButton('cancel', {title : 'save.cancel_desc', cmd : 'mceCancel'});
+
+ ed.onNodeChange.add(t._nodeChange, t);
+ ed.addShortcut('ctrl+s', ed.getLang('save.save_desc'), 'mceSave');
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Save',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/save',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ // Private methods
+
+ _nodeChange : function(ed, cm, n) {
+ var ed = this.editor;
+
+ if (ed.getParam('save_enablewhendirty')) {
+ cm.setDisabled('save', !ed.isDirty());
+ cm.setDisabled('cancel', !ed.isDirty());
+ }
+ },
+
+ // Private methods
+
+ _save : function() {
+ var ed = this.editor, formObj, os, i, elementId;
+
+ formObj = tinymce.DOM.get(ed.id).form || tinymce.DOM.getParent(ed.id, 'form');
+
+ if (ed.getParam("save_enablewhendirty") && !ed.isDirty())
+ return;
+
+ tinyMCE.triggerSave();
+
+ // Use callback instead
+ if (os = ed.getParam("save_onsavecallback")) {
+ if (ed.execCallback('save_onsavecallback', ed)) {
+ ed.startContent = tinymce.trim(ed.getContent({format : 'raw'}));
+ ed.nodeChanged();
+ }
+
+ return;
+ }
+
+ if (formObj) {
+ ed.isNotDirty = true;
+
+ if (formObj.onsubmit == null || formObj.onsubmit() != false)
+ formObj.submit();
+
+ ed.nodeChanged();
+ } else
+ ed.windowManager.alert("Error: No form element found.");
+ },
+
+ _cancel : function() {
+ var ed = this.editor, os, h = tinymce.trim(ed.startContent);
+
+ // Use callback instead
+ if (os = ed.getParam("save_oncancelcallback")) {
+ ed.execCallback('save_oncancelcallback', ed);
+ return;
+ }
+
+ ed.setContent(h);
+ ed.undoManager.clear();
+ ed.nodeChanged();
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('save', tinymce.plugins.Save);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css
new file mode 100644
index 0000000..ecdf58c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/css/searchreplace.css
@@ -0,0 +1,6 @@
+.panel_wrapper {height:85px;}
+.panel_wrapper div.current {height:85px;}
+
+/* IE */
+* html .panel_wrapper {height:100px;}
+* html .panel_wrapper div.current {height:100px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js
new file mode 100644
index 0000000..165bc12
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){window.focus();a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js
new file mode 100644
index 0000000..4c87e8f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/editor_plugin_src.js
@@ -0,0 +1,61 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.SearchReplacePlugin', {
+ init : function(ed, url) {
+ function open(m) {
+ // Keep IE from writing out the f/r character to the editor
+ // instance while initializing a new dialog. See: #3131190
+ window.focus();
+
+ ed.windowManager.open({
+ file : url + '/searchreplace.htm',
+ width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)),
+ height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)),
+ inline : 1,
+ auto_focus : 0
+ }, {
+ mode : m,
+ search_string : ed.selection.getContent({format : 'text'}),
+ plugin_url : url
+ });
+ };
+
+ // Register commands
+ ed.addCommand('mceSearch', function() {
+ open('search');
+ });
+
+ ed.addCommand('mceReplace', function() {
+ open('replace');
+ });
+
+ // Register buttons
+ ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'});
+ ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'});
+
+ ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch');
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Search/Replace',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js
new file mode 100644
index 0000000..80284b9
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/js/searchreplace.js
@@ -0,0 +1,142 @@
+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
+ // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions?
+ 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);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js
new file mode 100644
index 0000000..8a65900
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.searchreplace_dlg',{findwhat:"Find What",replacewith:"Replace with",direction:"Direction",up:"Up",down:"Down",mcase:"Match Case",findnext:"Find Next",allreplaced:"All occurrences of the search string were replaced.","searchnext_desc":"Find Again",notfound:"The search has been completed. The search string could not be found.","search_title":"Find","replace_title":"Find/Replace",replaceall:"Replace All",replace:"Replace"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm
new file mode 100644
index 0000000..d37ed8a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace/searchreplace.htm
@@ -0,0 +1,101 @@
+
+
+
+ {#searchreplace_dlg.replace_title}
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/css/searchreplace.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/css/searchreplace.css
new file mode 100644
index 0000000..ecdf58c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/css/searchreplace.css
@@ -0,0 +1,6 @@
+.panel_wrapper {height:85px;}
+.panel_wrapper div.current {height:85px;}
+
+/* IE */
+* html .panel_wrapper {height:100px;}
+* html .panel_wrapper div.current {height:100px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin.js
new file mode 100644
index 0000000..165bc12
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){window.focus();a.windowManager.open({file:c+"/searchreplace.htm",width:420+parseInt(a.getLang("searchreplace.delta_width",0)),height:170+parseInt(a.getLang("searchreplace.delta_height",0)),inline:1,auto_focus:0},{mode:d,search_string:a.selection.getContent({format:"text"}),plugin_url:c})}a.addCommand("mceSearch",function(){b("search")});a.addCommand("mceReplace",function(){b("replace")});a.addButton("search",{title:"searchreplace.search_desc",cmd:"mceSearch"});a.addButton("replace",{title:"searchreplace.replace_desc",cmd:"mceReplace"});a.addShortcut("ctrl+f","searchreplace.search_desc","mceSearch")},getInfo:function(){return{longname:"Search/Replace",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("searchreplace",tinymce.plugins.SearchReplacePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin_src.js
new file mode 100644
index 0000000..4c87e8f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/editor_plugin_src.js
@@ -0,0 +1,61 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.SearchReplacePlugin', {
+ init : function(ed, url) {
+ function open(m) {
+ // Keep IE from writing out the f/r character to the editor
+ // instance while initializing a new dialog. See: #3131190
+ window.focus();
+
+ ed.windowManager.open({
+ file : url + '/searchreplace.htm',
+ width : 420 + parseInt(ed.getLang('searchreplace.delta_width', 0)),
+ height : 170 + parseInt(ed.getLang('searchreplace.delta_height', 0)),
+ inline : 1,
+ auto_focus : 0
+ }, {
+ mode : m,
+ search_string : ed.selection.getContent({format : 'text'}),
+ plugin_url : url
+ });
+ };
+
+ // Register commands
+ ed.addCommand('mceSearch', function() {
+ open('search');
+ });
+
+ ed.addCommand('mceReplace', function() {
+ open('replace');
+ });
+
+ // Register buttons
+ ed.addButton('search', {title : 'searchreplace.search_desc', cmd : 'mceSearch'});
+ ed.addButton('replace', {title : 'searchreplace.replace_desc', cmd : 'mceReplace'});
+
+ ed.addShortcut('ctrl+f', 'searchreplace.search_desc', 'mceSearch');
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Search/Replace',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/searchreplace',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('searchreplace', tinymce.plugins.SearchReplacePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/js/searchreplace.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/js/searchreplace.js
new file mode 100644
index 0000000..80284b9
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/js/searchreplace.js
@@ -0,0 +1,142 @@
+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
+ // TODO: Verify if this is actually needed any more, maybe it was for very old FF versions?
+ 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);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/langs/en_dlg.js
new file mode 100644
index 0000000..8a65900
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.searchreplace_dlg',{findwhat:"Find What",replacewith:"Replace with",direction:"Direction",up:"Up",down:"Down",mcase:"Match Case",findnext:"Find Next",allreplaced:"All occurrences of the search string were replaced.","searchnext_desc":"Find Again",notfound:"The search has been completed. The search string could not be found.","search_title":"Find","replace_title":"Find/Replace",replaceall:"Replace All",replace:"Replace"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/searchreplace.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/searchreplace.htm
new file mode 100644
index 0000000..2443a91
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/searchreplace_orig/searchreplace.htm
@@ -0,0 +1,100 @@
+
+
+
+ {#searchreplace_dlg.replace_title}
+
+
+
+
+
+
+
+{#searchreplace_dlg.replace_title}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css
new file mode 100644
index 0000000..24efa02
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/css/content.css
@@ -0,0 +1 @@
+.mceItemHiddenSpellWord {background:url(../img/wline.gif) repeat-x bottom left; cursor:default;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js
new file mode 100644
index 0000000..48549c9
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.util.JSONRequest,c=tinymce.each,b=tinymce.DOM;tinymce.create("tinymce.plugins.SpellcheckerPlugin",{getInfo:function(){return{longname:"Spellchecker",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker",version:tinymce.majorVersion+"."+tinymce.minorVersion}},init:function(e,f){var g=this,d;g.url=f;g.editor=e;g.rpcUrl=e.getParam("spellchecker_rpc_url","{backend}");if(g.rpcUrl=="{backend}"){if(tinymce.isIE){return}g.hasSupport=true;e.onContextMenu.addToTop(function(h,i){if(g.active){return false}})}e.addCommand("mceSpellCheck",function(){if(g.rpcUrl=="{backend}"){g.editor.getBody().spellcheck=g.active=!g.active;return}if(!g.active){e.setProgressState(1);g._sendRPC("checkWords",[g.selectedLang,g._getWords()],function(h){if(h.length>0){g.active=1;g._markWords(h);e.setProgressState(0);e.nodeChanged()}else{e.setProgressState(0);if(e.getParam("spellchecker_report_no_misspellings",true)){e.windowManager.alert("spellchecker.no_mpell")}}})}else{g._done()}});if(e.settings.content_css!==false){e.contentCSS.push(f+"/css/content.css")}e.onClick.add(g._showMenu,g);e.onContextMenu.add(g._showMenu,g);e.onBeforeGetContent.add(function(){if(g.active){g._removeWords()}});e.onNodeChange.add(function(i,h){h.setActive("spellchecker",g.active)});e.onSetContent.add(function(){g._done()});e.onBeforeGetContent.add(function(){g._done()});e.onBeforeExecCommand.add(function(h,i){if(i=="mceFullScreen"){g._done()}});g.languages={};c(e.getParam("spellchecker_languages","+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv","hash"),function(i,h){if(h.indexOf("+")===0){h=h.substring(1);g.selectedLang=i}g.languages[h]=i})},createControl:function(h,d){var f=this,g,e=f.editor;if(h=="spellchecker"){if(f.rpcUrl=="{backend}"){if(f.hasSupport){g=d.createButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f})}return g}g=d.createSplitButton(h,{title:"spellchecker.desc",cmd:"mceSpellCheck",scope:f});g.onRenderMenu.add(function(j,i){i.add({title:"spellchecker.langs","class":"mceMenuItemTitle"}).setDisabled(1);c(f.languages,function(n,m){var p={icon:1},l;p.onclick=function(){if(n==f.selectedLang){return}l.setSelected(1);f.selectedItem.setSelected(0);f.selectedItem=l;f.selectedLang=n};p.title=m;l=i.add(p);l.setSelected(n==f.selectedLang);if(n==f.selectedLang){f.selectedItem=l}})});return g}},_walk:function(i,g){var h=this.editor.getDoc(),e;if(h.createTreeWalker){e=h.createTreeWalker(i,NodeFilter.SHOW_TEXT,null,false);while((i=e.nextNode())!=null){g.call(this,i)}}else{tinymce.walk(i,g,"childNodes")}},_getSeparators:function(){var e="",d,f=this.editor.getParam("spellchecker_word_separator_chars",'\\s!"#$%&()*+,-./:;<=>?@[]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');for(d=0;d$2");while((s=p.indexOf(""))!=-1){o=p.substring(0,s);if(o.length){r=j.createTextNode(g.decode(o));q.appendChild(r)}p=p.substring(s+10);s=p.indexOf("");o=p.substring(0,s);p=p.substring(s+11);q.appendChild(g.create("span",{"class":"mceItemHiddenSpellWord"},o))}if(p.length){r=j.createTextNode(g.decode(p));q.appendChild(r)}}else{q.innerHTML=p.replace(f,'$1$2')}g.replace(q,t)}});i.setRng(d)},_showMenu:function(h,j){var i=this,h=i.editor,d=i._menu,l,k=h.dom,g=k.getViewPort(h.getWin()),f=j.target;j=0;if(!d){d=h.controlManager.createDropMenu("spellcheckermenu",{"class":"mceNoIcons"});i._menu=d}if(k.hasClass(f,"mceItemHiddenSpellWord")){d.removeAll();d.add({title:"spellchecker.wait","class":"mceMenuItemTitle"}).setDisabled(1);i._sendRPC("getSuggestions",[i.selectedLang,k.decode(f.innerHTML)],function(m){var e;d.removeAll();if(m.length>0){d.add({title:"spellchecker.sug","class":"mceMenuItemTitle"}).setDisabled(1);c(m,function(n){d.add({title:n,onclick:function(){k.replace(h.getDoc().createTextNode(n),f);i._checkDone()}})});d.addSeparator()}else{d.add({title:"spellchecker.no_sug","class":"mceMenuItemTitle"}).setDisabled(1)}if(h.getParam("show_ignore_words",true)){e=i.editor.getParam("spellchecker_enable_ignore_rpc","");d.add({title:"spellchecker.ignore_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}}});d.add({title:"spellchecker.ignore_words",onclick:function(){var n=f.innerHTML;i._removeWords(k.decode(n));i._checkDone();if(e){h.setProgressState(1);i._sendRPC("ignoreWords",[i.selectedLang,n],function(o){h.setProgressState(0)})}}})}if(i.editor.getParam("spellchecker_enable_learn_rpc")){d.add({title:"spellchecker.learn_word",onclick:function(){var n=f.innerHTML;k.remove(f,1);i._checkDone();h.setProgressState(1);i._sendRPC("learnWord",[i.selectedLang,n],function(o){h.setProgressState(0)})}})}d.update()});l=b.getPos(h.getContentAreaContainer());d.settings.offset_x=l.x;d.settings.offset_y=l.y;h.selection.select(f);l=k.getPos(f);d.showMenu(l.x,l.y+f.offsetHeight-g.y);return tinymce.dom.Event.cancel(j)}else{d.hideMenu()}},_checkDone:function(){var e=this,d=e.editor,g=d.dom,f;c(g.select("span"),function(h){if(h&&g.hasClass(h,"mceItemHiddenSpellWord")){f=true;return false}});if(!f){e._done()}},_done:function(){var d=this,e=d.active;if(d.active){d.active=0;d._removeWords();if(d._menu){d._menu.hideMenu()}if(e){d.editor.nodeChanged()}}},_sendRPC:function(e,g,d){var f=this;a.sendRPC({url:f.rpcUrl,method:e,params:g,success:d,error:function(i,h){f.editor.setProgressState(0);f.editor.windowManager.alert(i.errstr||("Error response: "+h.responseText))}})}});tinymce.PluginManager.add("spellchecker",tinymce.plugins.SpellcheckerPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js
new file mode 100644
index 0000000..86fdfce
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/editor_plugin_src.js
@@ -0,0 +1,436 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var JSONRequest = tinymce.util.JSONRequest, each = tinymce.each, DOM = tinymce.DOM;
+
+ tinymce.create('tinymce.plugins.SpellcheckerPlugin', {
+ getInfo : function() {
+ return {
+ longname : 'Spellchecker',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/spellchecker',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ init : function(ed, url) {
+ var t = this, cm;
+
+ t.url = url;
+ t.editor = ed;
+ t.rpcUrl = ed.getParam("spellchecker_rpc_url", "{backend}");
+
+ if (t.rpcUrl == '{backend}') {
+ // Sniff if the browser supports native spellchecking (Don't know of a better way)
+ if (tinymce.isIE)
+ return;
+
+ t.hasSupport = true;
+
+ // Disable the context menu when spellchecking is active
+ ed.onContextMenu.addToTop(function(ed, e) {
+ if (t.active)
+ return false;
+ });
+ }
+
+ // Register commands
+ ed.addCommand('mceSpellCheck', function() {
+ if (t.rpcUrl == '{backend}') {
+ // Enable/disable native spellchecker
+ t.editor.getBody().spellcheck = t.active = !t.active;
+ return;
+ }
+
+ if (!t.active) {
+ ed.setProgressState(1);
+ t._sendRPC('checkWords', [t.selectedLang, t._getWords()], function(r) {
+ if (r.length > 0) {
+ t.active = 1;
+ t._markWords(r);
+ ed.setProgressState(0);
+ ed.nodeChanged();
+ } else {
+ ed.setProgressState(0);
+
+ if (ed.getParam('spellchecker_report_no_misspellings', true))
+ ed.windowManager.alert('spellchecker.no_mpell');
+ }
+ });
+ } else
+ t._done();
+ });
+
+ if (ed.settings.content_css !== false)
+ ed.contentCSS.push(url + '/css/content.css');
+
+ ed.onClick.add(t._showMenu, t);
+ ed.onContextMenu.add(t._showMenu, t);
+ ed.onBeforeGetContent.add(function() {
+ if (t.active)
+ t._removeWords();
+ });
+
+ ed.onNodeChange.add(function(ed, cm) {
+ cm.setActive('spellchecker', t.active);
+ });
+
+ ed.onSetContent.add(function() {
+ t._done();
+ });
+
+ ed.onBeforeGetContent.add(function() {
+ t._done();
+ });
+
+ ed.onBeforeExecCommand.add(function(ed, cmd) {
+ if (cmd == 'mceFullScreen')
+ t._done();
+ });
+
+ // Find selected language
+ t.languages = {};
+ each(ed.getParam('spellchecker_languages', '+English=en,Danish=da,Dutch=nl,Finnish=fi,French=fr,German=de,Italian=it,Polish=pl,Portuguese=pt,Spanish=es,Swedish=sv', 'hash'), function(v, k) {
+ if (k.indexOf('+') === 0) {
+ k = k.substring(1);
+ t.selectedLang = v;
+ }
+
+ t.languages[k] = v;
+ });
+ },
+
+ createControl : function(n, cm) {
+ var t = this, c, ed = t.editor;
+
+ if (n == 'spellchecker') {
+ // Use basic button if we use the native spellchecker
+ if (t.rpcUrl == '{backend}') {
+ // Create simple toggle button if we have native support
+ if (t.hasSupport)
+ c = cm.createButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});
+
+ return c;
+ }
+
+ c = cm.createSplitButton(n, {title : 'spellchecker.desc', cmd : 'mceSpellCheck', scope : t});
+
+ c.onRenderMenu.add(function(c, m) {
+ m.add({title : 'spellchecker.langs', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+ each(t.languages, function(v, k) {
+ var o = {icon : 1}, mi;
+
+ o.onclick = function() {
+ if (v == t.selectedLang) {
+ return;
+ }
+ mi.setSelected(1);
+ t.selectedItem.setSelected(0);
+ t.selectedItem = mi;
+ t.selectedLang = v;
+ };
+
+ o.title = k;
+ mi = m.add(o);
+ mi.setSelected(v == t.selectedLang);
+
+ if (v == t.selectedLang)
+ t.selectedItem = mi;
+ })
+ });
+
+ return c;
+ }
+ },
+
+ // Internal functions
+
+ _walk : function(n, f) {
+ var d = this.editor.getDoc(), w;
+
+ if (d.createTreeWalker) {
+ w = d.createTreeWalker(n, NodeFilter.SHOW_TEXT, null, false);
+
+ while ((n = w.nextNode()) != null)
+ f.call(this, n);
+ } else
+ tinymce.walk(n, f, 'childNodes');
+ },
+
+ _getSeparators : function() {
+ var re = '', i, str = this.editor.getParam('spellchecker_word_separator_chars', '\\s!"#$%&()*+,-./:;<=>?@[\]^_{|}§©«®±¶·¸»¼½¾¿×÷¤\u201d\u201c');
+
+ // Build word separator regexp
+ for (i=0; i elements content is broken after spellchecking.
+ // Bug #1408: Preceding whitespace characters are removed
+ // @TODO: I'm not sure that both are still issues on IE9.
+ if (tinymce.isIE) {
+ // Enclose mispelled words with temporal tag
+ v = v.replace(rx, '$1$2');
+ // Loop over the content finding mispelled words
+ while ((pos = v.indexOf('')) != -1) {
+ // Add text node for the content before the word
+ txt = v.substring(0, pos);
+ if (txt.length) {
+ node = doc.createTextNode(dom.decode(txt));
+ elem.appendChild(node);
+ }
+ v = v.substring(pos+10);
+ pos = v.indexOf('');
+ txt = v.substring(0, pos);
+ v = v.substring(pos+11);
+ // Add span element for the word
+ elem.appendChild(dom.create('span', {'class' : 'mceItemHiddenSpellWord'}, txt));
+ }
+ // Add text node for the rest of the content
+ if (v.length) {
+ node = doc.createTextNode(dom.decode(v));
+ elem.appendChild(node);
+ }
+ } else {
+ // Other browsers preserve whitespace characters on innerHTML usage
+ elem.innerHTML = v.replace(rx, '$1$2');
+ }
+
+ // Finally, replace the node with the container
+ dom.replace(elem, n);
+ }
+ });
+
+ se.setRng(r);
+ },
+
+ _showMenu : function(ed, e) {
+ var t = this, ed = t.editor, m = t._menu, p1, dom = ed.dom, vp = dom.getViewPort(ed.getWin()), wordSpan = e.target;
+
+ e = 0; // Fixes IE memory leak
+
+ if (!m) {
+ m = ed.controlManager.createDropMenu('spellcheckermenu', {'class' : 'mceNoIcons'});
+ t._menu = m;
+ }
+
+ if (dom.hasClass(wordSpan, 'mceItemHiddenSpellWord')) {
+ m.removeAll();
+ m.add({title : 'spellchecker.wait', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+
+ t._sendRPC('getSuggestions', [t.selectedLang, dom.decode(wordSpan.innerHTML)], function(r) {
+ var ignoreRpc;
+
+ m.removeAll();
+
+ if (r.length > 0) {
+ m.add({title : 'spellchecker.sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+ each(r, function(v) {
+ m.add({title : v, onclick : function() {
+ dom.replace(ed.getDoc().createTextNode(v), wordSpan);
+ t._checkDone();
+ }});
+ });
+
+ m.addSeparator();
+ } else
+ m.add({title : 'spellchecker.no_sug', 'class' : 'mceMenuItemTitle'}).setDisabled(1);
+
+ if (ed.getParam('show_ignore_words', true)) {
+ ignoreRpc = t.editor.getParam("spellchecker_enable_ignore_rpc", '');
+ m.add({
+ title : 'spellchecker.ignore_word',
+ onclick : function() {
+ var word = wordSpan.innerHTML;
+
+ dom.remove(wordSpan, 1);
+ t._checkDone();
+
+ // tell the server if we need to
+ if (ignoreRpc) {
+ ed.setProgressState(1);
+ t._sendRPC('ignoreWord', [t.selectedLang, word], function(r) {
+ ed.setProgressState(0);
+ });
+ }
+ }
+ });
+
+ m.add({
+ title : 'spellchecker.ignore_words',
+ onclick : function() {
+ var word = wordSpan.innerHTML;
+
+ t._removeWords(dom.decode(word));
+ t._checkDone();
+
+ // tell the server if we need to
+ if (ignoreRpc) {
+ ed.setProgressState(1);
+ t._sendRPC('ignoreWords', [t.selectedLang, word], function(r) {
+ ed.setProgressState(0);
+ });
+ }
+ }
+ });
+ }
+
+ if (t.editor.getParam("spellchecker_enable_learn_rpc")) {
+ m.add({
+ title : 'spellchecker.learn_word',
+ onclick : function() {
+ var word = wordSpan.innerHTML;
+
+ dom.remove(wordSpan, 1);
+ t._checkDone();
+
+ ed.setProgressState(1);
+ t._sendRPC('learnWord', [t.selectedLang, word], function(r) {
+ ed.setProgressState(0);
+ });
+ }
+ });
+ }
+
+ m.update();
+ });
+
+ p1 = DOM.getPos(ed.getContentAreaContainer());
+ m.settings.offset_x = p1.x;
+ m.settings.offset_y = p1.y;
+
+ ed.selection.select(wordSpan);
+ p1 = dom.getPos(wordSpan);
+ m.showMenu(p1.x, p1.y + wordSpan.offsetHeight - vp.y);
+
+ return tinymce.dom.Event.cancel(e);
+ } else
+ m.hideMenu();
+ },
+
+ _checkDone : function() {
+ var t = this, ed = t.editor, dom = ed.dom, o;
+
+ each(dom.select('span'), function(n) {
+ if (n && dom.hasClass(n, 'mceItemHiddenSpellWord')) {
+ o = true;
+ return false;
+ }
+ });
+
+ if (!o)
+ t._done();
+ },
+
+ _done : function() {
+ var t = this, la = t.active;
+
+ if (t.active) {
+ t.active = 0;
+ t._removeWords();
+
+ if (t._menu)
+ t._menu.hideMenu();
+
+ if (la)
+ t.editor.nodeChanged();
+ }
+ },
+
+ _sendRPC : function(m, p, cb) {
+ var t = this;
+
+ JSONRequest.sendRPC({
+ url : t.rpcUrl,
+ method : m,
+ params : p,
+ success : cb,
+ error : function(e, x) {
+ t.editor.setProgressState(0);
+ t.editor.windowManager.alert(e.errstr || ('Error response: ' + x.responseText));
+ }
+ });
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('spellchecker', tinymce.plugins.SpellcheckerPlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif
new file mode 100644
index 0000000..7d0a4db
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/spellchecker/img/wline.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/css/props.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/css/props.css
new file mode 100644
index 0000000..3b8f0ee
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/css/props.css
@@ -0,0 +1,14 @@
+#text_font {width:250px;}
+#text_size {width:70px;}
+.mceAddSelectValue {background:#DDD;}
+select, #block_text_indent, #box_width, #box_height, #box_padding_top, #box_padding_right, #box_padding_bottom, #box_padding_left {width:70px;}
+#box_margin_top, #box_margin_right, #box_margin_bottom, #box_margin_left, #positioning_width, #positioning_height, #positioning_zindex {width:70px;}
+#positioning_placement_top, #positioning_placement_right, #positioning_placement_bottom, #positioning_placement_left {width:70px;}
+#positioning_clip_top, #positioning_clip_right, #positioning_clip_bottom, #positioning_clip_left {width:70px;}
+.panel_toggle_insert_span {padding-top:10px;}
+.panel_wrapper div.current {padding-top:10px;height:230px;}
+.delim {border-left:1px solid gray;}
+.tdelim {border-bottom:1px solid gray;}
+#block_display {width:145px;}
+#list_type {width:115px;}
+.disabled {background:#EEE;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin.js
new file mode 100644
index 0000000..dda9f92
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.StylePlugin",{init:function(a,b){a.addCommand("mceStyleProps",function(){var c=false;var f=a.selection.getSelectedBlocks();var d=[];if(f.length===1){d.push(a.selection.getNode().style.cssText)}else{tinymce.each(f,function(g){d.push(a.dom.getAttrib(g,"style"))});c=true}a.windowManager.open({file:b+"/props.htm",width:480+parseInt(a.getLang("style.delta_width",0)),height:340+parseInt(a.getLang("style.delta_height",0)),inline:1},{applyStyleToBlocks:c,plugin_url:b,styles:d})});a.addCommand("mceSetElementStyle",function(d,c){if(e=a.selection.getNode()){a.dom.setAttrib(e,"style",c);a.execCommand("mceRepaint")}});a.onNodeChange.add(function(d,c,f){c.setDisabled("styleprops",f.nodeName==="BODY")});a.addButton("styleprops",{title:"style.desc",cmd:"mceStyleProps"})},getInfo:function(){return{longname:"Style",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("style",tinymce.plugins.StylePlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js
new file mode 100644
index 0000000..eaa7c77
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/editor_plugin_src.js
@@ -0,0 +1,71 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.StylePlugin', {
+ init : function(ed, url) {
+ // Register commands
+ ed.addCommand('mceStyleProps', function() {
+
+ var applyStyleToBlocks = false;
+ var blocks = ed.selection.getSelectedBlocks();
+ var styles = [];
+
+ if (blocks.length === 1) {
+ styles.push(ed.selection.getNode().style.cssText);
+ }
+ else {
+ tinymce.each(blocks, function(block) {
+ styles.push(ed.dom.getAttrib(block, 'style'));
+ });
+ applyStyleToBlocks = true;
+ }
+
+ ed.windowManager.open({
+ file : url + '/props.htm',
+ width : 480 + parseInt(ed.getLang('style.delta_width', 0)),
+ height : 340 + parseInt(ed.getLang('style.delta_height', 0)),
+ inline : 1
+ }, {
+ applyStyleToBlocks : applyStyleToBlocks,
+ plugin_url : url,
+ styles : styles
+ });
+ });
+
+ ed.addCommand('mceSetElementStyle', function(ui, v) {
+ if (e = ed.selection.getNode()) {
+ ed.dom.setAttrib(e, 'style', v);
+ ed.execCommand('mceRepaint');
+ }
+ });
+
+ ed.onNodeChange.add(function(ed, cm, n) {
+ cm.setDisabled('styleprops', n.nodeName === 'BODY');
+ });
+
+ // Register buttons
+ ed.addButton('styleprops', {title : 'style.desc', cmd : 'mceStyleProps'});
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Style',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/style',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('style', tinymce.plugins.StylePlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/js/props.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/js/props.js
new file mode 100644
index 0000000..0a8a8ec
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/js/props.js
@@ -0,0 +1,709 @@
+tinyMCEPopup.requireLangPack();
+
+var defaultFonts = "" +
+ "Arial, Helvetica, sans-serif=Arial, Helvetica, sans-serif;" +
+ "Times New Roman, Times, serif=Times New Roman, Times, serif;" +
+ "Courier New, Courier, mono=Courier New, Courier, mono;" +
+ "Times New Roman, Times, serif=Times New Roman, Times, serif;" +
+ "Georgia, Times New Roman, Times, serif=Georgia, Times New Roman, Times, serif;" +
+ "Verdana, Arial, Helvetica, sans-serif=Verdana, Arial, Helvetica, sans-serif;" +
+ "Geneva, Arial, Helvetica, sans-serif=Geneva, Arial, Helvetica, sans-serif";
+
+var defaultSizes = "9;10;12;14;16;18;24;xx-small;x-small;small;medium;large;x-large;xx-large;smaller;larger";
+var defaultMeasurement = "+pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%";
+var defaultSpacingMeasurement = "pixels=px;points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;+ems=em;exs=ex;%";
+var defaultIndentMeasurement = "pixels=px;+points=pt;inches=in;centimetres=cm;millimetres=mm;picas=pc;ems=em;exs=ex;%";
+var defaultWeight = "normal;bold;bolder;lighter;100;200;300;400;500;600;700;800;900";
+var defaultTextStyle = "normal;italic;oblique";
+var defaultVariant = "normal;small-caps";
+var defaultLineHeight = "normal";
+var defaultAttachment = "fixed;scroll";
+var defaultRepeat = "no-repeat;repeat;repeat-x;repeat-y";
+var defaultPosH = "left;center;right";
+var defaultPosV = "top;center;bottom";
+var defaultVAlign = "baseline;sub;super;top;text-top;middle;bottom;text-bottom";
+var defaultDisplay = "inline;block;list-item;run-in;compact;marker;table;inline-table;table-row-group;table-header-group;table-footer-group;table-row;table-column-group;table-column;table-cell;table-caption;none";
+var defaultBorderStyle = "none;solid;dashed;dotted;double;groove;ridge;inset;outset";
+var defaultBorderWidth = "thin;medium;thick";
+var defaultListType = "disc;circle;square;decimal;lower-roman;upper-roman;lower-alpha;upper-alpha;none";
+
+function aggregateStyles(allStyles) {
+ var mergedStyles = {};
+
+ tinymce.each(allStyles, function(style) {
+ if (style !== '') {
+ var parsedStyles = tinyMCEPopup.editor.dom.parseStyle(style);
+ for (var name in parsedStyles) {
+ if (parsedStyles.hasOwnProperty(name)) {
+ if (mergedStyles[name] === undefined) {
+ mergedStyles[name] = parsedStyles[name];
+ }
+ else if (name === 'text-decoration') {
+ if (mergedStyles[name].indexOf(parsedStyles[name]) === -1) {
+ mergedStyles[name] = mergedStyles[name] +' '+ parsedStyles[name];
+ }
+ }
+ }
+ }
+ }
+ });
+
+ return mergedStyles;
+}
+
+var applyActionIsInsert;
+var existingStyles;
+
+function init(ed) {
+ var ce = document.getElementById('container'), h;
+
+ existingStyles = aggregateStyles(tinyMCEPopup.getWindowArg('styles'));
+ ce.style.cssText = tinyMCEPopup.editor.dom.serializeStyle(existingStyles);
+
+ applyActionIsInsert = ed.getParam("edit_css_style_insert_span", false);
+ document.getElementById('toggle_insert_span').checked = applyActionIsInsert;
+
+ h = getBrowserHTML('background_image_browser','background_image','image','advimage');
+ document.getElementById("background_image_browser").innerHTML = h;
+
+ document.getElementById('text_color_pickcontainer').innerHTML = getColorPickerHTML('text_color_pick','text_color');
+ document.getElementById('background_color_pickcontainer').innerHTML = getColorPickerHTML('background_color_pick','background_color');
+ document.getElementById('border_color_top_pickcontainer').innerHTML = getColorPickerHTML('border_color_top_pick','border_color_top');
+ document.getElementById('border_color_right_pickcontainer').innerHTML = getColorPickerHTML('border_color_right_pick','border_color_right');
+ document.getElementById('border_color_bottom_pickcontainer').innerHTML = getColorPickerHTML('border_color_bottom_pick','border_color_bottom');
+ document.getElementById('border_color_left_pickcontainer').innerHTML = getColorPickerHTML('border_color_left_pick','border_color_left');
+
+ fillSelect(0, 'text_font', 'style_font', defaultFonts, ';', true);
+ fillSelect(0, 'text_size', 'style_font_size', defaultSizes, ';', true);
+ fillSelect(0, 'text_size_measurement', 'style_font_size_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'text_case', 'style_text_case', "capitalize;uppercase;lowercase", ';', true);
+ fillSelect(0, 'text_weight', 'style_font_weight', defaultWeight, ';', true);
+ fillSelect(0, 'text_style', 'style_font_style', defaultTextStyle, ';', true);
+ fillSelect(0, 'text_variant', 'style_font_variant', defaultVariant, ';', true);
+ fillSelect(0, 'text_lineheight', 'style_font_line_height', defaultLineHeight, ';', true);
+ fillSelect(0, 'text_lineheight_measurement', 'style_font_line_height_measurement', defaultMeasurement, ';', true);
+
+ fillSelect(0, 'background_attachment', 'style_background_attachment', defaultAttachment, ';', true);
+ fillSelect(0, 'background_repeat', 'style_background_repeat', defaultRepeat, ';', true);
+
+ fillSelect(0, 'background_hpos_measurement', 'style_background_hpos_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'background_vpos_measurement', 'style_background_vpos_measurement', defaultMeasurement, ';', true);
+
+ fillSelect(0, 'background_hpos', 'style_background_hpos', defaultPosH, ';', true);
+ fillSelect(0, 'background_vpos', 'style_background_vpos', defaultPosV, ';', true);
+
+ fillSelect(0, 'block_wordspacing', 'style_wordspacing', 'normal', ';', true);
+ fillSelect(0, 'block_wordspacing_measurement', 'style_wordspacing_measurement', defaultSpacingMeasurement, ';', true);
+ fillSelect(0, 'block_letterspacing', 'style_letterspacing', 'normal', ';', true);
+ fillSelect(0, 'block_letterspacing_measurement', 'style_letterspacing_measurement', defaultSpacingMeasurement, ';', true);
+ fillSelect(0, 'block_vertical_alignment', 'style_vertical_alignment', defaultVAlign, ';', true);
+ fillSelect(0, 'block_text_align', 'style_text_align', "left;right;center;justify", ';', true);
+ fillSelect(0, 'block_whitespace', 'style_whitespace', "normal;pre;nowrap", ';', true);
+ fillSelect(0, 'block_display', 'style_display', defaultDisplay, ';', true);
+ fillSelect(0, 'block_text_indent_measurement', 'style_text_indent_measurement', defaultIndentMeasurement, ';', true);
+
+ fillSelect(0, 'box_width_measurement', 'style_box_width_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_height_measurement', 'style_box_height_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_float', 'style_float', 'left;right;none', ';', true);
+ fillSelect(0, 'box_clear', 'style_clear', 'left;right;both;none', ';', true);
+ fillSelect(0, 'box_padding_left_measurement', 'style_padding_left_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_padding_top_measurement', 'style_padding_top_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_padding_bottom_measurement', 'style_padding_bottom_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_padding_right_measurement', 'style_padding_right_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_margin_left_measurement', 'style_margin_left_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_margin_top_measurement', 'style_margin_top_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_margin_bottom_measurement', 'style_margin_bottom_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'box_margin_right_measurement', 'style_margin_right_measurement', defaultMeasurement, ';', true);
+
+ fillSelect(0, 'border_style_top', 'style_border_style_top', defaultBorderStyle, ';', true);
+ fillSelect(0, 'border_style_right', 'style_border_style_right', defaultBorderStyle, ';', true);
+ fillSelect(0, 'border_style_bottom', 'style_border_style_bottom', defaultBorderStyle, ';', true);
+ fillSelect(0, 'border_style_left', 'style_border_style_left', defaultBorderStyle, ';', true);
+
+ fillSelect(0, 'border_width_top', 'style_border_width_top', defaultBorderWidth, ';', true);
+ fillSelect(0, 'border_width_right', 'style_border_width_right', defaultBorderWidth, ';', true);
+ fillSelect(0, 'border_width_bottom', 'style_border_width_bottom', defaultBorderWidth, ';', true);
+ fillSelect(0, 'border_width_left', 'style_border_width_left', defaultBorderWidth, ';', true);
+
+ fillSelect(0, 'border_width_top_measurement', 'style_border_width_top_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'border_width_right_measurement', 'style_border_width_right_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'border_width_bottom_measurement', 'style_border_width_bottom_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'border_width_left_measurement', 'style_border_width_left_measurement', defaultMeasurement, ';', true);
+
+ fillSelect(0, 'list_type', 'style_list_type', defaultListType, ';', true);
+ fillSelect(0, 'list_position', 'style_list_position', "inside;outside", ';', true);
+
+ fillSelect(0, 'positioning_type', 'style_positioning_type', "absolute;relative;static", ';', true);
+ fillSelect(0, 'positioning_visibility', 'style_positioning_visibility', "inherit;visible;hidden", ';', true);
+
+ fillSelect(0, 'positioning_width_measurement', 'style_positioning_width_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_height_measurement', 'style_positioning_height_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_overflow', 'style_positioning_overflow', "visible;hidden;scroll;auto", ';', true);
+
+ fillSelect(0, 'positioning_placement_top_measurement', 'style_positioning_placement_top_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_placement_right_measurement', 'style_positioning_placement_right_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_placement_bottom_measurement', 'style_positioning_placement_bottom_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_placement_left_measurement', 'style_positioning_placement_left_measurement', defaultMeasurement, ';', true);
+
+ fillSelect(0, 'positioning_clip_top_measurement', 'style_positioning_clip_top_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_clip_right_measurement', 'style_positioning_clip_right_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_clip_bottom_measurement', 'style_positioning_clip_bottom_measurement', defaultMeasurement, ';', true);
+ fillSelect(0, 'positioning_clip_left_measurement', 'style_positioning_clip_left_measurement', defaultMeasurement, ';', true);
+
+ TinyMCE_EditableSelects.init();
+ setupFormData();
+ showDisabledControls();
+}
+
+function setupFormData() {
+ var ce = document.getElementById('container'), f = document.forms[0], s, b, i;
+
+ // Setup text fields
+
+ selectByValue(f, 'text_font', ce.style.fontFamily, true, true);
+ selectByValue(f, 'text_size', getNum(ce.style.fontSize), true, true);
+ selectByValue(f, 'text_size_measurement', getMeasurement(ce.style.fontSize));
+ selectByValue(f, 'text_weight', ce.style.fontWeight, true, true);
+ selectByValue(f, 'text_style', ce.style.fontStyle, true, true);
+ selectByValue(f, 'text_lineheight', getNum(ce.style.lineHeight), true, true);
+ selectByValue(f, 'text_lineheight_measurement', getMeasurement(ce.style.lineHeight));
+ selectByValue(f, 'text_case', ce.style.textTransform, true, true);
+ selectByValue(f, 'text_variant', ce.style.fontVariant, true, true);
+ f.text_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.color);
+ updateColor('text_color_pick', 'text_color');
+ f.text_underline.checked = inStr(ce.style.textDecoration, 'underline');
+ f.text_overline.checked = inStr(ce.style.textDecoration, 'overline');
+ f.text_linethrough.checked = inStr(ce.style.textDecoration, 'line-through');
+ f.text_blink.checked = inStr(ce.style.textDecoration, 'blink');
+ f.text_none.checked = inStr(ce.style.textDecoration, 'none');
+ updateTextDecorations();
+
+ // Setup background fields
+
+ f.background_color.value = tinyMCEPopup.editor.dom.toHex(ce.style.backgroundColor);
+ updateColor('background_color_pick', 'background_color');
+ f.background_image.value = ce.style.backgroundImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+ selectByValue(f, 'background_repeat', ce.style.backgroundRepeat, true, true);
+ selectByValue(f, 'background_attachment', ce.style.backgroundAttachment, true, true);
+ selectByValue(f, 'background_hpos', getNum(getVal(ce.style.backgroundPosition, 0)), true, true);
+ selectByValue(f, 'background_hpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 0)));
+ selectByValue(f, 'background_vpos', getNum(getVal(ce.style.backgroundPosition, 1)), true, true);
+ selectByValue(f, 'background_vpos_measurement', getMeasurement(getVal(ce.style.backgroundPosition, 1)));
+
+ // Setup block fields
+
+ selectByValue(f, 'block_wordspacing', getNum(ce.style.wordSpacing), true, true);
+ selectByValue(f, 'block_wordspacing_measurement', getMeasurement(ce.style.wordSpacing));
+ selectByValue(f, 'block_letterspacing', getNum(ce.style.letterSpacing), true, true);
+ selectByValue(f, 'block_letterspacing_measurement', getMeasurement(ce.style.letterSpacing));
+ selectByValue(f, 'block_vertical_alignment', ce.style.verticalAlign, true, true);
+ selectByValue(f, 'block_text_align', ce.style.textAlign, true, true);
+ f.block_text_indent.value = getNum(ce.style.textIndent);
+ selectByValue(f, 'block_text_indent_measurement', getMeasurement(ce.style.textIndent));
+ selectByValue(f, 'block_whitespace', ce.style.whiteSpace, true, true);
+ selectByValue(f, 'block_display', ce.style.display, true, true);
+
+ // Setup box fields
+
+ f.box_width.value = getNum(ce.style.width);
+ selectByValue(f, 'box_width_measurement', getMeasurement(ce.style.width));
+
+ f.box_height.value = getNum(ce.style.height);
+ selectByValue(f, 'box_height_measurement', getMeasurement(ce.style.height));
+ selectByValue(f, 'box_float', ce.style.cssFloat || ce.style.styleFloat, true, true);
+
+ selectByValue(f, 'box_clear', ce.style.clear, true, true);
+
+ setupBox(f, ce, 'box_padding', 'padding', '');
+ setupBox(f, ce, 'box_margin', 'margin', '');
+
+ // Setup border fields
+
+ setupBox(f, ce, 'border_style', 'border', 'Style');
+ setupBox(f, ce, 'border_width', 'border', 'Width');
+ setupBox(f, ce, 'border_color', 'border', 'Color');
+
+ updateColor('border_color_top_pick', 'border_color_top');
+ updateColor('border_color_right_pick', 'border_color_right');
+ updateColor('border_color_bottom_pick', 'border_color_bottom');
+ updateColor('border_color_left_pick', 'border_color_left');
+
+ f.elements.border_color_top.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_top.value);
+ f.elements.border_color_right.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_right.value);
+ f.elements.border_color_bottom.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_bottom.value);
+ f.elements.border_color_left.value = tinyMCEPopup.editor.dom.toHex(f.elements.border_color_left.value);
+
+ // Setup list fields
+
+ selectByValue(f, 'list_type', ce.style.listStyleType, true, true);
+ selectByValue(f, 'list_position', ce.style.listStylePosition, true, true);
+ f.list_bullet_image.value = ce.style.listStyleImage.replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");
+
+ // Setup box fields
+
+ selectByValue(f, 'positioning_type', ce.style.position, true, true);
+ selectByValue(f, 'positioning_visibility', ce.style.visibility, true, true);
+ selectByValue(f, 'positioning_overflow', ce.style.overflow, true, true);
+ f.positioning_zindex.value = ce.style.zIndex ? ce.style.zIndex : "";
+
+ f.positioning_width.value = getNum(ce.style.width);
+ selectByValue(f, 'positioning_width_measurement', getMeasurement(ce.style.width));
+
+ f.positioning_height.value = getNum(ce.style.height);
+ selectByValue(f, 'positioning_height_measurement', getMeasurement(ce.style.height));
+
+ setupBox(f, ce, 'positioning_placement', '', '', ['top', 'right', 'bottom', 'left']);
+
+ s = ce.style.clip.replace(new RegExp("rect\\('?([^']*)'?\\)", 'gi'), "$1");
+ s = s.replace(/,/g, ' ');
+
+ if (!hasEqualValues([getVal(s, 0), getVal(s, 1), getVal(s, 2), getVal(s, 3)])) {
+ f.positioning_clip_top.value = getNum(getVal(s, 0));
+ selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));
+ f.positioning_clip_right.value = getNum(getVal(s, 1));
+ selectByValue(f, 'positioning_clip_right_measurement', getMeasurement(getVal(s, 1)));
+ f.positioning_clip_bottom.value = getNum(getVal(s, 2));
+ selectByValue(f, 'positioning_clip_bottom_measurement', getMeasurement(getVal(s, 2)));
+ f.positioning_clip_left.value = getNum(getVal(s, 3));
+ selectByValue(f, 'positioning_clip_left_measurement', getMeasurement(getVal(s, 3)));
+ } else {
+ f.positioning_clip_top.value = getNum(getVal(s, 0));
+ selectByValue(f, 'positioning_clip_top_measurement', getMeasurement(getVal(s, 0)));
+ f.positioning_clip_right.value = f.positioning_clip_bottom.value = f.positioning_clip_left.value;
+ }
+
+// setupBox(f, ce, '', 'border', 'Color');
+}
+
+function getMeasurement(s) {
+ return s.replace(/^([0-9.]+)(.*)$/, "$2");
+}
+
+function getNum(s) {
+ if (new RegExp('^(?:[0-9.]+)(?:[a-z%]+)$', 'gi').test(s))
+ return s.replace(/[^0-9.]/g, '');
+
+ return s;
+}
+
+function inStr(s, n) {
+ return new RegExp(n, 'gi').test(s);
+}
+
+function getVal(s, i) {
+ var a = s.split(' ');
+
+ if (a.length > 1)
+ return a[i];
+
+ return "";
+}
+
+function setValue(f, n, v) {
+ if (f.elements[n].type == "text")
+ f.elements[n].value = v;
+ else
+ selectByValue(f, n, v, true, true);
+}
+
+function setupBox(f, ce, fp, pr, sf, b) {
+ if (typeof(b) == "undefined")
+ b = ['Top', 'Right', 'Bottom', 'Left'];
+
+ if (isSame(ce, pr, sf, b)) {
+ f.elements[fp + "_same"].checked = true;
+
+ setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));
+ f.elements[fp + "_top"].disabled = false;
+
+ f.elements[fp + "_right"].value = "";
+ f.elements[fp + "_right"].disabled = true;
+ f.elements[fp + "_bottom"].value = "";
+ f.elements[fp + "_bottom"].disabled = true;
+ f.elements[fp + "_left"].value = "";
+ f.elements[fp + "_left"].disabled = true;
+
+ if (f.elements[fp + "_top_measurement"]) {
+ selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));
+ f.elements[fp + "_left_measurement"].disabled = true;
+ f.elements[fp + "_bottom_measurement"].disabled = true;
+ f.elements[fp + "_right_measurement"].disabled = true;
+ }
+ } else {
+ f.elements[fp + "_same"].checked = false;
+
+ setValue(f, fp + "_top", getNum(ce.style[pr + b[0] + sf]));
+ f.elements[fp + "_top"].disabled = false;
+
+ setValue(f, fp + "_right", getNum(ce.style[pr + b[1] + sf]));
+ f.elements[fp + "_right"].disabled = false;
+
+ setValue(f, fp + "_bottom", getNum(ce.style[pr + b[2] + sf]));
+ f.elements[fp + "_bottom"].disabled = false;
+
+ setValue(f, fp + "_left", getNum(ce.style[pr + b[3] + sf]));
+ f.elements[fp + "_left"].disabled = false;
+
+ if (f.elements[fp + "_top_measurement"]) {
+ selectByValue(f, fp + '_top_measurement', getMeasurement(ce.style[pr + b[0] + sf]));
+ selectByValue(f, fp + '_right_measurement', getMeasurement(ce.style[pr + b[1] + sf]));
+ selectByValue(f, fp + '_bottom_measurement', getMeasurement(ce.style[pr + b[2] + sf]));
+ selectByValue(f, fp + '_left_measurement', getMeasurement(ce.style[pr + b[3] + sf]));
+ f.elements[fp + "_left_measurement"].disabled = false;
+ f.elements[fp + "_bottom_measurement"].disabled = false;
+ f.elements[fp + "_right_measurement"].disabled = false;
+ }
+ }
+}
+
+function isSame(e, pr, sf, b) {
+ var a = [], i, x;
+
+ if (typeof(b) == "undefined")
+ b = ['Top', 'Right', 'Bottom', 'Left'];
+
+ if (typeof(sf) == "undefined" || sf == null)
+ sf = "";
+
+ a[0] = e.style[pr + b[0] + sf];
+ a[1] = e.style[pr + b[1] + sf];
+ a[2] = e.style[pr + b[2] + sf];
+ a[3] = e.style[pr + b[3] + sf];
+
+ for (i=0; i 0 ? s.substring(1) : s;
+
+ if (f.text_none.checked)
+ s = "none";
+
+ ce.style.textDecoration = s;
+
+ // Build background styles
+
+ ce.style.backgroundColor = f.background_color.value;
+ ce.style.backgroundImage = f.background_image.value != "" ? "url(" + f.background_image.value + ")" : "";
+ ce.style.backgroundRepeat = f.background_repeat.value;
+ ce.style.backgroundAttachment = f.background_attachment.value;
+
+ if (f.background_hpos.value != "") {
+ s = "";
+ s += f.background_hpos.value + (isNum(f.background_hpos.value) ? f.background_hpos_measurement.value : "") + " ";
+ s += f.background_vpos.value + (isNum(f.background_vpos.value) ? f.background_vpos_measurement.value : "");
+ ce.style.backgroundPosition = s;
+ }
+
+ // Build block styles
+
+ ce.style.wordSpacing = f.block_wordspacing.value + (isNum(f.block_wordspacing.value) ? f.block_wordspacing_measurement.value : "");
+ ce.style.letterSpacing = f.block_letterspacing.value + (isNum(f.block_letterspacing.value) ? f.block_letterspacing_measurement.value : "");
+ ce.style.verticalAlign = f.block_vertical_alignment.value;
+ ce.style.textAlign = f.block_text_align.value;
+ ce.style.textIndent = f.block_text_indent.value + (isNum(f.block_text_indent.value) ? f.block_text_indent_measurement.value : "");
+ ce.style.whiteSpace = f.block_whitespace.value;
+ ce.style.display = f.block_display.value;
+
+ // Build box styles
+
+ ce.style.width = f.box_width.value + (isNum(f.box_width.value) ? f.box_width_measurement.value : "");
+ ce.style.height = f.box_height.value + (isNum(f.box_height.value) ? f.box_height_measurement.value : "");
+ ce.style.styleFloat = f.box_float.value;
+ ce.style.cssFloat = f.box_float.value;
+
+ ce.style.clear = f.box_clear.value;
+
+ if (!f.box_padding_same.checked) {
+ ce.style.paddingTop = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");
+ ce.style.paddingRight = f.box_padding_right.value + (isNum(f.box_padding_right.value) ? f.box_padding_right_measurement.value : "");
+ ce.style.paddingBottom = f.box_padding_bottom.value + (isNum(f.box_padding_bottom.value) ? f.box_padding_bottom_measurement.value : "");
+ ce.style.paddingLeft = f.box_padding_left.value + (isNum(f.box_padding_left.value) ? f.box_padding_left_measurement.value : "");
+ } else
+ ce.style.padding = f.box_padding_top.value + (isNum(f.box_padding_top.value) ? f.box_padding_top_measurement.value : "");
+
+ if (!f.box_margin_same.checked) {
+ ce.style.marginTop = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");
+ ce.style.marginRight = f.box_margin_right.value + (isNum(f.box_margin_right.value) ? f.box_margin_right_measurement.value : "");
+ ce.style.marginBottom = f.box_margin_bottom.value + (isNum(f.box_margin_bottom.value) ? f.box_margin_bottom_measurement.value : "");
+ ce.style.marginLeft = f.box_margin_left.value + (isNum(f.box_margin_left.value) ? f.box_margin_left_measurement.value : "");
+ } else
+ ce.style.margin = f.box_margin_top.value + (isNum(f.box_margin_top.value) ? f.box_margin_top_measurement.value : "");
+
+ // Build border styles
+
+ if (!f.border_style_same.checked) {
+ ce.style.borderTopStyle = f.border_style_top.value;
+ ce.style.borderRightStyle = f.border_style_right.value;
+ ce.style.borderBottomStyle = f.border_style_bottom.value;
+ ce.style.borderLeftStyle = f.border_style_left.value;
+ } else
+ ce.style.borderStyle = f.border_style_top.value;
+
+ if (!f.border_width_same.checked) {
+ ce.style.borderTopWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : "");
+ ce.style.borderRightWidth = f.border_width_right.value + (isNum(f.border_width_right.value) ? f.border_width_right_measurement.value : "");
+ ce.style.borderBottomWidth = f.border_width_bottom.value + (isNum(f.border_width_bottom.value) ? f.border_width_bottom_measurement.value : "");
+ ce.style.borderLeftWidth = f.border_width_left.value + (isNum(f.border_width_left.value) ? f.border_width_left_measurement.value : "");
+ } else
+ ce.style.borderWidth = f.border_width_top.value + (isNum(f.border_width_top.value) ? f.border_width_top_measurement.value : "");
+
+ if (!f.border_color_same.checked) {
+ ce.style.borderTopColor = f.border_color_top.value;
+ ce.style.borderRightColor = f.border_color_right.value;
+ ce.style.borderBottomColor = f.border_color_bottom.value;
+ ce.style.borderLeftColor = f.border_color_left.value;
+ } else
+ ce.style.borderColor = f.border_color_top.value;
+
+ // Build list styles
+
+ ce.style.listStyleType = f.list_type.value;
+ ce.style.listStylePosition = f.list_position.value;
+ ce.style.listStyleImage = f.list_bullet_image.value != "" ? "url(" + f.list_bullet_image.value + ")" : "";
+
+ // Build positioning styles
+
+ ce.style.position = f.positioning_type.value;
+ ce.style.visibility = f.positioning_visibility.value;
+
+ if (ce.style.width == "")
+ ce.style.width = f.positioning_width.value + (isNum(f.positioning_width.value) ? f.positioning_width_measurement.value : "");
+
+ if (ce.style.height == "")
+ ce.style.height = f.positioning_height.value + (isNum(f.positioning_height.value) ? f.positioning_height_measurement.value : "");
+
+ ce.style.zIndex = f.positioning_zindex.value;
+ ce.style.overflow = f.positioning_overflow.value;
+
+ if (!f.positioning_placement_same.checked) {
+ ce.style.top = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");
+ ce.style.right = f.positioning_placement_right.value + (isNum(f.positioning_placement_right.value) ? f.positioning_placement_right_measurement.value : "");
+ ce.style.bottom = f.positioning_placement_bottom.value + (isNum(f.positioning_placement_bottom.value) ? f.positioning_placement_bottom_measurement.value : "");
+ ce.style.left = f.positioning_placement_left.value + (isNum(f.positioning_placement_left.value) ? f.positioning_placement_left_measurement.value : "");
+ } else {
+ s = f.positioning_placement_top.value + (isNum(f.positioning_placement_top.value) ? f.positioning_placement_top_measurement.value : "");
+ ce.style.top = s;
+ ce.style.right = s;
+ ce.style.bottom = s;
+ ce.style.left = s;
+ }
+
+ if (!f.positioning_clip_same.checked) {
+ s = "rect(";
+ s += (isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto") + " ";
+ s += (isNum(f.positioning_clip_right.value) ? f.positioning_clip_right.value + f.positioning_clip_right_measurement.value : "auto") + " ";
+ s += (isNum(f.positioning_clip_bottom.value) ? f.positioning_clip_bottom.value + f.positioning_clip_bottom_measurement.value : "auto") + " ";
+ s += (isNum(f.positioning_clip_left.value) ? f.positioning_clip_left.value + f.positioning_clip_left_measurement.value : "auto");
+ s += ")";
+
+ if (s != "rect(auto auto auto auto)")
+ ce.style.clip = s;
+ } else {
+ s = "rect(";
+ t = isNum(f.positioning_clip_top.value) ? f.positioning_clip_top.value + f.positioning_clip_top_measurement.value : "auto";
+ s += t + " ";
+ s += t + " ";
+ s += t + " ";
+ s += t + ")";
+
+ if (s != "rect(auto auto auto auto)")
+ ce.style.clip = s;
+ }
+
+ ce.style.cssText = ce.style.cssText;
+}
+
+function isNum(s) {
+ return new RegExp('[0-9]+', 'g').test(s);
+}
+
+function showDisabledControls() {
+ var f = document.forms, i, a;
+
+ for (i=0; i 1) {
+ addSelectValue(f, s, p[0], p[1]);
+
+ if (se)
+ selectByValue(f, s, p[1]);
+ } else {
+ addSelectValue(f, s, p[0], p[0]);
+
+ if (se)
+ selectByValue(f, s, p[0]);
+ }
+ }
+}
+
+function toggleSame(ce, pre) {
+ var el = document.forms[0].elements, i;
+
+ if (ce.checked) {
+ el[pre + "_top"].disabled = false;
+ el[pre + "_right"].disabled = true;
+ el[pre + "_bottom"].disabled = true;
+ el[pre + "_left"].disabled = true;
+
+ if (el[pre + "_top_measurement"]) {
+ el[pre + "_top_measurement"].disabled = false;
+ el[pre + "_right_measurement"].disabled = true;
+ el[pre + "_bottom_measurement"].disabled = true;
+ el[pre + "_left_measurement"].disabled = true;
+ }
+ } else {
+ el[pre + "_top"].disabled = false;
+ el[pre + "_right"].disabled = false;
+ el[pre + "_bottom"].disabled = false;
+ el[pre + "_left"].disabled = false;
+
+ if (el[pre + "_top_measurement"]) {
+ el[pre + "_top_measurement"].disabled = false;
+ el[pre + "_right_measurement"].disabled = false;
+ el[pre + "_bottom_measurement"].disabled = false;
+ el[pre + "_left_measurement"].disabled = false;
+ }
+ }
+
+ showDisabledControls();
+}
+
+function synch(fr, to) {
+ var f = document.forms[0];
+
+ f.elements[to].value = f.elements[fr].value;
+
+ if (f.elements[fr + "_measurement"])
+ selectByValue(f, to + "_measurement", f.elements[fr + "_measurement"].value);
+}
+
+function updateTextDecorations(){
+ var el = document.forms[0].elements;
+
+ var textDecorations = ["text_underline", "text_overline", "text_linethrough", "text_blink"];
+ var noneChecked = el["text_none"].checked;
+ tinymce.each(textDecorations, function(id) {
+ el[id].disabled = noneChecked;
+ if (noneChecked) {
+ el[id].checked = false;
+ }
+ });
+}
+
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js
new file mode 100644
index 0000000..35881b3
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.style_dlg',{"text_lineheight":"Line Height","text_variant":"Variant","text_style":"Style","text_weight":"Weight","text_size":"Size","text_font":"Font","text_props":"Text","positioning_tab":"Positioning","list_tab":"List","border_tab":"Border","box_tab":"Box","block_tab":"Block","background_tab":"Background","text_tab":"Text",apply:"Apply",toggle_insert_span:"Insert span at selection",title:"Edit CSS Style",clip:"Clip",placement:"Placement",overflow:"Overflow",zindex:"Z-index",visibility:"Visibility","positioning_type":"Type",position:"Position","bullet_image":"Bullet Image","list_type":"Type",color:"Color",height:"Height",width:"Width",style:"Style",margin:"Margin",left:"Left",bottom:"Bottom",right:"Right",top:"Top",same:"Same for All",padding:"Padding","box_clear":"Clear","box_float":"Float","box_height":"Height","box_width":"Width","block_display":"Display","block_whitespace":"Whitespace","block_text_indent":"Text Indent","block_text_align":"Text Align","block_vertical_alignment":"Vertical Alignment","block_letterspacing":"Letter Spacing","block_wordspacing":"Word Spacing","background_vpos":"Vertical Position","background_hpos":"Horizontal Position","background_attachment":"Attachment","background_repeat":"Repeat","background_image":"Background Image","background_color":"Background Color","text_none":"None","text_blink":"Blink","text_case":"Case","text_striketrough":"Strikethrough","text_underline":"Underline","text_overline":"Overline","text_decoration":"Decoration","text_color":"Color",text:"Text",background:"Background",block:"Block",box:"Box",border:"Border",list:"List"});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/props.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/props.htm
new file mode 100644
index 0000000..7dc087a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/props.htm
@@ -0,0 +1,845 @@
+
+
+
+ {#style_dlg.title}
+
+
+
+
+
+
+
+
+
+{#style_dlg.title}
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/readme.txt b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/readme.txt
new file mode 100644
index 0000000..5bac302
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/style/readme.txt
@@ -0,0 +1,19 @@
+Edit CSS Style plug-in notes
+~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+Unlike WYSIWYG editor functionality that operates only on the selected text,
+typically by inserting new HTML elements with the specified styles.
+This plug-in operates on the HTML blocks surrounding the selected text.
+No new HTML elements are created.
+
+This plug-in only operates on the surrounding blocks and not the nearest
+parent node. This means that if a block encapsulates a node,
+e.g text
, then only the styles in the block are
+recognized, not those in the span.
+
+When selecting text that includes multiple blocks at the same level (peers),
+this plug-in accumulates the specified styles in all of the surrounding blocks
+and populates the dialogue checkboxes accordingly. There is no differentiation
+between styles set in all the blocks versus styles set in some of the blocks.
+
+When the [Update] or [Apply] buttons are pressed, the styles selected in the
+checkboxes are applied to all blocks that surround the selected text.
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js
new file mode 100644
index 0000000..2c51291
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var c=tinymce.DOM,a=tinymce.dom.Event,d=tinymce.each,b=tinymce.explode;tinymce.create("tinymce.plugins.TabFocusPlugin",{init:function(f,g){function e(i,j){if(j.keyCode===9){return a.cancel(j)}}function h(l,p){var j,m,o,n,k;function q(t){n=c.select(":input:enabled,*[tabindex]:not(iframe)");function s(v){return v.nodeName==="BODY"||(v.type!="hidden"&&!(v.style.display=="none")&&!(v.style.visibility=="hidden")&&s(v.parentNode))}function i(v){return v.attributes.tabIndex.specified||v.nodeName=="INPUT"||v.nodeName=="TEXTAREA"}function u(){return tinymce.isIE6||tinymce.isIE7}function r(v){return((!u()||i(v)))&&v.getAttribute("tabindex")!="-1"&&s(v)}d(n,function(w,v){if(w.id==l.id){j=v;return false}});if(t>0){for(m=j+1;m=0;m--){if(r(n[m])){return n[m]}}}return null}if(p.keyCode===9){k=b(l.getParam("tab_focus",l.getParam("tabfocus_elements",":prev,:next")));if(k.length==1){k[1]=k[0];k[0]=":prev"}if(p.shiftKey){if(k[0]==":prev"){n=q(-1)}else{n=c.get(k[0])}}else{if(k[1]==":next"){n=q(1)}else{n=c.get(k[1])}}if(n){if(n.id&&(l=tinymce.get(n.id||n.name))){l.focus()}else{window.setTimeout(function(){if(!tinymce.isWebKit){window.focus()}n.focus()},10)}return a.cancel(p)}}}f.onKeyUp.add(e);if(tinymce.isGecko){f.onKeyPress.add(h);f.onKeyDown.add(e)}else{f.onKeyDown.add(h)}},getInfo:function(){return{longname:"Tabfocus",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("tabfocus",tinymce.plugins.TabFocusPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js
new file mode 100644
index 0000000..94f4532
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/tabfocus/editor_plugin_src.js
@@ -0,0 +1,122 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var DOM = tinymce.DOM, Event = tinymce.dom.Event, each = tinymce.each, explode = tinymce.explode;
+
+ tinymce.create('tinymce.plugins.TabFocusPlugin', {
+ init : function(ed, url) {
+ function tabCancel(ed, e) {
+ if (e.keyCode === 9)
+ return Event.cancel(e);
+ }
+
+ function tabHandler(ed, e) {
+ var x, i, f, el, v;
+
+ function find(d) {
+ el = DOM.select(':input:enabled,*[tabindex]:not(iframe)');
+
+ function canSelectRecursive(e) {
+ return e.nodeName==="BODY" || (e.type != 'hidden' &&
+ !(e.style.display == "none") &&
+ !(e.style.visibility == "hidden") && canSelectRecursive(e.parentNode));
+ }
+ function canSelectInOldIe(el) {
+ return el.attributes["tabIndex"].specified || el.nodeName == "INPUT" || el.nodeName == "TEXTAREA";
+ }
+ function isOldIe() {
+ return tinymce.isIE6 || tinymce.isIE7;
+ }
+ function canSelect(el) {
+ return ((!isOldIe() || canSelectInOldIe(el))) && el.getAttribute("tabindex") != '-1' && canSelectRecursive(el);
+ }
+
+ each(el, function(e, i) {
+ if (e.id == ed.id) {
+ x = i;
+ return false;
+ }
+ });
+ if (d > 0) {
+ for (i = x + 1; i < el.length; i++) {
+ if (canSelect(el[i]))
+ return el[i];
+ }
+ } else {
+ for (i = x - 1; i >= 0; i--) {
+ if (canSelect(el[i]))
+ return el[i];
+ }
+ }
+
+ return null;
+ }
+
+ if (e.keyCode === 9) {
+ v = explode(ed.getParam('tab_focus', ed.getParam('tabfocus_elements', ':prev,:next')));
+
+ if (v.length == 1) {
+ v[1] = v[0];
+ v[0] = ':prev';
+ }
+
+ // Find element to focus
+ if (e.shiftKey) {
+ if (v[0] == ':prev')
+ el = find(-1);
+ else
+ el = DOM.get(v[0]);
+ } else {
+ if (v[1] == ':next')
+ el = find(1);
+ else
+ el = DOM.get(v[1]);
+ }
+
+ if (el) {
+ if (el.id && (ed = tinymce.get(el.id || el.name)))
+ ed.focus();
+ else
+ window.setTimeout(function() {
+ if (!tinymce.isWebKit)
+ window.focus();
+ el.focus();
+ }, 10);
+
+ return Event.cancel(e);
+ }
+ }
+ }
+
+ ed.onKeyUp.add(tabCancel);
+
+ if (tinymce.isGecko) {
+ ed.onKeyPress.add(tabHandler);
+ ed.onKeyDown.add(tabCancel);
+ } else
+ ed.onKeyDown.add(tabHandler);
+
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Tabfocus',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/tabfocus',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('tabfocus', tinymce.plugins.TabFocusPlugin);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/cell.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/cell.htm
new file mode 100644
index 0000000..a72a8d6
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/cell.htm
@@ -0,0 +1,180 @@
+
+
+
+ {#table_dlg.cell_title}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css
new file mode 100644
index 0000000..a067ecd
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/cell.css
@@ -0,0 +1,17 @@
+/* CSS file for cell dialog in the table plugin */
+
+.panel_wrapper div.current {
+ height: 200px;
+}
+
+.advfield {
+ width: 200px;
+}
+
+#action {
+ margin-bottom: 3px;
+}
+
+#class {
+ width: 150px;
+}
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/row.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/row.css
new file mode 100644
index 0000000..1f7755d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/row.css
@@ -0,0 +1,25 @@
+/* CSS file for row dialog in the table plugin */
+
+.panel_wrapper div.current {
+ height: 200px;
+}
+
+.advfield {
+ width: 200px;
+}
+
+#action {
+ margin-bottom: 3px;
+}
+
+#rowtype,#align,#valign,#class,#height {
+ width: 150px;
+}
+
+#height {
+ width: 50px;
+}
+
+.col2 {
+ padding-left: 20px;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/table.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/table.css
new file mode 100644
index 0000000..d11c3f6
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/css/table.css
@@ -0,0 +1,13 @@
+/* CSS file for table dialog in the table plugin */
+
+.panel_wrapper div.current {
+ height: 245px;
+}
+
+.advfield {
+ width: 200px;
+}
+
+#class {
+ width: 150px;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js
new file mode 100644
index 0000000..4a35a5e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin.js
@@ -0,0 +1 @@
+(function(d){var e=d.each;function c(g,h){var j=h.ownerDocument,f=j.createRange(),k;f.setStartBefore(h);f.setEnd(g.endContainer,g.endOffset);k=j.createElement("body");k.appendChild(f.cloneContents());return k.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi,"-").replace(/<[^>]+>/g,"").length==0}function a(g,f){return parseInt(g.getAttribute(f)||1)}function b(H,G,K){var g,L,D,o;t();o=G.getParent(K.getStart(),"th,td");if(o){L=F(o);D=I();o=z(L.x,L.y)}function A(N,M){N=N.cloneNode(M);N.removeAttribute("id");return N}function t(){var M=0;g=[];e(["thead","tbody","tfoot"],function(N){var O=G.select("> "+N+" tr",H);e(O,function(P,Q){Q+=M;e(G.select("> td, > th",P),function(W,R){var S,T,U,V;if(g[Q]){while(g[Q][R]){R++}}U=a(W,"rowspan");V=a(W,"colspan");for(T=Q;T'}return false}},"childNodes");M=A(M,false);s(M,"rowSpan",1);s(M,"colSpan",1);if(N){M.appendChild(N)}else{if(!d.isIE){M.innerHTML='
'}}return M}function q(){var M=G.createRng();e(G.select("tr",H),function(N){if(N.cells.length==0){G.remove(N)}});if(G.select("tr",H).length==0){M.setStartAfter(H);M.setEndAfter(H);K.setRng(M);G.remove(H);return}e(G.select("thead,tbody,tfoot",H),function(N){if(N.rows.length==0){G.remove(N)}});t();row=g[Math.min(g.length-1,L.y)];if(row){K.select(row[Math.min(row.length-1,L.x)].elm,true);K.collapse(true)}}function u(S,Q,U,R){var P,N,M,O,T;P=g[Q][S].elm.parentNode;for(M=1;M<=U;M++){P=G.getNext(P,"tr");if(P){for(N=S;N>=0;N--){T=g[Q+M][N].elm;if(T.parentNode==P){for(O=1;O<=R;O++){G.insertAfter(f(T),T)}break}}if(N==-1){for(O=1;O<=R;O++){P.insertBefore(f(P.cells[0]),P.cells[0])}}}}}function C(){e(g,function(M,N){e(M,function(P,O){var S,R,T,Q;if(j(P)){P=P.elm;S=a(P,"colspan");R=a(P,"rowspan");if(S>1||R>1){s(P,"rowSpan",1);s(P,"colSpan",1);for(Q=0;Q1){s(S,"rowSpan",O+1);continue}}else{if(M>0&&g[M-1][R]){V=g[M-1][R].elm;O=a(V,"rowSpan");if(O>1){s(V,"rowSpan",O+1);continue}}}N=f(S);s(N,"colSpan",S.colSpan);U.appendChild(N);P=S}}if(U.hasChildNodes()){if(!Q){G.insertAfter(U,T)}else{T.parentNode.insertBefore(U,T)}}}function h(N){var O,M;e(g,function(P,Q){e(P,function(S,R){if(j(S)){O=R;if(N){return false}}});if(N){return !O}});e(g,function(S,T){var P,Q,R;if(!S[O]){return}P=S[O].elm;if(P!=M){R=a(P,"colspan");Q=a(P,"rowspan");if(R==1){if(!N){G.insertAfter(f(P),P);u(O,T,Q-1,R)}else{P.parentNode.insertBefore(f(P),P);u(O,T,Q-1,R)}}else{s(P,"colSpan",P.colSpan+1)}M=P}})}function n(){var M=[];e(g,function(N,O){e(N,function(Q,P){if(j(Q)&&d.inArray(M,P)===-1){e(g,function(T){var R=T[P].elm,S;S=a(R,"colSpan");if(S>1){s(R,"colSpan",S-1)}else{G.remove(R)}});M.push(P)}})});q()}function m(){var N;function M(Q){var P,R,O;P=G.getNext(Q,"tr");e(Q.cells,function(S){var T=a(S,"rowSpan");if(T>1){s(S,"rowSpan",T-1);R=F(S);u(R.x,R.y,1,1)}});R=F(Q.cells[0]);e(g[R.y],function(S){var T;S=S.elm;if(S!=O){T=a(S,"rowSpan");if(T<=1){G.remove(S)}else{s(S,"rowSpan",T-1)}O=S}})}N=k();e(N.reverse(),function(O){M(O)});q()}function E(){var M=k();G.remove(M);q();return M}function J(){var M=k();e(M,function(O,N){M[N]=A(O,true)});return M}function B(O,N){if(!O){return}var P=k(),M=P[N?0:P.length-1],Q=M.cells.length;e(g,function(S){var R;Q=0;e(S,function(U,T){if(U.real){Q+=U.colspan}if(U.elm.parentNode==M){R=1}});if(R){return false}});if(!N){O.reverse()}e(O,function(T){var S=T.cells.length,R;for(i=0;iN){N=R}if(Q>M){M=Q}if(S.real){U=S.colspan-1;T=S.rowspan-1;if(U){if(R+U>N){N=R+U}}if(T){if(Q+T>M){M=Q+T}}}}})});return{x:N,y:M}}function v(S){var P,O,U,T,N,M,Q,R;D=F(S);if(L&&D){P=Math.min(L.x,D.x);O=Math.min(L.y,D.y);U=Math.max(L.x,D.x);T=Math.max(L.y,D.y);N=U;M=T;for(y=O;y<=M;y++){S=g[y][P];if(!S.real){if(P-(S.colspan-1)N){N=x+Q}}if(R){if(y+R>M){M=y+R}}}}}G.removeClass(G.select("td.mceSelected,th.mceSelected"),"mceSelected");for(y=O;y<=M;y++){for(x=P;x<=N;x++){if(g[y][x]){G.addClass(g[y][x].elm,"mceSelected")}}}}}d.extend(this,{deleteTable:r,split:C,merge:p,insertRow:l,insertCol:h,deleteCols:n,deleteRows:m,cutRows:E,copyRows:J,pasteRows:B,getPos:F,setStartCell:w,setEndCell:v})}d.create("tinymce.plugins.TablePlugin",{init:function(g,h){var f,m,j=true;function l(p){var o=g.selection,n=g.dom.getParent(p||o.getNode(),"table");if(n){return new b(n,g.dom,o)}}function k(){g.getBody().style.webkitUserSelect="";if(j){g.dom.removeClass(g.dom.select("td.mceSelected,th.mceSelected"),"mceSelected");j=false}}e([["table","table.desc","mceInsertTable",true],["delete_table","table.del","mceTableDelete"],["delete_col","table.delete_col_desc","mceTableDeleteCol"],["delete_row","table.delete_row_desc","mceTableDeleteRow"],["col_after","table.col_after_desc","mceTableInsertColAfter"],["col_before","table.col_before_desc","mceTableInsertColBefore"],["row_after","table.row_after_desc","mceTableInsertRowAfter"],["row_before","table.row_before_desc","mceTableInsertRowBefore"],["row_props","table.row_desc","mceTableRowProps",true],["cell_props","table.cell_desc","mceTableCellProps",true],["split_cells","table.split_cells_desc","mceTableSplitCells",true],["merge_cells","table.merge_cells_desc","mceTableMergeCells",true]],function(n){g.addButton(n[0],{title:n[1],cmd:n[2],ui:n[3]})});if(!d.isIE){g.onClick.add(function(n,o){o=o.target;if(o.nodeName==="TABLE"){n.selection.select(o);n.nodeChanged()}})}g.onPreProcess.add(function(o,p){var n,q,r,t=o.dom,s;n=t.select("table",p.node);q=n.length;while(q--){r=n[q];t.setAttrib(r,"data-mce-style","");if((s=t.getAttrib(r,"width"))){t.setStyle(r,"width",s);t.setAttrib(r,"width","")}if((s=t.getAttrib(r,"height"))){t.setStyle(r,"height",s);t.setAttrib(r,"height","")}}});g.onNodeChange.add(function(q,o,s){var r;s=q.selection.getStart();r=q.dom.getParent(s,"td,th,caption");o.setActive("table",s.nodeName==="TABLE"||!!r);if(r&&r.nodeName==="CAPTION"){r=0}o.setDisabled("delete_table",!r);o.setDisabled("delete_col",!r);o.setDisabled("delete_table",!r);o.setDisabled("delete_row",!r);o.setDisabled("col_after",!r);o.setDisabled("col_before",!r);o.setDisabled("row_after",!r);o.setDisabled("row_before",!r);o.setDisabled("row_props",!r);o.setDisabled("cell_props",!r);o.setDisabled("split_cells",!r);o.setDisabled("merge_cells",!r)});g.onInit.add(function(r){var p,t,q=r.dom,u;f=r.windowManager;r.onMouseDown.add(function(w,z){if(z.button!=2){k();t=q.getParent(z.target,"td,th");p=q.getParent(t,"table")}});q.bind(r.getDoc(),"mouseover",function(C){var A,z,B=C.target;if(t&&(u||B!=t)&&(B.nodeName=="TD"||B.nodeName=="TH")){z=q.getParent(B,"table");if(z==p){if(!u){u=l(z);u.setStartCell(t);r.getBody().style.webkitUserSelect="none"}u.setEndCell(B);j=true}A=r.selection.getSel();try{if(A.removeAllRanges){A.removeAllRanges()}else{A.empty()}}catch(w){}C.preventDefault()}});r.onMouseUp.add(function(F,G){var z,B=F.selection,H,I=B.getSel(),w,C,A,E;if(t){if(u){F.getBody().style.webkitUserSelect=""}function D(J,L){var K=new d.dom.TreeWalker(J,J);do{if(J.nodeType==3&&d.trim(J.nodeValue).length!=0){if(L){z.setStart(J,0)}else{z.setEnd(J,J.nodeValue.length)}return}if(J.nodeName=="BR"){if(L){z.setStartBefore(J)}else{z.setEndBefore(J)}return}}while(J=(L?K.next():K.prev()))}H=q.select("td.mceSelected,th.mceSelected");if(H.length>0){z=q.createRng();C=H[0];E=H[H.length-1];z.setStartBefore(C);z.setEndAfter(C);D(C,1);w=new d.dom.TreeWalker(C,q.getParent(H[0],"table"));do{if(C.nodeName=="TD"||C.nodeName=="TH"){if(!q.hasClass(C,"mceSelected")){break}A=C}}while(C=w.next());D(A);B.setRng(z)}F.nodeChanged();t=u=p=null}});r.onKeyUp.add(function(w,z){k()});r.onKeyDown.add(function(w,z){n(w)});r.onMouseDown.add(function(w,z){if(z.button!=2){n(w)}});function o(D,z,A,F){var B=3,G=D.dom.getParent(z.startContainer,"TABLE"),C,w,E;if(G){C=G.parentNode}w=z.startContainer.nodeType==B&&z.startOffset==0&&z.endOffset==0&&F&&(A.nodeName=="TR"||A==C);E=(A.nodeName=="TD"||A.nodeName=="TH")&&!F;return w||E}function n(A){if(!d.isWebKit){return}var z=A.selection.getRng();var C=A.selection.getNode();var B=A.dom.getParent(z.startContainer,"TD,TH");if(!o(A,z,C,B)){return}if(!B){B=C}var w=B.lastChild;while(w.lastChild){w=w.lastChild}z.setEnd(w,w.nodeValue.length);A.selection.setRng(z)}r.plugins.table.fixTableCellSelection=n;if(r&&r.plugins.contextmenu){r.plugins.contextmenu.onContextMenu.add(function(A,w,C){var D,B=r.selection,z=B.getNode()||r.getBody();if(r.dom.getParent(C,"td")||r.dom.getParent(C,"th")||r.dom.select("td.mceSelected,th.mceSelected").length){w.removeAll();if(z.nodeName=="A"&&!r.dom.getAttrib(z,"name")){w.add({title:"advanced.link_desc",icon:"link",cmd:r.plugins.advlink?"mceAdvLink":"mceLink",ui:true});w.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"});w.addSeparator()}if(z.nodeName=="IMG"&&z.className.indexOf("mceItem")==-1){w.add({title:"advanced.image_desc",icon:"image",cmd:r.plugins.advimage?"mceAdvImage":"mceImage",ui:true});w.addSeparator()}w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable",value:{action:"insert"}});w.add({title:"table.props_desc",icon:"table_props",cmd:"mceInsertTable"});w.add({title:"table.del",icon:"delete_table",cmd:"mceTableDelete"});w.addSeparator();D=w.addMenu({title:"table.cell"});D.add({title:"table.cell_desc",icon:"cell_props",cmd:"mceTableCellProps"});D.add({title:"table.split_cells_desc",icon:"split_cells",cmd:"mceTableSplitCells"});D.add({title:"table.merge_cells_desc",icon:"merge_cells",cmd:"mceTableMergeCells"});D=w.addMenu({title:"table.row"});D.add({title:"table.row_desc",icon:"row_props",cmd:"mceTableRowProps"});D.add({title:"table.row_before_desc",icon:"row_before",cmd:"mceTableInsertRowBefore"});D.add({title:"table.row_after_desc",icon:"row_after",cmd:"mceTableInsertRowAfter"});D.add({title:"table.delete_row_desc",icon:"delete_row",cmd:"mceTableDeleteRow"});D.addSeparator();D.add({title:"table.cut_row_desc",icon:"cut",cmd:"mceTableCutRow"});D.add({title:"table.copy_row_desc",icon:"copy",cmd:"mceTableCopyRow"});D.add({title:"table.paste_row_before_desc",icon:"paste",cmd:"mceTablePasteRowBefore"}).setDisabled(!m);D.add({title:"table.paste_row_after_desc",icon:"paste",cmd:"mceTablePasteRowAfter"}).setDisabled(!m);D=w.addMenu({title:"table.col"});D.add({title:"table.col_before_desc",icon:"col_before",cmd:"mceTableInsertColBefore"});D.add({title:"table.col_after_desc",icon:"col_after",cmd:"mceTableInsertColAfter"});D.add({title:"table.delete_col_desc",icon:"delete_col",cmd:"mceTableDeleteCol"})}else{w.add({title:"table.desc",icon:"table",cmd:"mceInsertTable"})}})}if(d.isWebKit){function v(C,N){var L=d.VK;var Q=N.keyCode;function O(Y,U,S){var T=Y?"previousSibling":"nextSibling";var Z=C.dom.getParent(U,"tr");var X=Z[T];if(X){z(C,U,X,Y);d.dom.Event.cancel(S);return true}else{var aa=C.dom.getParent(Z,"table");var W=Z.parentNode;var R=W.nodeName.toLowerCase();if(R==="tbody"||R===(Y?"tfoot":"thead")){var V=w(Y,aa,W,"tbody");if(V!==null){return K(Y,V,U,S)}}return M(Y,Z,T,aa,S)}}function w(V,T,U,X){var S=C.dom.select(">"+X,T);var R=S.indexOf(U);if(V&&R===0||!V&&R===S.length-1){return B(V,T)}else{if(R===-1){var W=U.tagName.toLowerCase()==="thead"?0:S.length-1;return S[W]}else{return S[R+(V?-1:1)]}}}function B(U,T){var S=U?"thead":"tfoot";var R=C.dom.select(">"+S,T);return R.length!==0?R[0]:null}function K(V,T,S,U){var R=J(T,V);R&&z(C,S,R,V);d.dom.Event.cancel(U);return true}function M(Y,U,R,X,W){var S=X[R];if(S){F(S);return true}else{var V=C.dom.getParent(X,"td,th");if(V){return O(Y,V,W)}else{var T=J(U,!Y);F(T);return d.dom.Event.cancel(W)}}}function J(S,R){var T=S&&S[R?"lastChild":"firstChild"];return T&&T.nodeName==="BR"?C.dom.getParent(T,"td,th"):T}function F(R){C.selection.setCursorLocation(R,0)}function A(){return Q==L.UP||Q==L.DOWN}function D(R){var T=R.selection.getNode();var S=R.dom.getParent(T,"tr");return S!==null}function P(S){var R=0;var T=S;while(T.previousSibling){T=T.previousSibling;R=R+a(T,"colspan")}return R}function E(T,R){var U=0;var S=0;e(T.children,function(V,W){U=U+a(V,"colspan");S=W;if(U>R){return false}});return S}function z(T,W,Y,V){var X=P(T.dom.getParent(W,"td,th"));var S=E(Y,X);var R=Y.childNodes[S];var U=J(R,V);F(U||R)}function H(R){var T=C.selection.getNode();var U=C.dom.getParent(T,"td,th");var S=C.dom.getParent(R,"td,th");return U&&U!==S&&I(U,S)}function I(S,R){return C.dom.getParent(S,"TABLE")===C.dom.getParent(R,"TABLE")}if(A()&&D(C)){var G=C.selection.getNode();setTimeout(function(){if(H(G)){O(!N.shiftKey&&Q===L.UP,G,N)}},0)}}r.onKeyDown.add(v)}function s(){var w;for(w=r.getBody().lastChild;w&&w.nodeType==3&&!w.nodeValue.length;w=w.previousSibling){}if(w&&w.nodeName=="TABLE"){if(r.settings.forced_root_block){r.dom.add(r.getBody(),r.settings.forced_root_block,null,d.isIE?" ":'
')}else{r.dom.add(r.getBody(),"br",{"data-mce-bogus":"1"})}}}if(d.isGecko){r.onKeyDown.add(function(z,B){var w,A,C=z.dom;if(B.keyCode==37||B.keyCode==38){w=z.selection.getRng();A=C.getParent(w.startContainer,"table");if(A&&z.getBody().firstChild==A){if(c(w,A)){w=C.createRng();w.setStartBefore(A);w.setEndBefore(A);z.selection.setRng(w);B.preventDefault()}}}})}r.onKeyUp.add(s);r.onSetContent.add(s);r.onVisualAid.add(s);r.onPreProcess.add(function(w,A){var z=A.node.lastChild;if(z&&(z.nodeName=="BR"||(z.childNodes.length==1&&(z.firstChild.nodeName=="BR"||z.firstChild.nodeValue=="\u00a0")))&&z.previousSibling&&z.previousSibling.nodeName=="TABLE"){w.dom.remove(z)}});s();r.startContent=r.getContent({format:"raw"})});e({mceTableSplitCells:function(n){n.split()},mceTableMergeCells:function(o){var p,q,n;n=g.dom.getParent(g.selection.getNode(),"th,td");if(n){p=n.rowSpan;q=n.colSpan}if(!g.dom.select("td.mceSelected,th.mceSelected").length){f.open({url:h+"/merge_cells.htm",width:240+parseInt(g.getLang("table.merge_cells_delta_width",0)),height:110+parseInt(g.getLang("table.merge_cells_delta_height",0)),inline:1},{rows:p,cols:q,onaction:function(r){o.merge(n,r.cols,r.rows)},plugin_url:h})}else{o.merge()}},mceTableInsertRowBefore:function(n){n.insertRow(true)},mceTableInsertRowAfter:function(n){n.insertRow()},mceTableInsertColBefore:function(n){n.insertCol(true)},mceTableInsertColAfter:function(n){n.insertCol()},mceTableDeleteCol:function(n){n.deleteCols()},mceTableDeleteRow:function(n){n.deleteRows()},mceTableCutRow:function(n){m=n.cutRows()},mceTableCopyRow:function(n){m=n.copyRows()},mceTablePasteRowBefore:function(n){n.pasteRows(m,true)},mceTablePasteRowAfter:function(n){n.pasteRows(m)},mceTableDelete:function(n){n.deleteTable()}},function(o,n){g.addCommand(n,function(){var p=l();if(p){o(p);g.execCommand("mceRepaint");k()}})});e({mceInsertTable:function(n){f.open({url:h+"/table.htm",width:400+parseInt(g.getLang("table.table_delta_width",0)),height:320+parseInt(g.getLang("table.table_delta_height",0)),inline:1},{plugin_url:h,action:n?n.action:0})},mceTableRowProps:function(){f.open({url:h+"/row.htm",width:400+parseInt(g.getLang("table.rowprops_delta_width",0)),height:295+parseInt(g.getLang("table.rowprops_delta_height",0)),inline:1},{plugin_url:h})},mceTableCellProps:function(){f.open({url:h+"/cell.htm",width:400+parseInt(g.getLang("table.cellprops_delta_width",0)),height:295+parseInt(g.getLang("table.cellprops_delta_height",0)),inline:1},{plugin_url:h})}},function(o,n){g.addCommand(n,function(p,q){o(q)})})}});d.PluginManager.add("table",d.plugins.TablePlugin)})(tinymce);
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js
new file mode 100644
index 0000000..532b79c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/editor_plugin_src.js
@@ -0,0 +1,1456 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function(tinymce) {
+ var each = tinymce.each;
+
+ // Checks if the selection/caret is at the start of the specified block element
+ function isAtStart(rng, par) {
+ var doc = par.ownerDocument, rng2 = doc.createRange(), elm;
+
+ rng2.setStartBefore(par);
+ rng2.setEnd(rng.endContainer, rng.endOffset);
+
+ elm = doc.createElement('body');
+ elm.appendChild(rng2.cloneContents());
+
+ // Check for text characters of other elements that should be treated as content
+ return elm.innerHTML.replace(/<(br|img|object|embed|input|textarea)[^>]*>/gi, '-').replace(/<[^>]+>/g, '').length == 0;
+ };
+
+ function getSpanVal(td, name) {
+ return parseInt(td.getAttribute(name) || 1);
+ }
+
+ /**
+ * Table Grid class.
+ */
+ function TableGrid(table, dom, selection) {
+ var grid, startPos, endPos, selectedCell;
+
+ buildGrid();
+ selectedCell = dom.getParent(selection.getStart(), 'th,td');
+ if (selectedCell) {
+ startPos = getPos(selectedCell);
+ endPos = findEndPos();
+ selectedCell = getCell(startPos.x, startPos.y);
+ }
+
+ function cloneNode(node, children) {
+ node = node.cloneNode(children);
+ node.removeAttribute('id');
+
+ return node;
+ }
+
+ function buildGrid() {
+ var startY = 0;
+
+ grid = [];
+
+ each(['thead', 'tbody', 'tfoot'], function(part) {
+ var rows = dom.select('> ' + part + ' tr', table);
+
+ each(rows, function(tr, y) {
+ y += startY;
+
+ each(dom.select('> td, > th', tr), function(td, x) {
+ var x2, y2, rowspan, colspan;
+
+ // Skip over existing cells produced by rowspan
+ if (grid[y]) {
+ while (grid[y][x])
+ x++;
+ }
+
+ // Get col/rowspan from cell
+ rowspan = getSpanVal(td, 'rowspan');
+ colspan = getSpanVal(td, 'colspan');
+
+ // Fill out rowspan/colspan right and down
+ for (y2 = y; y2 < y + rowspan; y2++) {
+ if (!grid[y2])
+ grid[y2] = [];
+
+ for (x2 = x; x2 < x + colspan; x2++) {
+ grid[y2][x2] = {
+ part : part,
+ real : y2 == y && x2 == x,
+ elm : td,
+ rowspan : rowspan,
+ colspan : colspan
+ };
+ }
+ }
+ });
+ });
+
+ startY += rows.length;
+ });
+ };
+
+ function getCell(x, y) {
+ var row;
+
+ row = grid[y];
+ if (row)
+ return row[x];
+ };
+
+ function setSpanVal(td, name, val) {
+ if (td) {
+ val = parseInt(val);
+
+ if (val === 1)
+ td.removeAttribute(name, 1);
+ else
+ td.setAttribute(name, val, 1);
+ }
+ }
+
+ function isCellSelected(cell) {
+ return cell && (dom.hasClass(cell.elm, 'mceSelected') || cell == selectedCell);
+ };
+
+ function getSelectedRows() {
+ var rows = [];
+
+ each(table.rows, function(row) {
+ each(row.cells, function(cell) {
+ if (dom.hasClass(cell, 'mceSelected') || cell == selectedCell.elm) {
+ rows.push(row);
+ return false;
+ }
+ });
+ });
+
+ return rows;
+ };
+
+ function deleteTable() {
+ var rng = dom.createRng();
+
+ rng.setStartAfter(table);
+ rng.setEndAfter(table);
+
+ selection.setRng(rng);
+
+ dom.remove(table);
+ };
+
+ function cloneCell(cell) {
+ var formatNode;
+
+ // Clone formats
+ tinymce.walk(cell, function(node) {
+ var curNode;
+
+ if (node.nodeType == 3) {
+ each(dom.getParents(node.parentNode, null, cell).reverse(), function(node) {
+ node = cloneNode(node, false);
+
+ if (!formatNode)
+ formatNode = curNode = node;
+ else if (curNode)
+ curNode.appendChild(node);
+
+ curNode = node;
+ });
+
+ // Add something to the inner node
+ if (curNode)
+ curNode.innerHTML = tinymce.isIE ? ' ' : '
';
+
+ return false;
+ }
+ }, 'childNodes');
+
+ cell = cloneNode(cell, false);
+ setSpanVal(cell, 'rowSpan', 1);
+ setSpanVal(cell, 'colSpan', 1);
+
+ if (formatNode) {
+ cell.appendChild(formatNode);
+ } else {
+ if (!tinymce.isIE)
+ cell.innerHTML = '
';
+ }
+
+ return cell;
+ };
+
+ function cleanup() {
+ var rng = dom.createRng();
+
+ // Empty rows
+ each(dom.select('tr', table), function(tr) {
+ if (tr.cells.length == 0)
+ dom.remove(tr);
+ });
+
+ // Empty table
+ if (dom.select('tr', table).length == 0) {
+ rng.setStartAfter(table);
+ rng.setEndAfter(table);
+ selection.setRng(rng);
+ dom.remove(table);
+ return;
+ }
+
+ // Empty header/body/footer
+ each(dom.select('thead,tbody,tfoot', table), function(part) {
+ if (part.rows.length == 0)
+ dom.remove(part);
+ });
+
+ // Restore selection to start position if it still exists
+ buildGrid();
+
+ // Restore the selection to the closest table position
+ row = grid[Math.min(grid.length - 1, startPos.y)];
+ if (row) {
+ selection.select(row[Math.min(row.length - 1, startPos.x)].elm, true);
+ selection.collapse(true);
+ }
+ };
+
+ function fillLeftDown(x, y, rows, cols) {
+ var tr, x2, r, c, cell;
+
+ tr = grid[y][x].elm.parentNode;
+ for (r = 1; r <= rows; r++) {
+ tr = dom.getNext(tr, 'tr');
+
+ if (tr) {
+ // Loop left to find real cell
+ for (x2 = x; x2 >= 0; x2--) {
+ cell = grid[y + r][x2].elm;
+
+ if (cell.parentNode == tr) {
+ // Append clones after
+ for (c = 1; c <= cols; c++)
+ dom.insertAfter(cloneCell(cell), cell);
+
+ break;
+ }
+ }
+
+ if (x2 == -1) {
+ // Insert nodes before first cell
+ for (c = 1; c <= cols; c++)
+ tr.insertBefore(cloneCell(tr.cells[0]), tr.cells[0]);
+ }
+ }
+ }
+ };
+
+ function split() {
+ each(grid, function(row, y) {
+ each(row, function(cell, x) {
+ var colSpan, rowSpan, newCell, i;
+
+ if (isCellSelected(cell)) {
+ cell = cell.elm;
+ colSpan = getSpanVal(cell, 'colspan');
+ rowSpan = getSpanVal(cell, 'rowspan');
+
+ if (colSpan > 1 || rowSpan > 1) {
+ setSpanVal(cell, 'rowSpan', 1);
+ setSpanVal(cell, 'colSpan', 1);
+
+ // Insert cells right
+ for (i = 0; i < colSpan - 1; i++)
+ dom.insertAfter(cloneCell(cell), cell);
+
+ fillLeftDown(x, y, rowSpan - 1, colSpan);
+ }
+ }
+ });
+ });
+ };
+
+ function merge(cell, cols, rows) {
+ var startX, startY, endX, endY, x, y, startCell, endCell, cell, children, count;
+
+ // Use specified cell and cols/rows
+ if (cell) {
+ pos = getPos(cell);
+ startX = pos.x;
+ startY = pos.y;
+ endX = startX + (cols - 1);
+ endY = startY + (rows - 1);
+ } else {
+ startPos = endPos = null;
+
+ // Calculate start/end pos by checking for selected cells in grid works better with context menu
+ each(grid, function(row, y) {
+ each(row, function(cell, x) {
+ if (isCellSelected(cell)) {
+ if (!startPos) {
+ startPos = {x: x, y: y};
+ }
+
+ endPos = {x: x, y: y};
+ }
+ });
+ });
+
+ // Use selection
+ startX = startPos.x;
+ startY = startPos.y;
+ endX = endPos.x;
+ endY = endPos.y;
+ }
+
+ // Find start/end cells
+ startCell = getCell(startX, startY);
+ endCell = getCell(endX, endY);
+
+ // Check if the cells exists and if they are of the same part for example tbody = tbody
+ if (startCell && endCell && startCell.part == endCell.part) {
+ // Split and rebuild grid
+ split();
+ buildGrid();
+
+ // Set row/col span to start cell
+ startCell = getCell(startX, startY).elm;
+ setSpanVal(startCell, 'colSpan', (endX - startX) + 1);
+ setSpanVal(startCell, 'rowSpan', (endY - startY) + 1);
+
+ // Remove other cells and add it's contents to the start cell
+ for (y = startY; y <= endY; y++) {
+ for (x = startX; x <= endX; x++) {
+ if (!grid[y] || !grid[y][x])
+ continue;
+
+ cell = grid[y][x].elm;
+
+ if (cell != startCell) {
+ // Move children to startCell
+ children = tinymce.grep(cell.childNodes);
+ each(children, function(node) {
+ startCell.appendChild(node);
+ });
+
+ // Remove bogus nodes if there is children in the target cell
+ if (children.length) {
+ children = tinymce.grep(startCell.childNodes);
+ count = 0;
+ each(children, function(node) {
+ if (node.nodeName == 'BR' && dom.getAttrib(node, 'data-mce-bogus') && count++ < children.length - 1)
+ startCell.removeChild(node);
+ });
+ }
+
+ // Remove cell
+ dom.remove(cell);
+ }
+ }
+ }
+
+ // Remove empty rows etc and restore caret location
+ cleanup();
+ }
+ };
+
+ function insertRow(before) {
+ var posY, cell, lastCell, x, rowElm, newRow, newCell, otherCell, rowSpan;
+
+ // Find first/last row
+ each(grid, function(row, y) {
+ each(row, function(cell, x) {
+ if (isCellSelected(cell)) {
+ cell = cell.elm;
+ rowElm = cell.parentNode;
+ newRow = cloneNode(rowElm, false);
+ posY = y;
+
+ if (before)
+ return false;
+ }
+ });
+
+ if (before)
+ return !posY;
+ });
+
+ for (x = 0; x < grid[0].length; x++) {
+ // Cell not found could be because of an invalid table structure
+ if (!grid[posY][x])
+ continue;
+
+ cell = grid[posY][x].elm;
+
+ if (cell != lastCell) {
+ if (!before) {
+ rowSpan = getSpanVal(cell, 'rowspan');
+ if (rowSpan > 1) {
+ setSpanVal(cell, 'rowSpan', rowSpan + 1);
+ continue;
+ }
+ } else {
+ // Check if cell above can be expanded
+ if (posY > 0 && grid[posY - 1][x]) {
+ otherCell = grid[posY - 1][x].elm;
+ rowSpan = getSpanVal(otherCell, 'rowSpan');
+ if (rowSpan > 1) {
+ setSpanVal(otherCell, 'rowSpan', rowSpan + 1);
+ continue;
+ }
+ }
+ }
+
+ // Insert new cell into new row
+ newCell = cloneCell(cell);
+ setSpanVal(newCell, 'colSpan', cell.colSpan);
+
+ newRow.appendChild(newCell);
+
+ lastCell = cell;
+ }
+ }
+
+ if (newRow.hasChildNodes()) {
+ if (!before)
+ dom.insertAfter(newRow, rowElm);
+ else
+ rowElm.parentNode.insertBefore(newRow, rowElm);
+ }
+ };
+
+ function insertCol(before) {
+ var posX, lastCell;
+
+ // Find first/last column
+ each(grid, function(row, y) {
+ each(row, function(cell, x) {
+ if (isCellSelected(cell)) {
+ posX = x;
+
+ if (before)
+ return false;
+ }
+ });
+
+ if (before)
+ return !posX;
+ });
+
+ each(grid, function(row, y) {
+ var cell, rowSpan, colSpan;
+
+ if (!row[posX])
+ return;
+
+ cell = row[posX].elm;
+ if (cell != lastCell) {
+ colSpan = getSpanVal(cell, 'colspan');
+ rowSpan = getSpanVal(cell, 'rowspan');
+
+ if (colSpan == 1) {
+ if (!before) {
+ dom.insertAfter(cloneCell(cell), cell);
+ fillLeftDown(posX, y, rowSpan - 1, colSpan);
+ } else {
+ cell.parentNode.insertBefore(cloneCell(cell), cell);
+ fillLeftDown(posX, y, rowSpan - 1, colSpan);
+ }
+ } else
+ setSpanVal(cell, 'colSpan', cell.colSpan + 1);
+
+ lastCell = cell;
+ }
+ });
+ };
+
+ function deleteCols() {
+ var cols = [];
+
+ // Get selected column indexes
+ each(grid, function(row, y) {
+ each(row, function(cell, x) {
+ if (isCellSelected(cell) && tinymce.inArray(cols, x) === -1) {
+ each(grid, function(row) {
+ var cell = row[x].elm, colSpan;
+
+ colSpan = getSpanVal(cell, 'colSpan');
+
+ if (colSpan > 1)
+ setSpanVal(cell, 'colSpan', colSpan - 1);
+ else
+ dom.remove(cell);
+ });
+
+ cols.push(x);
+ }
+ });
+ });
+
+ cleanup();
+ };
+
+ function deleteRows() {
+ var rows;
+
+ function deleteRow(tr) {
+ var nextTr, pos, lastCell;
+
+ nextTr = dom.getNext(tr, 'tr');
+
+ // Move down row spanned cells
+ each(tr.cells, function(cell) {
+ var rowSpan = getSpanVal(cell, 'rowSpan');
+
+ if (rowSpan > 1) {
+ setSpanVal(cell, 'rowSpan', rowSpan - 1);
+ pos = getPos(cell);
+ fillLeftDown(pos.x, pos.y, 1, 1);
+ }
+ });
+
+ // Delete cells
+ pos = getPos(tr.cells[0]);
+ each(grid[pos.y], function(cell) {
+ var rowSpan;
+
+ cell = cell.elm;
+
+ if (cell != lastCell) {
+ rowSpan = getSpanVal(cell, 'rowSpan');
+
+ if (rowSpan <= 1)
+ dom.remove(cell);
+ else
+ setSpanVal(cell, 'rowSpan', rowSpan - 1);
+
+ lastCell = cell;
+ }
+ });
+ };
+
+ // Get selected rows and move selection out of scope
+ rows = getSelectedRows();
+
+ // Delete all selected rows
+ each(rows.reverse(), function(tr) {
+ deleteRow(tr);
+ });
+
+ cleanup();
+ };
+
+ function cutRows() {
+ var rows = getSelectedRows();
+
+ dom.remove(rows);
+ cleanup();
+
+ return rows;
+ };
+
+ function copyRows() {
+ var rows = getSelectedRows();
+
+ each(rows, function(row, i) {
+ rows[i] = cloneNode(row, true);
+ });
+
+ return rows;
+ };
+
+ function pasteRows(rows, before) {
+ // If we don't have any rows in the clipboard, return immediately
+ if(!rows)
+ return;
+
+ var selectedRows = getSelectedRows(),
+ targetRow = selectedRows[before ? 0 : selectedRows.length - 1],
+ targetCellCount = targetRow.cells.length;
+
+ // Calc target cell count
+ each(grid, function(row) {
+ var match;
+
+ targetCellCount = 0;
+ each(row, function(cell, x) {
+ if (cell.real)
+ targetCellCount += cell.colspan;
+
+ if (cell.elm.parentNode == targetRow)
+ match = 1;
+ });
+
+ if (match)
+ return false;
+ });
+
+ if (!before)
+ rows.reverse();
+
+ each(rows, function(row) {
+ var cellCount = row.cells.length, cell;
+
+ // Remove col/rowspans
+ for (i = 0; i < cellCount; i++) {
+ cell = row.cells[i];
+ setSpanVal(cell, 'colSpan', 1);
+ setSpanVal(cell, 'rowSpan', 1);
+ }
+
+ // Needs more cells
+ for (i = cellCount; i < targetCellCount; i++)
+ row.appendChild(cloneCell(row.cells[cellCount - 1]));
+
+ // Needs less cells
+ for (i = targetCellCount; i < cellCount; i++)
+ dom.remove(row.cells[i]);
+
+ // Add before/after
+ if (before)
+ targetRow.parentNode.insertBefore(row, targetRow);
+ else
+ dom.insertAfter(row, targetRow);
+ });
+
+ // Remove current selection
+ dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
+ };
+
+ function getPos(target) {
+ var pos;
+
+ each(grid, function(row, y) {
+ each(row, function(cell, x) {
+ if (cell.elm == target) {
+ pos = {x : x, y : y};
+ return false;
+ }
+ });
+
+ return !pos;
+ });
+
+ return pos;
+ };
+
+ function setStartCell(cell) {
+ startPos = getPos(cell);
+ };
+
+ function findEndPos() {
+ var pos, maxX, maxY;
+
+ maxX = maxY = 0;
+
+ each(grid, function(row, y) {
+ each(row, function(cell, x) {
+ var colSpan, rowSpan;
+
+ if (isCellSelected(cell)) {
+ cell = grid[y][x];
+
+ if (x > maxX)
+ maxX = x;
+
+ if (y > maxY)
+ maxY = y;
+
+ if (cell.real) {
+ colSpan = cell.colspan - 1;
+ rowSpan = cell.rowspan - 1;
+
+ if (colSpan) {
+ if (x + colSpan > maxX)
+ maxX = x + colSpan;
+ }
+
+ if (rowSpan) {
+ if (y + rowSpan > maxY)
+ maxY = y + rowSpan;
+ }
+ }
+ }
+ });
+ });
+
+ return {x : maxX, y : maxY};
+ };
+
+ function setEndCell(cell) {
+ var startX, startY, endX, endY, maxX, maxY, colSpan, rowSpan;
+
+ endPos = getPos(cell);
+
+ if (startPos && endPos) {
+ // Get start/end positions
+ startX = Math.min(startPos.x, endPos.x);
+ startY = Math.min(startPos.y, endPos.y);
+ endX = Math.max(startPos.x, endPos.x);
+ endY = Math.max(startPos.y, endPos.y);
+
+ // Expand end positon to include spans
+ maxX = endX;
+ maxY = endY;
+
+ // Expand startX
+ for (y = startY; y <= maxY; y++) {
+ cell = grid[y][startX];
+
+ if (!cell.real) {
+ if (startX - (cell.colspan - 1) < startX)
+ startX -= cell.colspan - 1;
+ }
+ }
+
+ // Expand startY
+ for (x = startX; x <= maxX; x++) {
+ cell = grid[startY][x];
+
+ if (!cell.real) {
+ if (startY - (cell.rowspan - 1) < startY)
+ startY -= cell.rowspan - 1;
+ }
+ }
+
+ // Find max X, Y
+ for (y = startY; y <= endY; y++) {
+ for (x = startX; x <= endX; x++) {
+ cell = grid[y][x];
+
+ if (cell.real) {
+ colSpan = cell.colspan - 1;
+ rowSpan = cell.rowspan - 1;
+
+ if (colSpan) {
+ if (x + colSpan > maxX)
+ maxX = x + colSpan;
+ }
+
+ if (rowSpan) {
+ if (y + rowSpan > maxY)
+ maxY = y + rowSpan;
+ }
+ }
+ }
+ }
+
+ // Remove current selection
+ dom.removeClass(dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
+
+ // Add new selection
+ for (y = startY; y <= maxY; y++) {
+ for (x = startX; x <= maxX; x++) {
+ if (grid[y][x])
+ dom.addClass(grid[y][x].elm, 'mceSelected');
+ }
+ }
+ }
+ };
+
+ // Expose to public
+ tinymce.extend(this, {
+ deleteTable : deleteTable,
+ split : split,
+ merge : merge,
+ insertRow : insertRow,
+ insertCol : insertCol,
+ deleteCols : deleteCols,
+ deleteRows : deleteRows,
+ cutRows : cutRows,
+ copyRows : copyRows,
+ pasteRows : pasteRows,
+ getPos : getPos,
+ setStartCell : setStartCell,
+ setEndCell : setEndCell
+ });
+ };
+
+ tinymce.create('tinymce.plugins.TablePlugin', {
+ init : function(ed, url) {
+ var winMan, clipboardRows, hasCellSelection = true; // Might be selected cells on reload
+
+ function createTableGrid(node) {
+ var selection = ed.selection, tblElm = ed.dom.getParent(node || selection.getNode(), 'table');
+
+ if (tblElm)
+ return new TableGrid(tblElm, ed.dom, selection);
+ };
+
+ function cleanup() {
+ // Restore selection possibilities
+ ed.getBody().style.webkitUserSelect = '';
+
+ if (hasCellSelection) {
+ ed.dom.removeClass(ed.dom.select('td.mceSelected,th.mceSelected'), 'mceSelected');
+ hasCellSelection = false;
+ }
+ };
+
+ // Register buttons
+ each([
+ ['table', 'table.desc', 'mceInsertTable', true],
+ ['delete_table', 'table.del', 'mceTableDelete'],
+ ['delete_col', 'table.delete_col_desc', 'mceTableDeleteCol'],
+ ['delete_row', 'table.delete_row_desc', 'mceTableDeleteRow'],
+ ['col_after', 'table.col_after_desc', 'mceTableInsertColAfter'],
+ ['col_before', 'table.col_before_desc', 'mceTableInsertColBefore'],
+ ['row_after', 'table.row_after_desc', 'mceTableInsertRowAfter'],
+ ['row_before', 'table.row_before_desc', 'mceTableInsertRowBefore'],
+ ['row_props', 'table.row_desc', 'mceTableRowProps', true],
+ ['cell_props', 'table.cell_desc', 'mceTableCellProps', true],
+ ['split_cells', 'table.split_cells_desc', 'mceTableSplitCells', true],
+ ['merge_cells', 'table.merge_cells_desc', 'mceTableMergeCells', true]
+ ], function(c) {
+ ed.addButton(c[0], {title : c[1], cmd : c[2], ui : c[3]});
+ });
+
+ // Select whole table is a table border is clicked
+ if (!tinymce.isIE) {
+ ed.onClick.add(function(ed, e) {
+ e = e.target;
+
+ if (e.nodeName === 'TABLE') {
+ ed.selection.select(e);
+ ed.nodeChanged();
+ }
+ });
+ }
+
+ ed.onPreProcess.add(function(ed, args) {
+ var nodes, i, node, dom = ed.dom, value;
+
+ nodes = dom.select('table', args.node);
+ i = nodes.length;
+ while (i--) {
+ node = nodes[i];
+ dom.setAttrib(node, 'data-mce-style', '');
+
+ if ((value = dom.getAttrib(node, 'width'))) {
+ dom.setStyle(node, 'width', value);
+ dom.setAttrib(node, 'width', '');
+ }
+
+ if ((value = dom.getAttrib(node, 'height'))) {
+ dom.setStyle(node, 'height', value);
+ dom.setAttrib(node, 'height', '');
+ }
+ }
+ });
+
+ // Handle node change updates
+ ed.onNodeChange.add(function(ed, cm, n) {
+ var p;
+
+ n = ed.selection.getStart();
+ p = ed.dom.getParent(n, 'td,th,caption');
+ cm.setActive('table', n.nodeName === 'TABLE' || !!p);
+
+ // Disable table tools if we are in caption
+ if (p && p.nodeName === 'CAPTION')
+ p = 0;
+
+ cm.setDisabled('delete_table', !p);
+ cm.setDisabled('delete_col', !p);
+ cm.setDisabled('delete_table', !p);
+ cm.setDisabled('delete_row', !p);
+ cm.setDisabled('col_after', !p);
+ cm.setDisabled('col_before', !p);
+ cm.setDisabled('row_after', !p);
+ cm.setDisabled('row_before', !p);
+ cm.setDisabled('row_props', !p);
+ cm.setDisabled('cell_props', !p);
+ cm.setDisabled('split_cells', !p);
+ cm.setDisabled('merge_cells', !p);
+ });
+
+ ed.onInit.add(function(ed) {
+ var startTable, startCell, dom = ed.dom, tableGrid;
+
+ winMan = ed.windowManager;
+
+ // Add cell selection logic
+ ed.onMouseDown.add(function(ed, e) {
+ if (e.button != 2) {
+ cleanup();
+
+ startCell = dom.getParent(e.target, 'td,th');
+ startTable = dom.getParent(startCell, 'table');
+ }
+ });
+
+ dom.bind(ed.getDoc(), 'mouseover', function(e) {
+ var sel, table, target = e.target;
+
+ if (startCell && (tableGrid || target != startCell) && (target.nodeName == 'TD' || target.nodeName == 'TH')) {
+ table = dom.getParent(target, 'table');
+ if (table == startTable) {
+ if (!tableGrid) {
+ tableGrid = createTableGrid(table);
+ tableGrid.setStartCell(startCell);
+
+ ed.getBody().style.webkitUserSelect = 'none';
+ }
+
+ tableGrid.setEndCell(target);
+ hasCellSelection = true;
+ }
+
+ // Remove current selection
+ sel = ed.selection.getSel();
+
+ try {
+ if (sel.removeAllRanges)
+ sel.removeAllRanges();
+ else
+ sel.empty();
+ } catch (ex) {
+ // IE9 might throw errors here
+ }
+
+ e.preventDefault();
+ }
+ });
+
+ ed.onMouseUp.add(function(ed, e) {
+ var rng, sel = ed.selection, selectedCells, nativeSel = sel.getSel(), walker, node, lastNode, endNode;
+
+ // Move selection to startCell
+ if (startCell) {
+ if (tableGrid)
+ ed.getBody().style.webkitUserSelect = '';
+
+ function setPoint(node, start) {
+ var walker = new tinymce.dom.TreeWalker(node, node);
+
+ do {
+ // Text node
+ if (node.nodeType == 3 && tinymce.trim(node.nodeValue).length != 0) {
+ if (start)
+ rng.setStart(node, 0);
+ else
+ rng.setEnd(node, node.nodeValue.length);
+
+ return;
+ }
+
+ // BR element
+ if (node.nodeName == 'BR') {
+ if (start)
+ rng.setStartBefore(node);
+ else
+ rng.setEndBefore(node);
+
+ return;
+ }
+ } while (node = (start ? walker.next() : walker.prev()));
+ }
+
+ // Try to expand text selection as much as we can only Gecko supports cell selection
+ selectedCells = dom.select('td.mceSelected,th.mceSelected');
+ if (selectedCells.length > 0) {
+ rng = dom.createRng();
+ node = selectedCells[0];
+ endNode = selectedCells[selectedCells.length - 1];
+ rng.setStartBefore(node);
+ rng.setEndAfter(node);
+
+ setPoint(node, 1);
+ walker = new tinymce.dom.TreeWalker(node, dom.getParent(selectedCells[0], 'table'));
+
+ do {
+ if (node.nodeName == 'TD' || node.nodeName == 'TH') {
+ if (!dom.hasClass(node, 'mceSelected'))
+ break;
+
+ lastNode = node;
+ }
+ } while (node = walker.next());
+
+ setPoint(lastNode);
+
+ sel.setRng(rng);
+ }
+
+ ed.nodeChanged();
+ startCell = tableGrid = startTable = null;
+ }
+ });
+
+ ed.onKeyUp.add(function(ed, e) {
+ cleanup();
+ });
+
+ ed.onKeyDown.add(function (ed, e) {
+ fixTableCellSelection(ed);
+ });
+
+ ed.onMouseDown.add(function (ed, e) {
+ if (e.button != 2) {
+ fixTableCellSelection(ed);
+ }
+ });
+ function tableCellSelected(ed, rng, n, currentCell) {
+ // The decision of when a table cell is selected is somewhat involved. The fact that this code is
+ // required is actually a pointer to the root cause of this bug. A cell is selected when the start
+ // and end offsets are 0, the start container is a text, and the selection node is either a TR (most cases)
+ // or the parent of the table (in the case of the selection containing the last cell of a table).
+ var TEXT_NODE = 3, table = ed.dom.getParent(rng.startContainer, 'TABLE'),
+ tableParent, allOfCellSelected, tableCellSelection;
+ if (table)
+ tableParent = table.parentNode;
+ allOfCellSelected =rng.startContainer.nodeType == TEXT_NODE &&
+ rng.startOffset == 0 &&
+ rng.endOffset == 0 &&
+ currentCell &&
+ (n.nodeName=="TR" || n==tableParent);
+ tableCellSelection = (n.nodeName=="TD"||n.nodeName=="TH")&& !currentCell;
+ return allOfCellSelected || tableCellSelection;
+ // return false;
+ }
+
+ // this nasty hack is here to work around some WebKit selection bugs.
+ function fixTableCellSelection(ed) {
+ if (!tinymce.isWebKit)
+ return;
+
+ var rng = ed.selection.getRng();
+ var n = ed.selection.getNode();
+ var currentCell = ed.dom.getParent(rng.startContainer, 'TD,TH');
+
+ if (!tableCellSelected(ed, rng, n, currentCell))
+ return;
+ if (!currentCell) {
+ currentCell=n;
+ }
+
+ // Get the very last node inside the table cell
+ var end = currentCell.lastChild;
+ while (end.lastChild)
+ end = end.lastChild;
+
+ // Select the entire table cell. Nothing outside of the table cell should be selected.
+ rng.setEnd(end, end.nodeValue.length);
+ ed.selection.setRng(rng);
+ }
+ ed.plugins.table.fixTableCellSelection=fixTableCellSelection;
+
+ // Add context menu
+ if (ed && ed.plugins.contextmenu) {
+ ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {
+ var sm, se = ed.selection, el = se.getNode() || ed.getBody();
+
+ if (ed.dom.getParent(e, 'td') || ed.dom.getParent(e, 'th') || ed.dom.select('td.mceSelected,th.mceSelected').length) {
+ m.removeAll();
+
+ if (el.nodeName == 'A' && !ed.dom.getAttrib(el, 'name')) {
+ m.add({title : 'advanced.link_desc', icon : 'link', cmd : ed.plugins.advlink ? 'mceAdvLink' : 'mceLink', ui : true});
+ m.add({title : 'advanced.unlink_desc', icon : 'unlink', cmd : 'UnLink'});
+ m.addSeparator();
+ }
+
+ if (el.nodeName == 'IMG' && el.className.indexOf('mceItem') == -1) {
+ m.add({title : 'advanced.image_desc', icon : 'image', cmd : ed.plugins.advimage ? 'mceAdvImage' : 'mceImage', ui : true});
+ m.addSeparator();
+ }
+
+ m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable', value : {action : 'insert'}});
+ m.add({title : 'table.props_desc', icon : 'table_props', cmd : 'mceInsertTable'});
+ m.add({title : 'table.del', icon : 'delete_table', cmd : 'mceTableDelete'});
+ m.addSeparator();
+
+ // Cell menu
+ sm = m.addMenu({title : 'table.cell'});
+ sm.add({title : 'table.cell_desc', icon : 'cell_props', cmd : 'mceTableCellProps'});
+ sm.add({title : 'table.split_cells_desc', icon : 'split_cells', cmd : 'mceTableSplitCells'});
+ sm.add({title : 'table.merge_cells_desc', icon : 'merge_cells', cmd : 'mceTableMergeCells'});
+
+ // Row menu
+ sm = m.addMenu({title : 'table.row'});
+ sm.add({title : 'table.row_desc', icon : 'row_props', cmd : 'mceTableRowProps'});
+ sm.add({title : 'table.row_before_desc', icon : 'row_before', cmd : 'mceTableInsertRowBefore'});
+ sm.add({title : 'table.row_after_desc', icon : 'row_after', cmd : 'mceTableInsertRowAfter'});
+ sm.add({title : 'table.delete_row_desc', icon : 'delete_row', cmd : 'mceTableDeleteRow'});
+ sm.addSeparator();
+ sm.add({title : 'table.cut_row_desc', icon : 'cut', cmd : 'mceTableCutRow'});
+ sm.add({title : 'table.copy_row_desc', icon : 'copy', cmd : 'mceTableCopyRow'});
+ sm.add({title : 'table.paste_row_before_desc', icon : 'paste', cmd : 'mceTablePasteRowBefore'}).setDisabled(!clipboardRows);
+ sm.add({title : 'table.paste_row_after_desc', icon : 'paste', cmd : 'mceTablePasteRowAfter'}).setDisabled(!clipboardRows);
+
+ // Column menu
+ sm = m.addMenu({title : 'table.col'});
+ sm.add({title : 'table.col_before_desc', icon : 'col_before', cmd : 'mceTableInsertColBefore'});
+ sm.add({title : 'table.col_after_desc', icon : 'col_after', cmd : 'mceTableInsertColAfter'});
+ sm.add({title : 'table.delete_col_desc', icon : 'delete_col', cmd : 'mceTableDeleteCol'});
+ } else
+ m.add({title : 'table.desc', icon : 'table', cmd : 'mceInsertTable'});
+ });
+ }
+
+ // Fix to allow navigating up and down in a table in WebKit browsers.
+ if (tinymce.isWebKit) {
+ function moveSelection(ed, e) {
+ var VK = tinymce.VK;
+ var key = e.keyCode;
+
+ function handle(upBool, sourceNode, event) {
+ var siblingDirection = upBool ? 'previousSibling' : 'nextSibling';
+ var currentRow = ed.dom.getParent(sourceNode, 'tr');
+ var siblingRow = currentRow[siblingDirection];
+
+ if (siblingRow) {
+ moveCursorToRow(ed, sourceNode, siblingRow, upBool);
+ tinymce.dom.Event.cancel(event);
+ return true;
+ } else {
+ var tableNode = ed.dom.getParent(currentRow, 'table');
+ var middleNode = currentRow.parentNode;
+ var parentNodeName = middleNode.nodeName.toLowerCase();
+ if (parentNodeName === 'tbody' || parentNodeName === (upBool ? 'tfoot' : 'thead')) {
+ var targetParent = getTargetParent(upBool, tableNode, middleNode, 'tbody');
+ if (targetParent !== null) {
+ return moveToRowInTarget(upBool, targetParent, sourceNode, event);
+ }
+ }
+ return escapeTable(upBool, currentRow, siblingDirection, tableNode, event);
+ }
+ }
+
+ function getTargetParent(upBool, topNode, secondNode, nodeName) {
+ var tbodies = ed.dom.select('>' + nodeName, topNode);
+ var position = tbodies.indexOf(secondNode);
+ if (upBool && position === 0 || !upBool && position === tbodies.length - 1) {
+ return getFirstHeadOrFoot(upBool, topNode);
+ } else if (position === -1) {
+ var topOrBottom = secondNode.tagName.toLowerCase() === 'thead' ? 0 : tbodies.length - 1;
+ return tbodies[topOrBottom];
+ } else {
+ return tbodies[position + (upBool ? -1 : 1)];
+ }
+ }
+
+ function getFirstHeadOrFoot(upBool, parent) {
+ var tagName = upBool ? 'thead' : 'tfoot';
+ var headOrFoot = ed.dom.select('>' + tagName, parent);
+ return headOrFoot.length !== 0 ? headOrFoot[0] : null;
+ }
+
+ function moveToRowInTarget(upBool, targetParent, sourceNode, event) {
+ var targetRow = getChildForDirection(targetParent, upBool);
+ targetRow && moveCursorToRow(ed, sourceNode, targetRow, upBool);
+ tinymce.dom.Event.cancel(event);
+ return true;
+ }
+
+ function escapeTable(upBool, currentRow, siblingDirection, table, event) {
+ var tableSibling = table[siblingDirection];
+ if (tableSibling) {
+ moveCursorToStartOfElement(tableSibling);
+ return true;
+ } else {
+ var parentCell = ed.dom.getParent(table, 'td,th');
+ if (parentCell) {
+ return handle(upBool, parentCell, event);
+ } else {
+ var backUpSibling = getChildForDirection(currentRow, !upBool);
+ moveCursorToStartOfElement(backUpSibling);
+ return tinymce.dom.Event.cancel(event);
+ }
+ }
+ }
+
+ function getChildForDirection(parent, up) {
+ var child = parent && parent[up ? 'lastChild' : 'firstChild'];
+ // BR is not a valid table child to return in this case we return the table cell
+ return child && child.nodeName === 'BR' ? ed.dom.getParent(child, 'td,th') : child;
+ }
+
+ function moveCursorToStartOfElement(n) {
+ ed.selection.setCursorLocation(n, 0);
+ }
+
+ function isVerticalMovement() {
+ return key == VK.UP || key == VK.DOWN;
+ }
+
+ function isInTable(ed) {
+ var node = ed.selection.getNode();
+ var currentRow = ed.dom.getParent(node, 'tr');
+ return currentRow !== null;
+ }
+
+ function columnIndex(column) {
+ var colIndex = 0;
+ var c = column;
+ while (c.previousSibling) {
+ c = c.previousSibling;
+ colIndex = colIndex + getSpanVal(c, "colspan");
+ }
+ return colIndex;
+ }
+
+ function findColumn(rowElement, columnIndex) {
+ var c = 0;
+ var r = 0;
+ each(rowElement.children, function(cell, i) {
+ c = c + getSpanVal(cell, "colspan");
+ r = i;
+ if (c > columnIndex)
+ return false;
+ });
+ return r;
+ }
+
+ function moveCursorToRow(ed, node, row, upBool) {
+ var srcColumnIndex = columnIndex(ed.dom.getParent(node, 'td,th'));
+ var tgtColumnIndex = findColumn(row, srcColumnIndex);
+ var tgtNode = row.childNodes[tgtColumnIndex];
+ var rowCellTarget = getChildForDirection(tgtNode, upBool);
+ moveCursorToStartOfElement(rowCellTarget || tgtNode);
+ }
+
+ function shouldFixCaret(preBrowserNode) {
+ var newNode = ed.selection.getNode();
+ var newParent = ed.dom.getParent(newNode, 'td,th');
+ var oldParent = ed.dom.getParent(preBrowserNode, 'td,th');
+ return newParent && newParent !== oldParent && checkSameParentTable(newParent, oldParent)
+ }
+
+ function checkSameParentTable(nodeOne, NodeTwo) {
+ return ed.dom.getParent(nodeOne, 'TABLE') === ed.dom.getParent(NodeTwo, 'TABLE');
+ }
+
+ if (isVerticalMovement() && isInTable(ed)) {
+ var preBrowserNode = ed.selection.getNode();
+ setTimeout(function() {
+ if (shouldFixCaret(preBrowserNode)) {
+ handle(!e.shiftKey && key === VK.UP, preBrowserNode, e);
+ }
+ }, 0);
+ }
+ }
+
+ ed.onKeyDown.add(moveSelection);
+ }
+
+ // Fixes an issue on Gecko where it's impossible to place the caret behind a table
+ // This fix will force a paragraph element after the table but only when the forced_root_block setting is enabled
+ function fixTableCaretPos() {
+ var last;
+
+ // Skip empty text nodes form the end
+ for (last = ed.getBody().lastChild; last && last.nodeType == 3 && !last.nodeValue.length; last = last.previousSibling) ;
+
+ if (last && last.nodeName == 'TABLE') {
+ if (ed.settings.forced_root_block)
+ ed.dom.add(ed.getBody(), ed.settings.forced_root_block, null, tinymce.isIE ? ' ' : '
');
+ else
+ ed.dom.add(ed.getBody(), 'br', {'data-mce-bogus': '1'});
+ }
+ };
+
+ // Fixes an bug where it's impossible to place the caret before a table in Gecko
+ // this fix solves it by detecting when the caret is at the beginning of such a table
+ // and then manually moves the caret infront of the table
+ if (tinymce.isGecko) {
+ ed.onKeyDown.add(function(ed, e) {
+ var rng, table, dom = ed.dom;
+
+ // On gecko it's not possible to place the caret before a table
+ if (e.keyCode == 37 || e.keyCode == 38) {
+ rng = ed.selection.getRng();
+ table = dom.getParent(rng.startContainer, 'table');
+
+ if (table && ed.getBody().firstChild == table) {
+ if (isAtStart(rng, table)) {
+ rng = dom.createRng();
+
+ rng.setStartBefore(table);
+ rng.setEndBefore(table);
+
+ ed.selection.setRng(rng);
+
+ e.preventDefault();
+ }
+ }
+ }
+ });
+ }
+
+ ed.onKeyUp.add(fixTableCaretPos);
+ ed.onSetContent.add(fixTableCaretPos);
+ ed.onVisualAid.add(fixTableCaretPos);
+
+ ed.onPreProcess.add(function(ed, o) {
+ var last = o.node.lastChild;
+
+ if (last && (last.nodeName == "BR" || (last.childNodes.length == 1 && (last.firstChild.nodeName == 'BR' || last.firstChild.nodeValue == '\u00a0'))) && last.previousSibling && last.previousSibling.nodeName == "TABLE") {
+ ed.dom.remove(last);
+ }
+ });
+
+
+ /**
+ * Fixes bug in Gecko where shift-enter in table cell does not place caret on new line
+ *
+ * Removed: Since the new enter logic seems to fix this one.
+ */
+ /*
+ if (tinymce.isGecko) {
+ ed.onKeyDown.add(function(ed, e) {
+ if (e.keyCode === tinymce.VK.ENTER && e.shiftKey) {
+ var node = ed.selection.getRng().startContainer;
+ var tableCell = dom.getParent(node, 'td,th');
+ if (tableCell) {
+ var zeroSizedNbsp = ed.getDoc().createTextNode("\uFEFF");
+ dom.insertAfter(zeroSizedNbsp, node);
+ }
+ }
+ });
+ }
+ */
+
+ fixTableCaretPos();
+ ed.startContent = ed.getContent({format : 'raw'});
+ });
+
+ // Register action commands
+ each({
+ mceTableSplitCells : function(grid) {
+ grid.split();
+ },
+
+ mceTableMergeCells : function(grid) {
+ var rowSpan, colSpan, cell;
+
+ cell = ed.dom.getParent(ed.selection.getNode(), 'th,td');
+ if (cell) {
+ rowSpan = cell.rowSpan;
+ colSpan = cell.colSpan;
+ }
+
+ if (!ed.dom.select('td.mceSelected,th.mceSelected').length) {
+ winMan.open({
+ url : url + '/merge_cells.htm',
+ width : 240 + parseInt(ed.getLang('table.merge_cells_delta_width', 0)),
+ height : 110 + parseInt(ed.getLang('table.merge_cells_delta_height', 0)),
+ inline : 1
+ }, {
+ rows : rowSpan,
+ cols : colSpan,
+ onaction : function(data) {
+ grid.merge(cell, data.cols, data.rows);
+ },
+ plugin_url : url
+ });
+ } else
+ grid.merge();
+ },
+
+ mceTableInsertRowBefore : function(grid) {
+ grid.insertRow(true);
+ },
+
+ mceTableInsertRowAfter : function(grid) {
+ grid.insertRow();
+ },
+
+ mceTableInsertColBefore : function(grid) {
+ grid.insertCol(true);
+ },
+
+ mceTableInsertColAfter : function(grid) {
+ grid.insertCol();
+ },
+
+ mceTableDeleteCol : function(grid) {
+ grid.deleteCols();
+ },
+
+ mceTableDeleteRow : function(grid) {
+ grid.deleteRows();
+ },
+
+ mceTableCutRow : function(grid) {
+ clipboardRows = grid.cutRows();
+ },
+
+ mceTableCopyRow : function(grid) {
+ clipboardRows = grid.copyRows();
+ },
+
+ mceTablePasteRowBefore : function(grid) {
+ grid.pasteRows(clipboardRows, true);
+ },
+
+ mceTablePasteRowAfter : function(grid) {
+ grid.pasteRows(clipboardRows);
+ },
+
+ mceTableDelete : function(grid) {
+ grid.deleteTable();
+ }
+ }, function(func, name) {
+ ed.addCommand(name, function() {
+ var grid = createTableGrid();
+
+ if (grid) {
+ func(grid);
+ ed.execCommand('mceRepaint');
+ cleanup();
+ }
+ });
+ });
+
+ // Register dialog commands
+ each({
+ mceInsertTable : function(val) {
+ winMan.open({
+ url : url + '/table.htm',
+ width : 400 + parseInt(ed.getLang('table.table_delta_width', 0)),
+ height : 320 + parseInt(ed.getLang('table.table_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url,
+ action : val ? val.action : 0
+ });
+ },
+
+ mceTableRowProps : function() {
+ winMan.open({
+ url : url + '/row.htm',
+ width : 400 + parseInt(ed.getLang('table.rowprops_delta_width', 0)),
+ height : 295 + parseInt(ed.getLang('table.rowprops_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ },
+
+ mceTableCellProps : function() {
+ winMan.open({
+ url : url + '/cell.htm',
+ width : 400 + parseInt(ed.getLang('table.cellprops_delta_width', 0)),
+ height : 295 + parseInt(ed.getLang('table.cellprops_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ }
+ }, function(func, name) {
+ ed.addCommand(name, function(ui, val) {
+ func(val);
+ });
+ });
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('table', tinymce.plugins.TablePlugin);
+})(tinymce);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js
new file mode 100644
index 0000000..02ecf22
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/js/cell.js
@@ -0,0 +1,319 @@
+tinyMCEPopup.requireLangPack();
+
+var ed;
+
+function init() {
+ ed = tinyMCEPopup.editor;
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+ document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+ document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor')
+
+ var inst = ed;
+ var tdElm = ed.dom.getParent(ed.selection.getStart(), "td,th");
+ var formObj = document.forms[0];
+ var st = ed.dom.parseStyle(ed.dom.getAttrib(tdElm, "style"));
+
+ // Get table cell data
+ var celltype = tdElm.nodeName.toLowerCase();
+ var align = ed.dom.getAttrib(tdElm, 'align');
+ var valign = ed.dom.getAttrib(tdElm, 'valign');
+ var width = trimSize(getStyle(tdElm, 'width', 'width'));
+ var height = trimSize(getStyle(tdElm, 'height', 'height'));
+ var bordercolor = convertRGBToHex(getStyle(tdElm, 'bordercolor', 'borderLeftColor'));
+ var bgcolor = convertRGBToHex(getStyle(tdElm, 'bgcolor', 'backgroundColor'));
+ var className = ed.dom.getAttrib(tdElm, 'class');
+ var backgroundimage = getStyle(tdElm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");
+ var id = ed.dom.getAttrib(tdElm, 'id');
+ var lang = ed.dom.getAttrib(tdElm, 'lang');
+ var dir = ed.dom.getAttrib(tdElm, 'dir');
+ var scope = ed.dom.getAttrib(tdElm, 'scope');
+
+ // Setup form
+ addClassesToList('class', 'table_cell_styles');
+ TinyMCE_EditableSelects.init();
+
+ if (!ed.dom.hasClass(tdElm, 'mceSelected')) {
+ formObj.bordercolor.value = bordercolor;
+ formObj.bgcolor.value = bgcolor;
+ formObj.backgroundimage.value = backgroundimage;
+ formObj.width.value = width;
+ formObj.height.value = height;
+ formObj.id.value = id;
+ formObj.lang.value = lang;
+ formObj.style.value = ed.dom.serializeStyle(st);
+ selectByValue(formObj, 'align', align);
+ selectByValue(formObj, 'valign', valign);
+ selectByValue(formObj, 'class', className, true, true);
+ selectByValue(formObj, 'celltype', celltype);
+ selectByValue(formObj, 'dir', dir);
+ selectByValue(formObj, 'scope', scope);
+
+ // Resize some elements
+ if (isVisible('backgroundimagebrowser'))
+ document.getElementById('backgroundimage').style.width = '180px';
+
+ updateColor('bordercolor_pick', 'bordercolor');
+ updateColor('bgcolor_pick', 'bgcolor');
+ } else
+ tinyMCEPopup.dom.hide('action');
+}
+
+function updateAction() {
+ var el, inst = ed, tdElm, trElm, tableElm, formObj = document.forms[0];
+
+ if (!AutoValidator.validate(formObj)) {
+ tinyMCEPopup.alert(AutoValidator.getErrorMessages(formObj).join('. ') + '.');
+ return false;
+ }
+
+ tinyMCEPopup.restoreSelection();
+ el = ed.selection.getStart();
+ tdElm = ed.dom.getParent(el, "td,th");
+ trElm = ed.dom.getParent(el, "tr");
+ tableElm = ed.dom.getParent(el, "table");
+
+ // Cell is selected
+ if (ed.dom.hasClass(tdElm, 'mceSelected')) {
+ // Update all selected sells
+ tinymce.each(ed.dom.select('td.mceSelected,th.mceSelected'), function(td) {
+ updateCell(td);
+ });
+
+ ed.addVisual();
+ ed.nodeChanged();
+ inst.execCommand('mceEndUndoLevel');
+ tinyMCEPopup.close();
+ return;
+ }
+
+ switch (getSelectValue(formObj, 'action')) {
+ case "cell":
+ var celltype = getSelectValue(formObj, 'celltype');
+ var scope = getSelectValue(formObj, 'scope');
+
+ function doUpdate(s) {
+ if (s) {
+ updateCell(tdElm);
+
+ ed.addVisual();
+ ed.nodeChanged();
+ inst.execCommand('mceEndUndoLevel');
+ tinyMCEPopup.close();
+ }
+ };
+
+ if (ed.getParam("accessibility_warnings", 1)) {
+ if (celltype == "th" && scope == "")
+ tinyMCEPopup.confirm(ed.getLang('table_dlg.missing_scope', '', true), doUpdate);
+ else
+ doUpdate(1);
+
+ return;
+ }
+
+ updateCell(tdElm);
+ break;
+
+ case "row":
+ var cell = trElm.firstChild;
+
+ if (cell.nodeName != "TD" && cell.nodeName != "TH")
+ cell = nextCell(cell);
+
+ do {
+ cell = updateCell(cell, true);
+ } while ((cell = nextCell(cell)) != null);
+
+ break;
+
+ case "col":
+ var curr, col = 0, cell = trElm.firstChild, rows = tableElm.getElementsByTagName("tr");
+
+ if (cell.nodeName != "TD" && cell.nodeName != "TH")
+ cell = nextCell(cell);
+
+ do {
+ if (cell == tdElm)
+ break;
+ col += cell.getAttribute("colspan")?cell.getAttribute("colspan"):1;
+ } while ((cell = nextCell(cell)) != null);
+
+ for (var i=0; i 0) {
+ tinymce.each(tableElm.rows, function(tr) {
+ var i;
+
+ for (i = 0; i < tr.cells.length; i++) {
+ if (dom.hasClass(tr.cells[i], 'mceSelected')) {
+ updateRow(tr, true);
+ return;
+ }
+ }
+ });
+
+ inst.addVisual();
+ inst.nodeChanged();
+ inst.execCommand('mceEndUndoLevel');
+ tinyMCEPopup.close();
+ return;
+ }
+
+ switch (action) {
+ case "row":
+ updateRow(trElm);
+ break;
+
+ case "all":
+ var rows = tableElm.getElementsByTagName("tr");
+
+ for (var i=0; i colLimit) {
+ tinyMCEPopup.alert(inst.getLang('table_dlg.col_limit').replace(/\{\$cols\}/g, colLimit));
+ return false;
+ } else if (rowLimit && rows > rowLimit) {
+ tinyMCEPopup.alert(inst.getLang('table_dlg.row_limit').replace(/\{\$rows\}/g, rowLimit));
+ return false;
+ } else if (cellLimit && cols * rows > cellLimit) {
+ tinyMCEPopup.alert(inst.getLang('table_dlg.cell_limit').replace(/\{\$cells\}/g, cellLimit));
+ return false;
+ }
+
+ // Update table
+ if (action == "update") {
+ dom.setAttrib(elm, 'cellPadding', cellpadding, true);
+ dom.setAttrib(elm, 'cellSpacing', cellspacing, true);
+
+ if (!isCssSize(border)) {
+ dom.setAttrib(elm, 'border', border);
+ } else {
+ dom.setAttrib(elm, 'border', '');
+ }
+
+ if (border == '') {
+ dom.setStyle(elm, 'border-width', '');
+ dom.setStyle(elm, 'border', '');
+ dom.setAttrib(elm, 'border', '');
+ }
+
+ dom.setAttrib(elm, 'align', align);
+ dom.setAttrib(elm, 'frame', frame);
+ dom.setAttrib(elm, 'rules', rules);
+ dom.setAttrib(elm, 'class', className);
+ dom.setAttrib(elm, 'style', style);
+ dom.setAttrib(elm, 'id', id);
+ dom.setAttrib(elm, 'summary', summary);
+ dom.setAttrib(elm, 'dir', dir);
+ dom.setAttrib(elm, 'lang', lang);
+
+ capEl = inst.dom.select('caption', elm)[0];
+
+ if (capEl && !caption)
+ capEl.parentNode.removeChild(capEl);
+
+ if (!capEl && caption) {
+ capEl = elm.ownerDocument.createElement('caption');
+
+ if (!tinymce.isIE)
+ capEl.innerHTML = '
';
+
+ elm.insertBefore(capEl, elm.firstChild);
+ }
+
+ if (width && inst.settings.inline_styles) {
+ dom.setStyle(elm, 'width', width);
+ dom.setAttrib(elm, 'width', '');
+ } else {
+ dom.setAttrib(elm, 'width', width, true);
+ dom.setStyle(elm, 'width', '');
+ }
+
+ // Remove these since they are not valid XHTML
+ dom.setAttrib(elm, 'borderColor', '');
+ dom.setAttrib(elm, 'bgColor', '');
+ dom.setAttrib(elm, 'background', '');
+
+ if (height && inst.settings.inline_styles) {
+ dom.setStyle(elm, 'height', height);
+ dom.setAttrib(elm, 'height', '');
+ } else {
+ dom.setAttrib(elm, 'height', height, true);
+ dom.setStyle(elm, 'height', '');
+ }
+
+ if (background != '')
+ elm.style.backgroundImage = "url('" + background + "')";
+ else
+ elm.style.backgroundImage = '';
+
+/* if (tinyMCEPopup.getParam("inline_styles")) {
+ if (width != '')
+ elm.style.width = getCSSSize(width);
+ }*/
+
+ if (bordercolor != "") {
+ elm.style.borderColor = bordercolor;
+ elm.style.borderStyle = elm.style.borderStyle == "" ? "solid" : elm.style.borderStyle;
+ elm.style.borderWidth = cssSize(border);
+ } else
+ elm.style.borderColor = '';
+
+ elm.style.backgroundColor = bgcolor;
+ elm.style.height = getCSSSize(height);
+
+ inst.addVisual();
+
+ // Fix for stange MSIE align bug
+ //elm.outerHTML = elm.outerHTML;
+
+ inst.nodeChanged();
+ inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true});
+
+ // Repaint if dimensions changed
+ if (formObj.width.value != orgTableWidth || formObj.height.value != orgTableHeight)
+ inst.execCommand('mceRepaint');
+
+ tinyMCEPopup.close();
+ return true;
+ }
+
+ // Create new table
+ html += '';
+
+ if (caption) {
+ if (!tinymce.isIE)
+ html += '
';
+ else
+ html += '';
+ }
+
+ for (var y=0; y";
+
+ for (var x=0; x
';
+ else
+ html += ' | ';
+ }
+
+ html += "";
+ }
+
+ html += "
";
+
+ // Move table
+ if (inst.settings.fix_table_elements) {
+ var patt = '';
+
+ inst.focus();
+ inst.selection.setContent('
');
+
+ tinymce.each('h1,h2,h3,h4,h5,h6,p'.split(','), function(n) {
+ if (patt)
+ patt += ',';
+
+ patt += n + ' ._mce_marker';
+ });
+
+ tinymce.each(inst.dom.select(patt), function(n) {
+ inst.dom.split(inst.dom.getParent(n, 'h1,h2,h3,h4,h5,h6,p'), n);
+ });
+
+ dom.setOuterHTML(dom.select('br._mce_marker')[0], html);
+ } else
+ inst.execCommand('mceInsertContent', false, html);
+
+ tinymce.each(dom.select('table[data-mce-new]'), function(node) {
+ var tdorth = dom.select('td,th', node);
+
+ // Fixes a bug in IE where the caret cannot be placed after the table if the table is at the end of the document
+ if (tinymce.isIE && node.nextSibling == null) {
+ if (inst.settings.forced_root_block)
+ dom.insertAfter(dom.create(inst.settings.forced_root_block), node);
+ else
+ dom.insertAfter(dom.create('br', {'data-mce-bogus': '1'}), node);
+ }
+
+ try {
+ // IE9 might fail to do this selection
+ inst.selection.setCursorLocation(tdorth[0], 0);
+ } catch (ex) {
+ // Ignore
+ }
+
+ dom.setAttrib(node, 'data-mce-new', '');
+ });
+
+ inst.addVisual();
+ inst.execCommand('mceEndUndoLevel', false, {}, {skip_undo: true});
+
+ tinyMCEPopup.close();
+}
+
+function makeAttrib(attrib, value) {
+ var formObj = document.forms[0];
+ var valueElm = formObj.elements[attrib];
+
+ if (typeof(value) == "undefined" || value == null) {
+ value = "";
+
+ if (valueElm)
+ value = valueElm.value;
+ }
+
+ if (value == "")
+ return "";
+
+ // XML encode it
+ value = value.replace(/&/g, '&');
+ value = value.replace(/\"/g, '"');
+ value = value.replace(//g, '>');
+
+ return ' ' + attrib + '="' + value + '"';
+}
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+ document.getElementById('backgroundimagebrowsercontainer').innerHTML = getBrowserHTML('backgroundimagebrowser','backgroundimage','image','table');
+ document.getElementById('bordercolor_pickcontainer').innerHTML = getColorPickerHTML('bordercolor_pick','bordercolor');
+ document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');
+
+ var cols = 2, rows = 2, border = tinyMCEPopup.getParam('table_default_border', '0'), cellpadding = tinyMCEPopup.getParam('table_default_cellpadding', ''), cellspacing = tinyMCEPopup.getParam('table_default_cellspacing', '');
+ var align = "", width = "", height = "", bordercolor = "", bgcolor = "", className = "";
+ var id = "", summary = "", style = "", dir = "", lang = "", background = "", bgcolor = "", bordercolor = "", rules = "", frame = "";
+ var inst = tinyMCEPopup.editor, dom = inst.dom;
+ var formObj = document.forms[0];
+ var elm = dom.getParent(inst.selection.getNode(), "table");
+
+ // Hide advanced fields that isn't available in the schema
+ tinymce.each("summary id rules dir style frame".split(" "), function(name) {
+ var tr = tinyMCEPopup.dom.getParent(name, "tr") || tinyMCEPopup.dom.getParent("t" + name, "tr");
+
+ if (tr && !tinyMCEPopup.editor.schema.isValid("table", name)) {
+ tr.style.display = 'none';
+ }
+ });
+
+ action = tinyMCEPopup.getWindowArg('action');
+
+ if (!action)
+ action = elm ? "update" : "insert";
+
+ if (elm && action != "insert") {
+ var rowsAr = elm.rows;
+ var cols = 0;
+ for (var i=0; i cols)
+ cols = rowsAr[i].cells.length;
+
+ cols = cols;
+ rows = rowsAr.length;
+
+ st = dom.parseStyle(dom.getAttrib(elm, "style"));
+ border = trimSize(getStyle(elm, 'border', 'borderWidth'));
+ cellpadding = dom.getAttrib(elm, 'cellpadding', "");
+ cellspacing = dom.getAttrib(elm, 'cellspacing', "");
+ width = trimSize(getStyle(elm, 'width', 'width'));
+ height = trimSize(getStyle(elm, 'height', 'height'));
+ bordercolor = convertRGBToHex(getStyle(elm, 'bordercolor', 'borderLeftColor'));
+ bgcolor = convertRGBToHex(getStyle(elm, 'bgcolor', 'backgroundColor'));
+ align = dom.getAttrib(elm, 'align', align);
+ frame = dom.getAttrib(elm, 'frame');
+ rules = dom.getAttrib(elm, 'rules');
+ className = tinymce.trim(dom.getAttrib(elm, 'class').replace(/mceItem.+/g, ''));
+ id = dom.getAttrib(elm, 'id');
+ summary = dom.getAttrib(elm, 'summary');
+ style = dom.serializeStyle(st);
+ dir = dom.getAttrib(elm, 'dir');
+ lang = dom.getAttrib(elm, 'lang');
+ background = getStyle(elm, 'background', 'backgroundImage').replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");
+ formObj.caption.checked = elm.getElementsByTagName('caption').length > 0;
+
+ orgTableWidth = width;
+ orgTableHeight = height;
+
+ action = "update";
+ formObj.insert.value = inst.getLang('update');
+ }
+
+ addClassesToList('class', "table_styles");
+ TinyMCE_EditableSelects.init();
+
+ // Update form
+ selectByValue(formObj, 'align', align);
+ selectByValue(formObj, 'tframe', frame);
+ selectByValue(formObj, 'rules', rules);
+ selectByValue(formObj, 'class', className, true, true);
+ formObj.cols.value = cols;
+ formObj.rows.value = rows;
+ formObj.border.value = border;
+ formObj.cellpadding.value = cellpadding;
+ formObj.cellspacing.value = cellspacing;
+ formObj.width.value = width;
+ formObj.height.value = height;
+ formObj.bordercolor.value = bordercolor;
+ formObj.bgcolor.value = bgcolor;
+ formObj.id.value = id;
+ formObj.summary.value = summary;
+ formObj.style.value = style;
+ formObj.dir.value = dir;
+ formObj.lang.value = lang;
+ formObj.backgroundimage.value = background;
+
+ updateColor('bordercolor_pick', 'bordercolor');
+ updateColor('bgcolor_pick', 'bgcolor');
+
+ // Resize some elements
+ if (isVisible('backgroundimagebrowser'))
+ document.getElementById('backgroundimage').style.width = '180px';
+
+ // Disable some fields in update mode
+ if (action == "update") {
+ formObj.cols.disabled = true;
+ formObj.rows.disabled = true;
+ }
+}
+
+function changedSize() {
+ var formObj = document.forms[0];
+ var st = dom.parseStyle(formObj.style.value);
+
+/* var width = formObj.width.value;
+ if (width != "")
+ st['width'] = tinyMCEPopup.getParam("inline_styles") ? getCSSSize(width) : "";
+ else
+ st['width'] = "";*/
+
+ var height = formObj.height.value;
+ if (height != "")
+ st['height'] = getCSSSize(height);
+ else
+ st['height'] = "";
+
+ formObj.style.value = dom.serializeStyle(st);
+}
+
+function isCssSize(value) {
+ return /^[0-9.]+(%|in|cm|mm|em|ex|pt|pc|px)$/.test(value);
+}
+
+function cssSize(value, def) {
+ value = tinymce.trim(value || def);
+
+ if (!isCssSize(value)) {
+ return parseInt(value, 10) + 'px';
+ }
+
+ return value;
+}
+
+function changedBackgroundImage() {
+ var formObj = document.forms[0];
+ var st = dom.parseStyle(formObj.style.value);
+
+ st['background-image'] = "url('" + formObj.backgroundimage.value + "')";
+
+ formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedBorder() {
+ var formObj = document.forms[0];
+ var st = dom.parseStyle(formObj.style.value);
+
+ // Update border width if the element has a color
+ if (formObj.border.value != "" && (isCssSize(formObj.border.value) || formObj.bordercolor.value != ""))
+ st['border-width'] = cssSize(formObj.border.value);
+ else {
+ if (!formObj.border.value) {
+ st['border'] = '';
+ st['border-width'] = '';
+ }
+ }
+
+ formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedColor() {
+ var formObj = document.forms[0];
+ var st = dom.parseStyle(formObj.style.value);
+
+ st['background-color'] = formObj.bgcolor.value;
+
+ if (formObj.bordercolor.value != "") {
+ st['border-color'] = formObj.bordercolor.value;
+
+ // Add border-width if it's missing
+ if (!st['border-width'])
+ st['border-width'] = cssSize(formObj.border.value, 1);
+ }
+
+ formObj.style.value = dom.serializeStyle(st);
+}
+
+function changedStyle() {
+ var formObj = document.forms[0];
+ var st = dom.parseStyle(formObj.style.value);
+
+ if (st['background-image'])
+ formObj.backgroundimage.value = st['background-image'].replace(new RegExp("url\\(['\"]?([^'\"]*)['\"]?\\)", 'gi'), "$1");
+ else
+ formObj.backgroundimage.value = '';
+
+ if (st['width'])
+ formObj.width.value = trimSize(st['width']);
+
+ if (st['height'])
+ formObj.height.value = trimSize(st['height']);
+
+ if (st['background-color']) {
+ formObj.bgcolor.value = st['background-color'];
+ updateColor('bgcolor_pick','bgcolor');
+ }
+
+ if (st['border-color']) {
+ formObj.bordercolor.value = st['border-color'];
+ updateColor('bordercolor_pick','bordercolor');
+ }
+}
+
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/langs/en_dlg.js
new file mode 100644
index 0000000..463e09e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.table_dlg',{"rules_border":"border","rules_box":"box","rules_vsides":"vsides","rules_rhs":"rhs","rules_lhs":"lhs","rules_hsides":"hsides","rules_below":"below","rules_above":"above","rules_void":"void",rules:"Rules","frame_all":"all","frame_cols":"cols","frame_rows":"rows","frame_groups":"groups","frame_none":"none",frame:"Frame",caption:"Table Caption","missing_scope":"Are you sure you want to continue without specifying a scope for this table header cell. Without it, it may be difficult for some users with disabilities to understand the content or data displayed of the table.","cell_limit":"You\'ve exceeded the maximum number of cells of {$cells}.","row_limit":"You\'ve exceeded the maximum number of rows of {$rows}.","col_limit":"You\'ve exceeded the maximum number of columns of {$cols}.",colgroup:"Col Group",rowgroup:"Row Group",scope:"Scope",tfoot:"Footer",tbody:"Body",thead:"Header","row_all":"Update All Rows in Table","row_even":"Update Even Rows in Table","row_odd":"Update Odd Rows in Table","row_row":"Update Current Row","cell_all":"Update All Cells in Table","cell_row":"Update All Cells in Row","cell_cell":"Update Current Cell",th:"Header",td:"Data",summary:"Summary",bgimage:"Background Image",rtl:"Right to Left",ltr:"Left to Right",mime:"Target MIME Type",langcode:"Language Code",langdir:"Language Direction",style:"Style",id:"ID","merge_cells_title":"Merge Table Cells",bgcolor:"Background Color",bordercolor:"Border Color","align_bottom":"Bottom","align_top":"Top",valign:"Vertical Alignment","cell_type":"Cell Type","cell_title":"Table Cell Properties","row_title":"Table Row Properties","align_middle":"Center","align_right":"Right","align_left":"Left","align_default":"Default",align:"Alignment",border:"Border",cellpadding:"Cell Padding",cellspacing:"Cell Spacing",rows:"Rows",cols:"Columns",height:"Height",width:"Width",title:"Insert/Edit Table",rowtype:"Row Type","advanced_props":"Advanced Properties","general_props":"General Properties","advanced_tab":"Advanced","general_tab":"General","cell_col":"Update all cells in column"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm
new file mode 100644
index 0000000..d231090
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/merge_cells.htm
@@ -0,0 +1,32 @@
+
+
+
+ {#table_dlg.merge_cells_title}
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/row.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/row.htm
new file mode 100644
index 0000000..6ebef28
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/row.htm
@@ -0,0 +1,158 @@
+
+
+
+ {#table_dlg.row_title}
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/table.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/table.htm
new file mode 100644
index 0000000..4b5dc31
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/table/table.htm
@@ -0,0 +1,194 @@
+
+
+
+ {#table_dlg.title}
+
+
+
+
+
+
+
+
+
+ {#table_dlg.title}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/blank.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/blank.htm
new file mode 100644
index 0000000..ecde53f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/blank.htm
@@ -0,0 +1,12 @@
+
+
+ blank_page
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/css/template.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/css/template.css
new file mode 100644
index 0000000..2d23a49
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/css/template.css
@@ -0,0 +1,23 @@
+#frmbody {
+ padding: 10px;
+ background-color: #FFF;
+ border: 1px solid #CCC;
+}
+
+.frmRow {
+ margin-bottom: 10px;
+}
+
+#templatesrc {
+ border: none;
+ width: 320px;
+ height: 240px;
+}
+
+.title {
+ padding-bottom: 5px;
+}
+
+.mceActionPanel {
+ padding-top: 5px;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js
new file mode 100644
index 0000000..ebe3c27
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length 0) {
+ el = dom.create('div', null);
+ el.appendChild(n[0].cloneNode(true));
+ }
+
+ function hasClass(n, c) {
+ return new RegExp('\\b' + c + '\\b', 'g').test(n.className);
+ };
+
+ each(dom.select('*', el), function(n) {
+ // Replace cdate
+ if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|')))
+ n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format")));
+
+ // Replace mdate
+ if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|')))
+ n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format")));
+
+ // Replace selection
+ if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|')))
+ n.innerHTML = sel;
+ });
+
+ t._replaceVals(el);
+
+ ed.execCommand('mceInsertContent', false, el.innerHTML);
+ ed.addVisual();
+ },
+
+ _replaceVals : function(e) {
+ var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values');
+
+ each(dom.select('*', e), function(e) {
+ each(vl, function(v, k) {
+ if (dom.hasClass(e, k)) {
+ if (typeof(vl[k]) == 'function')
+ vl[k](e);
+ }
+ });
+ });
+ },
+
+ _getDateTime : function(d, fmt) {
+ if (!fmt)
+ return "";
+
+ function addZeros(value, len) {
+ var i;
+
+ value = "" + value;
+
+ if (value.length < len) {
+ for (i=0; i<(len-value.length); i++)
+ value = "0" + value;
+ }
+
+ return value;
+ }
+
+ fmt = fmt.replace("%D", "%m/%d/%y");
+ fmt = fmt.replace("%r", "%I:%M:%S %p");
+ fmt = fmt.replace("%Y", "" + d.getFullYear());
+ fmt = fmt.replace("%y", "" + d.getYear());
+ fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));
+ fmt = fmt.replace("%d", addZeros(d.getDate(), 2));
+ fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));
+ fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));
+ fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));
+ fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));
+ fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));
+ fmt = fmt.replace("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]);
+ fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]);
+ fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]);
+ fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]);
+ fmt = fmt.replace("%%", "%");
+
+ return fmt;
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/js/template.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/js/template.js
new file mode 100644
index 0000000..bc3045d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template/js/template.js
@@ -0,0 +1,106 @@
+tinyMCEPopup.requireLangPack();
+
+var TemplateDialog = {
+ preInit : function() {
+ var url = tinyMCEPopup.getParam("template_external_list_url");
+
+ if (url != null)
+ document.write('');
+ },
+
+ init : function() {
+ var ed = tinyMCEPopup.editor, tsrc, sel, x, u;
+
+ tsrc = ed.getParam("template_templates", false);
+ sel = document.getElementById('tpath');
+
+ // Setup external template list
+ if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') {
+ for (x=0, tsrc = []; x');
+ });
+ },
+
+ selectTemplate : function(u, ti) {
+ var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc;
+
+ if (!u)
+ return;
+
+ d.body.innerHTML = this.templateHTML = this.getFileContents(u);
+
+ for (x=0; x
+
+ {#template_dlg.title}
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/blank.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/blank.htm
new file mode 100644
index 0000000..ecde53f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/blank.htm
@@ -0,0 +1,12 @@
+
+
+ blank_page
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/css/template.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/css/template.css
new file mode 100644
index 0000000..2d23a49
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/css/template.css
@@ -0,0 +1,23 @@
+#frmbody {
+ padding: 10px;
+ background-color: #FFF;
+ border: 1px solid #CCC;
+}
+
+.frmRow {
+ margin-bottom: 10px;
+}
+
+#templatesrc {
+ border: none;
+ width: 320px;
+ height: 240px;
+}
+
+.title {
+ padding-bottom: 5px;
+}
+
+.mceActionPanel {
+ padding-top: 5px;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/editor_plugin.js
new file mode 100644
index 0000000..ebe3c27
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.TemplatePlugin",{init:function(b,c){var d=this;d.editor=b;b.addCommand("mceTemplate",function(e){b.windowManager.open({file:c+"/template.htm",width:b.getParam("template_popup_width",750),height:b.getParam("template_popup_height",600),inline:1},{plugin_url:c})});b.addCommand("mceInsertTemplate",d._insertTemplate,d);b.addButton("template",{title:"template.desc",cmd:"mceTemplate"});b.onPreProcess.add(function(e,g){var f=e.dom;a(f.select("div",g.node),function(h){if(f.hasClass(h,"mceTmpl")){a(f.select("*",h),function(i){if(f.hasClass(i,e.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){i.innerHTML=d._getDateTime(new Date(),e.getParam("template_mdate_format",e.getLang("template.mdate_format")))}});d._replaceVals(h)}})})},getInfo:function(){return{longname:"Template plugin",author:"Moxiecode Systems AB",authorurl:"http://www.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/template",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_insertTemplate:function(i,j){var k=this,g=k.editor,f,c,d=g.dom,b=g.selection.getContent();f=j.content;a(k.editor.getParam("template_replace_values"),function(l,h){if(typeof(l)!="function"){f=f.replace(new RegExp("\\{\\$"+h+"\\}","g"),l)}});c=d.create("div",null,f);n=d.select(".mceTmpl",c);if(n&&n.length>0){c=d.create("div",null);c.appendChild(n[0].cloneNode(true))}function e(l,h){return new RegExp("\\b"+h+"\\b","g").test(l.className)}a(d.select("*",c),function(h){if(e(h,g.getParam("template_cdate_classes","cdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_cdate_format",g.getLang("template.cdate_format")))}if(e(h,g.getParam("template_mdate_classes","mdate").replace(/\s+/g,"|"))){h.innerHTML=k._getDateTime(new Date(),g.getParam("template_mdate_format",g.getLang("template.mdate_format")))}if(e(h,g.getParam("template_selected_content_classes","selcontent").replace(/\s+/g,"|"))){h.innerHTML=b}});k._replaceVals(c);g.execCommand("mceInsertContent",false,c.innerHTML);g.addVisual()},_replaceVals:function(c){var d=this.editor.dom,b=this.editor.getParam("template_replace_values");a(d.select("*",c),function(f){a(b,function(g,e){if(d.hasClass(f,e)){if(typeof(b[e])=="function"){b[e](f)}}})})},_getDateTime:function(e,b){if(!b){return""}function c(g,d){var f;g=""+g;if(g.length 0) {
+ el = dom.create('div', null);
+ el.appendChild(n[0].cloneNode(true));
+ }
+
+ function hasClass(n, c) {
+ return new RegExp('\\b' + c + '\\b', 'g').test(n.className);
+ };
+
+ each(dom.select('*', el), function(n) {
+ // Replace cdate
+ if (hasClass(n, ed.getParam('template_cdate_classes', 'cdate').replace(/\s+/g, '|')))
+ n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_cdate_format", ed.getLang("template.cdate_format")));
+
+ // Replace mdate
+ if (hasClass(n, ed.getParam('template_mdate_classes', 'mdate').replace(/\s+/g, '|')))
+ n.innerHTML = t._getDateTime(new Date(), ed.getParam("template_mdate_format", ed.getLang("template.mdate_format")));
+
+ // Replace selection
+ if (hasClass(n, ed.getParam('template_selected_content_classes', 'selcontent').replace(/\s+/g, '|')))
+ n.innerHTML = sel;
+ });
+
+ t._replaceVals(el);
+
+ ed.execCommand('mceInsertContent', false, el.innerHTML);
+ ed.addVisual();
+ },
+
+ _replaceVals : function(e) {
+ var dom = this.editor.dom, vl = this.editor.getParam('template_replace_values');
+
+ each(dom.select('*', e), function(e) {
+ each(vl, function(v, k) {
+ if (dom.hasClass(e, k)) {
+ if (typeof(vl[k]) == 'function')
+ vl[k](e);
+ }
+ });
+ });
+ },
+
+ _getDateTime : function(d, fmt) {
+ if (!fmt)
+ return "";
+
+ function addZeros(value, len) {
+ var i;
+
+ value = "" + value;
+
+ if (value.length < len) {
+ for (i=0; i<(len-value.length); i++)
+ value = "0" + value;
+ }
+
+ return value;
+ }
+
+ fmt = fmt.replace("%D", "%m/%d/%y");
+ fmt = fmt.replace("%r", "%I:%M:%S %p");
+ fmt = fmt.replace("%Y", "" + d.getFullYear());
+ fmt = fmt.replace("%y", "" + d.getYear());
+ fmt = fmt.replace("%m", addZeros(d.getMonth()+1, 2));
+ fmt = fmt.replace("%d", addZeros(d.getDate(), 2));
+ fmt = fmt.replace("%H", "" + addZeros(d.getHours(), 2));
+ fmt = fmt.replace("%M", "" + addZeros(d.getMinutes(), 2));
+ fmt = fmt.replace("%S", "" + addZeros(d.getSeconds(), 2));
+ fmt = fmt.replace("%I", "" + ((d.getHours() + 11) % 12 + 1));
+ fmt = fmt.replace("%p", "" + (d.getHours() < 12 ? "AM" : "PM"));
+ fmt = fmt.replace("%B", "" + this.editor.getLang("template_months_long").split(',')[d.getMonth()]);
+ fmt = fmt.replace("%b", "" + this.editor.getLang("template_months_short").split(',')[d.getMonth()]);
+ fmt = fmt.replace("%A", "" + this.editor.getLang("template_day_long").split(',')[d.getDay()]);
+ fmt = fmt.replace("%a", "" + this.editor.getLang("template_day_short").split(',')[d.getDay()]);
+ fmt = fmt.replace("%%", "%");
+
+ return fmt;
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('template', tinymce.plugins.TemplatePlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/js/template.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/js/template.js
new file mode 100644
index 0000000..bc3045d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/template_orig/js/template.js
@@ -0,0 +1,106 @@
+tinyMCEPopup.requireLangPack();
+
+var TemplateDialog = {
+ preInit : function() {
+ var url = tinyMCEPopup.getParam("template_external_list_url");
+
+ if (url != null)
+ document.write('');
+ },
+
+ init : function() {
+ var ed = tinyMCEPopup.editor, tsrc, sel, x, u;
+
+ tsrc = ed.getParam("template_templates", false);
+ sel = document.getElementById('tpath');
+
+ // Setup external template list
+ if (!tsrc && typeof(tinyMCETemplateList) != 'undefined') {
+ for (x=0, tsrc = []; x');
+ });
+ },
+
+ selectTemplate : function(u, ti) {
+ var d = window.frames['templatesrc'].document, x, tsrc = this.tsrc;
+
+ if (!u)
+ return;
+
+ d.body.innerHTML = this.templateHTML = this.getFileContents(u);
+
+ for (x=0; x
+
+ {#template_dlg.title}
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css
new file mode 100644
index 0000000..76bc92b
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/css/visualblocks.css
@@ -0,0 +1,21 @@
+p, h1, h2, h3, h4, h5, h6, hgroup, aside, div, section, article, blockquote, address, pre, figure {display: block; padding-top: 10px; border: 1px dashed #BBB; background: transparent no-repeat}
+p, h1, h2, h3, h4, h5, h6, hgroup, aside, div, section, article, address, pre, figure {margin-left: 3px}
+section, article, address, hgroup, aside, figure {margin: 0 0 1em 3px}
+
+p {background-image: url(data:image/gif;base64,R0lGODlhCQAJAJEAAAAAAP///7u7u////yH5BAEAAAMALAAAAAAJAAkAAAIQnG+CqCN/mlyvsRUpThG6AgA7)}
+h1 {background-image: url(data:image/gif;base64,R0lGODlhDQAKAIABALu7u////yH5BAEAAAEALAAAAAANAAoAAAIXjI8GybGu1JuxHoAfRNRW3TWXyF2YiRUAOw==)}
+h2 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8Hybbx4oOuqgTynJd6bGlWg3DkJzoaUAAAOw==)}
+h3 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIZjI8Hybbx4oOuqgTynJf2Ln2NOHpQpmhAAQA7)}
+h4 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxInR0zqeAdhtJlXwV1oCll2HaWgAAOw==)}
+h5 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjane4iq5GlW05GgIkIZUAAAOw==)}
+h6 {background-image: url(data:image/gif;base64,R0lGODlhDgAKAIABALu7u////yH5BAEAAAEALAAAAAAOAAoAAAIajI8HybbxIoiuwjan04jep1iZ1XRlAo5bVgAAOw==)}
+div {background-image: url(data:image/gif;base64,R0lGODlhEgAKAIABALu7u////yH5BAEAAAEALAAAAAASAAoAAAIfjI9poI0cgDywrhuxfbrzDEbQM2Ei5aRjmoySW4pAAQA7)}
+section {background-image: url(data:image/gif;base64,R0lGODlhKAAKAIABALu7u////yH5BAEAAAEALAAAAAAoAAoAAAI5jI+pywcNY3sBWHdNrplytD2ellDeSVbp+GmWqaDqDMepc8t17Y4vBsK5hDyJMcI6KkuYU+jpjLoKADs=)}
+article {background-image: url(data:image/gif;base64,R0lGODlhKgAKAIABALu7u////yH5BAEAAAEALAAAAAAqAAoAAAI6jI+pywkNY3wG0GBvrsd2tXGYSGnfiF7ikpXemTpOiJScasYoDJJrjsG9gkCJ0ag6KhmaIe3pjDYBBQA7)}
+blockquote {background-image: url(data:image/gif;base64,R0lGODlhPgAKAIABALu7u////yH5BAEAAAEALAAAAAA+AAoAAAJPjI+py+0Knpz0xQDyuUhvfoGgIX5iSKZYgq5uNL5q69asZ8s5rrf0yZmpNkJZzFesBTu8TOlDVAabUyatguVhWduud3EyiUk45xhTTgMBBQA7)}
+address {background-image: url(data:image/gif;base64,R0lGODlhLQAKAIABALu7u////yH5BAEAAAEALAAAAAAtAAoAAAI/jI+pywwNozSP1gDyyZcjb3UaRpXkWaXmZW4OqKLhBmLs+K263DkJK7OJeifh7FicKD9A1/IpGdKkyFpNmCkAADs=)}
+pre {background-image: url(data:image/gif;base64,R0lGODlhFQAKAIABALu7uwAAACH5BAEAAAEALAAAAAAVAAoAAAIjjI+ZoN0cgDwSmnpz1NCueYERhnibZVKLNnbOq8IvKpJtVQAAOw==)}
+hgroup {background-image: url(data:image/gif;base64,R0lGODlhJwAKAIABALu7uwAAACH5BAEAAAEALAAAAAAnAAoAAAI3jI+pywYNI3uB0gpsRtt5fFnfNZaVSYJil4Wo03Hv6Z62uOCgiXH1kZIIJ8NiIxRrAZNMZAtQAAA7)}
+aside {background-image: url(data:image/gif;base64,R0lGODlhHgAKAIABAKqqqv///yH5BAEAAAEALAAAAAAeAAoAAAItjI+pG8APjZOTzgtqy7I3f1yehmQcFY4WKZbqByutmW4aHUd6vfcVbgudgpYCADs=)}
+figure {background-image: url(data:image/gif;base64,R0lGODlhJAAKAIAAALu7u////yH5BAEAAAEALAAAAAAkAAoAAAI0jI+py+2fwAHUSFvD3RlvG4HIp4nX5JFSpnZUJ6LlrM52OE7uSWosBHScgkSZj7dDKnWAAgA7)}
+figcaption {border: 1px dashed #BBB}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js
new file mode 100644
index 0000000..c65eaf2
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.VisualBlocks",{init:function(a,b){var c;if(!window.NodeList){return}a.addCommand("mceVisualBlocks",function(){var e=a.dom,d;if(!c){c=e.uniqueId();d=e.create("link",{id:c,rel:"stylesheet",href:b+"/css/visualblocks.css"});a.getDoc().getElementsByTagName("head")[0].appendChild(d)}else{d=e.get(c);d.disabled=!d.disabled}a.controlManager.setActive("visualblocks",!d.disabled)});a.addButton("visualblocks",{title:"visualblocks.desc",cmd:"mceVisualBlocks"});a.onInit.add(function(){if(a.settings.visualblocks_default_state){a.execCommand("mceVisualBlocks",false,null,{skip_focus:true})}})},getInfo:function(){return{longname:"Visual blocks",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualblocks",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("visualblocks",tinymce.plugins.VisualBlocks)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js
new file mode 100644
index 0000000..b9d2ab2
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualblocks/editor_plugin_src.js
@@ -0,0 +1,63 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2012, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.VisualBlocks', {
+ init : function(ed, url) {
+ var cssId;
+
+ // We don't support older browsers like IE6/7 and they don't provide prototypes for DOM objects
+ if (!window.NodeList) {
+ return;
+ }
+
+ ed.addCommand('mceVisualBlocks', function() {
+ var dom = ed.dom, linkElm;
+
+ if (!cssId) {
+ cssId = dom.uniqueId();
+ linkElm = dom.create('link', {
+ id: cssId,
+ rel : 'stylesheet',
+ href : url + '/css/visualblocks.css'
+ });
+
+ ed.getDoc().getElementsByTagName('head')[0].appendChild(linkElm);
+ } else {
+ linkElm = dom.get(cssId);
+ linkElm.disabled = !linkElm.disabled;
+ }
+
+ ed.controlManager.setActive('visualblocks', !linkElm.disabled);
+ });
+
+ ed.addButton('visualblocks', {title : 'visualblocks.desc', cmd : 'mceVisualBlocks'});
+
+ ed.onInit.add(function() {
+ if (ed.settings.visualblocks_default_state) {
+ ed.execCommand('mceVisualBlocks', false, null, {skip_focus : true});
+ }
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Visual blocks',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualblocks',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('visualblocks', tinymce.plugins.VisualBlocks);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js
new file mode 100644
index 0000000..1a148e8
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.VisualChars",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceVisualChars",c._toggleVisualChars,c);a.addButton("visualchars",{title:"visualchars.desc",cmd:"mceVisualChars"});a.onBeforeGetContent.add(function(d,e){if(c.state&&e.format!="raw"&&!e.draft){c.state=true;c._toggleVisualChars(false)}})},getInfo:function(){return{longname:"Visual characters",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_toggleVisualChars:function(m){var p=this,k=p.editor,a,g,j,n=k.getDoc(),o=k.getBody(),l,q=k.selection,e,c,f;p.state=!p.state;k.controlManager.setActive("visualchars",p.state);if(m){f=q.getBookmark()}if(p.state){a=[];tinymce.walk(o,function(b){if(b.nodeType==3&&b.nodeValue&&b.nodeValue.indexOf("\u00a0")!=-1){a.push(b)}},"childNodes");for(g=0;g$1
');c=k.dom.create("div",null,l);while(node=c.lastChild){k.dom.insertAfter(node,a[g])}k.dom.remove(a[g])}}else{a=k.dom.select("span.mceItemNbsp",o);for(g=a.length-1;g>=0;g--){k.dom.remove(a[g],1)}}q.moveToBookmark(f)}});tinymce.PluginManager.add("visualchars",tinymce.plugins.VisualChars)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js
new file mode 100644
index 0000000..df98590
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/visualchars/editor_plugin_src.js
@@ -0,0 +1,83 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.VisualChars', {
+ init : function(ed, url) {
+ var t = this;
+
+ t.editor = ed;
+
+ // Register commands
+ ed.addCommand('mceVisualChars', t._toggleVisualChars, t);
+
+ // Register buttons
+ ed.addButton('visualchars', {title : 'visualchars.desc', cmd : 'mceVisualChars'});
+
+ ed.onBeforeGetContent.add(function(ed, o) {
+ if (t.state && o.format != 'raw' && !o.draft) {
+ t.state = true;
+ t._toggleVisualChars(false);
+ }
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Visual characters',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/visualchars',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ },
+
+ // Private methods
+
+ _toggleVisualChars : function(bookmark) {
+ var t = this, ed = t.editor, nl, i, h, d = ed.getDoc(), b = ed.getBody(), nv, s = ed.selection, bo, div, bm;
+
+ t.state = !t.state;
+ ed.controlManager.setActive('visualchars', t.state);
+
+ if (bookmark)
+ bm = s.getBookmark();
+
+ if (t.state) {
+ nl = [];
+ tinymce.walk(b, function(n) {
+ if (n.nodeType == 3 && n.nodeValue && n.nodeValue.indexOf('\u00a0') != -1)
+ nl.push(n);
+ }, 'childNodes');
+
+ for (i = 0; i < nl.length; i++) {
+ nv = nl[i].nodeValue;
+ nv = nv.replace(/(\u00a0)/g, '$1');
+
+ div = ed.dom.create('div', null, nv);
+ while (node = div.lastChild)
+ ed.dom.insertAfter(node, nl[i]);
+
+ ed.dom.remove(nl[i]);
+ }
+ } else {
+ nl = ed.dom.select('span.mceItemNbsp', b);
+
+ for (i = nl.length - 1; i >= 0; i--)
+ ed.dom.remove(nl[i], 1);
+ }
+
+ s.moveToBookmark(bm);
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('visualchars', tinymce.plugins.VisualChars);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js
new file mode 100644
index 0000000..42ece20
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.WordCount",{block:0,id:null,countre:null,cleanre:null,init:function(c,d){var e=this,f=0,g=tinymce.VK;e.countre=c.getParam("wordcount_countregex",/[\w\u2019\'-]+/g);e.cleanre=c.getParam("wordcount_cleanregex",/[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);e.update_rate=c.getParam("wordcount_update_rate",2000);e.update_on_delete=c.getParam("wordcount_update_on_delete",false);e.id=c.id+"-word-count";c.onPostRender.add(function(i,h){var j,k;k=i.getParam("wordcount_target_id");if(!k){j=tinymce.DOM.get(i.id+"_path_row");if(j){tinymce.DOM.add(j.parentNode,"div",{style:"float: right"},i.getLang("wordcount.words","Words: ")+'0')}}else{tinymce.DOM.add(k,"span",{},'0')}});c.onInit.add(function(h){h.selection.onSetContent.add(function(){e._count(h)});e._count(h)});c.onSetContent.add(function(h){e._count(h)});function b(h){return h!==f&&(h===g.ENTER||f===g.SPACEBAR||a(f))}function a(h){return h===g.DELETE||h===g.BACKSPACE}c.onKeyUp.add(function(h,i){if(b(i.keyCode)||e.update_on_delete&&a(i.keyCode)){e._count(h)}f=i.keyCode})},_getCount:function(c){var a=0;var b=c.getContent({format:"raw"});if(b){b=b.replace(/\.\.\./g," ");b=b.replace(/<.[^<>]*?>/g," ").replace(/ | /gi," ");b=b.replace(/(\w+)(&.+?;)+(\w+)/,"$1$3").replace(/&.+?;/g," ");b=b.replace(this.cleanre,"");var d=b.match(this.countre);if(d){a=d.length}}return a},_count:function(a){var b=this;if(b.block){return}b.block=1;setTimeout(function(){if(!a.destroyed){var c=b._getCount(a);tinymce.DOM.setHTML(b.id,c.toString());setTimeout(function(){b.block=0},b.update_rate)}},1)},getInfo:function(){return{longname:"Word Count plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("wordcount",tinymce.plugins.WordCount)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js
new file mode 100644
index 0000000..34b2655
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/wordcount/editor_plugin_src.js
@@ -0,0 +1,122 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.WordCount', {
+ block : 0,
+ id : null,
+ countre : null,
+ cleanre : null,
+
+ init : function(ed, url) {
+ var t = this, last = 0, VK = tinymce.VK;
+
+ t.countre = ed.getParam('wordcount_countregex', /[\w\u2019\'-]+/g); // u2019 == ’
+ t.cleanre = ed.getParam('wordcount_cleanregex', /[0-9.(),;:!?%#$?\'\"_+=\\\/-]*/g);
+ t.update_rate = ed.getParam('wordcount_update_rate', 2000);
+ t.update_on_delete = ed.getParam('wordcount_update_on_delete', false);
+ t.id = ed.id + '-word-count';
+
+ ed.onPostRender.add(function(ed, cm) {
+ var row, id;
+
+ // Add it to the specified id or the theme advanced path
+ id = ed.getParam('wordcount_target_id');
+ if (!id) {
+ row = tinymce.DOM.get(ed.id + '_path_row');
+
+ if (row)
+ tinymce.DOM.add(row.parentNode, 'div', {'style': 'float: right'}, ed.getLang('wordcount.words', 'Words: ') + '0');
+ } else {
+ tinymce.DOM.add(id, 'span', {}, '0');
+ }
+ });
+
+ ed.onInit.add(function(ed) {
+ ed.selection.onSetContent.add(function() {
+ t._count(ed);
+ });
+
+ t._count(ed);
+ });
+
+ ed.onSetContent.add(function(ed) {
+ t._count(ed);
+ });
+
+ function checkKeys(key) {
+ return key !== last && (key === VK.ENTER || last === VK.SPACEBAR || checkDelOrBksp(last));
+ }
+
+ function checkDelOrBksp(key) {
+ return key === VK.DELETE || key === VK.BACKSPACE;
+ }
+
+ ed.onKeyUp.add(function(ed, e) {
+ if (checkKeys(e.keyCode) || t.update_on_delete && checkDelOrBksp(e.keyCode)) {
+ t._count(ed);
+ }
+
+ last = e.keyCode;
+ });
+ },
+
+ _getCount : function(ed) {
+ var tc = 0;
+ var tx = ed.getContent({ format: 'raw' });
+
+ if (tx) {
+ tx = tx.replace(/\.\.\./g, ' '); // convert ellipses to spaces
+ tx = tx.replace(/<.[^<>]*?>/g, ' ').replace(/ | /gi, ' '); // remove html tags and space chars
+
+ // deal with html entities
+ tx = tx.replace(/(\w+)(&.+?;)+(\w+)/, "$1$3").replace(/&.+?;/g, ' ');
+ tx = tx.replace(this.cleanre, ''); // remove numbers and punctuation
+
+ var wordArray = tx.match(this.countre);
+ if (wordArray) {
+ tc = wordArray.length;
+ }
+ }
+
+ return tc;
+ },
+
+ _count : function(ed) {
+ var t = this;
+
+ // Keep multiple calls from happening at the same time
+ if (t.block)
+ return;
+
+ t.block = 1;
+
+ setTimeout(function() {
+ if (!ed.destroyed) {
+ var tc = t._getCount(ed);
+ tinymce.DOM.setHTML(t.id, tc.toString());
+ setTimeout(function() {t.block = 0;}, t.update_rate);
+ }
+ }, 1);
+ },
+
+ getInfo: function() {
+ return {
+ longname : 'Word Count plugin',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/wordcount',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ tinymce.PluginManager.add('wordcount', tinymce.plugins.WordCount);
+})();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm
new file mode 100644
index 0000000..30a894f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/abbr.htm
@@ -0,0 +1,142 @@
+
+
+
+ {#xhtmlxtras_dlg.title_abbr_element}
+
+
+
+
+
+
+
+
+
+{#xhtmlxtras_dlg.title_abbr_element}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm
new file mode 100644
index 0000000..c109345
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/acronym.htm
@@ -0,0 +1,142 @@
+
+
+
+ {#xhtmlxtras_dlg.title_acronym_element}
+
+
+
+
+
+
+
+
+
+{#xhtmlxtras_dlg.title_acronym_element}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm
new file mode 100644
index 0000000..e8d606a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/attributes.htm
@@ -0,0 +1,149 @@
+
+
+
+ {#xhtmlxtras_dlg.attribs_title}
+
+
+
+
+
+
+
+
+{#xhtmlxtras_dlg.attribs_title}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm
new file mode 100644
index 0000000..0ac6bdb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/cite.htm
@@ -0,0 +1,142 @@
+
+
+
+ {#xhtmlxtras_dlg.title_cite_element}
+
+
+
+
+
+
+
+
+
+{#xhtmlxtras_dlg.title_cite_element}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css
new file mode 100644
index 0000000..9a6a235
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/attributes.css
@@ -0,0 +1,11 @@
+.panel_wrapper div.current {
+ height: 290px;
+}
+
+#id, #style, #title, #dir, #hreflang, #lang, #classlist, #tabindex, #accesskey {
+ width: 200px;
+}
+
+#events_panel input {
+ width: 200px;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css
new file mode 100644
index 0000000..e67114d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/css/popup.css
@@ -0,0 +1,9 @@
+input.field, select.field {width:200px;}
+input.picker {width:179px; margin-left: 5px;}
+input.disabled {border-color:#F2F2F2;}
+img.picker {vertical-align:text-bottom; cursor:pointer;}
+h1 {padding: 0 0 5px 0;}
+.panel_wrapper div.current {height:160px;}
+#xhtmlxtrasdel .panel_wrapper div.current, #xhtmlxtrasins .panel_wrapper div.current {height: 230px;}
+a.browse span {display:block; width:20px; height:20px; background:url('../../../themes/advanced/img/icons.gif') -140px -20px;}
+#datetime {width:180px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm
new file mode 100644
index 0000000..5f66751
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/del.htm
@@ -0,0 +1,162 @@
+
+
+
+ {#xhtmlxtras_dlg.title_del_element}
+
+
+
+
+
+
+
+
+
+{#xhtmlxtras_dlg.title_del_element}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js
new file mode 100644
index 0000000..9b98a51
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.XHTMLXtrasPlugin",{init:function(a,b){a.addCommand("mceCite",function(){a.windowManager.open({file:b+"/cite.htm",width:350+parseInt(a.getLang("xhtmlxtras.cite_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.cite_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAcronym",function(){a.windowManager.open({file:b+"/acronym.htm",width:350+parseInt(a.getLang("xhtmlxtras.acronym_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.acronym_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAbbr",function(){a.windowManager.open({file:b+"/abbr.htm",width:350+parseInt(a.getLang("xhtmlxtras.abbr_delta_width",0)),height:250+parseInt(a.getLang("xhtmlxtras.abbr_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceDel",function(){a.windowManager.open({file:b+"/del.htm",width:340+parseInt(a.getLang("xhtmlxtras.del_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.del_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceIns",function(){a.windowManager.open({file:b+"/ins.htm",width:340+parseInt(a.getLang("xhtmlxtras.ins_delta_width",0)),height:310+parseInt(a.getLang("xhtmlxtras.ins_delta_height",0)),inline:1},{plugin_url:b})});a.addCommand("mceAttributes",function(){a.windowManager.open({file:b+"/attributes.htm",width:380+parseInt(a.getLang("xhtmlxtras.attr_delta_width",0)),height:370+parseInt(a.getLang("xhtmlxtras.attr_delta_height",0)),inline:1},{plugin_url:b})});a.addButton("cite",{title:"xhtmlxtras.cite_desc",cmd:"mceCite"});a.addButton("acronym",{title:"xhtmlxtras.acronym_desc",cmd:"mceAcronym"});a.addButton("abbr",{title:"xhtmlxtras.abbr_desc",cmd:"mceAbbr"});a.addButton("del",{title:"xhtmlxtras.del_desc",cmd:"mceDel"});a.addButton("ins",{title:"xhtmlxtras.ins_desc",cmd:"mceIns"});a.addButton("attribs",{title:"xhtmlxtras.attribs_desc",cmd:"mceAttributes"});a.onNodeChange.add(function(d,c,f,e){f=d.dom.getParent(f,"CITE,ACRONYM,ABBR,DEL,INS");c.setDisabled("cite",e);c.setDisabled("acronym",e);c.setDisabled("abbr",e);c.setDisabled("del",e);c.setDisabled("ins",e);c.setDisabled("attribs",f&&f.nodeName=="BODY");c.setActive("cite",0);c.setActive("acronym",0);c.setActive("abbr",0);c.setActive("del",0);c.setActive("ins",0);if(f){do{c.setDisabled(f.nodeName.toLowerCase(),0);c.setActive(f.nodeName.toLowerCase(),1)}while(f=f.parentNode)}});a.onPreInit.add(function(){a.dom.create("abbr")})},getInfo:function(){return{longname:"XHTML Xtras Plugin",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.PluginManager.add("xhtmlxtras",tinymce.plugins.XHTMLXtrasPlugin)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js
new file mode 100644
index 0000000..f240572
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/editor_plugin_src.js
@@ -0,0 +1,132 @@
+/**
+ * editor_plugin_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ tinymce.create('tinymce.plugins.XHTMLXtrasPlugin', {
+ init : function(ed, url) {
+ // Register commands
+ ed.addCommand('mceCite', function() {
+ ed.windowManager.open({
+ file : url + '/cite.htm',
+ width : 350 + parseInt(ed.getLang('xhtmlxtras.cite_delta_width', 0)),
+ height : 250 + parseInt(ed.getLang('xhtmlxtras.cite_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ ed.addCommand('mceAcronym', function() {
+ ed.windowManager.open({
+ file : url + '/acronym.htm',
+ width : 350 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_width', 0)),
+ height : 250 + parseInt(ed.getLang('xhtmlxtras.acronym_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ ed.addCommand('mceAbbr', function() {
+ ed.windowManager.open({
+ file : url + '/abbr.htm',
+ width : 350 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_width', 0)),
+ height : 250 + parseInt(ed.getLang('xhtmlxtras.abbr_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ ed.addCommand('mceDel', function() {
+ ed.windowManager.open({
+ file : url + '/del.htm',
+ width : 340 + parseInt(ed.getLang('xhtmlxtras.del_delta_width', 0)),
+ height : 310 + parseInt(ed.getLang('xhtmlxtras.del_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ ed.addCommand('mceIns', function() {
+ ed.windowManager.open({
+ file : url + '/ins.htm',
+ width : 340 + parseInt(ed.getLang('xhtmlxtras.ins_delta_width', 0)),
+ height : 310 + parseInt(ed.getLang('xhtmlxtras.ins_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ ed.addCommand('mceAttributes', function() {
+ ed.windowManager.open({
+ file : url + '/attributes.htm',
+ width : 380 + parseInt(ed.getLang('xhtmlxtras.attr_delta_width', 0)),
+ height : 370 + parseInt(ed.getLang('xhtmlxtras.attr_delta_height', 0)),
+ inline : 1
+ }, {
+ plugin_url : url
+ });
+ });
+
+ // Register buttons
+ ed.addButton('cite', {title : 'xhtmlxtras.cite_desc', cmd : 'mceCite'});
+ ed.addButton('acronym', {title : 'xhtmlxtras.acronym_desc', cmd : 'mceAcronym'});
+ ed.addButton('abbr', {title : 'xhtmlxtras.abbr_desc', cmd : 'mceAbbr'});
+ ed.addButton('del', {title : 'xhtmlxtras.del_desc', cmd : 'mceDel'});
+ ed.addButton('ins', {title : 'xhtmlxtras.ins_desc', cmd : 'mceIns'});
+ ed.addButton('attribs', {title : 'xhtmlxtras.attribs_desc', cmd : 'mceAttributes'});
+
+ ed.onNodeChange.add(function(ed, cm, n, co) {
+ n = ed.dom.getParent(n, 'CITE,ACRONYM,ABBR,DEL,INS');
+
+ cm.setDisabled('cite', co);
+ cm.setDisabled('acronym', co);
+ cm.setDisabled('abbr', co);
+ cm.setDisabled('del', co);
+ cm.setDisabled('ins', co);
+ cm.setDisabled('attribs', n && n.nodeName == 'BODY');
+ cm.setActive('cite', 0);
+ cm.setActive('acronym', 0);
+ cm.setActive('abbr', 0);
+ cm.setActive('del', 0);
+ cm.setActive('ins', 0);
+
+ // Activate all
+ if (n) {
+ do {
+ cm.setDisabled(n.nodeName.toLowerCase(), 0);
+ cm.setActive(n.nodeName.toLowerCase(), 1);
+ } while (n = n.parentNode);
+ }
+ });
+
+ ed.onPreInit.add(function() {
+ // Fixed IE issue where it can't handle these elements correctly
+ ed.dom.create('abbr');
+ });
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'XHTML Xtras Plugin',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/xhtmlxtras',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ };
+ }
+ });
+
+ // Register plugin
+ tinymce.PluginManager.add('xhtmlxtras', tinymce.plugins.XHTMLXtrasPlugin);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm
new file mode 100644
index 0000000..d001ac7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/ins.htm
@@ -0,0 +1,162 @@
+
+
+
+ {#xhtmlxtras_dlg.title_ins_element}
+
+
+
+
+
+
+
+
+
+{#xhtmlxtras_dlg.title_ins_element}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js
new file mode 100644
index 0000000..4b51a25
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/abbr.js
@@ -0,0 +1,28 @@
+/**
+ * abbr.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+function init() {
+ SXE.initElementDialog('abbr');
+ if (SXE.currentAction == "update") {
+ SXE.showRemoveButton();
+ }
+}
+
+function insertAbbr() {
+ SXE.insertElement('abbr');
+ tinyMCEPopup.close();
+}
+
+function removeAbbr() {
+ SXE.removeElement('abbr');
+ tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js
new file mode 100644
index 0000000..6ec2f88
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/acronym.js
@@ -0,0 +1,28 @@
+/**
+ * acronym.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+function init() {
+ SXE.initElementDialog('acronym');
+ if (SXE.currentAction == "update") {
+ SXE.showRemoveButton();
+ }
+}
+
+function insertAcronym() {
+ SXE.insertElement('acronym');
+ tinyMCEPopup.close();
+}
+
+function removeAcronym() {
+ SXE.removeElement('acronym');
+ tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js
new file mode 100644
index 0000000..9c99995
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/attributes.js
@@ -0,0 +1,111 @@
+/**
+ * attributes.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+function init() {
+ tinyMCEPopup.resizeToInnerSize();
+ var inst = tinyMCEPopup.editor;
+ var dom = inst.dom;
+ var elm = inst.selection.getNode();
+ var f = document.forms[0];
+ var onclick = dom.getAttrib(elm, 'onclick');
+
+ setFormValue('title', dom.getAttrib(elm, 'title'));
+ setFormValue('id', dom.getAttrib(elm, 'id'));
+ setFormValue('style', dom.getAttrib(elm, "style"));
+ setFormValue('dir', dom.getAttrib(elm, 'dir'));
+ setFormValue('lang', dom.getAttrib(elm, 'lang'));
+ setFormValue('tabindex', dom.getAttrib(elm, 'tabindex', typeof(elm.tabindex) != "undefined" ? elm.tabindex : ""));
+ setFormValue('accesskey', dom.getAttrib(elm, 'accesskey', typeof(elm.accesskey) != "undefined" ? elm.accesskey : ""));
+ setFormValue('onfocus', dom.getAttrib(elm, 'onfocus'));
+ setFormValue('onblur', dom.getAttrib(elm, 'onblur'));
+ setFormValue('onclick', onclick);
+ setFormValue('ondblclick', dom.getAttrib(elm, 'ondblclick'));
+ setFormValue('onmousedown', dom.getAttrib(elm, 'onmousedown'));
+ setFormValue('onmouseup', dom.getAttrib(elm, 'onmouseup'));
+ setFormValue('onmouseover', dom.getAttrib(elm, 'onmouseover'));
+ setFormValue('onmousemove', dom.getAttrib(elm, 'onmousemove'));
+ setFormValue('onmouseout', dom.getAttrib(elm, 'onmouseout'));
+ setFormValue('onkeypress', dom.getAttrib(elm, 'onkeypress'));
+ setFormValue('onkeydown', dom.getAttrib(elm, 'onkeydown'));
+ setFormValue('onkeyup', dom.getAttrib(elm, 'onkeyup'));
+ className = dom.getAttrib(elm, 'class');
+
+ addClassesToList('classlist', 'advlink_styles');
+ selectByValue(f, 'classlist', className, true);
+
+ TinyMCE_EditableSelects.init();
+}
+
+function setFormValue(name, value) {
+ if(value && document.forms[0].elements[name]){
+ document.forms[0].elements[name].value = value;
+ }
+}
+
+function insertAction() {
+ var inst = tinyMCEPopup.editor;
+ var elm = inst.selection.getNode();
+
+ setAllAttribs(elm);
+ tinyMCEPopup.execCommand("mceEndUndoLevel");
+ tinyMCEPopup.close();
+}
+
+function setAttrib(elm, attrib, value) {
+ var formObj = document.forms[0];
+ var valueElm = formObj.elements[attrib.toLowerCase()];
+ var inst = tinyMCEPopup.editor;
+ var dom = inst.dom;
+
+ if (typeof(value) == "undefined" || value == null) {
+ value = "";
+
+ if (valueElm)
+ value = valueElm.value;
+ }
+
+ dom.setAttrib(elm, attrib.toLowerCase(), value);
+}
+
+function setAllAttribs(elm) {
+ var f = document.forms[0];
+
+ setAttrib(elm, 'title');
+ setAttrib(elm, 'id');
+ setAttrib(elm, 'style');
+ setAttrib(elm, 'class', getSelectValue(f, 'classlist'));
+ setAttrib(elm, 'dir');
+ setAttrib(elm, 'lang');
+ setAttrib(elm, 'tabindex');
+ setAttrib(elm, 'accesskey');
+ setAttrib(elm, 'onfocus');
+ setAttrib(elm, 'onblur');
+ setAttrib(elm, 'onclick');
+ setAttrib(elm, 'ondblclick');
+ setAttrib(elm, 'onmousedown');
+ setAttrib(elm, 'onmouseup');
+ setAttrib(elm, 'onmouseover');
+ setAttrib(elm, 'onmousemove');
+ setAttrib(elm, 'onmouseout');
+ setAttrib(elm, 'onkeypress');
+ setAttrib(elm, 'onkeydown');
+ setAttrib(elm, 'onkeyup');
+
+ // Refresh in old MSIE
+// if (tinyMCE.isMSIE5)
+// elm.outerHTML = elm.outerHTML;
+}
+
+function insertAttribute() {
+ tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
+tinyMCEPopup.requireLangPack();
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js
new file mode 100644
index 0000000..009b715
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/cite.js
@@ -0,0 +1,28 @@
+/**
+ * cite.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+function init() {
+ SXE.initElementDialog('cite');
+ if (SXE.currentAction == "update") {
+ SXE.showRemoveButton();
+ }
+}
+
+function insertCite() {
+ SXE.insertElement('cite');
+ tinyMCEPopup.close();
+}
+
+function removeCite() {
+ SXE.removeElement('cite');
+ tinyMCEPopup.close();
+}
+
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js
new file mode 100644
index 0000000..1f957dc
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/del.js
@@ -0,0 +1,53 @@
+/**
+ * del.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+function init() {
+ SXE.initElementDialog('del');
+ if (SXE.currentAction == "update") {
+ setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));
+ setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));
+ SXE.showRemoveButton();
+ }
+}
+
+function setElementAttribs(elm) {
+ setAllCommonAttribs(elm);
+ setAttrib(elm, 'datetime');
+ setAttrib(elm, 'cite');
+ elm.removeAttribute('data-mce-new');
+}
+
+function insertDel() {
+ var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'DEL');
+
+ if (elm == null) {
+ var s = SXE.inst.selection.getContent();
+ if(s.length > 0) {
+ insertInlineElement('del');
+ var elementArray = SXE.inst.dom.select('del[data-mce-new]');
+ for (var i=0; i 0) {
+ tagName = element_name;
+
+ insertInlineElement(element_name);
+ var elementArray = tinymce.grep(SXE.inst.dom.select(element_name));
+ for (var i=0; i -1) ? true : false;
+}
+
+SXE.removeClass = function(elm,cl) {
+ if(elm.className == null || elm.className == "" || !SXE.containsClass(elm,cl)) {
+ return true;
+ }
+ var classNames = elm.className.split(" ");
+ var newClassNames = "";
+ for (var x = 0, cnl = classNames.length; x < cnl; x++) {
+ if (classNames[x] != cl) {
+ newClassNames += (classNames[x] + " ");
+ }
+ }
+ elm.className = newClassNames.substring(0,newClassNames.length-1); //removes extra space at the end
+}
+
+SXE.addClass = function(elm,cl) {
+ if(!SXE.containsClass(elm,cl)) elm.className ? elm.className += " " + cl : elm.className = cl;
+ return true;
+}
+
+function insertInlineElement(en) {
+ var ed = tinyMCEPopup.editor, dom = ed.dom;
+
+ ed.getDoc().execCommand('FontName', false, 'mceinline');
+ tinymce.each(dom.select('span,font'), function(n) {
+ if (n.style.fontFamily == 'mceinline' || n.face == 'mceinline')
+ dom.replace(dom.create(en, {'data-mce-new' : 1}), n, 1);
+ });
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js
new file mode 100644
index 0000000..c4addfb
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/plugins/xhtmlxtras/js/ins.js
@@ -0,0 +1,53 @@
+/**
+ * ins.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+function init() {
+ SXE.initElementDialog('ins');
+ if (SXE.currentAction == "update") {
+ setFormValue('datetime', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'datetime'));
+ setFormValue('cite', tinyMCEPopup.editor.dom.getAttrib(SXE.updateElement, 'cite'));
+ SXE.showRemoveButton();
+ }
+}
+
+function setElementAttribs(elm) {
+ setAllCommonAttribs(elm);
+ setAttrib(elm, 'datetime');
+ setAttrib(elm, 'cite');
+ elm.removeAttribute('data-mce-new');
+}
+
+function insertIns() {
+ var elm = tinyMCEPopup.editor.dom.getParent(SXE.focusElement, 'INS');
+
+ if (elm == null) {
+ var s = SXE.inst.selection.getContent();
+ if(s.length > 0) {
+ insertInlineElement('ins');
+ var elementArray = SXE.inst.dom.select('ins[data-mce-new]');
+ for (var i=0; i
+
+
+ {#advanced_dlg.about_title}
+
+
+
+
+
+
+
+
+
+
{#advanced_dlg.about_title}
+
Version: ()
+
TinyMCE is a platform independent web based Javascript HTML WYSIWYG editor control released as Open Source under LGPL
+ by Moxiecode Systems AB. It has the ability to convert HTML TEXTAREA fields or other HTML elements to editor instances.
+
Copyright © 2003-2008, Moxiecode Systems AB, All rights reserved.
+
For more information about this software visit the TinyMCE website.
+
+
+
+
+
+
+
{#advanced_dlg.about_loaded}
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm
new file mode 100644
index 0000000..75c93b7
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/anchor.htm
@@ -0,0 +1,26 @@
+
+
+
+ {#advanced_dlg.anchor_title}
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm
new file mode 100644
index 0000000..00ab086
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/charmap.htm
@@ -0,0 +1,55 @@
+
+
+
+ {#advanced_dlg.charmap_title}
+
+
+
+
+
+
+ |
+
+
+ |
+
+ |
+
+
+ |
+
+
+
+
+
+ |
+
+
+ | |
+
+
+ | |
+
+
+ |
+
+
+ | |
+
+
+ |
+
+
+ | {#advanced_dlg.charmap_usage} |
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm
new file mode 100644
index 0000000..b625531
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/color_picker.htm
@@ -0,0 +1,70 @@
+
+
+
+ {#advanced_dlg.colorpicker_title}
+
+
+
+
+
+ {#advanced_dlg.colorpicker_title}
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js
new file mode 100644
index 0000000..4b8d563
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template.js
@@ -0,0 +1 @@
+(function(h){var i=h.DOM,g=h.dom.Event,c=h.extend,f=h.each,a=h.util.Cookie,e,d=h.explode;function b(p,m){var k,l,o=p.dom,j="",n,r;previewStyles=p.settings.preview_styles;if(previewStyles===false){return""}if(!previewStyles){previewStyles="font-family font-size font-weight text-decoration text-transform color background-color"}function q(s){return s.replace(/%(\w+)/g,"")}k=m.block||m.inline||"span";l=o.create(k);f(m.styles,function(t,s){t=q(t);if(t){o.setStyle(l,s,t)}});f(m.attributes,function(t,s){t=q(t);if(t){o.setAttrib(l,s,t)}});f(m.classes,function(s){s=q(s);if(!o.hasClass(l,s)){o.addClass(l,s)}});o.setStyles(l,{position:"absolute",left:-65535});p.getBody().appendChild(l);n=o.getStyle(p.getBody(),"fontSize",true);n=/px$/.test(n)?parseInt(n,10):0;f(previewStyles.split(" "),function(s){var t=o.getStyle(l,s,true);if(s=="background-color"&&/transparent|rgba\s*\([^)]+,\s*0\)/.test(t)){t=o.getStyle(p.getBody(),s,true);if(o.toHex(t).toLowerCase()=="#ffffff"){return}}if(s=="font-size"){if(/em|%$/.test(t)){if(n===0){return}t=parseFloat(t,10)/(/%$/.test(t)?100:1);t=(t*n)+"px"}}j+=s+":"+t+";"});o.remove(l);return j}h.ThemeManager.requireLangPack("advanced");h.create("tinymce.themes.AdvancedTheme",{sizes:[8,10,12,14,18,24,36],controls:{bold:["bold_desc","Bold"],italic:["italic_desc","Italic"],underline:["underline_desc","Underline"],strikethrough:["striketrough_desc","Strikethrough"],justifyleft:["justifyleft_desc","JustifyLeft"],justifycenter:["justifycenter_desc","JustifyCenter"],justifyright:["justifyright_desc","JustifyRight"],justifyfull:["justifyfull_desc","JustifyFull"],bullist:["bullist_desc","InsertUnorderedList"],numlist:["numlist_desc","InsertOrderedList"],outdent:["outdent_desc","Outdent"],indent:["indent_desc","Indent"],cut:["cut_desc","Cut"],copy:["copy_desc","Copy"],paste:["paste_desc","Paste"],undo:["undo_desc","Undo"],redo:["redo_desc","Redo"],link:["link_desc","mceLink"],unlink:["unlink_desc","unlink"],image:["image_desc","mceImage"],cleanup:["cleanup_desc","mceCleanup"],help:["help_desc","mceHelp"],code:["code_desc","mceCodeEditor"],hr:["hr_desc","InsertHorizontalRule"],removeformat:["removeformat_desc","RemoveFormat"],sub:["sub_desc","subscript"],sup:["sup_desc","superscript"],forecolor:["forecolor_desc","ForeColor"],forecolorpicker:["forecolor_desc","mceForeColor"],backcolor:["backcolor_desc","HiliteColor"],backcolorpicker:["backcolor_desc","mceBackColor"],charmap:["charmap_desc","mceCharMap"],visualaid:["visualaid_desc","mceToggleVisualAid"],anchor:["anchor_desc","mceInsertAnchor"],newdocument:["newdocument_desc","mceNewDocument"],blockquote:["blockquote_desc","mceBlockQuote"]},stateControls:["bold","italic","underline","strikethrough","bullist","numlist","justifyleft","justifycenter","justifyright","justifyfull","sub","sup","blockquote"],init:function(k,l){var m=this,n,j,p;m.editor=k;m.url=l;m.onResolveName=new h.util.Dispatcher(this);n=k.settings;k.forcedHighContrastMode=k.settings.detect_highcontrast&&m._isHighContrast();k.settings.skin=k.forcedHighContrastMode?"highcontrast":k.settings.skin;if(!n.theme_advanced_buttons1){n=c({theme_advanced_buttons1:"bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",theme_advanced_buttons2:"bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",theme_advanced_buttons3:"hr,removeformat,visualaid,|,sub,sup,|,charmap"},n)}m.settings=n=c({theme_advanced_path:true,theme_advanced_toolbar_location:"top",theme_advanced_blockformats:"p,address,pre,h1,h2,h3,h4,h5,h6",theme_advanced_toolbar_align:"left",theme_advanced_statusbar_location:"bottom",theme_advanced_fonts:"Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",theme_advanced_more_colors:1,theme_advanced_row_height:23,theme_advanced_resize_horizontal:1,theme_advanced_resizing_use_cookie:1,theme_advanced_font_sizes:"1,2,3,4,5,6,7",theme_advanced_font_selector:"span",theme_advanced_show_current_color:0,readonly:k.settings.readonly},n);if(!n.font_size_style_values){n.font_size_style_values="8pt,10pt,12pt,14pt,18pt,24pt,36pt"}if(h.is(n.theme_advanced_font_sizes,"string")){n.font_size_style_values=h.explode(n.font_size_style_values);n.font_size_classes=h.explode(n.font_size_classes||"");p={};k.settings.theme_advanced_font_sizes=n.theme_advanced_font_sizes;f(k.getParam("theme_advanced_font_sizes","","hash"),function(r,q){var o;if(q==r&&r>=1&&r<=7){q=r+" ("+m.sizes[r-1]+"pt)";o=n.font_size_classes[r-1];r=n.font_size_style_values[r-1]||(m.sizes[r-1]+"pt")}if(/^\s*\./.test(r)){o=r.replace(/\./g,"")}p[q]=o?{"class":o}:{fontSize:r}});n.theme_advanced_font_sizes=p}if((j=n.theme_advanced_path_location)&&j!="none"){n.theme_advanced_statusbar_location=n.theme_advanced_path_location}if(n.theme_advanced_statusbar_location=="none"){n.theme_advanced_statusbar_location=0}if(k.settings.content_css!==false){k.contentCSS.push(k.baseURI.toAbsolute(l+"/skins/"+k.settings.skin+"/content.css"))}k.onInit.add(function(){if(!k.settings.readonly){k.onNodeChange.add(m._nodeChanged,m);k.onKeyUp.add(m._updateUndoStatus,m);k.onMouseUp.add(m._updateUndoStatus,m);k.dom.bind(k.dom.getRoot(),"dragend",function(){m._updateUndoStatus(k)})}});k.onSetProgressState.add(function(r,o,s){var t,u=r.id,q;if(o){m.progressTimer=setTimeout(function(){t=r.getContainer();t=t.insertBefore(i.create("DIV",{style:"position:relative"}),t.firstChild);q=i.get(r.id+"_tbl");i.add(t,"div",{id:u+"_blocker","class":"mceBlocker",style:{width:q.clientWidth+2,height:q.clientHeight+2}});i.add(t,"div",{id:u+"_progress","class":"mceProgress",style:{left:q.clientWidth/2,top:q.clientHeight/2}})},s||0)}else{i.remove(u+"_blocker");i.remove(u+"_progress");clearTimeout(m.progressTimer)}});i.loadCSS(n.editor_css?k.documentBaseURI.toAbsolute(n.editor_css):l+"/skins/"+k.settings.skin+"/ui.css");if(n.skin_variant){i.loadCSS(l+"/skins/"+k.settings.skin+"/ui_"+n.skin_variant+".css")}},_isHighContrast:function(){var j,k=i.add(i.getRoot(),"div",{style:"background-color: rgb(171,239,86);"});j=(i.getStyle(k,"background-color",true)+"").toLowerCase().replace(/ /g,"");i.remove(k);return j!="rgb(171,239,86)"&&j!="#abef56"},createControl:function(m,j){var k,l;if(l=j.createControl(m)){return l}switch(m){case"styleselect":return this._createStyleSelect();case"formatselect":return this._createBlockFormats();case"fontselect":return this._createFontSelect();case"fontsizeselect":return this._createFontSizeSelect();case"forecolor":return this._createForeColorMenu();case"backcolor":return this._createBackColorMenu()}if((k=this.controls[m])){return j.createButton(m,{title:"advanced."+k[0],cmd:k[1],ui:k[2],value:k[3]})}},execCommand:function(l,k,m){var j=this["_"+l];if(j){j.call(this,k,m);return true}return false},_importClasses:function(l){var j=this.editor,k=j.controlManager.get("styleselect");if(k.getLength()==0){f(j.dom.getClasses(),function(q,m){var p="style_"+m,n;n={inline:"span",attributes:{"class":q["class"]},selector:"*"};j.formatter.register(p,n);k.add(q["class"],p,{style:function(){return b(j,n)}})})}},_createStyleSelect:function(o){var l=this,j=l.editor,k=j.controlManager,m;m=k.createListBox("styleselect",{title:"advanced.style_select",onselect:function(q){var r,n=[],p;f(m.items,function(s){n.push(s.value)});j.focus();j.undoManager.add();r=j.formatter.matchAll(n);h.each(r,function(s){if(!q||s==q){if(s){j.formatter.remove(s)}p=true}});if(!p){j.formatter.apply(q)}j.undoManager.add();j.nodeChanged();return false}});j.onPreInit.add(function(){var p=0,n=j.getParam("style_formats");if(n){f(n,function(q){var r,s=0;f(q,function(){s++});if(s>1){r=q.name=q.name||"style_"+(p++);j.formatter.register(r,q);m.add(q.title,r,{style:function(){return b(j,q)}})}else{m.add(q.title)}})}else{f(j.getParam("theme_advanced_styles","","hash"),function(t,s){var r,q;if(t){r="style_"+(p++);q={inline:"span",classes:t,selector:"*"};j.formatter.register(r,q);m.add(l.editor.translate(s),r,{style:function(){return b(j,q)}})}})}});if(m.getLength()==0){m.onPostRender.add(function(p,q){if(!m.NativeListBox){g.add(q.id+"_text","focus",l._importClasses,l);g.add(q.id+"_text","mousedown",l._importClasses,l);g.add(q.id+"_open","focus",l._importClasses,l);g.add(q.id+"_open","mousedown",l._importClasses,l)}else{g.add(q.id,"focus",l._importClasses,l)}})}return m},_createFontSelect:function(){var l,k=this,j=k.editor;l=j.controlManager.createListBox("fontselect",{title:"advanced.fontdefault",onselect:function(m){var n=l.items[l.selectedIndex];if(!m&&n){j.execCommand("FontName",false,n.value);return}j.execCommand("FontName",false,m);l.select(function(o){return m==o});if(n&&n.value==m){l.select(null)}return false}});if(l){f(j.getParam("theme_advanced_fonts",k.settings.theme_advanced_fonts,"hash"),function(n,m){l.add(j.translate(m),n,{style:n.indexOf("dings")==-1?"font-family:"+n:""})})}return l},_createFontSizeSelect:function(){var m=this,k=m.editor,n,l=0,j=[];n=k.controlManager.createListBox("fontsizeselect",{title:"advanced.font_size",onselect:function(o){var p=n.items[n.selectedIndex];if(!o&&p){p=p.value;if(p["class"]){k.formatter.toggle("fontsize_class",{value:p["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,p.fontSize)}return}if(o["class"]){k.focus();k.undoManager.add();k.formatter.toggle("fontsize_class",{value:o["class"]});k.undoManager.add();k.nodeChanged()}else{k.execCommand("FontSize",false,o.fontSize)}n.select(function(q){return o==q});if(p&&(p.value.fontSize==o.fontSize||p.value["class"]&&p.value["class"]==o["class"])){n.select(null)}return false}});if(n){f(m.settings.theme_advanced_font_sizes,function(p,o){var q=p.fontSize;if(q>=1&&q<=7){q=m.sizes[parseInt(q)-1]+"pt"}n.add(o,p,{style:"font-size:"+q,"class":"mceFontSize"+(l++)+(" "+(p["class"]||""))})})}return n},_createBlockFormats:function(){var l,j={p:"advanced.paragraph",address:"advanced.address",pre:"advanced.pre",h1:"advanced.h1",h2:"advanced.h2",h3:"advanced.h3",h4:"advanced.h4",h5:"advanced.h5",h6:"advanced.h6",div:"advanced.div",blockquote:"advanced.blockquote",code:"advanced.code",dt:"advanced.dt",dd:"advanced.dd",samp:"advanced.samp"},k=this;l=k.editor.controlManager.createListBox("formatselect",{title:"advanced.block",onselect:function(m){k.editor.execCommand("FormatBlock",false,m);return false}});if(l){f(k.editor.getParam("theme_advanced_blockformats",k.settings.theme_advanced_blockformats,"hash"),function(n,m){l.add(k.editor.translate(m!=n?m:j[n]),n,{"class":"mce_formatPreview mce_"+n,style:function(){return b(k.editor,{block:n})}})})}return l},_createForeColorMenu:function(){var n,k=this,l=k.settings,m={},j;if(l.theme_advanced_more_colors){m.more_colors_func=function(){k._mceColorPicker(0,{color:n.value,func:function(o){n.setColor(o)}})}}if(j=l.theme_advanced_text_colors){m.colors=j}if(l.theme_advanced_default_foreground_color){m.default_color=l.theme_advanced_default_foreground_color}m.title="advanced.forecolor_desc";m.cmd="ForeColor";m.scope=this;n=k.editor.controlManager.createColorSplitButton("forecolor",m);return n},_createBackColorMenu:function(){var n,k=this,l=k.settings,m={},j;if(l.theme_advanced_more_colors){m.more_colors_func=function(){k._mceColorPicker(0,{color:n.value,func:function(o){n.setColor(o)}})}}if(j=l.theme_advanced_background_colors){m.colors=j}if(l.theme_advanced_default_background_color){m.default_color=l.theme_advanced_default_background_color}m.title="advanced.backcolor_desc";m.cmd="HiliteColor";m.scope=this;n=k.editor.controlManager.createColorSplitButton("backcolor",m);return n},renderUI:function(l){var q,m,r,w=this,u=w.editor,x=w.settings,v,k,j;if(u.settings){u.settings.aria_label=x.aria_label+u.getLang("advanced.help_shortcut")}q=k=i.create("span",{role:"application","aria-labelledby":u.id+"_voice",id:u.id+"_parent","class":"mceEditor "+u.settings.skin+"Skin"+(x.skin_variant?" "+u.settings.skin+"Skin"+w._ufirst(x.skin_variant):"")+(u.settings.directionality=="rtl"?" mceRtl":"")});i.add(q,"span",{"class":"mceVoiceLabel",style:"display:none;",id:u.id+"_voice"},x.aria_label);if(!i.boxModel){q=i.add(q,"div",{"class":"mceOldBoxModel"})}q=v=i.add(q,"table",{role:"presentation",id:u.id+"_tbl","class":"mceLayout",cellSpacing:0,cellPadding:0});q=r=i.add(q,"tbody");switch((x.theme_advanced_layout_manager||"").toLowerCase()){case"rowlayout":m=w._rowLayout(x,r,l);break;case"customlayout":m=u.execCallback("theme_advanced_custom_layout",x,r,l,k);break;default:m=w._simpleLayout(x,r,l,k)}q=l.targetNode;j=v.rows;i.addClass(j[0],"mceFirst");i.addClass(j[j.length-1],"mceLast");f(i.select("tr",r),function(o){i.addClass(o.firstChild,"mceFirst");i.addClass(o.childNodes[o.childNodes.length-1],"mceLast")});if(i.get(x.theme_advanced_toolbar_container)){i.get(x.theme_advanced_toolbar_container).appendChild(k)}else{i.insertAfter(k,q)}g.add(u.id+"_path_row","click",function(n){n=n.target;if(n.nodeName=="A"){w._sel(n.className.replace(/^.*mcePath_([0-9]+).*$/,"$1"));return false}});if(!u.getParam("accessibility_focus")){g.add(i.add(k,"a",{href:"#"},""),"focus",function(){tinyMCE.get(u.id).focus()})}if(x.theme_advanced_toolbar_location=="external"){l.deltaHeight=0}w.deltaHeight=l.deltaHeight;l.targetNode=null;u.onKeyDown.add(function(p,n){var s=121,o=122;if(n.altKey){if(n.keyCode===s){if(h.isWebKit){window.focus()}w.toolbarGroup.focus();return g.cancel(n)}else{if(n.keyCode===o){i.get(p.id+"_path_row").focus();return g.cancel(n)}}}});u.addShortcut("alt+0","","mceShortcuts",w);return{iframeContainer:m,editorContainer:u.id+"_parent",sizeContainer:v,deltaHeight:l.deltaHeight}},getInfo:function(){return{longname:"Advanced theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:h.majorVersion+"."+h.minorVersion}},resizeBy:function(j,k){var l=i.get(this.editor.id+"_ifr");this.resizeTo(l.clientWidth+j,l.clientHeight+k)},resizeTo:function(j,n,l){var k=this.editor,m=this.settings,o=i.get(k.id+"_tbl"),p=i.get(k.id+"_ifr");j=Math.max(m.theme_advanced_resizing_min_width||100,j);n=Math.max(m.theme_advanced_resizing_min_height||100,n);j=Math.min(m.theme_advanced_resizing_max_width||65535,j);n=Math.min(m.theme_advanced_resizing_max_height||65535,n);i.setStyle(o,"height","");i.setStyle(p,"height",n);if(m.theme_advanced_resize_horizontal){i.setStyle(o,"width","");i.setStyle(p,"width",j);if(j"));i.setHTML(l,r.join(""))},_addStatusBar:function(p,k){var l,w=this,q=w.editor,x=w.settings,j,u,v,m;l=i.add(p,"tr");l=m=i.add(l,"td",{"class":"mceStatusbar"});l=i.add(l,"div",{id:q.id+"_path_row",role:"group","aria-labelledby":q.id+"_path_voice"});if(x.theme_advanced_path){i.add(l,"span",{id:q.id+"_path_voice"},q.translate("advanced.path"));i.add(l,"span",{},": ")}else{i.add(l,"span",{}," ")}if(x.theme_advanced_resizing){i.add(m,"a",{id:q.id+"_resize",href:"javascript:;",onclick:"return false;","class":"mceResize",tabIndex:"-1"});if(x.theme_advanced_resizing_use_cookie){q.onPostRender.add(function(){var n=a.getHash("TinyMCE_"+q.id+"_size"),r=i.get(q.id+"_tbl");if(!n){return}w.resizeTo(n.cw,n.ch)})}q.onPostRender.add(function(){g.add(q.id+"_resize","click",function(n){n.preventDefault()});g.add(q.id+"_resize","mousedown",function(E){var t,r,s,o,D,A,B,G,n,F,y;function z(H){H.preventDefault();n=B+(H.screenX-D);F=G+(H.screenY-A);w.resizeTo(n,F)}function C(H){g.remove(i.doc,"mousemove",t);g.remove(q.getDoc(),"mousemove",r);g.remove(i.doc,"mouseup",s);g.remove(q.getDoc(),"mouseup",o);n=B+(H.screenX-D);F=G+(H.screenY-A);w.resizeTo(n,F,true);q.nodeChanged()}E.preventDefault();D=E.screenX;A=E.screenY;y=i.get(w.editor.id+"_ifr");B=n=y.clientWidth;G=F=y.clientHeight;t=g.add(i.doc,"mousemove",z);r=g.add(q.getDoc(),"mousemove",z);s=g.add(i.doc,"mouseup",C);o=g.add(q.getDoc(),"mouseup",C)})})}k.deltaHeight-=21;l=p=null},_updateUndoStatus:function(k){var j=k.controlManager,l=k.undoManager;j.setDisabled("undo",!l.hasUndo()&&!l.typing);j.setDisabled("redo",!l.hasRedo())},_nodeChanged:function(o,u,E,r,F){var z=this,D,G=0,y,H,A=z.settings,x,l,w,C,m,k,j;h.each(z.stateControls,function(n){u.setActive(n,o.queryCommandState(z.controls[n][1]))});function q(p){var s,n=F.parents,t=p;if(typeof(p)=="string"){t=function(v){return v.nodeName==p}}for(s=0;s0){H.mark(p)}})}if(H=u.get("formatselect")){D=q(o.dom.isBlock);if(D){H.select(D.nodeName.toLowerCase())}}q(function(p){if(p.nodeName==="SPAN"){if(!x&&p.className){x=p.className}}if(o.dom.is(p,A.theme_advanced_font_selector)){if(!l&&p.style.fontSize){l=p.style.fontSize}if(!w&&p.style.fontFamily){w=p.style.fontFamily.replace(/[\"\']+/g,"").replace(/^([^,]+).*/,"$1").toLowerCase()}if(!C&&p.style.color){C=p.style.color}if(!m&&p.style.backgroundColor){m=p.style.backgroundColor}}return false});if(H=u.get("fontselect")){H.select(function(n){return n.replace(/^([^,]+).*/,"$1").toLowerCase()==w})}if(H=u.get("fontsizeselect")){if(A.theme_advanced_runtime_fontsize&&!l&&!x){l=o.dom.getStyle(E,"fontSize",true)}H.select(function(n){if(n.fontSize&&n.fontSize===l){return true}if(n["class"]&&n["class"]===x){return true}})}if(A.theme_advanced_show_current_color){function B(p,n){if(H=u.get(p)){if(!n){n=H.settings.default_color}if(n!==H.value){H.displayColor(n)}}}B("forecolor",C);B("backcolor",m)}if(A.theme_advanced_show_current_color){function B(p,n){if(H=u.get(p)){if(!n){n=H.settings.default_color}if(n!==H.value){H.displayColor(n)}}}B("forecolor",C);B("backcolor",m)}if(A.theme_advanced_path&&A.theme_advanced_statusbar_location){D=i.get(o.id+"_path")||i.add(o.id+"_path_row","span",{id:o.id+"_path"});if(z.statusKeyboardNavigation){z.statusKeyboardNavigation.destroy();z.statusKeyboardNavigation=null}i.setHTML(D,"");q(function(I){var p=I.nodeName.toLowerCase(),s,v,t="";if(I.nodeType!=1||p==="br"||I.getAttribute("data-mce-bogus")||i.hasClass(I,"mceItemHidden")||i.hasClass(I,"mceItemRemoved")){return}if(h.isIE&&I.scopeName!=="HTML"&&I.scopeName){p=I.scopeName+":"+p}p=p.replace(/mce\:/g,"");switch(p){case"b":p="strong";break;case"i":p="em";break;case"img":if(y=i.getAttrib(I,"src")){t+="src: "+y+" "}break;case"a":if(y=i.getAttrib(I,"name")){t+="name: "+y+" ";p+="#"+y}if(y=i.getAttrib(I,"href")){t+="href: "+y+" "}break;case"font":if(y=i.getAttrib(I,"face")){t+="font: "+y+" "}if(y=i.getAttrib(I,"size")){t+="size: "+y+" "}if(y=i.getAttrib(I,"color")){t+="color: "+y+" "}break;case"span":if(y=i.getAttrib(I,"style")){t+="style: "+y+" "}break}if(y=i.getAttrib(I,"id")){t+="id: "+y+" "}if(y=I.className){y=y.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g,"");if(y){t+="class: "+y+" ";if(o.dom.isBlock(I)||p=="img"||p=="span"){p+="."+y}}}p=p.replace(/(html:)/g,"");p={name:p,node:I,title:t};z.onResolveName.dispatch(z,p);t=p.title;p=p.name;v=i.create("a",{href:"javascript:;",role:"button",onmousedown:"return false;",title:t,"class":"mcePath_"+(G++)},p);if(D.hasChildNodes()){D.insertBefore(i.create("span",{"aria-hidden":"true"},"\u00a0\u00bb "),D.firstChild);D.insertBefore(v,D.firstChild)}else{D.appendChild(v)}},o.getBody());if(i.select("a",D).length>0){z.statusKeyboardNavigation=new h.ui.KeyboardNavigation({root:o.id+"_path_row",items:i.select("a",D),excludeFromTabOrder:true,onCancel:function(){o.focus()}},i)}}},_sel:function(j){this.editor.execCommand("mceSelectNodeDepth",false,j)},_mceInsertAnchor:function(l,k){var j=this.editor;j.windowManager.open({url:this.url+"/anchor.htm",width:320+parseInt(j.getLang("advanced.anchor_delta_width",0)),height:90+parseInt(j.getLang("advanced.anchor_delta_height",0)),inline:true},{theme_url:this.url})},_mceCharMap:function(){var j=this.editor;j.windowManager.open({url:this.url+"/charmap.htm",width:550+parseInt(j.getLang("advanced.charmap_delta_width",0)),height:265+parseInt(j.getLang("advanced.charmap_delta_height",0)),inline:true},{theme_url:this.url})},_mceHelp:function(){var j=this.editor;j.windowManager.open({url:this.url+"/about.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceShortcuts:function(){var j=this.editor;j.windowManager.open({url:this.url+"/shortcuts.htm",width:480,height:380,inline:true},{theme_url:this.url})},_mceColorPicker:function(l,k){var j=this.editor;k=k||{};j.windowManager.open({url:this.url+"/color_picker.htm",width:375+parseInt(j.getLang("advanced.colorpicker_delta_width",0)),height:250+parseInt(j.getLang("advanced.colorpicker_delta_height",0)),close_previous:false,inline:true},{input_color:k.color,func:k.func,theme_url:this.url})},_mceCodeEditor:function(k,l){var j=this.editor;j.windowManager.open({url:this.url+"/source_editor.htm",width:parseInt(j.getParam("theme_advanced_source_editor_width",720)),height:parseInt(j.getParam("theme_advanced_source_editor_height",580)),inline:true,resizable:true,maximizable:true},{theme_url:this.url})},_mceImage:function(k,l){var j=this.editor;if(j.dom.getAttrib(j.selection.getNode(),"class","").indexOf("mceItem")!=-1){return}j.windowManager.open({url:this.url+"/image.htm",width:355+parseInt(j.getLang("advanced.image_delta_width",0)),height:275+parseInt(j.getLang("advanced.image_delta_height",0)),inline:true},{theme_url:this.url})},_mceLink:function(k,l){var j=this.editor;j.windowManager.open({url:this.url+"/link.htm",width:310+parseInt(j.getLang("advanced.link_delta_width",0)),height:200+parseInt(j.getLang("advanced.link_delta_height",0)),inline:true},{theme_url:this.url})},_mceNewDocument:function(){var j=this.editor;j.windowManager.confirm("advanced.newdocument",function(k){if(k){j.execCommand("mceSetContent",false,"")}})},_mceForeColor:function(){var j=this;this._mceColorPicker(0,{color:j.fgColor,func:function(k){j.fgColor=k;j.editor.execCommand("ForeColor",false,k)}})},_mceBackColor:function(){var j=this;this._mceColorPicker(0,{color:j.bgColor,func:function(k){j.bgColor=k;j.editor.execCommand("HiliteColor",false,k)}})},_ufirst:function(j){return j.substring(0,1).toUpperCase()+j.substring(1)}});h.ThemeManager.add("advanced",h.themes.AdvancedTheme)}(tinymce));
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js
new file mode 100644
index 0000000..82166dc
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/editor_template_src.js
@@ -0,0 +1,1490 @@
+/**
+ * editor_template_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function(tinymce) {
+ var DOM = tinymce.DOM, Event = tinymce.dom.Event, extend = tinymce.extend, each = tinymce.each, Cookie = tinymce.util.Cookie, lastExtID, explode = tinymce.explode;
+
+ // Generates a preview for a format
+ function getPreviewCss(ed, fmt) {
+ var name, previewElm, dom = ed.dom, previewCss = '', parentFontSize, previewStylesName;
+
+ previewStyles = ed.settings.preview_styles;
+
+ // No preview forced
+ if (previewStyles === false)
+ return '';
+
+ // Default preview
+ if (!previewStyles)
+ previewStyles = 'font-family font-size font-weight text-decoration text-transform color background-color';
+
+ // Removes any variables since these can't be previewed
+ function removeVars(val) {
+ return val.replace(/%(\w+)/g, '');
+ };
+
+ // Create block/inline element to use for preview
+ name = fmt.block || fmt.inline || 'span';
+ previewElm = dom.create(name);
+
+ // Add format styles to preview element
+ each(fmt.styles, function(value, name) {
+ value = removeVars(value);
+
+ if (value)
+ dom.setStyle(previewElm, name, value);
+ });
+
+ // Add attributes to preview element
+ each(fmt.attributes, function(value, name) {
+ value = removeVars(value);
+
+ if (value)
+ dom.setAttrib(previewElm, name, value);
+ });
+
+ // Add classes to preview element
+ each(fmt.classes, function(value) {
+ value = removeVars(value);
+
+ if (!dom.hasClass(previewElm, value))
+ dom.addClass(previewElm, value);
+ });
+
+ // Add the previewElm outside the visual area
+ dom.setStyles(previewElm, {position: 'absolute', left: -0xFFFF});
+ ed.getBody().appendChild(previewElm);
+
+ // Get parent container font size so we can compute px values out of em/% for older IE:s
+ parentFontSize = dom.getStyle(ed.getBody(), 'fontSize', true);
+ parentFontSize = /px$/.test(parentFontSize) ? parseInt(parentFontSize, 10) : 0;
+
+ each(previewStyles.split(' '), function(name) {
+ var value = dom.getStyle(previewElm, name, true);
+
+ // If background is transparent then check if the body has a background color we can use
+ if (name == 'background-color' && /transparent|rgba\s*\([^)]+,\s*0\)/.test(value)) {
+ value = dom.getStyle(ed.getBody(), name, true);
+
+ // Ignore white since it's the default color, not the nicest fix
+ if (dom.toHex(value).toLowerCase() == '#ffffff') {
+ return;
+ }
+ }
+
+ // Old IE won't calculate the font size so we need to do that manually
+ if (name == 'font-size') {
+ if (/em|%$/.test(value)) {
+ if (parentFontSize === 0) {
+ return;
+ }
+
+ // Convert font size from em/% to px
+ value = parseFloat(value, 10) / (/%$/.test(value) ? 100 : 1);
+ value = (value * parentFontSize) + 'px';
+ }
+ }
+
+ previewCss += name + ':' + value + ';';
+ });
+
+ dom.remove(previewElm);
+
+ return previewCss;
+ };
+
+ // Tell it to load theme specific language pack(s)
+ tinymce.ThemeManager.requireLangPack('advanced');
+
+ tinymce.create('tinymce.themes.AdvancedTheme', {
+ sizes : [8, 10, 12, 14, 18, 24, 36],
+
+ // Control name lookup, format: title, command
+ controls : {
+ bold : ['bold_desc', 'Bold'],
+ italic : ['italic_desc', 'Italic'],
+ underline : ['underline_desc', 'Underline'],
+ strikethrough : ['striketrough_desc', 'Strikethrough'],
+ justifyleft : ['justifyleft_desc', 'JustifyLeft'],
+ justifycenter : ['justifycenter_desc', 'JustifyCenter'],
+ justifyright : ['justifyright_desc', 'JustifyRight'],
+ justifyfull : ['justifyfull_desc', 'JustifyFull'],
+ bullist : ['bullist_desc', 'InsertUnorderedList'],
+ numlist : ['numlist_desc', 'InsertOrderedList'],
+ outdent : ['outdent_desc', 'Outdent'],
+ indent : ['indent_desc', 'Indent'],
+ cut : ['cut_desc', 'Cut'],
+ copy : ['copy_desc', 'Copy'],
+ paste : ['paste_desc', 'Paste'],
+ undo : ['undo_desc', 'Undo'],
+ redo : ['redo_desc', 'Redo'],
+ link : ['link_desc', 'mceLink'],
+ unlink : ['unlink_desc', 'unlink'],
+ image : ['image_desc', 'mceImage'],
+ cleanup : ['cleanup_desc', 'mceCleanup'],
+ help : ['help_desc', 'mceHelp'],
+ code : ['code_desc', 'mceCodeEditor'],
+ hr : ['hr_desc', 'InsertHorizontalRule'],
+ removeformat : ['removeformat_desc', 'RemoveFormat'],
+ sub : ['sub_desc', 'subscript'],
+ sup : ['sup_desc', 'superscript'],
+ forecolor : ['forecolor_desc', 'ForeColor'],
+ forecolorpicker : ['forecolor_desc', 'mceForeColor'],
+ backcolor : ['backcolor_desc', 'HiliteColor'],
+ backcolorpicker : ['backcolor_desc', 'mceBackColor'],
+ charmap : ['charmap_desc', 'mceCharMap'],
+ visualaid : ['visualaid_desc', 'mceToggleVisualAid'],
+ anchor : ['anchor_desc', 'mceInsertAnchor'],
+ newdocument : ['newdocument_desc', 'mceNewDocument'],
+ blockquote : ['blockquote_desc', 'mceBlockQuote']
+ },
+
+ stateControls : ['bold', 'italic', 'underline', 'strikethrough', 'bullist', 'numlist', 'justifyleft', 'justifycenter', 'justifyright', 'justifyfull', 'sub', 'sup', 'blockquote'],
+
+ init : function(ed, url) {
+ var t = this, s, v, o;
+
+ t.editor = ed;
+ t.url = url;
+ t.onResolveName = new tinymce.util.Dispatcher(this);
+ s = ed.settings;
+
+ ed.forcedHighContrastMode = ed.settings.detect_highcontrast && t._isHighContrast();
+ ed.settings.skin = ed.forcedHighContrastMode ? 'highcontrast' : ed.settings.skin;
+
+ // Setup default buttons
+ if (!s.theme_advanced_buttons1) {
+ s = extend({
+ theme_advanced_buttons1 : "bold,italic,underline,strikethrough,|,justifyleft,justifycenter,justifyright,justifyfull,|,styleselect,formatselect",
+ theme_advanced_buttons2 : "bullist,numlist,|,outdent,indent,|,undo,redo,|,link,unlink,anchor,image,cleanup,help,code",
+ theme_advanced_buttons3 : "hr,removeformat,visualaid,|,sub,sup,|,charmap"
+ }, s);
+ }
+
+ // Default settings
+ t.settings = s = extend({
+ theme_advanced_path : true,
+ theme_advanced_toolbar_location : 'top',
+ theme_advanced_blockformats : "p,address,pre,h1,h2,h3,h4,h5,h6",
+ theme_advanced_toolbar_align : "left",
+ theme_advanced_statusbar_location : "bottom",
+ theme_advanced_fonts : "Andale Mono=andale mono,times;Arial=arial,helvetica,sans-serif;Arial Black=arial black,avant garde;Book Antiqua=book antiqua,palatino;Comic Sans MS=comic sans ms,sans-serif;Courier New=courier new,courier;Georgia=georgia,palatino;Helvetica=helvetica;Impact=impact,chicago;Symbol=symbol;Tahoma=tahoma,arial,helvetica,sans-serif;Terminal=terminal,monaco;Times New Roman=times new roman,times;Trebuchet MS=trebuchet ms,geneva;Verdana=verdana,geneva;Webdings=webdings;Wingdings=wingdings,zapf dingbats",
+ theme_advanced_more_colors : 1,
+ theme_advanced_row_height : 23,
+ theme_advanced_resize_horizontal : 1,
+ theme_advanced_resizing_use_cookie : 1,
+ theme_advanced_font_sizes : "1,2,3,4,5,6,7",
+ theme_advanced_font_selector : "span",
+ theme_advanced_show_current_color: 0,
+ readonly : ed.settings.readonly
+ }, s);
+
+ // Setup default font_size_style_values
+ if (!s.font_size_style_values)
+ s.font_size_style_values = "8pt,10pt,12pt,14pt,18pt,24pt,36pt";
+
+ if (tinymce.is(s.theme_advanced_font_sizes, 'string')) {
+ s.font_size_style_values = tinymce.explode(s.font_size_style_values);
+ s.font_size_classes = tinymce.explode(s.font_size_classes || '');
+
+ // Parse string value
+ o = {};
+ ed.settings.theme_advanced_font_sizes = s.theme_advanced_font_sizes;
+ each(ed.getParam('theme_advanced_font_sizes', '', 'hash'), function(v, k) {
+ var cl;
+
+ if (k == v && v >= 1 && v <= 7) {
+ k = v + ' (' + t.sizes[v - 1] + 'pt)';
+ cl = s.font_size_classes[v - 1];
+ v = s.font_size_style_values[v - 1] || (t.sizes[v - 1] + 'pt');
+ }
+
+ if (/^\s*\./.test(v))
+ cl = v.replace(/\./g, '');
+
+ o[k] = cl ? {'class' : cl} : {fontSize : v};
+ });
+
+ s.theme_advanced_font_sizes = o;
+ }
+
+ if ((v = s.theme_advanced_path_location) && v != 'none')
+ s.theme_advanced_statusbar_location = s.theme_advanced_path_location;
+
+ if (s.theme_advanced_statusbar_location == 'none')
+ s.theme_advanced_statusbar_location = 0;
+
+ if (ed.settings.content_css !== false)
+ ed.contentCSS.push(ed.baseURI.toAbsolute(url + "/skins/" + ed.settings.skin + "/content.css"));
+
+ // Init editor
+ ed.onInit.add(function() {
+ if (!ed.settings.readonly) {
+ ed.onNodeChange.add(t._nodeChanged, t);
+ ed.onKeyUp.add(t._updateUndoStatus, t);
+ ed.onMouseUp.add(t._updateUndoStatus, t);
+ ed.dom.bind(ed.dom.getRoot(), 'dragend', function() {
+ t._updateUndoStatus(ed);
+ });
+ }
+ });
+
+ ed.onSetProgressState.add(function(ed, b, ti) {
+ var co, id = ed.id, tb;
+
+ if (b) {
+ t.progressTimer = setTimeout(function() {
+ co = ed.getContainer();
+ co = co.insertBefore(DOM.create('DIV', {style : 'position:relative'}), co.firstChild);
+ tb = DOM.get(ed.id + '_tbl');
+
+ DOM.add(co, 'div', {id : id + '_blocker', 'class' : 'mceBlocker', style : {width : tb.clientWidth + 2, height : tb.clientHeight + 2}});
+ DOM.add(co, 'div', {id : id + '_progress', 'class' : 'mceProgress', style : {left : tb.clientWidth / 2, top : tb.clientHeight / 2}});
+ }, ti || 0);
+ } else {
+ DOM.remove(id + '_blocker');
+ DOM.remove(id + '_progress');
+ clearTimeout(t.progressTimer);
+ }
+ });
+
+ DOM.loadCSS(s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : url + "/skins/" + ed.settings.skin + "/ui.css");
+
+ if (s.skin_variant)
+ DOM.loadCSS(url + "/skins/" + ed.settings.skin + "/ui_" + s.skin_variant + ".css");
+ },
+
+ _isHighContrast : function() {
+ var actualColor, div = DOM.add(DOM.getRoot(), 'div', {'style': 'background-color: rgb(171,239,86);'});
+
+ actualColor = (DOM.getStyle(div, 'background-color', true) + '').toLowerCase().replace(/ /g, '');
+ DOM.remove(div);
+
+ return actualColor != 'rgb(171,239,86)' && actualColor != '#abef56';
+ },
+
+ createControl : function(n, cf) {
+ var cd, c;
+
+ if (c = cf.createControl(n))
+ return c;
+
+ switch (n) {
+ case "styleselect":
+ return this._createStyleSelect();
+
+ case "formatselect":
+ return this._createBlockFormats();
+
+ case "fontselect":
+ return this._createFontSelect();
+
+ case "fontsizeselect":
+ return this._createFontSizeSelect();
+
+ case "forecolor":
+ return this._createForeColorMenu();
+
+ case "backcolor":
+ return this._createBackColorMenu();
+ }
+
+ if ((cd = this.controls[n]))
+ return cf.createButton(n, {title : "advanced." + cd[0], cmd : cd[1], ui : cd[2], value : cd[3]});
+ },
+
+ execCommand : function(cmd, ui, val) {
+ var f = this['_' + cmd];
+
+ if (f) {
+ f.call(this, ui, val);
+ return true;
+ }
+
+ return false;
+ },
+
+ _importClasses : function(e) {
+ var ed = this.editor, ctrl = ed.controlManager.get('styleselect');
+
+ if (ctrl.getLength() == 0) {
+ each(ed.dom.getClasses(), function(o, idx) {
+ var name = 'style_' + idx, fmt;
+
+ fmt = {
+ inline : 'span',
+ attributes : {'class' : o['class']},
+ selector : '*'
+ };
+
+ ed.formatter.register(name, fmt);
+
+ ctrl.add(o['class'], name, {
+ style: function() {
+ return getPreviewCss(ed, fmt);
+ }
+ });
+ });
+ }
+ },
+
+ _createStyleSelect : function(n) {
+ var t = this, ed = t.editor, ctrlMan = ed.controlManager, ctrl;
+
+ // Setup style select box
+ ctrl = ctrlMan.createListBox('styleselect', {
+ title : 'advanced.style_select',
+ onselect : function(name) {
+ var matches, formatNames = [], removedFormat;
+
+ each(ctrl.items, function(item) {
+ formatNames.push(item.value);
+ });
+
+ ed.focus();
+ ed.undoManager.add();
+
+ // Toggle off the current format(s)
+ matches = ed.formatter.matchAll(formatNames);
+ tinymce.each(matches, function(match) {
+ if (!name || match == name) {
+ if (match)
+ ed.formatter.remove(match);
+
+ removedFormat = true;
+ }
+ });
+
+ if (!removedFormat)
+ ed.formatter.apply(name);
+
+ ed.undoManager.add();
+ ed.nodeChanged();
+
+ return false; // No auto select
+ }
+ });
+
+ // Handle specified format
+ ed.onPreInit.add(function() {
+ var counter = 0, formats = ed.getParam('style_formats');
+
+ if (formats) {
+ each(formats, function(fmt) {
+ var name, keys = 0;
+
+ each(fmt, function() {keys++;});
+
+ if (keys > 1) {
+ name = fmt.name = fmt.name || 'style_' + (counter++);
+ ed.formatter.register(name, fmt);
+ ctrl.add(fmt.title, name, {
+ style: function() {
+ return getPreviewCss(ed, fmt);
+ }
+ });
+ } else
+ ctrl.add(fmt.title);
+ });
+ } else {
+ each(ed.getParam('theme_advanced_styles', '', 'hash'), function(val, key) {
+ var name, fmt;
+
+ if (val) {
+ name = 'style_' + (counter++);
+ fmt = {
+ inline : 'span',
+ classes : val,
+ selector : '*'
+ };
+
+ ed.formatter.register(name, fmt);
+ ctrl.add(t.editor.translate(key), name, {
+ style: function() {
+ return getPreviewCss(ed, fmt);
+ }
+ });
+ }
+ });
+ }
+ });
+
+ // Auto import classes if the ctrl box is empty
+ if (ctrl.getLength() == 0) {
+ ctrl.onPostRender.add(function(ed, n) {
+ if (!ctrl.NativeListBox) {
+ Event.add(n.id + '_text', 'focus', t._importClasses, t);
+ Event.add(n.id + '_text', 'mousedown', t._importClasses, t);
+ Event.add(n.id + '_open', 'focus', t._importClasses, t);
+ Event.add(n.id + '_open', 'mousedown', t._importClasses, t);
+ } else
+ Event.add(n.id, 'focus', t._importClasses, t);
+ });
+ }
+
+ return ctrl;
+ },
+
+ _createFontSelect : function() {
+ var c, t = this, ed = t.editor;
+
+ c = ed.controlManager.createListBox('fontselect', {
+ title : 'advanced.fontdefault',
+ onselect : function(v) {
+ var cur = c.items[c.selectedIndex];
+
+ if (!v && cur) {
+ ed.execCommand('FontName', false, cur.value);
+ return;
+ }
+
+ ed.execCommand('FontName', false, v);
+
+ // Fake selection, execCommand will fire a nodeChange and update the selection
+ c.select(function(sv) {
+ return v == sv;
+ });
+
+ if (cur && cur.value == v) {
+ c.select(null);
+ }
+
+ return false; // No auto select
+ }
+ });
+
+ if (c) {
+ each(ed.getParam('theme_advanced_fonts', t.settings.theme_advanced_fonts, 'hash'), function(v, k) {
+ c.add(ed.translate(k), v, {style : v.indexOf('dings') == -1 ? 'font-family:' + v : ''});
+ });
+ }
+
+ return c;
+ },
+
+ _createFontSizeSelect : function() {
+ var t = this, ed = t.editor, c, i = 0, cl = [];
+
+ c = ed.controlManager.createListBox('fontsizeselect', {title : 'advanced.font_size', onselect : function(v) {
+ var cur = c.items[c.selectedIndex];
+
+ if (!v && cur) {
+ cur = cur.value;
+
+ if (cur['class']) {
+ ed.formatter.toggle('fontsize_class', {value : cur['class']});
+ ed.undoManager.add();
+ ed.nodeChanged();
+ } else {
+ ed.execCommand('FontSize', false, cur.fontSize);
+ }
+
+ return;
+ }
+
+ if (v['class']) {
+ ed.focus();
+ ed.undoManager.add();
+ ed.formatter.toggle('fontsize_class', {value : v['class']});
+ ed.undoManager.add();
+ ed.nodeChanged();
+ } else
+ ed.execCommand('FontSize', false, v.fontSize);
+
+ // Fake selection, execCommand will fire a nodeChange and update the selection
+ c.select(function(sv) {
+ return v == sv;
+ });
+
+ if (cur && (cur.value.fontSize == v.fontSize || cur.value['class'] && cur.value['class'] == v['class'])) {
+ c.select(null);
+ }
+
+ return false; // No auto select
+ }});
+
+ if (c) {
+ each(t.settings.theme_advanced_font_sizes, function(v, k) {
+ var fz = v.fontSize;
+
+ if (fz >= 1 && fz <= 7)
+ fz = t.sizes[parseInt(fz) - 1] + 'pt';
+
+ c.add(k, v, {'style' : 'font-size:' + fz, 'class' : 'mceFontSize' + (i++) + (' ' + (v['class'] || ''))});
+ });
+ }
+
+ return c;
+ },
+
+ _createBlockFormats : function() {
+ var c, fmts = {
+ p : 'advanced.paragraph',
+ address : 'advanced.address',
+ pre : 'advanced.pre',
+ h1 : 'advanced.h1',
+ h2 : 'advanced.h2',
+ h3 : 'advanced.h3',
+ h4 : 'advanced.h4',
+ h5 : 'advanced.h5',
+ h6 : 'advanced.h6',
+ div : 'advanced.div',
+ blockquote : 'advanced.blockquote',
+ code : 'advanced.code',
+ dt : 'advanced.dt',
+ dd : 'advanced.dd',
+ samp : 'advanced.samp'
+ }, t = this;
+
+ c = t.editor.controlManager.createListBox('formatselect', {title : 'advanced.block', onselect : function(v) {
+ t.editor.execCommand('FormatBlock', false, v);
+ return false;
+ }});
+
+ if (c) {
+ each(t.editor.getParam('theme_advanced_blockformats', t.settings.theme_advanced_blockformats, 'hash'), function(v, k) {
+ c.add(t.editor.translate(k != v ? k : fmts[v]), v, {'class' : 'mce_formatPreview mce_' + v, style: function() {
+ return getPreviewCss(t.editor, {block: v});
+ }});
+ });
+ }
+
+ return c;
+ },
+
+ _createForeColorMenu : function() {
+ var c, t = this, s = t.settings, o = {}, v;
+
+ if (s.theme_advanced_more_colors) {
+ o.more_colors_func = function() {
+ t._mceColorPicker(0, {
+ color : c.value,
+ func : function(co) {
+ c.setColor(co);
+ }
+ });
+ };
+ }
+
+ if (v = s.theme_advanced_text_colors)
+ o.colors = v;
+
+ if (s.theme_advanced_default_foreground_color)
+ o.default_color = s.theme_advanced_default_foreground_color;
+
+ o.title = 'advanced.forecolor_desc';
+ o.cmd = 'ForeColor';
+ o.scope = this;
+
+ c = t.editor.controlManager.createColorSplitButton('forecolor', o);
+
+ return c;
+ },
+
+ _createBackColorMenu : function() {
+ var c, t = this, s = t.settings, o = {}, v;
+
+ if (s.theme_advanced_more_colors) {
+ o.more_colors_func = function() {
+ t._mceColorPicker(0, {
+ color : c.value,
+ func : function(co) {
+ c.setColor(co);
+ }
+ });
+ };
+ }
+
+ if (v = s.theme_advanced_background_colors)
+ o.colors = v;
+
+ if (s.theme_advanced_default_background_color)
+ o.default_color = s.theme_advanced_default_background_color;
+
+ o.title = 'advanced.backcolor_desc';
+ o.cmd = 'HiliteColor';
+ o.scope = this;
+
+ c = t.editor.controlManager.createColorSplitButton('backcolor', o);
+
+ return c;
+ },
+
+ renderUI : function(o) {
+ var n, ic, tb, t = this, ed = t.editor, s = t.settings, sc, p, nl;
+
+ if (ed.settings) {
+ ed.settings.aria_label = s.aria_label + ed.getLang('advanced.help_shortcut');
+ }
+
+ // TODO: ACC Should have an aria-describedby attribute which is user-configurable to describe what this field is actually for.
+ // Maybe actually inherit it from the original textara?
+ n = p = DOM.create('span', {role : 'application', 'aria-labelledby' : ed.id + '_voice', id : ed.id + '_parent', 'class' : 'mceEditor ' + ed.settings.skin + 'Skin' + (s.skin_variant ? ' ' + ed.settings.skin + 'Skin' + t._ufirst(s.skin_variant) : '') + (ed.settings.directionality == "rtl" ? ' mceRtl' : '')});
+ DOM.add(n, 'span', {'class': 'mceVoiceLabel', 'style': 'display:none;', id: ed.id + '_voice'}, s.aria_label);
+
+ if (!DOM.boxModel)
+ n = DOM.add(n, 'div', {'class' : 'mceOldBoxModel'});
+
+ n = sc = DOM.add(n, 'table', {role : "presentation", id : ed.id + '_tbl', 'class' : 'mceLayout', cellSpacing : 0, cellPadding : 0});
+ n = tb = DOM.add(n, 'tbody');
+
+ switch ((s.theme_advanced_layout_manager || '').toLowerCase()) {
+ case "rowlayout":
+ ic = t._rowLayout(s, tb, o);
+ break;
+
+ case "customlayout":
+ ic = ed.execCallback("theme_advanced_custom_layout", s, tb, o, p);
+ break;
+
+ default:
+ ic = t._simpleLayout(s, tb, o, p);
+ }
+
+ n = o.targetNode;
+
+ // Add classes to first and last TRs
+ nl = sc.rows;
+ DOM.addClass(nl[0], 'mceFirst');
+ DOM.addClass(nl[nl.length - 1], 'mceLast');
+
+ // Add classes to first and last TDs
+ each(DOM.select('tr', tb), function(n) {
+ DOM.addClass(n.firstChild, 'mceFirst');
+ DOM.addClass(n.childNodes[n.childNodes.length - 1], 'mceLast');
+ });
+
+ if (DOM.get(s.theme_advanced_toolbar_container))
+ DOM.get(s.theme_advanced_toolbar_container).appendChild(p);
+ else
+ DOM.insertAfter(p, n);
+
+ Event.add(ed.id + '_path_row', 'click', function(e) {
+ e = e.target;
+
+ if (e.nodeName == 'A') {
+ t._sel(e.className.replace(/^.*mcePath_([0-9]+).*$/, '$1'));
+ return false;
+ }
+ });
+/*
+ if (DOM.get(ed.id + '_path_row')) {
+ Event.add(ed.id + '_tbl', 'mouseover', function(e) {
+ var re;
+
+ e = e.target;
+
+ if (e.nodeName == 'SPAN' && DOM.hasClass(e.parentNode, 'mceButton')) {
+ re = DOM.get(ed.id + '_path_row');
+ t.lastPath = re.innerHTML;
+ DOM.setHTML(re, e.parentNode.title);
+ }
+ });
+
+ Event.add(ed.id + '_tbl', 'mouseout', function(e) {
+ if (t.lastPath) {
+ DOM.setHTML(ed.id + '_path_row', t.lastPath);
+ t.lastPath = 0;
+ }
+ });
+ }
+*/
+
+ if (!ed.getParam('accessibility_focus'))
+ Event.add(DOM.add(p, 'a', {href : '#'}, ''), 'focus', function() {tinyMCE.get(ed.id).focus();});
+
+ if (s.theme_advanced_toolbar_location == 'external')
+ o.deltaHeight = 0;
+
+ t.deltaHeight = o.deltaHeight;
+ o.targetNode = null;
+
+ ed.onKeyDown.add(function(ed, evt) {
+ var DOM_VK_F10 = 121, DOM_VK_F11 = 122;
+
+ if (evt.altKey) {
+ if (evt.keyCode === DOM_VK_F10) {
+ // Make sure focus is given to toolbar in Safari.
+ // We can't do this in IE as it prevents giving focus to toolbar when editor is in a frame
+ if (tinymce.isWebKit) {
+ window.focus();
+ }
+ t.toolbarGroup.focus();
+ return Event.cancel(evt);
+ } else if (evt.keyCode === DOM_VK_F11) {
+ DOM.get(ed.id + '_path_row').focus();
+ return Event.cancel(evt);
+ }
+ }
+ });
+
+ // alt+0 is the UK recommended shortcut for accessing the list of access controls.
+ ed.addShortcut('alt+0', '', 'mceShortcuts', t);
+
+ return {
+ iframeContainer : ic,
+ editorContainer : ed.id + '_parent',
+ sizeContainer : sc,
+ deltaHeight : o.deltaHeight
+ };
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Advanced theme',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ }
+ },
+
+ resizeBy : function(dw, dh) {
+ var e = DOM.get(this.editor.id + '_ifr');
+
+ this.resizeTo(e.clientWidth + dw, e.clientHeight + dh);
+ },
+
+ resizeTo : function(w, h, store) {
+ var ed = this.editor, s = this.settings, e = DOM.get(ed.id + '_tbl'), ifr = DOM.get(ed.id + '_ifr');
+
+ // Boundery fix box
+ w = Math.max(s.theme_advanced_resizing_min_width || 100, w);
+ h = Math.max(s.theme_advanced_resizing_min_height || 100, h);
+ w = Math.min(s.theme_advanced_resizing_max_width || 0xFFFF, w);
+ h = Math.min(s.theme_advanced_resizing_max_height || 0xFFFF, h);
+
+ // Resize iframe and container
+ DOM.setStyle(e, 'height', '');
+ DOM.setStyle(ifr, 'height', h);
+
+ if (s.theme_advanced_resize_horizontal) {
+ DOM.setStyle(e, 'width', '');
+ DOM.setStyle(ifr, 'width', w);
+
+ // Make sure that the size is never smaller than the over all ui
+ if (w < e.clientWidth) {
+ w = e.clientWidth;
+ DOM.setStyle(ifr, 'width', e.clientWidth);
+ }
+ }
+
+ // Store away the size
+ if (store && s.theme_advanced_resizing_use_cookie) {
+ Cookie.setHash("TinyMCE_" + ed.id + "_size", {
+ cw : w,
+ ch : h
+ });
+ }
+ },
+
+ destroy : function() {
+ var id = this.editor.id;
+
+ Event.clear(id + '_resize');
+ Event.clear(id + '_path_row');
+ Event.clear(id + '_external_close');
+ },
+
+ // Internal functions
+
+ _simpleLayout : function(s, tb, o, p) {
+ var t = this, ed = t.editor, lo = s.theme_advanced_toolbar_location, sl = s.theme_advanced_statusbar_location, n, ic, etb, c;
+
+ if (s.readonly) {
+ n = DOM.add(tb, 'tr');
+ n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
+ return ic;
+ }
+
+ // Create toolbar container at top
+ if (lo == 'top')
+ t._addToolbars(tb, o);
+
+ // Create external toolbar
+ if (lo == 'external') {
+ n = c = DOM.create('div', {style : 'position:relative'});
+ n = DOM.add(n, 'div', {id : ed.id + '_external', 'class' : 'mceExternalToolbar'});
+ DOM.add(n, 'a', {id : ed.id + '_external_close', href : 'javascript:;', 'class' : 'mceExternalClose'});
+ n = DOM.add(n, 'table', {id : ed.id + '_tblext', cellSpacing : 0, cellPadding : 0});
+ etb = DOM.add(n, 'tbody');
+
+ if (p.firstChild.className == 'mceOldBoxModel')
+ p.firstChild.appendChild(c);
+ else
+ p.insertBefore(c, p.firstChild);
+
+ t._addToolbars(etb, o);
+
+ ed.onMouseUp.add(function() {
+ var e = DOM.get(ed.id + '_external');
+ DOM.show(e);
+
+ DOM.hide(lastExtID);
+
+ var f = Event.add(ed.id + '_external_close', 'click', function() {
+ DOM.hide(ed.id + '_external');
+ Event.remove(ed.id + '_external_close', 'click', f);
+ return false;
+ });
+
+ DOM.show(e);
+ DOM.setStyle(e, 'top', 0 - DOM.getRect(ed.id + '_tblext').h - 1);
+
+ // Fixes IE rendering bug
+ DOM.hide(e);
+ DOM.show(e);
+ e.style.filter = '';
+
+ lastExtID = ed.id + '_external';
+
+ e = null;
+ });
+ }
+
+ if (sl == 'top')
+ t._addStatusBar(tb, o);
+
+ // Create iframe container
+ if (!s.theme_advanced_toolbar_container) {
+ n = DOM.add(tb, 'tr');
+ n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
+ }
+
+ // Create toolbar container at bottom
+ if (lo == 'bottom')
+ t._addToolbars(tb, o);
+
+ if (sl == 'bottom')
+ t._addStatusBar(tb, o);
+
+ return ic;
+ },
+
+ _rowLayout : function(s, tb, o) {
+ var t = this, ed = t.editor, dc, da, cf = ed.controlManager, n, ic, to, a;
+
+ dc = s.theme_advanced_containers_default_class || '';
+ da = s.theme_advanced_containers_default_align || 'center';
+
+ each(explode(s.theme_advanced_containers || ''), function(c, i) {
+ var v = s['theme_advanced_container_' + c] || '';
+
+ switch (c.toLowerCase()) {
+ case 'mceeditor':
+ n = DOM.add(tb, 'tr');
+ n = ic = DOM.add(n, 'td', {'class' : 'mceIframeContainer'});
+ break;
+
+ case 'mceelementpath':
+ t._addStatusBar(tb, o);
+ break;
+
+ default:
+ a = (s['theme_advanced_container_' + c + '_align'] || da).toLowerCase();
+ a = 'mce' + t._ufirst(a);
+
+ n = DOM.add(DOM.add(tb, 'tr'), 'td', {
+ 'class' : 'mceToolbar ' + (s['theme_advanced_container_' + c + '_class'] || dc) + ' ' + a || da
+ });
+
+ to = cf.createToolbar("toolbar" + i);
+ t._addControls(v, to);
+ DOM.setHTML(n, to.renderHTML());
+ o.deltaHeight -= s.theme_advanced_row_height;
+ }
+ });
+
+ return ic;
+ },
+
+ _addControls : function(v, tb) {
+ var t = this, s = t.settings, di, cf = t.editor.controlManager;
+
+ if (s.theme_advanced_disable && !t._disabled) {
+ di = {};
+
+ each(explode(s.theme_advanced_disable), function(v) {
+ di[v] = 1;
+ });
+
+ t._disabled = di;
+ } else
+ di = t._disabled;
+
+ each(explode(v), function(n) {
+ var c;
+
+ if (di && di[n])
+ return;
+
+ // Compatiblity with 2.x
+ if (n == 'tablecontrols') {
+ each(["table","|","row_props","cell_props","|","row_before","row_after","delete_row","|","col_before","col_after","delete_col","|","split_cells","merge_cells"], function(n) {
+ n = t.createControl(n, cf);
+
+ if (n)
+ tb.add(n);
+ });
+
+ return;
+ }
+
+ c = t.createControl(n, cf);
+
+ if (c)
+ tb.add(c);
+ });
+ },
+
+ _addToolbars : function(c, o) {
+ var t = this, i, tb, ed = t.editor, s = t.settings, v, cf = ed.controlManager, di, n, h = [], a, toolbarGroup, toolbarsExist = false;
+
+ toolbarGroup = cf.createToolbarGroup('toolbargroup', {
+ 'name': ed.getLang('advanced.toolbar'),
+ 'tab_focus_toolbar':ed.getParam('theme_advanced_tab_focus_toolbar')
+ });
+
+ t.toolbarGroup = toolbarGroup;
+
+ a = s.theme_advanced_toolbar_align.toLowerCase();
+ a = 'mce' + t._ufirst(a);
+
+ n = DOM.add(DOM.add(c, 'tr', {role: 'presentation'}), 'td', {'class' : 'mceToolbar ' + a, "role":"toolbar"});
+
+ // Create toolbar and add the controls
+ for (i=1; (v = s['theme_advanced_buttons' + i]); i++) {
+ toolbarsExist = true;
+ tb = cf.createToolbar("toolbar" + i, {'class' : 'mceToolbarRow' + i});
+
+ if (s['theme_advanced_buttons' + i + '_add'])
+ v += ',' + s['theme_advanced_buttons' + i + '_add'];
+
+ if (s['theme_advanced_buttons' + i + '_add_before'])
+ v = s['theme_advanced_buttons' + i + '_add_before'] + ',' + v;
+
+ t._addControls(v, tb);
+ toolbarGroup.add(tb);
+
+ o.deltaHeight -= s.theme_advanced_row_height;
+ }
+ // Handle case when there are no toolbar buttons and ensure editor height is adjusted accordingly
+ if (!toolbarsExist)
+ o.deltaHeight -= s.theme_advanced_row_height;
+ h.push(toolbarGroup.renderHTML());
+ h.push(DOM.createHTML('a', {href : '#', accesskey : 'z', title : ed.getLang("advanced.toolbar_focus"), onfocus : 'tinyMCE.getInstanceById(\'' + ed.id + '\').focus();'}, ''));
+ DOM.setHTML(n, h.join(''));
+ },
+
+ _addStatusBar : function(tb, o) {
+ var n, t = this, ed = t.editor, s = t.settings, r, mf, me, td;
+
+ n = DOM.add(tb, 'tr');
+ n = td = DOM.add(n, 'td', {'class' : 'mceStatusbar'});
+ n = DOM.add(n, 'div', {id : ed.id + '_path_row', 'role': 'group', 'aria-labelledby': ed.id + '_path_voice'});
+ if (s.theme_advanced_path) {
+ DOM.add(n, 'span', {id: ed.id + '_path_voice'}, ed.translate('advanced.path'));
+ DOM.add(n, 'span', {}, ': ');
+ } else {
+ DOM.add(n, 'span', {}, ' ');
+ }
+
+
+ if (s.theme_advanced_resizing) {
+ DOM.add(td, 'a', {id : ed.id + '_resize', href : 'javascript:;', onclick : "return false;", 'class' : 'mceResize', tabIndex:"-1"});
+
+ if (s.theme_advanced_resizing_use_cookie) {
+ ed.onPostRender.add(function() {
+ var o = Cookie.getHash("TinyMCE_" + ed.id + "_size"), c = DOM.get(ed.id + '_tbl');
+
+ if (!o)
+ return;
+
+ t.resizeTo(o.cw, o.ch);
+ });
+ }
+
+ ed.onPostRender.add(function() {
+ Event.add(ed.id + '_resize', 'click', function(e) {
+ e.preventDefault();
+ });
+
+ Event.add(ed.id + '_resize', 'mousedown', function(e) {
+ var mouseMoveHandler1, mouseMoveHandler2,
+ mouseUpHandler1, mouseUpHandler2,
+ startX, startY, startWidth, startHeight, width, height, ifrElm;
+
+ function resizeOnMove(e) {
+ e.preventDefault();
+
+ width = startWidth + (e.screenX - startX);
+ height = startHeight + (e.screenY - startY);
+
+ t.resizeTo(width, height);
+ };
+
+ function endResize(e) {
+ // Stop listening
+ Event.remove(DOM.doc, 'mousemove', mouseMoveHandler1);
+ Event.remove(ed.getDoc(), 'mousemove', mouseMoveHandler2);
+ Event.remove(DOM.doc, 'mouseup', mouseUpHandler1);
+ Event.remove(ed.getDoc(), 'mouseup', mouseUpHandler2);
+
+ width = startWidth + (e.screenX - startX);
+ height = startHeight + (e.screenY - startY);
+ t.resizeTo(width, height, true);
+
+ ed.nodeChanged();
+ };
+
+ e.preventDefault();
+
+ // Get the current rect size
+ startX = e.screenX;
+ startY = e.screenY;
+ ifrElm = DOM.get(t.editor.id + '_ifr');
+ startWidth = width = ifrElm.clientWidth;
+ startHeight = height = ifrElm.clientHeight;
+
+ // Register envent handlers
+ mouseMoveHandler1 = Event.add(DOM.doc, 'mousemove', resizeOnMove);
+ mouseMoveHandler2 = Event.add(ed.getDoc(), 'mousemove', resizeOnMove);
+ mouseUpHandler1 = Event.add(DOM.doc, 'mouseup', endResize);
+ mouseUpHandler2 = Event.add(ed.getDoc(), 'mouseup', endResize);
+ });
+ });
+ }
+
+ o.deltaHeight -= 21;
+ n = tb = null;
+ },
+
+ _updateUndoStatus : function(ed) {
+ var cm = ed.controlManager, um = ed.undoManager;
+
+ cm.setDisabled('undo', !um.hasUndo() && !um.typing);
+ cm.setDisabled('redo', !um.hasRedo());
+ },
+
+ _nodeChanged : function(ed, cm, n, co, ob) {
+ var t = this, p, de = 0, v, c, s = t.settings, cl, fz, fn, fc, bc, formatNames, matches;
+
+ tinymce.each(t.stateControls, function(c) {
+ cm.setActive(c, ed.queryCommandState(t.controls[c][1]));
+ });
+
+ function getParent(name) {
+ var i, parents = ob.parents, func = name;
+
+ if (typeof(name) == 'string') {
+ func = function(node) {
+ return node.nodeName == name;
+ };
+ }
+
+ for (i = 0; i < parents.length; i++) {
+ if (func(parents[i]))
+ return parents[i];
+ }
+ };
+
+ cm.setActive('visualaid', ed.hasVisual);
+ t._updateUndoStatus(ed);
+ cm.setDisabled('outdent', !ed.queryCommandState('Outdent'));
+
+ p = getParent('A');
+ if (c = cm.get('link')) {
+ c.setDisabled((!p && co) || (p && !p.href));
+ c.setActive(!!p && (!p.name && !p.id));
+ }
+
+ if (c = cm.get('unlink')) {
+ c.setDisabled(!p && co);
+ c.setActive(!!p && !p.name && !p.id);
+ }
+
+ if (c = cm.get('anchor')) {
+ c.setActive(!co && !!p && (p.name || (p.id && !p.href)));
+ }
+
+ p = getParent('IMG');
+ if (c = cm.get('image'))
+ c.setActive(!co && !!p && n.className.indexOf('mceItem') == -1);
+
+ if (c = cm.get('styleselect')) {
+ t._importClasses();
+
+ formatNames = [];
+ each(c.items, function(item) {
+ formatNames.push(item.value);
+ });
+
+ matches = ed.formatter.matchAll(formatNames);
+ c.select(matches[0]);
+ tinymce.each(matches, function(match, index) {
+ if (index > 0) {
+ c.mark(match);
+ }
+ });
+ }
+
+ if (c = cm.get('formatselect')) {
+ p = getParent(ed.dom.isBlock);
+
+ if (p)
+ c.select(p.nodeName.toLowerCase());
+ }
+
+ // Find out current fontSize, fontFamily and fontClass
+ getParent(function(n) {
+ if (n.nodeName === 'SPAN') {
+ if (!cl && n.className)
+ cl = n.className;
+ }
+
+ if (ed.dom.is(n, s.theme_advanced_font_selector)) {
+ if (!fz && n.style.fontSize)
+ fz = n.style.fontSize;
+
+ if (!fn && n.style.fontFamily)
+ fn = n.style.fontFamily.replace(/[\"\']+/g, '').replace(/^([^,]+).*/, '$1').toLowerCase();
+
+ if (!fc && n.style.color)
+ fc = n.style.color;
+
+ if (!bc && n.style.backgroundColor)
+ bc = n.style.backgroundColor;
+ }
+
+ return false;
+ });
+
+ if (c = cm.get('fontselect')) {
+ c.select(function(v) {
+ return v.replace(/^([^,]+).*/, '$1').toLowerCase() == fn;
+ });
+ }
+
+ // Select font size
+ if (c = cm.get('fontsizeselect')) {
+ // Use computed style
+ if (s.theme_advanced_runtime_fontsize && !fz && !cl)
+ fz = ed.dom.getStyle(n, 'fontSize', true);
+
+ c.select(function(v) {
+ if (v.fontSize && v.fontSize === fz)
+ return true;
+
+ if (v['class'] && v['class'] === cl)
+ return true;
+ });
+ }
+
+ if (s.theme_advanced_show_current_color) {
+ function updateColor(controlId, color) {
+ if (c = cm.get(controlId)) {
+ if (!color)
+ color = c.settings.default_color;
+ if (color !== c.value) {
+ c.displayColor(color);
+ }
+ }
+ }
+ updateColor('forecolor', fc);
+ updateColor('backcolor', bc);
+ }
+
+ if (s.theme_advanced_show_current_color) {
+ function updateColor(controlId, color) {
+ if (c = cm.get(controlId)) {
+ if (!color)
+ color = c.settings.default_color;
+ if (color !== c.value) {
+ c.displayColor(color);
+ }
+ }
+ };
+
+ updateColor('forecolor', fc);
+ updateColor('backcolor', bc);
+ }
+
+ if (s.theme_advanced_path && s.theme_advanced_statusbar_location) {
+ p = DOM.get(ed.id + '_path') || DOM.add(ed.id + '_path_row', 'span', {id : ed.id + '_path'});
+
+ if (t.statusKeyboardNavigation) {
+ t.statusKeyboardNavigation.destroy();
+ t.statusKeyboardNavigation = null;
+ }
+
+ DOM.setHTML(p, '');
+
+ getParent(function(n) {
+ var na = n.nodeName.toLowerCase(), u, pi, ti = '';
+
+ // Ignore non element and bogus/hidden elements
+ if (n.nodeType != 1 || na === 'br' || n.getAttribute('data-mce-bogus') || DOM.hasClass(n, 'mceItemHidden') || DOM.hasClass(n, 'mceItemRemoved'))
+ return;
+
+ // Handle prefix
+ if (tinymce.isIE && n.scopeName !== 'HTML' && n.scopeName)
+ na = n.scopeName + ':' + na;
+
+ // Remove internal prefix
+ na = na.replace(/mce\:/g, '');
+
+ // Handle node name
+ switch (na) {
+ case 'b':
+ na = 'strong';
+ break;
+
+ case 'i':
+ na = 'em';
+ break;
+
+ case 'img':
+ if (v = DOM.getAttrib(n, 'src'))
+ ti += 'src: ' + v + ' ';
+
+ break;
+
+ case 'a':
+ if (v = DOM.getAttrib(n, 'name')) {
+ ti += 'name: ' + v + ' ';
+ na += '#' + v;
+ }
+
+ if (v = DOM.getAttrib(n, 'href'))
+ ti += 'href: ' + v + ' ';
+
+ break;
+
+ case 'font':
+ if (v = DOM.getAttrib(n, 'face'))
+ ti += 'font: ' + v + ' ';
+
+ if (v = DOM.getAttrib(n, 'size'))
+ ti += 'size: ' + v + ' ';
+
+ if (v = DOM.getAttrib(n, 'color'))
+ ti += 'color: ' + v + ' ';
+
+ break;
+
+ case 'span':
+ if (v = DOM.getAttrib(n, 'style'))
+ ti += 'style: ' + v + ' ';
+
+ break;
+ }
+
+ if (v = DOM.getAttrib(n, 'id'))
+ ti += 'id: ' + v + ' ';
+
+ if (v = n.className) {
+ v = v.replace(/\b\s*(webkit|mce|Apple-)\w+\s*\b/g, '');
+
+ if (v) {
+ ti += 'class: ' + v + ' ';
+
+ if (ed.dom.isBlock(n) || na == 'img' || na == 'span')
+ na += '.' + v;
+ }
+ }
+
+ na = na.replace(/(html:)/g, '');
+ na = {name : na, node : n, title : ti};
+ t.onResolveName.dispatch(t, na);
+ ti = na.title;
+ na = na.name;
+
+ //u = "javascript:tinymce.EditorManager.get('" + ed.id + "').theme._sel('" + (de++) + "');";
+ pi = DOM.create('a', {'href' : "javascript:;", role: 'button', onmousedown : "return false;", title : ti, 'class' : 'mcePath_' + (de++)}, na);
+
+ if (p.hasChildNodes()) {
+ p.insertBefore(DOM.create('span', {'aria-hidden': 'true'}, '\u00a0\u00bb '), p.firstChild);
+ p.insertBefore(pi, p.firstChild);
+ } else
+ p.appendChild(pi);
+ }, ed.getBody());
+
+ if (DOM.select('a', p).length > 0) {
+ t.statusKeyboardNavigation = new tinymce.ui.KeyboardNavigation({
+ root: ed.id + "_path_row",
+ items: DOM.select('a', p),
+ excludeFromTabOrder: true,
+ onCancel: function() {
+ ed.focus();
+ }
+ }, DOM);
+ }
+ }
+ },
+
+ // Commands gets called by execCommand
+
+ _sel : function(v) {
+ this.editor.execCommand('mceSelectNodeDepth', false, v);
+ },
+
+ _mceInsertAnchor : function(ui, v) {
+ var ed = this.editor;
+
+ ed.windowManager.open({
+ url : this.url + '/anchor.htm',
+ width : 320 + parseInt(ed.getLang('advanced.anchor_delta_width', 0)),
+ height : 90 + parseInt(ed.getLang('advanced.anchor_delta_height', 0)),
+ inline : true
+ }, {
+ theme_url : this.url
+ });
+ },
+
+ _mceCharMap : function() {
+ var ed = this.editor;
+
+ ed.windowManager.open({
+ url : this.url + '/charmap.htm',
+ width : 550 + parseInt(ed.getLang('advanced.charmap_delta_width', 0)),
+ height : 265 + parseInt(ed.getLang('advanced.charmap_delta_height', 0)),
+ inline : true
+ }, {
+ theme_url : this.url
+ });
+ },
+
+ _mceHelp : function() {
+ var ed = this.editor;
+
+ ed.windowManager.open({
+ url : this.url + '/about.htm',
+ width : 480,
+ height : 380,
+ inline : true
+ }, {
+ theme_url : this.url
+ });
+ },
+
+ _mceShortcuts : function() {
+ var ed = this.editor;
+ ed.windowManager.open({
+ url: this.url + '/shortcuts.htm',
+ width: 480,
+ height: 380,
+ inline: true
+ }, {
+ theme_url: this.url
+ });
+ },
+
+ _mceColorPicker : function(u, v) {
+ var ed = this.editor;
+
+ v = v || {};
+
+ ed.windowManager.open({
+ url : this.url + '/color_picker.htm',
+ width : 375 + parseInt(ed.getLang('advanced.colorpicker_delta_width', 0)),
+ height : 250 + parseInt(ed.getLang('advanced.colorpicker_delta_height', 0)),
+ close_previous : false,
+ inline : true
+ }, {
+ input_color : v.color,
+ func : v.func,
+ theme_url : this.url
+ });
+ },
+
+ _mceCodeEditor : function(ui, val) {
+ var ed = this.editor;
+
+ ed.windowManager.open({
+ url : this.url + '/source_editor.htm',
+ width : parseInt(ed.getParam("theme_advanced_source_editor_width", 720)),
+ height : parseInt(ed.getParam("theme_advanced_source_editor_height", 580)),
+ inline : true,
+ resizable : true,
+ maximizable : true
+ }, {
+ theme_url : this.url
+ });
+ },
+
+ _mceImage : function(ui, val) {
+ var ed = this.editor;
+
+ // Internal image object like a flash placeholder
+ if (ed.dom.getAttrib(ed.selection.getNode(), 'class', '').indexOf('mceItem') != -1)
+ return;
+
+ ed.windowManager.open({
+ url : this.url + '/image.htm',
+ width : 355 + parseInt(ed.getLang('advanced.image_delta_width', 0)),
+ height : 275 + parseInt(ed.getLang('advanced.image_delta_height', 0)),
+ inline : true
+ }, {
+ theme_url : this.url
+ });
+ },
+
+ _mceLink : function(ui, val) {
+ var ed = this.editor;
+
+ ed.windowManager.open({
+ url : this.url + '/link.htm',
+ width : 310 + parseInt(ed.getLang('advanced.link_delta_width', 0)),
+ height : 200 + parseInt(ed.getLang('advanced.link_delta_height', 0)),
+ inline : true
+ }, {
+ theme_url : this.url
+ });
+ },
+
+ _mceNewDocument : function() {
+ var ed = this.editor;
+
+ ed.windowManager.confirm('advanced.newdocument', function(s) {
+ if (s)
+ ed.execCommand('mceSetContent', false, '');
+ });
+ },
+
+ _mceForeColor : function() {
+ var t = this;
+
+ this._mceColorPicker(0, {
+ color: t.fgColor,
+ func : function(co) {
+ t.fgColor = co;
+ t.editor.execCommand('ForeColor', false, co);
+ }
+ });
+ },
+
+ _mceBackColor : function() {
+ var t = this;
+
+ this._mceColorPicker(0, {
+ color: t.bgColor,
+ func : function(co) {
+ t.bgColor = co;
+ t.editor.execCommand('HiliteColor', false, co);
+ }
+ });
+ },
+
+ _ufirst : function(s) {
+ return s.substring(0, 1).toUpperCase() + s.substring(1);
+ }
+ });
+
+ tinymce.ThemeManager.add('advanced', tinymce.themes.AdvancedTheme);
+}(tinymce));
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/image.htm b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/image.htm
new file mode 100644
index 0000000..b8ba729
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/image.htm
@@ -0,0 +1,80 @@
+
+
+
+ {#advanced_dlg.image_title}
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg
new file mode 100644
index 0000000..b1a377a
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/colorpicker.jpg differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif
new file mode 100644
index 0000000..dec3f7c
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/flash.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif
new file mode 100644
index 0000000..ca22249
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/icons.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif
new file mode 100644
index 0000000..410c7ad
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/iframe.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif
new file mode 100644
index 0000000..acdf408
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/pagebreak.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif
new file mode 100644
index 0000000..8f10e7a
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/quicktime.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif
new file mode 100644
index 0000000..fdfe0b9
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/realmedia.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif
new file mode 100644
index 0000000..9314d04
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/shockwave.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif
new file mode 100644
index 0000000..3884865
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/trans.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif
new file mode 100644
index 0000000..3570104
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/video.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gif
new file mode 100644
index 0000000..ab50f2d
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/img/windowsmedia.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js
new file mode 100644
index 0000000..5b35845
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/about.js
@@ -0,0 +1,73 @@
+tinyMCEPopup.requireLangPack();
+
+function init() {
+ var ed, tcont;
+
+ tinyMCEPopup.resizeToInnerSize();
+ ed = tinyMCEPopup.editor;
+
+ // Give FF some time
+ window.setTimeout(insertHelpIFrame, 10);
+
+ tcont = document.getElementById('plugintablecontainer');
+ document.getElementById('plugins_tab').style.display = 'none';
+
+ var html = "";
+ html += '';
+ html += '';
+ html += '';
+ html += '| ' + ed.getLang('advanced_dlg.about_plugin') + ' | ';
+ html += '' + ed.getLang('advanced_dlg.about_author') + ' | ';
+ html += '' + ed.getLang('advanced_dlg.about_version') + ' | ';
+ html += '
';
+ html += '';
+ html += '';
+
+ tinymce.each(ed.plugins, function(p, n) {
+ var info;
+
+ if (!p.getInfo)
+ return;
+
+ html += '';
+
+ info = p.getInfo();
+
+ if (info.infourl != null && info.infourl != '')
+ html += '| ' + info.longname + ' | ';
+ else
+ html += '' + info.longname + ' | ';
+
+ if (info.authorurl != null && info.authorurl != '')
+ html += '' + info.author + ' | ';
+ else
+ html += '' + info.author + ' | ';
+
+ html += '' + info.version + ' | ';
+ html += '
';
+
+ document.getElementById('plugins_tab').style.display = '';
+
+ });
+
+ html += '';
+ html += '
';
+
+ tcont.innerHTML = html;
+
+ tinyMCEPopup.dom.get('version').innerHTML = tinymce.majorVersion + "." + tinymce.minorVersion;
+ tinyMCEPopup.dom.get('date').innerHTML = tinymce.releaseDate;
+}
+
+function insertHelpIFrame() {
+ var html;
+
+ if (tinyMCEPopup.getParam('docs_url')) {
+ html = '';
+ document.getElementById('iframecontainer').innerHTML = html;
+ document.getElementById('help_tab').style.display = 'block';
+ document.getElementById('help_tab').setAttribute("aria-hidden", "false");
+ }
+}
+
+tinyMCEPopup.onInit.add(init);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js
new file mode 100644
index 0000000..2909a3a
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/anchor.js
@@ -0,0 +1,56 @@
+tinyMCEPopup.requireLangPack();
+
+var AnchorDialog = {
+ init : function(ed) {
+ var action, elm, f = document.forms[0];
+
+ this.editor = ed;
+ elm = ed.dom.getParent(ed.selection.getNode(), 'A');
+ v = ed.dom.getAttrib(elm, 'name') || ed.dom.getAttrib(elm, 'id');
+
+ if (v) {
+ this.action = 'update';
+ f.anchorName.value = v;
+ }
+
+ f.insert.value = ed.getLang(elm ? 'update' : 'insert');
+ },
+
+ update : function() {
+ var ed = this.editor, elm, name = document.forms[0].anchorName.value, attribName;
+
+ if (!name || !/^[a-z][a-z0-9\-\_:\.]*$/i.test(name)) {
+ tinyMCEPopup.alert('advanced_dlg.anchor_invalid');
+ return;
+ }
+
+ tinyMCEPopup.restoreSelection();
+
+ if (this.action != 'update')
+ ed.selection.collapse(1);
+
+ var aRule = ed.schema.getElementRule('a');
+ if (!aRule || aRule.attributes.name) {
+ attribName = 'name';
+ } else {
+ attribName = 'id';
+ }
+
+ elm = ed.dom.getParent(ed.selection.getNode(), 'A');
+ if (elm) {
+ elm.setAttribute(attribName, name);
+ elm[attribName] = name;
+ ed.undoManager.add();
+ } else {
+ // create with zero-sized nbsp so that in Webkit where anchor is on last line by itself caret cannot be placed after it
+ var attrs = {'class' : 'mceItemAnchor'};
+ attrs[attribName] = name;
+ ed.execCommand('mceInsertContent', 0, ed.dom.createHTML('a', attrs, '\uFEFF'));
+ ed.nodeChanged();
+ }
+
+ tinyMCEPopup.close();
+ }
+};
+
+tinyMCEPopup.onInit.add(AnchorDialog.init, AnchorDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js
new file mode 100644
index 0000000..bb18695
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/charmap.js
@@ -0,0 +1,363 @@
+/**
+ * charmap.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+tinyMCEPopup.requireLangPack();
+
+var charmap = [
+ [' ', ' ', true, 'no-break space'],
+ ['&', '&', true, 'ampersand'],
+ ['"', '"', true, 'quotation mark'],
+// finance
+ ['¢', '¢', true, 'cent sign'],
+ ['€', '€', true, 'euro sign'],
+ ['£', '£', true, 'pound sign'],
+ ['¥', '¥', true, 'yen sign'],
+// signs
+ ['©', '©', true, 'copyright sign'],
+ ['®', '®', true, 'registered sign'],
+ ['™', '™', true, 'trade mark sign'],
+ ['‰', '‰', true, 'per mille sign'],
+ ['µ', 'µ', true, 'micro sign'],
+ ['·', '·', true, 'middle dot'],
+ ['•', '•', true, 'bullet'],
+ ['…', '…', true, 'three dot leader'],
+ ['′', '′', true, 'minutes / feet'],
+ ['″', '″', true, 'seconds / inches'],
+ ['§', '§', true, 'section sign'],
+ ['¶', '¶', true, 'paragraph sign'],
+ ['ß', 'ß', true, 'sharp s / ess-zed'],
+// quotations
+ ['‹', '‹', true, 'single left-pointing angle quotation mark'],
+ ['›', '›', true, 'single right-pointing angle quotation mark'],
+ ['«', '«', true, 'left pointing guillemet'],
+ ['»', '»', true, 'right pointing guillemet'],
+ ['‘', '‘', true, 'left single quotation mark'],
+ ['’', '’', true, 'right single quotation mark'],
+ ['“', '“', true, 'left double quotation mark'],
+ ['”', '”', true, 'right double quotation mark'],
+ ['‚', '‚', true, 'single low-9 quotation mark'],
+ ['„', '„', true, 'double low-9 quotation mark'],
+ ['<', '<', true, 'less-than sign'],
+ ['>', '>', true, 'greater-than sign'],
+ ['≤', '≤', true, 'less-than or equal to'],
+ ['≥', '≥', true, 'greater-than or equal to'],
+ ['–', '–', true, 'en dash'],
+ ['—', '—', true, 'em dash'],
+ ['¯', '¯', true, 'macron'],
+ ['‾', '‾', true, 'overline'],
+ ['¤', '¤', true, 'currency sign'],
+ ['¦', '¦', true, 'broken bar'],
+ ['¨', '¨', true, 'diaeresis'],
+ ['¡', '¡', true, 'inverted exclamation mark'],
+ ['¿', '¿', true, 'turned question mark'],
+ ['ˆ', 'ˆ', true, 'circumflex accent'],
+ ['˜', '˜', true, 'small tilde'],
+ ['°', '°', true, 'degree sign'],
+ ['−', '−', true, 'minus sign'],
+ ['±', '±', true, 'plus-minus sign'],
+ ['÷', '÷', true, 'division sign'],
+ ['⁄', '⁄', true, 'fraction slash'],
+ ['×', '×', true, 'multiplication sign'],
+ ['¹', '¹', true, 'superscript one'],
+ ['²', '²', true, 'superscript two'],
+ ['³', '³', true, 'superscript three'],
+ ['¼', '¼', true, 'fraction one quarter'],
+ ['½', '½', true, 'fraction one half'],
+ ['¾', '¾', true, 'fraction three quarters'],
+// math / logical
+ ['ƒ', 'ƒ', true, 'function / florin'],
+ ['∫', '∫', true, 'integral'],
+ ['∑', '∑', true, 'n-ary sumation'],
+ ['∞', '∞', true, 'infinity'],
+ ['√', '√', true, 'square root'],
+ ['∼', '∼', false,'similar to'],
+ ['≅', '≅', false,'approximately equal to'],
+ ['≈', '≈', true, 'almost equal to'],
+ ['≠', '≠', true, 'not equal to'],
+ ['≡', '≡', true, 'identical to'],
+ ['∈', '∈', false,'element of'],
+ ['∉', '∉', false,'not an element of'],
+ ['∋', '∋', false,'contains as member'],
+ ['∏', '∏', true, 'n-ary product'],
+ ['∧', '∧', false,'logical and'],
+ ['∨', '∨', false,'logical or'],
+ ['¬', '¬', true, 'not sign'],
+ ['∩', '∩', true, 'intersection'],
+ ['∪', '∪', false,'union'],
+ ['∂', '∂', true, 'partial differential'],
+ ['∀', '∀', false,'for all'],
+ ['∃', '∃', false,'there exists'],
+ ['∅', '∅', false,'diameter'],
+ ['∇', '∇', false,'backward difference'],
+ ['∗', '∗', false,'asterisk operator'],
+ ['∝', '∝', false,'proportional to'],
+ ['∠', '∠', false,'angle'],
+// undefined
+ ['´', '´', true, 'acute accent'],
+ ['¸', '¸', true, 'cedilla'],
+ ['ª', 'ª', true, 'feminine ordinal indicator'],
+ ['º', 'º', true, 'masculine ordinal indicator'],
+ ['†', '†', true, 'dagger'],
+ ['‡', '‡', true, 'double dagger'],
+// alphabetical special chars
+ ['À', 'À', true, 'A - grave'],
+ ['Á', 'Á', true, 'A - acute'],
+ ['Â', 'Â', true, 'A - circumflex'],
+ ['Ã', 'Ã', true, 'A - tilde'],
+ ['Ä', 'Ä', true, 'A - diaeresis'],
+ ['Å', 'Å', true, 'A - ring above'],
+ ['Æ', 'Æ', true, 'ligature AE'],
+ ['Ç', 'Ç', true, 'C - cedilla'],
+ ['È', 'È', true, 'E - grave'],
+ ['É', 'É', true, 'E - acute'],
+ ['Ê', 'Ê', true, 'E - circumflex'],
+ ['Ë', 'Ë', true, 'E - diaeresis'],
+ ['Ì', 'Ì', true, 'I - grave'],
+ ['Í', 'Í', true, 'I - acute'],
+ ['Î', 'Î', true, 'I - circumflex'],
+ ['Ï', 'Ï', true, 'I - diaeresis'],
+ ['Ð', 'Ð', true, 'ETH'],
+ ['Ñ', 'Ñ', true, 'N - tilde'],
+ ['Ò', 'Ò', true, 'O - grave'],
+ ['Ó', 'Ó', true, 'O - acute'],
+ ['Ô', 'Ô', true, 'O - circumflex'],
+ ['Õ', 'Õ', true, 'O - tilde'],
+ ['Ö', 'Ö', true, 'O - diaeresis'],
+ ['Ø', 'Ø', true, 'O - slash'],
+ ['Œ', 'Œ', true, 'ligature OE'],
+ ['Š', 'Š', true, 'S - caron'],
+ ['Ù', 'Ù', true, 'U - grave'],
+ ['Ú', 'Ú', true, 'U - acute'],
+ ['Û', 'Û', true, 'U - circumflex'],
+ ['Ü', 'Ü', true, 'U - diaeresis'],
+ ['Ý', 'Ý', true, 'Y - acute'],
+ ['Ÿ', 'Ÿ', true, 'Y - diaeresis'],
+ ['Þ', 'Þ', true, 'THORN'],
+ ['à', 'à', true, 'a - grave'],
+ ['á', 'á', true, 'a - acute'],
+ ['â', 'â', true, 'a - circumflex'],
+ ['ã', 'ã', true, 'a - tilde'],
+ ['ä', 'ä', true, 'a - diaeresis'],
+ ['å', 'å', true, 'a - ring above'],
+ ['æ', 'æ', true, 'ligature ae'],
+ ['ç', 'ç', true, 'c - cedilla'],
+ ['è', 'è', true, 'e - grave'],
+ ['é', 'é', true, 'e - acute'],
+ ['ê', 'ê', true, 'e - circumflex'],
+ ['ë', 'ë', true, 'e - diaeresis'],
+ ['ì', 'ì', true, 'i - grave'],
+ ['í', 'í', true, 'i - acute'],
+ ['î', 'î', true, 'i - circumflex'],
+ ['ï', 'ï', true, 'i - diaeresis'],
+ ['ð', 'ð', true, 'eth'],
+ ['ñ', 'ñ', true, 'n - tilde'],
+ ['ò', 'ò', true, 'o - grave'],
+ ['ó', 'ó', true, 'o - acute'],
+ ['ô', 'ô', true, 'o - circumflex'],
+ ['õ', 'õ', true, 'o - tilde'],
+ ['ö', 'ö', true, 'o - diaeresis'],
+ ['ø', 'ø', true, 'o slash'],
+ ['œ', 'œ', true, 'ligature oe'],
+ ['š', 'š', true, 's - caron'],
+ ['ù', 'ù', true, 'u - grave'],
+ ['ú', 'ú', true, 'u - acute'],
+ ['û', 'û', true, 'u - circumflex'],
+ ['ü', 'ü', true, 'u - diaeresis'],
+ ['ý', 'ý', true, 'y - acute'],
+ ['þ', 'þ', true, 'thorn'],
+ ['ÿ', 'ÿ', true, 'y - diaeresis'],
+ ['Α', 'Α', true, 'Alpha'],
+ ['Β', 'Β', true, 'Beta'],
+ ['Γ', 'Γ', true, 'Gamma'],
+ ['Δ', 'Δ', true, 'Delta'],
+ ['Ε', 'Ε', true, 'Epsilon'],
+ ['Ζ', 'Ζ', true, 'Zeta'],
+ ['Η', 'Η', true, 'Eta'],
+ ['Θ', 'Θ', true, 'Theta'],
+ ['Ι', 'Ι', true, 'Iota'],
+ ['Κ', 'Κ', true, 'Kappa'],
+ ['Λ', 'Λ', true, 'Lambda'],
+ ['Μ', 'Μ', true, 'Mu'],
+ ['Ν', 'Ν', true, 'Nu'],
+ ['Ξ', 'Ξ', true, 'Xi'],
+ ['Ο', 'Ο', true, 'Omicron'],
+ ['Π', 'Π', true, 'Pi'],
+ ['Ρ', 'Ρ', true, 'Rho'],
+ ['Σ', 'Σ', true, 'Sigma'],
+ ['Τ', 'Τ', true, 'Tau'],
+ ['Υ', 'Υ', true, 'Upsilon'],
+ ['Φ', 'Φ', true, 'Phi'],
+ ['Χ', 'Χ', true, 'Chi'],
+ ['Ψ', 'Ψ', true, 'Psi'],
+ ['Ω', 'Ω', true, 'Omega'],
+ ['α', 'α', true, 'alpha'],
+ ['β', 'β', true, 'beta'],
+ ['γ', 'γ', true, 'gamma'],
+ ['δ', 'δ', true, 'delta'],
+ ['ε', 'ε', true, 'epsilon'],
+ ['ζ', 'ζ', true, 'zeta'],
+ ['η', 'η', true, 'eta'],
+ ['θ', 'θ', true, 'theta'],
+ ['ι', 'ι', true, 'iota'],
+ ['κ', 'κ', true, 'kappa'],
+ ['λ', 'λ', true, 'lambda'],
+ ['μ', 'μ', true, 'mu'],
+ ['ν', 'ν', true, 'nu'],
+ ['ξ', 'ξ', true, 'xi'],
+ ['ο', 'ο', true, 'omicron'],
+ ['π', 'π', true, 'pi'],
+ ['ρ', 'ρ', true, 'rho'],
+ ['ς', 'ς', true, 'final sigma'],
+ ['σ', 'σ', true, 'sigma'],
+ ['τ', 'τ', true, 'tau'],
+ ['υ', 'υ', true, 'upsilon'],
+ ['φ', 'φ', true, 'phi'],
+ ['χ', 'χ', true, 'chi'],
+ ['ψ', 'ψ', true, 'psi'],
+ ['ω', 'ω', true, 'omega'],
+// symbols
+ ['ℵ', 'ℵ', false,'alef symbol'],
+ ['ϖ', 'ϖ', false,'pi symbol'],
+ ['ℜ', 'ℜ', false,'real part symbol'],
+ ['ϑ','ϑ', false,'theta symbol'],
+ ['ϒ', 'ϒ', false,'upsilon - hook symbol'],
+ ['℘', '℘', false,'Weierstrass p'],
+ ['ℑ', 'ℑ', false,'imaginary part'],
+// arrows
+ ['←', '←', true, 'leftwards arrow'],
+ ['↑', '↑', true, 'upwards arrow'],
+ ['→', '→', true, 'rightwards arrow'],
+ ['↓', '↓', true, 'downwards arrow'],
+ ['↔', '↔', true, 'left right arrow'],
+ ['↵', '↵', false,'carriage return'],
+ ['⇐', '⇐', false,'leftwards double arrow'],
+ ['⇑', '⇑', false,'upwards double arrow'],
+ ['⇒', '⇒', false,'rightwards double arrow'],
+ ['⇓', '⇓', false,'downwards double arrow'],
+ ['⇔', '⇔', false,'left right double arrow'],
+ ['∴', '∴', false,'therefore'],
+ ['⊂', '⊂', false,'subset of'],
+ ['⊃', '⊃', false,'superset of'],
+ ['⊄', '⊄', false,'not a subset of'],
+ ['⊆', '⊆', false,'subset of or equal to'],
+ ['⊇', '⊇', false,'superset of or equal to'],
+ ['⊕', '⊕', false,'circled plus'],
+ ['⊗', '⊗', false,'circled times'],
+ ['⊥', '⊥', false,'perpendicular'],
+ ['⋅', '⋅', false,'dot operator'],
+ ['⌈', '⌈', false,'left ceiling'],
+ ['⌉', '⌉', false,'right ceiling'],
+ ['⌊', '⌊', false,'left floor'],
+ ['⌋', '⌋', false,'right floor'],
+ ['〈', '〈', false,'left-pointing angle bracket'],
+ ['〉', '〉', false,'right-pointing angle bracket'],
+ ['◊', '◊', true, 'lozenge'],
+ ['♠', '♠', true, 'black spade suit'],
+ ['♣', '♣', true, 'black club suit'],
+ ['♥', '♥', true, 'black heart suit'],
+ ['♦', '♦', true, 'black diamond suit'],
+ [' ', ' ', false,'en space'],
+ [' ', ' ', false,'em space'],
+ [' ', ' ', false,'thin space'],
+ ['', '', false,'zero width non-joiner'],
+ ['', '', false,'zero width joiner'],
+ ['', '', false,'left-to-right mark'],
+ ['', '', false,'right-to-left mark'],
+ ['', '', false,'soft hyphen']
+];
+
+tinyMCEPopup.onInit.add(function() {
+ tinyMCEPopup.dom.setHTML('charmapView', renderCharMapHTML());
+ addKeyboardNavigation();
+});
+
+function addKeyboardNavigation(){
+ var tableElm, cells, settings;
+
+ cells = tinyMCEPopup.dom.select("a.charmaplink", "charmapgroup");
+
+ settings ={
+ root: "charmapgroup",
+ items: cells
+ };
+ cells[0].tabindex=0;
+ tinyMCEPopup.dom.addClass(cells[0], "mceFocus");
+ if (tinymce.isGecko) {
+ cells[0].focus();
+ } else {
+ setTimeout(function(){
+ cells[0].focus();
+ }, 100);
+ }
+ tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', settings, tinyMCEPopup.dom);
+}
+
+function renderCharMapHTML() {
+ var charsPerRow = 20, tdWidth=20, tdHeight=20, i;
+ var html = ''+
+ '
';
+ var cols=-1;
+
+ for (i=0; i'
+ + ''
+ + charmap[i][1]
+ + '';
+ if ((cols+1) % charsPerRow == 0)
+ html += '
';
+ }
+ }
+
+ if (cols % charsPerRow > 0) {
+ var padd = charsPerRow - (cols % charsPerRow);
+ for (var i=0; i ';
+ }
+
+ html += '
';
+ html = html.replace(/<\/tr>/g, '');
+
+ return html;
+}
+
+function insertChar(chr) {
+ tinyMCEPopup.execCommand('mceInsertContent', false, '' + chr + ';');
+
+ // Refocus in window
+ if (tinyMCEPopup.isWindow)
+ window.focus();
+
+ tinyMCEPopup.editor.focus();
+ tinyMCEPopup.close();
+}
+
+function previewChar(codeA, codeB, codeN) {
+ var elmA = document.getElementById('codeA');
+ var elmB = document.getElementById('codeB');
+ var elmV = document.getElementById('codeV');
+ var elmN = document.getElementById('codeN');
+
+ if (codeA=='#160;') {
+ elmV.innerHTML = '__';
+ } else {
+ elmV.innerHTML = '&' + codeA;
+ }
+
+ elmB.innerHTML = '&' + codeA;
+ elmA.innerHTML = '&' + codeB;
+ elmN.innerHTML = codeN;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js
new file mode 100644
index 0000000..cc891c1
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/color_picker.js
@@ -0,0 +1,345 @@
+tinyMCEPopup.requireLangPack();
+
+var detail = 50, strhex = "0123456789abcdef", i, isMouseDown = false, isMouseOver = false;
+
+var colors = [
+ "#000000","#000033","#000066","#000099","#0000cc","#0000ff","#330000","#330033",
+ "#330066","#330099","#3300cc","#3300ff","#660000","#660033","#660066","#660099",
+ "#6600cc","#6600ff","#990000","#990033","#990066","#990099","#9900cc","#9900ff",
+ "#cc0000","#cc0033","#cc0066","#cc0099","#cc00cc","#cc00ff","#ff0000","#ff0033",
+ "#ff0066","#ff0099","#ff00cc","#ff00ff","#003300","#003333","#003366","#003399",
+ "#0033cc","#0033ff","#333300","#333333","#333366","#333399","#3333cc","#3333ff",
+ "#663300","#663333","#663366","#663399","#6633cc","#6633ff","#993300","#993333",
+ "#993366","#993399","#9933cc","#9933ff","#cc3300","#cc3333","#cc3366","#cc3399",
+ "#cc33cc","#cc33ff","#ff3300","#ff3333","#ff3366","#ff3399","#ff33cc","#ff33ff",
+ "#006600","#006633","#006666","#006699","#0066cc","#0066ff","#336600","#336633",
+ "#336666","#336699","#3366cc","#3366ff","#666600","#666633","#666666","#666699",
+ "#6666cc","#6666ff","#996600","#996633","#996666","#996699","#9966cc","#9966ff",
+ "#cc6600","#cc6633","#cc6666","#cc6699","#cc66cc","#cc66ff","#ff6600","#ff6633",
+ "#ff6666","#ff6699","#ff66cc","#ff66ff","#009900","#009933","#009966","#009999",
+ "#0099cc","#0099ff","#339900","#339933","#339966","#339999","#3399cc","#3399ff",
+ "#669900","#669933","#669966","#669999","#6699cc","#6699ff","#999900","#999933",
+ "#999966","#999999","#9999cc","#9999ff","#cc9900","#cc9933","#cc9966","#cc9999",
+ "#cc99cc","#cc99ff","#ff9900","#ff9933","#ff9966","#ff9999","#ff99cc","#ff99ff",
+ "#00cc00","#00cc33","#00cc66","#00cc99","#00cccc","#00ccff","#33cc00","#33cc33",
+ "#33cc66","#33cc99","#33cccc","#33ccff","#66cc00","#66cc33","#66cc66","#66cc99",
+ "#66cccc","#66ccff","#99cc00","#99cc33","#99cc66","#99cc99","#99cccc","#99ccff",
+ "#cccc00","#cccc33","#cccc66","#cccc99","#cccccc","#ccccff","#ffcc00","#ffcc33",
+ "#ffcc66","#ffcc99","#ffcccc","#ffccff","#00ff00","#00ff33","#00ff66","#00ff99",
+ "#00ffcc","#00ffff","#33ff00","#33ff33","#33ff66","#33ff99","#33ffcc","#33ffff",
+ "#66ff00","#66ff33","#66ff66","#66ff99","#66ffcc","#66ffff","#99ff00","#99ff33",
+ "#99ff66","#99ff99","#99ffcc","#99ffff","#ccff00","#ccff33","#ccff66","#ccff99",
+ "#ccffcc","#ccffff","#ffff00","#ffff33","#ffff66","#ffff99","#ffffcc","#ffffff"
+];
+
+var named = {
+ '#F0F8FF':'Alice Blue','#FAEBD7':'Antique White','#00FFFF':'Aqua','#7FFFD4':'Aquamarine','#F0FFFF':'Azure','#F5F5DC':'Beige',
+ '#FFE4C4':'Bisque','#000000':'Black','#FFEBCD':'Blanched Almond','#0000FF':'Blue','#8A2BE2':'Blue Violet','#A52A2A':'Brown',
+ '#DEB887':'Burly Wood','#5F9EA0':'Cadet Blue','#7FFF00':'Chartreuse','#D2691E':'Chocolate','#FF7F50':'Coral','#6495ED':'Cornflower Blue',
+ '#FFF8DC':'Cornsilk','#DC143C':'Crimson','#00FFFF':'Cyan','#00008B':'Dark Blue','#008B8B':'Dark Cyan','#B8860B':'Dark Golden Rod',
+ '#A9A9A9':'Dark Gray','#A9A9A9':'Dark Grey','#006400':'Dark Green','#BDB76B':'Dark Khaki','#8B008B':'Dark Magenta','#556B2F':'Dark Olive Green',
+ '#FF8C00':'Darkorange','#9932CC':'Dark Orchid','#8B0000':'Dark Red','#E9967A':'Dark Salmon','#8FBC8F':'Dark Sea Green','#483D8B':'Dark Slate Blue',
+ '#2F4F4F':'Dark Slate Gray','#2F4F4F':'Dark Slate Grey','#00CED1':'Dark Turquoise','#9400D3':'Dark Violet','#FF1493':'Deep Pink','#00BFFF':'Deep Sky Blue',
+ '#696969':'Dim Gray','#696969':'Dim Grey','#1E90FF':'Dodger Blue','#B22222':'Fire Brick','#FFFAF0':'Floral White','#228B22':'Forest Green',
+ '#FF00FF':'Fuchsia','#DCDCDC':'Gainsboro','#F8F8FF':'Ghost White','#FFD700':'Gold','#DAA520':'Golden Rod','#808080':'Gray','#808080':'Grey',
+ '#008000':'Green','#ADFF2F':'Green Yellow','#F0FFF0':'Honey Dew','#FF69B4':'Hot Pink','#CD5C5C':'Indian Red','#4B0082':'Indigo','#FFFFF0':'Ivory',
+ '#F0E68C':'Khaki','#E6E6FA':'Lavender','#FFF0F5':'Lavender Blush','#7CFC00':'Lawn Green','#FFFACD':'Lemon Chiffon','#ADD8E6':'Light Blue',
+ '#F08080':'Light Coral','#E0FFFF':'Light Cyan','#FAFAD2':'Light Golden Rod Yellow','#D3D3D3':'Light Gray','#D3D3D3':'Light Grey','#90EE90':'Light Green',
+ '#FFB6C1':'Light Pink','#FFA07A':'Light Salmon','#20B2AA':'Light Sea Green','#87CEFA':'Light Sky Blue','#778899':'Light Slate Gray','#778899':'Light Slate Grey',
+ '#B0C4DE':'Light Steel Blue','#FFFFE0':'Light Yellow','#00FF00':'Lime','#32CD32':'Lime Green','#FAF0E6':'Linen','#FF00FF':'Magenta','#800000':'Maroon',
+ '#66CDAA':'Medium Aqua Marine','#0000CD':'Medium Blue','#BA55D3':'Medium Orchid','#9370D8':'Medium Purple','#3CB371':'Medium Sea Green','#7B68EE':'Medium Slate Blue',
+ '#00FA9A':'Medium Spring Green','#48D1CC':'Medium Turquoise','#C71585':'Medium Violet Red','#191970':'Midnight Blue','#F5FFFA':'Mint Cream','#FFE4E1':'Misty Rose','#FFE4B5':'Moccasin',
+ '#FFDEAD':'Navajo White','#000080':'Navy','#FDF5E6':'Old Lace','#808000':'Olive','#6B8E23':'Olive Drab','#FFA500':'Orange','#FF4500':'Orange Red','#DA70D6':'Orchid',
+ '#EEE8AA':'Pale Golden Rod','#98FB98':'Pale Green','#AFEEEE':'Pale Turquoise','#D87093':'Pale Violet Red','#FFEFD5':'Papaya Whip','#FFDAB9':'Peach Puff',
+ '#CD853F':'Peru','#FFC0CB':'Pink','#DDA0DD':'Plum','#B0E0E6':'Powder Blue','#800080':'Purple','#FF0000':'Red','#BC8F8F':'Rosy Brown','#4169E1':'Royal Blue',
+ '#8B4513':'Saddle Brown','#FA8072':'Salmon','#F4A460':'Sandy Brown','#2E8B57':'Sea Green','#FFF5EE':'Sea Shell','#A0522D':'Sienna','#C0C0C0':'Silver',
+ '#87CEEB':'Sky Blue','#6A5ACD':'Slate Blue','#708090':'Slate Gray','#708090':'Slate Grey','#FFFAFA':'Snow','#00FF7F':'Spring Green',
+ '#4682B4':'Steel Blue','#D2B48C':'Tan','#008080':'Teal','#D8BFD8':'Thistle','#FF6347':'Tomato','#40E0D0':'Turquoise','#EE82EE':'Violet',
+ '#F5DEB3':'Wheat','#FFFFFF':'White','#F5F5F5':'White Smoke','#FFFF00':'Yellow','#9ACD32':'Yellow Green'
+};
+
+var namedLookup = {};
+
+function init() {
+ var inputColor = convertRGBToHex(tinyMCEPopup.getWindowArg('input_color')), key, value;
+
+ tinyMCEPopup.resizeToInnerSize();
+
+ generatePicker();
+ generateWebColors();
+ generateNamedColors();
+
+ if (inputColor) {
+ changeFinalColor(inputColor);
+
+ col = convertHexToRGB(inputColor);
+
+ if (col)
+ updateLight(col.r, col.g, col.b);
+ }
+
+ for (key in named) {
+ value = named[key];
+ namedLookup[value.replace(/\s+/, '').toLowerCase()] = key.replace(/#/, '').toLowerCase();
+ }
+}
+
+function toHexColor(color) {
+ var matches, red, green, blue, toInt = parseInt;
+
+ function hex(value) {
+ value = parseInt(value).toString(16);
+
+ return value.length > 1 ? value : '0' + value; // Padd with leading zero
+ };
+
+ color = tinymce.trim(color);
+ color = color.replace(/^[#]/, '').toLowerCase(); // remove leading '#'
+ color = namedLookup[color] || color;
+
+ matches = /^rgb\((\d{1,3}),(\d{1,3}),(\d{1,3})\)$/.exec(color);
+
+ if (matches) {
+ red = toInt(matches[1]);
+ green = toInt(matches[2]);
+ blue = toInt(matches[3]);
+ } else {
+ matches = /^([0-9a-f]{2})([0-9a-f]{2})([0-9a-f]{2})$/.exec(color);
+
+ if (matches) {
+ red = toInt(matches[1], 16);
+ green = toInt(matches[2], 16);
+ blue = toInt(matches[3], 16);
+ } else {
+ matches = /^([0-9a-f])([0-9a-f])([0-9a-f])$/.exec(color);
+
+ if (matches) {
+ red = toInt(matches[1] + matches[1], 16);
+ green = toInt(matches[2] + matches[2], 16);
+ blue = toInt(matches[3] + matches[3], 16);
+ } else {
+ return '';
+ }
+ }
+ }
+
+ return '#' + hex(red) + hex(green) + hex(blue);
+}
+
+function insertAction() {
+ var color = document.getElementById("color").value, f = tinyMCEPopup.getWindowArg('func');
+
+ var hexColor = toHexColor(color);
+
+ if (hexColor === '') {
+ var text = tinyMCEPopup.editor.getLang('advanced_dlg.invalid_color_value');
+ tinyMCEPopup.alert(text + ': ' + color);
+ }
+ else {
+ tinyMCEPopup.restoreSelection();
+
+ if (f)
+ f(hexColor);
+
+ tinyMCEPopup.close();
+ }
+}
+
+function showColor(color, name) {
+ if (name)
+ document.getElementById("colorname").innerHTML = name;
+
+ document.getElementById("preview").style.backgroundColor = color;
+ document.getElementById("color").value = color.toUpperCase();
+}
+
+function convertRGBToHex(col) {
+ var re = new RegExp("rgb\\s*\\(\\s*([0-9]+).*,\\s*([0-9]+).*,\\s*([0-9]+).*\\)", "gi");
+
+ if (!col)
+ return col;
+
+ var rgb = col.replace(re, "$1,$2,$3").split(',');
+ if (rgb.length == 3) {
+ r = parseInt(rgb[0]).toString(16);
+ g = parseInt(rgb[1]).toString(16);
+ b = parseInt(rgb[2]).toString(16);
+
+ r = r.length == 1 ? '0' + r : r;
+ g = g.length == 1 ? '0' + g : g;
+ b = b.length == 1 ? '0' + b : b;
+
+ return "#" + r + g + b;
+ }
+
+ return col;
+}
+
+function convertHexToRGB(col) {
+ if (col.indexOf('#') != -1) {
+ col = col.replace(new RegExp('[^0-9A-F]', 'gi'), '');
+
+ r = parseInt(col.substring(0, 2), 16);
+ g = parseInt(col.substring(2, 4), 16);
+ b = parseInt(col.substring(4, 6), 16);
+
+ return {r : r, g : g, b : b};
+ }
+
+ return null;
+}
+
+function generatePicker() {
+ var el = document.getElementById('light'), h = '', i;
+
+ for (i = 0; i < detail; i++){
+ h += '';
+ }
+
+ el.innerHTML = h;
+}
+
+function generateWebColors() {
+ var el = document.getElementById('webcolors'), h = '', i;
+
+ if (el.className == 'generated')
+ return;
+
+ // TODO: VoiceOver doesn't seem to support legend as a label referenced by labelledby.
+ h += '';
+
+ el.innerHTML = h;
+ el.className = 'generated';
+
+ paintCanvas(el);
+ enableKeyboardNavigation(el.firstChild);
+}
+
+function paintCanvas(el) {
+ tinyMCEPopup.getWin().tinymce.each(tinyMCEPopup.dom.select('canvas.mceColorSwatch', el), function(canvas) {
+ var context;
+ if (canvas.getContext && (context = canvas.getContext("2d"))) {
+ context.fillStyle = canvas.getAttribute('data-color');
+ context.fillRect(0, 0, 10, 10);
+ }
+ });
+}
+function generateNamedColors() {
+ var el = document.getElementById('namedcolors'), h = '', n, v, i = 0;
+
+ if (el.className == 'generated')
+ return;
+
+ for (n in named) {
+ v = named[n];
+ h += '';
+ if (tinyMCEPopup.editor.forcedHighContrastMode) {
+ h += '';
+ }
+ h += '' + v + '';
+ h += '';
+ i++;
+ }
+
+ el.innerHTML = h;
+ el.className = 'generated';
+
+ paintCanvas(el);
+ enableKeyboardNavigation(el);
+}
+
+function enableKeyboardNavigation(el) {
+ tinyMCEPopup.editor.windowManager.createInstance('tinymce.ui.KeyboardNavigation', {
+ root: el,
+ items: tinyMCEPopup.dom.select('a', el)
+ }, tinyMCEPopup.dom);
+}
+
+function dechex(n) {
+ return strhex.charAt(Math.floor(n / 16)) + strhex.charAt(n % 16);
+}
+
+function computeColor(e) {
+ var x, y, partWidth, partDetail, imHeight, r, g, b, coef, i, finalCoef, finalR, finalG, finalB, pos = tinyMCEPopup.dom.getPos(e.target);
+
+ x = e.offsetX ? e.offsetX : (e.target ? e.clientX - pos.x : 0);
+ y = e.offsetY ? e.offsetY : (e.target ? e.clientY - pos.y : 0);
+
+ partWidth = document.getElementById('colors').width / 6;
+ partDetail = detail / 2;
+ imHeight = document.getElementById('colors').height;
+
+ r = (x >= 0)*(x < partWidth)*255 + (x >= partWidth)*(x < 2*partWidth)*(2*255 - x * 255 / partWidth) + (x >= 4*partWidth)*(x < 5*partWidth)*(-4*255 + x * 255 / partWidth) + (x >= 5*partWidth)*(x < 6*partWidth)*255;
+ g = (x >= 0)*(x < partWidth)*(x * 255 / partWidth) + (x >= partWidth)*(x < 3*partWidth)*255 + (x >= 3*partWidth)*(x < 4*partWidth)*(4*255 - x * 255 / partWidth);
+ b = (x >= 2*partWidth)*(x < 3*partWidth)*(-2*255 + x * 255 / partWidth) + (x >= 3*partWidth)*(x < 5*partWidth)*255 + (x >= 5*partWidth)*(x < 6*partWidth)*(6*255 - x * 255 / partWidth);
+
+ coef = (imHeight - y) / imHeight;
+ r = 128 + (r - 128) * coef;
+ g = 128 + (g - 128) * coef;
+ b = 128 + (b - 128) * coef;
+
+ changeFinalColor('#' + dechex(r) + dechex(g) + dechex(b));
+ updateLight(r, g, b);
+}
+
+function updateLight(r, g, b) {
+ var i, partDetail = detail / 2, finalCoef, finalR, finalG, finalB, color;
+
+ for (i=0; i=0) && (i');
+ },
+
+ init : function() {
+ var f = document.forms[0], ed = tinyMCEPopup.editor;
+
+ // Setup browse button
+ document.getElementById('srcbrowsercontainer').innerHTML = getBrowserHTML('srcbrowser','src','image','theme_advanced_image');
+ if (isVisible('srcbrowser'))
+ document.getElementById('src').style.width = '180px';
+
+ e = ed.selection.getNode();
+
+ this.fillFileList('image_list', tinyMCEPopup.getParam('external_image_list', 'tinyMCEImageList'));
+
+ if (e.nodeName == 'IMG') {
+ f.src.value = ed.dom.getAttrib(e, 'src');
+ f.alt.value = ed.dom.getAttrib(e, 'alt');
+ f.border.value = this.getAttrib(e, 'border');
+ f.vspace.value = this.getAttrib(e, 'vspace');
+ f.hspace.value = this.getAttrib(e, 'hspace');
+ f.width.value = ed.dom.getAttrib(e, 'width');
+ f.height.value = ed.dom.getAttrib(e, 'height');
+ f.insert.value = ed.getLang('update');
+ this.styleVal = ed.dom.getAttrib(e, 'style');
+ selectByValue(f, 'image_list', f.src.value);
+ selectByValue(f, 'align', this.getAttrib(e, 'align'));
+ this.updateStyle();
+ }
+ },
+
+ fillFileList : function(id, l) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+ l = typeof(l) === 'function' ? l() : window[l];
+
+ if (l && l.length > 0) {
+ lst.options[lst.options.length] = new Option('', '');
+
+ tinymce.each(l, function(o) {
+ lst.options[lst.options.length] = new Option(o[0], o[1]);
+ });
+ } else
+ dom.remove(dom.getParent(id, 'tr'));
+ },
+
+ update : function() {
+ var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, args = {}, el;
+
+ tinyMCEPopup.restoreSelection();
+
+ if (f.src.value === '') {
+ if (ed.selection.getNode().nodeName == 'IMG') {
+ ed.dom.remove(ed.selection.getNode());
+ ed.execCommand('mceRepaint');
+ }
+
+ tinyMCEPopup.close();
+ return;
+ }
+
+ if (!ed.settings.inline_styles) {
+ args = tinymce.extend(args, {
+ vspace : nl.vspace.value,
+ hspace : nl.hspace.value,
+ border : nl.border.value,
+ align : getSelectValue(f, 'align')
+ });
+ } else
+ args.style = this.styleVal;
+
+ tinymce.extend(args, {
+ src : f.src.value.replace(/ /g, '%20'),
+ alt : f.alt.value,
+ width : f.width.value,
+ height : f.height.value
+ });
+
+ el = ed.selection.getNode();
+
+ if (el && el.nodeName == 'IMG') {
+ ed.dom.setAttribs(el, args);
+ tinyMCEPopup.editor.execCommand('mceRepaint');
+ tinyMCEPopup.editor.focus();
+ } else {
+ tinymce.each(args, function(value, name) {
+ if (value === "") {
+ delete args[name];
+ }
+ });
+
+ ed.execCommand('mceInsertContent', false, tinyMCEPopup.editor.dom.createHTML('img', args), {skip_undo : 1});
+ ed.undoManager.add();
+ }
+
+ tinyMCEPopup.close();
+ },
+
+ updateStyle : function() {
+ var dom = tinyMCEPopup.dom, st = {}, v, f = document.forms[0];
+
+ if (tinyMCEPopup.editor.settings.inline_styles) {
+ tinymce.each(tinyMCEPopup.dom.parseStyle(this.styleVal), function(value, key) {
+ st[key] = value;
+ });
+
+ // Handle align
+ v = getSelectValue(f, 'align');
+ if (v) {
+ if (v == 'left' || v == 'right') {
+ st['float'] = v;
+ delete st['vertical-align'];
+ } else {
+ st['vertical-align'] = v;
+ delete st['float'];
+ }
+ } else {
+ delete st['float'];
+ delete st['vertical-align'];
+ }
+
+ // Handle border
+ v = f.border.value;
+ if (v || v == '0') {
+ if (v == '0')
+ st['border'] = '0';
+ else
+ st['border'] = v + 'px solid black';
+ } else
+ delete st['border'];
+
+ // Handle hspace
+ v = f.hspace.value;
+ if (v) {
+ delete st['margin'];
+ st['margin-left'] = v + 'px';
+ st['margin-right'] = v + 'px';
+ } else {
+ delete st['margin-left'];
+ delete st['margin-right'];
+ }
+
+ // Handle vspace
+ v = f.vspace.value;
+ if (v) {
+ delete st['margin'];
+ st['margin-top'] = v + 'px';
+ st['margin-bottom'] = v + 'px';
+ } else {
+ delete st['margin-top'];
+ delete st['margin-bottom'];
+ }
+
+ // Merge
+ st = tinyMCEPopup.dom.parseStyle(dom.serializeStyle(st), 'img');
+ this.styleVal = dom.serializeStyle(st, 'img');
+ }
+ },
+
+ getAttrib : function(e, at) {
+ var ed = tinyMCEPopup.editor, dom = ed.dom, v, v2;
+
+ if (ed.settings.inline_styles) {
+ switch (at) {
+ case 'align':
+ if (v = dom.getStyle(e, 'float'))
+ return v;
+
+ if (v = dom.getStyle(e, 'vertical-align'))
+ return v;
+
+ break;
+
+ case 'hspace':
+ v = dom.getStyle(e, 'margin-left')
+ v2 = dom.getStyle(e, 'margin-right');
+ if (v && v == v2)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+
+ case 'vspace':
+ v = dom.getStyle(e, 'margin-top')
+ v2 = dom.getStyle(e, 'margin-bottom');
+ if (v && v == v2)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+
+ case 'border':
+ v = 0;
+
+ tinymce.each(['top', 'right', 'bottom', 'left'], function(sv) {
+ sv = dom.getStyle(e, 'border-' + sv + '-width');
+
+ // False or not the same as prev
+ if (!sv || (sv != v && v !== 0)) {
+ v = 0;
+ return false;
+ }
+
+ if (sv)
+ v = sv;
+ });
+
+ if (v)
+ return parseInt(v.replace(/[^0-9]/g, ''));
+
+ break;
+ }
+ }
+
+ if (v = dom.getAttrib(e, at))
+ return v;
+
+ return '';
+ },
+
+ resetImageData : function() {
+ var f = document.forms[0];
+
+ f.width.value = f.height.value = "";
+ },
+
+ updateImageData : function() {
+ var f = document.forms[0], t = ImageDialog;
+
+ if (f.width.value == "")
+ f.width.value = t.preloadImg.width;
+
+ if (f.height.value == "")
+ f.height.value = t.preloadImg.height;
+ },
+
+ getImageData : function() {
+ var f = document.forms[0];
+
+ this.preloadImg = new Image();
+ this.preloadImg.onload = this.updateImageData;
+ this.preloadImg.onerror = this.resetImageData;
+ this.preloadImg.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(f.src.value);
+ }
+};
+
+ImageDialog.preInit();
+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js
new file mode 100644
index 0000000..8c1d73c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/link.js
@@ -0,0 +1,159 @@
+tinyMCEPopup.requireLangPack();
+
+var LinkDialog = {
+ preInit : function() {
+ var url;
+
+ if (url = tinyMCEPopup.getParam("external_link_list_url"))
+ document.write('');
+ },
+
+ init : function() {
+ var f = document.forms[0], ed = tinyMCEPopup.editor;
+
+ // Setup browse button
+ document.getElementById('hrefbrowsercontainer').innerHTML = getBrowserHTML('hrefbrowser', 'href', 'file', 'theme_advanced_link');
+ if (isVisible('hrefbrowser'))
+ document.getElementById('href').style.width = '180px';
+
+ this.fillClassList('class_list');
+ this.fillFileList('link_list', 'tinyMCELinkList');
+ this.fillTargetList('target_list');
+
+ if (e = ed.dom.getParent(ed.selection.getNode(), 'A')) {
+ f.href.value = ed.dom.getAttrib(e, 'href');
+ f.linktitle.value = ed.dom.getAttrib(e, 'title');
+ f.insert.value = ed.getLang('update');
+ selectByValue(f, 'link_list', f.href.value);
+ selectByValue(f, 'target_list', ed.dom.getAttrib(e, 'target'));
+ selectByValue(f, 'class_list', ed.dom.getAttrib(e, 'class'));
+ }
+ },
+
+ update : function() {
+ var f = document.forms[0], ed = tinyMCEPopup.editor, e, b, href = f.href.value.replace(/ /g, '%20');
+
+ tinyMCEPopup.restoreSelection();
+ e = ed.dom.getParent(ed.selection.getNode(), 'A');
+
+ // Remove element if there is no href
+ if (!f.href.value) {
+ if (e) {
+ b = ed.selection.getBookmark();
+ ed.dom.remove(e, 1);
+ ed.selection.moveToBookmark(b);
+ tinyMCEPopup.execCommand("mceEndUndoLevel");
+ tinyMCEPopup.close();
+ return;
+ }
+ }
+
+ // Create new anchor elements
+ if (e == null) {
+ ed.getDoc().execCommand("unlink", false, null);
+ tinyMCEPopup.execCommand("mceInsertLink", false, "#mce_temp_url#", {skip_undo : 1});
+
+ tinymce.each(ed.dom.select("a"), function(n) {
+ if (ed.dom.getAttrib(n, 'href') == '#mce_temp_url#') {
+ e = n;
+
+ ed.dom.setAttribs(e, {
+ href : href,
+ title : f.linktitle.value,
+ target : f.target_list ? getSelectValue(f, "target_list") : null,
+ 'class' : f.class_list ? getSelectValue(f, "class_list") : null
+ });
+ }
+ });
+ } else {
+ ed.dom.setAttribs(e, {
+ href : href,
+ title : f.linktitle.value
+ });
+
+ if (f.target_list) {
+ ed.dom.setAttrib(e, 'target', getSelectValue(f, "target_list"));
+ }
+
+ if (f.class_list) {
+ ed.dom.setAttrib(e, 'class', getSelectValue(f, "class_list"));
+ }
+ }
+
+ // Don't move caret if selection was image
+ if (e.childNodes.length != 1 || e.firstChild.nodeName != 'IMG') {
+ ed.focus();
+ ed.selection.select(e);
+ ed.selection.collapse(0);
+ tinyMCEPopup.storeSelection();
+ }
+
+ tinyMCEPopup.execCommand("mceEndUndoLevel");
+ tinyMCEPopup.close();
+ },
+
+ checkPrefix : function(n) {
+ if (n.value && Validator.isEmail(n) && !/^\s*mailto:/i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_email')))
+ n.value = 'mailto:' + n.value;
+
+ if (/^\s*www\./i.test(n.value) && confirm(tinyMCEPopup.getLang('advanced_dlg.link_is_external')))
+ n.value = 'http://' + n.value;
+ },
+
+ fillFileList : function(id, l) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+ l = window[l];
+
+ if (l && l.length > 0) {
+ lst.options[lst.options.length] = new Option('', '');
+
+ tinymce.each(l, function(o) {
+ lst.options[lst.options.length] = new Option(o[0], o[1]);
+ });
+ } else
+ dom.remove(dom.getParent(id, 'tr'));
+ },
+
+ fillClassList : function(id) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v, cl;
+
+ if (v = tinyMCEPopup.getParam('theme_advanced_styles')) {
+ cl = [];
+
+ tinymce.each(v.split(';'), function(v) {
+ var p = v.split('=');
+
+ cl.push({'title' : p[0], 'class' : p[1]});
+ });
+ } else
+ cl = tinyMCEPopup.editor.dom.getClasses();
+
+ if (cl.length > 0) {
+ lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+
+ tinymce.each(cl, function(o) {
+ lst.options[lst.options.length] = new Option(o.title || o['class'], o['class']);
+ });
+ } else
+ dom.remove(dom.getParent(id, 'tr'));
+ },
+
+ fillTargetList : function(id) {
+ var dom = tinyMCEPopup.dom, lst = dom.get(id), v;
+
+ lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('not_set'), '');
+ lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_same'), '_self');
+ lst.options[lst.options.length] = new Option(tinyMCEPopup.getLang('advanced_dlg.link_target_blank'), '_blank');
+
+ if (v = tinyMCEPopup.getParam('theme_advanced_link_targets')) {
+ tinymce.each(v.split(','), function(v) {
+ v = v.split('=');
+ lst.options[lst.options.length] = new Option(v[0], v[1]);
+ });
+ }
+ }
+};
+
+LinkDialog.preInit();
+tinyMCEPopup.onInit.add(LinkDialog.init, LinkDialog);
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js
new file mode 100644
index 0000000..dd5e366
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/js/source_editor.js
@@ -0,0 +1,78 @@
+tinyMCEPopup.requireLangPack();
+tinyMCEPopup.onInit.add(onLoadInit);
+
+function saveContent() {
+ tinyMCEPopup.editor.setContent(document.getElementById('htmlSource').value, {source_view : true});
+ tinyMCEPopup.close();
+}
+
+function onLoadInit() {
+ tinyMCEPopup.resizeToInnerSize();
+
+ // Remove Gecko spellchecking
+ if (tinymce.isGecko)
+ document.body.spellcheck = tinyMCEPopup.editor.getParam("gecko_spellcheck");
+
+ document.getElementById('htmlSource').value = tinyMCEPopup.editor.getContent({source_view : true});
+
+ if (tinyMCEPopup.editor.getParam("theme_advanced_source_editor_wrap", true)) {
+ turnWrapOn();
+ document.getElementById('wraped').checked = true;
+ }
+
+ resizeInputs();
+}
+
+function setWrap(val) {
+ var v, n, s = document.getElementById('htmlSource');
+
+ s.wrap = val;
+
+ if (!tinymce.isIE) {
+ v = s.value;
+ n = s.cloneNode(false);
+ n.setAttribute("wrap", val);
+ s.parentNode.replaceChild(n, s);
+ n.value = v;
+ }
+}
+
+function setWhiteSpaceCss(value) {
+ var el = document.getElementById('htmlSource');
+ tinymce.DOM.setStyle(el, 'white-space', value);
+}
+
+function turnWrapOff() {
+ if (tinymce.isWebKit) {
+ setWhiteSpaceCss('pre');
+ } else {
+ setWrap('off');
+ }
+}
+
+function turnWrapOn() {
+ if (tinymce.isWebKit) {
+ setWhiteSpaceCss('pre-wrap');
+ } else {
+ setWrap('soft');
+ }
+}
+
+function toggleWordWrap(elm) {
+ if (elm.checked) {
+ turnWrapOn();
+ } else {
+ turnWrapOff();
+ }
+}
+
+function resizeInputs() {
+ var vp = tinyMCEPopup.dom.getViewPort(window), el;
+
+ el = document.getElementById('htmlSource');
+
+ if (el) {
+ el.style.width = (vp.w - 20) + 'px';
+ el.style.height = (vp.h - 65) + 'px';
+ }
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js
new file mode 100644
index 0000000..6e58481
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advanced',{"underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)",dd:"Definition Description",dt:"Definition Term ",samp:"Code Sample",code:"Code",blockquote:"Block Quote",h6:"Heading 6",h5:"Heading 5",h4:"Heading 4",h3:"Heading 3",h2:"Heading 2",h1:"Heading 1",pre:"Preformatted",address:"Address",div:"DIV",paragraph:"Paragraph",block:"Format",fontdefault:"Font Family","font_size":"Font Size","style_select":"Styles","anchor_delta_height":"","anchor_delta_width":"","charmap_delta_height":"","charmap_delta_width":"","colorpicker_delta_height":"","colorpicker_delta_width":"","link_delta_height":"","link_delta_width":"","image_delta_height":"","image_delta_width":"","more_colors":"More Colors...","toolbar_focus":"Jump to tool buttons - Alt+Q, Jump to editor - Alt-Z, Jump to element path - Alt-X",newdocument:"Are you sure you want clear all contents?",path:"Path","clipboard_msg":"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?","blockquote_desc":"Block Quote","help_desc":"Help","newdocument_desc":"New Document","image_props_desc":"Image Properties","paste_desc":"Paste (Ctrl+V)","copy_desc":"Copy (Ctrl+C)","cut_desc":"Cut (Ctrl+X)","anchor_desc":"Insert/Edit Anchor","visualaid_desc":"show/Hide Guidelines/Invisible Elements","charmap_desc":"Insert Special Character","backcolor_desc":"Select Background Color","forecolor_desc":"Select Text Color","custom1_desc":"Your Custom Description Here","removeformat_desc":"Remove Formatting","hr_desc":"Insert Horizontal Line","sup_desc":"Superscript","sub_desc":"Subscript","code_desc":"Edit HTML Source","cleanup_desc":"Cleanup Messy Code","image_desc":"Insert/Edit Image","unlink_desc":"Unlink","link_desc":"Insert/Edit Link","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","indent_desc":"Increase Indent","outdent_desc":"Decrease Indent","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","justifyfull_desc":"Align Full","justifyright_desc":"Align Right","justifycenter_desc":"Align Center","justifyleft_desc":"Align Left","striketrough_desc":"Strikethrough","help_shortcut":"Press ALT-F10 for toolbar. Press ALT-0 for help","rich_text_area":"Rich Text Area","shortcuts_desc":"Accessability Help",toolbar:"Toolbar"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
new file mode 100644
index 0000000..50cd87e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/langs/en_dlg.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.advanced_dlg', {"link_list":"Link List","link_is_external":"The URL you entered seems to be an external link. Do you want to add the required http:// prefix?","link_is_email":"The URL you entered seems to be an email address. Do you want to add the required mailto: prefix?","link_titlefield":"Title","link_target_blank":"Open Link in a New Window","link_target_same":"Open Link in the Same Window","link_target":"Target","link_url":"Link URL","link_title":"Insert/Edit Link","image_align_right":"Right","image_align_left":"Left","image_align_textbottom":"Text Bottom","image_align_texttop":"Text Top","image_align_bottom":"Bottom","image_align_middle":"Middle","image_align_top":"Top","image_align_baseline":"Baseline","image_align":"Alignment","image_hspace":"Horizontal Space","image_vspace":"Vertical Space","image_dimensions":"Dimensions","image_alt":"Image Description","image_list":"Image List","image_border":"Border","image_src":"Image URL","image_title":"Insert/Edit Image","charmap_title":"Select Special Character", "charmap_usage":"Use left and right arrows to navigate.","colorpicker_name":"Name:","colorpicker_color":"Color:","colorpicker_named_title":"Named Colors","colorpicker_named_tab":"Named","colorpicker_palette_title":"Palette Colors","colorpicker_palette_tab":"Palette","colorpicker_picker_title":"Color Picker","colorpicker_picker_tab":"Picker","colorpicker_title":"Select a Color","code_wordwrap":"Word Wrap","code_title":"HTML Source Editor","anchor_name":"Anchor Name","anchor_title":"Insert/Edit Anchor","about_loaded":"Loaded Plugins","about_version":"Version","about_author":"Author","about_plugin":"Plugin","about_plugins":"Plugins","about_license":"License","about_help":"Help","about_general":"About","about_title":"About TinyMCE","anchor_invalid":"Please specify a valid anchor name.","accessibility_help":"Accessibility Help","accessibility_usage_title":"General Usage","invalid_color_value":"Invalid color value","":""});
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm
new file mode 100644
index 0000000..20ec2f5
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/shortcuts.htm
@@ -0,0 +1,47 @@
+
+
+
+ {#advanced_dlg.accessibility_help}
+
+
+
+
+ {#advanced_dlg.accessibility_usage_title}
+ Toolbars
+ Press ALT-F10 to move focus to the toolbars. Navigate through the buttons using the arrow keys.
+ Press enter to activate a button and return focus to the editor.
+ Press escape to return focus to the editor without performing any actions.
+
+ Status Bar
+ To access the editor status bar, press ALT-F11. Use the left and right arrow keys to navigate between elements in the path.
+ Press enter or space to select an element. Press escape to return focus to the editor without changing the selection.
+
+ Context Menu
+ Press shift-F10 to activate the context menu. Use the up and down arrow keys to move between menu items. To open sub-menus press the right arrow key.
+ To close submenus press the left arrow key. Press escape to close the context menu.
+
+ Keyboard Shortcuts
+
+
+
+ | Keystroke |
+ Function |
+
+
+
+
+ | Control-B | Bold |
+
+
+ | Control-I | Italic |
+
+
+ | Control-Z | Undo |
+
+
+ | Control-Y | Redo |
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css
new file mode 100644
index 0000000..2fd94a1
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/content.css
@@ -0,0 +1,50 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
+body {background:#FFF;}
+body.mceForceColors {background:#FFF; color:#000;}
+body.mceBrowserDefaults {background:transparent; color:inherit; font-size:inherit; font-family:inherit;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {display:inline-block; -webkit-user-select:all; -webkit-user-modify:read-only; -moz-user-select:all; -moz-user-modify:read-only; width:11px !important; height:11px !important; background:url(img/items.gif) no-repeat center center}
+span.mceItemNbsp {background: #DDD}
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}
+img {border:0;}
+table, img, hr, .mceItemAnchor {cursor:default}
+table td, table th {cursor:text}
+ins {border-bottom:1px solid green; text-decoration: none; color:green}
+del {color:red; text-decoration:line-through}
+cite {border-bottom:1px dashed blue}
+acronym {border-bottom:1px dotted #CCC; cursor:help}
+abbr {border-bottom:1px dashed #CCC; cursor:help}
+
+/* IE */
+* html body {
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+}
+
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}
+font[face=mceinline] {font-family:inherit !important}
+*[contentEditable]:focus {outline:0}
+
+.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc}
+.mceItemShockWave {background-image:url(../../img/shockwave.gif)}
+.mceItemFlash {background-image:url(../../img/flash.gif)}
+.mceItemQuickTime {background-image:url(../../img/quicktime.gif)}
+.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)}
+.mceItemRealMedia {background-image:url(../../img/realmedia.gif)}
+.mceItemVideo {background-image:url(../../img/video.gif)}
+.mceItemAudio {background-image:url(../../img/video.gif)}
+.mceItemEmbeddedAudio {background-image:url(../../img/video.gif)}
+.mceItemIframe {background-image:url(../../img/iframe.gif)}
+.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css
new file mode 100644
index 0000000..879786f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/dialog.css
@@ -0,0 +1,118 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDDDDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+background:#F0F0EE;
+padding:0;
+margin:8px 8px 0 8px;
+}
+
+html {background:#F0F0EE;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;}
+a:hover {color:#2B6FB6;}
+.nowrap {white-space: nowrap}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;}
+input.invalid {border:1px solid #EE0000;}
+input {background:#FFF; border:1px solid #CCC;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.button, .updateButton {
+border:0; margin:0; padding:0;
+font-weight:bold;
+width:94px; height:26px;
+background:url(img/buttons.png) 0 -26px;
+cursor:pointer;
+padding-bottom:2px;
+float:left;
+}
+
+#insert {background:url(img/buttons.png) 0 -52px}
+#cancel {background:url(img/buttons.png) 0 0; float:right}
+
+/* Browse */
+a.pickcolor, a.browse {text-decoration:none}
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal; background:url(img/tabs.gif) repeat-x 0 -72px;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; background:url(img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
+.tabs li.current {background:url(img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
+.tabs span {float:left; display:block; background:url(img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
+.tabs .current span {background:url(img/tabs.gif) no-repeat right -54px;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px}
+#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline}
+#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png
new file mode 100644
index 0000000..1e53560
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/buttons.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif
new file mode 100644
index 0000000..d2f9367
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/items.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif
new file mode 100644
index 0000000..85e31df
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_arrow.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif
new file mode 100644
index 0000000..adfdddc
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/menu_check.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif
new file mode 100644
index 0000000..5bb90fd
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/progress.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif
new file mode 100644
index 0000000..06812cb
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/img/tabs.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css
new file mode 100644
index 0000000..77083f3
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/default/ui.css
@@ -0,0 +1,219 @@
+/* Reset */
+.defaultSkin table, .defaultSkin tbody, .defaultSkin a, .defaultSkin img, .defaultSkin tr, .defaultSkin div, .defaultSkin td, .defaultSkin iframe, .defaultSkin span, .defaultSkin *, .defaultSkin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}
+.defaultSkin a:hover, .defaultSkin a:link, .defaultSkin a:visited, .defaultSkin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}
+.defaultSkin table td {vertical-align:middle}
+
+/* Containers */
+.defaultSkin table {direction:ltr;background:transparent}
+.defaultSkin iframe {display:block;}
+.defaultSkin .mceToolbar {height:26px}
+.defaultSkin .mceLeft {text-align:left}
+.defaultSkin .mceRight {text-align:right}
+
+/* External */
+.defaultSkin .mceExternalToolbar {position:absolute; border:1px solid #CCC; border-bottom:0; display:none;}
+.defaultSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.defaultSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}
+
+/* Layout */
+.defaultSkin table.mceLayout {border:0; border-left:1px solid #CCC; border-right:1px solid #CCC}
+.defaultSkin table.mceLayout tr.mceFirst td {border-top:1px solid #CCC}
+.defaultSkin table.mceLayout tr.mceLast td {border-bottom:1px solid #CCC}
+.defaultSkin table.mceToolbar, .defaultSkin tr.mceFirst .mceToolbar tr td, .defaultSkin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0;}
+.defaultSkin td.mceToolbar {background:#F0F0EE; padding-top:1px; vertical-align:top}
+.defaultSkin .mceIframeContainer {border-top:1px solid #CCC; border-bottom:1px solid #CCC}
+.defaultSkin .mceStatusbar {background:#F0F0EE; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; display:block; height:20px}
+.defaultSkin .mceStatusbar div {float:left; margin:2px}
+.defaultSkin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0}
+.defaultSkin .mceStatusbar a:hover {text-decoration:underline}
+.defaultSkin table.mceToolbar {margin-left:3px}
+.defaultSkin span.mceIcon, .defaultSkin img.mceIcon {display:block; width:20px; height:20px}
+.defaultSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+.defaultSkin td.mceCenter {text-align:center;}
+.defaultSkin td.mceCenter table {margin:0 auto; text-align:left;}
+.defaultSkin td.mceRight table {margin:0 0 0 auto;}
+
+/* Button */
+.defaultSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px; margin-right:1px}
+.defaultSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0}
+.defaultSkin a.mceButtonActive, .defaultSkin a.mceButtonSelected {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSkin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+.defaultSkin .mceButtonLabeled {width:auto}
+.defaultSkin .mceButtonLabeled span.mceIcon {float:left}
+.defaultSkin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica}
+.defaultSkin .mceButtonDisabled .mceButtonLabel {color:#888}
+
+/* Separator */
+.defaultSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:2px 2px 0 4px}
+
+/* ListBox */
+.defaultSkin .mceListBox, .defaultSkin .mceListBox a {display:block}
+.defaultSkin .mceListBox .mceText {padding-left:4px; width:70px; text-align:left; border:1px solid #CCC; border-right:0; background:#FFF; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}
+.defaultSkin .mceListBox .mceOpen {width:9px; height:20px; background:url(../../img/icons.gif) -741px 0; margin-right:2px; border:1px solid #CCC;}
+.defaultSkin table.mceListBoxEnabled:hover .mceText, .defaultSkin .mceListBoxHover .mceText, .defaultSkin .mceListBoxSelected .mceText {border:1px solid #A2ABC0; border-right:0; background:#FFF}
+.defaultSkin table.mceListBoxEnabled:hover .mceOpen, .defaultSkin .mceListBoxHover .mceOpen, .defaultSkin .mceListBoxSelected .mceOpen {background-color:#FFF; border:1px solid #A2ABC0}
+.defaultSkin .mceListBoxDisabled a.mceText {color:gray; background-color:transparent;}
+.defaultSkin .mceListBoxMenu {overflow:auto; overflow-x:hidden}
+.defaultSkin .mceOldBoxModel .mceListBox .mceText {height:22px}
+.defaultSkin .mceOldBoxModel .mceListBox .mceOpen {width:11px; height:22px;}
+.defaultSkin select.mceNativeListBox {font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:7pt; background:#F0F0EE; border:1px solid gray; margin-right:2px;}
+
+/* SplitButton */
+.defaultSkin .mceSplitButton {width:32px; height:20px; direction:ltr}
+.defaultSkin .mceSplitButton a, .defaultSkin .mceSplitButton span {height:20px; display:block}
+.defaultSkin .mceSplitButton a.mceAction {width:20px; border:1px solid #F0F0EE; border-right:0;}
+.defaultSkin .mceSplitButton span.mceAction {width:20px; background-image:url(../../img/icons.gif);}
+.defaultSkin .mceSplitButton a.mceOpen {width:9px; background:url(../../img/icons.gif) -741px 0; border:1px solid #F0F0EE;}
+.defaultSkin .mceSplitButton span.mceOpen {display:none}
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceAction, .defaultSkin .mceSplitButtonHover a.mceAction, .defaultSkin .mceSplitButtonSelected a.mceAction {border:1px solid #0A246A; border-right:0; background-color:#B2BBD0}
+.defaultSkin table.mceSplitButtonEnabled:hover a.mceOpen, .defaultSkin .mceSplitButtonHover a.mceOpen, .defaultSkin .mceSplitButtonSelected a.mceOpen {background-color:#B2BBD0; border:1px solid #0A246A;}
+.defaultSkin .mceSplitButtonDisabled .mceAction, .defaultSkin .mceSplitButtonDisabled a.mceOpen {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+.defaultSkin .mceSplitButtonActive a.mceAction {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSkin .mceSplitButtonActive a.mceOpen {border-left:0;}
+
+/* ColorSplitButton */
+.defaultSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}
+.defaultSkin .mceColorSplitMenu td {padding:2px}
+.defaultSkin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}
+.defaultSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.defaultSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}
+.defaultSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}
+.defaultSkin a.mceMoreColors:hover {border:1px solid #0A246A}
+.defaultSkin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a}
+.defaultSkin .mce_forecolor span.mceAction, .defaultSkin .mce_backcolor span.mceAction {overflow:hidden; height:16px}
+
+/* Menu */
+.defaultSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #D4D0C8; direction:ltr}
+.defaultSkin .mceNoIcons span.mceIcon {width:0;}
+.defaultSkin .mceNoIcons a .mceText {padding-left:10px}
+.defaultSkin .mceMenu table {background:#FFF}
+.defaultSkin .mceMenu a, .defaultSkin .mceMenu span, .defaultSkin .mceMenu {display:block}
+.defaultSkin .mceMenu td {height:20px}
+.defaultSkin .mceMenu a {position:relative;padding:3px 0 4px 0}
+.defaultSkin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}
+.defaultSkin .mceMenu span.mceText, .defaultSkin .mceMenu .mcePreview {font-size:11px}
+.defaultSkin .mceMenu pre.mceText {font-family:Monospace}
+.defaultSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}
+.defaultSkin .mceMenu .mceMenuItemEnabled a:hover, .defaultSkin .mceMenu .mceMenuItemActive {background-color:#dbecf3}
+.defaultSkin td.mceMenuItemSeparator {background:#DDD; height:1px}
+.defaultSkin .mceMenuItemTitle a {border:0; background:#EEE; border-bottom:1px solid #DDD}
+.defaultSkin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}
+.defaultSkin .mceMenuItemDisabled .mceText {color:#888}
+.defaultSkin .mceMenuItemSelected .mceIcon {background:url(img/menu_check.gif)}
+.defaultSkin .mceNoIcons .mceMenuItemSelected a {background:url(img/menu_arrow.gif) no-repeat -6px center}
+.defaultSkin .mceMenu span.mceMenuLine {display:none}
+.defaultSkin .mceMenuItemSub a {background:url(img/menu_arrow.gif) no-repeat top right;}
+.defaultSkin .mceMenuItem td, .defaultSkin .mceMenuItem th {line-height: normal}
+
+/* Progress,Resize */
+.defaultSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=50)'; filter:alpha(opacity=50); background:#FFF}
+.defaultSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+
+/* Rtl */
+.mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0}
+.mceRtl .mceMenuItem .mceText {text-align: right}
+
+/* Formats */
+.defaultSkin .mce_formatPreview a {font-size:10px}
+.defaultSkin .mce_p span.mceText {}
+.defaultSkin .mce_address span.mceText {font-style:italic}
+.defaultSkin .mce_pre span.mceText {font-family:monospace}
+.defaultSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.defaultSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.defaultSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.defaultSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.defaultSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.defaultSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
+
+/* Theme */
+.defaultSkin span.mce_bold {background-position:0 0}
+.defaultSkin span.mce_italic {background-position:-60px 0}
+.defaultSkin span.mce_underline {background-position:-140px 0}
+.defaultSkin span.mce_strikethrough {background-position:-120px 0}
+.defaultSkin span.mce_undo {background-position:-160px 0}
+.defaultSkin span.mce_redo {background-position:-100px 0}
+.defaultSkin span.mce_cleanup {background-position:-40px 0}
+.defaultSkin span.mce_bullist {background-position:-20px 0}
+.defaultSkin span.mce_numlist {background-position:-80px 0}
+.defaultSkin span.mce_justifyleft {background-position:-460px 0}
+.defaultSkin span.mce_justifyright {background-position:-480px 0}
+.defaultSkin span.mce_justifycenter {background-position:-420px 0}
+.defaultSkin span.mce_justifyfull {background-position:-440px 0}
+.defaultSkin span.mce_anchor {background-position:-200px 0}
+.defaultSkin span.mce_indent {background-position:-400px 0}
+.defaultSkin span.mce_outdent {background-position:-540px 0}
+.defaultSkin span.mce_link {background-position:-500px 0}
+.defaultSkin span.mce_unlink {background-position:-640px 0}
+.defaultSkin span.mce_sub {background-position:-600px 0}
+.defaultSkin span.mce_sup {background-position:-620px 0}
+.defaultSkin span.mce_removeformat {background-position:-580px 0}
+.defaultSkin span.mce_newdocument {background-position:-520px 0}
+.defaultSkin span.mce_image {background-position:-380px 0}
+.defaultSkin span.mce_help {background-position:-340px 0}
+.defaultSkin span.mce_code {background-position:-260px 0}
+.defaultSkin span.mce_hr {background-position:-360px 0}
+.defaultSkin span.mce_visualaid {background-position:-660px 0}
+.defaultSkin span.mce_charmap {background-position:-240px 0}
+.defaultSkin span.mce_paste {background-position:-560px 0}
+.defaultSkin span.mce_copy {background-position:-700px 0}
+.defaultSkin span.mce_cut {background-position:-680px 0}
+.defaultSkin span.mce_blockquote {background-position:-220px 0}
+.defaultSkin .mce_forecolor span.mceAction {background-position:-720px 0}
+.defaultSkin .mce_backcolor span.mceAction {background-position:-760px 0}
+.defaultSkin span.mce_forecolorpicker {background-position:-720px 0}
+.defaultSkin span.mce_backcolorpicker {background-position:-760px 0}
+
+/* Plugins */
+.defaultSkin span.mce_advhr {background-position:-0px -20px}
+.defaultSkin span.mce_ltr {background-position:-20px -20px}
+.defaultSkin span.mce_rtl {background-position:-40px -20px}
+.defaultSkin span.mce_emotions {background-position:-60px -20px}
+.defaultSkin span.mce_fullpage {background-position:-80px -20px}
+.defaultSkin span.mce_fullscreen {background-position:-100px -20px}
+.defaultSkin span.mce_iespell {background-position:-120px -20px}
+.defaultSkin span.mce_insertdate {background-position:-140px -20px}
+.defaultSkin span.mce_inserttime {background-position:-160px -20px}
+.defaultSkin span.mce_absolute {background-position:-180px -20px}
+.defaultSkin span.mce_backward {background-position:-200px -20px}
+.defaultSkin span.mce_forward {background-position:-220px -20px}
+.defaultSkin span.mce_insert_layer {background-position:-240px -20px}
+.defaultSkin span.mce_insertlayer {background-position:-260px -20px}
+.defaultSkin span.mce_movebackward {background-position:-280px -20px}
+.defaultSkin span.mce_moveforward {background-position:-300px -20px}
+.defaultSkin span.mce_media {background-position:-320px -20px}
+.defaultSkin span.mce_nonbreaking {background-position:-340px -20px}
+.defaultSkin span.mce_pastetext {background-position:-360px -20px}
+.defaultSkin span.mce_pasteword {background-position:-380px -20px}
+.defaultSkin span.mce_selectall {background-position:-400px -20px}
+.defaultSkin span.mce_preview {background-position:-420px -20px}
+.defaultSkin span.mce_print {background-position:-440px -20px}
+.defaultSkin span.mce_cancel {background-position:-460px -20px}
+.defaultSkin span.mce_save {background-position:-480px -20px}
+.defaultSkin span.mce_replace {background-position:-500px -20px}
+.defaultSkin span.mce_search {background-position:-520px -20px}
+.defaultSkin span.mce_styleprops {background-position:-560px -20px}
+.defaultSkin span.mce_table {background-position:-580px -20px}
+.defaultSkin span.mce_cell_props {background-position:-600px -20px}
+.defaultSkin span.mce_delete_table {background-position:-620px -20px}
+.defaultSkin span.mce_delete_col {background-position:-640px -20px}
+.defaultSkin span.mce_delete_row {background-position:-660px -20px}
+.defaultSkin span.mce_col_after {background-position:-680px -20px}
+.defaultSkin span.mce_col_before {background-position:-700px -20px}
+.defaultSkin span.mce_row_after {background-position:-720px -20px}
+.defaultSkin span.mce_row_before {background-position:-740px -20px}
+.defaultSkin span.mce_merge_cells {background-position:-760px -20px}
+.defaultSkin span.mce_table_props {background-position:-980px -20px}
+.defaultSkin span.mce_row_props {background-position:-780px -20px}
+.defaultSkin span.mce_split_cells {background-position:-800px -20px}
+.defaultSkin span.mce_template {background-position:-820px -20px}
+.defaultSkin span.mce_visualchars {background-position:-840px -20px}
+.defaultSkin span.mce_abbr {background-position:-860px -20px}
+.defaultSkin span.mce_acronym {background-position:-880px -20px}
+.defaultSkin span.mce_attribs {background-position:-900px -20px}
+.defaultSkin span.mce_cite {background-position:-920px -20px}
+.defaultSkin span.mce_del {background-position:-940px -20px}
+.defaultSkin span.mce_ins {background-position:-960px -20px}
+.defaultSkin span.mce_pagebreak {background-position:0 -40px}
+.defaultSkin span.mce_restoredraft {background-position:-20px -40px}
+.defaultSkin span.mce_spellchecker {background-position:-540px -20px}
+.defaultSkin span.mce_visualblocks {background-position: -40px -40px}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content.css
new file mode 100644
index 0000000..ee06484
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content.css
@@ -0,0 +1,30 @@
+/* -----------------------------------------------------------------------
+
+ Grappelli Skin - Tiny MCE
+ * based on Tiny MCE http://tinymce.moxiecode.com/
+
+ Grappelli Skin - Django Admin Interface
+ * http://code.google.com/p/django-grappelli/
+
+ Based on Django Admin Interface
+ * http://www.djangoproject.com
+
+ Developed for Mozilla Firefox 3.0+ / using CSS 3 Specifications
+
+ * See README for instructions on how to use Grappelli.
+ * For credits and origins, see AUTHORS.
+ * This is a compressed file. See the sources in the 'src' directory.
+
+ * Copyright (c) 2009, vonautomatisch werkstaetten. All rights reserved.
+ See LICENSE for more info.
+
+----------------------------------------------------------------------- */
+/* You can extend this CSS by adding your own CSS file with the the content_css option */
+
+/* Import other styles */
+@import url('content_base.css');
+@import url('content_typography.css');
+@import url('content_grid.css');
+
+/* All other custom styles (everything else what Grappelli users might want to deploy) */
+@import url('customized.css');
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_base.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_base.css
new file mode 100644
index 0000000..5d5ed2c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_base.css
@@ -0,0 +1,56 @@
+/* This file contains the CSS data for the editable area(iframe) of TinyMCE */
+/* You can extend this CSS by adding your own CSS file with the the content_css option */
+
+* html body {
+ overflow-y: auto !important; overflow-x: auto !important;
+ font-size: 0; line-height: 0;
+}
+
+body#tinymce, body#tinymce td, body#tinymce pre, body#tinymce ol, body#tinymce ul, body#tinymce li {
+ font-family: Arial, sans-serif;
+ font-size: 11px; line-height: 16px; font-weight: normal; color: #cc4343 !important;
+ white-space: normal;
+}
+body#tinymce {
+ margin: 0; padding: 10px 10px 10px 0 !important;
+ width: 620px;
+}
+body#tinymce.fullscreen {
+ width: 620px !important; /* Use this to apply the actual page-width and guarantee a wysiwyg content-structure */
+}
+
+a:link, a:visited, a:hover, a:active {
+ padding: 0;
+ color: #309bbf !important;
+ text-decoration: none !important;
+}
+
+a.external:link, a.external:visited, a.external:hover, a.external:active {
+ padding: 0;
+ color: #309bbf !important;
+ text-decoration: underline !important;
+}
+
+/* -- Absolute Break (Style=Umbruch) ---------- */
+
+.clear {
+ clear: both !important; padding: 2px 0;
+ border-top-width: 2px !important; border-bottom-width: 2px !important;
+}
+
+ol.clear, ul.clear { padding: 2px 0 2px 10px !important; }
+
+/* Clearing floats without extra markup
+ Based on How To Clear Floats Without Structural Markup by PiE
+ [http://www.positioniseverything.net/easyclearing.html] */
+
+.clearfix:after {
+ content: ".";
+ display: block;
+ height: 0;
+ clear: both;
+ visibility: hidden;
+}
+.clearfix {display: inline-block; border-top-width: 2px !important; border-bottom-width: 2px !important; }
+* html .clearfix {height: 1%;}
+.clearfix {display: block;}
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure.css
new file mode 100644
index 0000000..e3ba36e
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure.css
@@ -0,0 +1,72 @@
+/* -- Basic Elements ---------- */
+
+body#tinymce {
+ width: 630px; /* 10px more than body#tinymce in content_base.css to provide equal line-breaks */
+}
+body#tinymce.fullscreen {
+ padding-left: 10px !important;
+ width: 630px !important; /* 10px more than body#tinymce.fullscreen in content_base.css to provide equal line-breaks */
+ background: #eee;
+}
+
+/* -- Typographic Elements ---------- */
+
+body#tinymce h1,
+body#tinymce h2,
+body#tinymce h3,
+body#tinymce h4,
+body#tinymce p,
+body#tinymce ol,
+body#tinymce ul,
+body#tinymce code,
+body#tinymce pre,
+body#tinymce blockquote {
+ padding: 2px 5px 5px;
+ line-height: 16px !important;
+ background-color: #fff;
+}
+body#tinymce p.mce-grid-container {
+ padding: 2px 0 0;
+ line-height: 16px !important;
+ background-color: transparent;
+ border-top: 0px dashed #999 !important;
+ border-bottom: 0px solid #999 !important;
+}
+body#tinymce table.mceItemTable td {
+ border: 1px dashed #bbb !important;
+}
+body#tinymce div h1,
+body#tinymce div h2,
+body#tinymce div h3,
+body#tinymce div h4,
+body#tinymce div p,
+body#tinymce div code,
+body#tinymce div pre {
+ padding-left: 0;
+}
+
+body#tinymce h1:before,
+body#tinymce h2:before,
+body#tinymce h3:before,
+body#tinymce h4:before,
+body#tinymce p:before,
+body#tinymce ol:before,
+body#tinymce ul:before,
+body#tinymce code:before,
+body#tinymce pre:before,
+body#tinymce blockquote:before,
+body#tinymce div:before {
+ position: relative; display: block;
+ font-family: "Andale Mono"; font-size: 9px; font-weight: normal; color: #999;
+}
+body#tinymce ol:before,
+body#tinymce ul:before {
+ margin-left: -30px;
+}
+body#tinymce blockquote:before {
+ margin-left: -25px;
+}
+body#tinymce p.mce-grid-container:before {
+ margin-bottom: 3px;
+ color: #7c7c7c;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_cs.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_cs.css
new file mode 100644
index 0000000..abfb8db
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_cs.css
@@ -0,0 +1,17 @@
+/* -- Import Basic Documentstructure CSS ---------- */
+
+@import url('content_documentstructure.css');
+
+/* -- Language Specific Settings ---------- */
+
+body#tinymce h1:before { content: "Nadpis 1"; }
+body#tinymce h2:before { content: "Nadpis 2"; }
+body#tinymce h3:before { content: "Nadpis 3"; }
+body#tinymce h4:before { content: "Nadpis 4"; }
+body#tinymce ol:before { content: "Seřazený seznam"; }
+body#tinymce ul:before { content: "Neseřazený seznam"; }
+body#tinymce p:before { content: "Odstavec"; }
+body#tinymce code:before { content: "Kód programu"; }
+body#tinymce pre:before { content: "Předformátovaný text"; }
+body#tinymce blockquote:before { content: "Citace"; }
+body#tinymce div:before { content: "Div"; }
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_de.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_de.css
new file mode 100644
index 0000000..429dcac
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_de.css
@@ -0,0 +1,17 @@
+/* -- Import Basic Documentstructure CSS ---------- */
+
+@import url('content_documentstructure.css');
+
+/* -- Language Specific Settings ---------- */
+
+body#tinymce h1:before { content: "Überschrift 1"; }
+body#tinymce h2:before { content: "Überschrift 2"; }
+body#tinymce h3:before { content: "Überschrift 3"; }
+body#tinymce h4:before { content: "Überschrift 4"; }
+body#tinymce ol:before { content: "Sortierte Liste"; }
+body#tinymce ul:before { content: "Unsortierte Liste"; }
+body#tinymce p:before { content: "Absatz"; }
+body#tinymce p.mce-grid-container:before { content: "Template"; }
+body#tinymce code:before { content: "Code"; }
+body#tinymce pre:before { content: "Vorformatiert"; }
+body#tinymce blockquote:before { content: "Zitatblock"; }
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_en.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_en.css
new file mode 100644
index 0000000..f6ce62b
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_en.css
@@ -0,0 +1,17 @@
+/* -- Import Basic Documentstructure CSS ---------- */
+
+@import url('content_documentstructure.css');
+
+/* -- Language Specific Settings ---------- */
+
+body#tinymce h1:before { content: "Heading 1"; }
+body#tinymce h2:before { content: "Heading 2"; }
+body#tinymce h3:before { content: "Heading 3"; }
+body#tinymce h4:before { content: "Heading 4"; }
+body#tinymce ol:before { content: "Ordered List"; }
+body#tinymce ul:before { content: "Unordered List"; }
+body#tinymce p:before { content: "Paragraph"; }
+body#tinymce code:before { content: "Code"; }
+body#tinymce pre:before { content: "Preformatted"; }
+body#tinymce blockquote:before { content: "Blockquote"; }
+body#tinymce div:before { content: "Div"; }
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_pl.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_pl.css
new file mode 100644
index 0000000..306eb40
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_documentstructure_pl.css
@@ -0,0 +1,17 @@
+/* -- Import Basic Documentstructure CSS ---------- */
+
+@import url('content_documentstructure.css');
+
+/* -- Language Specific Settings ---------- */
+
+body#tinymce h2:before { content: "Nagłówek 1"; }
+body#tinymce h2:before { content: "Nagłówek 2"; }
+body#tinymce h3:before { content: "Nagłówek 3"; }
+body#tinymce h4:before { content: "Nagłówek 4"; }
+body#tinymce ol:before { content: "Lista numerowana"; }
+body#tinymce ul:before { content: "Lista nienumerowana"; }
+body#tinymce p:before { content: "Paragraf"; }
+body#tinymce code:before { content: "Kod"; }
+body#tinymce pre:before { content: "Preformatowane"; }
+body#tinymce blockquote:before { content: "Cytat"; }
+body#tinymce div:before { content: "Blok"; }
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_grid.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_grid.css
new file mode 100644
index 0000000..c203794
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_grid.css
@@ -0,0 +1,85 @@
+/* -----------------------------------------------------------------------
+
+ CSS for the display of grid-templates in the editor
+ Grid applies to tables & tabledesks instead of the originally used divs
+
+ Grid based on BLUEPRINT CSS
+ http://code.google.com/p/blueprintcss/
+
+----------------------------------------------------------------------- */
+
+
+
+/* Basic Grid Properties
+----------------------------------------------------------------------- */
+
+.span-1, .span-2, .span-3, .span-4,
+.span-5, .span-6, .span-7, .span-8,
+.span-9, .span-10, .span-11, .span-12,
+.span-13, .span-14, .span-15, .span-16,
+.span-17, .span-18, .span-19, .span-20,
+.span-21, .span-22, .span-23, .span-24 {
+ overflow: hidden !important;
+}
+
+/* Use these classes to set the width of a column. */
+.span-1 { width: 30px; }
+.span-2 { width: 70px; }
+.span-3 { width: 110px; }
+.span-4 { width: 150px; }
+.span-5 { width: 190px; }
+.span-6 { width: 230px; }
+.span-7 { width: 270px; }
+.span-8 { width: 310px; }
+.span-9 { width: 350px; }
+.span-10 { width: 390px; }
+.span-11 { width: 430px; }
+.span-12 { width: 470px; }
+.span-13 { width: 510px; }
+.span-14 { width: 550px; }
+.span-15 { width: 590px; }
+.span-16 { width: 630px; }
+.span-17 { width: 670px; }
+.span-18 { width: 710px; }
+.span-19 { width: 750px; }
+.span-20 { width: 790px; }
+.span-21 { width: 830px; }
+.span-22 { width: 870px; }
+.span-23 { width: 910px; }
+.span-24 { width: 950px; margin: 0; }
+
+
+
+/* Table - Grid Properties
+----------------------------------------------------------------------- */
+
+body#tinymce table.mceItemTable {
+ margin: 0 0 0 -1px; padding: 0;
+ border: 0 !important;
+ background: transparent;
+ table-layout: fixed;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+body#tinymce table.mceItemTable td {
+ margin: 0; padding: 0;
+ border: 1px dashed #ddd !important;
+ background: transparent;
+ vertical-align: top;
+}
+/* Simulates Blueprints class .last */
+body#tinymce table.mceItemTable td + td {
+ padding-left: 10px !important;
+}
+/* Nested Tables */
+table.mceItemTable td table.mceItemTable {
+ margin: -1px 0 -1px -1px !important;
+}
+
+
+
+/* Append, Prepend, Push, Pull, Borders & Misc Classes/Elements:
+ Not implemented yet.
+----------------------------------------------------------------------- */
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_typography.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_typography.css
new file mode 100644
index 0000000..fd66934
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/content_typography.css
@@ -0,0 +1,101 @@
+/* -- Typographic Elements ---------- */
+
+body#tinymce h1,
+body#tinymce h2,
+body#tinymce h3,
+body#tinymce h4,
+body#tinymce p,
+body#tinymce li,
+body#tinymce pre {
+ color: #666 !important;
+}
+body#tinymce h1,
+body#tinymce h2,
+body#tinymce h3,
+body#tinymce h4,
+body#tinymce p,
+body#tinymce ol,
+body#tinymce ul,
+body#tinymce code,
+body#tinymce pre,
+body#tinymce blockquote,
+body#tinymce div {
+ margin: 0 0 10px; padding: 0;
+}
+body#tinymce h1 {
+ font-size: 19px; line-height: 23px;
+}
+body#tinymce h2 {
+ font-size: 17px; line-height: 21px;
+}
+body#tinymce h3 {
+ font-size: 15px; line-height: 19px;
+}
+body#tinymce h4 {
+ font-size: 12px; line-height: 16px;
+}
+body#tinymce ol,
+body#tinymce ul {
+ padding-left: 35px !important;
+ list-style-position: outside;
+}
+body#tinymce ul {
+ list-style-type: disc;
+}
+body#tinymce ol li,
+body#tinymce ul li {
+ margin-bottom: 5px;
+}
+body#tinymce ol li:last-child,
+body#tinymce ul li:last-child {
+ margin-bottom: 0 !important;
+}
+body#tinymce pre,
+body#tinymce code {
+ font-family: "Andale Mono";
+}
+body#tinymce blockquote {
+ padding-left: 30px !important;
+}
+
+/* -- Divs ---------- */
+
+/*body#tinymce div {
+ min-height: 15px;
+ height: auto;
+ outline: 1px dashed #bbb;
+}*/
+
+/* -- Tables ---------- */
+
+/*body#tinymce table.mceItemTable {
+ margin: 0; padding: 0;
+ border: 0 !important;
+ background: #ebe9e6 !important;
+ table-layout: auto;
+ border-collapse: collapse;
+ border-spacing: 0;
+}
+body#tinymce table.mceItemTable td {
+ border: 1px dashed #ccc !important;
+ background: #ebe9e6 !important;
+}
+
+body#tinymce td {
+ vertical-align: top;
+}*/
+
+/* -- Images ---------- */
+
+body#tinymce img { float: none; border: none !important; }
+
+body#tinymce img.img_left { float: left !important; margin: 14px 20px 14px 0; }
+body#tinymce img.img_right { float: right !important; margin: 14px 0 14px 20px; border: none; }
+body#tinymce img.img_block { display: block; float: none !important; clear: both !important; margin: 14px 0 !important; border: none; }
+
+body#tinymce img.img_left_nospacetop { float: left !important; margin: 2px 20px 14px 0; }
+body#tinymce img.img_right_nospacetop { float: right !important; margin: 2px 0 14px 20px; border: none; }
+body#tinymce img.img_block_nospacetop { display: block; float: none !important; clear: both !important; margin: 2px 0 14px 0 !important; border: none; }
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/customized.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/customized.css
new file mode 100644
index 0000000..74eaece
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/customized.css
@@ -0,0 +1,22 @@
+/* -----------------------------------------------------------------------
+
+ Please use this file if you want to deploy any custom TinyMCE styles
+ which are not covered by the Grappelli skin.
+
+ If you use background-images make sure to put them into the folder
+ "img/customized/"
+
+----------------------------------------------------------------------- */
+
+
+
+/* Page Break
+----------------------------------------------------------------------- */
+
+body#tinymce img.mcePageBreak {
+ display: block;
+ width: 100%;
+ height: 16px;
+ margin-top: 12px;
+ background: #fff url(img/customized/pagebreak.png) 0 0 repeat-x;
+}
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/dialog.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/dialog.css
new file mode 100644
index 0000000..74eae1f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/dialog.css
@@ -0,0 +1,55 @@
+/* -----------------------------------------------------------------------
+
+ Grappelli Skin - Tiny MCE
+ * based on Tiny MCE http://tinymce.moxiecode.com/
+
+ Grappelli Skin - Django Admin Interface
+ * http://code.google.com/p/django-grappelli/
+
+ Based on Django Admin Interface
+ * http://www.djangoproject.com
+
+ Developed for Mozilla Firefox 3.0+ / using CSS 3 Specifications
+
+ * See README for instructions on how to use Grappelli.
+ * For credits and origins, see AUTHORS.
+ * This is a compressed file. See the sources in the 'src' directory.
+
+ * Copyright (c) 2009, vonautomatisch werkstaetten. All rights reserved.
+ See LICENSE for more info.
+
+----------------------------------------------------------------------- */
+
+
+/* Import & Modifications of Django/Grappelli styles
+----------------------------------------------------------------------- */
+@import url('../../../../../../../stylesheets/screen.css');
+@import url('../../../../../../../stylesheets/partials/custom/tinymce.css');
+@import url('../../../../../../../stylesheets/mueller/grid/output.css');
+
+
+
+/* Generic
+----------------------------------------------------------------------- */
+body {
+ clear: both;
+ margin: 0;
+ padding: 20px 20px 0;
+ height: 100%;
+ background: #fff !important;
+}
+body.filebrowser {
+ margin: 0 !important;
+}
+/*body > *:first-child {
+ margin-top: 20px;
+}*/
+
+html {
+ height: 100%;
+}
+html, body {
+ background: transparent;
+ overflow-x: hidden !important;
+ overflow-y: auto !important;
+}
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/blockquote.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/blockquote.png
new file mode 100644
index 0000000..a3758ef
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/blockquote.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bold.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bold.png
new file mode 100644
index 0000000..10a09f1
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bold.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bullist.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bullist.png
new file mode 100644
index 0000000..81dc1a9
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/bullist.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/charmap.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/charmap.png
new file mode 100644
index 0000000..56e0f05
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/charmap.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/cleanup.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/cleanup.png
new file mode 100644
index 0000000..497a5ad
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/cleanup.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/code.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/code.png
new file mode 100644
index 0000000..e36895f
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/code.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/fullscreen.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/fullscreen.png
new file mode 100644
index 0000000..bc65403
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/fullscreen.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/image.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/image.png
new file mode 100644
index 0000000..f410880
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/image.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/italic.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/italic.png
new file mode 100644
index 0000000..07f0e0f
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/italic.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifycenter.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifycenter.png
new file mode 100644
index 0000000..2458f91
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifycenter.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyfull.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyfull.png
new file mode 100644
index 0000000..6b3f6f0
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyfull.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyleft.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyleft.png
new file mode 100644
index 0000000..9a9611e
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyleft.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyright.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyright.png
new file mode 100644
index 0000000..efb5fd4
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/justifyright.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/link.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/link.png
new file mode 100644
index 0000000..4c569a2
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/link.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/media.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/media.png
new file mode 100644
index 0000000..6fc421d
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/media.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/numlist.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/numlist.png
new file mode 100644
index 0000000..267242e
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/numlist.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/pasteword.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/pasteword.png
new file mode 100644
index 0000000..7340816
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/pasteword.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/redo.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/redo.png
new file mode 100644
index 0000000..2f45444
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/redo.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/search.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/search.png
new file mode 100644
index 0000000..539d2bb
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/search.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/show_advanced.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/show_advanced.png
new file mode 100644
index 0000000..466d68a
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/show_advanced.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table.png
new file mode 100644
index 0000000..f36966c
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_cell_props.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_cell_props.png
new file mode 100644
index 0000000..1ff0004
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_cell_props.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_after.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_after.png
new file mode 100644
index 0000000..229f59c
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_after.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_before.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_before.png
new file mode 100644
index 0000000..3a682a5
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_col_before.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_col.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_col.png
new file mode 100644
index 0000000..8f5abac
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_col.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_row.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_row.png
new file mode 100644
index 0000000..1eec2c0
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_delete_row.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_merge_cells.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_merge_cells.png
new file mode 100644
index 0000000..85dc434
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_merge_cells.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_after.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_after.png
new file mode 100644
index 0000000..15311ab
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_after.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_before.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_before.png
new file mode 100644
index 0000000..f04e317
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_before.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_props.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_props.png
new file mode 100644
index 0000000..eca608b
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_row_props.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_split_cells.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_split_cells.png
new file mode 100644
index 0000000..614fefd
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/table_split_cells.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/template.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/template.png
new file mode 100644
index 0000000..b7b613d
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/template.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/underline.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/underline.png
new file mode 100644
index 0000000..9042cd3
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/underline.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/undo.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/undo.png
new file mode 100644
index 0000000..a5df8a4
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/undo.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/unlink.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/unlink.png
new file mode 100644
index 0000000..677b426
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/unlink.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/visualchars.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/visualchars.png
new file mode 100644
index 0000000..c075fc1
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/buttons/visualchars.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/button_pagebreak.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/button_pagebreak.png
new file mode 100644
index 0000000..bc9dead
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/button_pagebreak.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/pagebreak.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/pagebreak.png
new file mode 100644
index 0000000..b9f04bf
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/customized/pagebreak.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show-hover.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show-hover.png
new file mode 100644
index 0000000..0b20b49
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show-hover.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show.png
new file mode 100644
index 0000000..c5e796c
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-fb_show.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-mceResize.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-mceResize.png
new file mode 100644
index 0000000..22d4b0c
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/icons/icon-mceResize.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/menu/icon-mceOpen.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/menu/icon-mceOpen.png
new file mode 100644
index 0000000..9f5a976
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/img/menu/icon-mceOpen.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/ui.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/ui.css
new file mode 100644
index 0000000..f45146c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/grappelli/ui.css
@@ -0,0 +1,532 @@
+/* -----------------------------------------------------------------------
+
+ Grappelli Skin - Tiny MCE
+ * based on Tiny MCE http://tinymce.moxiecode.com/
+
+ Grappelli Skin - Django Admin Interface
+ * http://code.google.com/p/django-grappelli/
+
+ Based on Django Admin Interface
+ * http://www.djangoproject.com
+
+ Developed for Mozilla Firefox 3.0+ / using CSS 3 Specifications
+
+ * See README for instructions on how to use Grappelli.
+ * For credits and origins, see AUTHORS.
+ * This is a compressed file. See the sources in the 'src' directory.
+
+ * Copyright (c) 2009, vonautomatisch werkstaetten. All rights reserved.
+ See LICENSE for more info.
+
+----------------------------------------------------------------------- */
+
+
+
+/* Reset
+----------------------------------------------------------------------- */
+
+.grappelliSkin table, .grappelliSkin tbody, .grappelliSkin tr, .grappelliSkin td,
+.grappelliSkin div, .grappelliSkin iframe,
+.grappelliSkin a, .grappelliSkin img, .grappelliSkin span,
+.grappelliSkin *, .grappelliSkin .text {
+ margin: 0;
+ padding: 0;
+ width: auto;
+ font-family: Arial, sans-serif; font-size: 11px; line-height: 15px; font-weight: normal;
+ text-decoration: none; text-align: left; white-space: nowrap;
+ border: none;
+ border-collapse: separate;
+ background: transparent;
+ vertical-align: baseline;
+ cursor: default;
+}
+.grappelliSkin table, .grappelliSkin tbody, .grappelliSkin tr, .grappelliSkin td {
+ margin: 0 !important;
+ border: 0 !important;
+ outline: 0 !important;
+}
+.grappelliSkin a {
+ text-decoration: none;
+ cursor: pointer;
+}
+.grappelliSkin table td {
+ padding: 0;
+ vertical-align: middle;
+}
+.grappelliSkin table td > a:first-child,
+.grappelliSkin table th > a:first-child {
+ position: relative;
+ top: 0 !important;
+}
+
+body.rtl .grappelliSkin table, body.rtl .grappelliSkin tbody, body.rtl .grappelliSkin tr, body.rtl .grappelliSkin td,
+body.rtl .grappelliSkin div, body.rtl .grappelliSkin iframe,
+body.rtl .grappelliSkin a, body.rtl .grappelliSkin img, body.rtl .grappelliSkin span,
+body.rtl .grappelliSkin *, body.rtl .grappelliSkin .text {
+ text-align: right;
+}
+
+
+
+/* Containers
+----------------------------------------------------------------------- */
+
+.grappelliSkin table {
+ background: transparent;
+}
+.grappelliSkin iframe {
+ display: block;
+ position: relative; top: 0;
+ margin: 0; padding-top: 0;
+ border-top: 1px solid #fff;
+ border-bottom: 1px solid #d4d4d4;
+}
+.predelete .grappelliSkin iframe {
+ border-top: 1px solid #ffe5e5;
+ border-bottom: 1px solid #e5caca;
+}
+.grappelliSkin td.mceToolbar {
+ padding-bottom: 5px;
+ border-bottom: 1px solid #d4d4d4!important;
+}
+.predelete .grappelliSkin td.mceToolbar {
+ border-bottom: 1px solid #e5caca !important;
+}
+.grappelliSkin td.mceToolbar.advanced_icons {
+ border-top: 1px solid #ccc !important;
+}
+.predelete .grappelliSkin td.mceToolbar.advanced_icons {
+ border-top: 1px solid #ffe5e5 !important;
+}
+.grappelliSkin td.mceIframeContainer {
+ margin-top: 0; padding-top: 0;
+ height: auto !important;
+ vertical-align: top !important;
+}
+
+
+
+/* Layout
+----------------------------------------------------------------------- */
+
+#changelist span.mceEditor.grappelliSkin {
+ display: inline-block;
+ margin: -4px 0 -5px;
+}
+.grappelliSkin table.mceLayout {
+ height: auto !important;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: transparent;
+}
+.predelete .grappelliSkin table.mceLayout {
+ background: transparent !important;
+}
+#mce_fullscreen_container {
+/* height: 100% !important;*/
+ background: transparent;
+ background: #eee;
+}
+#mce_fullscreen_container table.mceLayout {
+ height: 100% !important;
+ border-radius: 0; -moz-border-radius: 0; -webkit-border-radius: 0;
+ background: #eee !important;
+}
+
+#mce_fullscreen_container .grappelliSkin table.mceLayout tr.mceFirst > td {
+ padding: 8px 8px 5px;
+}
+
+/* Additional Toolbar-Rows */
+#changelist .grappelliSkin table.mceToolbar {
+ margin: 0 !important;
+}
+
+.grappelliSkin table.mceToolbar + table.mceToolbar,
+#changelist .grappelliSkin table.mceToolbar + table.mceToolbar {
+ margin-top: 5px !important;
+ height: 28px;
+ background: transparent;
+}
+.grappelliSkin span.mceIcon, .grappelliSkin img.mceIcon {
+ display: block;
+ width: 20px; height: 20px;
+}
+
+body.rtl .grappelliSkin span.mceIcon, body.rtl .grappelliSkin img.mceIcon {
+ width: 23px;
+}
+
+
+
+/* Buttons
+----------------------------------------------------------------------- */
+
+.grappelliSkin .mceButton {
+ display: block;
+ margin-right: 2px;
+ width: 23px; height: 23px !important;
+ background: #fff;
+}
+.grappelliSkin .mceButton span, .grappelliSkin .mceListBox .mceOpen {
+ cursor: pointer;
+}
+
+.grappelliSkin a.mceButtonEnabled {
+ border: 1px solid;
+ border-color: #d4d4d4 #c4c4c4 #c4c4c4 #d4d4d4;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+}
+.grappelliSkin a.mceButtonEnabled:hover {
+ background: #e1f0f5;
+}
+.grappelliSkin a.mceButtonActive, .grappelliSkin a.mceButtonSelected {
+ border-color: #c0c0c0 #d2d2d2 #d2d2d2 #c0c0c0 !important;
+ background: #ddd;
+}
+.grappelliSkin .mceButtonDisabled {
+ border: 1px solid;
+ border-color: #d4d4d4 #fff #fff #d4d4d4;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: transparent;
+}
+.predelete .grappelliSkin .mceButtonDisabled {
+ border-color: #e5caca #ffe5e5 #ffe5e5 #e5caca;
+}
+.grappelliSkin .mceButtonDisabled span {
+ opacity: 0.4;
+}
+
+body.rtl .grappelliSkin .mceButton {
+ margin-left: 2px;
+ margin-right: 0;
+}
+
+
+
+/* Separator
+----------------------------------------------------------------------- */
+
+.grappelliSkin .mceSeparator {
+ display: block;
+ width: 4px; height: 22px;
+}
+
+
+
+/* Listbox
+----------------------------------------------------------------------- */
+
+.grappelliSkin table.mceListBox {
+ background: transparent;
+}
+
+.grappelliSkin .mceListBox, .grappelliSkin .mceListBox a {
+ display: block;
+}
+.grappelliSkin .mceListBox .mceText {
+ position: relative;
+ padding: 2px 0 0 4px !important;
+ width: 90px; height: 21px;
+ border: 1px solid;
+ border-color: #c4c4c4 #d4d4d4 #d4d4d4 #c4c4c4;
+ border-top-left-radius: 4px; -moz-border-radius-topleft: 4px; -webkit-border-top-left-radius: 4px;
+ border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px;
+ background: #fafafa;
+ color: #666 !important; font-size: 11px !important; line-height: 20px;
+ overflow: hidden;
+}
+
+.grappelliSkin .mceListBox .mceOpen {
+ margin-right: 4px;
+ width: 14px; height: 23px;
+ border: 1px solid;
+ border-color: #c4c4c4;
+ border-left: none;
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+ background: #ddd url('img/menu/icon-mceOpen.png');
+}
+.grappelliSkin table.mceListBoxEnabled:hover .mceText,
+.grappelliSkin .mceListBoxHover .mceText,
+.grappelliSkin .mceListBoxSelected .mceText {
+ background: #fff;
+}
+.grappelliSkin table.mceListBoxEnabled:hover .mceOpen,
+.grappelliSkin .mceListBoxHover .mceOpen,
+.grappelliSkin .mceListBoxSelected .mceOpen {
+ border-color: #c4c4c4 #d4d4d4 #d4d4d4 #c4c4c4;
+ background-color: #e1f0f5;
+}
+.grappelliSkin .mceListBoxSelected .mceText,
+.grappelliSkin .mceListBoxSelected .mceOpen {
+ border-bottom-left-radius: 0 !important; -moz-border-radius-bottomleft: 0 !important; -webkit-border-bottom-left-radius: 0 !important;
+ border-bottom-right-radius: 0 !important; -moz-border-radius-bottomright: 0 !important; -webkit-border-bottom-right-radius: 0 !important;
+}
+
+.grappelliSkin .mceListBoxMenu {
+ overflow: auto;
+ overflow-x: hidden;
+}
+.grappelliSkin .mceOldBoxModel .mceListBox .mceText {
+ height: 23px;
+}
+
+
+
+/* SplitButton (not defined yet)
+----------------------------------------------------------------------- */
+/* ColorSplitButton (not defined yet)
+----------------------------------------------------------------------- */
+
+
+
+/* Menu
+----------------------------------------------------------------------- */
+
+.grappelliSkin .mceMenu {
+ position: absolute; left: 0; top: -1px; z-index: 1000;
+ padding: 0;
+ min-width: 109px !important;
+ border: 1px solid #c4c4c4;
+ border-top-right-radius: 4px; -moz-border-radius-topright: 4px; -webkit-border-top-right-radius: 4px;
+ border-bottom-left-radius: 4px; -moz-border-radius-bottomleft: 4px; -webkit-border-bottom-left-radius: 4px;
+ border-bottom-right-radius: 4px; -moz-border-radius-bottomright: 4px; -webkit-border-bottom-right-radius: 4px;
+ box-shadow: 0 5px 10px #999; -moz-box-shadow: 0 5px 10px #999; -webkit-box-shadow: 0 5px 10px #999;
+}
+.grappelliSkin .mceMenu table {
+ width: 100% !important;
+ border-top-right-radius: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 3px;
+ border-bottom-left-radius: 3px; -moz-border-radius-bottomleft: 3px; -webkit-border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px; -moz-border-radius-bottomright: 3px; -webkit-border-bottom-right-radius: 3px;
+ background: #fff;
+}
+
+.grappelliSkin .mceMenu.mceDropDown {
+ border-radius: 5px !important; -moz-border-radius: 5px !important; -webkit-border-radius: 5px !important;
+ border: 2px solid #eee;
+}
+.grappelliSkin .mceMenu.mceDropDown table {
+ border-radius: 2px !important; -moz-border-radius: 2px !important; -webkit-border-radius: 2px !important;
+}
+.grappelliSkin .mceMenu a, .grappelliSkin .mceMenu span, .grappelliSkin .mceMenu {
+ display: block;
+ width: auto !important;
+ cursor: pointer;
+}
+.grappelliSkin .mceMenu td {
+ height: 18px;
+ border-bottom: 1px solid #d0d0d0;
+}
+.grappelliSkin .mceMenu tr.mceFirst td a {
+ border-top-right-radius: 3px; -moz-border-radius-topright: 3px; -webkit-border-top-right-radius: 3px;
+}
+.grappelliSkin .mceMenu.mceDropDown tr.mceFirst td a {
+ border-top-left-radius: 3px; -moz-border-radius-topleft: 3px; -webkit-border-top-left-radius: 3px;
+}
+.grappelliSkin tr.mceMenuItemSeparator + tr.mceFirst td a {
+ border-top: none !important;
+ border-radius: 0 !important; -moz-border-radius: 0 !important; -webkit-border-radius: 0 !important;
+}
+.grappelliSkin .mceMenu tr.mceLast td {
+ border-bottom: none !important;
+}
+.grappelliSkin .mceMenu tr.mceLast td a {
+ border-bottom: none;
+ border-bottom-left-radius: 3px; -moz-border-radius-bottomleft: 3px; -webkit-border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px; -moz-border-radius-bottomright: 3px; -webkit-border-bottom-right-radius: 3px;
+}
+
+.grappelliSkin .mceMenu a {
+ position: relative;
+ padding: 4px 0 3px;
+ color: #666 !important;
+}
+.grappelliSkin .mceMenu .mceText {
+ position: relative; display: block;
+ margin: 0; padding: 0 25px 0 4px;
+ background: transparent !important;
+}
+.grappelliSkin .mceMenu .mceIcon {
+ display: none;
+ width: 0; height: 0;
+ background: transparent !important;
+}
+.grappelliSkin .mceMenu .mceMenuItemEnabled a:hover,
+.grappelliSkin .mceMenu .mceMenuItemEnabled a:active,
+.grappelliSkin .mceMenu .mceMenuItemActive {
+ background-color: #e1f0f5 !important;
+}
+.grappelliSkin .mceMenuItemSelected a {
+ background-color: #ddd;
+}
+.grappelliSkin td.mceMenuItemSeparator {
+ height: 2px;
+ border: none;
+ background: #a9a9a9;
+}
+
+.grappelliSkin .mceMenuItemTitle a {
+ border: 0;
+ background: #f2d6d6;
+}
+
+.grappelliSkin .mceMenuItemTitle span.mceText {
+ padding-left: 4px;
+ color: #666;
+}
+.grappelliSkin .mceMenuItemDisabled .mceText {
+ color: #999;
+}
+
+
+
+/* Language Specific Content Additions
+----------------------------------------------------------------------- */
+
+.grappelliSkin .mceMenuItemTitle span.mceText[title="Format"]:before,
+.grappelliSkin .mceMenuItemTitle span.mceText[title="Style"]:before {
+ content: "Reset ";
+}
+.grappelliSkin .mceMenuItemTitle span.mceText[title="Format "]:after,
+.grappelliSkin .mceMenuItemTitle span.mceText[title="Stil"]:after {
+ content: " zurücksetzen";
+}
+
+
+
+/* Statusbar: Progress, Resize
+----------------------------------------------------------------------- */
+
+#mce_fullscreen_container .grappelliSkin td.mceStatusbar {
+ border-top: 1px solid #fff;
+ height: 100%;
+}
+.grappelliSkin td.mceStatusbar > div {
+ display: none;
+}
+
+.grappelliSkin .mcePlaceHolder {
+ position: relative;
+ border: 1px solid #d4d4d4;
+ box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
+ border-radius: 5px; -moz-border-radius: 5px; -webkit-border-radius: 5px;
+ background: #d6ebf2 url('img/icons/icon-mceResize.png') 50% 100% no-repeat;
+ cursor: s-resize;
+}
+.predelete .grappelliSkin .mcePlaceHolder {
+ border: 1px solid #e5caca;
+}
+.table .grappelliSkin .mcePlaceHolder,
+.table .grappelliSkin .mcePlaceHolder {
+ left: 0;
+}
+
+.grappelliSkin a.mceResize {
+ display: block;
+ width: 100%; height: 20px;
+ border: 1px solid transparent;
+ border-top-color: #fff;
+ box-sizing: border-box; -moz-box-sizing: border-box; -webkit-box-sizing: border-box;
+ border-bottom-left-radius: 3px; -moz-border-radius-bottomleft: 3px; -webkit-border-bottom-left-radius: 3px;
+ border-bottom-right-radius: 3px; -moz-border-radius-bottomright: 3px; -webkit-border-bottom-right-radius: 3px;
+ background-image: url('img/icons/icon-mceResize.png');
+ background-position: 50% 50%;
+ background-repeat: no-repeat;
+ cursor: s-resize;
+}
+.predelete .grappelliSkin a.mceResize {
+ border-top-color: #ffe5e5;
+}
+.grappelliSkin a.mceResize:link, .grappelliSkin a.mceResize:visited {
+ background-color: transparent;
+}
+.grappelliSkin a.mceResize:hover, .grappelliSkin a.mceResize:active {
+ border-color: #d4d4d4;
+ border-top-color: #ebebeb;
+ background-color: #d6ebf2;
+}
+.predelete .grappelliSkin a.mceResize:hover, .predelete .grappelliSkin a.mceResize:active {
+ border-color: #e5caca;
+ border-top-color: #ffe5e5;
+ background-color: #d6ebf2;
+}
+
+
+
+/* Formats
+----------------------------------------------------------------------- */
+
+.grappelliSkin .mce_formatPreview a { /*apply specific styles here*/ }
+.grappelliSkin .mce_p span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_pre span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_h1 span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_h2 span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_h3 span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_h4 span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_h5 span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_h6 span.mceText { /*apply specific styles here*/ }
+.grappelliSkin .mce_div span.mceText { /*apply specific styles here*/ }
+
+
+
+/* Toolbar: Theme & Plugins Defaults
+----------------------------------------------------------------------- */
+
+.grappelliSkin .mceToolbar span {
+ /*width: 100%; */height: 100%;
+ background-position: 0 0;
+ background-repeat: no-repeat;
+}
+
+
+
+/* Grappelli Button Icons
+----------------------------------------------------------------------- */
+
+.grappelliSkin span.mce_bold { background-image: url('img/buttons/bold.png'); }
+.grappelliSkin span.mce_italic { background-image: url('img/buttons/italic.png'); }
+.grappelliSkin span.mce_underline { background-image: url('img/buttons/underline.png'); }
+.grappelliSkin span.mce_undo { background-image: url('img/buttons/undo.png'); }
+.grappelliSkin span.mce_redo { background-image: url('img/buttons/redo.png'); }
+.grappelliSkin span.mce_bullist { background-image: url('img/buttons/bullist.png'); }
+.grappelliSkin span.mce_numlist { background-image: url('img/buttons/numlist.png'); }
+.grappelliSkin span.mce_blockquote { background-image: url('img/buttons/blockquote.png'); }
+.grappelliSkin span.mce_justifycenter { background-image: url('img/buttons/justifycenter.png'); }
+.grappelliSkin span.mce_justifyfull { background-image: url('img/buttons/justifyfull.png'); }
+.grappelliSkin span.mce_justifyleft { background-image: url('img/buttons/justifyleft.png'); }
+.grappelliSkin span.mce_justifyright { background-image: url('img/buttons/justifyright.png'); }
+.grappelliSkin span.mce_link { background-image: url('img/buttons/link.png'); }
+.grappelliSkin span.mce_unlink { background-image: url('img/buttons/unlink.png'); }
+.grappelliSkin span.mce_image { background-image: url('img/buttons/image.png'); }
+.grappelliSkin span.mce_code { background-image: url('img/buttons/code.png'); }
+.grappelliSkin span.mce_charmap { background-image: url('img/buttons/charmap.png'); }
+
+.grappelliSkin span.mce_fullscreen { background-image: url('img/buttons/fullscreen.png'); }
+.grappelliSkin span.mce_media { background-image: url('img/buttons/media.png'); }
+.grappelliSkin span.mce_pasteword { background-image: url('img/buttons/pasteword.png'); }
+.grappelliSkin span.mce_template { background-image: url('img/buttons/template.png'); }
+.grappelliSkin span.mce_table { background-image: url('img/buttons/table.png'); }
+.grappelliSkin span.mce_row_props { background-image: url('img/buttons/table_row_props.png'); }
+.grappelliSkin span.mce_cell_props { background-image: url('img/buttons/table_cell_props.png'); }
+.grappelliSkin span.mce_delete_row { background-image: url('img/buttons/table_delete_row.png'); }
+.grappelliSkin span.mce_delete_col { background-image: url('img/buttons/table_delete_col.png'); }
+.grappelliSkin span.mce_row_before { background-image: url('img/buttons/table_row_before.png'); }
+.grappelliSkin span.mce_row_after { background-image: url('img/buttons/table_row_after.png'); }
+.grappelliSkin span.mce_col_before { background-image: url('img/buttons/table_col_before.png'); }
+.grappelliSkin span.mce_col_after { background-image: url('img/buttons/table_col_after.png'); }
+.grappelliSkin span.mce_split_cells { background-image: url('img/buttons/table_split_cells.png'); }
+.grappelliSkin span.mce_merge_cells { background-image: url('img/buttons/table_merge_cells.png'); }
+.grappelliSkin span.mce_search { background-image: url('img/buttons/search.png'); }
+.grappelliSkin span.mce_cleanup { background-image: url('img/buttons/cleanup.png'); }
+
+.grappelliSkin span.mce_grappelli_adv { background-image: url('img/buttons/show_advanced.png'); }
+.grappelliSkin span.mce_grappelli_documentstructure { background-image: url('img/buttons/visualchars.png'); }
+
+
+
+/* Customized Button Icons
+----------------------------------------------------------------------- */
+
+.grappelliSkin span.mce_pagebreak { background-image: url('img/customized/button_pagebreak.png'); }
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css
new file mode 100644
index 0000000..cbce6c6
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/content.css
@@ -0,0 +1,24 @@
+body, td, pre { margin:8px;}
+body.mceForceColors {background:#FFF; color:#000;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;}
+span.mceItemNbsp {background: #DDD}
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}
+img {border:0;}
+table, img, hr, .mceItemAnchor {cursor:default}
+table td, table th {cursor:text}
+ins {border-bottom:1px solid green; text-decoration: none; color:green}
+del {color:red; text-decoration:line-through}
+cite {border-bottom:1px dashed blue}
+acronym {border-bottom:1px dotted #CCC; cursor:help}
+abbr {border-bottom:1px dashed #CCC; cursor:help}
+
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}
+font[face=mceinline] {font-family:inherit !important}
+*[contentEditable]:focus {outline:0}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css
new file mode 100644
index 0000000..6d9fc8d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/dialog.css
@@ -0,0 +1,106 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+background:#F0F0EE;
+color: black;
+padding:0;
+margin:8px 8px 0 8px;
+}
+
+html {background:#F0F0EE; color:#000;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;background-color:transparent;}
+a:hover {color:#2B6FB6;background-color:transparent;}
+.nowrap {white-space: nowrap}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;background-color:transparent;}
+input.invalid {border:1px solid #EE0000;background-color:transparent;}
+input {background:#FFF; border:1px solid #CCC;color:black;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.button, .updateButton {
+font-weight:bold;
+width:94px; height:23px;
+cursor:pointer;
+padding-bottom:2px;
+float:left;
+}
+
+#cancel {float:right}
+
+/* Browse */
+a.pickcolor, a.browse {text-decoration:none}
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; border: 1px solid black; border-bottom:0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block; cursor:pointer;}
+.tabs li.current {font-weight: bold; margin-right:2px;}
+.tabs span {float:left; display:block; padding:0px 10px 0 0;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px}
+#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline}
+#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css
new file mode 100644
index 0000000..effbbe1
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/highcontrast/ui.css
@@ -0,0 +1,106 @@
+/* Reset */
+.highcontrastSkin table, .highcontrastSkin tbody, .highcontrastSkin a, .highcontrastSkin img, .highcontrastSkin tr, .highcontrastSkin div, .highcontrastSkin td, .highcontrastSkin iframe, .highcontrastSkin span, .highcontrastSkin *, .highcontrastSkin .mceText {border:0; margin:0; padding:0; vertical-align:baseline; border-collapse:separate;}
+.highcontrastSkin a:hover, .highcontrastSkin a:link, .highcontrastSkin a:visited, .highcontrastSkin a:active {text-decoration:none; font-weight:normal; cursor:default;}
+.highcontrastSkin table td {vertical-align:middle}
+
+.highcontrastSkin .mceIconOnly {display: block !important;}
+
+/* External */
+.highcontrastSkin .mceExternalToolbar {position:absolute; border:1px solid; border-bottom:0; display:none; background-color: white;}
+.highcontrastSkin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.highcontrastSkin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px;}
+
+/* Layout */
+.highcontrastSkin table.mceLayout {border: 1px solid;}
+.highcontrastSkin .mceIframeContainer {border-top:1px solid; border-bottom:1px solid}
+.highcontrastSkin .mceStatusbar a:hover {text-decoration:underline}
+.highcontrastSkin .mceStatusbar {display:block; line-height:1.5em; overflow:visible;}
+.highcontrastSkin .mceStatusbar div {float:left}
+.highcontrastSkin .mceStatusbar a.mceResize {display:block; float:right; width:20px; height:20px; cursor:se-resize; outline:0}
+
+.highcontrastSkin .mceToolbar td { display: inline-block; float: left;}
+.highcontrastSkin .mceToolbar tr { display: block;}
+.highcontrastSkin .mceToolbar table { display: block; }
+
+/* Button */
+
+.highcontrastSkin .mceButton { display:block; margin: 2px; padding: 5px 10px;border: 1px solid; border-radius: 3px; -moz-border-radius: 3px; -webkit-border-radius: 3px; -ms-border-radius: 3px; height: 2em;}
+.highcontrastSkin .mceButton .mceVoiceLabel { height: 100%; vertical-align: center; line-height: 2em}
+.highcontrastSkin .mceButtonDisabled .mceVoiceLabel { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);}
+.highcontrastSkin .mceButtonActive, .highcontrastSkin .mceButton:focus, .highcontrastSkin .mceButton:active { border: 5px solid; padding: 1px 6px;-webkit-focus-ring-color:none;outline:none;}
+
+/* Separator */
+.highcontrastSkin .mceSeparator {display:block; width:16px; height:26px;}
+
+/* ListBox */
+.highcontrastSkin .mceListBox { display: block; margin:2px;-webkit-focus-ring-color:none;outline:none;}
+.highcontrastSkin .mceListBox .mceText {padding: 5px 6px; line-height: 2em; width: 15ex; overflow: hidden;}
+.highcontrastSkin .mceListBoxDisabled .mceText { opacity:0.6; -ms-filter:'alpha(opacity=60)'; filter:alpha(opacity=60);}
+.highcontrastSkin .mceListBox a.mceText { padding: 5px 10px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;}
+.highcontrastSkin .mceListBox a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-left: 0; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;}
+.highcontrastSkin .mceListBox:focus a.mceText, .highcontrastSkin .mceListBox:active a.mceText { border-width: 5px; padding: 1px 10px 1px 6px;}
+.highcontrastSkin .mceListBox:focus a.mceOpen, .highcontrastSkin .mceListBox:active a.mceOpen { border-width: 5px; padding: 1px 0px 1px 4px;}
+
+.highcontrastSkin .mceListBoxMenu {overflow-y:auto}
+
+/* SplitButton */
+.highcontrastSkin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+
+.highcontrastSkin .mceSplitButton { border-collapse: collapse; margin: 2px; height: 2em; line-height: 2em;-webkit-focus-ring-color:none;outline:none;}
+.highcontrastSkin .mceSplitButton td { display: table-cell; float: none; margin: 0; padding: 0; height: 2em;}
+.highcontrastSkin .mceSplitButton tr { display: table-row; }
+.highcontrastSkin table.mceSplitButton { display: table; }
+.highcontrastSkin .mceSplitButton a.mceAction { padding: 5px 10px; display: block; height: 2em; line-height: 2em; overflow: hidden; border: 1px solid; border-right: 0; border-radius: 3px 0px 0px 3px; -moz-border-radius: 3px 0px 0px 3px; -webkit-border-radius: 3px 0px 0px 3px; -ms-border-radius: 3px 0px 0px 3px;}
+.highcontrastSkin .mceSplitButton a.mceOpen { padding: 5px 4px; display: block; height: 2em; line-height: 2em; border: 1px solid; border-radius: 0px 3px 3px 0px; -moz-border-radius: 0px 3px 3px 0px; -webkit-border-radius: 0px 3px 3px 0px; -ms-border-radius: 0px 3px 3px 0px;}
+.highcontrastSkin .mceSplitButton .mceVoiceLabel { height: 2em; vertical-align: center; line-height: 2em; }
+.highcontrastSkin .mceSplitButton:focus a.mceAction, .highcontrastSkin .mceSplitButton:active a.mceAction { border-width: 5px; border-right-width: 1px; padding: 1px 10px 1px 6px;-webkit-focus-ring-color:none;outline:none;}
+.highcontrastSkin .mceSplitButton:focus a.mceOpen, .highcontrastSkin .mceSplitButton:active a.mceOpen { border-width: 5px; border-left-width: 1px; padding: 1px 0px 1px 4px;-webkit-focus-ring-color:none;outline:none;}
+
+/* Menu */
+.highcontrastSkin .mceNoIcons span.mceIcon {width:0;}
+.highcontrastSkin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid; direction:ltr}
+.highcontrastSkin .mceMenu table {background:white; color: black}
+.highcontrastSkin .mceNoIcons a .mceText {padding-left:10px}
+.highcontrastSkin .mceMenu a, .highcontrastSkin .mceMenu span, .highcontrastSkin .mceMenu {display:block;background:white; color: black}
+.highcontrastSkin .mceMenu td {height:2em}
+.highcontrastSkin .mceMenu a {position:relative;padding:3px 0 4px 0; display: block;}
+.highcontrastSkin .mceMenu .mceText {position:relative; display:block; cursor:default; margin:0; padding:0 25px 0 25px;}
+.highcontrastSkin .mceMenu pre.mceText {font-family:Monospace}
+.highcontrastSkin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:26px;}
+.highcontrastSkin td.mceMenuItemSeparator {border-top:1px solid; height:1px}
+.highcontrastSkin .mceMenuItemTitle a {border:0; border-bottom:1px solid}
+.highcontrastSkin .mceMenuItemTitle span.mceText {font-weight:bold; padding-left:4px}
+.highcontrastSkin .mceNoIcons .mceMenuItemSelected span.mceText:before {content: "\2713\A0";}
+.highcontrastSkin .mceMenu span.mceMenuLine {display:none}
+.highcontrastSkin .mceMenuItemSub a .mceText:after {content: "\A0\25B8"}
+.highcontrastSkin .mceMenuItem td, .highcontrastSkin .mceMenuItem th {line-height: normal}
+
+/* ColorSplitButton */
+.highcontrastSkin div.mceColorSplitMenu table {background:#FFF; border:1px solid; color: #000}
+.highcontrastSkin .mceColorSplitMenu td {padding:2px}
+.highcontrastSkin .mceColorSplitMenu a {display:block; width:16px; height:16px; overflow:hidden; color:#000; margin: 0; padding: 0;}
+.highcontrastSkin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.highcontrastSkin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}
+.highcontrastSkin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid; background-color:#B6BDD2}
+.highcontrastSkin a.mceMoreColors:hover {border:1px solid #0A246A; color: #000;}
+.highcontrastSkin .mceColorPreview {display:none;}
+.highcontrastSkin .mce_forecolor span.mceAction, .highcontrastSkin .mce_backcolor span.mceAction {height:17px;overflow:hidden}
+
+/* Progress,Resize */
+.highcontrastSkin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF}
+.highcontrastSkin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+
+/* Rtl */
+.mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0}
+.mceRtl .mceMenuItem .mceText {text-align: right}
+
+/* Formats */
+.highcontrastSkin .mce_p span.mceText {}
+.highcontrastSkin .mce_address span.mceText {font-style:italic}
+.highcontrastSkin .mce_pre span.mceText {font-family:monospace}
+.highcontrastSkin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.highcontrastSkin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.highcontrastSkin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.highcontrastSkin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.highcontrastSkin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.highcontrastSkin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css
new file mode 100644
index 0000000..a1a8f9b
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/content.css
@@ -0,0 +1,48 @@
+body, td, pre {color:#000; font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px; margin:8px;}
+body {background:#FFF;}
+body.mceForceColors {background:#FFF; color:#000;}
+h1 {font-size: 2em}
+h2 {font-size: 1.5em}
+h3 {font-size: 1.17em}
+h4 {font-size: 1em}
+h5 {font-size: .83em}
+h6 {font-size: .75em}
+.mceItemTable, .mceItemTable td, .mceItemTable th, .mceItemTable caption, .mceItemVisualAid {border: 1px dashed #BBB;}
+a.mceItemAnchor {display:inline-block; width:11px !important; height:11px !important; background:url(../default/img/items.gif) no-repeat 0 0;}
+span.mceItemNbsp {background: #DDD}
+td.mceSelected, th.mceSelected {background-color:#3399ff !important}
+img {border:0;}
+table, img, hr, .mceItemAnchor {cursor:default}
+table td, table th {cursor:text}
+ins {border-bottom:1px solid green; text-decoration: none; color:green}
+del {color:red; text-decoration:line-through}
+cite {border-bottom:1px dashed blue}
+acronym {border-bottom:1px dotted #CCC; cursor:help}
+abbr {border-bottom:1px dashed #CCC; cursor:help}
+
+/* IE */
+* html body {
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+}
+
+img:-moz-broken {-moz-force-broken-image-icon:1; width:24px; height:24px}
+font[face=mceinline] {font-family:inherit !important}
+*[contentEditable]:focus {outline:0}
+
+.mceItemMedia {border:1px dotted #cc0000; background-position:center; background-repeat:no-repeat; background-color:#ffffcc}
+.mceItemShockWave {background-image:url(../../img/shockwave.gif)}
+.mceItemFlash {background-image:url(../../img/flash.gif)}
+.mceItemQuickTime {background-image:url(../../img/quicktime.gif)}
+.mceItemWindowsMedia {background-image:url(../../img/windowsmedia.gif)}
+.mceItemRealMedia {background-image:url(../../img/realmedia.gif)}
+.mceItemVideo {background-image:url(../../img/video.gif)}
+.mceItemAudio {background-image:url(../../img/video.gif)}
+.mceItemIframe {background-image:url(../../img/iframe.gif)}
+.mcePageBreak {display:block;border:0;width:100%;height:12px;border-top:1px dotted #ccc;margin-top:15px;background:#fff url(../../img/pagebreak.gif) no-repeat center top;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css
new file mode 100644
index 0000000..a54db98
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/dialog.css
@@ -0,0 +1,118 @@
+/* Generic */
+body {
+font-family:Verdana, Arial, Helvetica, sans-serif; font-size:11px;
+scrollbar-3dlight-color:#F0F0EE;
+scrollbar-arrow-color:#676662;
+scrollbar-base-color:#F0F0EE;
+scrollbar-darkshadow-color:#DDDDDD;
+scrollbar-face-color:#E0E0DD;
+scrollbar-highlight-color:#F0F0EE;
+scrollbar-shadow-color:#F0F0EE;
+scrollbar-track-color:#F5F5F5;
+background:#F0F0EE;
+padding:0;
+margin:8px 8px 0 8px;
+}
+
+html {background:#F0F0EE;}
+td {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+textarea {resize:none;outline:none;}
+a:link, a:visited {color:black;}
+a:hover {color:#2B6FB6;}
+.nowrap {white-space: nowrap}
+
+/* Forms */
+fieldset {margin:0; padding:4px; border:1px solid #919B9C; font-family:Verdana, Arial; font-size:10px;}
+legend {color:#2B6FB6; font-weight:bold;}
+label.msg {display:none;}
+label.invalid {color:#EE0000; display:inline;}
+input.invalid {border:1px solid #EE0000;}
+input {background:#FFF; border:1px solid #CCC;}
+input, select, textarea {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+input, select, textarea {border:1px solid #808080;}
+input.radio {border:1px none #000000; background:transparent; vertical-align:middle;}
+input.checkbox {border:1px none #000000; background:transparent; vertical-align:middle;}
+.input_noborder {border:0;}
+
+/* Buttons */
+#insert, #cancel, input.button, .updateButton {
+border:0; margin:0; padding:0;
+font-weight:bold;
+width:94px; height:26px;
+background:url(../default/img/buttons.png) 0 -26px;
+cursor:pointer;
+padding-bottom:2px;
+float:left;
+}
+
+#insert {background:url(../default/img/buttons.png) 0 -52px}
+#cancel {background:url(../default/img/buttons.png) 0 0; float:right}
+
+/* Browse */
+a.pickcolor, a.browse {text-decoration:none}
+a.browse span {display:block; width:20px; height:18px; background:url(../../img/icons.gif) -860px 0; border:1px solid #FFF; margin-left:1px;}
+.mceOldBoxModel a.browse span {width:22px; height:20px;}
+a.browse:hover span {border:1px solid #0A246A; background-color:#B2BBD0;}
+a.browse span.disabled {border:1px solid white; opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+a.browse:hover span.disabled {border:1px solid white; background-color:transparent;}
+a.pickcolor span {display:block; width:20px; height:16px; background:url(../../img/icons.gif) -840px 0; margin-left:2px;}
+.mceOldBoxModel a.pickcolor span {width:21px; height:17px;}
+a.pickcolor:hover span {background-color:#B2BBD0;}
+a.pickcolor:hover span.disabled {}
+
+/* Charmap */
+table.charmap {border:1px solid #AAA; text-align:center}
+td.charmap, #charmap a {width:18px; height:18px; color:#000; border:1px solid #AAA; text-align:center; font-size:12px; vertical-align:middle; line-height: 18px;}
+#charmap a {display:block; color:#000; text-decoration:none; border:0}
+#charmap a:hover {background:#CCC;color:#2B6FB6}
+#charmap #codeN {font-size:10px; font-family:Arial,Helvetica,sans-serif; text-align:center}
+#charmap #codeV {font-size:40px; height:80px; border:1px solid #AAA; text-align:center}
+
+/* Source */
+.wordWrapCode {vertical-align:middle; border:1px none #000000; background:transparent;}
+.mceActionPanel {margin-top:5px;}
+
+/* Tabs classes */
+.tabs {width:100%; height:18px; line-height:normal; background:url(../default/img/tabs.gif) repeat-x 0 -72px;}
+.tabs ul {margin:0; padding:0; list-style:none;}
+.tabs li {float:left; background:url(../default/img/tabs.gif) no-repeat 0 0; margin:0 2px 0 0; padding:0 0 0 10px; line-height:17px; height:18px; display:block;}
+.tabs li.current {background:url(../default/img/tabs.gif) no-repeat 0 -18px; margin-right:2px;}
+.tabs span {float:left; display:block; background:url(../default/img/tabs.gif) no-repeat right -36px; padding:0px 10px 0 0;}
+.tabs .current span {background:url(../default/img/tabs.gif) no-repeat right -54px;}
+.tabs a {text-decoration:none; font-family:Verdana, Arial; font-size:10px;}
+.tabs a:link, .tabs a:visited, .tabs a:hover {color:black;}
+
+/* Panels */
+.panel_wrapper div.panel {display:none;}
+.panel_wrapper div.current {display:block; width:100%; height:300px; overflow:visible;}
+.panel_wrapper {border:1px solid #919B9C; border-top:0px; padding:10px; padding-top:5px; clear:both; background:white;}
+
+/* Columns */
+.column {float:left;}
+.properties {width:100%;}
+.properties .column1 {}
+.properties .column2 {text-align:left;}
+
+/* Titles */
+h1, h2, h3, h4 {color:#2B6FB6; margin:0; padding:0; padding-top:5px;}
+h3 {font-size:14px;}
+.title {font-size:12px; font-weight:bold; color:#2B6FB6;}
+
+/* Dialog specific */
+#link .panel_wrapper, #link div.current {height:125px;}
+#image .panel_wrapper, #image div.current {height:200px;}
+#plugintable thead {font-weight:bold; background:#DDD;}
+#plugintable, #about #plugintable td {border:1px solid #919B9C;}
+#plugintable {width:96%; margin-top:10px;}
+#pluginscontainer {height:290px; overflow:auto;}
+#colorpicker #preview {display:inline-block; padding-left:40px; height:14px; border:1px solid black; margin-left:5px; margin-right: 5px}
+#colorpicker #previewblock {position: relative; top: -3px; padding-left:5px; padding-top: 0px; display:inline}
+#colorpicker #preview_wrapper { text-align:center; padding-top:4px; white-space: nowrap}
+#colorpicker #colors {float:left; border:1px solid gray; cursor:crosshair;}
+#colorpicker #light {border:1px solid gray; margin-left:5px; float:left;width:15px; height:150px; cursor:crosshair;}
+#colorpicker #light div {overflow:hidden;}
+#colorpicker .panel_wrapper div.current {height:175px;}
+#colorpicker #namedcolors {width:150px;}
+#colorpicker #namedcolors a {display:block; float:left; width:10px; height:10px; margin:1px 1px 0 0; overflow:hidden;}
+#colorpicker #colornamecontainer {margin-top:5px;}
+#colorpicker #picker_panel fieldset {margin:auto;width:325px;}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png
new file mode 100644
index 0000000..13a5cb0
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png
new file mode 100644
index 0000000..7fc57f2
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_black.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png
new file mode 100644
index 0000000..c0dcc6c
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/img/button_bg_silver.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css
new file mode 100644
index 0000000..a310223
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui.css
@@ -0,0 +1,222 @@
+/* Reset */
+.o2k7Skin table, .o2k7Skin tbody, .o2k7Skin a, .o2k7Skin img, .o2k7Skin tr, .o2k7Skin div, .o2k7Skin td, .o2k7Skin iframe, .o2k7Skin span, .o2k7Skin *, .o2k7Skin .mceText {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000; vertical-align:baseline; width:auto; border-collapse:separate; text-align:left}
+.o2k7Skin a:hover, .o2k7Skin a:link, .o2k7Skin a:visited, .o2k7Skin a:active {text-decoration:none; font-weight:normal; cursor:default; color:#000}
+.o2k7Skin table td {vertical-align:middle}
+
+/* Containers */
+.o2k7Skin table {background:transparent}
+.o2k7Skin iframe {display:block;}
+.o2k7Skin .mceToolbar {height:26px}
+
+/* External */
+.o2k7Skin .mceExternalToolbar {position:absolute; border:1px solid #ABC6DD; border-bottom:0; display:none}
+.o2k7Skin .mceExternalToolbar td.mceToolbar {padding-right:13px;}
+.o2k7Skin .mceExternalClose {position:absolute; top:3px; right:3px; width:7px; height:7px; background:url(../../img/icons.gif) -820px 0}
+
+/* Layout */
+.o2k7Skin table.mceLayout {border:0; border-left:1px solid #ABC6DD; border-right:1px solid #ABC6DD}
+.o2k7Skin table.mceLayout tr.mceFirst td {border-top:1px solid #ABC6DD}
+.o2k7Skin table.mceLayout tr.mceLast td {border-bottom:1px solid #ABC6DD}
+.o2k7Skin table.mceToolbar, .o2k7Skin tr.mceFirst .mceToolbar tr td, .o2k7Skin tr.mceLast .mceToolbar tr td {border:0; margin:0; padding:0}
+.o2k7Skin .mceIframeContainer {border-top:1px solid #ABC6DD; border-bottom:1px solid #ABC6DD}
+.o2k7Skin td.mceToolbar{background:#E5EFFD}
+.o2k7Skin .mceStatusbar {background:#E5EFFD; display:block; font-family:'MS Sans Serif',sans-serif,Verdana,Arial; font-size:9pt; line-height:16px; overflow:visible; color:#000; height:20px}
+.o2k7Skin .mceStatusbar div {float:left; padding:2px}
+.o2k7Skin .mceStatusbar a.mceResize {display:block; float:right; background:url(../../img/icons.gif) -800px 0; width:20px; height:20px; cursor:se-resize; outline:0}
+.o2k7Skin .mceStatusbar a:hover {text-decoration:underline}
+.o2k7Skin table.mceToolbar {margin-left:3px}
+.o2k7Skin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; margin-left:3px;}
+.o2k7Skin .mceToolbar td.mceFirst span {margin:0}
+.o2k7Skin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px}
+.o2k7Skin .mceToolbar .mceToolbarEndListBox span, .o2k7Skin .mceToolbar .mceToolbarStartListBox span {display:none}
+.o2k7Skin span.mceIcon, .o2k7Skin img.mceIcon {display:block; width:20px; height:20px}
+.o2k7Skin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+.o2k7Skin td.mceCenter {text-align:center;}
+.o2k7Skin td.mceCenter table {margin:0 auto; text-align:left;}
+.o2k7Skin td.mceRight table {margin:0 0 0 auto;}
+
+/* Button */
+.o2k7Skin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px}
+.o2k7Skin a.mceButton span, .o2k7Skin a.mceButton img {margin-left:1px}
+.o2k7Skin .mceOldBoxModel a.mceButton span, .o2k7Skin .mceOldBoxModel a.mceButton img {margin:0 0 0 1px}
+.o2k7Skin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px}
+.o2k7Skin a.mceButtonActive, .o2k7Skin a.mceButtonSelected {background-position:0 -44px}
+.o2k7Skin .mceButtonDisabled .mceIcon {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+.o2k7Skin .mceButtonLabeled {width:auto}
+.o2k7Skin .mceButtonLabeled span.mceIcon {float:left}
+.o2k7Skin span.mceButtonLabel {display:block; font-size:10px; padding:4px 6px 0 22px; font-family:Tahoma,Verdana,Arial,Helvetica}
+.o2k7Skin .mceButtonDisabled .mceButtonLabel {color:#888}
+
+/* Separator */
+.o2k7Skin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px}
+
+/* ListBox */
+.o2k7Skin .mceListBox {padding-left: 3px}
+.o2k7Skin .mceListBox, .o2k7Skin .mceListBox a {display:block}
+.o2k7Skin .mceListBox .mceText {padding-left:4px; text-align:left; width:70px; border:1px solid #b3c7e1; border-right:0; background:#eaf2fb; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; height:20px; line-height:20px; overflow:hidden}
+.o2k7Skin .mceListBox .mceOpen {width:14px; height:22px; background:url(img/button_bg.png) -66px 0}
+.o2k7Skin table.mceListBoxEnabled:hover .mceText, .o2k7Skin .mceListBoxHover .mceText, .o2k7Skin .mceListBoxSelected .mceText {background:#FFF}
+.o2k7Skin table.mceListBoxEnabled:hover .mceOpen, .o2k7Skin .mceListBoxHover .mceOpen, .o2k7Skin .mceListBoxSelected .mceOpen {background-position:-66px -22px}
+.o2k7Skin .mceListBoxDisabled .mceText {color:gray}
+.o2k7Skin .mceListBoxMenu {overflow:auto; overflow-x:hidden; margin-left:3px}
+.o2k7Skin .mceOldBoxModel .mceListBox .mceText {height:22px}
+.o2k7Skin select.mceListBox {font-family:Tahoma,Verdana,Arial,Helvetica; font-size:12px; border:1px solid #b3c7e1; background:#FFF;}
+
+/* SplitButton */
+.o2k7Skin .mceSplitButton, .o2k7Skin .mceSplitButton a, .o2k7Skin .mceSplitButton span {display:block; height:22px; direction:ltr}
+.o2k7Skin .mceSplitButton {background:url(img/button_bg.png)}
+.o2k7Skin .mceSplitButton a.mceAction {width:22px}
+.o2k7Skin .mceSplitButton span.mceAction {width:22px; background-image:url(../../img/icons.gif)}
+.o2k7Skin .mceSplitButton a.mceOpen {width:10px; background:url(img/button_bg.png) -44px 0}
+.o2k7Skin .mceSplitButton span.mceOpen {display:none}
+.o2k7Skin table.mceSplitButtonEnabled:hover a.mceAction, .o2k7Skin .mceSplitButtonHover a.mceAction, .o2k7Skin .mceSplitButtonSelected {background:url(img/button_bg.png) 0 -22px}
+.o2k7Skin table.mceSplitButtonEnabled:hover a.mceOpen, .o2k7Skin .mceSplitButtonHover a.mceOpen, .o2k7Skin .mceSplitButtonSelected a.mceOpen {background-position:-44px -44px}
+.o2k7Skin .mceSplitButtonDisabled .mceAction {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+.o2k7Skin .mceSplitButtonActive {background-position:0 -44px}
+
+/* ColorSplitButton */
+.o2k7Skin div.mceColorSplitMenu table {background:#FFF; border:1px solid gray}
+.o2k7Skin .mceColorSplitMenu td {padding:2px}
+.o2k7Skin .mceColorSplitMenu a {display:block; width:9px; height:9px; overflow:hidden; border:1px solid #808080}
+.o2k7Skin .mceColorSplitMenu td.mceMoreColors {padding:1px 3px 1px 1px}
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors {width:100%; height:auto; text-align:center; font-family:Tahoma,Verdana,Arial,Helvetica; font-size:11px; line-height:20px; border:1px solid #FFF}
+.o2k7Skin .mceColorSplitMenu a.mceMoreColors:hover {border:1px solid #0A246A; background-color:#B6BDD2}
+.o2k7Skin a.mceMoreColors:hover {border:1px solid #0A246A}
+.o2k7Skin .mceColorPreview {margin-left:2px; width:16px; height:4px; overflow:hidden; background:#9a9b9a;overflow:hidden}
+.o2k7Skin .mce_forecolor span.mceAction, .o2k7Skin .mce_backcolor span.mceAction {height:15px;overflow:hidden}
+
+/* Menu */
+.o2k7Skin .mceMenu {position:absolute; left:0; top:0; z-index:1000; border:1px solid #ABC6DD; direction:ltr}
+.o2k7Skin .mceNoIcons span.mceIcon {width:0;}
+.o2k7Skin .mceNoIcons a .mceText {padding-left:10px}
+.o2k7Skin .mceMenu table {background:#FFF}
+.o2k7Skin .mceMenu a, .o2k7Skin .mceMenu span, .o2k7Skin .mceMenu {display:block}
+.o2k7Skin .mceMenu td {height:20px}
+.o2k7Skin .mceMenu a {position:relative;padding:3px 0 4px 0}
+.o2k7Skin .mceMenu .mceText {position:relative; display:block; font-family:Tahoma,Verdana,Arial,Helvetica; color:#000; cursor:default; margin:0; padding:0 25px 0 25px; display:block}
+.o2k7Skin .mceMenu span.mceText, .o2k7Skin .mceMenu .mcePreview {font-size:11px}
+.o2k7Skin .mceMenu pre.mceText {font-family:Monospace}
+.o2k7Skin .mceMenu .mceIcon {position:absolute; top:0; left:0; width:22px;}
+.o2k7Skin .mceMenu .mceMenuItemEnabled a:hover, .o2k7Skin .mceMenu .mceMenuItemActive {background-color:#dbecf3}
+.o2k7Skin td.mceMenuItemSeparator {background:#DDD; height:1px}
+.o2k7Skin .mceMenuItemTitle a {border:0; background:#E5EFFD; border-bottom:1px solid #ABC6DD}
+.o2k7Skin .mceMenuItemTitle span.mceText {color:#000; font-weight:bold; padding-left:4px}
+.o2k7Skin .mceMenuItemDisabled .mceText {color:#888}
+.o2k7Skin .mceMenuItemSelected .mceIcon {background:url(../default/img/menu_check.gif)}
+.o2k7Skin .mceNoIcons .mceMenuItemSelected a {background:url(../default/img/menu_arrow.gif) no-repeat -6px center}
+.o2k7Skin .mceMenu span.mceMenuLine {display:none}
+.o2k7Skin .mceMenuItemSub a {background:url(../default/img/menu_arrow.gif) no-repeat top right;}
+.o2k7Skin .mceMenuItem td, .o2k7Skin .mceMenuItem th {line-height: normal}
+
+/* Progress,Resize */
+.o2k7Skin .mceBlocker {position:absolute; left:0; top:0; z-index:1000; opacity:0.5; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=50); background:#FFF}
+.o2k7Skin .mceProgress {position:absolute; left:0; top:0; z-index:1001; background:url(../default/img/progress.gif) no-repeat; width:32px; height:32px; margin:-16px 0 0 -16px}
+
+/* Rtl */
+.mceRtl .mceListBox .mceText {text-align: right; padding: 0 4px 0 0}
+.mceRtl .mceMenuItem .mceText {text-align: right}
+
+/* Formats */
+.o2k7Skin .mce_formatPreview a {font-size:10px}
+.o2k7Skin .mce_p span.mceText {}
+.o2k7Skin .mce_address span.mceText {font-style:italic}
+.o2k7Skin .mce_pre span.mceText {font-family:monospace}
+.o2k7Skin .mce_h1 span.mceText {font-weight:bolder; font-size: 2em}
+.o2k7Skin .mce_h2 span.mceText {font-weight:bolder; font-size: 1.5em}
+.o2k7Skin .mce_h3 span.mceText {font-weight:bolder; font-size: 1.17em}
+.o2k7Skin .mce_h4 span.mceText {font-weight:bolder; font-size: 1em}
+.o2k7Skin .mce_h5 span.mceText {font-weight:bolder; font-size: .83em}
+.o2k7Skin .mce_h6 span.mceText {font-weight:bolder; font-size: .75em}
+
+/* Theme */
+.o2k7Skin span.mce_bold {background-position:0 0}
+.o2k7Skin span.mce_italic {background-position:-60px 0}
+.o2k7Skin span.mce_underline {background-position:-140px 0}
+.o2k7Skin span.mce_strikethrough {background-position:-120px 0}
+.o2k7Skin span.mce_undo {background-position:-160px 0}
+.o2k7Skin span.mce_redo {background-position:-100px 0}
+.o2k7Skin span.mce_cleanup {background-position:-40px 0}
+.o2k7Skin span.mce_bullist {background-position:-20px 0}
+.o2k7Skin span.mce_numlist {background-position:-80px 0}
+.o2k7Skin span.mce_justifyleft {background-position:-460px 0}
+.o2k7Skin span.mce_justifyright {background-position:-480px 0}
+.o2k7Skin span.mce_justifycenter {background-position:-420px 0}
+.o2k7Skin span.mce_justifyfull {background-position:-440px 0}
+.o2k7Skin span.mce_anchor {background-position:-200px 0}
+.o2k7Skin span.mce_indent {background-position:-400px 0}
+.o2k7Skin span.mce_outdent {background-position:-540px 0}
+.o2k7Skin span.mce_link {background-position:-500px 0}
+.o2k7Skin span.mce_unlink {background-position:-640px 0}
+.o2k7Skin span.mce_sub {background-position:-600px 0}
+.o2k7Skin span.mce_sup {background-position:-620px 0}
+.o2k7Skin span.mce_removeformat {background-position:-580px 0}
+.o2k7Skin span.mce_newdocument {background-position:-520px 0}
+.o2k7Skin span.mce_image {background-position:-380px 0}
+.o2k7Skin span.mce_help {background-position:-340px 0}
+.o2k7Skin span.mce_code {background-position:-260px 0}
+.o2k7Skin span.mce_hr {background-position:-360px 0}
+.o2k7Skin span.mce_visualaid {background-position:-660px 0}
+.o2k7Skin span.mce_charmap {background-position:-240px 0}
+.o2k7Skin span.mce_paste {background-position:-560px 0}
+.o2k7Skin span.mce_copy {background-position:-700px 0}
+.o2k7Skin span.mce_cut {background-position:-680px 0}
+.o2k7Skin span.mce_blockquote {background-position:-220px 0}
+.o2k7Skin .mce_forecolor span.mceAction {background-position:-720px 0}
+.o2k7Skin .mce_backcolor span.mceAction {background-position:-760px 0}
+.o2k7Skin span.mce_forecolorpicker {background-position:-720px 0}
+.o2k7Skin span.mce_backcolorpicker {background-position:-760px 0}
+
+/* Plugins */
+.o2k7Skin span.mce_advhr {background-position:-0px -20px}
+.o2k7Skin span.mce_ltr {background-position:-20px -20px}
+.o2k7Skin span.mce_rtl {background-position:-40px -20px}
+.o2k7Skin span.mce_emotions {background-position:-60px -20px}
+.o2k7Skin span.mce_fullpage {background-position:-80px -20px}
+.o2k7Skin span.mce_fullscreen {background-position:-100px -20px}
+.o2k7Skin span.mce_iespell {background-position:-120px -20px}
+.o2k7Skin span.mce_insertdate {background-position:-140px -20px}
+.o2k7Skin span.mce_inserttime {background-position:-160px -20px}
+.o2k7Skin span.mce_absolute {background-position:-180px -20px}
+.o2k7Skin span.mce_backward {background-position:-200px -20px}
+.o2k7Skin span.mce_forward {background-position:-220px -20px}
+.o2k7Skin span.mce_insert_layer {background-position:-240px -20px}
+.o2k7Skin span.mce_insertlayer {background-position:-260px -20px}
+.o2k7Skin span.mce_movebackward {background-position:-280px -20px}
+.o2k7Skin span.mce_moveforward {background-position:-300px -20px}
+.o2k7Skin span.mce_media {background-position:-320px -20px}
+.o2k7Skin span.mce_nonbreaking {background-position:-340px -20px}
+.o2k7Skin span.mce_pastetext {background-position:-360px -20px}
+.o2k7Skin span.mce_pasteword {background-position:-380px -20px}
+.o2k7Skin span.mce_selectall {background-position:-400px -20px}
+.o2k7Skin span.mce_preview {background-position:-420px -20px}
+.o2k7Skin span.mce_print {background-position:-440px -20px}
+.o2k7Skin span.mce_cancel {background-position:-460px -20px}
+.o2k7Skin span.mce_save {background-position:-480px -20px}
+.o2k7Skin span.mce_replace {background-position:-500px -20px}
+.o2k7Skin span.mce_search {background-position:-520px -20px}
+.o2k7Skin span.mce_styleprops {background-position:-560px -20px}
+.o2k7Skin span.mce_table {background-position:-580px -20px}
+.o2k7Skin span.mce_cell_props {background-position:-600px -20px}
+.o2k7Skin span.mce_delete_table {background-position:-620px -20px}
+.o2k7Skin span.mce_delete_col {background-position:-640px -20px}
+.o2k7Skin span.mce_delete_row {background-position:-660px -20px}
+.o2k7Skin span.mce_col_after {background-position:-680px -20px}
+.o2k7Skin span.mce_col_before {background-position:-700px -20px}
+.o2k7Skin span.mce_row_after {background-position:-720px -20px}
+.o2k7Skin span.mce_row_before {background-position:-740px -20px}
+.o2k7Skin span.mce_merge_cells {background-position:-760px -20px}
+.o2k7Skin span.mce_table_props {background-position:-980px -20px}
+.o2k7Skin span.mce_row_props {background-position:-780px -20px}
+.o2k7Skin span.mce_split_cells {background-position:-800px -20px}
+.o2k7Skin span.mce_template {background-position:-820px -20px}
+.o2k7Skin span.mce_visualchars {background-position:-840px -20px}
+.o2k7Skin span.mce_abbr {background-position:-860px -20px}
+.o2k7Skin span.mce_acronym {background-position:-880px -20px}
+.o2k7Skin span.mce_attribs {background-position:-900px -20px}
+.o2k7Skin span.mce_cite {background-position:-920px -20px}
+.o2k7Skin span.mce_del {background-position:-940px -20px}
+.o2k7Skin span.mce_ins {background-position:-960px -20px}
+.o2k7Skin span.mce_pagebreak {background-position:0 -40px}
+.o2k7Skin span.mce_restoredraft {background-position:-20px -40px}
+.o2k7Skin span.mce_spellchecker {background-position:-540px -20px}
+.o2k7Skin span.mce_visualblocks {background-position: -40px -40px}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css
new file mode 100644
index 0000000..50c9b76
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_black.css
@@ -0,0 +1,8 @@
+/* Black */
+.o2k7SkinBlack .mceToolbar .mceToolbarStart span, .o2k7SkinBlack .mceToolbar .mceToolbarEnd span, .o2k7SkinBlack .mceButton, .o2k7SkinBlack .mceSplitButton, .o2k7SkinBlack .mceSeparator, .o2k7SkinBlack .mceSplitButton a.mceOpen, .o2k7SkinBlack .mceListBox a.mceOpen {background-image:url(img/button_bg_black.png)}
+.o2k7SkinBlack td.mceToolbar, .o2k7SkinBlack td.mceStatusbar, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack .mceMenuItemTitle span.mceText, .o2k7SkinBlack .mceStatusbar div, .o2k7SkinBlack .mceStatusbar span, .o2k7SkinBlack .mceStatusbar a {background:#535353; color:#FFF}
+.o2k7SkinBlack table.mceListBoxEnabled .mceText, o2k7SkinBlack .mceListBox .mceText {background:#FFF; border:1px solid #CBCFD4; border-bottom-color:#989FA9; border-right:0}
+.o2k7SkinBlack table.mceListBoxEnabled:hover .mceText, .o2k7SkinBlack .mceListBoxHover .mceText, .o2k7SkinBlack .mceListBoxSelected .mceText {background:#FFF; border:1px solid #FFBD69; border-right:0}
+.o2k7SkinBlack .mceExternalToolbar, .o2k7SkinBlack .mceListBox .mceText, .o2k7SkinBlack div.mceMenu, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceFirst td, .o2k7SkinBlack table.mceLayout, .o2k7SkinBlack .mceMenuItemTitle a, .o2k7SkinBlack table.mceLayout tr.mceLast td, .o2k7SkinBlack .mceIframeContainer {border-color: #535353;}
+.o2k7SkinBlack table.mceSplitButtonEnabled:hover a.mceAction, .o2k7SkinBlack .mceSplitButtonHover a.mceAction, .o2k7SkinBlack .mceSplitButtonSelected {background-image:url(img/button_bg_black.png)}
+.o2k7SkinBlack .mceMenu .mceMenuItemEnabled a:hover, .o2k7SkinBlack .mceMenu .mceMenuItemActive {background-color:#FFE7A1}
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css
new file mode 100644
index 0000000..960a8e4
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/skins/o2k7/ui_silver.css
@@ -0,0 +1,5 @@
+/* Silver */
+.o2k7SkinSilver .mceToolbar .mceToolbarStart span, .o2k7SkinSilver .mceButton, .o2k7SkinSilver .mceSplitButton, .o2k7SkinSilver .mceSeparator, .o2k7SkinSilver .mceSplitButton a.mceOpen, .o2k7SkinSilver .mceListBox a.mceOpen {background-image:url(img/button_bg_silver.png)}
+.o2k7SkinSilver td.mceToolbar, .o2k7SkinSilver td.mceStatusbar, .o2k7SkinSilver .mceMenuItemTitle a {background:#eee}
+.o2k7SkinSilver .mceListBox .mceText {background:#FFF}
+.o2k7SkinSilver .mceExternalToolbar, .o2k7SkinSilver .mceListBox .mceText, .o2k7SkinSilver div.mceMenu, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceFirst td, .o2k7SkinSilver table.mceLayout, .o2k7SkinSilver .mceMenuItemTitle a, .o2k7SkinSilver table.mceLayout tr.mceLast td, .o2k7SkinSilver .mceIframeContainer {border-color: #bbb}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm
new file mode 100644
index 0000000..575d2ab
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/advanced/source_editor.htm
@@ -0,0 +1,26 @@
+
+
+ {#advanced_dlg.code_title}
+
+
+
+
+
+
+
+
+
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template.js
new file mode 100644
index 0000000..4b3209c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.DOM;tinymce.ThemeManager.requireLangPack("simple");tinymce.create("tinymce.themes.SimpleTheme",{init:function(c,d){var e=this,b=["Bold","Italic","Underline","Strikethrough","InsertUnorderedList","InsertOrderedList"],f=c.settings;e.editor=c;c.contentCSS.push(d+"/skins/"+f.skin+"/content.css");c.onInit.add(function(){c.onNodeChange.add(function(h,g){tinymce.each(b,function(i){g.get(i.toLowerCase()).setActive(h.queryCommandState(i))})})});a.loadCSS((f.editor_css?c.documentBaseURI.toAbsolute(f.editor_css):"")||d+"/skins/"+f.skin+"/ui.css")},renderUI:function(h){var e=this,i=h.targetNode,b,c,d=e.editor,f=d.controlManager,g;i=a.insertAfter(a.create("span",{id:d.id+"_container","class":"mceEditor "+d.settings.skin+"SimpleSkin"}),i);i=g=a.add(i,"table",{cellPadding:0,cellSpacing:0,"class":"mceLayout"});i=c=a.add(i,"tbody");i=a.add(c,"tr");i=b=a.add(a.add(i,"td"),"div",{"class":"mceIframeContainer"});i=a.add(a.add(c,"tr",{"class":"last"}),"td",{"class":"mceToolbar mceLast",align:"center"});c=e.toolbar=f.createToolbar("tools1");c.add(f.createButton("bold",{title:"simple.bold_desc",cmd:"Bold"}));c.add(f.createButton("italic",{title:"simple.italic_desc",cmd:"Italic"}));c.add(f.createButton("underline",{title:"simple.underline_desc",cmd:"Underline"}));c.add(f.createButton("strikethrough",{title:"simple.striketrough_desc",cmd:"Strikethrough"}));c.add(f.createSeparator());c.add(f.createButton("undo",{title:"simple.undo_desc",cmd:"Undo"}));c.add(f.createButton("redo",{title:"simple.redo_desc",cmd:"Redo"}));c.add(f.createSeparator());c.add(f.createButton("cleanup",{title:"simple.cleanup_desc",cmd:"mceCleanup"}));c.add(f.createSeparator());c.add(f.createButton("insertunorderedlist",{title:"simple.bullist_desc",cmd:"InsertUnorderedList"}));c.add(f.createButton("insertorderedlist",{title:"simple.numlist_desc",cmd:"InsertOrderedList"}));c.renderTo(i);return{iframeContainer:b,editorContainer:d.id+"_container",sizeContainer:g,deltaHeight:-20}},getInfo:function(){return{longname:"Simple theme",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",version:tinymce.majorVersion+"."+tinymce.minorVersion}}});tinymce.ThemeManager.add("simple",tinymce.themes.SimpleTheme)})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js
new file mode 100644
index 0000000..01ce87c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/editor_template_src.js
@@ -0,0 +1,84 @@
+/**
+ * editor_template_src.js
+ *
+ * Copyright 2009, Moxiecode Systems AB
+ * Released under LGPL License.
+ *
+ * License: http://tinymce.moxiecode.com/license
+ * Contributing: http://tinymce.moxiecode.com/contributing
+ */
+
+(function() {
+ var DOM = tinymce.DOM;
+
+ // Tell it to load theme specific language pack(s)
+ tinymce.ThemeManager.requireLangPack('simple');
+
+ tinymce.create('tinymce.themes.SimpleTheme', {
+ init : function(ed, url) {
+ var t = this, states = ['Bold', 'Italic', 'Underline', 'Strikethrough', 'InsertUnorderedList', 'InsertOrderedList'], s = ed.settings;
+
+ t.editor = ed;
+ ed.contentCSS.push(url + "/skins/" + s.skin + "/content.css");
+
+ ed.onInit.add(function() {
+ ed.onNodeChange.add(function(ed, cm) {
+ tinymce.each(states, function(c) {
+ cm.get(c.toLowerCase()).setActive(ed.queryCommandState(c));
+ });
+ });
+ });
+
+ DOM.loadCSS((s.editor_css ? ed.documentBaseURI.toAbsolute(s.editor_css) : '') || url + "/skins/" + s.skin + "/ui.css");
+ },
+
+ renderUI : function(o) {
+ var t = this, n = o.targetNode, ic, tb, ed = t.editor, cf = ed.controlManager, sc;
+
+ n = DOM.insertAfter(DOM.create('span', {id : ed.id + '_container', 'class' : 'mceEditor ' + ed.settings.skin + 'SimpleSkin'}), n);
+ n = sc = DOM.add(n, 'table', {cellPadding : 0, cellSpacing : 0, 'class' : 'mceLayout'});
+ n = tb = DOM.add(n, 'tbody');
+
+ // Create iframe container
+ n = DOM.add(tb, 'tr');
+ n = ic = DOM.add(DOM.add(n, 'td'), 'div', {'class' : 'mceIframeContainer'});
+
+ // Create toolbar container
+ n = DOM.add(DOM.add(tb, 'tr', {'class' : 'last'}), 'td', {'class' : 'mceToolbar mceLast', align : 'center'});
+
+ // Create toolbar
+ tb = t.toolbar = cf.createToolbar("tools1");
+ tb.add(cf.createButton('bold', {title : 'simple.bold_desc', cmd : 'Bold'}));
+ tb.add(cf.createButton('italic', {title : 'simple.italic_desc', cmd : 'Italic'}));
+ tb.add(cf.createButton('underline', {title : 'simple.underline_desc', cmd : 'Underline'}));
+ tb.add(cf.createButton('strikethrough', {title : 'simple.striketrough_desc', cmd : 'Strikethrough'}));
+ tb.add(cf.createSeparator());
+ tb.add(cf.createButton('undo', {title : 'simple.undo_desc', cmd : 'Undo'}));
+ tb.add(cf.createButton('redo', {title : 'simple.redo_desc', cmd : 'Redo'}));
+ tb.add(cf.createSeparator());
+ tb.add(cf.createButton('cleanup', {title : 'simple.cleanup_desc', cmd : 'mceCleanup'}));
+ tb.add(cf.createSeparator());
+ tb.add(cf.createButton('insertunorderedlist', {title : 'simple.bullist_desc', cmd : 'InsertUnorderedList'}));
+ tb.add(cf.createButton('insertorderedlist', {title : 'simple.numlist_desc', cmd : 'InsertOrderedList'}));
+ tb.renderTo(n);
+
+ return {
+ iframeContainer : ic,
+ editorContainer : ed.id + '_container',
+ sizeContainer : sc,
+ deltaHeight : -20
+ };
+ },
+
+ getInfo : function() {
+ return {
+ longname : 'Simple theme',
+ author : 'Moxiecode Systems AB',
+ authorurl : 'http://tinymce.moxiecode.com',
+ version : tinymce.majorVersion + "." + tinymce.minorVersion
+ }
+ }
+ });
+
+ tinymce.ThemeManager.add('simple', tinymce.themes.SimpleTheme);
+})();
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif
new file mode 100644
index 0000000..6fcbcb5
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/img/icons.gif differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/langs/en.js b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/langs/en.js
new file mode 100644
index 0000000..088ed0f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/langs/en.js
@@ -0,0 +1 @@
+tinyMCE.addI18n('en.simple',{"cleanup_desc":"Cleanup Messy Code","redo_desc":"Redo (Ctrl+Y)","undo_desc":"Undo (Ctrl+Z)","numlist_desc":"Insert/Remove Numbered List","bullist_desc":"Insert/Remove Bulleted List","striketrough_desc":"Strikethrough","underline_desc":"Underline (Ctrl+U)","italic_desc":"Italic (Ctrl+I)","bold_desc":"Bold (Ctrl+B)"});
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css
new file mode 100644
index 0000000..2506c80
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/content.css
@@ -0,0 +1,25 @@
+body, td, pre {
+ font-family: Verdana, Arial, Helvetica, sans-serif;
+ font-size: 10px;
+}
+
+body {
+ background-color: #FFFFFF;
+}
+
+.mceVisualAid {
+ border: 1px dashed #BBBBBB;
+}
+
+/* MSIE specific */
+
+* html body {
+ scrollbar-3dlight-color: #F0F0EE;
+ scrollbar-arrow-color: #676662;
+ scrollbar-base-color: #F0F0EE;
+ scrollbar-darkshadow-color: #DDDDDD;
+ scrollbar-face-color: #E0E0DD;
+ scrollbar-highlight-color: #F0F0EE;
+ scrollbar-shadow-color: #F0F0EE;
+ scrollbar-track-color: #F5F5F5;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css
new file mode 100644
index 0000000..076fe84
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/default/ui.css
@@ -0,0 +1,32 @@
+/* Reset */
+.defaultSimpleSkin table, .defaultSimpleSkin tbody, .defaultSimpleSkin a, .defaultSimpleSkin img, .defaultSimpleSkin tr, .defaultSimpleSkin div, .defaultSimpleSkin td, .defaultSimpleSkin iframe, .defaultSimpleSkin span, .defaultSimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000}
+
+/* Containers */
+.defaultSimpleSkin {position:relative}
+.defaultSimpleSkin table.mceLayout {background:#F0F0EE; border:1px solid #CCC;}
+.defaultSimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #CCC;}
+.defaultSimpleSkin .mceToolbar {height:24px;}
+
+/* Layout */
+.defaultSimpleSkin span.mceIcon, .defaultSimpleSkin img.mceIcon {display:block; width:20px; height:20px}
+.defaultSimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+
+/* Button */
+.defaultSimpleSkin .mceButton {display:block; border:1px solid #F0F0EE; width:20px; height:20px}
+.defaultSimpleSkin a.mceButtonEnabled:hover {border:1px solid #0A246A; background-color:#B2BBD0}
+.defaultSimpleSkin a.mceButtonActive {border:1px solid #0A246A; background-color:#C2CBE0}
+.defaultSimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+
+/* Separator */
+.defaultSimpleSkin .mceSeparator {display:block; background:url(../../img/icons.gif) -180px 0; width:2px; height:20px; margin:0 2px 0 4px}
+
+/* Theme */
+.defaultSimpleSkin span.mce_bold {background-position:0 0}
+.defaultSimpleSkin span.mce_italic {background-position:-60px 0}
+.defaultSimpleSkin span.mce_underline {background-position:-140px 0}
+.defaultSimpleSkin span.mce_strikethrough {background-position:-120px 0}
+.defaultSimpleSkin span.mce_undo {background-position:-160px 0}
+.defaultSimpleSkin span.mce_redo {background-position:-100px 0}
+.defaultSimpleSkin span.mce_cleanup {background-position:-40px 0}
+.defaultSimpleSkin span.mce_insertunorderedlist {background-position:-20px 0}
+.defaultSimpleSkin span.mce_insertorderedlist {background-position:-80px 0}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css
new file mode 100644
index 0000000..595809f
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/content.css
@@ -0,0 +1,17 @@
+body, td, pre {font-family:Verdana, Arial, Helvetica, sans-serif; font-size:10px;}
+
+body {background: #FFF;}
+.mceVisualAid {border: 1px dashed #BBB;}
+
+/* IE */
+
+* html body {
+scrollbar-3dlight-color: #F0F0EE;
+scrollbar-arrow-color: #676662;
+scrollbar-base-color: #F0F0EE;
+scrollbar-darkshadow-color: #DDDDDD;
+scrollbar-face-color: #E0E0DD;
+scrollbar-highlight-color: #F0F0EE;
+scrollbar-shadow-color: #F0F0EE;
+scrollbar-track-color: #F5F5F5;
+}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png
new file mode 100644
index 0000000..527e349
Binary files /dev/null and b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/img/button_bg.png differ
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css
new file mode 100644
index 0000000..cf6c35d
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/themes/simple/skins/o2k7/ui.css
@@ -0,0 +1,35 @@
+/* Reset */
+.o2k7SimpleSkin table, .o2k7SimpleSkin tbody, .o2k7SimpleSkin a, .o2k7SimpleSkin img, .o2k7SimpleSkin tr, .o2k7SimpleSkin div, .o2k7SimpleSkin td, .o2k7SimpleSkin iframe, .o2k7SimpleSkin span, .o2k7SimpleSkin * {border:0; margin:0; padding:0; background:transparent; white-space:nowrap; text-decoration:none; font-weight:normal; cursor:default; color:#000}
+
+/* Containers */
+.o2k7SimpleSkin {position:relative}
+.o2k7SimpleSkin table.mceLayout {background:#E5EFFD; border:1px solid #ABC6DD;}
+.o2k7SimpleSkin iframe {display:block; background:#FFF; border-bottom:1px solid #ABC6DD;}
+.o2k7SimpleSkin .mceToolbar {height:26px;}
+
+/* Layout */
+.o2k7SimpleSkin .mceToolbar .mceToolbarStart span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px; }
+.o2k7SimpleSkin .mceToolbar .mceToolbarEnd span {display:block; background:url(img/button_bg.png) -22px 0; width:1px; height:22px}
+.o2k7SimpleSkin span.mceIcon, .o2k7SimpleSkin img.mceIcon {display:block; width:20px; height:20px}
+.o2k7SimpleSkin .mceIcon {background:url(../../img/icons.gif) no-repeat 20px 20px}
+
+/* Button */
+.o2k7SimpleSkin .mceButton {display:block; background:url(img/button_bg.png); width:22px; height:22px}
+.o2k7SimpleSkin a.mceButton span, .o2k7SimpleSkin a.mceButton img {margin:1px 0 0 1px}
+.o2k7SimpleSkin a.mceButtonEnabled:hover {background-color:#B2BBD0; background-position:0 -22px}
+.o2k7SimpleSkin a.mceButtonActive {background-position:0 -44px}
+.o2k7SimpleSkin .mceButtonDisabled span {opacity:0.3; -ms-filter:'alpha(opacity=30)'; filter:alpha(opacity=30)}
+
+/* Separator */
+.o2k7SimpleSkin .mceSeparator {display:block; background:url(img/button_bg.png) -22px 0; width:5px; height:22px}
+
+/* Theme */
+.o2k7SimpleSkin span.mce_bold {background-position:0 0}
+.o2k7SimpleSkin span.mce_italic {background-position:-60px 0}
+.o2k7SimpleSkin span.mce_underline {background-position:-140px 0}
+.o2k7SimpleSkin span.mce_strikethrough {background-position:-120px 0}
+.o2k7SimpleSkin span.mce_undo {background-position:-160px 0}
+.o2k7SimpleSkin span.mce_redo {background-position:-100px 0}
+.o2k7SimpleSkin span.mce_cleanup {background-position:-40px 0}
+.o2k7SimpleSkin span.mce_insertunorderedlist {background-position:-20px 0}
+.o2k7SimpleSkin span.mce_insertorderedlist {background-position:-80px 0}
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce.js b/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce.js
new file mode 100644
index 0000000..44d9fd9
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce.js
@@ -0,0 +1 @@
+(function(e){var a=/^\s*|\s*$/g,b,d="B".replace(/A(.)|B/,"$1")==="$1";var c={majorVersion:"3",minorVersion:"5.8",releaseDate:"2012-11-20",_init:function(){var s=this,q=document,o=navigator,g=o.userAgent,m,f,l,k,j,r;s.isOpera=e.opera&&opera.buildNumber;s.isWebKit=/WebKit/.test(g);s.isIE=!s.isWebKit&&!s.isOpera&&(/MSIE/gi).test(g)&&(/Explorer/gi).test(o.appName);s.isIE6=s.isIE&&/MSIE [56]/.test(g);s.isIE7=s.isIE&&/MSIE [7]/.test(g);s.isIE8=s.isIE&&/MSIE [8]/.test(g);s.isIE9=s.isIE&&/MSIE [9]/.test(g);s.isGecko=!s.isWebKit&&/Gecko/.test(g);s.isMac=g.indexOf("Mac")!=-1;s.isAir=/adobeair/i.test(g);s.isIDevice=/(iPad|iPhone)/.test(g);s.isIOS5=s.isIDevice&&g.match(/AppleWebKit\/(\d*)/)[1]>=534;if(e.tinyMCEPreInit){s.suffix=tinyMCEPreInit.suffix;s.baseURL=tinyMCEPreInit.base;s.query=tinyMCEPreInit.query;return}s.suffix="";f=q.getElementsByTagName("base");for(m=0;m0?b:[f.scope]);if(e===false){break}}a.inDispatch=false;return e}});(function(){var a=tinymce.each;tinymce.create("tinymce.util.URI",{URI:function(e,g){var f=this,i,d,c,h;e=tinymce.trim(e);g=f.settings=g||{};if(/^([\w\-]+):([^\/]{2})/i.test(e)||/^\s*#/.test(e)){f.source=e;return}if(e.indexOf("/")===0&&e.indexOf("//")!==0){e=(g.base_uri?g.base_uri.protocol||"http":"http")+"://mce_host"+e}if(!/^[\w\-]*:?\/\//.test(e)){h=g.base_uri?g.base_uri.path:new tinymce.util.URI(location.href).directory;e=((g.base_uri&&g.base_uri.protocol)||"http")+"://mce_host"+f.toAbsPath(h,e)}e=e.replace(/@@/g,"(mce_at)");e=/^(?:(?![^:@]+:[^:@\/]*@)([^:\/?#.]+):)?(?:\/\/)?((?:(([^:@\/]*):?([^:@\/]*))?@)?([^:\/?#]*)(?::(\d*))?)(((\/(?:[^?#](?![^?#\/]*\.[^?#\/.]+(?:[?#]|$)))*\/?)?([^?#\/]*))(?:\?([^#]*))?(?:#(.*))?)/.exec(e);a(["source","protocol","authority","userInfo","user","password","host","port","relative","path","directory","file","query","anchor"],function(b,j){var k=e[j];if(k){k=k.replace(/\(mce_at\)/g,"@@")}f[b]=k});c=g.base_uri;if(c){if(!f.protocol){f.protocol=c.protocol}if(!f.userInfo){f.userInfo=c.userInfo}if(!f.port&&f.host==="mce_host"){f.port=c.port}if(!f.host||f.host==="mce_host"){f.host=c.host}f.source=""}},setPath:function(c){var b=this;c=/^(.*?)\/?(\w+)?$/.exec(c);b.path=c[0];b.directory=c[1];b.file=c[2];b.source="";b.getURI()},toRelative:function(b){var d=this,f;if(b==="./"){return b}b=new tinymce.util.URI(b,{base_uri:d});if((b.host!="mce_host"&&d.host!=b.host&&b.host)||d.port!=b.port||d.protocol!=b.protocol){return b.getURI()}var c=d.getURI(),e=b.getURI();if(c==e||(c.charAt(c.length-1)=="/"&&c.substr(0,c.length-1)==e)){return c}f=d.toRelPath(d.path,b.path);if(b.query){f+="?"+b.query}if(b.anchor){f+="#"+b.anchor}return f},toAbsolute:function(b,c){b=new tinymce.util.URI(b,{base_uri:this});return b.getURI(this.host==b.host&&this.protocol==b.protocol?c:0)},toRelPath:function(g,h){var c,f=0,d="",e,b;g=g.substring(0,g.lastIndexOf("/"));g=g.split("/");c=h.split("/");if(g.length>=c.length){for(e=0,b=g.length;e=c.length||g[e]!=c[e]){f=e+1;break}}}if(g.length=g.length||g[e]!=c[e]){f=e+1;break}}}if(f===1){return h}for(e=0,b=g.length-(f-1);e=0;c--){if(f[c].length===0||f[c]==="."){continue}if(f[c]===".."){b++;continue}if(b>0){b--;continue}h.push(f[c])}c=e.length-b;if(c<=0){g=h.reverse().join("/")}else{g=e.slice(0,c).join("/")+"/"+h.reverse().join("/")}if(g.indexOf("/")!==0){g="/"+g}if(d&&g.lastIndexOf("/")!==g.length-1){g+=d}return g},getURI:function(d){var c,b=this;if(!b.source||d){c="";if(!d){if(b.protocol){c+=b.protocol+"://"}if(b.userInfo){c+=b.userInfo+"@"}if(b.host){c+=b.host}if(b.port){c+=":"+b.port}}if(b.path){c+=b.path}if(b.query){c+="?"+b.query}if(b.anchor){c+="#"+b.anchor}b.source=c}return b.source}})})();(function(){var a=tinymce.each;tinymce.create("static tinymce.util.Cookie",{getHash:function(d){var b=this.get(d),c;if(b){a(b.split("&"),function(e){e=e.split("=");c=c||{};c[unescape(e[0])]=unescape(e[1])})}return c},setHash:function(j,b,g,f,i,c){var h="";a(b,function(e,d){h+=(!h?"":"&")+escape(d)+"="+escape(e)});this.set(j,h,g,f,i,c)},get:function(i){var h=document.cookie,g,f=i+"=",d;if(!h){return}d=h.indexOf("; "+f);if(d==-1){d=h.indexOf(f);if(d!==0){return null}}else{d+=2}g=h.indexOf(";",d);if(g==-1){g=h.length}return unescape(h.substring(d+f.length,g))},set:function(i,b,g,f,h,c){document.cookie=i+"="+escape(b)+((g)?"; expires="+g.toGMTString():"")+((f)?"; path="+escape(f):"")+((h)?"; domain="+h:"")+((c)?"; secure":"")},remove:function(c,e,d){var b=new Date();b.setTime(b.getTime()-1000);this.set(c,"",b,e,d)}})})();(function(){function serialize(o,quote){var i,v,t,name;quote=quote||'"';if(o==null){return"null"}t=typeof o;if(t=="string"){v="\bb\tt\nn\ff\rr\"\"''\\\\";return quote+o.replace(/([\u0080-\uFFFF\x00-\x1f\"\'\\])/g,function(a,b){if(quote==='"'&&a==="'"){return a}i=v.indexOf(b);if(i+1){return"\\"+v.charAt(i+1)}a=b.charCodeAt().toString(16);return"\\u"+"0000".substring(a.length)+a})+quote}if(t=="object"){if(o.hasOwnProperty&&Object.prototype.toString.call(o)==="[object Array]"){for(i=0,v="[";i0?",":"")+serialize(o[i],quote)}return v+"]"}v="{";for(name in o){if(o.hasOwnProperty(name)){v+=typeof o[name]!="function"?(v.length>1?","+quote:quote)+name+quote+":"+serialize(o[name],quote):""}}return v+"}"}return""+o}tinymce.util.JSON={serialize:serialize,parse:function(s){try{return eval("("+s+")")}catch(ex){}}}})();tinymce.create("static tinymce.util.XHR",{send:function(g){var a,e,b=window,h=0;function f(){if(!g.async||a.readyState==4||h++>10000){if(g.success&&h<10000&&a.status==200){g.success.call(g.success_scope,""+a.responseText,a,g)}else{if(g.error){g.error.call(g.error_scope,h>10000?"TIMED_OUT":"GENERAL",a,g)}}a=null}else{b.setTimeout(f,10)}}g.scope=g.scope||this;g.success_scope=g.success_scope||g.scope;g.error_scope=g.error_scope||g.scope;g.async=g.async===false?false:true;g.data=g.data||"";function d(i){a=0;try{a=new ActiveXObject(i)}catch(c){}return a}a=b.XMLHttpRequest?new XMLHttpRequest():d("Microsoft.XMLHTTP")||d("Msxml2.XMLHTTP");if(a){if(a.overrideMimeType){a.overrideMimeType(g.content_type)}a.open(g.type||(g.data?"POST":"GET"),g.url,g.async);if(g.content_type){a.setRequestHeader("Content-Type",g.content_type)}a.setRequestHeader("X-Requested-With","XMLHttpRequest");a.send(g.data);if(!g.async){return f()}e=b.setTimeout(f,10)}}});(function(){var c=tinymce.extend,b=tinymce.util.JSON,a=tinymce.util.XHR;tinymce.create("tinymce.util.JSONRequest",{JSONRequest:function(d){this.settings=c({},d);this.count=0},send:function(f){var e=f.error,d=f.success;f=c(this.settings,f);f.success=function(h,g){h=b.parse(h);if(typeof(h)=="undefined"){h={error:"JSON Parse error."}}if(h.error){e.call(f.error_scope||f.scope,h.error,g)}else{d.call(f.success_scope||f.scope,h.result)}};f.error=function(h,g){if(e){e.call(f.error_scope||f.scope,h,g)}};f.data=b.serialize({id:f.id||"c"+(this.count++),method:f.method,params:f.params});f.content_type="application/json";a.send(f)},"static":{sendRPC:function(d){return new tinymce.util.JSONRequest().send(d)}}})}());(function(a){a.VK={BACKSPACE:8,DELETE:46,DOWN:40,ENTER:13,LEFT:37,RIGHT:39,SPACEBAR:32,TAB:9,UP:38,modifierPressed:function(b){return b.shiftKey||b.ctrlKey||b.altKey},metaKeyPressed:function(b){return a.isMac?b.metaKey:b.ctrlKey&&!b.altKey}}})(tinymce);tinymce.util.Quirks=function(a){var j=tinymce.VK,f=j.BACKSPACE,k=j.DELETE,e=a.dom,l=a.selection,H=a.settings,v=a.parser,o=a.serializer,E=tinymce.each;function A(N,M){try{a.getDoc().execCommand(N,false,M)}catch(L){}}function n(){var L=a.getDoc().documentMode;return L?L:6}function z(L){return L.isDefaultPrevented()}function J(){function L(O){var M,Q,N,P;M=l.getRng();Q=e.getParent(M.startContainer,e.isBlock);if(O){Q=e.getNext(Q,e.isBlock)}if(Q){N=Q.firstChild;while(N&&N.nodeType==3&&N.nodeValue.length===0){N=N.nextSibling}if(N&&N.nodeName==="SPAN"){P=N.cloneNode(false)}}E(e.select("span",Q),function(R){R.setAttribute("data-mce-mark","1")});a.getDoc().execCommand(O?"ForwardDelete":"Delete",false,null);Q=e.getParent(M.startContainer,e.isBlock);E(e.select("span",Q),function(R){var S=l.getBookmark();if(P){e.replace(P.cloneNode(false),R,true)}else{if(!R.getAttribute("data-mce-mark")){e.remove(R,true)}else{R.removeAttribute("data-mce-mark")}}l.moveToBookmark(S)})}a.onKeyDown.add(function(M,O){var N;N=O.keyCode==k;if(!z(O)&&(N||O.keyCode==f)&&!j.modifierPressed(O)){O.preventDefault();L(N)}});a.addCommand("Delete",function(){L()})}function q(){function L(O){var N=e.create("body");var P=O.cloneContents();N.appendChild(P);return l.serializer.serialize(N,{format:"html"})}function M(N){var P=L(N);var Q=e.createRng();Q.selectNode(a.getBody());var O=L(Q);return P===O}a.onKeyDown.add(function(O,Q){var P=Q.keyCode,N;if(!z(Q)&&(P==k||P==f)){N=O.selection.isCollapsed();if(N&&!e.isEmpty(O.getBody())){return}if(tinymce.isIE&&!N){return}if(!N&&!M(O.selection.getRng())){return}O.setContent("");O.selection.setCursorLocation(O.getBody(),0);O.nodeChanged()}})}function I(){a.onKeyDown.add(function(L,M){if(!z(M)&&M.keyCode==65&&j.metaKeyPressed(M)){M.preventDefault();L.execCommand("SelectAll")}})}function K(){if(!a.settings.content_editable){e.bind(a.getDoc(),"focusin",function(L){l.setRng(l.getRng())});e.bind(a.getDoc(),"mousedown",function(L){if(L.target==a.getDoc().documentElement){a.getWin().focus();l.setRng(l.getRng())}})}}function B(){a.onKeyDown.add(function(L,O){if(!z(O)&&O.keyCode===f){if(l.isCollapsed()&&l.getRng(true).startOffset===0){var N=l.getNode();var M=N.previousSibling;if(M&&M.nodeName&&M.nodeName.toLowerCase()==="hr"){e.remove(M);tinymce.dom.Event.cancel(O)}}}})}function y(){if(!Range.prototype.getClientRects){a.onMouseDown.add(function(M,N){if(!z(N)&&N.target.nodeName==="HTML"){var L=M.getBody();L.blur();setTimeout(function(){L.focus()},0)}})}}function h(){a.onClick.add(function(L,M){M=M.target;if(/^(IMG|HR)$/.test(M.nodeName)){l.getSel().setBaseAndExtent(M,0,M,1)}if(M.nodeName=="A"&&e.hasClass(M,"mceItemAnchor")){l.select(M)}L.nodeChanged()})}function c(){function M(){var O=e.getAttribs(l.getStart().cloneNode(false));return function(){var P=l.getStart();if(P!==a.getBody()){e.setAttrib(P,"style",null);E(O,function(Q){P.setAttributeNode(Q.cloneNode(true))})}}}function L(){return !l.isCollapsed()&&e.getParent(l.getStart(),e.isBlock)!=e.getParent(l.getEnd(),e.isBlock)}function N(O,P){P.preventDefault();return false}a.onKeyPress.add(function(O,Q){var P;if(!z(Q)&&(Q.keyCode==8||Q.keyCode==46)&&L()){P=M();O.getDoc().execCommand("delete",false,null);P();Q.preventDefault();return false}});e.bind(a.getDoc(),"cut",function(P){var O;if(!z(P)&&L()){O=M();a.onKeyUp.addToTop(N);setTimeout(function(){O();a.onKeyUp.remove(N)},0)}})}function b(){var M,L;e.bind(a.getDoc(),"selectionchange",function(){if(L){clearTimeout(L);L=0}L=window.setTimeout(function(){var N=l.getRng();if(!M||!tinymce.dom.RangeUtils.compareRanges(N,M)){a.nodeChanged();M=N}},50)})}function x(){document.body.setAttribute("role","application")}function t(){a.onKeyDown.add(function(L,N){if(!z(N)&&N.keyCode===f){if(l.isCollapsed()&&l.getRng(true).startOffset===0){var M=l.getNode().previousSibling;if(M&&M.nodeName&&M.nodeName.toLowerCase()==="table"){return tinymce.dom.Event.cancel(N)}}}})}function C(){if(n()>7){return}A("RespectVisibilityInDesign",true);a.contentStyles.push(".mceHideBrInPre pre br {display: none}");e.addClass(a.getBody(),"mceHideBrInPre");v.addNodeFilter("pre",function(L,N){var O=L.length,Q,M,R,P;while(O--){Q=L[O].getAll("br");M=Q.length;while(M--){R=Q[M];P=R.prev;if(P&&P.type===3&&P.value.charAt(P.value-1)!="\n"){P.value+="\n"}else{R.parent.insert(new tinymce.html.Node("#text",3),R,true).value="\n"}}}});o.addNodeFilter("pre",function(L,N){var O=L.length,Q,M,R,P;while(O--){Q=L[O].getAll("br");M=Q.length;while(M--){R=Q[M];P=R.prev;if(P&&P.type==3){P.value=P.value.replace(/\r?\n$/,"")}}}})}function g(){e.bind(a.getBody(),"mouseup",function(N){var M,L=l.getNode();if(L.nodeName=="IMG"){if(M=e.getStyle(L,"width")){e.setAttrib(L,"width",M.replace(/[^0-9%]+/g,""));e.setStyle(L,"width","")}if(M=e.getStyle(L,"height")){e.setAttrib(L,"height",M.replace(/[^0-9%]+/g,""));e.setStyle(L,"height","")}}})}function d(){a.onKeyDown.add(function(R,S){var Q,L,M,O,P,T,N;Q=S.keyCode==k;if(!z(S)&&(Q||S.keyCode==f)&&!j.modifierPressed(S)){L=l.getRng();M=L.startContainer;O=L.startOffset;N=L.collapsed;if(M.nodeType==3&&M.nodeValue.length>0&&((O===0&&!N)||(N&&O===(Q?0:1)))){nonEmptyElements=R.schema.getNonEmptyElements();S.preventDefault();P=e.create("br",{id:"__tmp"});M.parentNode.insertBefore(P,M);R.getDoc().execCommand(Q?"ForwardDelete":"Delete",false,null);M=l.getRng().startContainer;T=M.previousSibling;if(T&&T.nodeType==1&&!e.isBlock(T)&&e.isEmpty(T)&&!nonEmptyElements[T.nodeName.toLowerCase()]){e.remove(T)}e.remove("__tmp")}}})}function G(){a.onKeyDown.add(function(P,Q){var N,M,R,L,O;if(z(Q)||Q.keyCode!=j.BACKSPACE){return}N=l.getRng();M=N.startContainer;R=N.startOffset;L=e.getRoot();O=M;if(!N.collapsed||R!==0){return}while(O&&O.parentNode&&O.parentNode.firstChild==O&&O.parentNode!=L){O=O.parentNode}if(O.tagName==="BLOCKQUOTE"){P.formatter.toggle("blockquote",null,O);N=e.createRng();N.setStart(M,0);N.setEnd(M,0);l.setRng(N)}})}function F(){function L(){a._refreshContentEditable();A("StyleWithCSS",false);A("enableInlineTableEditing",false);if(!H.object_resizing){A("enableObjectResizing",false)}}if(!H.readonly){a.onBeforeExecCommand.add(L);a.onMouseDown.add(L)}}function s(){function L(M,N){E(e.select("a"),function(Q){var O=Q.parentNode,P=e.getRoot();if(O.lastChild===Q){while(O&&!e.isBlock(O)){if(O.parentNode.lastChild!==O||O===P){return}O=O.parentNode}e.add(O,"br",{"data-mce-bogus":1})}})}a.onExecCommand.add(function(M,N){if(N==="CreateLink"){L(M)}});a.onSetContent.add(l.onSetContent.add(L))}function m(){if(H.forced_root_block){a.onInit.add(function(){A("DefaultParagraphSeparator",H.forced_root_block)})}}function p(){function L(N,M){if(!N||!M.initial){a.execCommand("mceRepaint")}}a.onUndo.add(L);a.onRedo.add(L);a.onSetContent.add(L)}function i(){a.onKeyDown.add(function(M,N){var L;if(!z(N)&&N.keyCode==f){L=M.getDoc().selection.createRange();if(L&&L.item){N.preventDefault();M.undoManager.beforeChange();e.remove(L.item(0));M.undoManager.add()}}})}function r(){var L;if(n()>=10){L="";E("p div h1 h2 h3 h4 h5 h6".split(" "),function(M,N){L+=(N>0?",":"")+M+":empty"});a.contentStyles.push(L+"{padding-right: 1px !important}")}}function u(){var N,M,ad,L,Y,ab,Z,ac,O,P,aa,W,V,X=document,T=a.getDoc();if(!H.object_resizing||H.webkit_fake_resize===false){return}A("enableObjectResizing",false);aa={n:[0.5,0,0,-1],e:[1,0.5,1,0],s:[0.5,1,0,1],w:[0,0.5,-1,0],nw:[0,0,-1,-1],ne:[1,0,1,-1],se:[1,1,1,1],sw:[0,1,-1,1]};function R(ah){var ag,af;ag=ah.screenX-ab;af=ah.screenY-Z;W=ag*Y[2]+ac;V=af*Y[3]+O;W=W<5?5:W;V=V<5?5:V;if(j.modifierPressed(ah)||(ad.nodeName=="IMG"&&Y[2]*Y[3]!==0)){W=Math.round(V/P);V=Math.round(W*P)}e.setStyles(L,{width:W,height:V});if(Y[2]<0&&L.clientWidth<=W){e.setStyle(L,"left",N+(ac-W))}if(Y[3]<0&&L.clientHeight<=V){e.setStyle(L,"top",M+(O-V))}}function ae(){function af(ag,ah){if(ah){if(ad.style[ag]||!a.schema.isValid(ad.nodeName.toLowerCase(),ag)){e.setStyle(ad,ag,ah)}else{e.setAttrib(ad,ag,ah)}}}af("width",W);af("height",V);e.unbind(T,"mousemove",R);e.unbind(T,"mouseup",ae);if(X!=T){e.unbind(X,"mousemove",R);e.unbind(X,"mouseup",ae)}e.remove(L);Q(ad)}function Q(ai){var ag,ah,af;S();ag=e.getPos(ai);N=ag.x;M=ag.y;ah=ai.offsetWidth;af=ai.offsetHeight;if(ad!=ai){ad=ai;W=V=0}E(aa,function(al,aj){var ak;ak=e.get("mceResizeHandle"+aj);if(!ak){ak=e.add(T.documentElement,"div",{id:"mceResizeHandle"+aj,"class":"mceResizeHandle",style:"cursor:"+aj+"-resize; margin:0; padding:0"});e.bind(ak,"mousedown",function(am){am.preventDefault();ae();ab=am.screenX;Z=am.screenY;ac=ad.clientWidth;O=ad.clientHeight;P=O/ac;Y=al;L=ad.cloneNode(true);e.addClass(L,"mceClonedResizable");e.setStyles(L,{left:N,top:M,margin:0});T.documentElement.appendChild(L);e.bind(T,"mousemove",R);e.bind(T,"mouseup",ae);if(X!=T){e.bind(X,"mousemove",R);e.bind(X,"mouseup",ae)}})}else{e.show(ak)}e.setStyles(ak,{left:(ah*al[0]+N)-(ak.offsetWidth/2),top:(af*al[1]+M)-(ak.offsetHeight/2)})});if(!tinymce.isOpera&&ad.nodeName=="IMG"){ad.setAttribute("data-mce-selected","1")}}function S(){if(ad){ad.removeAttribute("data-mce-selected")}for(var af in aa){e.hide("mceResizeHandle"+af)}}a.contentStyles.push(".mceResizeHandle {position: absolute;border: 1px solid black;background: #FFF;width: 5px;height: 5px;z-index: 10000}.mceResizeHandle:hover {background: #000}img[data-mce-selected] {outline: 1px solid black}img.mceClonedResizable, table.mceClonedResizable {position: absolute;outline: 1px dashed black;opacity: .5;z-index: 10000}");function U(){var af=e.getParent(l.getNode(),"table,img");E(e.select("img[data-mce-selected]"),function(ag){ag.removeAttribute("data-mce-selected")});if(af){Q(af)}else{S()}}a.onNodeChange.add(U);e.bind(T,"selectionchange",U);a.serializer.addAttributeFilter("data-mce-selected",function(af,ag){var ah=af.length;while(ah--){af[ah].attr(ag,null)}})}function D(){if(n()<9){v.addNodeFilter("noscript",function(L){var M=L.length,N,O;while(M--){N=L[M];O=N.firstChild;if(O){N.attr("data-mce-innertext",O.value)}}});o.addNodeFilter("noscript",function(L){var M=L.length,N,P,O;while(M--){N=L[M];P=L[M].firstChild;if(P){P.value=tinymce.html.Entities.decode(P.value)}else{O=N.attributes.map["data-mce-innertext"];if(O){N.attr("data-mce-innertext",null);P=new tinymce.html.Node("#text",3);P.value=O;P.raw=true;N.append(P)}}}})}}t();G();q();if(tinymce.isWebKit){d();J();K();h();m();if(tinymce.isIDevice){b()}else{u();I()}}if(tinymce.isIE){B();x();C();g();i();r();D()}if(tinymce.isGecko){B();y();c();F();s();p()}if(tinymce.isOpera){u()}};(function(j){var a,g,d,k=/[&<>\"\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,b=/[<>&\u007E-\uD7FF\uE000-\uFFEF]|[\uD800-\uDBFF][\uDC00-\uDFFF]/g,f=/[<>&\"\']/g,c=/&(#x|#)?([\w]+);/g,i={128:"\u20AC",130:"\u201A",131:"\u0192",132:"\u201E",133:"\u2026",134:"\u2020",135:"\u2021",136:"\u02C6",137:"\u2030",138:"\u0160",139:"\u2039",140:"\u0152",142:"\u017D",145:"\u2018",146:"\u2019",147:"\u201C",148:"\u201D",149:"\u2022",150:"\u2013",151:"\u2014",152:"\u02DC",153:"\u2122",154:"\u0161",155:"\u203A",156:"\u0153",158:"\u017E",159:"\u0178"};g={'"':""","'":"'","<":"<",">":">","&":"&"};d={"<":"<",">":">","&":"&",""":'"',"'":"'"};function h(l){var m;m=document.createElement("div");m.innerHTML=l;return m.textContent||m.innerText||l}function e(m,p){var n,o,l,q={};if(m){m=m.split(",");p=p||10;for(n=0;n1){return""+(((n.charCodeAt(0)-55296)*1024)+(n.charCodeAt(1)-56320)+65536)+";"}return g[n]||""+n.charCodeAt(0)+";"})},encodeNamed:function(n,l,m){m=m||a;return n.replace(l?k:b,function(o){return g[o]||m[o]||o})},getEncodeFunc:function(l,o){var p=j.html.Entities;o=e(o)||a;function m(r,q){return r.replace(q?k:b,function(s){return g[s]||o[s]||""+s.charCodeAt(0)+";"||s})}function n(r,q){return p.encodeNamed(r,q,o)}l=j.makeMap(l.replace(/\+/g,","));if(l.named&&l.numeric){return m}if(l.named){if(o){return n}return p.encodeNamed}if(l.numeric){return p.encodeNumeric}return p.encodeRaw},decode:function(l){return l.replace(c,function(n,m,o){if(m){o=parseInt(o,m.length===2?16:10);if(o>65535){o-=65536;return String.fromCharCode(55296+(o>>10),56320+(o&1023))}else{return i[o]||String.fromCharCode(o)}}return d[n]||a[n]||h(n)})}}})(tinymce);tinymce.html.Styles=function(d,f){var k=/rgb\s*\(\s*([0-9]+)\s*,\s*([0-9]+)\s*,\s*([0-9]+)\s*\)/gi,h=/(?:url(?:(?:\(\s*\"([^\"]+)\"\s*\))|(?:\(\s*\'([^\']+)\'\s*\))|(?:\(\s*([^)\s]+)\s*\))))|(?:\'([^\']+)\')|(?:\"([^\"]+)\")/gi,b=/\s*([^:]+):\s*([^;]+);?/g,l=/\s+$/,m=/rgb/,e,g,a={},j;d=d||{};j="\\\" \\' \\; \\: ; : \uFEFF".split(" ");for(g=0;g1?r:"0"+r}return"#"+o(q)+o(p)+o(i)}return{toHex:function(i){return i.replace(k,c)},parse:function(s){var z={},q,n,x,r,v=d.url_converter,y=d.url_converter_scope||this;function p(D,G){var F,C,B,E;F=z[D+"-top"+G];if(!F){return}C=z[D+"-right"+G];if(F!=C){return}B=z[D+"-bottom"+G];if(C!=B){return}E=z[D+"-left"+G];if(B!=E){return}z[D+G]=E;delete z[D+"-top"+G];delete z[D+"-right"+G];delete z[D+"-bottom"+G];delete z[D+"-left"+G]}function u(C){var D=z[C],B;if(!D||D.indexOf(" ")<0){return}D=D.split(" ");B=D.length;while(B--){if(D[B]!==D[0]){return false}}z[C]=D[0];return true}function A(D,C,B,E){if(!u(C)){return}if(!u(B)){return}if(!u(E)){return}z[D]=z[C]+" "+z[B]+" "+z[E];delete z[C];delete z[B];delete z[E]}function t(B){r=true;return a[B]}function i(C,B){if(r){C=C.replace(/\uFEFF[0-9]/g,function(D){return a[D]})}if(!B){C=C.replace(/\\([\'\";:])/g,"$1")}return C}function o(C,B,F,E,G,D){G=G||D;if(G){G=i(G);return"'"+G.replace(/\'/g,"\\'")+"'"}B=i(B||F||E);if(v){B=v.call(y,B,"style")}return"url('"+B.replace(/\'/g,"\\'")+"')"}if(s){s=s.replace(/\\[\"\';:\uFEFF]/g,t).replace(/\"[^\"]+\"|\'[^\']+\'/g,function(B){return B.replace(/[;:]/g,t)});while(q=b.exec(s)){n=q[1].replace(l,"").toLowerCase();x=q[2].replace(l,"");if(n&&x.length>0){if(n==="font-weight"&&x==="700"){x="bold"}else{if(n==="color"||n==="background-color"){x=x.toLowerCase()}}x=x.replace(k,c);x=x.replace(h,o);z[n]=r?i(x,true):x}b.lastIndex=q.index+q[0].length}p("border","");p("border","-width");p("border","-color");p("border","-style");p("padding","");p("margin","");A("border","border-width","border-style","border-color");if(z.border==="medium none"){delete z.border}}return z},serialize:function(p,r){var o="",n,q;function i(t){var x,u,s,v;x=f.styles[t];if(x){for(u=0,s=x.length;u0){o+=(o.length>0?" ":"")+t+": "+v+";"}}}}if(r&&f&&f.styles){i("*");i(r)}else{for(n in p){q=p[n];if(q!==e&&q.length>0){o+=(o.length>0?" ":"")+n+": "+q+";"}}}return o}}};(function(f){var a={},e=f.makeMap,g=f.each;function d(j,i){return j.split(i||",")}function h(m,l){var j,k={};function i(n){return n.replace(/[A-Z]+/g,function(o){return i(m[o])})}for(j in m){if(m.hasOwnProperty(j)){m[j]=i(m[j])}}i(l).replace(/#/g,"#text").replace(/(\w+)\[([^\]]+)\]\[([^\]]*)\]/g,function(q,o,n,p){n=d(n,"|");k[o]={attributes:e(n),attributesOrder:n,children:e(p,"|",{"#comment":{}})}});return k}function b(){var i=a.html5;if(!i){i=a.html5=h({A:"id|accesskey|class|dir|draggable|item|hidden|itemprop|role|spellcheck|style|subject|title|onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"#|a|abbr|area|audio|b|bdo|br|button|canvas|cite|code|command|datalist|del|dfn|em|embed|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|meta|meter|noscript|object|output|progress|q|ruby|samp|script|select|small|span|strong|sub|sup|svg|textarea|time|var|video|wbr",C:"#|a|abbr|area|address|article|aside|audio|b|bdo|blockquote|br|button|canvas|cite|code|command|datalist|del|details|dfn|dialog|div|dl|em|embed|fieldset|figure|footer|form|h1|h2|h3|h4|h5|h6|header|hgroup|hr|i|iframe|img|input|ins|kbd|keygen|label|link|map|mark|menu|meta|meter|nav|noscript|ol|object|output|p|pre|progress|q|ruby|samp|script|section|select|small|span|strong|style|sub|sup|svg|table|textarea|time|ul|var|video"},"html[A|manifest][body|head]head[A][base|command|link|meta|noscript|script|style|title]title[A][#]base[A|href|target][]link[A|href|rel|media|type|sizes][]meta[A|http-equiv|name|content|charset][]style[A|type|media|scoped][#]script[A|charset|type|src|defer|async][#]noscript[A][C]body[A][C]section[A][C]nav[A][C]article[A][C]aside[A][C]h1[A][B]h2[A][B]h3[A][B]h4[A][B]h5[A][B]h6[A][B]hgroup[A][h1|h2|h3|h4|h5|h6]header[A][C]footer[A][C]address[A][C]p[A][B]br[A][]pre[A][B]dialog[A][dd|dt]blockquote[A|cite][C]ol[A|start|reversed][li]ul[A][li]li[A|value][C]dl[A][dd|dt]dt[A][B]dd[A][C]a[A|href|target|ping|rel|media|type][B]em[A][B]strong[A][B]small[A][B]cite[A][B]q[A|cite][B]dfn[A][B]abbr[A][B]code[A][B]var[A][B]samp[A][B]kbd[A][B]sub[A][B]sup[A][B]i[A][B]b[A][B]mark[A][B]progress[A|value|max][B]meter[A|value|min|max|low|high|optimum][B]time[A|datetime][B]ruby[A][B|rt|rp]rt[A][B]rp[A][B]bdo[A][B]span[A][B]ins[A|cite|datetime][B]del[A|cite|datetime][B]figure[A][C|legend|figcaption]figcaption[A][C]img[A|alt|src|height|width|usemap|ismap][]iframe[A|name|src|height|width|sandbox|seamless][]embed[A|src|height|width|type][]object[A|data|type|height|width|usemap|name|form|classid][param]param[A|name|value][]details[A|open][C|legend]command[A|type|label|icon|disabled|checked|radiogroup][]menu[A|type|label][C|li]legend[A][C|B]div[A][C]source[A|src|type|media][]audio[A|src|autobuffer|autoplay|loop|controls][source]video[A|src|autobuffer|autoplay|loop|controls|width|height|poster][source]hr[A][]form[A|accept-charset|action|autocomplete|enctype|method|name|novalidate|target][C]fieldset[A|disabled|form|name][C|legend]label[A|form|for][B]input[A|type|accept|alt|autocomplete|autofocus|checked|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|height|list|max|maxlength|min|multiple|pattern|placeholder|readonly|required|size|src|step|width|files|value|name][]button[A|autofocus|disabled|form|formaction|formenctype|formmethod|formnovalidate|formtarget|name|value|type][B]select[A|autofocus|disabled|form|multiple|name|size][option|optgroup]datalist[A][B|option]optgroup[A|disabled|label][option]option[A|disabled|selected|label|value][]textarea[A|autofocus|disabled|form|maxlength|name|placeholder|readonly|required|rows|cols|wrap][]keygen[A|autofocus|challenge|disabled|form|keytype|name][]output[A|for|form|name][B]canvas[A|width|height][]map[A|name][B|C]area[A|shape|coords|href|alt|target|media|rel|ping|type][]mathml[A][]svg[A][]table[A|border][caption|colgroup|thead|tfoot|tbody|tr]caption[A][C]colgroup[A|span][col]col[A|span][]thead[A][tr]tfoot[A][tr]tbody[A][tr]tr[A][th|td]th[A|headers|rowspan|colspan|scope][B]td[A|headers|rowspan|colspan][C]wbr[A][]")}return i}function c(){var i=a.html4;if(!i){i=a.html4=h({Z:"H|K|N|O|P",Y:"X|form|R|Q",ZG:"E|span|width|align|char|charoff|valign",X:"p|T|div|U|W|isindex|fieldset|table",ZF:"E|align|char|charoff|valign",W:"pre|hr|blockquote|address|center|noframes",ZE:"abbr|axis|headers|scope|rowspan|colspan|align|char|charoff|valign|nowrap|bgcolor|width|height",ZD:"[E][S]",U:"ul|ol|dl|menu|dir",ZC:"p|Y|div|U|W|table|br|span|bdo|object|applet|img|map|K|N|Q",T:"h1|h2|h3|h4|h5|h6",ZB:"X|S|Q",S:"R|P",ZA:"a|G|J|M|O|P",R:"a|H|K|N|O",Q:"noscript|P",P:"ins|del|script",O:"input|select|textarea|label|button",N:"M|L",M:"em|strong|dfn|code|q|samp|kbd|var|cite|abbr|acronym",L:"sub|sup",K:"J|I",J:"tt|i|b|u|s|strike",I:"big|small|font|basefont",H:"G|F",G:"br|span|bdo",F:"object|applet|img|map|iframe",E:"A|B|C",D:"accesskey|tabindex|onfocus|onblur",C:"onclick|ondblclick|onmousedown|onmouseup|onmouseover|onmousemove|onmouseout|onkeypress|onkeydown|onkeyup",B:"lang|xml:lang|dir",A:"id|class|style|title"},"script[id|charset|type|language|src|defer|xml:space][]style[B|id|type|media|title|xml:space][]object[E|declare|classid|codebase|data|type|codetype|archive|standby|width|height|usemap|name|tabindex|align|border|hspace|vspace][#|param|Y]param[id|name|value|valuetype|type][]p[E|align][#|S]a[E|D|charset|type|name|href|hreflang|rel|rev|shape|coords|target][#|Z]br[A|clear][]span[E][#|S]bdo[A|C|B][#|S]applet[A|codebase|archive|code|object|alt|name|width|height|align|hspace|vspace][#|param|Y]h1[E|align][#|S]img[E|src|alt|name|longdesc|width|height|usemap|ismap|align|border|hspace|vspace][]map[B|C|A|name][X|form|Q|area]h2[E|align][#|S]iframe[A|longdesc|name|src|frameborder|marginwidth|marginheight|scrolling|align|width|height][#|Y]h3[E|align][#|S]tt[E][#|S]i[E][#|S]b[E][#|S]u[E][#|S]s[E][#|S]strike[E][#|S]big[E][#|S]small[E][#|S]font[A|B|size|color|face][#|S]basefont[id|size|color|face][]em[E][#|S]strong[E][#|S]dfn[E][#|S]code[E][#|S]q[E|cite][#|S]samp[E][#|S]kbd[E][#|S]var[E][#|S]cite[E][#|S]abbr[E][#|S]acronym[E][#|S]sub[E][#|S]sup[E][#|S]input[E|D|type|name|value|checked|disabled|readonly|size|maxlength|src|alt|usemap|onselect|onchange|accept|align][]select[E|name|size|multiple|disabled|tabindex|onfocus|onblur|onchange][optgroup|option]optgroup[E|disabled|label][option]option[E|selected|disabled|label|value][]textarea[E|D|name|rows|cols|disabled|readonly|onselect|onchange][]label[E|for|accesskey|onfocus|onblur][#|S]button[E|D|name|value|type|disabled][#|p|T|div|U|W|table|G|object|applet|img|map|K|N|Q]h4[E|align][#|S]ins[E|cite|datetime][#|Y]h5[E|align][#|S]del[E|cite|datetime][#|Y]h6[E|align][#|S]div[E|align][#|Y]ul[E|type|compact][li]li[E|type|value][#|Y]ol[E|type|compact|start][li]dl[E|compact][dt|dd]dt[E][#|S]dd[E][#|Y]menu[E|compact][li]dir[E|compact][li]pre[E|width|xml:space][#|ZA]hr[E|align|noshade|size|width][]blockquote[E|cite][#|Y]address[E][#|S|p]center[E][#|Y]noframes[E][#|Y]isindex[A|B|prompt][]fieldset[E][#|legend|Y]legend[E|accesskey|align][#|S]table[E|summary|width|border|frame|rules|cellspacing|cellpadding|align|bgcolor][caption|col|colgroup|thead|tfoot|tbody|tr]caption[E|align][#|S]col[ZG][]colgroup[ZG][col]thead[ZF][tr]tr[ZF|bgcolor][th|td]th[E|ZE][#|Y]form[E|action|method|name|enctype|onsubmit|onreset|accept|accept-charset|target][#|X|R|Q]noscript[E][#|Y]td[E|ZE][#|Y]tfoot[ZF][tr]tbody[ZF][tr]area[E|D|shape|coords|href|nohref|alt|target][]base[id|href|target][]body[E|onload|onunload|background|bgcolor|text|link|vlink|alink][#|Y]")}return i}f.html.Schema=function(A){var u=this,s={},k={},j=[],D,y;var o,q,z,r,v,n,p={};function m(F,E,H){var G=A[F];if(!G){G=a[F];if(!G){G=e(E," ",e(E.toUpperCase()," "));G=f.extend(G,H);a[F]=G}}else{G=e(G,",",e(G.toUpperCase()," "))}return G}A=A||{};y=A.schema=="html5"?b():c();if(A.verify_html===false){A.valid_elements="*[*]"}if(A.valid_styles){D={};g(A.valid_styles,function(F,E){D[E]=f.explode(F)})}o=m("whitespace_elements","pre script noscript style textarea");q=m("self_closing_elements","colgroup dd dt li option p td tfoot th thead tr");z=m("short_ended_elements","area base basefont br col frame hr img input isindex link meta param embed source wbr");r=m("boolean_attributes","checked compact declare defer disabled ismap multiple nohref noresize noshade nowrap readonly selected autoplay loop controls");n=m("non_empty_elements","td th iframe video audio object",z);textBlockElementsMap=m("text_block_elements","h1 h2 h3 h4 h5 h6 p div address pre form blockquote center dir fieldset header footer article section hgroup aside nav figure");v=m("block_elements","hr table tbody thead tfoot th tr td li ol ul caption dl dt dd noscript menu isindex samp option datalist select optgroup",textBlockElementsMap);function i(E){return new RegExp("^"+E.replace(/([?+*])/g,".$1")+"$")}function C(L){var K,G,Z,V,aa,F,I,U,X,Q,Y,ac,O,J,W,E,S,H,ab,ad,P,T,N=/^([#+\-])?([^\[\/]+)(?:\/([^\[]+))?(?:\[([^\]]+)\])?$/,R=/^([!\-])?(\w+::\w+|[^=:<]+)?(?:([=:<])(.*))?$/,M=/[*?+]/;if(L){L=d(L);if(s["@"]){S=s["@"].attributes;H=s["@"].attributesOrder}for(K=0,G=L.length;K=0){for(U=A.length-1;U>=V;U--){T=A[U];if(T.valid){n.end(T.name)}}A.length=V}}function p(U,T,Y,X,W){var Z,V;T=T.toLowerCase();Y=T in H?T:j(Y||X||W||"");if(v&&!z&&T.indexOf("data-")!==0){Z=P[T];if(!Z&&F){V=F.length;while(V--){Z=F[V];if(Z.pattern.test(T)){break}}if(V===-1){Z=null}}if(!Z){return}if(Z.validValues&&!(Y in Z.validValues)){return}}N.map[T]=Y;N.push({name:T,value:Y})}l=new RegExp("<(?:(?:!--([\\w\\W]*?)-->)|(?:!\\[CDATA\\[([\\w\\W]*?)\\]\\]>)|(?:!DOCTYPE([\\w\\W]*?)>)|(?:\\?([^\\s\\/<>]+) ?([\\w\\W]*?)[?/]>)|(?:\\/([^>]+)>)|(?:([A-Za-z0-9\\-\\:\\.]+)((?:\\s+[^\"'>]+(?:(?:\"[^\"]*\")|(?:'[^']*')|[^>]*))*|\\/|\\s+)>))","g");D=/([\w:\-]+)(?:\s*=\s*(?:(?:\"((?:[^\"])*)\")|(?:\'((?:[^\'])*)\')|([^>\s]+)))?/g;K={script:/<\/script[^>]*>/gi,style:/<\/style[^>]*>/gi,noscript:/<\/noscript[^>]*>/gi};M=e.getShortEndedElements();J=c.self_closing_elements||e.getSelfClosingElements();H=e.getBoolAttrs();v=c.validate;s=c.remove_internals;y=c.fix_self_closing;q=a.isIE;o=/^:/;while(g=l.exec(E)){if(G0&&A[A.length-1].name===I){u(I)}if(!v||(m=e.getElementRule(I))){k=true;if(v){P=m.attributes;F=m.attributePatterns}if(R=g[8]){z=R.indexOf("data-mce-type")!==-1;if(z&&s){k=false}N=[];N.map={};R.replace(D,p)}else{N=[];N.map={}}if(v&&!z){S=m.attributesRequired;L=m.attributesDefault;f=m.attributesForced;if(f){Q=f.length;while(Q--){t=f[Q];r=t.name;h=t.value;if(h==="{$uid}"){h="mce_"+x++}N.map[r]=h;N.push({name:r,value:h})}}if(L){Q=L.length;while(Q--){t=L[Q];r=t.name;if(!(r in N.map)){h=t.value;if(h==="{$uid}"){h="mce_"+x++}N.map[r]=h;N.push({name:r,value:h})}}}if(S){Q=S.length;while(Q--){if(S[Q] in N.map){break}}if(Q===-1){k=false}}if(N.map["data-mce-bogus"]){k=false}}if(k){n.start(I,N,O)}}else{k=false}if(B=K[I]){B.lastIndex=G=g.index+g[0].length;if(g=B.exec(E)){if(k){C=E.substr(G,g.index-G)}G=g.index+g[0].length}else{C=E.substr(G);G=E.length}if(k&&C.length>0){n.text(C,true)}if(k){n.end(I)}l.lastIndex=G;continue}if(!O){if(!R||R.indexOf("/")!=R.length-1){A.push({name:I,valid:k})}else{if(k){n.end(I)}}}}else{if(I=g[1]){n.comment(I)}else{if(I=g[2]){n.cdata(I)}else{if(I=g[3]){n.doctype(I)}else{if(I=g[4]){n.pi(I,g[5])}}}}}}G=g.index+g[0].length}if(G=0;Q--){I=A[Q];if(I.valid){n.end(I.name)}}}}})(tinymce);(function(d){var c=/^[ \t\r\n]*$/,e={"#text":3,"#comment":8,"#cdata":4,"#pi":7,"#doctype":10,"#document-fragment":11};function a(k,l,j){var i,h,f=j?"lastChild":"firstChild",g=j?"prev":"next";if(k[f]){return k[f]}if(k!==l){i=k[g];if(i){return i}for(h=k.parent;h&&h!==l;h=h.parent){i=h[g];if(i){return i}}}}function b(f,g){this.name=f;this.type=g;if(g===1){this.attributes=[];this.attributes.map={}}}d.extend(b.prototype,{replace:function(g){var f=this;if(g.parent){g.remove()}f.insert(g,f);f.remove();return f},attr:function(h,l){var f=this,g,j,k;if(typeof h!=="string"){for(j in h){f.attr(j,h[j])}return f}if(g=f.attributes){if(l!==k){if(l===null){if(h in g.map){delete g.map[h];j=g.length;while(j--){if(g[j].name===h){g=g.splice(j,1);return f}}}return f}if(h in g.map){j=g.length;while(j--){if(g[j].name===h){g[j].value=l;break}}}else{g.push({name:h,value:l})}g.map[h]=l;return f}else{return g.map[h]}}},clone:function(){var g=this,n=new b(g.name,g.type),h,f,m,j,k;if(m=g.attributes){k=[];k.map={};for(h=0,f=m.length;h1){x.reverse();A=o=f.filterNode(x[0].clone());for(u=0;u0){Q.value=l;Q=Q.prev}else{O=Q.prev;Q.remove();Q=O}}}function H(O){var P,l={};for(P in O){if(P!=="li"&&P!="p"){l[P]=O[P]}}return l}n=new b.html.SaxParser({validate:z,self_closing_elements:H(h.getSelfClosingElements()),cdata:function(l){B.append(K("#cdata",4)).value=l},text:function(P,l){var O;if(!L){P=P.replace(k," ");if(B.lastChild&&o[B.lastChild.name]){P=P.replace(E,"")}}if(P.length!==0){O=K("#text",3);O.raw=!!l;B.append(O).value=P}},comment:function(l){B.append(K("#comment",8)).value=l},pi:function(l,O){B.append(K(l,7)).value=O;I(B)},doctype:function(O){var l;l=B.append(K("#doctype",10));l.value=O;I(B)},start:function(l,W,P){var U,R,Q,O,S,X,V,T;Q=z?h.getElementRule(l):{};if(Q){U=K(Q.outputName||l,1);U.attributes=W;U.shortEnded=P;B.append(U);T=p[B.name];if(T&&p[U.name]&&!T[U.name]){M.push(U)}R=d.length;while(R--){S=d[R].name;if(S in W.map){F=c[S];if(F){F.push(U)}else{c[S]=[U]}}}if(o[l]){I(U)}if(!P){B=U}if(!L&&s[l]){L=true}}},end:function(l){var S,P,R,O,Q;P=z?h.getElementRule(l):{};if(P){if(o[l]){if(!L){S=B.firstChild;if(S&&S.type===3){R=S.value.replace(E,"");if(R.length>0){S.value=R;S=S.next}else{O=S.next;S.remove();S=O}while(S&&S.type===3){R=S.value;O=S.next;if(R.length===0||y.test(R)){S.remove();S=O}S=O}}S=B.lastChild;if(S&&S.type===3){R=S.value.replace(t,"");if(R.length>0){S.value=R;S=S.prev}else{O=S.prev;S.remove();S=O}while(S&&S.type===3){R=S.value;O=S.prev;if(R.length===0||y.test(R)){S.remove();S=O}S=O}}}}if(L&&s[l]){L=false}if(P.removeEmpty||P.paddEmpty){if(B.isEmpty(u)){if(P.paddEmpty){B.empty().append(new a("#text","3")).value="\u00a0"}else{if(!B.attributes.map.name&&!B.attributes.map.id){Q=B.parent;B.empty().remove();B=Q;return}}}}B=B.parent}}},h);J=B=new a(m.context||g.root_name,11);n.parse(v);if(z&&M.length){if(!m.context){j(M)}else{m.invalid=true}}if(q&&J.name=="body"){G()}if(!m.invalid){for(N in i){F=e[N];A=i[N];x=A.length;while(x--){if(!A[x].parent){A.splice(x,1)}}for(D=0,C=F.length;D0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}c.push("<",m);if(k){for(n=0,j=k.length;n"}else{c[c.length]=" />"}if(p&&a&&d[m]&&c.length>0){o=c[c.length-1];if(o.length>0&&o!=="\n"){c.push("\n")}}},end:function(h){var i;c.push("",h,">");if(a&&d[h]&&c.length>0){i=c[c.length-1];if(i.length>0&&i!=="\n"){c.push("\n")}}},text:function(i,h){if(i.length>0){c[c.length]=h?i:f(i)}},cdata:function(h){c.push("")},comment:function(h){c.push("")},pi:function(h,i){if(i){c.push("",h," ",i,"?>")}else{c.push("",h,"?>")}if(a){c.push("\n")}},doctype:function(h){c.push("",a?"\n":"")},reset:function(){c.length=0},getContent:function(){return c.join("").replace(/\n$/,"")}}};(function(a){a.html.Serializer=function(c,d){var b=this,e=new a.html.Writer(c);c=c||{};c.validate="validate" in c?c.validate:true;b.schema=d=d||new a.html.Schema();b.writer=e;b.serialize=function(h){var g,i;i=c.validate;g={3:function(k,j){e.text(k.value,k.raw)},8:function(j){e.comment(j.value)},7:function(j){e.pi(j.name,j.value)},10:function(j){e.doctype(j.value)},4:function(j){e.cdata(j.value)},11:function(j){if((j=j.firstChild)){do{f(j)}while(j=j.next)}}};e.reset();function f(k){var t=g[k.type],j,o,s,r,p,u,n,m,q;if(!t){j=k.name;o=k.shortEnded;s=k.attributes;if(i&&s&&s.length>1){u=[];u.map={};q=d.getElementRule(k.name);for(n=0,m=q.attributesOrder.length;n=8;k.boxModel=!e.isIE||o.compatMode=="CSS1Compat"||k.stdMode;k.hasOuterHTML="outerHTML" in o.createElement("a");k.settings=l=e.extend({keep_values:false,hex_colors:1},l);k.schema=l.schema;k.styles=new e.html.Styles({url_converter:l.url_converter,url_converter_scope:l.url_converter_scope},l.schema);if(e.isIE6){try{o.execCommand("BackgroundImageCache",false,true)}catch(m){k.cssFlicker=true}}k.fixDoc(o);k.events=l.ownEvents?new e.dom.EventUtils(l.proxy):e.dom.Event;e.addUnload(k.destroy,k);n=l.schema?l.schema.getBlockElements():{};k.isBlock=function(q){if(!q){return false}var p=q.nodeType;if(p){return !!(p===1&&n[q.nodeName])}return !!n[q]}},fixDoc:function(k){var j=this.settings,i;if(b&&j.schema){("abbr article aside audio canvas details figcaption figure footer header hgroup mark menu meter nav output progress section summary time video").replace(/\w+/g,function(l){k.createElement(l)});for(i in j.schema.getCustomElements()){k.createElement(i)}}},clone:function(k,i){var j=this,m,l;if(!b||k.nodeType!==1||i){return k.cloneNode(i)}l=j.doc;if(!i){m=l.createElement(k.nodeName);g(j.getAttribs(k),function(n){j.setAttrib(m,n.nodeName,j.getAttrib(k,n.nodeName))});return m}return m.firstChild},getRoot:function(){var i=this,j=i.settings;return(j&&i.get(j.root_element))||i.doc.body},getViewPort:function(j){var k,i;j=!j?this.win:j;k=j.document;i=this.boxModel?k.documentElement:k.body;return{x:j.pageXOffset||i.scrollLeft,y:j.pageYOffset||i.scrollTop,w:j.innerWidth||i.clientWidth,h:j.innerHeight||i.clientHeight}},getRect:function(l){var k,i=this,j;l=i.get(l);k=i.getPos(l);j=i.getSize(l);return{x:k.x,y:k.y,w:j.w,h:j.h}},getSize:function(l){var j=this,i,k;l=j.get(l);i=j.getStyle(l,"width");k=j.getStyle(l,"height");if(i.indexOf("px")===-1){i=0}if(k.indexOf("px")===-1){k=0}return{w:parseInt(i,10)||l.offsetWidth||l.clientWidth,h:parseInt(k,10)||l.offsetHeight||l.clientHeight}},getParent:function(k,j,i){return this.getParents(k,j,i,false)},getParents:function(s,m,k,q){var j=this,i,l=j.settings,p=[];s=j.get(s);q=q===undefined;if(l.strict_root){k=k||j.getRoot()}if(d(m,"string")){i=m;if(m==="*"){m=function(o){return o.nodeType==1}}else{m=function(o){return j.is(o,i)}}}while(s){if(s==k||!s.nodeType||s.nodeType===9){break}if(!m||m(s)){if(q){p.push(s)}else{return s}}s=s.parentNode}return q?p:null},get:function(i){var j;if(i&&this.doc&&typeof(i)=="string"){j=i;i=this.doc.getElementById(i);if(i&&i.id!==j){return this.doc.getElementsByName(j)[1]}}return i},getNext:function(j,i){return this._findSib(j,i,"nextSibling")},getPrev:function(j,i){return this._findSib(j,i,"previousSibling")},select:function(k,j){var i=this;return e.dom.Sizzle(k,i.get(j)||i.get(i.settings.root_element)||i.doc,[])},is:function(l,j){var k;if(l.length===undefined){if(j==="*"){return l.nodeType==1}if(c.test(j)){j=j.toLowerCase().split(/,/);l=l.nodeName.toLowerCase();for(k=j.length-1;k>=0;k--){if(j[k]==l){return true}}return false}}return e.dom.Sizzle.matches(j,l.nodeType?[l]:l).length>0},add:function(l,o,i,k,m){var j=this;return this.run(l,function(r){var q,n;q=d(o,"string")?j.doc.createElement(o):o;j.setAttribs(q,i);if(k){if(k.nodeType){q.appendChild(k)}else{j.setHTML(q,k)}}return !m?r.appendChild(q):q})},create:function(k,i,j){return this.add(this.doc.createElement(k),k,i,j,1)},createHTML:function(q,i,m){var p="",l=this,j;p+="<"+q;for(j in i){if(i.hasOwnProperty(j)){p+=" "+j+'="'+l.encode(i[j])+'"'}}if(typeof(m)!="undefined"){return p+">"+m+""+q+">"}return p+" />"},remove:function(i,j){return this.run(i,function(l){var m,k=l.parentNode;if(!k){return null}if(j){while(m=l.firstChild){if(!e.isIE||m.nodeType!==3||m.nodeValue){k.insertBefore(m,l)}else{l.removeChild(m)}}}return k.removeChild(l)})},setStyle:function(l,i,j){var k=this;return k.run(l,function(o){var n,m;n=o.style;i=i.replace(/-(\D)/g,function(q,p){return p.toUpperCase()});if(k.pixelStyles.test(i)&&(e.is(j,"number")||/^[\-0-9\.]+$/.test(j))){j+="px"}switch(i){case"opacity":if(b){n.filter=j===""?"":"alpha(opacity="+(j*100)+")";if(!l.currentStyle||!l.currentStyle.hasLayout){n.display="inline-block"}}n[i]=n["-moz-opacity"]=n["-khtml-opacity"]=j||"";break;case"float":b?n.styleFloat=j:n.cssFloat=j;break;default:n[i]=j||""}if(k.settings.update_styles){k.setAttrib(o,"data-mce-style")}})},getStyle:function(l,i,k){l=this.get(l);if(!l){return}if(this.doc.defaultView&&k){i=i.replace(/[A-Z]/g,function(m){return"-"+m});try{return this.doc.defaultView.getComputedStyle(l,null).getPropertyValue(i)}catch(j){return null}}i=i.replace(/-(\D)/g,function(n,m){return m.toUpperCase()});if(i=="float"){i=b?"styleFloat":"cssFloat"}if(l.currentStyle&&k){return l.currentStyle[i]}return l.style?l.style[i]:undefined},setStyles:function(l,m){var j=this,k=j.settings,i;i=k.update_styles;k.update_styles=0;g(m,function(o,p){j.setStyle(l,p,o)});k.update_styles=i;if(k.update_styles){j.setAttrib(l,k.cssText)}},removeAllAttribs:function(i){return this.run(i,function(l){var k,j=l.attributes;for(k=j.length-1;k>=0;k--){l.removeAttributeNode(j.item(k))}})},setAttrib:function(k,l,i){var j=this;if(!k||!l){return}if(j.settings.strict){l=l.toLowerCase()}return this.run(k,function(p){var o=j.settings;var m=p.getAttribute(l);if(i!==null){switch(l){case"style":if(!d(i,"string")){g(i,function(q,r){j.setStyle(p,r,q)});return}if(o.keep_values){if(i&&!j._isRes(i)){p.setAttribute("data-mce-style",i,2)}else{p.removeAttribute("data-mce-style",2)}}p.style.cssText=i;break;case"class":p.className=i||"";break;case"src":case"href":if(o.keep_values){if(o.url_converter){i=o.url_converter.call(o.url_converter_scope||j,i,l,p)}j.setAttrib(p,"data-mce-"+l,i,2)}break;case"shape":p.setAttribute("data-mce-style",i);break}}if(d(i)&&i!==null&&i.length!==0){p.setAttribute(l,""+i,2)}else{p.removeAttribute(l,2)}if(tinyMCE.activeEditor&&m!=i){var n=tinyMCE.activeEditor;n.onSetAttrib.dispatch(n,p,l,i)}})},setAttribs:function(j,k){var i=this;return this.run(j,function(l){g(k,function(m,o){i.setAttrib(l,o,m)})})},getAttrib:function(m,o,k){var i,j=this,l;m=j.get(m);if(!m||m.nodeType!==1){return k===l?false:k}if(!d(k)){k=""}if(/^(src|href|style|coords|shape)$/.test(o)){i=m.getAttribute("data-mce-"+o);if(i){return i}}if(b&&j.props[o]){i=m[j.props[o]];i=i&&i.nodeValue?i.nodeValue:i}if(!i){i=m.getAttribute(o,2)}if(/^(checked|compact|declare|defer|disabled|ismap|multiple|nohref|noshade|nowrap|readonly|selected)$/.test(o)){if(m[j.props[o]]===true&&i===""){return o}return i?o:""}if(m.nodeName==="FORM"&&m.getAttributeNode(o)){return m.getAttributeNode(o).nodeValue}if(o==="style"){i=i||m.style.cssText;if(i){i=j.serializeStyle(j.parseStyle(i),m.nodeName);if(j.settings.keep_values&&!j._isRes(i)){m.setAttribute("data-mce-style",i)}}}if(f&&o==="class"&&i){i=i.replace(/(apple|webkit)\-[a-z\-]+/gi,"")}if(b){switch(o){case"rowspan":case"colspan":if(i===1){i=""}break;case"size":if(i==="+0"||i===20||i===0){i=""}break;case"width":case"height":case"vspace":case"checked":case"disabled":case"readonly":if(i===0){i=""}break;case"hspace":if(i===-1){i=""}break;case"maxlength":case"tabindex":if(i===32768||i===2147483647||i==="32768"){i=""}break;case"multiple":case"compact":case"noshade":case"nowrap":if(i===65535){return o}return k;case"shape":i=i.toLowerCase();break;default:if(o.indexOf("on")===0&&i){i=e._replace(/^function\s+\w+\(\)\s+\{\s+(.*)\s+\}$/,"$1",""+i)}}}return(i!==l&&i!==null&&i!=="")?""+i:k},getPos:function(q,l){var j=this,i=0,p=0,m,o=j.doc,k;q=j.get(q);l=l||o.body;if(q){if(q.getBoundingClientRect){q=q.getBoundingClientRect();m=j.boxModel?o.documentElement:o.body;i=q.left+(o.documentElement.scrollLeft||o.body.scrollLeft)-m.clientTop;p=q.top+(o.documentElement.scrollTop||o.body.scrollTop)-m.clientLeft;return{x:i,y:p}}k=q;while(k&&k!=l&&k.nodeType){i+=k.offsetLeft||0;p+=k.offsetTop||0;k=k.offsetParent}k=q.parentNode;while(k&&k!=l&&k.nodeType){i-=k.scrollLeft||0;p-=k.scrollTop||0;k=k.parentNode}}return{x:i,y:p}},parseStyle:function(i){return this.styles.parse(i)},serializeStyle:function(j,i){return this.styles.serialize(j,i)},addStyle:function(j){var k=this.doc,i;styleElm=k.getElementById("mceDefaultStyles");if(!styleElm){styleElm=k.createElement("style"),styleElm.id="mceDefaultStyles";styleElm.type="text/css";i=k.getElementsByTagName("head")[0];if(i.firstChild){i.insertBefore(styleElm,i.firstChild)}else{i.appendChild(styleElm)}}if(styleElm.styleSheet){styleElm.styleSheet.cssText+=j}else{styleElm.appendChild(k.createTextNode(j))}},loadCSS:function(i){var k=this,l=k.doc,j;if(!i){i=""}j=l.getElementsByTagName("head")[0];g(i.split(","),function(m){var n;if(k.files[m]){return}k.files[m]=true;n=k.create("link",{rel:"stylesheet",href:e._addVer(m)});if(b&&l.documentMode&&l.recalc){n.onload=function(){if(l.recalc){l.recalc()}n.onload=null}}j.appendChild(n)})},addClass:function(i,j){return this.run(i,function(k){var l;if(!j){return 0}if(this.hasClass(k,j)){return k.className}l=this.removeClass(k,j);return k.className=(l!=""?(l+" "):"")+j})},removeClass:function(k,l){var i=this,j;return i.run(k,function(n){var m;if(i.hasClass(n,l)){if(!j){j=new RegExp("(^|\\s+)"+l+"(\\s+|$)","g")}m=n.className.replace(j," ");m=e.trim(m!=" "?m:"");n.className=m;if(!m){n.removeAttribute("class");n.removeAttribute("className")}return m}return n.className})},hasClass:function(j,i){j=this.get(j);if(!j||!i){return false}return(" "+j.className+" ").indexOf(" "+i+" ")!==-1},show:function(i){return this.setStyle(i,"display","block")},hide:function(i){return this.setStyle(i,"display","none")},isHidden:function(i){i=this.get(i);return !i||i.style.display=="none"||this.getStyle(i,"display")=="none"},uniqueId:function(i){return(!i?"mce_":i)+(this.counter++)},setHTML:function(k,j){var i=this;return i.run(k,function(m){if(b){while(m.firstChild){m.removeChild(m.firstChild)}try{m.innerHTML="
"+j;m.removeChild(m.firstChild)}catch(l){var n=i.create("div");n.innerHTML="
"+j;g(e.grep(n.childNodes),function(p,o){if(o&&m.canHaveHTML){m.appendChild(p)}})}}else{m.innerHTML=j}return j})},getOuterHTML:function(k){var j,i=this;k=i.get(k);if(!k){return null}if(k.nodeType===1&&i.hasOuterHTML){return k.outerHTML}j=(k.ownerDocument||i.doc).createElement("body");j.appendChild(k.cloneNode(true));return j.innerHTML},setOuterHTML:function(l,j,m){var i=this;function k(p,o,r){var s,q;q=r.createElement("body");q.innerHTML=o;s=q.lastChild;while(s){i.insertAfter(s.cloneNode(true),p);s=s.previousSibling}i.remove(p)}return this.run(l,function(o){o=i.get(o);if(o.nodeType==1){m=m||o.ownerDocument||i.doc;if(b){try{if(b&&o.nodeType==1){o.outerHTML=j}else{k(o,j,m)}}catch(n){k(o,j,m)}}else{k(o,j,m)}}})},decode:h.decode,encode:h.encodeAllRaw,insertAfter:function(i,j){j=this.get(j);return this.run(i,function(l){var k,m;k=j.parentNode;m=j.nextSibling;if(m){k.insertBefore(l,m)}else{k.appendChild(l)}return l})},replace:function(m,l,i){var j=this;if(d(l,"array")){m=m.cloneNode(true)}return j.run(l,function(k){if(i){g(e.grep(k.childNodes),function(n){m.appendChild(n)})}return k.parentNode.replaceChild(m,k)})},rename:function(l,i){var k=this,j;if(l.nodeName!=i.toUpperCase()){j=k.create(i);g(k.getAttribs(l),function(m){k.setAttrib(j,m.nodeName,k.getAttrib(l,m.nodeName))});k.replace(j,l,1)}return j||l},findCommonAncestor:function(k,i){var l=k,j;while(l){j=i;while(j&&l!=j){j=j.parentNode}if(l==j){break}l=l.parentNode}if(!l&&k.ownerDocument){return k.ownerDocument.documentElement}return l},toHex:function(i){var k=/^\s*rgb\s*?\(\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?,\s*?([0-9]+)\s*?\)\s*$/i.exec(i);function j(l){l=parseInt(l,10).toString(16);return l.length>1?l:"0"+l}if(k){i="#"+j(k[1])+j(k[2])+j(k[3]);return i}return i},getClasses:function(){var n=this,j=[],m,o={},p=n.settings.class_filter,l;if(n.classes){return n.classes}function q(i){g(i.imports,function(s){q(s)});g(i.cssRules||i.rules,function(s){switch(s.type||1){case 1:if(s.selectorText){g(s.selectorText.split(","),function(r){r=r.replace(/^\s*|\s*$|^\s\./g,"");if(/\.mce/.test(r)||!/\.[\w\-]+$/.test(r)){return}l=r;r=e._replace(/.*\.([a-z0-9_\-]+).*/i,"$1",r);if(p&&!(r=p(r,l))){return}if(!o[r]){j.push({"class":r});o[r]=1}})}break;case 3:q(s.styleSheet);break}})}try{g(n.doc.styleSheets,q)}catch(k){}if(j.length>0){n.classes=j}return j},run:function(l,k,j){var i=this,m;if(i.doc&&typeof(l)==="string"){l=i.get(l)}if(!l){return false}j=j||this;if(!l.nodeType&&(l.length||l.length===0)){m=[];g(l,function(o,n){if(o){if(typeof(o)=="string"){o=i.doc.getElementById(o)}m.push(k.call(j,o,n))}});return m}return k.call(j,l)},getAttribs:function(j){var i;j=this.get(j);if(!j){return[]}if(b){i=[];if(j.nodeName=="OBJECT"){return j.attributes}if(j.nodeName==="OPTION"&&this.getAttrib(j,"selected")){i.push({specified:1,nodeName:"selected"})}j.cloneNode(false).outerHTML.replace(/<\/?[\w:\-]+ ?|=[\"][^\"]+\"|=\'[^\']+\'|=[\w\-]+|>/gi,"").replace(/[\w:\-]+/gi,function(k){i.push({specified:1,nodeName:k})});return i}return j.attributes},isEmpty:function(m,k){var r=this,o,n,q,j,l,p=0;m=m.firstChild;if(m){j=new e.dom.TreeWalker(m,m.parentNode);k=k||r.schema?r.schema.getNonEmptyElements():null;do{q=m.nodeType;if(q===1){if(m.getAttribute("data-mce-bogus")){continue}l=m.nodeName.toLowerCase();if(k&&k[l]){if(l==="br"){p++;continue}return false}n=r.getAttribs(m);o=m.attributes.length;while(o--){l=m.attributes[o].nodeName;if(l==="name"||l==="data-mce-bookmark"){return false}}}if(q==8){return false}if((q===3&&!a.test(m.nodeValue))){return false}}while(m=j.next())}return p<=1},destroy:function(j){var i=this;i.win=i.doc=i.root=i.events=i.frag=null;if(!j){e.removeUnload(i.destroy)}},createRng:function(){var i=this.doc;return i.createRange?i.createRange():new e.dom.Range(this)},nodeIndex:function(m,n){var i=0,k,l,j;if(m){for(k=m.nodeType,m=m.previousSibling,l=m;m;m=m.previousSibling){j=m.nodeType;if(n&&j==3){if(j==k||!m.nodeValue.length){continue}}i++;k=j}}return i},split:function(m,l,p){var q=this,i=q.createRng(),n,k,o;function j(v){var t,s=v.childNodes,u=v.nodeType;function x(A){var z=A.previousSibling&&A.previousSibling.nodeName=="SPAN";var y=A.nextSibling&&A.nextSibling.nodeName=="SPAN";return z&&y}if(u==1&&v.getAttribute("data-mce-type")=="bookmark"){return}for(t=s.length-1;t>=0;t--){j(s[t])}if(u!=9){if(u==3&&v.nodeValue.length>0){var r=e.trim(v.nodeValue).length;if(!q.isBlock(v.parentNode)||r>0||r===0&&x(v)){return}}else{if(u==1){s=v.childNodes;if(s.length==1&&s[0]&&s[0].nodeType==1&&s[0].getAttribute("data-mce-type")=="bookmark"){v.parentNode.insertBefore(s[0],v)}if(s.length||/^(br|hr|input|img)$/i.test(v.nodeName)){return}}}q.remove(v)}return v}if(m&&l){i.setStart(m.parentNode,q.nodeIndex(m));i.setEnd(l.parentNode,q.nodeIndex(l));n=i.extractContents();i=q.createRng();i.setStart(l.parentNode,q.nodeIndex(l)+1);i.setEnd(m.parentNode,q.nodeIndex(m)+1);k=i.extractContents();o=m.parentNode;o.insertBefore(j(n),m);if(p){o.replaceChild(p,l)}else{o.insertBefore(l,m)}o.insertBefore(j(k),m);q.remove(m);return p||l}},bind:function(l,i,k,j){return this.events.add(l,i,k,j||this)},unbind:function(k,i,j){return this.events.remove(k,i,j)},fire:function(k,j,i){return this.events.fire(k,j,i)},getContentEditable:function(j){var i;if(j.nodeType!=1){return null}i=j.getAttribute("data-mce-contenteditable");if(i&&i!=="inherit"){return i}return j.contentEditable!=="inherit"?j.contentEditable:null},_findSib:function(l,i,j){var k=this,m=i;if(l){if(d(m,"string")){m=function(n){return k.is(n,i)}}for(l=l[j];l;l=l[j]){if(m(l)){return l}}}return null},_isRes:function(i){return/^(top|left|bottom|right|width|height)/i.test(i)||/;\s*(top|left|bottom|right|width|height)/i.test(i)}});e.DOM=new e.dom.DOMUtils(document,{process_html:0})})(tinymce);(function(a){function b(c){var O=this,e=c.doc,U=0,F=1,j=2,E=true,S=false,W="startOffset",h="startContainer",Q="endContainer",A="endOffset",k=tinymce.extend,n=c.nodeIndex;k(O,{startContainer:e,startOffset:0,endContainer:e,endOffset:0,collapsed:E,commonAncestorContainer:e,START_TO_START:0,START_TO_END:1,END_TO_END:2,END_TO_START:3,setStart:q,setEnd:s,setStartBefore:g,setStartAfter:J,setEndBefore:K,setEndAfter:u,collapse:B,selectNode:y,selectNodeContents:G,compareBoundaryPoints:v,deleteContents:p,extractContents:I,cloneContents:d,insertNode:D,surroundContents:N,cloneRange:L,toStringIE:T});function x(){return e.createDocumentFragment()}function q(X,t){C(E,X,t)}function s(X,t){C(S,X,t)}function g(t){q(t.parentNode,n(t))}function J(t){q(t.parentNode,n(t)+1)}function K(t){s(t.parentNode,n(t))}function u(t){s(t.parentNode,n(t)+1)}function B(t){if(t){O[Q]=O[h];O[A]=O[W]}else{O[h]=O[Q];O[W]=O[A]}O.collapsed=E}function y(t){g(t);u(t)}function G(t){q(t,0);s(t,t.nodeType===1?t.childNodes.length:t.nodeValue.length)}function v(aa,t){var ad=O[h],Y=O[W],ac=O[Q],X=O[A],ab=t.startContainer,af=t.startOffset,Z=t.endContainer,ae=t.endOffset;if(aa===0){return H(ad,Y,ab,af)}if(aa===1){return H(ac,X,ab,af)}if(aa===2){return H(ac,X,Z,ae)}if(aa===3){return H(ad,Y,Z,ae)}}function p(){l(j)}function I(){return l(U)}function d(){return l(F)}function D(aa){var X=this[h],t=this[W],Z,Y;if((X.nodeType===3||X.nodeType===4)&&X.nodeValue){if(!t){X.parentNode.insertBefore(aa,X)}else{if(t>=X.nodeValue.length){c.insertAfter(aa,X)}else{Z=X.splitText(t);X.parentNode.insertBefore(aa,Z)}}}else{if(X.childNodes.length>0){Y=X.childNodes[t]}if(Y){X.insertBefore(aa,Y)}else{X.appendChild(aa)}}}function N(X){var t=O.extractContents();O.insertNode(X);X.appendChild(t);O.selectNode(X)}function L(){return k(new b(c),{startContainer:O[h],startOffset:O[W],endContainer:O[Q],endOffset:O[A],collapsed:O.collapsed,commonAncestorContainer:O.commonAncestorContainer})}function P(t,X){var Y;if(t.nodeType==3){return t}if(X<0){return t}Y=t.firstChild;while(Y&&X>0){--X;Y=Y.nextSibling}if(Y){return Y}return t}function m(){return(O[h]==O[Q]&&O[W]==O[A])}function H(Z,ab,X,aa){var ac,Y,t,ad,af,ae;if(Z==X){if(ab==aa){return 0}if(ab0){O.collapse(X)}}else{O.collapse(X)}O.collapsed=m();O.commonAncestorContainer=c.findCommonAncestor(O[h],O[Q])}function l(ad){var ac,Z=0,af=0,X,ab,Y,aa,t,ae;if(O[h]==O[Q]){return f(ad)}for(ac=O[Q],X=ac.parentNode;X;ac=X,X=X.parentNode){if(X==O[h]){return r(ac,ad)}++Z}for(ac=O[h],X=ac.parentNode;X;ac=X,X=X.parentNode){if(X==O[Q]){return V(ac,ad)}++af}ab=af-Z;Y=O[h];while(ab>0){Y=Y.parentNode;ab--}aa=O[Q];while(ab<0){aa=aa.parentNode;ab++}for(t=Y.parentNode,ae=aa.parentNode;t!=ae;t=t.parentNode,ae=ae.parentNode){Y=t;aa=ae}return o(Y,aa,ad)}function f(ac){var ae,af,t,Y,Z,ad,aa,X,ab;if(ac!=j){ae=x()}if(O[W]==O[A]){return ae}if(O[h].nodeType==3){af=O[h].nodeValue;t=af.substring(O[W],O[A]);if(ac!=F){Y=O[h];X=O[W];ab=O[A]-O[W];if(X===0&&ab>=Y.nodeValue.length-1){Y.parentNode.removeChild(Y)}else{Y.deleteData(X,ab)}O.collapse(E)}if(ac==j){return}if(t.length>0){ae.appendChild(e.createTextNode(t))}return ae}Y=P(O[h],O[W]);Z=O[A]-O[W];while(Y&&Z>0){ad=Y.nextSibling;aa=z(Y,ac);if(ae){ae.appendChild(aa)}--Z;Y=ad}if(ac!=F){O.collapse(E)}return ae}function r(ad,aa){var ac,ab,X,t,Z,Y;if(aa!=j){ac=x()}ab=i(ad,aa);if(ac){ac.appendChild(ab)}X=n(ad);t=X-O[W];if(t<=0){if(aa!=F){O.setEndBefore(ad);O.collapse(S)}return ac}ab=ad.previousSibling;while(t>0){Z=ab.previousSibling;Y=z(ab,aa);if(ac){ac.insertBefore(Y,ac.firstChild)}--t;ab=Z}if(aa!=F){O.setEndBefore(ad);O.collapse(S)}return ac}function V(ab,aa){var ad,X,ac,t,Z,Y;if(aa!=j){ad=x()}ac=R(ab,aa);if(ad){ad.appendChild(ac)}X=n(ab);++X;t=O[A]-X;ac=ab.nextSibling;while(ac&&t>0){Z=ac.nextSibling;Y=z(ac,aa);if(ad){ad.appendChild(Y)}--t;ac=Z}if(aa!=F){O.setStartAfter(ab);O.collapse(E)}return ad}function o(ab,t,ae){var Y,ag,aa,ac,ad,X,af,Z;if(ae!=j){ag=x()}Y=R(ab,ae);if(ag){ag.appendChild(Y)}aa=ab.parentNode;ac=n(ab);ad=n(t);++ac;X=ad-ac;af=ab.nextSibling;while(X>0){Z=af.nextSibling;Y=z(af,ae);if(ag){ag.appendChild(Y)}af=Z;--X}Y=i(t,ae);if(ag){ag.appendChild(Y)}if(ae!=F){O.setStartAfter(ab);O.collapse(E)}return ag}function i(ac,ad){var Y=P(O[Q],O[A]-1),ae,ab,aa,t,X,Z=Y!=O[Q];if(Y==ac){return M(Y,Z,S,ad)}ae=Y.parentNode;ab=M(ae,S,S,ad);while(ae){while(Y){aa=Y.previousSibling;t=M(Y,Z,S,ad);if(ad!=j){ab.insertBefore(t,ab.firstChild)}Z=E;Y=aa}if(ae==ac){return ab}Y=ae.previousSibling;ae=ae.parentNode;X=M(ae,S,S,ad);if(ad!=j){X.appendChild(ab)}ab=X}}function R(ac,ad){var Z=P(O[h],O[W]),aa=Z!=O[h],ae,ab,Y,t,X;if(Z==ac){return M(Z,aa,E,ad)}ae=Z.parentNode;ab=M(ae,S,E,ad);while(ae){while(Z){Y=Z.nextSibling;t=M(Z,aa,E,ad);if(ad!=j){ab.appendChild(t)}aa=E;Z=Y}if(ae==ac){return ab}Z=ae.nextSibling;ae=ae.parentNode;X=M(ae,S,E,ad);if(ad!=j){X.appendChild(ab)}ab=X}}function M(t,aa,ad,ae){var Z,Y,ab,X,ac;if(aa){return z(t,ae)}if(t.nodeType==3){Z=t.nodeValue;if(ad){X=O[W];Y=Z.substring(X);ab=Z.substring(0,X)}else{X=O[A];Y=Z.substring(0,X);ab=Z.substring(X)}if(ae!=F){t.nodeValue=ab}if(ae==j){return}ac=c.clone(t,S);ac.nodeValue=Y;return ac}if(ae==j){return}return c.clone(t,S)}function z(X,t){if(t!=j){return t==F?c.clone(X,E):X}X.parentNode.removeChild(X)}function T(){return c.create("body",null,d()).outerText}return O}a.Range=b;b.prototype.toString=function(){return this.toStringIE()}})(tinymce.dom);(function(){function a(d){var b=this,h=d.dom,c=true,f=false;function e(i,j){var k,t=0,q,n,m,l,o,r,p=-1,s;k=i.duplicate();k.collapse(j);s=k.parentElement();if(s.ownerDocument!==d.dom.doc){return}while(s.contentEditable==="false"){s=s.parentNode}if(!s.hasChildNodes()){return{node:s,inside:1}}m=s.children;q=m.length-1;while(t<=q){r=Math.floor((t+q)/2);l=m[r];k.moveToElementText(l);p=k.compareEndPoints(j?"StartToStart":"EndToEnd",i);if(p>0){q=r-1}else{if(p<0){t=r+1}else{return{node:l}}}}if(p<0){if(!l){k.moveToElementText(s);k.collapse(true);l=s;n=true}else{k.collapse(false)}o=0;while(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)!==0){if(k.move("character",1)===0||s!=k.parentElement()){break}o++}}else{k.collapse(true);o=0;while(k.compareEndPoints(j?"StartToStart":"StartToEnd",i)!==0){if(k.move("character",-1)===0||s!=k.parentElement()){break}o++}}return{node:l,position:p,offset:o,inside:n}}function g(){var i=d.getRng(),r=h.createRng(),l,k,p,q,m,j;l=i.item?i.item(0):i.parentElement();if(l.ownerDocument!=h.doc){return r}k=d.isCollapsed();if(i.item){r.setStart(l.parentNode,h.nodeIndex(l));r.setEnd(r.startContainer,r.startOffset+1);return r}function o(A){var u=e(i,A),s,y,z=0,x,v,t;s=u.node;y=u.offset;if(u.inside&&!s.hasChildNodes()){r[A?"setStart":"setEnd"](s,0);return}if(y===v){r[A?"setStartBefore":"setEndAfter"](s);return}if(u.position<0){x=u.inside?s.firstChild:s.nextSibling;if(!x){r[A?"setStartAfter":"setEndAfter"](s);return}if(!y){if(x.nodeType==3){r[A?"setStart":"setEnd"](x,0)}else{r[A?"setStartBefore":"setEndBefore"](x)}return}while(x){t=x.nodeValue;z+=t.length;if(z>=y){s=x;z-=y;z=t.length-z;break}x=x.nextSibling}}else{x=s.previousSibling;if(!x){return r[A?"setStartBefore":"setEndBefore"](s)}if(!y){if(s.nodeType==3){r[A?"setStart":"setEnd"](x,s.nodeValue.length)}else{r[A?"setStartAfter":"setEndAfter"](x)}return}while(x){z+=x.nodeValue.length;if(z>=y){s=x;z-=y;break}x=x.previousSibling}}r[A?"setStart":"setEnd"](s,z)}try{o(true);if(!k){o()}}catch(n){if(n.number==-2147024809){m=b.getBookmark(2);p=i.duplicate();p.collapse(true);l=p.parentElement();if(!k){p=i.duplicate();p.collapse(false);q=p.parentElement();q.innerHTML=q.innerHTML}l.innerHTML=l.innerHTML;b.moveToBookmark(m);i=d.getRng();o(true);if(!k){o()}}else{throw n}}return r}this.getBookmark=function(m){var j=d.getRng(),o,i,l={};function n(u){var t,p,s,r,q=[];t=u.parentNode;p=h.getRoot().parentNode;while(t!=p&&t.nodeType!==9){s=t.children;r=s.length;while(r--){if(u===s[r]){q.push(r);break}}u=t;t=t.parentNode}return q}function k(q){var p;p=e(j,q);if(p){return{position:p.position,offset:p.offset,indexes:n(p.node),inside:p.inside}}}if(m===2){if(!j.item){l.start=k(true);if(!d.isCollapsed()){l.end=k()}}else{l.start={ctrl:true,indexes:n(j.item(0))}}}return l};this.moveToBookmark=function(k){var j,i=h.doc.body;function m(o){var r,q,n,p;r=h.getRoot();for(q=o.length-1;q>=0;q--){p=r.children;n=o[q];if(n<=p.length-1){r=p[n]}}return r}function l(r){var n=k[r?"start":"end"],q,p,o;if(n){q=n.position>0;p=i.createTextRange();p.moveToElementText(m(n.indexes));offset=n.offset;if(offset!==o){p.collapse(n.inside||q);p.moveStart("character",q?-offset:offset)}else{p.collapse(r)}j.setEndPoint(r?"StartToStart":"EndToStart",p);if(r){j.collapse(true)}}}if(k.start){if(k.start.ctrl){j=i.createControlRange();j.addElement(m(k.start.indexes));j.select()}else{j=i.createTextRange();l(true);l();j.select()}}};this.addRange=function(i){var n,l,k,p,v,q,t,s=d.dom.doc,m=s.body,r,u;function j(C){var y,B,x,A,z;x=h.create("a");y=C?k:v;B=C?p:q;A=n.duplicate();if(y==s||y==s.documentElement){y=m;B=0}if(y.nodeType==3){y.parentNode.insertBefore(x,y);A.moveToElementText(x);A.moveStart("character",B);h.remove(x);n.setEndPoint(C?"StartToStart":"EndToEnd",A)}else{z=y.childNodes;if(z.length){if(B>=z.length){h.insertAfter(x,z[z.length-1])}else{y.insertBefore(x,z[B])}A.moveToElementText(x)}else{if(y.canHaveHTML){y.innerHTML="\uFEFF";x=y.firstChild;A.moveToElementText(x);A.collapse(f)}}n.setEndPoint(C?"StartToStart":"EndToEnd",A);h.remove(x)}}k=i.startContainer;p=i.startOffset;v=i.endContainer;q=i.endOffset;n=m.createTextRange();if(k==v&&k.nodeType==1){if(p==q&&!k.hasChildNodes()){if(k.canHaveHTML){t=k.previousSibling;if(t&&!t.hasChildNodes()&&h.isBlock(t)){t.innerHTML="\uFEFF"}else{t=null}k.innerHTML="\uFEFF\uFEFF";n.moveToElementText(k.lastChild);n.select();h.doc.selection.clear();k.innerHTML="";if(t){t.innerHTML=""}return}else{p=h.nodeIndex(k);k=k.parentNode}}if(p==q-1){try{u=k.childNodes[p];l=m.createControlRange();l.addElement(u);l.select();r=d.getRng();if(r.item&&u===r.item(0)){return}}catch(o){}}}j(true);j();n.select()};this.getRangeAt=g}tinymce.dom.TridentSelection=a})();(function(){var n=/((?:\((?:\([^()]+\)|[^()]+)+\)|\[(?:\[[^\[\]]*\]|['"][^'"]*['"]|[^\[\]'"]+)+\]|\\.|[^ >+~,(\[\\]+)+|[>+~])(\s*,\s*)?((?:.|\r|\n)*)/g,i="sizcache",o=0,r=Object.prototype.toString,h=false,g=true,q=/\\/g,u=/\r\n/g,x=/\W/;[0,0].sort(function(){g=false;return 0});var d=function(C,e,F,G){F=F||[];e=e||document;var I=e;if(e.nodeType!==1&&e.nodeType!==9){return[]}if(!C||typeof C!=="string"){return F}var z,K,N,y,J,M,L,E,B=true,A=d.isXML(e),D=[],H=C;do{n.exec("");z=n.exec(H);if(z){H=z[3];D.push(z[1]);if(z[2]){y=z[3];break}}}while(z);if(D.length>1&&j.exec(C)){if(D.length===2&&k.relative[D[0]]){K=s(D[0]+D[1],e,G)}else{K=k.relative[D[0]]?[e]:d(D.shift(),e);while(D.length){C=D.shift();if(k.relative[C]){C+=D.shift()}K=s(C,K,G)}}}else{if(!G&&D.length>1&&e.nodeType===9&&!A&&k.match.ID.test(D[0])&&!k.match.ID.test(D[D.length-1])){J=d.find(D.shift(),e,A);e=J.expr?d.filter(J.expr,J.set)[0]:J.set[0]}if(e){J=G?{expr:D.pop(),set:l(G)}:d.find(D.pop(),D.length===1&&(D[0]==="~"||D[0]==="+")&&e.parentNode?e.parentNode:e,A);K=J.expr?d.filter(J.expr,J.set):J.set;if(D.length>0){N=l(K)}else{B=false}while(D.length){M=D.pop();L=M;if(!k.relative[M]){M=""}else{L=D.pop()}if(L==null){L=e}k.relative[M](N,L,A)}}else{N=D=[]}}if(!N){N=K}if(!N){d.error(M||C)}if(r.call(N)==="[object Array]"){if(!B){F.push.apply(F,N)}else{if(e&&e.nodeType===1){for(E=0;N[E]!=null;E++){if(N[E]&&(N[E]===true||N[E].nodeType===1&&d.contains(e,N[E]))){F.push(K[E])}}}else{for(E=0;N[E]!=null;E++){if(N[E]&&N[E].nodeType===1){F.push(K[E])}}}}}else{l(N,F)}if(y){d(y,I,F,G);d.uniqueSort(F)}return F};d.uniqueSort=function(y){if(p){h=g;y.sort(p);if(h){for(var e=1;e0};d.find=function(E,e,F){var D,z,B,A,C,y;if(!E){return[]}for(z=0,B=k.order.length;z":function(D,y){var C,B=typeof y==="string",z=0,e=D.length;if(B&&!x.test(y)){y=y.toLowerCase();for(;z=0)){if(!z){e.push(C)}}else{if(z){y[B]=false}}}}return false},ID:function(e){return e[1].replace(q,"")},TAG:function(y,e){return y[1].replace(q,"").toLowerCase()},CHILD:function(e){if(e[1]==="nth"){if(!e[2]){d.error(e[0])}e[2]=e[2].replace(/^\+|\s*/g,"");var y=/(-?)(\d*)(?:n([+\-]?\d*))?/.exec(e[2]==="even"&&"2n"||e[2]==="odd"&&"2n+1"||!/\D/.test(e[2])&&"0n+"+e[2]||e[2]);e[2]=(y[1]+(y[2]||1))-0;e[3]=y[3]-0}else{if(e[2]){d.error(e[0])}}e[0]=o++;return e},ATTR:function(B,y,z,e,C,D){var A=B[1]=B[1].replace(q,"");if(!D&&k.attrMap[A]){B[1]=k.attrMap[A]}B[4]=(B[4]||B[5]||"").replace(q,"");if(B[2]==="~="){B[4]=" "+B[4]+" "}return B},PSEUDO:function(B,y,z,e,C){if(B[1]==="not"){if((n.exec(B[3])||"").length>1||/^\w/.test(B[3])){B[3]=d(B[3],null,null,y)}else{var A=d.filter(B[3],y,z,true^C);if(!z){e.push.apply(e,A)}return false}}else{if(k.match.POS.test(B[0])||k.match.CHILD.test(B[0])){return true}}return B},POS:function(e){e.unshift(true);return e}},filters:{enabled:function(e){return e.disabled===false&&e.type!=="hidden"},disabled:function(e){return e.disabled===true},checked:function(e){return e.checked===true},selected:function(e){if(e.parentNode){e.parentNode.selectedIndex}return e.selected===true},parent:function(e){return !!e.firstChild},empty:function(e){return !e.firstChild},has:function(z,y,e){return !!d(e[3],z).length},header:function(e){return(/h\d/i).test(e.nodeName)},text:function(z){var e=z.getAttribute("type"),y=z.type;return z.nodeName.toLowerCase()==="input"&&"text"===y&&(e===y||e===null)},radio:function(e){return e.nodeName.toLowerCase()==="input"&&"radio"===e.type},checkbox:function(e){return e.nodeName.toLowerCase()==="input"&&"checkbox"===e.type},file:function(e){return e.nodeName.toLowerCase()==="input"&&"file"===e.type},password:function(e){return e.nodeName.toLowerCase()==="input"&&"password"===e.type},submit:function(y){var e=y.nodeName.toLowerCase();return(e==="input"||e==="button")&&"submit"===y.type},image:function(e){return e.nodeName.toLowerCase()==="input"&&"image"===e.type},reset:function(y){var e=y.nodeName.toLowerCase();return(e==="input"||e==="button")&&"reset"===y.type},button:function(y){var e=y.nodeName.toLowerCase();return e==="input"&&"button"===y.type||e==="button"},input:function(e){return(/input|select|textarea|button/i).test(e.nodeName)},focus:function(e){return e===e.ownerDocument.activeElement}},setFilters:{first:function(y,e){return e===0},last:function(z,y,e,A){return y===A.length-1},even:function(y,e){return e%2===0},odd:function(y,e){return e%2===1},lt:function(z,y,e){return ye[3]-0},nth:function(z,y,e){return e[3]-0===y},eq:function(z,y,e){return e[3]-0===y}},filter:{PSEUDO:function(z,E,D,F){var e=E[1],y=k.filters[e];if(y){return y(z,D,E,F)}else{if(e==="contains"){return(z.textContent||z.innerText||b([z])||"").indexOf(E[3])>=0}else{if(e==="not"){var A=E[3];for(var C=0,B=A.length;C=0)}}},ID:function(y,e){return y.nodeType===1&&y.getAttribute("id")===e},TAG:function(y,e){return(e==="*"&&y.nodeType===1)||!!y.nodeName&&y.nodeName.toLowerCase()===e},CLASS:function(y,e){return(" "+(y.className||y.getAttribute("class"))+" ").indexOf(e)>-1},ATTR:function(C,A){var z=A[1],e=d.attr?d.attr(C,z):k.attrHandle[z]?k.attrHandle[z](C):C[z]!=null?C[z]:C.getAttribute(z),D=e+"",B=A[2],y=A[4];return e==null?B==="!=":!B&&d.attr?e!=null:B==="="?D===y:B==="*="?D.indexOf(y)>=0:B==="~="?(" "+D+" ").indexOf(y)>=0:!y?D&&e!==false:B==="!="?D!==y:B==="^="?D.indexOf(y)===0:B==="$="?D.substr(D.length-y.length)===y:B==="|="?D===y||D.substr(0,y.length+1)===y+"-":false},POS:function(B,y,z,C){var e=y[2],A=k.setFilters[e];if(A){return A(B,z,y,C)}}}};var j=k.match.POS,c=function(y,e){return"\\"+(e-0+1)};for(var f in k.match){k.match[f]=new RegExp(k.match[f].source+(/(?![^\[]*\])(?![^\(]*\))/.source));k.leftMatch[f]=new RegExp(/(^(?:.|\r|\n)*?)/.source+k.match[f].source.replace(/\\(\d+)/g,c))}k.match.globalPOS=j;var l=function(y,e){y=Array.prototype.slice.call(y,0);if(e){e.push.apply(e,y);return e}return y};try{Array.prototype.slice.call(document.documentElement.childNodes,0)[0].nodeType}catch(v){l=function(B,A){var z=0,y=A||[];if(r.call(B)==="[object Array]"){Array.prototype.push.apply(y,B)}else{if(typeof B.length==="number"){for(var e=B.length;z";e.insertBefore(y,e.firstChild);if(document.getElementById(z)){k.find.ID=function(B,C,D){if(typeof C.getElementById!=="undefined"&&!D){var A=C.getElementById(B[1]);return A?A.id===B[1]||typeof A.getAttributeNode!=="undefined"&&A.getAttributeNode("id").nodeValue===B[1]?[A]:undefined:[]}};k.filter.ID=function(C,A){var B=typeof C.getAttributeNode!=="undefined"&&C.getAttributeNode("id");return C.nodeType===1&&B&&B.nodeValue===A}}e.removeChild(y);e=y=null})();(function(){var e=document.createElement("div");e.appendChild(document.createComment(""));if(e.getElementsByTagName("*").length>0){k.find.TAG=function(y,C){var B=C.getElementsByTagName(y[1]);if(y[1]==="*"){var A=[];for(var z=0;B[z];z++){if(B[z].nodeType===1){A.push(B[z])}}B=A}return B}}e.innerHTML="";if(e.firstChild&&typeof e.firstChild.getAttribute!=="undefined"&&e.firstChild.getAttribute("href")!=="#"){k.attrHandle.href=function(y){return y.getAttribute("href",2)}}e=null})();if(document.querySelectorAll){(function(){var e=d,A=document.createElement("div"),z="__sizzle__";A.innerHTML="";if(A.querySelectorAll&&A.querySelectorAll(".TEST").length===0){return}d=function(L,C,G,K){C=C||document;if(!K&&!d.isXML(C)){var J=/^(\w+$)|^\.([\w\-]+$)|^#([\w\-]+$)/.exec(L);if(J&&(C.nodeType===1||C.nodeType===9)){if(J[1]){return l(C.getElementsByTagName(L),G)}else{if(J[2]&&k.find.CLASS&&C.getElementsByClassName){return l(C.getElementsByClassName(J[2]),G)}}}if(C.nodeType===9){if(L==="body"&&C.body){return l([C.body],G)}else{if(J&&J[3]){var F=C.getElementById(J[3]);if(F&&F.parentNode){if(F.id===J[3]){return l([F],G)}}else{return l([],G)}}}try{return l(C.querySelectorAll(L),G)}catch(H){}}else{if(C.nodeType===1&&C.nodeName.toLowerCase()!=="object"){var D=C,E=C.getAttribute("id"),B=E||z,N=C.parentNode,M=/^\s*[+~]/.test(L);if(!E){C.setAttribute("id",B)}else{B=B.replace(/'/g,"\\$&")}if(M&&N){C=C.parentNode}try{if(!M||N){return l(C.querySelectorAll("[id='"+B+"'] "+L),G)}}catch(I){}finally{if(!E){D.removeAttribute("id")}}}}}return e(L,C,G,K)};for(var y in e){d[y]=e[y]}A=null})()}(function(){var e=document.documentElement,z=e.matchesSelector||e.mozMatchesSelector||e.webkitMatchesSelector||e.msMatchesSelector;if(z){var B=!z.call(document.createElement("div"),"div"),y=false;try{z.call(document.documentElement,"[test!='']:sizzle")}catch(A){y=true}d.matchesSelector=function(D,F){F=F.replace(/\=\s*([^'"\]]*)\s*\]/g,"='$1']");if(!d.isXML(D)){try{if(y||!k.match.PSEUDO.test(F)&&!/!=/.test(F)){var C=z.call(D,F);if(C||!B||D.document&&D.document.nodeType!==11){return C}}}catch(E){}}return d(F,null,null,[D]).length>0}}})();(function(){var e=document.createElement("div");e.innerHTML="";if(!e.getElementsByClassName||e.getElementsByClassName("e").length===0){return}e.lastChild.className="e";if(e.getElementsByClassName("e").length===1){return}k.order.splice(1,0,"CLASS");k.find.CLASS=function(y,z,A){if(typeof z.getElementsByClassName!=="undefined"&&!A){return z.getElementsByClassName(y[1])}};e=null})();function a(y,D,C,G,E,F){for(var A=0,z=G.length;A0){B=e;break}}}e=e[y]}G[A]=B}}}if(document.documentElement.contains){d.contains=function(y,e){return y!==e&&(y.contains?y.contains(e):true)}}else{if(document.documentElement.compareDocumentPosition){d.contains=function(y,e){return !!(y.compareDocumentPosition(e)&16)}}else{d.contains=function(){return false}}}d.isXML=function(e){var y=(e?e.ownerDocument||e:0).documentElement;return y?y.nodeName!=="HTML":false};var s=function(z,e,D){var C,E=[],B="",F=e.nodeType?[e]:e;while((C=k.match.PSEUDO.exec(z))){B+=C[0];z=z.replace(k.match.PSEUDO,"")}z=k.relative[z]?z+"*":z;for(var A=0,y=F.length;A"+(i.item?i.item(0).outerHTML:i.htmlText);m.removeChild(m.firstChild)}else{m.innerHTML=i.toString()}}if(/^\s/.test(m.innerHTML)){j=" "}if(/\s+$/.test(m.innerHTML)){l=" "}h.getInner=true;h.content=g.isCollapsed()?"":j+g.serializer.serialize(m,h)+l;g.onGetContent.dispatch(g,h);return h.content},setContent:function(h,j){var o=this,g=o.getRng(),k,l=o.win.document,n,m;j=j||{format:"html"};j.set=true;h=j.content=h;if(!j.no_events){o.onBeforeSetContent.dispatch(o,j)}h=j.content;if(g.insertNode){h+='_';if(g.startContainer==l&&g.endContainer==l){l.body.innerHTML=h}else{g.deleteContents();if(l.body.childNodes.length===0){l.body.innerHTML=h}else{if(g.createContextualFragment){g.insertNode(g.createContextualFragment(h))}else{n=l.createDocumentFragment();m=l.createElement("div");n.appendChild(m);m.outerHTML=h;g.insertNode(n)}}}k=o.dom.get("__caret");g=l.createRange();g.setStartBefore(k);g.setEndBefore(k);o.setRng(g);o.dom.remove("__caret");try{o.setRng(g)}catch(i){}}else{if(g.item){l.execCommand("Delete",false,null);g=o.getRng()}if(/^\s+/.test(h)){g.pasteHTML('_'+h);o.dom.remove("__mce_tmp")}else{g.pasteHTML(h)}}if(!j.no_events){o.onSetContent.dispatch(o,j)}},getStart:function(){var i=this,h=i.getRng(),j,g,l,k;if(h.duplicate||h.item){if(h.item){return h.item(0)}l=h.duplicate();l.collapse(1);j=l.parentElement();if(j.ownerDocument!==i.dom.doc){j=i.dom.getRoot()}g=k=h.parentElement();while(k=k.parentNode){if(k==j){j=g;break}}return j}else{j=h.startContainer;if(j.nodeType==1&&j.hasChildNodes()){j=j.childNodes[Math.min(j.childNodes.length-1,h.startOffset)]}if(j&&j.nodeType==3){return j.parentNode}return j}},getEnd:function(){var h=this,g=h.getRng(),j,i;if(g.duplicate||g.item){if(g.item){return g.item(0)}g=g.duplicate();g.collapse(0);j=g.parentElement();if(j.ownerDocument!==h.dom.doc){j=h.dom.getRoot()}if(j&&j.nodeName=="BODY"){return j.lastChild||j}return j}else{j=g.endContainer;i=g.endOffset;if(j.nodeType==1&&j.hasChildNodes()){j=j.childNodes[i>0?i-1:i]}if(j&&j.nodeType==3){return j.parentNode}return j}},getBookmark:function(s,v){var y=this,n=y.dom,h,k,j,o,i,p,q,m="\uFEFF",x;function g(z,A){var t=0;e(n.select(z),function(C,B){if(C==A){t=B}});return t}function u(t){function z(E){var A,D,C,B=E?"start":"end";A=t[B+"Container"];D=t[B+"Offset"];if(A.nodeType==1&&A.nodeName=="TR"){C=A.childNodes;A=C[Math.min(E?D:D-1,C.length-1)];if(A){D=E?0:A.childNodes.length;t["set"+(E?"Start":"End")](A,D)}}}z(true);z();return t}function l(){var z=y.getRng(true),t=n.getRoot(),A={};function B(E,J){var D=E[J?"startContainer":"endContainer"],I=E[J?"startOffset":"endOffset"],C=[],F,H,G=0;if(D.nodeType==3){if(v){for(F=D.previousSibling;F&&F.nodeType==3;F=F.previousSibling){I+=F.nodeValue.length}}C.push(I)}else{H=D.childNodes;if(I>=H.length&&H.length){G=1;I=Math.max(0,H.length-1)}C.push(y.dom.nodeIndex(H[I],v)+G)}for(;D&&D!=t;D=D.parentNode){C.push(y.dom.nodeIndex(D,v))}return C}A.start=B(z,true);if(!y.isCollapsed()){A.end=B(z)}return A}if(s==2){if(y.tridentSel){return y.tridentSel.getBookmark(s)}return l()}if(s){return{rng:y.getRng()}}h=y.getRng();j=n.uniqueId();o=tinyMCE.activeEditor.selection.isCollapsed();x="overflow:hidden;line-height:0px";if(h.duplicate||h.item){if(!h.item){k=h.duplicate();try{h.collapse();h.pasteHTML(''+m+"");if(!o){k.collapse(false);h.moveToElementText(k.parentElement());if(h.compareEndPoints("StartToEnd",k)===0){k.move("character",-1)}k.pasteHTML(''+m+"")}}catch(r){return null}}else{p=h.item(0);i=p.nodeName;return{name:i,index:g(i,p)}}}else{p=y.getNode();i=p.nodeName;if(i=="IMG"){return{name:i,index:g(i,p)}}k=u(h.cloneRange());if(!o){k.collapse(false);k.insertNode(n.create("span",{"data-mce-type":"bookmark",id:j+"_end",style:x},m))}h=u(h);h.collapse(true);h.insertNode(n.create("span",{"data-mce-type":"bookmark",id:j+"_start",style:x},m))}y.moveToBookmark({id:j,keep:1});return{id:j}},moveToBookmark:function(o){var s=this,m=s.dom,j,i,g,r,k,u,p,q;function h(A){var t=o[A?"start":"end"],x,y,z,v;if(t){z=t[0];for(y=r,x=t.length-1;x>=1;x--){v=y.childNodes;if(t[x]>v.length-1){return}y=v[t[x]]}if(y.nodeType===3){z=Math.min(t[0],y.nodeValue.length)}if(y.nodeType===1){z=Math.min(t[0],y.childNodes.length)}if(A){g.setStart(y,z)}else{g.setEnd(y,z)}}return true}function l(B){var v=m.get(o.id+"_"+B),A,t,y,z,x=o.keep;if(v){A=v.parentNode;if(B=="start"){if(!x){t=m.nodeIndex(v)}else{A=v.firstChild;t=1}k=u=A;p=q=t}else{if(!x){t=m.nodeIndex(v)}else{A=v.firstChild;t=1}u=A;q=t}if(!x){z=v.previousSibling;y=v.nextSibling;e(d.grep(v.childNodes),function(C){if(C.nodeType==3){C.nodeValue=C.nodeValue.replace(/\uFEFF/g,"")}});while(v=m.get(o.id+"_"+B)){m.remove(v,1)}if(z&&y&&z.nodeType==y.nodeType&&z.nodeType==3&&!d.isOpera){t=z.nodeValue.length;z.appendData(y.nodeValue);m.remove(y);if(B=="start"){k=u=z;p=q=t}else{u=z;q=t}}}}}function n(t){if(m.isBlock(t)&&!t.innerHTML&&!b){t.innerHTML='
'}return t}if(o){if(o.start){g=m.createRng();r=m.getRoot();if(s.tridentSel){return s.tridentSel.moveToBookmark(o)}if(h(true)&&h()){s.setRng(g)}}else{if(o.id){l("start");l("end");if(k){g=m.createRng();g.setStart(n(k),p);g.setEnd(n(u),q);s.setRng(g)}}else{if(o.name){s.select(m.select(o.name)[o.index])}else{if(o.rng){s.setRng(o.rng)}}}}}},select:function(l,k){var j=this,m=j.dom,h=m.createRng(),g;function i(n,p){var o=new a(n,n);do{if(n.nodeType==3&&d.trim(n.nodeValue).length!==0){if(p){h.setStart(n,0)}else{h.setEnd(n,n.nodeValue.length)}return}if(n.nodeName=="BR"){if(p){h.setStartBefore(n)}else{h.setEndBefore(n)}return}}while(n=(p?o.next():o.prev()))}if(l){g=m.nodeIndex(l);h.setStart(l.parentNode,g);h.setEnd(l.parentNode,g+1);if(k){i(l,1);i(l)}j.setRng(h)}return l},isCollapsed:function(){var g=this,i=g.getRng(),h=g.getSel();if(!i||i.item){return false}if(i.compareEndPoints){return i.compareEndPoints("StartToEnd",i)===0}return !h||i.collapsed},collapse:function(g){var i=this,h=i.getRng(),j;if(h.item){j=h.item(0);h=i.win.document.body.createTextRange();h.moveToElementText(j)}h.collapse(!!g);i.setRng(h)},getSel:function(){var h=this,g=this.win;return g.getSelection?g.getSelection():g.document.selection},getRng:function(m){var h=this,j,g,l,k=h.win.document;if(m&&h.tridentSel){return h.tridentSel.getRangeAt(0)}try{if(j=h.getSel()){g=j.rangeCount>0?j.getRangeAt(0):(j.createRange?j.createRange():k.createRange())}}catch(i){}if(d.isIE&&g&&g.setStart&&k.selection.createRange().item){l=k.selection.createRange().item(0);g=k.createRange();g.setStartBefore(l);g.setEndAfter(l)}if(!g){g=k.createRange?k.createRange():k.body.createTextRange()}if(g.setStart&&g.startContainer.nodeType===9&&g.collapsed){l=h.dom.getRoot();g.setStart(l,0);g.setEnd(l,0)}if(h.selectedRange&&h.explicitRange){if(g.compareBoundaryPoints(g.START_TO_START,h.selectedRange)===0&&g.compareBoundaryPoints(g.END_TO_END,h.selectedRange)===0){g=h.explicitRange}else{h.selectedRange=null;h.explicitRange=null}}return g},setRng:function(k,g){var j,i=this;if(!i.tridentSel){j=i.getSel();if(j){i.explicitRange=k;try{j.removeAllRanges()}catch(h){}j.addRange(k);if(g===false&&j.extend){j.collapse(k.endContainer,k.endOffset);j.extend(k.startContainer,k.startOffset)}i.selectedRange=j.rangeCount>0?j.getRangeAt(0):null}}else{if(k.cloneRange){try{i.tridentSel.addRange(k);return}catch(h){}}try{k.select()}catch(h){}}},setNode:function(h){var g=this;g.setContent(g.dom.getOuterHTML(h));return h},getNode:function(){var i=this,h=i.getRng(),j=i.getSel(),m,l=h.startContainer,g=h.endContainer;function k(q,o){var p=q;while(q&&q.nodeType===3&&q.length===0){q=o?q.nextSibling:q.previousSibling}return q||p}if(!h){return i.dom.getRoot()}if(h.setStart){m=h.commonAncestorContainer;if(!h.collapsed){if(h.startContainer==h.endContainer){if(h.endOffset-h.startOffset<2){if(h.startContainer.hasChildNodes()){m=h.startContainer.childNodes[h.startOffset]}}}if(l.nodeType===3&&g.nodeType===3){if(l.length===h.startOffset){l=k(l.nextSibling,true)}else{l=l.parentNode}if(h.endOffset===0){g=k(g.previousSibling,false)}else{g=g.parentNode}if(l&&l===g){return l}}}if(m&&m.nodeType==3){return m.parentNode}return m}return h.item?h.item(0):h.parentElement()},getSelectedBlocks:function(p,h){var o=this,k=o.dom,m,l,i,j=[];m=k.getParent(p||o.getStart(),k.isBlock);l=k.getParent(h||o.getEnd(),k.isBlock);if(m){j.push(m)}if(m&&l&&m!=l){i=m;var g=new a(m,k.getRoot());while((i=g.next())&&i!=l){if(k.isBlock(i)){j.push(i)}}}if(l&&m!=l){j.push(l)}return j},isForward:function(){var i=this.dom,g=this.getSel(),j,h;if(!g||g.anchorNode==null||g.focusNode==null){return true}j=i.createRng();j.setStart(g.anchorNode,g.anchorOffset);j.collapse(true);h=i.createRng();h.setStart(g.focusNode,g.focusOffset);h.collapse(true);return j.compareBoundaryPoints(j.START_TO_START,h)<=0},normalize:function(){var h=this,g,m,l,j,i;function k(p){var o,r,n,s=h.dom,u=s.getRoot(),q,t,v;function y(z,A){var B=new a(z,s.getParent(z.parentNode,s.isBlock)||u);while(z=B[A?"prev":"next"]()){if(z.nodeName==="BR"){return true}}}function x(B,z){var C,A;z=z||o;C=new a(z,s.getParent(z.parentNode,s.isBlock)||u);while(q=C[B?"prev":"next"]()){if(q.nodeType===3&&q.nodeValue.length>0){o=q;r=B?q.nodeValue.length:0;m=true;return}if(s.isBlock(q)||t[q.nodeName.toLowerCase()]){return}A=q}if(l&&A){o=A;m=true;r=0}}o=g[(p?"start":"end")+"Container"];r=g[(p?"start":"end")+"Offset"];t=s.schema.getNonEmptyElements();if(o.nodeType===9){o=s.getRoot();r=0}if(o===u){if(p){q=o.childNodes[r>0?r-1:0];if(q){v=q.nodeName.toLowerCase();if(t[q.nodeName]||q.nodeName=="TABLE"){return}}}if(o.hasChildNodes()){o=o.childNodes[Math.min(!p&&r>0?r-1:r,o.childNodes.length-1)];r=0;if(o.hasChildNodes()&&!/TABLE/.test(o.nodeName)){q=o;n=new a(o,u);do{if(q.nodeType===3&&q.nodeValue.length>0){r=p?0:q.nodeValue.length;o=q;m=true;break}if(t[q.nodeName.toLowerCase()]){r=s.nodeIndex(q);o=q.parentNode;if(q.nodeName=="IMG"&&!p){r++}m=true;break}}while(q=(p?n.next():n.prev()))}}}if(l){if(o.nodeType===3&&r===0){x(true)}if(o.nodeType===1){q=o.childNodes[r];if(q&&q.nodeName==="BR"&&!y(q)&&!y(q,true)){x(true,o.childNodes[r])}}}if(p&&!l&&o.nodeType===3&&r===o.nodeValue.length){x(false)}if(m){g["set"+(p?"Start":"End")](o,r)}}if(d.isIE){return}g=h.getRng();l=g.collapsed;k(true);if(!l){k()}if(m){if(l){g.collapse(true)}h.setRng(g,h.isForward())}},selectorChanged:function(g,j){var h=this,i;if(!h.selectorChangedData){h.selectorChangedData={};i={};h.editor.onNodeChange.addToTop(function(l,k,o){var p=h.dom,m=p.getParents(o,null,p.getRoot()),n={};e(h.selectorChangedData,function(r,q){e(m,function(s){if(p.is(s,q)){if(!i[q]){e(r,function(t){t(true,{node:s,selector:q,parents:m})});i[q]=r}n[q]=r;return false}})});e(i,function(r,q){if(!n[q]){delete i[q];e(r,function(s){s(false,{node:o,selector:q,parents:m})})}})})}if(!h.selectorChangedData[g]){h.selectorChangedData[g]=[]}h.selectorChangedData[g].push(j);return h},scrollIntoView:function(k){var j,h,g=this,i=g.dom;h=i.getViewPort(g.editor.getWin());j=i.getPos(k).y;if(jh.y+h.h){g.editor.getWin().scrollTo(0,j0){p.setEndPoint("StartToStart",o)}else{p.setEndPoint("EndToEnd",o)}p.select()}}else{l()}}function l(){var p=n.selection.createRange();if(o&&!p.item&&p.compareEndPoints("StartToEnd",p)===0){o.select()}h.unbind(n,"mouseup",l);h.unbind(n,"mousemove",m);o=k=0}n.documentElement.unselectable=true;h.bind(n,["mousedown","contextmenu"],function(p){if(p.target.nodeName==="HTML"){if(k){l()}g=n.documentElement;if(g.scrollHeight>g.clientHeight){return}k=1;o=j(p.x,p.y);if(o){h.bind(n,"mouseup",l);h.bind(n,"mousemove",m);h.win.focus();o.select()}}})}})})(tinymce);(function(a){a.dom.Serializer=function(e,i,f){var h,b,d=a.isIE,g=a.each,c;if(!e.apply_source_formatting){e.indent=false}i=i||a.DOM;f=f||new a.html.Schema(e);e.entity_encoding=e.entity_encoding||"named";e.remove_trailing_brs="remove_trailing_brs" in e?e.remove_trailing_brs:true;h=new a.util.Dispatcher(self);b=new a.util.Dispatcher(self);c=new a.html.DomParser(e,f);c.addAttributeFilter("src,href,style",function(k,j){var o=k.length,l,q,n="data-mce-"+j,p=e.url_converter,r=e.url_converter_scope,m;while(o--){l=k[o];q=l.attributes.map[n];if(q!==m){l.attr(j,q.length>0?q:null);l.attr(n,null)}else{q=l.attributes.map[j];if(j==="style"){q=i.serializeStyle(i.parseStyle(q),l.name)}else{if(p){q=p.call(r,q,j,l.name)}}l.attr(j,q.length>0?q:null)}}});c.addAttributeFilter("class",function(j,k){var l=j.length,m,n;while(l--){m=j[l];n=m.attr("class").replace(/(?:^|\s)mce(Item\w+|Selected)(?!\S)/g,"");m.attr("class",n.length>0?n:null)}});c.addAttributeFilter("data-mce-type",function(j,l,k){var m=j.length,n;while(m--){n=j[m];if(n.attributes.map["data-mce-type"]==="bookmark"&&!k.cleanup){n.remove()}}});c.addAttributeFilter("data-mce-expando",function(j,l,k){var m=j.length;while(m--){j[m].attr(l,null)}});c.addNodeFilter("noscript",function(j){var k=j.length,l;while(k--){l=j[k].firstChild;if(l){l.value=a.html.Entities.decode(l.value)}}});c.addNodeFilter("script,style",function(k,l){var m=k.length,n,o;function j(p){return p.replace(/()/g,"\n").replace(/^[\r\n]*|[\r\n]*$/g,"").replace(/^\s*(()?|\s*\/\/\s*\]\]>(-->)?|\/\/\s*(-->)?|\]\]>|\/\*\s*-->\s*\*\/|\s*-->\s*)\s*$/g,"")}while(m--){n=k[m];o=n.firstChild?n.firstChild.value:"";if(l==="script"){n.attr("type",(n.attr("type")||"text/javascript").replace(/^mce\-/,""));if(o.length>0){n.firstChild.value="// "}}else{if(o.length>0){n.firstChild.value=""}}}});c.addNodeFilter("#comment",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.value.indexOf("[CDATA[")===0){m.name="#cdata";m.type=4;m.value=m.value.replace(/^\[CDATA\[|\]\]$/g,"")}else{if(m.value.indexOf("mce:protected ")===0){m.name="#text";m.type=3;m.raw=true;m.value=unescape(m.value).substr(14)}}}});c.addNodeFilter("xml:namespace,input",function(j,k){var l=j.length,m;while(l--){m=j[l];if(m.type===7){m.remove()}else{if(m.type===1){if(k==="input"&&!("type" in m.attributes.map)){m.attr("type","text")}}}}});if(e.fix_list_elements){c.addNodeFilter("ul,ol",function(k,l){var m=k.length,n,j;while(m--){n=k[m];j=n.parent;if(j.name==="ul"||j.name==="ol"){if(n.prev&&n.prev.name==="li"){n.prev.append(n)}}}})}c.addAttributeFilter("data-mce-src,data-mce-href,data-mce-style",function(j,k){var l=j.length;while(l--){j[l].attr(k,null)}});return{schema:f,addNodeFilter:c.addNodeFilter,addAttributeFilter:c.addAttributeFilter,onPreProcess:h,onPostProcess:b,serialize:function(o,m){var l,p,k,j,n;if(d&&i.select("script,style,select,map").length>0){n=o.innerHTML;o=o.cloneNode(false);i.setHTML(o,n)}else{o=o.cloneNode(true)}l=o.ownerDocument.implementation;if(l.createHTMLDocument){p=l.createHTMLDocument("");g(o.nodeName=="BODY"?o.childNodes:[o],function(q){p.body.appendChild(p.importNode(q,true))});if(o.nodeName!="BODY"){o=p.body.firstChild}else{o=p.body}k=i.doc;i.doc=p}m=m||{};m.format=m.format||"html";if(!m.no_events){m.node=o;h.dispatch(self,m)}j=new a.html.Serializer(e,f);m.content=j.serialize(c.parse(a.trim(m.getInner?o.innerHTML:i.getOuterHTML(o)),m));if(!m.cleanup){m.content=m.content.replace(/\uFEFF/g,"")}if(!m.no_events){b.dispatch(self,m)}if(k){i.doc=k}m.node=null;return m.content},addRules:function(j){f.addValidElements(j)},setRules:function(j){f.setValidElements(j)}}}})(tinymce);(function(a){a.dom.ScriptLoader=function(h){var c=0,k=1,i=2,l={},j=[],e={},d=[],g=0,f;function b(m,v){var x=this,q=a.DOM,s,o,r,n;function p(){q.remove(n);if(s){s.onreadystatechange=s.onload=s=null}v()}function u(){if(typeof(console)!=="undefined"&&console.log){console.log("Failed to load: "+m)}}n=q.uniqueId();if(a.isIE6){o=new a.util.URI(m);r=location;if(o.host==r.hostname&&o.port==r.port&&(o.protocol+":")==r.protocol&&o.protocol.toLowerCase()!="file"){a.util.XHR.send({url:a._addVer(o.getURI()),success:function(y){var t=q.create("script",{type:"text/javascript"});t.text=y;document.getElementsByTagName("head")[0].appendChild(t);q.remove(t);p()},error:u});return}}s=document.createElement("script");s.id=n;s.type="text/javascript";s.src=a._addVer(m);if(!a.isIE){s.onload=p}s.onerror=u;if(!a.isOpera){s.onreadystatechange=function(){var t=s.readyState;if(t=="complete"||t=="loaded"){p()}}}(document.getElementsByTagName("head")[0]||document.body).appendChild(s)}this.isDone=function(m){return l[m]==i};this.markDone=function(m){l[m]=i};this.add=this.load=function(m,q,n){var o,p=l[m];if(p==f){j.push(m);l[m]=c}if(q){if(!e[m]){e[m]=[]}e[m].push({func:q,scope:n||this})}};this.loadQueue=function(n,m){this.loadScripts(j,n,m)};this.loadScripts=function(m,q,p){var o;function n(r){a.each(e[r],function(s){s.func.call(s.scope)});e[r]=f}d.push({func:q,scope:p||this});o=function(){var r=a.grep(m);m.length=0;a.each(r,function(s){if(l[s]==i){n(s);return}if(l[s]!=k){l[s]=k;g++;b(s,function(){l[s]=i;g--;n(s);o()})}});if(!g){a.each(d,function(s){s.func.call(s.scope)});d.length=0}};o()}};a.ScriptLoader=new a.dom.ScriptLoader()})(tinymce);(function(a){a.dom.RangeUtils=function(c){var b="\uFEFF";this.walk=function(d,s){var i=d.startContainer,l=d.startOffset,t=d.endContainer,m=d.endOffset,j,g,o,h,r,q,e;e=c.select("td.mceSelected,th.mceSelected");if(e.length>0){a.each(e,function(u){s([u])});return}function f(u){var v;v=u[0];if(v.nodeType===3&&v===i&&l>=v.nodeValue.length){u.splice(0,1)}v=u[u.length-1];if(m===0&&u.length>0&&v===t&&v.nodeType===3){u.splice(u.length-1,1)}return u}function p(x,v,u){var y=[];for(;x&&x!=u;x=x[v]){y.push(x)}return y}function n(v,u){do{if(v.parentNode==u){return v}v=v.parentNode}while(v)}function k(x,v,y){var u=y?"nextSibling":"previousSibling";for(h=x,r=h.parentNode;h&&h!=v;h=r){r=h.parentNode;q=p(h==x?h:h[u],u);if(q.length){if(!y){q.reverse()}s(f(q))}}}if(i.nodeType==1&&i.hasChildNodes()){i=i.childNodes[l]}if(t.nodeType==1&&t.hasChildNodes()){t=t.childNodes[Math.min(m-1,t.childNodes.length-1)]}if(i==t){return s(f([i]))}j=c.findCommonAncestor(i,t);for(h=i;h;h=h.parentNode){if(h===t){return k(i,j,true)}if(h===j){break}}for(h=t;h;h=h.parentNode){if(h===i){return k(t,j)}if(h===j){break}}g=n(i,j)||i;o=n(t,j)||t;k(i,g,true);q=p(g==i?g:g.nextSibling,"nextSibling",o==t?o.nextSibling:o);if(q.length){s(f(q))}k(t,o)};this.split=function(e){var h=e.startContainer,d=e.startOffset,i=e.endContainer,g=e.endOffset;function f(j,k){return j.splitText(k)}if(h==i&&h.nodeType==3){if(d>0&&dd){g=g-d;h=i=f(i,g).previousSibling;g=i.nodeValue.length;d=0}else{g=0}}}else{if(h.nodeType==3&&d>0&&d0&&g=m.length){r=0}}t=m[r];f.setAttrib(g,"tabindex","-1");f.setAttrib(t.id,"tabindex","0");f.get(t.id).focus();if(e.actOnFocus){e.onAction(t.id)}if(s){a.cancel(s)}};p=function(z){var v=37,u=39,y=38,A=40,r=27,t=14,s=13,x=32;switch(z.keyCode){case v:if(i){q.moveFocus(-1)}break;case u:if(i){q.moveFocus(1)}break;case y:if(o){q.moveFocus(-1)}break;case A:if(o){q.moveFocus(1)}break;case r:if(e.onCancel){e.onCancel();a.cancel(z)}break;case t:case s:case x:if(e.onAction){e.onAction(g);a.cancel(z)}break}};c(m,function(t,r){var s,u;if(!t.id){t.id=f.uniqueId("_mce_item_")}u=f.get(t.id);if(l){f.bind(u,"blur",h);s="-1"}else{s=(r===0?"0":"-1")}u.setAttribute("tabindex",s);f.bind(u,"focus",k)});if(m[0]){g=m[0].id}f.setAttrib(n,"tabindex","-1");var j=f.get(n);f.bind(j,"focus",d);f.bind(j,"keydown",p)}})})(tinymce);(function(c){var b=c.DOM,a=c.is;c.create("tinymce.ui.Control",{Control:function(f,e,d){this.id=f;this.settings=e=e||{};this.rendered=false;this.onRender=new c.util.Dispatcher(this);this.classPrefix="";this.scope=e.scope||this;this.disabled=0;this.active=0;this.editor=d},setAriaProperty:function(f,e){var d=b.get(this.id+"_aria")||b.get(this.id);if(d){b.setAttrib(d,"aria-"+f,!!e)}},focus:function(){b.get(this.id).focus()},setDisabled:function(d){if(d!=this.disabled){this.setAriaProperty("disabled",d);this.setState("Disabled",d);this.setState("Enabled",!d);this.disabled=d}},isDisabled:function(){return this.disabled},setActive:function(d){if(d!=this.active){this.setState("Active",d);this.active=d;this.setAriaProperty("pressed",d)}},isActive:function(){return this.active},setState:function(f,d){var e=b.get(this.id);f=this.classPrefix+f;if(d){b.addClass(e,f)}else{b.removeClass(e,f)}},isRendered:function(){return this.rendered},renderHTML:function(){},renderTo:function(d){b.setHTML(d,this.renderHTML())},postRender:function(){var e=this,d;if(a(e.disabled)){d=e.disabled;e.disabled=-1;e.setDisabled(d)}if(a(e.active)){d=e.active;e.active=-1;e.setActive(d)}},remove:function(){b.remove(this.id);this.destroy()},destroy:function(){c.dom.Event.clear(this.id)}})})(tinymce);tinymce.create("tinymce.ui.Container:tinymce.ui.Control",{Container:function(c,b,a){this.parent(c,b,a);this.controls=[];this.lookup={}},add:function(a){this.lookup[a.id]=a;this.controls.push(a);return a},get:function(a){return this.lookup[a]}});tinymce.create("tinymce.ui.Separator:tinymce.ui.Control",{Separator:function(b,a){this.parent(b,a);this.classPrefix="mceSeparator";this.setDisabled(true)},renderHTML:function(){return tinymce.DOM.createHTML("span",{"class":this.classPrefix,role:"separator","aria-orientation":"vertical",tabindex:"-1"})}});(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.MenuItem:tinymce.ui.Control",{MenuItem:function(g,f){this.parent(g,f);this.classPrefix="mceMenuItem"},setSelected:function(f){this.setState("Selected",f);this.setAriaProperty("checked",!!f);this.selected=f},isSelected:function(){return this.selected},postRender:function(){var f=this;f.parent();if(c(f.selected)){f.setSelected(f.selected)}}})})(tinymce);(function(d){var c=d.is,b=d.DOM,e=d.each,a=d.walk;d.create("tinymce.ui.Menu:tinymce.ui.MenuItem",{Menu:function(h,g){var f=this;f.parent(h,g);f.items={};f.collapsed=false;f.menuCount=0;f.onAddItem=new d.util.Dispatcher(this)},expand:function(g){var f=this;if(g){a(f,function(h){if(h.expand){h.expand()}},"items",f)}f.collapsed=false},collapse:function(g){var f=this;if(g){a(f,function(h){if(h.collapse){h.collapse()}},"items",f)}f.collapsed=true},isCollapsed:function(){return this.collapsed},add:function(f){if(!f.settings){f=new d.ui.MenuItem(f.id||b.uniqueId(),f)}this.onAddItem.dispatch(this,f);return this.items[f.id]=f},addSeparator:function(){return this.add({separator:true})},addMenu:function(f){if(!f.collapse){f=this.createMenu(f)}this.menuCount++;return this.add(f)},hasMenus:function(){return this.menuCount!==0},remove:function(f){delete this.items[f.id]},removeAll:function(){var f=this;a(f,function(g){if(g.removeAll){g.removeAll()}else{g.remove()}g.destroy()},"items",f);f.items={}},createMenu:function(g){var f=new d.ui.Menu(g.id||b.uniqueId(),g);f.onAddItem.add(this.onAddItem.dispatch,this.onAddItem);return f}})})(tinymce);(function(e){var d=e.is,c=e.DOM,f=e.each,a=e.dom.Event,b=e.dom.Element;e.create("tinymce.ui.DropMenu:tinymce.ui.Menu",{DropMenu:function(h,g){g=g||{};g.container=g.container||c.doc.body;g.offset_x=g.offset_x||0;g.offset_y=g.offset_y||0;g.vp_offset_x=g.vp_offset_x||0;g.vp_offset_y=g.vp_offset_y||0;if(d(g.icons)&&!g.icons){g["class"]+=" mceNoIcons"}this.parent(h,g);this.onShowMenu=new e.util.Dispatcher(this);this.onHideMenu=new e.util.Dispatcher(this);this.classPrefix="mceMenu"},createMenu:function(j){var h=this,i=h.settings,g;j.container=j.container||i.container;j.parent=h;j.constrain=j.constrain||i.constrain;j["class"]=j["class"]||i["class"];j.vp_offset_x=j.vp_offset_x||i.vp_offset_x;j.vp_offset_y=j.vp_offset_y||i.vp_offset_y;j.keyboard_focus=i.keyboard_focus;g=new e.ui.DropMenu(j.id||c.uniqueId(),j);g.onAddItem.add(h.onAddItem.dispatch,h.onAddItem);return g},focus:function(){var g=this;if(g.keyboardNav){g.keyboardNav.focus()}},update:function(){var i=this,j=i.settings,g=c.get("menu_"+i.id+"_tbl"),l=c.get("menu_"+i.id+"_co"),h,k;h=j.max_width?Math.min(g.offsetWidth,j.max_width):g.offsetWidth;k=j.max_height?Math.min(g.offsetHeight,j.max_height):g.offsetHeight;if(!c.boxModel){i.element.setStyles({width:h+2,height:k+2})}else{i.element.setStyles({width:h,height:k})}if(j.max_width){c.setStyle(l,"width",h)}if(j.max_height){c.setStyle(l,"height",k);if(g.clientHeightv){p=r?r-u:Math.max(0,(v-A.vp_offset_x)-u)}if((n+A.vp_offset_y+l)>q){n=Math.max(0,(q-A.vp_offset_y)-l)}}c.setStyles(o,{left:p,top:n});z.element.update();z.isMenuVisible=1;z.mouseClickFunc=a.add(o,"click",function(s){var h;s=s.target;if(s&&(s=c.getParent(s,"tr"))&&!c.hasClass(s,m+"ItemSub")){h=z.items[s.id];if(h.isDisabled()){return}k=z;while(k){if(k.hideMenu){k.hideMenu()}k=k.settings.parent}if(h.settings.onclick){h.settings.onclick(s)}return false}});if(z.hasMenus()){z.mouseOverFunc=a.add(o,"mouseover",function(x){var h,t,s;x=x.target;if(x&&(x=c.getParent(x,"tr"))){h=z.items[x.id];if(z.lastMenu){z.lastMenu.collapse(1)}if(h.isDisabled()){return}if(x&&c.hasClass(x,m+"ItemSub")){t=c.getRect(x);h.showMenu((t.x+t.w-i),t.y-i,t.x);z.lastMenu=h;c.addClass(c.get(h.id).firstChild,m+"ItemActive")}}})}a.add(o,"keydown",z._keyHandler,z);z.onShowMenu.dispatch(z);if(A.keyboard_focus){z._setupKeyboardNav()}},hideMenu:function(j){var g=this,i=c.get("menu_"+g.id),h;if(!g.isMenuVisible){return}if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(i,"mouseover",g.mouseOverFunc);a.remove(i,"click",g.mouseClickFunc);a.remove(i,"keydown",g._keyHandler);c.hide(i);g.isMenuVisible=0;if(!j){g.collapse(1)}if(g.element){g.element.hide()}if(h=c.get(g.id)){c.removeClass(h.firstChild,g.classPrefix+"ItemActive")}g.onHideMenu.dispatch(g)},add:function(i){var g=this,h;i=g.parent(i);if(g.isRendered&&(h=c.get("menu_"+g.id))){g._add(c.select("tbody",h)[0],i)}return i},collapse:function(g){this.parent(g);this.hideMenu(1)},remove:function(g){c.remove(g.id);this.destroy();return this.parent(g)},destroy:function(){var g=this,h=c.get("menu_"+g.id);if(g.keyboardNav){g.keyboardNav.destroy()}a.remove(h,"mouseover",g.mouseOverFunc);a.remove(c.select("a",h),"focus",g.mouseOverFunc);a.remove(h,"click",g.mouseClickFunc);a.remove(h,"keydown",g._keyHandler);if(g.element){g.element.remove()}c.remove(h)},renderNode:function(){var i=this,j=i.settings,l,h,k,g;g=c.create("div",{role:"listbox",id:"menu_"+i.id,"class":j["class"],style:"position:absolute;left:0;top:0;z-index:200000;outline:0"});if(i.settings.parent){c.setAttrib(g,"aria-parent","menu_"+i.settings.parent.id)}k=c.add(g,"div",{role:"presentation",id:"menu_"+i.id+"_co","class":i.classPrefix+(j["class"]?" "+j["class"]:"")});i.element=new b("menu_"+i.id,{blocker:1,container:j.container});if(j.menu_line){c.add(k,"span",{"class":i.classPrefix+"Line"})}l=c.add(k,"table",{role:"presentation",id:"menu_"+i.id+"_tbl",border:0,cellPadding:0,cellSpacing:0});h=c.add(l,"tbody");f(i.items,function(m){i._add(h,m)});i.rendered=true;return g},_setupKeyboardNav:function(){var i,h,g=this;i=c.get("menu_"+g.id);h=c.select("a[role=option]","menu_"+g.id);h.splice(0,0,i);g.keyboardNav=new e.ui.KeyboardNavigation({root:"menu_"+g.id,items:h,onCancel:function(){g.hideMenu()},enableUpDown:true});i.focus()},_keyHandler:function(g){var h=this,i;switch(g.keyCode){case 37:if(h.settings.parent){h.hideMenu();h.settings.parent.focus();a.cancel(g)}break;case 39:if(h.mouseOverFunc){h.mouseOverFunc(g)}break}},_add:function(j,h){var i,q=h.settings,p,l,k,m=this.classPrefix,g;if(q.separator){l=c.add(j,"tr",{id:h.id,"class":m+"ItemSeparator"});c.add(l,"td",{"class":m+"ItemSeparator"});if(i=l.previousSibling){c.addClass(i,"mceLast")}return}i=l=c.add(j,"tr",{id:h.id,"class":m+"Item "+m+"ItemEnabled"});i=k=c.add(i,q.titleItem?"th":"td");i=p=c.add(i,"a",{id:h.id+"_aria",role:q.titleItem?"presentation":"option",href:"javascript:;",onclick:"return false;",onmousedown:"return false;"});if(q.parent){c.setAttrib(p,"aria-haspopup","true");c.setAttrib(p,"aria-owns","menu_"+h.id)}c.addClass(k,q["class"]);g=c.add(i,"span",{"class":"mceIcon"+(q.icon?" mce_"+q.icon:"")});if(q.icon_src){c.add(g,"img",{src:q.icon_src})}i=c.add(i,q.element||"span",{"class":"mceText",title:h.settings.title},h.settings.title);if(h.settings.style){if(typeof h.settings.style=="function"){h.settings.style=h.settings.style()}c.setAttrib(i,"style",h.settings.style)}if(j.childNodes.length==1){c.addClass(l,"mceFirst")}if((i=l.previousSibling)&&c.hasClass(i,m+"ItemSeparator")){c.addClass(l,"mceFirst")}if(h.collapse){c.addClass(l,m+"ItemSub")}if(i=l.previousSibling){c.removeClass(i,"mceLast")}c.addClass(l,"mceLast")}})})(tinymce);(function(b){var a=b.DOM;b.create("tinymce.ui.Button:tinymce.ui.Control",{Button:function(e,d,c){this.parent(e,d,c);this.classPrefix="mceButton"},renderHTML:function(){var f=this.classPrefix,e=this.settings,d,c;c=a.encode(e.label||"");d='';if(e.image&&!(this.editor&&this.editor.forcedHighContrastMode)){d+='
'+(c?''+c+"":"")}else{d+=''+(c?''+c+"":"")}d+=''+e.title+"";d+="";return d},postRender:function(){var d=this,e=d.settings,c;if(b.isIE&&d.editor){b.dom.Event.add(d.id,"mousedown",function(f){var g=d.editor.selection.getNode().nodeName;c=g==="IMG"?d.editor.selection.getBookmark():null})}b.dom.Event.add(d.id,"click",function(f){if(!d.isDisabled()){if(b.isIE&&d.editor&&c!==null){d.editor.selection.moveToBookmark(c)}return e.onclick.call(e.scope,f)}});b.dom.Event.add(d.id,"keyup",function(f){if(!d.isDisabled()&&f.keyCode==b.VK.SPACEBAR){return e.onclick.call(e.scope,f)}})}})})(tinymce);(function(e){var d=e.DOM,b=e.dom.Event,f=e.each,a=e.util.Dispatcher,c;e.create("tinymce.ui.ListBox:tinymce.ui.Control",{ListBox:function(j,i,g){var h=this;h.parent(j,i,g);h.items=[];h.onChange=new a(h);h.onPostRender=new a(h);h.onAdd=new a(h);h.onRenderMenu=new e.util.Dispatcher(this);h.classPrefix="mceListBox";h.marked={}},select:function(h){var g=this,j,i;g.marked={};if(h==c){return g.selectByIndex(-1)}if(h&&typeof(h)=="function"){i=h}else{i=function(k){return k==h}}if(h!=g.selectedValue){f(g.items,function(l,k){if(i(l.value)){j=1;g.selectByIndex(k);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(g){var i=this,j,k,h;i.marked={};if(g!=i.selectedIndex){j=d.get(i.id+"_text");h=d.get(i.id+"_voiceDesc");k=i.items[g];if(k){i.selectedValue=k.value;i.selectedIndex=g;d.setHTML(j,d.encode(k.title));d.setHTML(h,i.settings.title+" - "+k.title);d.removeClass(j,"mceTitle");d.setAttrib(i.id,"aria-valuenow",k.title)}else{d.setHTML(j,d.encode(i.settings.title));d.setHTML(h,d.encode(i.settings.title));d.addClass(j,"mceTitle");i.selectedValue=i.selectedIndex=null;d.setAttrib(i.id,"aria-valuenow",i.settings.title)}j=0}},mark:function(g){this.marked[g]=true},add:function(j,g,i){var h=this;i=i||{};i=e.extend(i,{title:j,value:g});h.items.push(i);h.onAdd.dispatch(h,i)},getLength:function(){return this.items.length},renderHTML:function(){var j="",g=this,i=g.settings,k=g.classPrefix;j='';j+="| "+d.createHTML("span",{id:g.id+"_voiceDesc","class":"voiceLabel",style:"display:none;"},g.settings.title);j+=d.createHTML("a",{id:g.id+"_text",tabindex:-1,href:"javascript:;","class":"mceText",onclick:"return false;",onmousedown:"return false;"},d.encode(g.settings.title))+" | ";j+=""+d.createHTML("a",{id:g.id+"_open",tabindex:-1,href:"javascript:;","class":"mceOpen",onclick:"return false;",onmousedown:"return false;"},'\u25BC')+" | ";j+="
";return j},showMenu:function(){var h=this,j,i=d.get(this.id),g;if(h.isDisabled()||h.items.length===0){return}if(h.menu&&h.menu.isMenuVisible){return h.hideMenu()}if(!h.isMenuRendered){h.renderMenu();h.isMenuRendered=true}j=d.getPos(i);g=h.menu;g.settings.offset_x=j.x;g.settings.offset_y=j.y;g.settings.keyboard_focus=!e.isOpera;f(h.items,function(k){if(g.items[k.id]){g.items[k.id].setSelected(0)}});f(h.items,function(k){if(g.items[k.id]&&h.marked[k.value]){g.items[k.id].setSelected(1)}if(k.value===h.selectedValue){g.items[k.id].setSelected(1)}});g.showMenu(0,i.clientHeight);b.add(d.doc,"mousedown",h.hideMenu,h);d.addClass(h.id,h.classPrefix+"Selected")},hideMenu:function(h){var g=this;if(g.menu&&g.menu.isMenuVisible){d.removeClass(g.id,g.classPrefix+"Selected");if(h&&h.type=="mousedown"&&(h.target.id==g.id+"_text"||h.target.id==g.id+"_open")){return}if(!h||!d.getParent(h.target,".mceMenu")){d.removeClass(g.id,g.classPrefix+"Selected");b.remove(d.doc,"mousedown",g.hideMenu,g);g.menu.hideMenu()}}},renderMenu:function(){var h=this,g;g=h.settings.control_manager.createDropMenu(h.id+"_menu",{menu_line:1,"class":h.classPrefix+"Menu mceNoIcons",max_width:250,max_height:150});g.onHideMenu.add(function(){h.hideMenu();h.focus()});g.add({title:h.settings.title,"class":"mceMenuItemTitle",onclick:function(){if(h.settings.onselect("")!==false){h.select("")}}});f(h.items,function(i){if(i.value===c){g.add({title:i.title,role:"option","class":"mceMenuItemTitle",onclick:function(){if(h.settings.onselect("")!==false){h.select("")}}})}else{i.id=d.uniqueId();i.role="option";i.onclick=function(){if(h.settings.onselect(i.value)!==false){h.select(i.value)}};g.add(i)}});h.onRenderMenu.dispatch(h,g);h.menu=g},postRender:function(){var g=this,h=g.classPrefix;b.add(g.id,"click",g.showMenu,g);b.add(g.id,"keydown",function(i){if(i.keyCode==32){g.showMenu(i);b.cancel(i)}});b.add(g.id,"focus",function(){if(!g._focused){g.keyDownHandler=b.add(g.id,"keydown",function(i){if(i.keyCode==40){g.showMenu();b.cancel(i)}});g.keyPressHandler=b.add(g.id,"keypress",function(j){var i;if(j.keyCode==13){i=g.selectedValue;g.selectedValue=null;b.cancel(j);g.settings.onselect(i)}})}g._focused=1});b.add(g.id,"blur",function(){b.remove(g.id,"keydown",g.keyDownHandler);b.remove(g.id,"keypress",g.keyPressHandler);g._focused=0});if(e.isIE6||!d.boxModel){b.add(g.id,"mouseover",function(){if(!d.hasClass(g.id,h+"Disabled")){d.addClass(g.id,h+"Hover")}});b.add(g.id,"mouseout",function(){if(!d.hasClass(g.id,h+"Disabled")){d.removeClass(g.id,h+"Hover")}})}g.onPostRender.dispatch(g,d.get(g.id))},destroy:function(){this.parent();b.clear(this.id+"_text");b.clear(this.id+"_open")}})})(tinymce);(function(e){var d=e.DOM,b=e.dom.Event,f=e.each,a=e.util.Dispatcher,c;e.create("tinymce.ui.NativeListBox:tinymce.ui.ListBox",{NativeListBox:function(h,g){this.parent(h,g);this.classPrefix="mceNativeListBox"},setDisabled:function(g){d.get(this.id).disabled=g;this.setAriaProperty("disabled",g)},isDisabled:function(){return d.get(this.id).disabled},select:function(h){var g=this,j,i;if(h==c){return g.selectByIndex(-1)}if(h&&typeof(h)=="function"){i=h}else{i=function(k){return k==h}}if(h!=g.selectedValue){f(g.items,function(l,k){if(i(l.value)){j=1;g.selectByIndex(k);return false}});if(!j){g.selectByIndex(-1)}}},selectByIndex:function(g){d.get(this.id).selectedIndex=g+1;this.selectedValue=this.items[g]?this.items[g].value:null},add:function(k,h,g){var j,i=this;g=g||{};g.value=h;if(i.isRendered()){d.add(d.get(this.id),"option",g,k)}j={title:k,value:h,attribs:g};i.items.push(j);i.onAdd.dispatch(i,j)},getLength:function(){return this.items.length},renderHTML:function(){var i,g=this;i=d.createHTML("option",{value:""},"-- "+g.settings.title+" --");f(g.items,function(h){i+=d.createHTML("option",{value:h.value},h.title)});i=d.createHTML("select",{id:g.id,"class":"mceNativeListBox","aria-labelledby":g.id+"_aria"},i);i+=d.createHTML("span",{id:g.id+"_aria",style:"display: none"},g.settings.title);return i},postRender:function(){var h=this,i,j=true;h.rendered=true;function g(l){var k=h.items[l.target.selectedIndex-1];if(k&&(k=k.value)){h.onChange.dispatch(h,k);if(h.settings.onselect){h.settings.onselect(k)}}}b.add(h.id,"change",g);b.add(h.id,"keydown",function(l){var k;b.remove(h.id,"change",i);j=false;k=b.add(h.id,"blur",function(){if(j){return}j=true;b.add(h.id,"change",g);b.remove(h.id,"blur",k)});if(e.isWebKit&&(l.keyCode==37||l.keyCode==39)){return b.prevent(l)}if(l.keyCode==13||l.keyCode==32){g(l);return b.cancel(l)}});h.onPostRender.dispatch(h,d.get(h.id))}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.MenuButton:tinymce.ui.Button",{MenuButton:function(g,f,e){this.parent(g,f,e);this.onRenderMenu=new c.util.Dispatcher(this);f.menu_container=f.menu_container||b.doc.body},showMenu:function(){var g=this,j,i,h=b.get(g.id),f;if(g.isDisabled()){return}if(!g.isMenuRendered){g.renderMenu();g.isMenuRendered=true}if(g.isMenuVisible){return g.hideMenu()}j=b.getPos(g.settings.menu_container);i=b.getPos(h);f=g.menu;f.settings.offset_x=i.x;f.settings.offset_y=i.y;f.settings.vp_offset_x=i.x;f.settings.vp_offset_y=i.y;f.settings.keyboard_focus=g._focused;f.showMenu(0,h.firstChild.clientHeight);a.add(b.doc,"mousedown",g.hideMenu,g);g.setState("Selected",1);g.isMenuVisible=1},renderMenu:function(){var f=this,e;e=f.settings.control_manager.createDropMenu(f.id+"_menu",{menu_line:1,"class":this.classPrefix+"Menu",icons:f.settings.icons});e.onHideMenu.add(function(){f.hideMenu();f.focus()});f.onRenderMenu.dispatch(f,e);f.menu=e},hideMenu:function(g){var f=this;if(g&&g.type=="mousedown"&&b.getParent(g.target,function(h){return h.id===f.id||h.id===f.id+"_open"})){return}if(!g||!b.getParent(g.target,".mceMenu")){f.setState("Selected",0);a.remove(b.doc,"mousedown",f.hideMenu,f);if(f.menu){f.menu.hideMenu()}}f.isMenuVisible=0},postRender:function(){var e=this,f=e.settings;a.add(e.id,"click",function(){if(!e.isDisabled()){if(f.onclick){f.onclick(e.value)}e.showMenu()}})}})})(tinymce);(function(c){var b=c.DOM,a=c.dom.Event,d=c.each;c.create("tinymce.ui.SplitButton:tinymce.ui.MenuButton",{SplitButton:function(g,f,e){this.parent(g,f,e);this.classPrefix="mceSplitButton"},renderHTML:function(){var i,f=this,g=f.settings,e;i="";if(g.image){e=b.createHTML("img ",{src:g.image,role:"presentation","class":"mceAction "+g["class"]})}else{e=b.createHTML("span",{"class":"mceAction "+g["class"]},"")}e+=b.createHTML("span",{"class":"mceVoiceLabel mceIconOnly",id:f.id+"_voice",style:"display:none;"},g.title);i+="| "+b.createHTML("a",{role:"button",id:f.id+"_action",tabindex:"-1",href:"javascript:;","class":"mceAction "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+" | ";e=b.createHTML("span",{"class":"mceOpen "+g["class"]},'\u25BC');i+=""+b.createHTML("a",{role:"button",id:f.id+"_open",tabindex:"-1",href:"javascript:;","class":"mceOpen "+g["class"],onclick:"return false;",onmousedown:"return false;",title:g.title},e)+" | ";i+="
";i=b.createHTML("table",{role:"presentation","class":"mceSplitButton mceSplitButtonEnabled "+g["class"],cellpadding:"0",cellspacing:"0",title:g.title},i);return b.createHTML("div",{id:f.id,role:"button",tabindex:"0","aria-labelledby":f.id+"_voice","aria-haspopup":"true"},i)},postRender:function(){var e=this,g=e.settings,f;if(g.onclick){f=function(h){if(!e.isDisabled()){g.onclick(e.value);a.cancel(h)}};a.add(e.id+"_action","click",f);a.add(e.id,["click","keydown"],function(h){var k=32,m=14,i=13,j=38,l=40;if((h.keyCode===32||h.keyCode===13||h.keyCode===14)&&!h.altKey&&!h.ctrlKey&&!h.metaKey){f();a.cancel(h)}else{if(h.type==="click"||h.keyCode===l){e.showMenu();a.cancel(h)}}})}a.add(e.id+"_open","click",function(h){e.showMenu();a.cancel(h)});a.add([e.id,e.id+"_open"],"focus",function(){e._focused=1});a.add([e.id,e.id+"_open"],"blur",function(){e._focused=0});if(c.isIE6||!b.boxModel){a.add(e.id,"mouseover",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.addClass(e.id,"mceSplitButtonHover")}});a.add(e.id,"mouseout",function(){if(!b.hasClass(e.id,"mceSplitButtonDisabled")){b.removeClass(e.id,"mceSplitButtonHover")}})}},destroy:function(){this.parent();a.clear(this.id+"_action");a.clear(this.id+"_open");a.clear(this.id)}})})(tinymce);(function(d){var c=d.DOM,a=d.dom.Event,b=d.is,e=d.each;d.create("tinymce.ui.ColorSplitButton:tinymce.ui.SplitButton",{ColorSplitButton:function(i,h,f){var g=this;g.parent(i,h,f);g.settings=h=d.extend({colors:"000000,993300,333300,003300,003366,000080,333399,333333,800000,FF6600,808000,008000,008080,0000FF,666699,808080,FF0000,FF9900,99CC00,339966,33CCCC,3366FF,800080,999999,FF00FF,FFCC00,FFFF00,00FF00,00FFFF,00CCFF,993366,C0C0C0,FF99CC,FFCC99,FFFF99,CCFFCC,CCFFFF,99CCFF,CC99FF,FFFFFF",grid_width:8,default_color:"#888888"},g.settings);g.onShowMenu=new d.util.Dispatcher(g);g.onHideMenu=new d.util.Dispatcher(g);g.value=h.default_color},showMenu:function(){var f=this,g,j,i,h;if(f.isDisabled()){return}if(!f.isMenuRendered){f.renderMenu();f.isMenuRendered=true}if(f.isMenuVisible){return f.hideMenu()}i=c.get(f.id);c.show(f.id+"_menu");c.addClass(i,"mceSplitButtonSelected");h=c.getPos(i);c.setStyles(f.id+"_menu",{left:h.x,top:h.y+i.firstChild.clientHeight,zIndex:200000});i=0;a.add(c.doc,"mousedown",f.hideMenu,f);f.onShowMenu.dispatch(f);if(f._focused){f._keyHandler=a.add(f.id+"_menu","keydown",function(k){if(k.keyCode==27){f.hideMenu()}});c.select("a",f.id+"_menu")[0].focus()}f.keyboardNav=new d.ui.KeyboardNavigation({root:f.id+"_menu",items:c.select("a",f.id+"_menu"),onCancel:function(){f.hideMenu();f.focus()}});f.keyboardNav.focus();f.isMenuVisible=1},hideMenu:function(g){var f=this;if(f.isMenuVisible){if(g&&g.type=="mousedown"&&c.getParent(g.target,function(h){return h.id===f.id+"_open"})){return}if(!g||!c.getParent(g.target,".mceSplitButtonMenu")){c.removeClass(f.id,"mceSplitButtonSelected");a.remove(c.doc,"mousedown",f.hideMenu,f);a.remove(f.id+"_menu","keydown",f._keyHandler);c.hide(f.id+"_menu")}f.isMenuVisible=0;f.onHideMenu.dispatch();f.keyboardNav.destroy()}},renderMenu:function(){var p=this,h,k=0,q=p.settings,g,j,l,o,f;o=c.add(q.menu_container,"div",{role:"listbox",id:p.id+"_menu","class":q.menu_class+" "+q["class"],style:"position:absolute;left:0;top:-1000px;"});h=c.add(o,"div",{"class":q["class"]+" mceSplitButtonMenu"});c.add(h,"span",{"class":"mceMenuLine"});g=c.add(h,"table",{role:"presentation","class":"mceColorSplitMenu"});j=c.add(g,"tbody");k=0;e(b(q.colors,"array")?q.colors:q.colors.split(","),function(m){m=m.replace(/^#/,"");if(!k--){l=c.add(j,"tr");k=q.grid_width-1}g=c.add(l,"td");var i={href:"javascript:;",style:{backgroundColor:"#"+m},title:p.editor.getLang("colors."+m,m),"data-mce-color":"#"+m};if(!d.isIE){i.role="option"}g=c.add(g,"a",i);if(p.editor.forcedHighContrastMode){g=c.add(g,"canvas",{width:16,height:16,"aria-hidden":"true"});if(g.getContext&&(f=g.getContext("2d"))){f.fillStyle="#"+m;f.fillRect(0,0,16,16)}else{c.remove(g)}}});if(q.more_colors_func){g=c.add(j,"tr");g=c.add(g,"td",{colspan:q.grid_width,"class":"mceMoreColors"});g=c.add(g,"a",{role:"option",id:p.id+"_more",href:"javascript:;",onclick:"return false;","class":"mceMoreColors"},q.more_colors_title);a.add(g,"click",function(i){q.more_colors_func.call(q.more_colors_scope||this);return a.cancel(i)})}c.addClass(h,"mceColorSplitMenu");a.add(p.id+"_menu","mousedown",function(i){return a.cancel(i)});a.add(p.id+"_menu","click",function(i){var m;i=c.getParent(i.target,"a",j);if(i&&i.nodeName.toLowerCase()=="a"&&(m=i.getAttribute("data-mce-color"))){p.setColor(m)}return false});return o},setColor:function(f){this.displayColor(f);this.hideMenu();this.settings.onselect(f)},displayColor:function(g){var f=this;c.setStyle(f.id+"_preview","backgroundColor",g);f.value=g},postRender:function(){var f=this,g=f.id;f.parent();c.add(g+"_action","div",{id:g+"_preview","class":"mceColorPreview"});c.setStyle(f.id+"_preview","backgroundColor",f.value)},destroy:function(){var f=this;f.parent();a.clear(f.id+"_menu");a.clear(f.id+"_more");c.remove(f.id+"_menu");if(f.keyboardNav){f.keyboardNav.destroy()}}})})(tinymce);(function(b){var d=b.DOM,c=b.each,a=b.dom.Event;b.create("tinymce.ui.ToolbarGroup:tinymce.ui.Container",{renderHTML:function(){var f=this,i=[],e=f.controls,j=b.each,g=f.settings;i.push('');i.push("");i.push(''+d.encode(g.name)+"");j(e,function(h){i.push(h.renderHTML())});i.push("");i.push("
");return i.join("")},focus:function(){var e=this;d.get(e.id).focus()},postRender:function(){var f=this,e=[];c(f.controls,function(g){c(g.controls,function(h){if(h.id){e.push(h)}})});f.keyNav=new b.ui.KeyboardNavigation({root:f.id,items:e,onCancel:function(){if(b.isWebKit){d.get(f.editor.id+"_ifr").focus()}f.editor.focus()},excludeFromTabOrder:!f.settings.tab_focus_toolbar})},destroy:function(){var e=this;e.parent();e.keyNav.destroy();a.clear(e.id)}})})(tinymce);(function(a){var c=a.DOM,b=a.each;a.create("tinymce.ui.Toolbar:tinymce.ui.Container",{renderHTML:function(){var m=this,f="",j,k,n=m.settings,e,d,g,l;l=m.controls;for(e=0;e"))}if(d&&k.ListBox){if(d.Button||d.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarEnd"},c.createHTML("span",null,""))}}if(c.stdMode){f+=''+k.renderHTML()+" | "}else{f+=""+k.renderHTML()+" | "}if(g&&k.ListBox){if(g.Button||g.SplitButton){f+=c.createHTML("td",{"class":"mceToolbarStart"},c.createHTML("span",null,""))}}}j="mceToolbarEnd";if(k.Button){j+=" mceToolbarEndButton"}else{if(k.SplitButton){j+=" mceToolbarEndSplitButton"}else{if(k.ListBox){j+=" mceToolbarEndListBox"}}}f+=c.createHTML("td",{"class":j},c.createHTML("span",null,""));return c.createHTML("table",{id:m.id,"class":"mceToolbar"+(n["class"]?" "+n["class"]:""),cellpadding:"0",cellspacing:"0",align:m.settings.align||"",role:"presentation",tabindex:"-1"},""+f+"
")}})})(tinymce);(function(b){var a=b.util.Dispatcher,c=b.each;b.create("tinymce.AddOnManager",{AddOnManager:function(){var d=this;d.items=[];d.urls={};d.lookup={};d.onAdd=new a(d)},get:function(d){if(this.lookup[d]){return this.lookup[d].instance}else{return undefined}},dependencies:function(e){var d;if(this.lookup[e]){d=this.lookup[e].dependencies}return d||[]},requireLangPack:function(e){var d=b.settings;if(d&&d.language&&d.language_load!==false){b.ScriptLoader.add(this.urls[e]+"/langs/"+d.language+".js")}},add:function(f,e,d){this.items.push(e);this.lookup[f]={instance:e,dependencies:d};this.onAdd.dispatch(this,f,e);return e},createUrl:function(d,e){if(typeof e==="object"){return e}else{return{prefix:d.prefix,resource:e,suffix:d.suffix}}},addComponents:function(f,d){var e=this.urls[f];b.each(d,function(g){b.ScriptLoader.add(e+"/"+g)})},load:function(j,f,d,h){var g=this,e=f;function i(){var k=g.dependencies(j);b.each(k,function(m){var l=g.createUrl(f,m);g.load(l.resource,l,undefined,undefined)});if(d){if(h){d.call(h)}else{d.call(b.ScriptLoader)}}}if(g.urls[j]){return}if(typeof f==="object"){e=f.prefix+f.resource+f.suffix}if(e.indexOf("/")!==0&&e.indexOf("://")==-1){e=b.baseURL+"/"+e}g.urls[j]=e.substring(0,e.lastIndexOf("/"));if(g.lookup[j]){i()}else{b.ScriptLoader.add(e,i,h)}}});b.PluginManager=new b.AddOnManager();b.ThemeManager=new b.AddOnManager()}(tinymce));(function(j){var g=j.each,d=j.extend,k=j.DOM,i=j.dom.Event,f=j.ThemeManager,b=j.PluginManager,e=j.explode,h=j.util.Dispatcher,a,c=0;j.documentBaseURL=window.location.href.replace(/[\?#].*$/,"").replace(/[\/\\][^\/]+$/,"");if(!/[\/\\]$/.test(j.documentBaseURL)){j.documentBaseURL+="/"}j.baseURL=new j.util.URI(j.documentBaseURL).toAbsolute(j.baseURL);j.baseURI=new j.util.URI(j.baseURL);j.onBeforeUnload=new h(j);i.add(window,"beforeunload",function(l){j.onBeforeUnload.dispatch(j,l)});j.onAddEditor=new h(j);j.onRemoveEditor=new h(j);j.EditorManager=d(j,{editors:[],i18n:{},activeEditor:null,init:function(x){var v=this,o,n=j.ScriptLoader,u,l=[],r;function q(t){var s=t.id;if(!s){s=t.name;if(s&&!k.get(s)){s=t.name}else{s=k.uniqueId()}t.setAttribute("id",s)}return s}function m(z,A,t){var y=z[A];if(!y){return}if(j.is(y,"string")){t=y.replace(/\.\w+$/,"");t=t?j.resolve(t):0;y=j.resolve(y)}return y.apply(t||this,Array.prototype.slice.call(arguments,2))}function p(t,s){return s.constructor===RegExp?s.test(t.className):k.hasClass(t,s)}v.settings=x;i.bind(window,"ready",function(){var s,t;m(x,"onpageload");switch(x.mode){case"exact":s=x.elements||"";if(s.length>0){g(e(s),function(y){if(k.get(y)){r=new j.Editor(y,x);l.push(r);r.render(1)}else{g(document.forms,function(z){g(z.elements,function(A){if(A.name===y){y="mce_editor_"+c++;k.setAttrib(A,"id",y);r=new j.Editor(y,x);l.push(r);r.render(1)}})})}})}break;case"textareas":case"specific_textareas":g(k.select("textarea"),function(y){if(x.editor_deselector&&p(y,x.editor_deselector)){return}if(!x.editor_selector||p(y,x.editor_selector)){r=new j.Editor(q(y),x);l.push(r);r.render(1)}});break;default:if(x.types){g(x.types,function(y){g(k.select(y.selector),function(A){var z=new j.Editor(q(A),j.extend({},x,y));l.push(z);z.render(1)})})}else{if(x.selector){g(k.select(x.selector),function(z){var y=new j.Editor(q(z),x);l.push(y);y.render(1)})}}}if(x.oninit){s=t=0;g(l,function(y){t++;if(!y.initialized){y.onInit.add(function(){s++;if(s==t){m(x,"oninit")}})}else{s++}if(s==t){m(x,"oninit")}})}})},get:function(l){if(l===a){return this.editors}if(!this.editors.hasOwnProperty(l)){return a}return this.editors[l]},getInstanceById:function(l){return this.get(l)},add:function(m){var l=this,n=l.editors;n[m.id]=m;n.push(m);l._setActive(m);l.onAddEditor.dispatch(l,m);return m},remove:function(n){var m=this,l,o=m.editors;if(!o[n.id]){return null}delete o[n.id];for(l=0;l':"",visual:n,font_size_style_values:"xx-small,x-small,small,medium,large,x-large,xx-large",font_size_legacy_values:"xx-small,small,medium,large,x-large,xx-large,300%",apply_source_formatting:n,directionality:"ltr",forced_root_block:"p",hidden_input:n,padd_empty_editor:n,render_ui:n,indentation:"30px",fix_table_elements:n,inline_styles:n,convert_fonts_to_spans:n,indent:"simple",indent_before:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",indent_after:"p,h1,h2,h3,h4,h5,h6,blockquote,div,title,style,pre,script,td,ul,li,area,table,thead,tfoot,tbody,tr,section,article,hgroup,aside,figure,option,optgroup,datalist",validate:n,entity_encoding:"named",url_converter:m.convertURL,url_converter_scope:m,ie7_compat:n},o);m.id=m.editorId=p;m.isNotDirty=false;m.plugins={};m.documentBaseURI=new k.util.URI(o.document_base_url||k.documentBaseURL,{base_uri:tinyMCE.baseURI});m.baseURI=k.baseURI;m.contentCSS=[];m.contentStyles=[];m.setupEvents();m.execCommands={};m.queryStateCommands={};m.queryValueCommands={};m.execCallback("setup",m)},render:function(o){var p=this,q=p.settings,r=p.id,m=k.ScriptLoader;if(!j.domLoaded){j.add(window,"ready",function(){p.render()});return}tinyMCE.settings=q;if(!p.getElement()){return}if(k.isIDevice&&!k.isIOS5){return}if(!/TEXTAREA|INPUT/i.test(p.getElement().nodeName)&&q.hidden_input&&l.getParent(r,"form")){l.insertAfter(l.create("input",{type:"hidden",name:r}),r)}if(!q.content_editable){p.orgVisibility=p.getElement().style.visibility;p.getElement().style.visibility="hidden"}if(k.WindowManager){p.windowManager=new k.WindowManager(p)}if(q.encoding=="xml"){p.onGetContent.add(function(s,t){if(t.save){t.content=l.encode(t.content)}})}if(q.add_form_submit_trigger){p.onSubmit.addToTop(function(){if(p.initialized){p.save();p.isNotDirty=1}})}if(q.add_unload_trigger){p._beforeUnload=tinyMCE.onBeforeUnload.add(function(){if(p.initialized&&!p.destroyed&&!p.isHidden()){p.save({format:"raw",no_events:true})}})}k.addUnload(p.destroy,p);if(q.submit_patch){p.onBeforeRenderUI.add(function(){var s=p.getElement().form;if(!s){return}if(s._mceOldSubmit){return}if(!s.submit.nodeType&&!s.submit.length){p.formElement=s;s._mceOldSubmit=s.submit;s.submit=function(){k.triggerSave();p.isNotDirty=1;return p.formElement._mceOldSubmit(p.formElement)}}s=null})}function n(){if(q.language&&q.language_load!==false){m.add(k.baseURL+"/langs/"+q.language+".js")}if(q.theme&&typeof q.theme!="function"&&q.theme.charAt(0)!="-"&&!h.urls[q.theme]){h.load(q.theme,"themes/"+q.theme+"/editor_template"+k.suffix+".js")}i(g(q.plugins),function(t){if(t&&!c.urls[t]){if(t.charAt(0)=="-"){t=t.substr(1,t.length);var s=c.dependencies(t);i(s,function(v){var u={prefix:"plugins/",resource:v,suffix:"/editor_plugin"+k.suffix+".js"};v=c.createUrl(u,v);c.load(v.resource,v)})}else{if(t=="safari"){return}c.load(t,{prefix:"plugins/",resource:t,suffix:"/editor_plugin"+k.suffix+".js"})}}});m.loadQueue(function(){if(!p.removed){p.init()}})}n()},init:function(){var q,G=this,H=G.settings,D,y,z,C=G.getElement(),p,m,E,v,B,F,x,r=[];k.add(G);H.aria_label=H.aria_label||l.getAttrib(C,"aria-label",G.getLang("aria.rich_text_area"));if(H.theme){if(typeof H.theme!="function"){H.theme=H.theme.replace(/-/,"");p=h.get(H.theme);G.theme=new p();if(G.theme.init){G.theme.init(G,h.urls[H.theme]||k.documentBaseURL.replace(/\/$/,""))}}else{G.theme=H.theme}}function A(s){var t=c.get(s),o=c.urls[s]||k.documentBaseURL.replace(/\/$/,""),n;if(t&&k.inArray(r,s)===-1){i(c.dependencies(s),function(u){A(u)});n=new t(G,o);G.plugins[s]=n;if(n.init){n.init(G,o);r.push(s)}}}i(g(H.plugins.replace(/\-/g,"")),A);if(H.popup_css!==false){if(H.popup_css){H.popup_css=G.documentBaseURI.toAbsolute(H.popup_css)}else{H.popup_css=G.baseURI.toAbsolute("themes/"+H.theme+"/skins/"+H.skin+"/dialog.css")}}if(H.popup_css_add){H.popup_css+=","+G.documentBaseURI.toAbsolute(H.popup_css_add)}G.controlManager=new k.ControlManager(G);G.onBeforeRenderUI.dispatch(G,G.controlManager);if(H.render_ui&&G.theme){G.orgDisplay=C.style.display;if(typeof H.theme!="function"){D=H.width||C.style.width||C.offsetWidth;y=H.height||C.style.height||C.offsetHeight;z=H.min_height||100;F=/^[0-9\.]+(|px)$/i;if(F.test(""+D)){D=Math.max(parseInt(D,10)+(p.deltaWidth||0),100)}if(F.test(""+y)){y=Math.max(parseInt(y,10)+(p.deltaHeight||0),z)}p=G.theme.renderUI({targetNode:C,width:D,height:y,deltaWidth:H.delta_width,deltaHeight:H.delta_height});l.setStyles(p.sizeContainer||p.editorContainer,{width:D,height:y});y=(p.iframeHeight||y)+(typeof(y)=="number"?(p.deltaHeight||0):"");if(y';if(H.document_base_url!=k.documentBaseURL){G.iframeHTML+=''}if(k.isIE8){if(H.ie7_compat){G.iframeHTML+=''}else{G.iframeHTML+=''}}G.iframeHTML+='';for(x=0;x'}G.contentCSS=[];v=H.body_id||"tinymce";if(v.indexOf("=")!=-1){v=G.getParam("body_id","","hash");v=v[G.id]||v}B=H.body_class||"";if(B.indexOf("=")!=-1){B=G.getParam("body_class","","hash");B=B[G.id]||""}G.iframeHTML+='
";if(k.relaxedDomain&&(b||(k.isOpera&&parseFloat(opera.version())<11))){E='javascript:(function(){document.open();document.domain="'+document.domain+'";var ed = window.parent.tinyMCE.get("'+G.id+'");document.write(ed.iframeHTML);document.close();ed.initContentBody();})()'}q=l.add(p.iframeContainer,"iframe",{id:G.id+"_ifr",src:E||'javascript:""',frameBorder:"0",allowTransparency:"true",title:H.aria_label,style:{width:"100%",height:y,display:"block"}});G.contentAreaContainer=p.iframeContainer;if(p.editorContainer){l.get(p.editorContainer).style.display=G.orgDisplay}C.style.visibility=G.orgVisibility;l.get(G.id).style.display="none";l.setAttrib(G.id,"aria-hidden",true);if(!k.relaxedDomain||!E){G.initContentBody()}C=q=p=null},initContentBody:function(){var n=this,p=n.settings,q=l.get(n.id),r=n.getDoc(),o,m,s;if((!b||!k.relaxedDomain)&&!p.content_editable){r.open();r.write(n.iframeHTML);r.close();if(k.relaxedDomain){r.domain=k.relaxedDomain}}if(p.content_editable){l.addClass(q,"mceContentBody");n.contentDocument=r=p.content_document||document;n.contentWindow=p.content_window||window;n.bodyElement=q;p.content_document=p.content_window=null}m=n.getBody();m.disabled=true;if(!p.readonly){m.contentEditable=n.getParam("content_editable_state",true)}m.disabled=false;n.schema=new k.html.Schema(p);n.dom=new k.dom.DOMUtils(r,{keep_values:true,url_converter:n.convertURL,url_converter_scope:n,hex_colors:p.force_hex_style_colors,class_filter:p.class_filter,update_styles:true,root_element:p.content_editable?n.id:null,schema:n.schema});n.parser=new k.html.DomParser(p,n.schema);n.parser.addAttributeFilter("src,href,style",function(t,u){var v=t.length,y,A=n.dom,z,x;while(v--){y=t[v];z=y.attr(u);x="data-mce-"+u;if(!y.attributes.map[x]){if(u==="style"){y.attr(x,A.serializeStyle(A.parseStyle(z),y.name))}else{y.attr(x,n.convertURL(z,u,y.name))}}}});n.parser.addNodeFilter("script",function(t,u){var v=t.length,x;while(v--){x=t[v];x.attr("type","mce-"+(x.attr("type")||"text/javascript"))}});n.parser.addNodeFilter("#cdata",function(t,u){var v=t.length,x;while(v--){x=t[v];x.type=8;x.name="#comment";x.value="[CDATA["+x.value+"]]"}});n.parser.addNodeFilter("p,h1,h2,h3,h4,h5,h6,div",function(u,v){var x=u.length,y,t=n.schema.getNonEmptyElements();while(x--){y=u[x];if(y.isEmpty(t)){y.empty().append(new k.html.Node("br",1)).shortEnded=true}}});n.serializer=new k.dom.Serializer(p,n.dom,n.schema);n.selection=new k.dom.Selection(n.dom,n.getWin(),n.serializer,n);n.formatter=new k.Formatter(n);n.undoManager=new k.UndoManager(n);n.forceBlocks=new k.ForceBlocks(n);n.enterKey=new k.EnterKey(n);n.editorCommands=new k.EditorCommands(n);n.onExecCommand.add(function(t,u){if(!/^(FontName|FontSize)$/.test(u)){n.nodeChanged()}});n.serializer.onPreProcess.add(function(t,u){return n.onPreProcess.dispatch(n,u,t)});n.serializer.onPostProcess.add(function(t,u){return n.onPostProcess.dispatch(n,u,t)});n.onPreInit.dispatch(n);if(!p.browser_spellcheck&&!p.gecko_spellcheck){r.body.spellcheck=false}if(!p.readonly){n.bindNativeEvents()}n.controlManager.onPostRender.dispatch(n,n.controlManager);n.onPostRender.dispatch(n);n.quirks=k.util.Quirks(n);if(p.directionality){m.dir=p.directionality}if(p.nowrap){m.style.whiteSpace="nowrap"}if(p.protect){n.onBeforeSetContent.add(function(t,u){i(p.protect,function(v){u.content=u.content.replace(v,function(x){return""})})})}n.onSetContent.add(function(){n.addVisual(n.getBody())});if(p.padd_empty_editor){n.onPostProcess.add(function(t,u){u.content=u.content.replace(/^(]*>( | |\s|\u00a0|)<\/p>[\r\n]*|
[\r\n]*)$/,"")})}n.load({initial:true,format:"html"});n.startContent=n.getContent({format:"raw"});n.initialized=true;n.onInit.dispatch(n);n.execCallback("setupcontent_callback",n.id,m,r);n.execCallback("init_instance_callback",n);n.focus(true);n.nodeChanged({initial:true});if(n.contentStyles.length>0){s="";i(n.contentStyles,function(t){s+=t+"\r\n"});n.dom.addStyle(s)}i(n.contentCSS,function(t){n.dom.loadCSS(t)});if(p.auto_focus){setTimeout(function(){var t=k.get(p.auto_focus);t.selection.select(t.getBody(),1);t.selection.collapse(1);t.getBody().focus();t.getWin().focus()},100)}q=r=m=null},focus:function(p){var o,u=this,t=u.selection,q=u.settings.content_editable,n,r,s=u.getDoc(),m;if(!p){if(u.lastIERng){t.setRng(u.lastIERng)}n=t.getRng();if(n.item){r=n.item(0)}u._refreshContentEditable();if(!q){u.getWin().focus()}if(k.isGecko||q){m=u.getBody();if(m.setActive){m.setActive()}else{m.focus()}if(q){t.normalize()}}if(r&&r.ownerDocument==s){n=s.body.createControlRange();n.addElement(r);n.select()}}if(k.activeEditor!=u){if((o=k.activeEditor)!=null){o.onDeactivate.dispatch(o,u)}u.onActivate.dispatch(u,o)}k._setActive(u)},execCallback:function(q){var m=this,p=m.settings[q],o;if(!p){return}if(m.callbackLookup&&(o=m.callbackLookup[q])){p=o.func;o=o.scope}if(d(p,"string")){o=p.replace(/\.\w+$/,"");o=o?k.resolve(o):0;p=k.resolve(p);m.callbackLookup=m.callbackLookup||{};m.callbackLookup[q]={func:p,scope:o}}return p.apply(o||m,Array.prototype.slice.call(arguments,1))},translate:function(m){var o=this.settings.language||"en",n=k.i18n;if(!m){return""}return n[o+"."+m]||m.replace(/\{\#([^\}]+)\}/g,function(q,p){return n[o+"."+p]||"{#"+p+"}"})},getLang:function(o,m){return k.i18n[(this.settings.language||"en")+"."+o]||(d(m)?m:"{#"+o+"}")},getParam:function(t,q,m){var r=k.trim,p=d(this.settings[t])?this.settings[t]:q,s;if(m==="hash"){s={};if(d(p,"string")){i(p.indexOf("=")>0?p.split(/[;,](?![^=;,]*(?:[;,]|$))/):p.split(","),function(n){n=n.split("=");if(n.length>1){s[r(n[0])]=r(n[1])}else{s[r(n[0])]=r(n)}})}else{s=p}return s}return p},nodeChanged:function(q){var m=this,n=m.selection,p;if(m.initialized){q=q||{};p=n.getStart()||m.getBody();p=b&&p.ownerDocument!=m.getDoc()?m.getBody():p;q.parents=[];m.dom.getParent(p,function(o){if(o.nodeName=="BODY"){return true}q.parents.push(o)});m.onNodeChange.dispatch(m,q?q.controlManager||m.controlManager:m.controlManager,p,n.isCollapsed(),q)}},addButton:function(n,o){var m=this;m.buttons=m.buttons||{};m.buttons[n]=o},addCommand:function(m,o,n){this.execCommands[m]={func:o,scope:n||this}},addQueryStateHandler:function(m,o,n){this.queryStateCommands[m]={func:o,scope:n||this}},addQueryValueHandler:function(m,o,n){this.queryValueCommands[m]={func:o,scope:n||this}},addShortcut:function(o,q,m,p){var n=this,r;if(n.settings.custom_shortcuts===false){return false}n.shortcuts=n.shortcuts||{};if(d(m,"string")){r=m;m=function(){n.execCommand(r,false,null)}}if(d(m,"object")){r=m;m=function(){n.execCommand(r[0],r[1],r[2])}}i(g(o),function(s){var t={func:m,scope:p||this,desc:n.translate(q),alt:false,ctrl:false,shift:false};i(g(s,"+"),function(u){switch(u){case"alt":case"ctrl":case"shift":t[u]=true;break;default:t.charCode=u.charCodeAt(0);t.keyCode=u.toUpperCase().charCodeAt(0)}});n.shortcuts[(t.ctrl?"ctrl":"")+","+(t.alt?"alt":"")+","+(t.shift?"shift":"")+","+t.keyCode]=t});return true},execCommand:function(u,r,x,m){var p=this,q=0,v,n;if(!/^(mceAddUndoLevel|mceEndUndoLevel|mceBeginUndoLevel|mceRepaint|SelectAll)$/.test(u)&&(!m||!m.skip_focus)){p.focus()}m=f({},m);p.onBeforeExecCommand.dispatch(p,u,r,x,m);if(m.terminate){return false}if(p.execCallback("execcommand_callback",p.id,p.selection.getNode(),u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}if(v=p.execCommands[u]){n=v.func.call(v.scope,r,x);if(n!==true){p.onExecCommand.dispatch(p,u,r,x,m);return n}}i(p.plugins,function(o){if(o.execCommand&&o.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);q=1;return false}});if(q){return true}if(p.theme&&p.theme.execCommand&&p.theme.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}if(p.editorCommands.execCommand(u,r,x)){p.onExecCommand.dispatch(p,u,r,x,m);return true}p.getDoc().execCommand(u,r,x);p.onExecCommand.dispatch(p,u,r,x,m)},queryCommandState:function(q){var n=this,r,p;if(n._isHidden()){return}if(r=n.queryStateCommands[q]){p=r.func.call(r.scope);if(p!==true){return p}}r=n.editorCommands.queryCommandState(q);if(r!==-1){return r}try{return this.getDoc().queryCommandState(q)}catch(m){}},queryCommandValue:function(r){var n=this,q,p;if(n._isHidden()){return}if(q=n.queryValueCommands[r]){p=q.func.call(q.scope);if(p!==true){return p}}q=n.editorCommands.queryCommandValue(r);if(d(q)){return q}try{return this.getDoc().queryCommandValue(r)}catch(m){}},show:function(){var m=this;l.show(m.getContainer());l.hide(m.id);m.load()},hide:function(){var m=this,n=m.getDoc();if(b&&n){n.execCommand("SelectAll")}m.save();l.hide(m.getContainer());l.setStyle(m.id,"display",m.orgDisplay)},isHidden:function(){return !l.isHidden(this.id)},setProgressState:function(m,n,p){this.onSetProgressState.dispatch(this,m,n,p);return m},load:function(q){var m=this,p=m.getElement(),n;if(p){q=q||{};q.load=true;n=m.setContent(d(p.value)?p.value:p.innerHTML,q);q.element=p;if(!q.no_events){m.onLoadContent.dispatch(m,q)}q.element=p=null;return n}},save:function(r){var m=this,q=m.getElement(),n,p;if(!q||!m.initialized){return}r=r||{};r.save=true;r.element=q;n=r.content=m.getContent(r);if(!r.no_events){m.onSaveContent.dispatch(m,r)}n=r.content;if(!/TEXTAREA|INPUT/i.test(q.nodeName)){q.innerHTML=n;if(p=l.getParent(m.id,"form")){i(p.elements,function(o){if(o.name==m.id){o.value=n;return false}})}}else{q.value=n}r.element=q=null;return n},setContent:function(r,p){var o=this,n,m=o.getBody(),q;p=p||{};p.format=p.format||"html";p.set=true;p.content=r;if(!p.no_events){o.onBeforeSetContent.dispatch(o,p)}r=p.content;if(!k.isIE&&(r.length===0||/^\s+$/.test(r))){q=o.settings.forced_root_block;if(q){r="<"+q+'>
'+q+">"}else{r='
'}m.innerHTML=r;o.selection.select(m,true);o.selection.collapse(true);return}if(p.format!=="raw"){r=new k.html.Serializer({},o.schema).serialize(o.parser.parse(r))}p.content=k.trim(r);o.dom.setHTML(m,p.content);if(!p.no_events){o.onSetContent.dispatch(o,p)}if(!o.settings.content_editable||document.activeElement===o.getBody()){o.selection.normalize()}return p.content},getContent:function(o){var n=this,p,m=n.getBody();o=o||{};o.format=o.format||"html";o.get=true;o.getInner=true;if(!o.no_events){n.onBeforeGetContent.dispatch(n,o)}if(o.format=="raw"){p=m.innerHTML}else{if(o.format=="text"){p=m.innerText||m.textContent}else{p=n.serializer.serialize(m,o)}}if(o.format!="text"){o.content=k.trim(p)}else{o.content=p}if(!o.no_events){n.onGetContent.dispatch(n,o)}return o.content},isDirty:function(){var m=this;return k.trim(m.startContent)!=k.trim(m.getContent({format:"raw",no_events:1}))&&!m.isNotDirty},getContainer:function(){var m=this;if(!m.container){m.container=l.get(m.editorContainer||m.id+"_parent")}return m.container},getContentAreaContainer:function(){return this.contentAreaContainer},getElement:function(){return l.get(this.settings.content_element||this.id)},getWin:function(){var m=this,n;if(!m.contentWindow){n=l.get(m.id+"_ifr");if(n){m.contentWindow=n.contentWindow}}return m.contentWindow},getDoc:function(){var m=this,n;if(!m.contentDocument){n=m.getWin();if(n){m.contentDocument=n.document}}return m.contentDocument},getBody:function(){return this.bodyElement||this.getDoc().body},convertURL:function(o,n,q){var m=this,p=m.settings;if(p.urlconverter_callback){return m.execCallback("urlconverter_callback",o,q,true,n)}if(!p.convert_urls||(q&&q.nodeName=="LINK")||o.indexOf("file:")===0){return o}if(p.relative_urls){return m.documentBaseURI.toRelative(o)}o=m.documentBaseURI.toAbsolute(o,p.remove_script_host);return o},addVisual:function(q){var n=this,o=n.settings,p=n.dom,m;q=q||n.getBody();if(!d(n.hasVisual)){n.hasVisual=o.visual}i(p.select("table,a",q),function(s){var r;switch(s.nodeName){case"TABLE":m=o.visual_table_class||"mceItemTable";r=p.getAttrib(s,"border");if(!r||r=="0"){if(n.hasVisual){p.addClass(s,m)}else{p.removeClass(s,m)}}return;case"A":if(!p.getAttrib(s,"href",false)){r=p.getAttrib(s,"name")||s.id;m="mceItemAnchor";if(r){if(n.hasVisual){p.addClass(s,m)}else{p.removeClass(s,m)}}}return}});n.onVisualAid.dispatch(n,q,n.hasVisual)},remove:function(){var m=this,o=m.getContainer(),n=m.getDoc();if(!m.removed){m.removed=1;if(b&&n){n.execCommand("SelectAll")}m.save();l.setStyle(m.id,"display",m.orgDisplay);if(!m.settings.content_editable){j.unbind(m.getWin());j.unbind(m.getDoc())}j.unbind(m.getBody());j.clear(o);m.execCallback("remove_instance_callback",m);m.onRemove.dispatch(m);m.onExecCommand.listeners=[];k.remove(m);l.remove(o)}},destroy:function(n){var m=this;if(m.destroyed){return}if(a){j.unbind(m.getDoc());j.unbind(m.getWin());j.unbind(m.getBody())}if(!n){k.removeUnload(m.destroy);tinyMCE.onBeforeUnload.remove(m._beforeUnload);if(m.theme&&m.theme.destroy){m.theme.destroy()}m.controlManager.destroy();m.selection.destroy();m.dom.destroy()}if(m.formElement){m.formElement.submit=m.formElement._mceOldSubmit;m.formElement._mceOldSubmit=null}m.contentAreaContainer=m.formElement=m.container=m.settings.content_element=m.bodyElement=m.contentDocument=m.contentWindow=null;if(m.selection){m.selection=m.selection.win=m.selection.dom=m.selection.dom.doc=null}m.destroyed=1},_refreshContentEditable:function(){var n=this,m,o;if(n._isHidden()){m=n.getBody();o=m.parentNode;o.removeChild(m);o.appendChild(m);m.focus()}},_isHidden:function(){var m;if(!a){return 0}m=this.selection.getSel();return(!m||!m.rangeCount||m.rangeCount===0)}})})(tinymce);(function(a){var b=a.each;a.Editor.prototype.setupEvents=function(){var c=this,d=c.settings;b(["onPreInit","onBeforeRenderUI","onPostRender","onLoad","onInit","onRemove","onActivate","onDeactivate","onClick","onEvent","onMouseUp","onMouseDown","onDblClick","onKeyDown","onKeyUp","onKeyPress","onContextMenu","onSubmit","onReset","onPaste","onPreProcess","onPostProcess","onBeforeSetContent","onBeforeGetContent","onSetContent","onGetContent","onLoadContent","onSaveContent","onNodeChange","onChange","onBeforeExecCommand","onExecCommand","onUndo","onRedo","onVisualAid","onSetProgressState","onSetAttrib"],function(e){c[e]=new a.util.Dispatcher(c)});if(d.cleanup_callback){c.onBeforeSetContent.add(function(e,f){f.content=e.execCallback("cleanup_callback","insert_to_editor",f.content,f)});c.onPreProcess.add(function(e,f){if(f.set){e.execCallback("cleanup_callback","insert_to_editor_dom",f.node,f)}if(f.get){e.execCallback("cleanup_callback","get_from_editor_dom",f.node,f)}});c.onPostProcess.add(function(e,f){if(f.set){f.content=e.execCallback("cleanup_callback","insert_to_editor",f.content,f)}if(f.get){f.content=e.execCallback("cleanup_callback","get_from_editor",f.content,f)}})}if(d.save_callback){c.onGetContent.add(function(e,f){if(f.save){f.content=e.execCallback("save_callback",e.id,f.content,e.getBody())}})}if(d.handle_event_callback){c.onEvent.add(function(f,g,h){if(c.execCallback("handle_event_callback",g,f,h)===false){g.preventDefault();g.stopPropagation()}})}if(d.handle_node_change_callback){c.onNodeChange.add(function(f,e,g){f.execCallback("handle_node_change_callback",f.id,g,-1,-1,true,f.selection.isCollapsed())})}if(d.save_callback){c.onSaveContent.add(function(e,g){var f=e.execCallback("save_callback",e.id,g.content,e.getBody());if(f){g.content=f}})}if(d.onchange_callback){c.onChange.add(function(f,e){f.execCallback("onchange_callback",f,e)})}};a.Editor.prototype.bindNativeEvents=function(){var l=this,f,d=l.settings,e=l.dom,h;h={mouseup:"onMouseUp",mousedown:"onMouseDown",click:"onClick",keyup:"onKeyUp",keydown:"onKeyDown",keypress:"onKeyPress",submit:"onSubmit",reset:"onReset",contextmenu:"onContextMenu",dblclick:"onDblClick",paste:"onPaste"};function c(i,m){var n=i.type;if(l.removed){return}if(l.onEvent.dispatch(l,i,m)!==false){l[h[i.fakeType||i.type]].dispatch(l,i,m)}}function j(i){l.focus(true)}function k(i,m){if(m.keyCode!=65||!a.VK.metaKeyPressed(m)){l.selection.normalize()}l.nodeChanged()}b(h,function(m,n){var i=d.content_editable?l.getBody():l.getDoc();switch(n){case"contextmenu":e.bind(i,n,c);break;case"paste":e.bind(l.getBody(),n,c);break;case"submit":case"reset":e.bind(l.getElement().form||a.DOM.getParent(l.id,"form"),n,c);break;default:e.bind(i,n,c)}});e.bind(d.content_editable?l.getBody():(a.isGecko?l.getDoc():l.getWin()),"focus",function(i){l.focus(true)});if(d.content_editable&&a.isOpera){e.bind(l.getBody(),"click",j);e.bind(l.getBody(),"keydown",j)}l.onMouseUp.add(k);l.onKeyUp.add(function(i,n){var m=n.keyCode;if((m>=33&&m<=36)||(m>=37&&m<=40)||m==13||m==45||m==46||m==8||(a.isMac&&(m==91||m==93))||n.ctrlKey){k(i,n)}});l.onReset.add(function(){l.setContent(l.startContent,{format:"raw"})});function g(m,i){if(m.altKey||m.ctrlKey||m.metaKey){b(l.shortcuts,function(n){var o=a.isMac?m.metaKey:m.ctrlKey;if(n.ctrl!=o||n.alt!=m.altKey||n.shift!=m.shiftKey){return}if(m.keyCode==n.keyCode||(m.charCode&&m.charCode==n.charCode)){m.preventDefault();if(i){n.func.call(n.scope)}return true}})}}l.onKeyUp.add(function(i,m){g(m)});l.onKeyPress.add(function(i,m){g(m)});l.onKeyDown.add(function(i,m){g(m,true)});if(a.isOpera){l.onClick.add(function(i,m){m.preventDefault()})}}})(tinymce);(function(d){var e=d.each,b,a=true,c=false;d.EditorCommands=function(n){var m=n.dom,p=n.selection,j={state:{},exec:{},value:{}},k=n.settings,q=n.formatter,o;function r(z,y,x){var v;z=z.toLowerCase();if(v=j.exec[z]){v(z,y,x);return a}return c}function l(x){var v;x=x.toLowerCase();if(v=j.state[x]){return v(x)}return -1}function h(x){var v;x=x.toLowerCase();if(v=j.value[x]){return v(x)}return c}function u(v,x){x=x||"exec";e(v,function(z,y){e(y.toLowerCase().split(","),function(A){j[x][A]=z})})}d.extend(this,{execCommand:r,queryCommandState:l,queryCommandValue:h,addCommands:u});function f(y,x,v){if(x===b){x=c}if(v===b){v=null}return n.getDoc().execCommand(y,x,v)}function t(v){return q.match(v)}function s(v,x){q.toggle(v,x?{value:x}:b)}function i(v){o=p.getBookmark(v)}function g(){p.moveToBookmark(o)}u({"mceResetDesignMode,mceBeginUndoLevel":function(){},"mceEndUndoLevel,mceAddUndoLevel":function(){n.undoManager.add()},"Cut,Copy,Paste":function(z){var y=n.getDoc(),v;try{f(z)}catch(x){v=a}if(v||!y.queryCommandSupported(z)){if(d.isGecko){n.windowManager.confirm(n.getLang("clipboard_msg"),function(A){if(A){open("http://www.mozilla.org/editor/midasdemo/securityprefs.html","_blank")}})}else{n.windowManager.alert(n.getLang("clipboard_no_support"))}}},unlink:function(v){if(p.isCollapsed()){p.select(p.getNode())}f(v);p.collapse(c)},"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(v){var x=v.substring(7);e("left,center,right,full".split(","),function(y){if(x!=y){q.remove("align"+y)}});s("align"+x);r("mceRepaint")},"InsertUnorderedList,InsertOrderedList":function(y){var v,x;f(y);v=m.getParent(p.getNode(),"ol,ul");if(v){x=v.parentNode;if(/^(H[1-6]|P|ADDRESS|PRE)$/.test(x.nodeName)){i();m.split(x,v);g()}}},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){s(v)},"ForeColor,HiliteColor,FontName":function(y,x,v){s(y,v)},FontSize:function(z,y,x){var v,A;if(x>=1&&x<=7){A=d.explode(k.font_size_style_values);v=d.explode(k.font_size_classes);if(v){x=v[x-1]||x}else{x=A[x-1]||x}}s(z,x)},RemoveFormat:function(v){q.remove(v)},mceBlockQuote:function(v){s("blockquote")},FormatBlock:function(y,x,v){return s(v||"p")},mceCleanup:function(){var v=p.getBookmark();n.setContent(n.getContent({cleanup:a}),{cleanup:a});p.moveToBookmark(v)},mceRemoveNode:function(z,y,x){var v=x||p.getNode();if(v!=n.getBody()){i();n.dom.remove(v,a);g()}},mceSelectNodeDepth:function(z,y,x){var v=0;m.getParent(p.getNode(),function(A){if(A.nodeType==1&&v++==x){p.select(A);return c}},n.getBody())},mceSelectNode:function(y,x,v){p.select(v)},mceInsertContent:function(B,I,K){var y,J,E,z,F,G,D,C,L,x,A,M,v,H;y=n.parser;J=new d.html.Serializer({},n.schema);v='\uFEFF';G={content:K,format:"html"};p.onBeforeSetContent.dispatch(p,G);K=G.content;if(K.indexOf("{$caret}")==-1){K+="{$caret}"}K=K.replace(/\{\$caret\}/,v);if(!p.isCollapsed()){n.getDoc().execCommand("Delete",false,null)}E=p.getNode();G={context:E.nodeName.toLowerCase()};F=y.parse(K,G);A=F.lastChild;if(A.attr("id")=="mce_marker"){D=A;for(A=A.prev;A;A=A.walk(true)){if(A.type==3||!m.isBlock(A.name)){A.parent.insert(D,A,A.name==="br");break}}}if(!G.invalid){K=J.serialize(F);A=E.firstChild;M=E.lastChild;if(!A||(A===M&&A.nodeName==="BR")){m.setHTML(E,K)}else{p.setContent(K)}}else{p.setContent(v);E=p.getNode();z=n.getBody();if(E.nodeType==9){E=A=z}else{A=E}while(A!==z){E=A;A=A.parentNode}K=E==z?z.innerHTML:m.getOuterHTML(E);K=J.serialize(y.parse(K.replace(//i,function(){return J.serialize(F)})));if(E==z){m.setHTML(z,K)}else{m.setOuterHTML(E,K)}}D=m.get("mce_marker");C=m.getRect(D);L=m.getViewPort(n.getWin());if((C.y+C.h>L.y+L.h||C.yL.x+L.w||C.x")},mceToggleVisualAid:function(){n.hasVisual=!n.hasVisual;n.addVisual()},mceReplaceContent:function(y,x,v){n.execCommand("mceInsertContent",false,v.replace(/\{\$selection\}/g,p.getContent({format:"text"})))},mceInsertLink:function(z,y,x){var v;if(typeof(x)=="string"){x={href:x}}v=m.getParent(p.getNode(),"a");x.href=x.href.replace(" ","%20");if(!v||!x.href){q.remove("link")}if(x.href){q.apply("link",x,v)}},selectAll:function(){var x=m.getRoot(),v=m.createRng();if(p.getRng().setStart){v.setStart(x,0);v.setEnd(x,x.childNodes.length);p.setRng(v)}else{f("SelectAll")}}});u({"JustifyLeft,JustifyCenter,JustifyRight,JustifyFull":function(z){var x="align"+z.substring(7);var v=p.isCollapsed()?[m.getParent(p.getNode(),m.isBlock)]:p.getSelectedBlocks();var y=d.map(v,function(A){return !!q.matchNode(A,x)});return d.inArray(y,a)!==-1},"Bold,Italic,Underline,Strikethrough,Superscript,Subscript":function(v){return t(v)},mceBlockQuote:function(){return t("blockquote")},Outdent:function(){var v;if(k.inline_styles){if((v=m.getParent(p.getStart(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}if((v=m.getParent(p.getEnd(),m.isBlock))&&parseInt(v.style.paddingLeft)>0){return a}}return l("InsertUnorderedList")||l("InsertOrderedList")||(!k.inline_styles&&!!m.getParent(p.getNode(),"BLOCKQUOTE"))},"InsertUnorderedList,InsertOrderedList":function(x){var v=m.getParent(p.getNode(),"ul,ol");return v&&(x==="insertunorderedlist"&&v.tagName==="UL"||x==="insertorderedlist"&&v.tagName==="OL")}},"state");u({"FontSize,FontName":function(y){var x=0,v;if(v=m.getParent(p.getNode(),"span")){if(y=="fontsize"){x=v.style.fontSize}else{x=v.style.fontFamily.replace(/, /g,",").replace(/[\'\"]/g,"").toLowerCase()}}return x}},"value");u({Undo:function(){n.undoManager.undo()},Redo:function(){n.undoManager.redo()}})}})(tinymce);(function(b){var a=b.util.Dispatcher;b.UndoManager=function(h){var l,i=0,e=[],g,k,j,f;function c(){return b.trim(h.getContent({format:"raw",no_events:1}).replace(/]+data-mce-bogus[^>]+>[\u200B\uFEFF]+<\/span>/g,""))}function d(){l.typing=false;l.add()}onBeforeAdd=new a(l);k=new a(l);j=new a(l);f=new a(l);k.add(function(m,n){if(m.hasUndo()){return h.onChange.dispatch(h,n,m)}});j.add(function(m,n){return h.onUndo.dispatch(h,n,m)});f.add(function(m,n){return h.onRedo.dispatch(h,n,m)});h.onInit.add(function(){l.add()});h.onBeforeExecCommand.add(function(m,p,o,q,n){if(p!="Undo"&&p!="Redo"&&p!="mceRepaint"&&(!n||!n.skip_undo)){l.beforeChange()}});h.onExecCommand.add(function(m,p,o,q,n){if(p!="Undo"&&p!="Redo"&&p!="mceRepaint"&&(!n||!n.skip_undo)){l.add()}});h.onSaveContent.add(d);h.dom.bind(h.dom.getRoot(),"dragend",d);h.dom.bind(h.getBody(),"focusout",function(m){if(!h.removed&&l.typing){d()}});h.onKeyUp.add(function(m,o){var n=o.keyCode;if((n>=33&&n<=36)||(n>=37&&n<=40)||n==45||n==13||o.ctrlKey){d()}});h.onKeyDown.add(function(m,o){var n=o.keyCode;if((n>=33&&n<=36)||(n>=37&&n<=40)||n==45){if(l.typing){d()}return}if((n<16||n>20)&&n!=224&&n!=91&&!l.typing){l.beforeChange();l.typing=true;l.add()}});h.onMouseDown.add(function(m,n){if(l.typing){d()}});h.addShortcut("ctrl+z","undo_desc","Undo");h.addShortcut("ctrl+y","redo_desc","Redo");l={data:e,typing:false,onBeforeAdd:onBeforeAdd,onAdd:k,onUndo:j,onRedo:f,beforeChange:function(){g=h.selection.getBookmark(2,true)},add:function(p){var m,n=h.settings,o;p=p||{};p.content=c();l.onBeforeAdd.dispatch(l,p);o=e[i];if(o&&o.content==p.content){return null}if(e[i]){e[i].beforeBookmark=g}if(n.custom_undo_redo_levels){if(e.length>n.custom_undo_redo_levels){for(m=0;m0){n=e[--i];h.setContent(n.content,{format:"raw"});h.selection.moveToBookmark(n.beforeBookmark);l.onUndo.dispatch(l,n)}return n},redo:function(){var m;if(i0||this.typing},hasRedo:function(){return i0){g.moveEnd("character",q)}g.select()}catch(n){}}}c.nodeChanged()}}if(b.forced_root_block){c.onKeyUp.add(f);c.onNodeChange.add(f)}};(function(c){var b=c.DOM,a=c.dom.Event,d=c.each,e=c.extend;c.create("tinymce.ControlManager",{ControlManager:function(f,j){var h=this,g;j=j||{};h.editor=f;h.controls={};h.onAdd=new c.util.Dispatcher(h);h.onPostRender=new c.util.Dispatcher(h);h.prefix=j.prefix||f.id+"_";h._cls={};h.onPostRender.add(function(){d(h.controls,function(i){i.postRender()})})},get:function(f){return this.controls[this.prefix+f]||this.controls[f]},setActive:function(h,f){var g=null;if(g=this.get(h)){g.setActive(f)}return g},setDisabled:function(h,f){var g=null;if(g=this.get(h)){g.setDisabled(f)}return g},add:function(g){var f=this;if(g){f.controls[g.id]=g;f.onAdd.dispatch(g,f)}return g},createControl:function(j){var o,k,g,h=this,m=h.editor,n,f;if(!h.controlFactories){h.controlFactories=[];d(m.plugins,function(i){if(i.createControl){h.controlFactories.push(i)}})}n=h.controlFactories;for(k=0,g=n.length;k1||ag==ay||ag.tagName=="BR"){return ag}}}var aq=aa.selection.getRng();var av=aq.startContainer;var ap=aq.endContainer;if(av!=ap&&aq.endOffset===0){var au=ar(av,ap);var at=au.nodeType==3?au.length:au.childNodes.length;aq.setEnd(au,at)}return aq}function ad(at,ay,aw,av,aq){var ap=[],ar=-1,ax,aA=-1,au=-1,az;T(at.childNodes,function(aC,aB){if(aC.nodeName==="UL"||aC.nodeName==="OL"){ar=aB;ax=aC;return false}});T(at.childNodes,function(aC,aB){if(aC.nodeName==="SPAN"&&c.getAttrib(aC,"data-mce-type")=="bookmark"){if(aC.id==ay.id+"_start"){aA=aB}else{if(aC.id==ay.id+"_end"){au=aB}}}});if(ar<=0||(aAar)){T(a.grep(at.childNodes),aq);return 0}else{az=c.clone(aw,X);T(a.grep(at.childNodes),function(aC,aB){if((aAar&&aB>ar)){ap.push(aC);aC.parentNode.removeChild(aC)}});if(aAar){at.insertBefore(az,ax.nextSibling)}}av.push(az);T(ap,function(aB){az.appendChild(aB)});return az}}function an(aq,at,aw){var ap=[],av,ar,au=true;av=am.inline||am.block;ar=c.create(av);ab(ar);N.walk(aq,function(ax){var ay;function az(aA){var aF,aD,aB,aC,aE;aE=au;aF=aA.nodeName.toLowerCase();aD=aA.parentNode.nodeName.toLowerCase();if(aA.nodeType===1&&x(aA)){aE=au;au=x(aA)==="true";aC=true}if(g(aF,"br")){ay=0;if(am.block){c.remove(aA)}return}if(am.wrapper&&y(aA,ae,al)){ay=0;return}if(au&&!aC&&am.block&&!am.wrapper&&I(aF)){aA=c.rename(aA,av);ab(aA);ap.push(aA);ay=0;return}if(am.selector){T(ah,function(aG){if("collapsed" in aG&&aG.collapsed!==ai){return}if(c.is(aA,aG.selector)&&!b(aA)){ab(aA,aG);aB=true}});if(!am.inline||aB){ay=0;return}}if(au&&!aC&&d(av,aF)&&d(aD,av)&&!(!aw&&aA.nodeType===3&&aA.nodeValue.length===1&&aA.nodeValue.charCodeAt(0)===65279)&&!b(aA)){if(!ay){ay=c.clone(ar,X);aA.parentNode.insertBefore(ay,aA);ap.push(ay)}ay.appendChild(aA)}else{if(aF=="li"&&at){ay=ad(aA,at,ar,ap,az)}else{ay=0;T(a.grep(aA.childNodes),az);if(aC){au=aE}ay=0}}}T(ax,az)});if(am.wrap_links===false){T(ap,function(ax){function ay(aC){var aB,aA,az;if(aC.nodeName==="A"){aA=c.clone(ar,X);ap.push(aA);az=a.grep(aC.childNodes);for(aB=0;aB1||!H(az))&&ax===0){c.remove(az,1);return}if(am.inline||am.wrapper){if(!am.exact&&ax===1){az=ay(az)}T(ah,function(aB){T(c.select(aB.inline,az),function(aD){var aC;if(aB.wrap_links===false){aC=aD.parentNode;do{if(aC.nodeName==="A"){return}}while(aC=aC.parentNode)}Z(aB,al,aD,aB.exact?aD:null)})});if(y(az.parentNode,ae,al)){c.remove(az,1);az=0;return C}if(am.merge_with_parents){c.getParent(az.parentNode,function(aB){if(y(aB,ae,al)){c.remove(az,1);az=0;return C}})}if(az&&am.merge_siblings!==false){az=u(E(az),az);az=u(az,E(az,C))}}})}if(am){if(ag){if(ag.nodeType){ac=c.createRng();ac.setStartBefore(ag);ac.setEndAfter(ag);an(p(ac,ah),null,true)}else{an(ag,null,true)}}else{if(!ai||!am.inline||c.select("td.mceSelected,th.mceSelected").length){var ao=aa.selection.getNode();if(!m&&ah[0].defaultBlock&&!c.getParent(ao,c.isBlock)){Y(ah[0].defaultBlock)}aa.selection.setRng(af());ak=r.getBookmark();an(p(r.getRng(C),ah),ak);if(am.styles&&(am.styles.color||am.styles.textDecoration)){a.walk(ao,L,"childNodes");L(ao)}r.moveToBookmark(ak);R(r.getRng(C));aa.nodeChanged()}else{U("apply",ae,al)}}}}function B(ad,am,af){var ag=V(ad),ao=ag[0],ak,aj,ac,al=true;function ae(av){var au,at,ar,aq,ax,aw;if(av.nodeType===3){return}if(av.nodeType===1&&x(av)){ax=al;al=x(av)==="true";aw=true}au=a.grep(av.childNodes);if(al&&!aw){for(at=0,ar=ag.length;at=0;ac--){ab=ah[ac].selector;if(!ab){return C}for(ag=ad.length-1;ag>=0;ag--){if(c.is(ad[ag],ab)){return C}}}}return X}function J(ab,ae,ac){var ad;if(!P){P={};ad={};aa.onNodeChange.addToTop(function(ag,af,ai){var ah=n(ai),aj={};T(P,function(ak,al){T(ah,function(am){if(y(am,al,{},ak.similar)){if(!ad[al]){T(ak,function(an){an(true,{node:am,format:al,parents:ah})});ad[al]=ak}aj[al]=ak;return false}})});T(ad,function(ak,al){if(!aj[al]){delete ad[al];T(ak,function(am){am(false,{node:ai,format:al,parents:ah})})}})})}T(ab.split(","),function(af){if(!P[af]){P[af]=[];P[af].similar=ac}P[af].push(ae)});return this}a.extend(this,{get:V,register:l,apply:Y,remove:B,toggle:F,match:k,matchAll:v,matchNode:y,canApply:z,formatChanged:J});j();W();function h(ab,ac){if(g(ab,ac.inline)){return C}if(g(ab,ac.block)){return C}if(ac.selector){return c.is(ab,ac.selector)}}function g(ac,ab){ac=ac||"";ab=ab||"";ac=""+(ac.nodeName||ac);ab=""+(ab.nodeName||ab);return ac.toLowerCase()==ab.toLowerCase()}function O(ac,ab){var ad=c.getStyle(ac,ab);if(ab=="color"||ab=="backgroundColor"){ad=c.toHex(ad)}if(ab=="fontWeight"&&ad==700){ad="bold"}return""+ad}function q(ab,ac){if(typeof(ab)!="string"){ab=ab(ac)}else{if(ac){ab=ab.replace(/%(\w+)/g,function(ae,ad){return ac[ad]||ae})}}return ab}function f(ab){return ab&&ab.nodeType===3&&/^([\t \r\n]+|)$/.test(ab.nodeValue)}function S(ad,ac,ab){var ae=c.create(ac,ab);ad.parentNode.insertBefore(ae,ad);ae.appendChild(ad);return ae}function p(ab,am,ae){var ap,an,ah,al,ad=ab.startContainer,ai=ab.startOffset,ar=ab.endContainer,ak=ab.endOffset;function ao(aA){var au,ax,az,aw,av,at;au=ax=aA?ad:ar;av=aA?"previousSibling":"nextSibling";at=c.getRoot();function ay(aB){return aB.nodeName=="BR"&&aB.getAttribute("data-mce-bogus")&&!aB.nextSibling}if(au.nodeType==3&&!f(au)){if(aA?ai>0:akan?an:ai];if(ad.nodeType==3){ai=0}}if(ar.nodeType==1&&ar.hasChildNodes()){an=ar.childNodes.length-1;ar=ar.childNodes[ak>an?an:ak-1];if(ar.nodeType==3){ak=ar.nodeValue.length}}function aq(au){var at=au;while(at){if(at.nodeType===1&&x(at)){return x(at)==="false"?at:au}at=at.parentNode}return au}function aj(au,ay,aA){var ax,av,az,at;function aw(aC,aE){var aF,aB,aD=aC.nodeValue;if(typeof(aE)=="undefined"){aE=aA?aD.length:0}if(aA){aF=aD.lastIndexOf(" ",aE);aB=aD.lastIndexOf("\u00a0",aE);aF=aF>aB?aF:aB;if(aF!==-1&&!ae){aF++}}else{aF=aD.indexOf(" ",aE);aB=aD.indexOf("\u00a0",aE);aF=aF!==-1&&(aB===-1||aF0&&ah.node.nodeType===3&&ah.node.nodeValue.charAt(ah.offset-1)===" "){if(ah.offset>1){ar=ah.node;ar.splitText(ah.offset-1)}}}}if(am[0].inline||am[0].block_expand){if(!am[0].inline||(ad.nodeType!=3||ai===0)){ad=ao(true)}if(!am[0].inline||(ar.nodeType!=3||ak===ar.nodeValue.length)){ar=ao()}}if(am[0].selector&&am[0].expand!==X&&!am[0].inline){ad=af(ad,"previousSibling");ar=af(ar,"nextSibling")}if(am[0].block||am[0].selector){ad=ac(ad,"previousSibling");ar=ac(ar,"nextSibling");if(am[0].block){if(!H(ad)){ad=ao(true)}if(!H(ar)){ar=ao()}}}if(ad.nodeType==1){ai=s(ad);ad=ad.parentNode}if(ar.nodeType==1){ak=s(ar)+1;ar=ar.parentNode}return{startContainer:ad,startOffset:ai,endContainer:ar,endOffset:ak}}function Z(ah,ag,ae,ab){var ad,ac,af;if(!h(ae,ah)){return X}if(ah.remove!="all"){T(ah.styles,function(aj,ai){aj=q(aj,ag);if(typeof(ai)==="number"){ai=aj;ab=0}if(!ab||g(O(ab,ai),aj)){c.setStyle(ae,ai,"")}af=1});if(af&&c.getAttrib(ae,"style")==""){ae.removeAttribute("style");ae.removeAttribute("data-mce-style")}T(ah.attributes,function(ak,ai){var aj;ak=q(ak,ag);if(typeof(ai)==="number"){ai=ak;ab=0}if(!ab||g(c.getAttrib(ab,ai),ak)){if(ai=="class"){ak=c.getAttrib(ae,ai);if(ak){aj="";T(ak.split(/\s+/),function(al){if(/mce\w+/.test(al)){aj+=(aj?" ":"")+al}});if(aj){c.setAttrib(ae,ai,aj);return}}}if(ai=="class"){ae.removeAttribute("className")}if(e.test(ai)){ae.removeAttribute("data-mce-"+ai)}ae.removeAttribute(ai)}});T(ah.classes,function(ai){ai=q(ai,ag);if(!ab||c.hasClass(ab,ai)){c.removeClass(ae,ai)}});ac=c.getAttribs(ae);for(ad=0;adad?ad:af]}if(ab.nodeType===3&&ag&&af>=ab.nodeValue.length){ab=new t(ab,aa.getBody()).next()||ab}if(ab.nodeType===3&&!ag&&af===0){ab=new t(ab,aa.getBody()).prev()||ab}return ab}function U(ak,ab,ai){var al="_mce_caret",ac=aa.settings.caret_debug;function ad(ap){var ao=c.create("span",{id:al,"data-mce-bogus":true,style:ac?"color:red":""});if(ap){ao.appendChild(aa.getDoc().createTextNode(G))}return ao}function aj(ap,ao){while(ap){if((ap.nodeType===3&&ap.nodeValue!==G)||ap.childNodes.length>1){return false}if(ao&&ap.nodeType===1){ao.push(ap)}ap=ap.firstChild}return true}function ag(ao){while(ao){if(ao.id===al){return ao}ao=ao.parentNode}}function af(ao){var ap;if(ao){ap=new t(ao,ao);for(ao=ap.current();ao;ao=ap.next()){if(ao.nodeType===3){return ao}}}}function ae(aq,ap){var ar,ao;if(!aq){aq=ag(r.getStart());if(!aq){while(aq=c.get(al)){ae(aq,false)}}}else{ao=r.getRng(true);if(aj(aq)){if(ap!==false){ao.setStartBefore(aq);ao.setEndBefore(aq)}c.remove(aq)}else{ar=af(aq);if(ar.nodeValue.charAt(0)===G){ar=ar.deleteData(0,1)}c.remove(aq,1)}r.setRng(ao)}}function ah(){var aq,ao,av,au,ar,ap,at;aq=r.getRng(true);au=aq.startOffset;ap=aq.startContainer;at=ap.nodeValue;ao=ag(r.getStart());if(ao){av=af(ao)}if(at&&au>0&&au=0;at--){aq.appendChild(c.clone(ax[at],false));aq=aq.firstChild}aq.appendChild(c.doc.createTextNode(G));aq=aq.firstChild;c.insertAfter(aw,ay);r.setCursorLocation(aq,1)}}function an(){var ap,ao,aq;ao=ag(r.getStart());if(ao&&!c.isEmpty(ao)){a.walk(ao,function(ar){if(ar.nodeType==1&&ar.id!==al&&!c.isEmpty(ar)){c.setAttrib(ar,"data-mce-bogus",null)}},"childNodes")}}if(!self._hasCaretEvents){aa.onBeforeGetContent.addToTop(function(){var ao=[],ap;if(aj(ag(r.getStart()),ao)){ap=ao.length;while(ap--){c.setAttrib(ao[ap],"data-mce-bogus","1")}}});a.each("onMouseUp onKeyUp".split(" "),function(ao){aa[ao].addToTop(function(){ae();an()})});aa.onKeyDown.addToTop(function(ao,aq){var ap=aq.keyCode;if(ap==8||ap==37||ap==39){ae(ag(r.getStart()))}an()});r.onSetContent.add(an);self._hasCaretEvents=true}if(ak=="apply"){ah()}else{am()}}function R(ac){var ab=ac.startContainer,ai=ac.startOffset,ae,ah,ag,ad,af;if(ab.nodeType==3&&ai>=ab.nodeValue.length){ai=s(ab);ab=ab.parentNode;ae=true}if(ab.nodeType==1){ad=ab.childNodes;ab=ad[Math.min(ai,ad.length-1)];ah=new t(ab,c.getParent(ab,c.isBlock));if(ai>ad.length-1||ae){ah.next()}for(ag=ah.current();ag;ag=ah.next()){if(ag.nodeType==3&&!f(ag)){af=c.create("a",null,G);ag.parentNode.insertBefore(af,ag);ac.setStart(ag,0);r.setRng(ac);c.remove(af);return}}}}}})(tinymce);tinymce.onAddEditor.add(function(e,a){var d,h,g,c=a.settings;function b(j,i){e.each(i,function(l,k){if(l){g.setStyle(j,k,l)}});g.rename(j,"span")}function f(i,j){g=i.dom;if(c.convert_fonts_to_spans){e.each(g.select("font,u,strike",j.node),function(k){d[k.nodeName.toLowerCase()](a.dom,k)})}}if(c.inline_styles){h=e.explode(c.font_size_legacy_values);d={font:function(j,i){b(i,{backgroundColor:i.style.backgroundColor,color:i.color,fontFamily:i.face,fontSize:h[parseInt(i.size,10)-1]})},u:function(j,i){b(i,{textDecoration:"underline"})},strike:function(j,i){b(i,{textDecoration:"line-through"})}};a.onPreProcess.add(f);a.onSetContent.add(f);a.onInit.add(function(){a.selection.onSetContent.add(f)})}});(function(b){var a=b.dom.TreeWalker;b.EnterKey=function(f){var i=f.dom,e=f.selection,d=f.settings,h=f.undoManager,c=f.schema.getNonEmptyElements();function g(A){var v=e.getRng(true),G,j,z,u,p,M,B,o,k,n,t,J,x,C;function E(N){return N&&i.isBlock(N)&&!/^(TD|TH|CAPTION|FORM)$/.test(N.nodeName)&&!/^(fixed|absolute)/i.test(N.style.position)&&i.getContentEditable(N)!=="true"}function F(O){var N;if(b.isIE&&i.isBlock(O)){N=e.getRng();O.appendChild(i.create("span",null,"\u00a0"));e.select(O);O.lastChild.outerHTML="";e.setRng(N)}}function y(P){var O=P,Q=[],N;while(O=O.firstChild){if(i.isBlock(O)){return}if(O.nodeType==1&&!c[O.nodeName.toLowerCase()]){Q.push(O)}}N=Q.length;while(N--){O=Q[N];if(!O.hasChildNodes()||(O.firstChild==O.lastChild&&O.firstChild.nodeValue==="")){i.remove(O)}else{if(O.nodeName=="A"&&(O.innerText||O.textContent)===" "){i.remove(O)}}}}function m(O){var T,R,N,U,S,Q=O,P;N=i.createRng();if(O.hasChildNodes()){T=new a(O,O);while(R=T.current()){if(R.nodeType==3){N.setStart(R,0);N.setEnd(R,0);break}if(c[R.nodeName.toLowerCase()]){N.setStartBefore(R);N.setEndBefore(R);break}Q=R;R=T.next()}if(!R){N.setStart(Q,0);N.setEnd(Q,0)}}else{if(O.nodeName=="BR"){if(O.nextSibling&&i.isBlock(O.nextSibling)){if(!M||M<9){P=i.create("br");O.parentNode.insertBefore(P,O)}N.setStartBefore(O);N.setEndBefore(O)}else{N.setStartAfter(O);N.setEndAfter(O)}}else{N.setStart(O,0);N.setEnd(O,0)}}e.setRng(N);i.remove(P);S=i.getViewPort(f.getWin());U=i.getPos(O).y;if(US.y+S.h){f.getWin().scrollTo(0,U'}return R}function q(Q){var P,O,N;if(z.nodeType==3&&(Q?u>0:u=z.nodeValue.length){if(!b.isIE&&!D()){P=i.create("br");v.insertNode(P);v.setStartAfter(P);v.setEndAfter(P);O=true}}P=i.create("br");v.insertNode(P);if(b.isIE&&t=="PRE"&&(!M||M<8)){P.parentNode.insertBefore(i.doc.createTextNode("\r"),P)}N=i.create("span",{}," ");P.parentNode.insertBefore(N,P);e.scrollIntoView(N);i.remove(N);if(!O){v.setStartAfter(P);v.setEndAfter(P)}else{v.setStartBefore(P);v.setEndBefore(P)}e.setRng(v);h.add()}function s(N){do{if(N.nodeType===3){N.nodeValue=N.nodeValue.replace(/^[\r\n]+/,"")}N=N.firstChild}while(N)}function K(P){var N=i.getRoot(),O,Q;O=P;while(O!==N&&i.getContentEditable(O)!=="false"){if(i.getContentEditable(O)==="true"){Q=O}O=O.parentNode}return O!==N?Q:N}function I(O){var N;if(!b.isIE){O.normalize();N=O.lastChild;if(!N||(/^(left|right)$/gi.test(i.getStyle(N,"float",true)))){i.add(O,"br")}}}if(!v.collapsed){f.execCommand("Delete");return}if(A.isDefaultPrevented()){return}z=v.startContainer;u=v.startOffset;x=(d.force_p_newlines?"p":"")||d.forced_root_block;x=x?x.toUpperCase():"";M=i.doc.documentMode;B=A.shiftKey;if(z.nodeType==1&&z.hasChildNodes()){C=u>z.childNodes.length-1;z=z.childNodes[Math.min(u,z.childNodes.length-1)]||z;if(C&&z.nodeType==3){u=z.nodeValue.length}else{u=0}}j=K(z);if(!j){return}h.beforeChange();if(!i.isBlock(j)&&j!=i.getRoot()){if(!x||B){L()}return}if((x&&!B)||(!x&&B)){z=l(z,u)}p=i.getParent(z,i.isBlock);n=p?i.getParent(p.parentNode,i.isBlock):null;t=p?p.nodeName.toUpperCase():"";J=n?n.nodeName.toUpperCase():"";if(J=="LI"&&!A.ctrlKey){p=n;t=J}if(t=="LI"){if(!x&&B){L();return}if(i.isEmpty(p)){if(/^(UL|OL|LI)$/.test(n.parentNode.nodeName)){return false}H();return}}if(t=="PRE"&&d.br_in_pre!==false){if(!B){L();return}}else{if((!x&&!B&&t!="LI")||(x&&B)){L();return}}x=x||"P";if(q()){if(/^(H[1-6]|PRE)$/.test(t)&&J!="HGROUP"){o=r(x)}else{o=r()}if(d.end_container_on_empty_block&&E(n)&&i.isEmpty(p)){o=i.split(n,p)}else{i.insertAfter(o,p)}m(o)}else{if(q(true)){o=p.parentNode.insertBefore(r(),p);F(o)}else{G=v.cloneRange();G.setEndAfter(p);k=G.extractContents();s(k);o=k.firstChild;i.insertAfter(k,p);y(o);I(p);m(o)}}i.setAttrib(o,"id","");h.add()}f.onKeyDown.add(function(k,j){if(j.keyCode==13){if(g(j)!==false){j.preventDefault()}}})}})(tinymce);
\ No newline at end of file
diff --git a/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce_popup.js b/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce_popup.js
new file mode 100644
index 0000000..bb8e58c
--- /dev/null
+++ b/static/grappelli/tinymce/jscripts/tiny_mce/tiny_mce_popup.js
@@ -0,0 +1,5 @@
+
+// Uncomment and change this document.domain value if you are loading the script cross subdomains
+// document.domain = 'moxiecode.com';
+
+var tinymce=null,tinyMCEPopup,tinyMCE;tinyMCEPopup={init:function(){var b=this,a,c;a=b.getWin();tinymce=a.tinymce;tinyMCE=a.tinyMCE;b.editor=tinymce.EditorManager.activeEditor;b.params=b.editor.windowManager.params;b.features=b.editor.windowManager.features;b.dom=b.editor.windowManager.createInstance("tinymce.dom.DOMUtils",document,{ownEvents:true,proxy:tinyMCEPopup._eventProxy});b.dom.bind(window,"ready",b._onDOMLoaded,b);if(b.features.popup_css!==false){b.dom.loadCSS(b.features.popup_css||b.editor.settings.popup_css)}b.listeners=[];b.onInit={add:function(e,d){b.listeners.push({func:e,scope:d})}};b.isWindow=!b.getWindowArg("mce_inline");b.id=b.getWindowArg("mce_window_id");b.editor.windowManager.onOpen.dispatch(b.editor.windowManager,window)},getWin:function(){return(!window.frameElement&&window.dialogArguments)||opener||parent||top},getWindowArg:function(c,b){var a=this.params[c];return tinymce.is(a)?a:b},getParam:function(b,a){return this.editor.getParam(b,a)},getLang:function(b,a){return this.editor.getLang(b,a)},execCommand:function(d,c,e,b){b=b||{};b.skip_focus=1;this.restoreSelection();return this.editor.execCommand(d,c,e,b)},resizeToInnerSize:function(){var a=this;setTimeout(function(){var b=a.dom.getViewPort(window);a.editor.windowManager.resizeBy(a.getWindowArg("mce_width")-b.w,a.getWindowArg("mce_height")-b.h,a.id||window)},10)},executeOnLoad:function(s){this.onInit.add(function(){eval(s)})},storeSelection:function(){this.editor.windowManager.bookmark=tinyMCEPopup.editor.selection.getBookmark(1)},restoreSelection:function(){var a=tinyMCEPopup;if(!a.isWindow&&tinymce.isIE){a.editor.selection.moveToBookmark(a.editor.windowManager.bookmark)}},requireLangPack:function(){var b=this,a=b.getWindowArg("plugin_url")||b.getWindowArg("theme_url");if(a&&b.editor.settings.language&&b.features.translate_i18n!==false&&b.editor.settings.language_load!==false){a+="/langs/"+b.editor.settings.language+"_dlg.js";if(!tinymce.ScriptLoader.isDone(a)){document.write('