Modificações para funcionar corretamente na versão 1.4 do Django
diff --git a/dojopuzzles/contribuicoes/__init__.py b/dojopuzzles/contribuicoes/__init__.py
new file mode 100644
index 0000000..e69de29
--- /dev/null
+++ b/dojopuzzles/contribuicoes/__init__.py
diff --git a/dojopuzzles/contribuicoes/forms.py b/dojopuzzles/contribuicoes/forms.py
new file mode 100644
index 0000000..2367406
--- /dev/null
+++ b/dojopuzzles/contribuicoes/forms.py
@@ -0,0 +1,29 @@
+# -*- coding: utf-8 -*-
+from django import forms
+
+ASSUNTO_CHOICES = (
+    ('', '---------'),
+    ('PROBLEMA_NOVO', u'Envio de novo problema'),
+    ('CONTATO', 'Quero entrar em contato com a equipe'),
+)
+
+
+class ContribuicaoForm(forms.Form):
+    """ Formulário que recebe as contribuições para o projeto """
+    nome = forms.CharField(max_length=100, label='Seu Nome')
+    email = forms.EmailField(label='Seu e-mail')
+    assunto = forms.ChoiceField(label='Assunto',
+                                choices=ASSUNTO_CHOICES)
+    titulo_problema = forms.CharField(max_length=100, label=u'Título do Problema', required=False)
+    mensagem = forms.CharField(label='Sua Mensagem', widget=forms.widgets.Textarea(attrs={'rows': 15, 'cols': 60}))
+
+    def clean(self):
+        cleaned_data = self.cleaned_data
+
+        assunto = cleaned_data.get('assunto')
+        titulo_problema = cleaned_data.get('titulo_problema')
+
+        if assunto == 'PROBLEMA_NOVO' and len(titulo_problema) == 0:
+            raise forms.ValidationError(u"Informe o título do problema.")
+
+        return cleaned_data
diff --git a/dojopuzzles/contribuicoes/models.py b/dojopuzzles/contribuicoes/models.py
new file mode 100644
index 0000000..71a8362
--- /dev/null
+++ b/dojopuzzles/contribuicoes/models.py
@@ -0,0 +1,3 @@
+from django.db import models
+
+# Create your models here.
diff --git a/dojopuzzles/contribuicoes/tests/__init__.py b/dojopuzzles/contribuicoes/tests/__init__.py
new file mode 100644
index 0000000..13c3ee3
--- /dev/null
+++ b/dojopuzzles/contribuicoes/tests/__init__.py
@@ -0,0 +1,5 @@
+from view_test import *
+
+__test__ = {
+        "view_test": view_test,
+        }
diff --git a/dojopuzzles/contribuicoes/tests/view_test.py b/dojopuzzles/contribuicoes/tests/view_test.py
new file mode 100644
index 0000000..6f2ed91
--- /dev/null
+++ b/dojopuzzles/contribuicoes/tests/view_test.py
@@ -0,0 +1,115 @@
+# -*- coding: utf-8 -*-
+from django.test import TestCase
+from django.test.client import Client
+
+from django.core import mail
+from django.core.urlresolvers import reverse
+
+from dojopuzzles.contribuicoes.forms import ContribuicaoForm
+
+
+class EnvioContribuicaoTestCase(TestCase):
+
+    def setUp(self):
+        self.client = Client()
+
+    def test_deve_existir_url(self):
+        """
+        A URL para acesso à página de contribuições deve existir.
+        """
+        response = self.client.get(reverse('contribua'))
+        self.assertNotEqual(response.status_code, 404)
+        self.assertContains(response, "<title>DojoPuzzles.com - Contribua</title>", 1)
+
+    def test_deve_renderizar_formulario_correto(self):
+        """
+        Ao acessar a página de contribuições, o formulário criado deve ser do tipo correto.
+        """
+        response = self.client.get(reverse('contribua'))
+        self.assertEqual(response.status_code, 200)
+        self.assertTemplateUsed(response, 'contribua.html')
+        self.assertEqual(type(response.context['form']), ContribuicaoForm)
+
+    def test_deve_enviar_email_com_dados_do_formulario_preenchido(self):
+        """
+        Preenchendo o formulário para contato deve enviar e-mail para o destinatário adequado.
+        """
+        self.assertEqual(len(mail.outbox), 0)
+        dados_formulario = {'nome': 'Usuario Teste',
+                            'email': 'usuario@teste.com',
+                            'assunto': 'CONTATO',
+                            'mensagem': 'Esta mensagem de teste', }
+        response = self.client.post(reverse('contribua'), dados_formulario)
+        self.assertEqual(len(mail.outbox), 1)
+        self.assertEqual(mail.outbox[0].body, 'Esta mensagem de teste')
+        self.assertEqual(mail.outbox[0].subject, 'DojoPuzzles.com - Contato realizado através do site')
+        self.assertEqual(mail.outbox[0].from_email, 'usuario@teste.com')
+        self.assertEqual(mail.outbox[0].to, ['contato@dojopuzzles.com'])
+        self.assertRedirects(response, reverse('contribuicao-recebida'))
+
+    def test_deve_enviar_email_de_agradecimento_ao_remetente(self):
+        """
+        Preenchendo o formulário para envio de um novo problema deve enviar e-mail de agradecimento
+        confirmando o recebimento para o usuário e um e-mail com o novo problema para o administrador
+        do sistema.
+        """
+        self.assertEqual(len(mail.outbox), 0)
+        dados_formulario = {'nome': 'Usuario Teste',
+                            'email': 'usuario@teste.com',
+                            'assunto': 'PROBLEMA_NOVO',
+                            'titulo_problema': 'Problema Teste',
+                            'mensagem': 'Esta mensagem de teste', }
+        response = self.client.post(reverse('contribua'), dados_formulario)
+        self.assertEqual(len(mail.outbox), 2)
+
+        from dojopuzzles.contribuicoes.views import MENSAGEM_AGRADECIMENTO
+        self.assertEqual(mail.outbox[0].body, MENSAGEM_AGRADECIMENTO.format('Usuario Teste'))
+        self.assertEqual(mail.outbox[0].subject, 'DojoPuzzles.com - Obrigado pela contribuição')
+        self.assertEqual(mail.outbox[0].from_email, 'contato@dojopuzzles.com')
+        self.assertEqual(mail.outbox[0].to, ['usuario@teste.com'])
+
+        self.assertEqual(mail.outbox[1].body, 'Esta mensagem de teste')
+        self.assertEqual(mail.outbox[1].subject, 'DojoPuzzles.com - Nova contribuição de problema')
+        self.assertEqual(mail.outbox[1].from_email, 'usuario@teste.com')
+        self.assertEqual(mail.outbox[1].to, ['contato@dojopuzzles.com'])
+
+        self.assertRedirects(response, reverse('contribuicao-recebida'))
+
+    def test_contribuicao_de_problema_cria_novo_problema_no_bd(self):
+        """
+        Ao enviar um novo problema pelo formulário de contato deve cadastrar
+        esta contribuição na tabela de Problemas como um problema não publicado.
+        """
+        from dojopuzzles.problemas.models import Problema
+
+        self.assertEquals(Problema.objects.count(), 0)
+        dados_formulario = {'nome': 'Usuario Teste',
+                            'email': 'usuario@teste.com',
+                            'assunto': 'PROBLEMA_NOVO',
+                            'titulo_problema': 'Problema Teste',
+                            'mensagem': 'Esta mensagem de teste', }
+        response = self.client.post(reverse('contribua'), dados_formulario)
+
+        self.assertEquals(Problema.objects.count(), 1)
+        problema = Problema.objects.all()[0]
+
+        self.assertEquals(problema.titulo, 'Problema Teste')
+        self.assertEquals(problema.descricao, 'Esta mensagem de teste')
+        self.assertEquals(problema.nome_contribuidor, 'Usuario Teste')
+        self.assertFalse(problema.publicado)
+
+    def test_contribuicao_problema_deve_ter_titulo(self):
+        """
+        Ao contribuir com um problema, o campo 'Título do Problema' deve ser de preenchimento
+        obrigatório.
+        """
+        from dojopuzzles.problemas.models import Problema
+
+        self.assertEquals(Problema.objects.count(), 0)
+        dados_formulario = {'nome': 'Usuario Teste',
+                            'email': 'usuario@teste.com',
+                            'assunto': 'PROBLEMA_NOVO',
+                            'mensagem': 'Esta mensagem de teste', }
+        response = self.client.post(reverse('contribua'), dados_formulario)
+        self.assertContains(response, 'Informe o título do problema.', 1)
+        self.assertEquals(Problema.objects.count(), 0)
diff --git a/dojopuzzles/contribuicoes/urls.py b/dojopuzzles/contribuicoes/urls.py
new file mode 100644
index 0000000..f2c3615
--- /dev/null
+++ b/dojopuzzles/contribuicoes/urls.py
@@ -0,0 +1,7 @@
+#!-*- coding: utf-8 -*-
+from django.conf.urls.defaults import *
+
+urlpatterns = patterns('',
+    url(r'^contribua/$', 'contribuicoes.views.contribuicao', name='contribua'),
+    url(r'^recebida/$', 'contribuicoes.views.contribuicao_recebida', name='contribuicao-recebida'),
+)
diff --git a/dojopuzzles/contribuicoes/views.py b/dojopuzzles/contribuicoes/views.py
new file mode 100644
index 0000000..4ab2f3f
--- /dev/null
+++ b/dojopuzzles/contribuicoes/views.py
@@ -0,0 +1,81 @@
+#-*- coding: utf-8 -*-
+from django.contrib import messages
+from django.core.mail import send_mail
+from django.core.urlresolvers import reverse
+from django.http import HttpResponseRedirect
+from django.shortcuts import render_to_response
+from django.template import RequestContext
+
+from contribuicoes.forms import ContribuicaoForm
+from problemas.models import Problema
+
+MENSAGEM_AGRADECIMENTO = """
+  {0},
+
+  Obrigado por colaborar com o DojoPuzzles.com. O seu problema enviado será analisado e caso realmente atenda aos nossos critérios ele será em breve disponibilizado para todos os nossos visitantes (você será avisado).
+
+  Nós tomamos o direito de, a nosso critério, editar o texto dos problemas para:
+  - Corrigir de eventuais erros de digitação;
+  - Tornar as descrições mais curtas, sem alterar o objetivo do problema.
+
+  Caso não concorde com isso, responda esse e-mail informando que não deseja que o corpo do problema seja alterado ou que o problema seja publicado.
+
+  Atenciosamente,
+
+  DojoPuzzles.com"""
+
+
+def _enviar_email_contato(form, agradecer=False):
+    operacao = form.cleaned_data['assunto']
+    email = {}
+
+    if agradecer == True:
+        email['subject'] = 'DojoPuzzles.com - Obrigado pela contribuição'
+        email['message'] = MENSAGEM_AGRADECIMENTO.format(form.cleaned_data['nome'])
+        email['recipient_list'] = [form.cleaned_data['email']]
+        email['from_email'] = 'contato@dojopuzzles.com'
+        send_mail(**email)
+
+    if operacao == 'CONTATO':
+        email['subject'] = 'DojoPuzzles.com - Contato realizado através do site'
+    elif operacao == 'PROBLEMA_NOVO':
+        email['subject'] = 'DojoPuzzles.com - Nova contribuição de problema'
+
+    email['message'] = form.cleaned_data['mensagem']
+    email['from_email'] = form.cleaned_data['email']
+    email['recipient_list'] = ['contato@dojopuzzles.com']
+    email['fail_silently'] = False
+    send_mail(**email)
+
+
+def contribuicao(request):
+    form = ContribuicaoForm(request.POST or None)
+    if form.is_valid():
+        operacao = form.cleaned_data['assunto']
+
+        if operacao == 'CONTATO':
+            _enviar_email_contato(form)
+        if operacao == 'PROBLEMA_NOVO':
+            _enviar_email_contato(form, agradecer=True)
+            titulo_problema = form.cleaned_data['titulo_problema']
+            descricao_problema = form.cleaned_data['mensagem']
+            nome_remetente = form.cleaned_data['nome']
+            mensagem = form.cleaned_data['mensagem']
+            Problema.objects.create(titulo=titulo_problema,
+                                    descricao=mensagem,
+                                    nome_contribuidor=nome_remetente,
+                                    publicado=False)
+
+        return HttpResponseRedirect(reverse('contribuicao-recebida'))
+
+    titulo_pagina = 'Contribua'
+    return render_to_response('contribua.html',
+                              locals(),
+                              RequestContext(request))
+
+
+def contribuicao_recebida(request):
+    messages.add_message(request, messages.INFO, 'Mensagem enviada com sucesso. Obrigado pelo contato!')
+    return render_to_response('index.html',
+                              locals(),
+                              RequestContext(request))
diff --git a/dojopuzzles/dojopuzzles/settings.py b/dojopuzzles/dojopuzzles/settings.py
index 54e3cbc..c53a4be 100644
--- a/dojopuzzles/dojopuzzles/settings.py
+++ b/dojopuzzles/dojopuzzles/settings.py
@@ -1,7 +1,7 @@
 # -*- coding: utf-8 -*-
 # Django settings for dojopuzzles project.
 
-DEBUG = False
+DEBUG = True
 TEMPLATE_DEBUG = DEBUG
 
 ADMINS = (
@@ -121,6 +121,8 @@
     'django.contrib.staticfiles',
     'django.contrib.admin',
     'django.contrib.admindocs',
+    'problemas',
+    'contribuicoes',
 )
 
 # A sample logging configuration. The only tangible logging
diff --git a/dojopuzzles/dojopuzzles/urls.py b/dojopuzzles/dojopuzzles/urls.py
index 7e8138f..1e044b6 100644
--- a/dojopuzzles/dojopuzzles/urls.py
+++ b/dojopuzzles/dojopuzzles/urls.py
@@ -1,17 +1,26 @@
+# -*- coding: utf-8 -*-
 from django.conf.urls import patterns, include, url
 
+from problemas.models import ProblemaUtilizado
+
 # Uncomment the next two lines to enable the admin:
-# from django.contrib import admin
-# admin.autodiscover()
+from django.contrib import admin
+admin.autodiscover()
 
 urlpatterns = patterns('',
-    # Examples:
-    # url(r'^$', 'dojopuzzles.views.home', name='home'),
-    # url(r'^dojopuzzles/', include('dojopuzzles.foo.urls')),
+    (r'^problemas/', include('problemas.urls')),
+    (r'^contribuicoes/', include('contribuicoes.urls')),
+
+    url(r'^$', 'django.views.generic.simple.direct_to_template',
+        {'template': 'index.html',
+         'extra_context': {'problemas_utilizados': ProblemaUtilizado.objects.count}},
+         name='inicio'),
+    url(r'^sobre/$', 'django.views.generic.simple.direct_to_template',
+        {'template': 'sobre.html', 'extra_context': {'titulo_pagina': 'Sobre'}}, name='sobre'),
 
     # Uncomment the admin/doc line below to enable admin documentation:
-    # url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
+    url(r'^admin/doc/', include('django.contrib.admindocs.urls')),
 
     # Uncomment the next line to enable the admin:
-    # url(r'^admin/', include(admin.site.urls)),
+    url(r'^admin/', include(admin.site.urls)),
 )
diff --git a/dojopuzzles/media/base.css b/dojopuzzles/media/base.css
new file mode 100644
index 0000000..b27fe1f
--- /dev/null
+++ b/dojopuzzles/media/base.css
@@ -0,0 +1,161 @@
+@import 'reset.css';
+/*@import 'styles.css';*/
+
+body {
+    margin: 0px auto;
+}
+
+#logo {
+    height: 80px;
+    line-height: 80px;
+}
+
+#navigation {
+    border-top: 1px solid #D0C9B6;
+    border-bottom: 1px solid #D0C9B6;
+    height: 27px;
+    font-family: Verdana, sans-serif;
+    font-size: 13px;
+    font-weight:bold;
+}
+
+#navigation ul {
+    float: left;
+}
+
+#navigation ul li:before {
+    content: "\0020 \0020 \0020 \00BB \0020";
+    color: #E91B1B;
+}
+
+#navigation ul li {
+    display: inline;
+    margin: auto;
+    padding-left: 15px;
+    padding-right: 15px;
+    line-height: 27px;
+}
+
+#navigation a:link, a:visited, a:active, a:hover {
+    text-decoration: none;
+    color: #010101;
+}
+
+#navigation a:hover {
+    color: #E91B1B;
+}
+
+#navigation form {
+    float: right;
+}
+
+#navigation form input[type=text]  {
+    width: 150px;
+    margin-right: 10px;
+}
+
+#content {
+    font-family: Verdana, sans-serif;
+    font-size: 12px;
+    color: #696969;
+    line-height: 20px;
+}
+
+.one-column-content {
+    padding: 10px;
+}
+
+.one-column-content p {
+    padding-top: 5px;
+    padding-bottom: 5px;
+}
+
+.one-column-content ul {
+    list-style-type: circle;
+    line-height: 20px;
+    padding-left: 20px;
+}
+
+.one-column-content ol {
+    list-style-type: lower-roman;
+    padding-left: 25px;
+    line-height:25px;
+}
+
+.two-columns-content {
+    margin-top: 20px;
+    line-height: 25px;
+    font-family: Verdana, sans-serif;
+    font-size: 12px;
+    color: #4C4C4C;   
+}
+
+.box-content {
+    background: #ffffff;
+    filter: progid:DXImageTransform.Microsoft.gradient(startColorstr='#ffffff', endColorstr='#EEE9E9'); /* for IE */
+    background: -webkit-gradient(linear, left top, left bottom, from(#ffffff), to(#EEE9E9)); /* for webkit browsers */
+    background: -moz-linear-gradient(top,  #ffffff,  #EEE9E9); /* for firefox 3.6+ */
+    border: 1px solid #D0C9B6;
+    padding: 10px;
+}
+
+.one-column-content a:link, a:visited, a:active, a:hover {
+    text-decoration: none;
+    color: #010101;
+}
+
+.one-column-content a:hover {
+    color: #E91B1B;
+}
+
+.one-column-content ul {
+    list-style-type: square;
+    padding-left: 25px;
+    line-height:25px;
+}
+
+h1 {
+    font-family: Verdana, sans-serif;
+    color: #FF7700;
+    font-size: 24px;
+    margin-top: 10px;
+    margin-bottom: 15px;
+}
+
+h2 {
+    font-family: Verdana, sans-serif;
+    color: #FF7700;
+    margin-bottom: 10px;
+}
+
+/* Botões */
+a.button {
+    background: transparent url('img/bg_button_a.gif') no-repeat scroll top right;
+    color: #444;
+    display: block;
+    float: left;
+    font: normal 12px arial, sans-serif;
+    height: 24px;
+    margin-right: 6px;
+    padding-right: 18px; /* sliding doors padding */
+    text-decoration: none;
+}
+
+a.button span {
+    background: transparent url('img/bg_button_span.gif') no-repeat;
+    display: block;
+    line-height: 14px;
+    padding: 5px 0 5px 18px;
+}
+
+a.button:active {
+    background-position: bottom right;
+    color: #000;
+    outline: none; /* hide dotted outline in Firefox */
+}
+
+a.button:active span {
+    background-position: bottom left;
+    padding: 6px 0 4px 18px; /* push text down 1px */
+}
+
diff --git a/dojopuzzles/media/favicon.ico b/dojopuzzles/media/favicon.ico
new file mode 100644
index 0000000..1cd1d77
--- /dev/null
+++ b/dojopuzzles/media/favicon.ico
Binary files differ
diff --git a/dojopuzzles/media/grid.css b/dojopuzzles/media/grid.css
new file mode 100644
index 0000000..be3a346
--- /dev/null
+++ b/dojopuzzles/media/grid.css
@@ -0,0 +1,338 @@
+/*
+	Variable Grid System.
+	Learn more ~ http://www.spry-soft.com/grids/
+	Based on 960 Grid System - http://960.gs/
+
+	Licensed under GPL and MIT.
+*/
+
+
+/* Containers
+----------------------------------------------------------------------------------------------------*/
+.container_12 {
+	margin-left: auto;
+	margin-right: auto;
+	width: 960px;
+}
+
+/* Grid >> Global
+----------------------------------------------------------------------------------------------------*/
+
+.grid_1,
+.grid_2,
+.grid_3,
+.grid_4,
+.grid_5,
+.grid_6,
+.grid_7,
+.grid_8,
+.grid_9,
+.grid_10,
+.grid_11,
+.grid_12 {
+	display:inline;
+	float: left;
+	position: relative;
+	margin-left: 5px;
+	margin-right: 5px;
+}
+
+/* Grid >> Children (Alpha ~ First, Omega ~ Last)
+----------------------------------------------------------------------------------------------------*/
+
+.alpha {
+	margin-left: 0;
+}
+
+.omega {
+	margin-right: 0;
+}
+
+/* Grid >> 12 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_12 .grid_1 {
+	width:70px;
+}
+
+.container_12 .grid_2 {
+	width:150px;
+}
+
+.container_12 .grid_3 {
+	width:230px;
+}
+
+.container_12 .grid_4 {
+	width:310px;
+}
+
+.container_12 .grid_5 {
+	width:390px;
+}
+
+.container_12 .grid_6 {
+	width:470px;
+}
+
+.container_12 .grid_7 {
+	width:550px;
+}
+
+.container_12 .grid_8 {
+	width:630px;
+}
+
+.container_12 .grid_9 {
+	width:710px;
+}
+
+.container_12 .grid_10 {
+	width:790px;
+}
+
+.container_12 .grid_11 {
+	width:870px;
+}
+
+.container_12 .grid_12 {
+	width:950px;
+}
+
+
+
+/* Prefix Extra Space >> 12 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_12 .prefix_1 {
+	padding-left:80px;
+}
+
+.container_12 .prefix_2 {
+	padding-left:160px;
+}
+
+.container_12 .prefix_3 {
+	padding-left:240px;
+}
+
+.container_12 .prefix_4 {
+	padding-left:320px;
+}
+
+.container_12 .prefix_5 {
+	padding-left:400px;
+}
+
+.container_12 .prefix_6 {
+	padding-left:480px;
+}
+
+.container_12 .prefix_7 {
+	padding-left:560px;
+}
+
+.container_12 .prefix_8 {
+	padding-left:640px;
+}
+
+.container_12 .prefix_9 {
+	padding-left:720px;
+}
+
+.container_12 .prefix_10 {
+	padding-left:800px;
+}
+
+.container_12 .prefix_11 {
+	padding-left:880px;
+}
+
+
+
+/* Suffix Extra Space >> 12 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_12 .suffix_1 {
+	padding-right:80px;
+}
+
+.container_12 .suffix_2 {
+	padding-right:160px;
+}
+
+.container_12 .suffix_3 {
+	padding-right:240px;
+}
+
+.container_12 .suffix_4 {
+	padding-right:320px;
+}
+
+.container_12 .suffix_5 {
+	padding-right:400px;
+}
+
+.container_12 .suffix_6 {
+	padding-right:480px;
+}
+
+.container_12 .suffix_7 {
+	padding-right:560px;
+}
+
+.container_12 .suffix_8 {
+	padding-right:640px;
+}
+
+.container_12 .suffix_9 {
+	padding-right:720px;
+}
+
+.container_12 .suffix_10 {
+	padding-right:800px;
+}
+
+.container_12 .suffix_11 {
+	padding-right:880px;
+}
+
+
+
+/* Push Space >> 12 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_12 .push_1 {
+	left:80px;
+}
+
+.container_12 .push_2 {
+	left:160px;
+}
+
+.container_12 .push_3 {
+	left:240px;
+}
+
+.container_12 .push_4 {
+	left:320px;
+}
+
+.container_12 .push_5 {
+	left:400px;
+}
+
+.container_12 .push_6 {
+	left:480px;
+}
+
+.container_12 .push_7 {
+	left:560px;
+}
+
+.container_12 .push_8 {
+	left:640px;
+}
+
+.container_12 .push_9 {
+	left:720px;
+}
+
+.container_12 .push_10 {
+	left:800px;
+}
+
+.container_12 .push_11 {
+	left:880px;
+}
+
+
+
+/* Pull Space >> 12 Columns
+----------------------------------------------------------------------------------------------------*/
+
+.container_12 .pull_1 {
+	left:-80px;
+}
+
+.container_12 .pull_2 {
+	left:-160px;
+}
+
+.container_12 .pull_3 {
+	left:-240px;
+}
+
+.container_12 .pull_4 {
+	left:-320px;
+}
+
+.container_12 .pull_5 {
+	left:-400px;
+}
+
+.container_12 .pull_6 {
+	left:-480px;
+}
+
+.container_12 .pull_7 {
+	left:-560px;
+}
+
+.container_12 .pull_8 {
+	left:-640px;
+}
+
+.container_12 .pull_9 {
+	left:-720px;
+}
+
+.container_12 .pull_10 {
+	left:-800px;
+}
+
+.container_12 .pull_11 {
+	left:-880px;
+}
+
+
+
+
+/* Clear Floated Elements
+----------------------------------------------------------------------------------------------------*/
+
+/* http://sonspring.com/journal/clearing-floats */
+
+.clear {
+	clear: both;
+	display: block;
+	overflow: hidden;
+	visibility: hidden;
+	width: 0;
+	height: 0;
+}
+
+/* http://perishablepress.com/press/2008/02/05/lessons-learned-concerning-the-clearfix-css-hack */
+
+.clearfix:after {
+	clear: both;
+	content: ' ';
+	display: block;
+	font-size: 0;
+	line-height: 0;
+	visibility: hidden;
+	width: 0;
+	height: 0;
+}
+
+.clearfix {
+	display: inline-block;
+}
+
+* html .clearfix {
+	height: 1%;
+}
+
+.clearfix {
+	display: block;
+}
\ No newline at end of file
diff --git a/dojopuzzles/media/img/bg_button_a.gif b/dojopuzzles/media/img/bg_button_a.gif
new file mode 100644
index 0000000..c8e740d
--- /dev/null
+++ b/dojopuzzles/media/img/bg_button_a.gif
Binary files differ
diff --git a/dojopuzzles/media/img/bg_button_span.gif b/dojopuzzles/media/img/bg_button_span.gif
new file mode 100644
index 0000000..7da2e19
--- /dev/null
+++ b/dojopuzzles/media/img/bg_button_span.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/langs/en.js b/dojopuzzles/media/js/tiny_mce/langs/en.js
new file mode 100644
index 0000000..ea4a1b0
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/langs/en.js
@@ -0,0 +1,170 @@
+tinyMCE.addI18n({en:{

+common:{

+edit_confirm:"Do you want to use the WYSIWYG mode for this textarea?",

+apply:"Apply",

+insert:"Insert",

+update:"Update",

+cancel:"Cancel",

+close:"Close",

+browse:"Browse",

+class_name:"Class",

+not_set:"-- Not set --",

+clipboard_msg:"Copy/Cut/Paste is not available in Mozilla and Firefox.\nDo you want more information about this issue?",

+clipboard_no_support:"Currently not supported by your browser, use keyboard shortcuts instead.",

+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.",

+invalid_data:"Error: Invalid values entered, these are marked in red.",

+more_colors:"More colors"

+},

+contextmenu:{

+align:"Alignment",

+left:"Left",

+center:"Center",

+right:"Right",

+full:"Full"

+},

+insertdatetime:{

+date_fmt:"%Y-%m-%d",

+time_fmt:"%H:%M:%S",

+insertdate_desc:"Insert date",

+inserttime_desc:"Insert time",

+months_long:"January,February,March,April,May,June,July,August,September,October,November,December",

+months_short:"Jan,Feb,Mar,Apr,May,Jun,Jul,Aug,Sep,Oct,Nov,Dec",

+day_long:"Sunday,Monday,Tuesday,Wednesday,Thursday,Friday,Saturday,Sunday",

+day_short:"Sun,Mon,Tue,Wed,Thu,Fri,Sat,Sun"

+},

+print:{

+print_desc:"Print"

+},

+preview:{

+preview_desc:"Preview"

+},

+directionality:{

+ltr_desc:"Direction left to right",

+rtl_desc:"Direction right to left"

+},

+layer:{

+insertlayer_desc:"Insert new layer",

+forward_desc:"Move forward",

+backward_desc:"Move backward",

+absolute_desc:"Toggle absolute positioning",

+content:"New layer..."

+},

+save:{

+save_desc:"Save",

+cancel_desc:"Cancel all changes"

+},

+nonbreaking:{

+nonbreaking_desc:"Insert non-breaking space character"

+},

+iespell:{

+iespell_desc:"Run spell checking",

+download:"ieSpell not detected. Do you want to install it now?"

+},

+advhr:{

+advhr_desc:"Horizontal rule"

+},

+emotions:{

+emotions_desc:"Emotions"

+},

+searchreplace:{

+search_desc:"Find",

+replace_desc:"Find/Replace"

+},

+advimage:{

+image_desc:"Insert/edit image"

+},

+advlink:{

+link_desc:"Insert/edit link"

+},

+xhtmlxtras:{

+cite_desc:"Citation",

+abbr_desc:"Abbreviation",

+acronym_desc:"Acronym",

+del_desc:"Deletion",

+ins_desc:"Insertion",

+attribs_desc:"Insert/Edit Attributes"

+},

+style:{

+desc:"Edit CSS Style"

+},

+paste:{

+paste_text_desc:"Paste as Plain Text",

+paste_word_desc:"Paste from Word",

+selectall_desc:"Select All",

+plaintext_mode_sticky:"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.",

+plaintext_mode:"Paste is now in plain text mode. Click again to toggle back to regular paste mode."

+},

+paste_dlg:{

+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",

+text_linebreaks:"Keep linebreaks",

+word_title:"Use CTRL+V on your keyboard to paste the text into the window."

+},

+table:{

+desc:"Inserts a new table",

+row_before_desc:"Insert row before",

+row_after_desc:"Insert row after",

+delete_row_desc:"Delete row",

+col_before_desc:"Insert column before",

+col_after_desc:"Insert column after",

+delete_col_desc:"Remove column",

+split_cells_desc:"Split merged table cells",

+merge_cells_desc:"Merge table cells",

+row_desc:"Table row properties",

+cell_desc:"Table cell properties",

+props_desc:"Table properties",

+paste_row_before_desc:"Paste table row before",

+paste_row_after_desc:"Paste table row after",

+cut_row_desc:"Cut table row",

+copy_row_desc:"Copy table row",

+del:"Delete table",

+row:"Row",

+col:"Column",

+cell:"Cell"

+},

+autosave:{

+unload_msg:"The changes you made will be lost if you navigate away from this page.",

+restore_content:"Restore auto-saved content.",

+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?."

+},

+fullscreen:{

+desc:"Toggle fullscreen mode"

+},

+media:{

+desc:"Insert / edit embedded media",

+edit:"Edit embedded media"

+},

+fullpage:{

+desc:"Document properties"

+},

+template:{

+desc:"Insert predefined template content"

+},

+visualchars:{

+desc:"Visual control characters on/off."

+},

+spellchecker:{

+desc:"Toggle spellchecker",

+menu:"Spellchecker 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."

+},

+pagebreak:{

+desc:"Insert page break."

+},

+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"

+}}});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/license.txt b/dojopuzzles/media/js/tiny_mce/license.txt
new file mode 100644
index 0000000..60d6d4c
--- /dev/null
+++ b/dojopuzzles/media/js/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.

+

+    <one line to give the library's name and a brief idea of what it does.>

+    Copyright (C) <year>  <name of author>

+

+    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.

+

+  <signature of Ty Coon>, 1 April 1990

+  Ty Coon, President of Vice

+

+That's all there is to it!

+

+

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advhr/css/advhr.css b/dojopuzzles/media/js/tiny_mce/plugins/advhr/css/advhr.css
new file mode 100644
index 0000000..0e22834
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advhr/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/advhr/editor_plugin.js
new file mode 100644
index 0000000..4d3b062
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advhr/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/advhr/editor_plugin_src.js
new file mode 100644
index 0000000..0c652d3
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advhr/js/rule.js b/dojopuzzles/media/js/tiny_mce/plugins/advhr/js/rule.js
new file mode 100644
index 0000000..b6cbd66
--- /dev/null
+++ b/dojopuzzles/media/js/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 = '<hr';

+

+		if (f.size.value) {

+			h += ' size="' + f.size.value + '"';

+			st += ' height:' + f.size.value + 'px;';

+		}

+

+		if (f.width.value) {

+			h += ' width="' + f.width.value + (f.width2.value == '%' ? '%' : '') + '"';

+			st += ' width:' + f.width.value + (f.width2.value == '%' ? '%' : 'px') + ';';

+		}

+

+		if (f.noshade.checked) {

+			h += ' noshade="noshade"';

+			st += ' border-width: 1px; border-style: solid; border-color: #CCCCCC; color: #ffffff;';

+		}

+

+		if (ed.settings.inline_styles)

+			h += ' style="' + tinymce.trim(st) + '"';

+

+		h += ' />';

+

+		ed.execCommand("mceInsertContent", false, h);

+		tinyMCEPopup.close();

+	}

+};

+

+tinyMCEPopup.requireLangPack();

+tinyMCEPopup.onInit.add(AdvHRDialog.init, AdvHRDialog);

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advhr/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/advhr/langs/en_dlg.js
new file mode 100644
index 0000000..873bfd8
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advhr/langs/en_dlg.js
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('en.advhr_dlg',{

+width:"Width",

+size:"Height",

+noshade:"No shadow"

+});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advhr/rule.htm b/dojopuzzles/media/js/tiny_mce/plugins/advhr/rule.htm
new file mode 100644
index 0000000..fc37b2a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advhr/rule.htm
@@ -0,0 +1,57 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#advhr.advhr_desc}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="js/rule.js"></script>

+	<script type="text/javascript" src="../../utils/mctabs.js"></script>

+	<script type="text/javascript" src="../../utils/form_utils.js"></script>

+	<link href="css/advhr.css" rel="stylesheet" type="text/css" />

+</head>

+<body>

+<form onsubmit="AdvHRDialog.update();return false;" action="#">

+	<div class="tabs">

+		<ul>

+			<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advhr.advhr_desc}</a></span></li>

+		</ul>

+	</div>

+

+	<div class="panel_wrapper">

+		<div id="general_panel" class="panel current">

+			<table border="0" cellpadding="4" cellspacing="0">

+                    <tr>

+                        <td><label for="width">{#advhr_dlg.width}</label></td>

+                        <td class="nowrap">

+                            <input id="width" name="width" type="text" value="" class="mceFocus" />

+                            <select name="width2" id="width2">

+                                <option value="">px</option>

+                                <option value="%">%</option>

+                            </select>

+                        </td>

+                    </tr>

+                    <tr>

+                        <td><label for="size">{#advhr_dlg.size}</label></td>

+                        <td><select id="size" name="size">

+                            <option value="">Normal</option>

+                            <option value="1">1</option>

+                            <option value="2">2</option>

+                            <option value="3">3</option>

+                            <option value="4">4</option>

+                            <option value="5">5</option>

+                        </select></td>

+                    </tr>

+                    <tr>

+                        <td><label for="noshade">{#advhr_dlg.noshade}</label></td>

+                        <td><input type="checkbox" name="noshade" id="noshade" class="radio" /></td>

+                    </tr>

+            </table>

+		</div>

+	</div>

+

+	<div class="mceActionPanel">

+		<input type="submit" id="insert" name="insert" value="{#insert}" />

+		<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />

+	</div>

+</form>

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advimage/css/advimage.css b/dojopuzzles/media/js/tiny_mce/plugins/advimage/css/advimage.css
new file mode 100644
index 0000000..0a6251a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advimage/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/dojopuzzles/media/js/tiny_mce/plugins/advimage/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/advimage/editor_plugin.js
new file mode 100644
index 0000000..4c7a9c3
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advimage/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/advimage/editor_plugin_src.js
new file mode 100644
index 0000000..2625dd2
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advimage/image.htm b/dojopuzzles/media/js/tiny_mce/plugins/advimage/image.htm
new file mode 100644
index 0000000..79cff3f
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advimage/image.htm
@@ -0,0 +1,232 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#advimage_dlg.dialog_title}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="../../utils/mctabs.js"></script>

+	<script type="text/javascript" src="../../utils/form_utils.js"></script>

+	<script type="text/javascript" src="../../utils/validate.js"></script>

+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>

+	<script type="text/javascript" src="js/image.js"></script>

+	<link href="css/advimage.css" rel="stylesheet" type="text/css" />

+</head>

+<body id="advimage" style="display: none">

+    <form onsubmit="ImageDialog.insert();return false;" action="#"> 

+		<div class="tabs">

+			<ul>

+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advimage_dlg.tab_general}</a></span></li>

+				<li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#advimage_dlg.tab_appearance}</a></span></li>

+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advimage_dlg.tab_advanced}</a></span></li>

+			</ul>

+		</div>

+

+		<div class="panel_wrapper">

+			<div id="general_panel" class="panel current">

+				<fieldset>

+						<legend>{#advimage_dlg.general}</legend>

+

+						<table class="properties">

+							<tr>

+								<td class="column1"><label id="srclabel" for="src">{#advimage_dlg.src}</label></td>

+								<td colspan="2"><table border="0" cellspacing="0" cellpadding="0">

+									<tr> 

+									  <td><input name="src" type="text" id="src" value="" class="mceFocus" onchange="ImageDialog.showPreviewImage(this.value);" /></td> 

+									  <td id="srcbrowsercontainer">&nbsp;</td>

+									</tr>

+								  </table></td>

+							</tr>

+							<tr>

+								<td><label for="src_list">{#advimage_dlg.image_list}</label></td>

+								<td><select id="src_list" name="src_list" onchange="document.getElementById('src').value=this.options[this.selectedIndex].value;document.getElementById('alt').value=this.options[this.selectedIndex].text;document.getElementById('title').value=this.options[this.selectedIndex].text;ImageDialog.showPreviewImage(this.options[this.selectedIndex].value);"><option value=""></option></select></td>

+							</tr>

+							<tr> 

+								<td class="column1"><label id="altlabel" for="alt">{#advimage_dlg.alt}</label></td> 

+								<td colspan="2"><input id="alt" name="alt" type="text" value="" /></td> 

+							</tr> 

+							<tr> 

+								<td class="column1"><label id="titlelabel" for="title">{#advimage_dlg.title}</label></td> 

+								<td colspan="2"><input id="title" name="title" type="text" value="" /></td> 

+							</tr>

+						</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#advimage_dlg.preview}</legend>

+					<div id="prev"></div>

+				</fieldset>

+			</div>

+

+			<div id="appearance_panel" class="panel">

+				<fieldset>

+					<legend>{#advimage_dlg.tab_appearance}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr> 

+							<td class="column1"><label id="alignlabel" for="align">{#advimage_dlg.align}</label></td> 

+							<td><select id="align" name="align" onchange="ImageDialog.updateStyle('align');ImageDialog.changeAppearance();"> 

+									<option value="">{#not_set}</option> 

+									<option value="baseline">{#advimage_dlg.align_baseline}</option>

+									<option value="top">{#advimage_dlg.align_top}</option>

+									<option value="middle">{#advimage_dlg.align_middle}</option>

+									<option value="bottom">{#advimage_dlg.align_bottom}</option>

+									<option value="text-top">{#advimage_dlg.align_texttop}</option>

+									<option value="text-bottom">{#advimage_dlg.align_textbottom}</option>

+									<option value="left">{#advimage_dlg.align_left}</option>

+									<option value="right">{#advimage_dlg.align_right}</option>

+								</select> 

+							</td>

+							<td rowspan="6" valign="top">

+								<div class="alignPreview">

+									<img id="alignSampleImg" src="img/sample.gif" alt="{#advimage_dlg.example_img}" />

+									Lorem ipsum, Dolor sit amet, consectetuer adipiscing loreum ipsum edipiscing elit, sed diam

+									nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam erat volutpat.Loreum ipsum

+									edipiscing elit, sed diam nonummy nibh euismod tincidunt ut laoreet dolore magna aliquam

+									erat volutpat.

+								</div>

+							</td>

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="widthlabel" for="width">{#advimage_dlg.dimensions}</label></td>

+							<td class="nowrap">

+								<input name="width" type="text" id="width" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeHeight();" /> x 

+								<input name="height" type="text" id="height" value="" size="5" maxlength="5" class="size" onchange="ImageDialog.changeWidth();" /> px

+							</td>

+						</tr>

+

+						<tr>

+							<td>&nbsp;</td>

+							<td><table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>

+										<td><label id="constrainlabel" for="constrain">{#advimage_dlg.constrain_proportions}</label></td>

+									</tr>

+								</table></td>

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="vspacelabel" for="vspace">{#advimage_dlg.vspace}</label></td> 

+							<td><input name="vspace" type="text" id="vspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('vspace');ImageDialog.changeAppearance();" />

+							</td>

+						</tr>

+

+						<tr> 

+							<td class="column1"><label id="hspacelabel" for="hspace">{#advimage_dlg.hspace}</label></td> 

+							<td><input name="hspace" type="text" id="hspace" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('hspace');ImageDialog.changeAppearance();" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="borderlabel" for="border">{#advimage_dlg.border}</label></td> 

+							<td><input id="border" name="border" type="text" value="" size="3" maxlength="3" class="number" onchange="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" onblur="ImageDialog.updateStyle('border');ImageDialog.changeAppearance();" /></td> 

+						</tr>

+

+						<tr>

+							<td><label for="class_list">{#class_name}</label></td>

+							<td colspan="2"><select id="class_list" name="class_list" class="mceEditableSelect"><option value=""></option></select></td>

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="stylelabel" for="style">{#advimage_dlg.style}</label></td> 

+							<td colspan="2"><input id="style" name="style" type="text" value="" onchange="ImageDialog.changeAppearance();" /></td> 

+						</tr>

+

+						<!-- <tr>

+							<td class="column1"><label id="classeslabel" for="classes">{#advimage_dlg.classes}</label></td> 

+							<td colspan="2"><input id="classes" name="classes" type="text" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td> 

+						</tr> -->

+					</table>

+				</fieldset>

+			</div>

+

+			<div id="advanced_panel" class="panel">

+				<fieldset>

+					<legend>{#advimage_dlg.swap_image}</legend>

+

+					<input type="checkbox" id="onmousemovecheck" name="onmousemovecheck" class="checkbox" onclick="ImageDialog.setSwapImage(this.checked);" />

+					<label id="onmousemovechecklabel" for="onmousemovecheck">{#advimage_dlg.alt_image}</label>

+

+					<table border="0" cellpadding="4" cellspacing="0" width="100%">

+							<tr>

+								<td class="column1"><label id="onmouseoversrclabel" for="onmouseoversrc">{#advimage_dlg.mouseover}</label></td> 

+								<td><table border="0" cellspacing="0" cellpadding="0"> 

+									<tr> 

+									  <td><input id="onmouseoversrc" name="onmouseoversrc" type="text" value="" /></td> 

+									  <td id="onmouseoversrccontainer">&nbsp;</td>

+									</tr>

+								  </table></td>

+							</tr>

+							<tr>

+								<td><label for="over_list">{#advimage_dlg.image_list}</label></td>

+								<td><select id="over_list" name="over_list" onchange="document.getElementById('onmouseoversrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td>

+							</tr>

+							<tr> 

+								<td class="column1"><label id="onmouseoutsrclabel" for="onmouseoutsrc">{#advimage_dlg.mouseout}</label></td> 

+								<td class="column2"><table border="0" cellspacing="0" cellpadding="0"> 

+									<tr> 

+									  <td><input id="onmouseoutsrc" name="onmouseoutsrc" type="text" value="" /></td> 

+									  <td id="onmouseoutsrccontainer">&nbsp;</td>

+									</tr> 

+								  </table></td> 

+							</tr>

+							<tr>

+								<td><label for="out_list">{#advimage_dlg.image_list}</label></td>

+								<td><select id="out_list" name="out_list" onchange="document.getElementById('onmouseoutsrc').value=this.options[this.selectedIndex].value;"><option value=""></option></select></td>

+							</tr>

+					</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#advimage_dlg.misc}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label id="idlabel" for="id">{#advimage_dlg.id}</label></td> 

+							<td><input id="id" name="id" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="dirlabel" for="dir">{#advimage_dlg.langdir}</label></td> 

+							<td>

+								<select id="dir" name="dir" onchange="ImageDialog.changeAppearance();"> 

+										<option value="">{#not_set}</option> 

+										<option value="ltr">{#advimage_dlg.ltr}</option> 

+										<option value="rtl">{#advimage_dlg.rtl}</option> 

+								</select>

+							</td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="langlabel" for="lang">{#advimage_dlg.langcode}</label></td> 

+							<td>

+								<input id="lang" name="lang" type="text" value="" />

+							</td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="usemaplabel" for="usemap">{#advimage_dlg.map}</label></td> 

+							<td>

+								<input id="usemap" name="usemap" type="text" value="" />

+							</td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="longdesclabel" for="longdesc">{#advimage_dlg.long_desc}</label></td>

+							<td><table border="0" cellspacing="0" cellpadding="0">

+									<tr>

+									  <td><input id="longdesc" name="longdesc" type="text" value="" /></td>

+									  <td id="longdesccontainer">&nbsp;</td>

+									</tr>

+								</table></td> 

+						</tr>

+					</table>

+				</fieldset>

+			</div>

+		</div>

+

+		<div class="mceActionPanel">

+			<input type="submit" id="insert" name="insert" value="{#insert}" />

+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />

+		</div>

+    </form>

+</body> 

+</html> 

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advimage/img/sample.gif b/dojopuzzles/media/js/tiny_mce/plugins/advimage/img/sample.gif
new file mode 100644
index 0000000..53bf689
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advimage/img/sample.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advimage/js/image.js b/dojopuzzles/media/js/tiny_mce/plugins/advimage/js/image.js
new file mode 100644
index 0000000..3bda86a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advimage/js/image.js
@@ -0,0 +1,443 @@
+var ImageDialog = {

+	preInit : function() {

+		var url;

+

+		tinyMCEPopup.requireLangPack();

+

+		if (url = tinyMCEPopup.getParam("external_image_list_url"))

+			document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');

+	},

+

+	init : function(ed) {

+		var f = document.forms[0], nl = f.elements, ed = tinyMCEPopup.editor, dom = ed.dom, n = ed.selection.getNode();

+

+		tinyMCEPopup.resizeToInnerSize();

+		this.fillClassList('class_list');

+		this.fillFileList('src_list', 'tinyMCEImageList');

+		this.fillFileList('over_list', 'tinyMCEImageList');

+		this.fillFileList('out_list', 'tinyMCEImageList');

+		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,

+			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 {

+			ed.execCommand('mceInsertContent', false, '<img id="__mce_tmp" />', {skip_undo : 1});

+			ed.dom.setAttribs('__mce_tmp', args);

+			ed.dom.setAttrib('__mce_tmp', 'id', '');

+			ed.undoManager.add();

+		}

+

+		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 = 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, st, v, 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') {

+				dom.setStyle(img, 'border', '');

+

+				v = f.border.value;

+				if (v || v == '0') {

+					if (v == '0')

+						img.style.border = '0';

+					else

+						img.style.border = v + 'px solid black';

+				}

+			}

+

+			// 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', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this);" onerror="ImageDialog.resetImageData();" />');

+		else

+			tinyMCEPopup.dom.setHTML('prev', '<img id="previewImg" src="' + u + '" border="0" onload="ImageDialog.updateImageData(this, 1);" />');

+	}

+};

+

+ImageDialog.preInit();

+tinyMCEPopup.onInit.add(ImageDialog.init, ImageDialog);

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advimage/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/advimage/langs/en_dlg.js
new file mode 100644
index 0000000..f493d19
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advimage/langs/en_dlg.js
@@ -0,0 +1,43 @@
+tinyMCE.addI18n('en.advimage_dlg',{

+tab_general:"General",

+tab_appearance:"Appearance",

+tab_advanced:"Advanced",

+general:"General",

+title:"Title",

+preview:"Preview",

+constrain_proportions:"Constrain proportions",

+langdir:"Language direction",

+langcode:"Language code",

+long_desc:"Long description link",

+style:"Style",

+classes:"Classes",

+ltr:"Left to right",

+rtl:"Right to left",

+id:"Id",

+map:"Image map",

+swap_image:"Swap image",

+alt_image:"Alternative image",

+mouseover:"for mouse over",

+mouseout:"for mouse out",

+misc:"Miscellaneous",

+example_img:"Appearance preview 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.",

+dialog_title:"Insert/edit image",

+src:"Image URL",

+alt:"Image description",

+list:"Image list",

+border:"Border",

+dimensions:"Dimensions",

+vspace:"Vertical space",

+hspace:"Horizontal space",

+align:"Alignment",

+align_baseline:"Baseline",

+align_top:"Top",

+align_middle:"Middle",

+align_bottom:"Bottom",

+align_texttop:"Text top",

+align_textbottom:"Text bottom",

+align_left:"Left",

+align_right:"Right",

+image_list:"Image list"

+});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advlink/css/advlink.css b/dojopuzzles/media/js/tiny_mce/plugins/advlink/css/advlink.css
new file mode 100644
index 0000000..1436431
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advlink/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/advlink/editor_plugin.js
new file mode 100644
index 0000000..983fe5a
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advlink/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/advlink/editor_plugin_src.js
new file mode 100644
index 0000000..14e46a7
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/advlink/js/advlink.js b/dojopuzzles/media/js/tiny_mce/plugins/advlink/js/advlink.js
new file mode 100644
index 0000000..b78e82f
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advlink/js/advlink.js
@@ -0,0 +1,528 @@
+/* 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('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');

+}

+

+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('linklisthrefcontainer').innerHTML = getLinkListHTML('linklisthref','href');

+	document.getElementById('anchorlistcontainer').innerHTML = getAnchorListHTML('anchorlist','href');

+	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;

+

+	// 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 && 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');

+

+		// 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', inst.dom.getAttrib(elm, 'target'));

+		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', inst.dom.getAttrib(elm, 'target'), 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('&#39;', '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<variableNames.length; i++) {

+			// Is string value

+			if (variableNames[i].indexOf("'${") != -1)

+				regExp += "'(.*)'";

+			else // Number value

+				regExp += "([0-9]*)";

+

+			replaceStr += "$" + (i+1);

+

+			// Cleanup variable name

+			variableNames[i] = variableNames[i].replace(new RegExp("[^A-Za-z0-9]", "gi"), "");

+

+			if (i != variableNames.length-1) {

+				regExp += "\\s*,\\s*";

+				replaceStr += "<delim>";

+			} else

+				regExp += ".*";

+		}

+

+		regExp += "\\);?";

+

+		// Build variable array

+		var variables = [];

+		variables["_function"] = fnName;

+		var variableValues = link.replace(new RegExp(regExp, "gi"), replaceStr).split('<delim>');

+		for (var i=0; i<variableNames.length; i++)

+			variables[variableNames[i]] = variableValues[i];

+

+		return variables;

+	}

+

+	return null;

+}

+

+function parseOptions(opts) {

+	if (opts == null || opts == "")

+		return [];

+

+	// Cleanup the options

+	opts = opts.toLowerCase();

+	opts = opts.replace(/;/g, ",");

+	opts = opts.replace(/[^0-9a-z=,]/g, "");

+

+	var optionChunks = opts.split(',');

+	var options = [];

+

+	for (var i=0; i<optionChunks.length; i++) {

+		var parts = optionChunks[i].split('=');

+

+		if (parts.length == 2)

+			options[parts[0]] = parts[1];

+	}

+

+	return options;

+}

+

+function buildOnClick() {

+	var formObj = document.forms[0];

+

+	if (!formObj.ispopup.checked) {

+		formObj.onclick.value = "";

+		return;

+	}

+

+	var onclick = "window.open('";

+	var url = formObj.popupurl.value;

+

+	onclick += url + "','";

+	onclick += formObj.popupname.value + "','";

+

+	if (formObj.popuplocation.checked)

+		onclick += "location=yes,";

+

+	if (formObj.popupscrollbars.checked)

+		onclick += "scrollbars=yes,";

+

+	if (formObj.popupmenubar.checked)

+		onclick += "menubar=yes,";

+

+	if (formObj.popupresizable.checked)

+		onclick += "resizable=yes,";

+

+	if (formObj.popuptoolbar.checked)

+		onclick += "toolbar=yes,";

+

+	if (formObj.popupstatus.checked)

+		onclick += "status=yes,";

+

+	if (formObj.popupdependent.checked)

+		onclick += "dependent=yes,";

+

+	if (formObj.popupwidth.value != "")

+		onclick += "width=" + formObj.popupwidth.value + ",";

+

+	if (formObj.popupheight.value != "")

+		onclick += "height=" + formObj.popupheight.value + ",";

+

+	if (formObj.popupleft.value != "") {

+		if (formObj.popupleft.value != "c")

+			onclick += "left=" + formObj.popupleft.value + ",";

+		else

+			onclick += "left='+(screen.availWidth/2-" + (formObj.popupwidth.value/2) + ")+',";

+	}

+

+	if (formObj.popuptop.value != "") {

+		if (formObj.popuptop.value != "c")

+			onclick += "top=" + formObj.popuptop.value + ",";

+		else

+			onclick += "top='+(screen.availHeight/2-" + (formObj.popupheight.value/2) + ")+',";

+	}

+

+	if (onclick.charAt(onclick.length-1) == ',')

+		onclick = onclick.substring(0, onclick.length-1);

+

+	onclick += "');";

+

+	if (formObj.popupreturn.checked)

+		onclick += "return false;";

+

+	// tinyMCE.debug(onclick);

+

+	formObj.onclick.value = onclick;

+

+	if (formObj.href.value == "")

+		formObj.href.value = url;

+}

+

+function setAttrib(elm, attrib, value) {

+	var formObj = document.forms[0];

+	var valueElm = formObj.elements[attrib.toLowerCase()];

+	var dom = tinyMCEPopup.editor.dom;

+

+	if (typeof(value) == "undefined" || value == null) {

+		value = "";

+

+		if (valueElm)

+			value = valueElm.value;

+	}

+

+	// Clean up the style

+	if (attrib == 'style')

+		value = dom.serializeStyle(dom.parseStyle(value), 'a');

+

+	dom.setAttrib(elm, attrib, value);

+}

+

+function getAnchorListHTML(id, target) {

+	var inst = tinyMCEPopup.editor;

+	var nodes = inst.dom.select('a.mceItemAnchor,img.mceItemAnchor'), name, i;

+	var html = "";

+

+	html += '<select id="' + id + '" name="' + id + '" class="mceAnchorList" o2nfocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target + '.value=';

+	html += 'this.options[this.selectedIndex].value;">';

+	html += '<option value="">---</option>';

+

+	for (i=0; i<nodes.length; i++) {

+		if ((name = inst.dom.getAttrib(nodes[i], "name")) != "")

+			html += '<option value="#' + name + '">' + name + '</option>';

+	}

+

+	html += '</select>';

+

+	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) {

+		tinyMCEPopup.execCommand("mceBeginUndoLevel");

+		i = inst.selection.getBookmark();

+		inst.dom.remove(elm, 1);

+		inst.selection.moveToBookmark(i);

+		tinyMCEPopup.execCommand("mceEndUndoLevel");

+		tinyMCEPopup.close();

+		return;

+	}

+

+	tinyMCEPopup.execCommand("mceBeginUndoLevel");

+

+	// Create new anchor elements

+	if (elm == null) {

+		inst.getDoc().execCommand("unlink", false, null);

+		tinyMCEPopup.execCommand("CreateLink", 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<elementArray.length; i++)

+			setAllAttribs(elm = elementArray[i]);

+	} else

+		setAllAttribs(elm);

+

+	// Don't move caret if selection was image

+	if (elm.childNodes.length != 1 || elm.firstChild.nodeName != 'IMG') {

+		inst.focus();

+		inst.selection.select(elm);

+		inst.selection.collapse(0);

+		tinyMCEPopup.storeSelection();

+	}

+

+	tinyMCEPopup.execCommand("mceEndUndoLevel");

+	tinyMCEPopup.close();

+}

+

+function setAllAttribs(elm) {

+	var formObj = document.forms[0];

+	var href = formObj.href.value;

+	var target = getSelectValue(formObj, 'targetlist');

+

+	setAttrib(elm, 'href', href);

+	setAttrib(elm, 'title');

+	setAttrib(elm, 'target', target == '_self' ? '' : target);

+	setAttrib(elm, 'id');

+	setAttrib(elm, 'style');

+	setAttrib(elm, 'class', getSelectValue(formObj, 'classlist'));

+	setAttrib(elm, 'rel');

+	setAttrib(elm, 'rev');

+	setAttrib(elm, 'charset');

+	setAttrib(elm, 'hreflang');

+	setAttrib(elm, 'dir');

+	setAttrib(elm, 'lang');

+	setAttrib(elm, 'tabindex');

+	setAttrib(elm, 'accesskey');

+	setAttrib(elm, 'type');

+	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 getSelectValue(form_obj, field_name) {

+	var elm = form_obj.elements[field_name];

+

+	if (!elm || elm.options == null || elm.selectedIndex == -1)

+		return "";

+

+	return elm.options[elm.selectedIndex].value;

+}

+

+function getLinkListHTML(elm_id, target_form_element, onchange_func) {

+	if (typeof(tinyMCELinkList) == "undefined" || tinyMCELinkList.length == 0)

+		return "";

+

+	var html = "";

+

+	html += '<select id="' + elm_id + '" name="' + elm_id + '"';

+	html += ' class="mceLinkList" onfoc2us="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';

+	html += 'this.options[this.selectedIndex].value;';

+

+	if (typeof(onchange_func) != "undefined")

+		html += onchange_func + '(\'' + target_form_element + '\',this.options[this.selectedIndex].text,this.options[this.selectedIndex].value);';

+

+	html += '"><option value="">---</option>';

+

+	for (var i=0; i<tinyMCELinkList.length; i++)

+		html += '<option value="' + tinyMCELinkList[i][1] + '">' + tinyMCELinkList[i][0] + '</option>';

+

+	html += '</select>';

+

+	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 += '<select id="' + elm_id + '" name="' + elm_id + '" onf2ocus="tinyMCE.addSelectAccessibility(event, this, window);" onchange="this.form.' + target_form_element + '.value=';

+	html += 'this.options[this.selectedIndex].value;">';

+	html += '<option value="_self">' + tinyMCEPopup.getLang('advlink_dlg.target_same') + '</option>';

+	html += '<option value="_blank">' + tinyMCEPopup.getLang('advlink_dlg.target_blank') + ' (_blank)</option>';

+	html += '<option value="_parent">' + tinyMCEPopup.getLang('advlink_dlg.target_parent') + ' (_parent)</option>';

+	html += '<option value="_top">' + tinyMCEPopup.getLang('advlink_dlg.target_top') + ' (_top)</option>';

+

+	for (var i=0; i<targets.length; i++) {

+		var key, value;

+

+		if (targets[i] == "")

+			continue;

+

+		key = targets[i].split('=')[0];

+		value = targets[i].split('=')[1];

+

+		html += '<option value="' + key + '">' + value + ' (' + key + ')</option>';

+	}

+

+	html += '</select>';

+

+	return html;

+}

+

+// While loading

+preinit();

+tinyMCEPopup.onInit.add(init);

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advlink/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/advlink/langs/en_dlg.js
new file mode 100644
index 0000000..c71ffbd
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advlink/langs/en_dlg.js
@@ -0,0 +1,52 @@
+tinyMCE.addI18n('en.advlink_dlg',{

+title:"Insert/edit link",

+url:"Link URL",

+target:"Target",

+titlefield:"Title",

+is_email:"The URL you entered seems to be an email address, do you want to add the required mailto: prefix?",

+is_external:"The URL you entered seems to external link, do you want to add the required http:// prefix?",

+list:"Link list",

+general_tab:"General",

+popup_tab:"Popup",

+events_tab:"Events",

+advanced_tab:"Advanced",

+general_props:"General properties",

+popup_props:"Popup properties",

+event_props:"Events",

+advanced_props:"Advanced properties",

+popup_opts:"Options",

+anchor_names:"Anchors",

+target_same:"Open in this window / frame",

+target_parent:"Open in parent window / frame",

+target_top:"Open in top frame (replaces all frames)",

+target_blank:"Open in new window",

+popup:"Javascript popup",

+popup_url:"Popup URL",

+popup_name:"Window name",

+popup_return:"Insert 'return false'",

+popup_scrollbars:"Show scrollbars",

+popup_statusbar:"Show status bar",

+popup_toolbar:"Show toolbars",

+popup_menubar:"Show menu bar",

+popup_location:"Show location bar",

+popup_resizable:"Make window resizable",

+popup_dependent:"Dependent (Mozilla/Firefox only)",

+popup_size:"Size",

+popup_position:"Position (X/Y)",

+id:"Id",

+style:"Style",

+classes:"Classes",

+target_name:"Target name",

+langdir:"Language direction",

+target_langcode:"Target language",

+langcode:"Language code",

+encoding:"Target character encoding",

+mime:"Target MIME type",

+rel:"Relationship page to target",

+rev:"Relationship target to page",

+tabindex:"Tabindex",

+accesskey:"Accesskey",

+ltr:"Left to right",

+rtl:"Right to left",

+link_list:"Link list"

+});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advlink/link.htm b/dojopuzzles/media/js/tiny_mce/plugins/advlink/link.htm
new file mode 100644
index 0000000..876669c
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advlink/link.htm
@@ -0,0 +1,333 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#advlink_dlg.title}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="../../utils/mctabs.js"></script>

+	<script type="text/javascript" src="../../utils/form_utils.js"></script>

+	<script type="text/javascript" src="../../utils/validate.js"></script>

+	<script type="text/javascript" src="js/advlink.js"></script>

+	<link href="css/advlink.css" rel="stylesheet" type="text/css" />

+</head>

+<body id="advlink" style="display: none">

+    <form onsubmit="insertAction();return false;" action="#">

+		<div class="tabs">

+			<ul>

+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');" onmousedown="return false;">{#advlink_dlg.general_tab}</a></span></li>

+				<li id="popup_tab"><span><a href="javascript:mcTabs.displayTab('popup_tab','popup_panel');" onmousedown="return false;">{#advlink_dlg.popup_tab}</a></span></li>

+				<li id="events_tab"><span><a href="javascript:mcTabs.displayTab('events_tab','events_panel');" onmousedown="return false;">{#advlink_dlg.events_tab}</a></span></li>

+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#advlink_dlg.advanced_tab}</a></span></li>

+			</ul>

+		</div>

+

+		<div class="panel_wrapper">

+			<div id="general_panel" class="panel current">

+				<fieldset>

+					<legend>{#advlink_dlg.general_props}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+						  <td class="nowrap"><label id="hreflabel" for="href">{#advlink_dlg.url}</label></td>

+						  <td><table border="0" cellspacing="0" cellpadding="0">

+								<tr>

+								  <td><input id="href" name="href" type="text" class="mceFocus" value="" onchange="selectByValue(this.form,'linklisthref',this.value);" /></td>

+								  <td id="hrefbrowsercontainer">&nbsp;</td>

+								</tr>

+							  </table></td>

+						</tr>

+						<tr id="linklisthrefrow">

+							<td class="column1"><label for="linklisthref">{#advlink_dlg.list}</label></td>

+							<td colspan="2" id="linklisthrefcontainer"><select id="linklisthref"><option value=""></option></select></td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="anchorlist">{#advlink_dlg.anchor_names}</label></td>

+							<td colspan="2" id="anchorlistcontainer"><select id="anchorlist"><option value=""></option></select></td>

+						</tr>

+						<tr>

+							<td><label id="targetlistlabel" for="targetlist">{#advlink_dlg.target}</label></td>

+							<td id="targetlistcontainer"><select id="targetlist"><option value=""></option></select></td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label id="titlelabel" for="title">{#advlink_dlg.titlefield}</label></td>

+							<td><input id="title" name="title" type="text" value="" /></td>

+						</tr>

+						<tr>

+							<td><label id="classlabel" for="classlist">{#class_name}</label></td>

+							<td>

+								 <select id="classlist" name="classlist" onchange="changeClass();">

+									<option value="" selected="selected">{#not_set}</option>

+								 </select>

+							</td>

+						</tr>

+					</table>

+				</fieldset>

+			</div>

+

+			<div id="popup_panel" class="panel">

+				<fieldset>

+					<legend>{#advlink_dlg.popup_props}</legend>

+

+					<input type="checkbox" id="ispopup" name="ispopup" class="radio" onclick="setPopupControlsDisabled(!this.checked);buildOnClick();" />

+					<label id="ispopuplabel" for="ispopup">{#advlink_dlg.popup}</label>

+

+					<table border="0" cellpadding="0" cellspacing="4">

+						<tr>

+							<td class="nowrap"><label for="popupurl">{#advlink_dlg.popup_url}</label>&nbsp;</td>

+							<td>

+								<table border="0" cellspacing="0" cellpadding="0">

+									<tr>

+										<td><input type="text" name="popupurl" id="popupurl" value="" onchange="buildOnClick();" /></td>

+										<td id="popupurlbrowsercontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="popupname">{#advlink_dlg.popup_name}</label>&nbsp;</td>

+							<td><input type="text" name="popupname" id="popupname" value="" onchange="buildOnClick();" /></td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label>{#advlink_dlg.popup_size}</label>&nbsp;</td>

+							<td class="nowrap">

+								<input type="text" id="popupwidth" name="popupwidth" value="" onchange="buildOnClick();" /> x

+								<input type="text" id="popupheight" name="popupheight" value="" onchange="buildOnClick();" /> px

+							</td>

+						</tr>

+						<tr>

+							<td class="nowrap" id="labelleft"><label>{#advlink_dlg.popup_position}</label>&nbsp;</td>

+							<td class="nowrap">

+								<input type="text" id="popupleft" name="popupleft" value="" onchange="buildOnClick();" /> /                                

+								<input type="text" id="popuptop" name="popuptop" value="" onchange="buildOnClick();" /> (c /c = center)

+							</td>

+						</tr>

+					</table>

+

+					<fieldset>

+						<legend>{#advlink_dlg.popup_opts}</legend>

+

+						<table border="0" cellpadding="0" cellspacing="4">

+							<tr>

+								<td><input type="checkbox" id="popuplocation" name="popuplocation" class="checkbox" onchange="buildOnClick();" /></td>

+								<td class="nowrap"><label id="popuplocationlabel" for="popuplocation">{#advlink_dlg.popup_location}</label></td>

+								<td><input type="checkbox" id="popupscrollbars" name="popupscrollbars" class="checkbox" onchange="buildOnClick();" /></td>

+								<td class="nowrap"><label id="popupscrollbarslabel" for="popupscrollbars">{#advlink_dlg.popup_scrollbars}</label></td>

+							</tr>

+							<tr>

+								<td><input type="checkbox" id="popupmenubar" name="popupmenubar" class="checkbox" onchange="buildOnClick();" /></td>

+								<td class="nowrap"><label id="popupmenubarlabel" for="popupmenubar">{#advlink_dlg.popup_menubar}</label></td>

+								<td><input type="checkbox" id="popupresizable" name="popupresizable" class="checkbox" onchange="buildOnClick();" /></td>

+								<td class="nowrap"><label id="popupresizablelabel" for="popupresizable">{#advlink_dlg.popup_resizable}</label></td>

+							</tr>

+							<tr>

+								<td><input type="checkbox" id="popuptoolbar" name="popuptoolbar" class="checkbox" onchange="buildOnClick();" /></td>

+								<td class="nowrap"><label id="popuptoolbarlabel" for="popuptoolbar">{#advlink_dlg.popup_toolbar}</label></td>

+								<td><input type="checkbox" id="popupdependent" name="popupdependent" class="checkbox" onchange="buildOnClick();" /></td>

+								<td class="nowrap"><label id="popupdependentlabel" for="popupdependent">{#advlink_dlg.popup_dependent}</label></td>

+							</tr>

+							<tr>

+								<td><input type="checkbox" id="popupstatus" name="popupstatus" class="checkbox" onchange="buildOnClick();" /></td>

+								<td class="nowrap"><label id="popupstatuslabel" for="popupstatus">{#advlink_dlg.popup_statusbar}</label></td>

+								<td><input type="checkbox" id="popupreturn" name="popupreturn" class="checkbox" onchange="buildOnClick();" checked="checked" /></td>

+								<td class="nowrap"><label id="popupreturnlabel" for="popupreturn">{#advlink_dlg.popup_return}</label></td>

+							</tr>

+						</table>

+					</fieldset>

+				</fieldset>

+			</div>

+

+			<div id="advanced_panel" class="panel">

+			<fieldset>

+					<legend>{#advlink_dlg.advanced_props}</legend>

+

+					<table border="0" cellpadding="0" cellspacing="4">

+						<tr>

+							<td class="column1"><label id="idlabel" for="id">{#advlink_dlg.id}</label></td> 

+							<td><input id="id" name="id" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td><label id="stylelabel" for="style">{#advlink_dlg.style}</label></td>

+							<td><input type="text" id="style" name="style" value="" /></td>

+						</tr>

+

+						<tr>

+							<td><label id="classeslabel" for="classes">{#advlink_dlg.classes}</label></td>

+							<td><input type="text" id="classes" name="classes" value="" onchange="selectByValue(this.form,'classlist',this.value,true);" /></td>

+						</tr>

+

+						<tr>

+							<td><label id="targetlabel" for="target">{#advlink_dlg.target_name}</label></td>

+							<td><input type="text" id="target" name="target" value="" onchange="selectByValue(this.form,'targetlist',this.value,true);" /></td>

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="dirlabel" for="dir">{#advlink_dlg.langdir}</label></td> 

+							<td>

+								<select id="dir" name="dir"> 

+										<option value="">{#not_set}</option> 

+										<option value="ltr">{#advlink_dlg.ltr}</option> 

+										<option value="rtl">{#advlink_dlg.rtl}</option> 

+								</select>

+							</td> 

+						</tr>

+

+						<tr>

+							<td><label id="hreflanglabel" for="hreflang">{#advlink_dlg.target_langcode}</label></td>

+							<td><input type="text" id="hreflang" name="hreflang" value="" /></td>

+						</tr>

+

+						<tr>

+							<td class="column1"><label id="langlabel" for="lang">{#advlink_dlg.langcode}</label></td> 

+							<td>

+								<input id="lang" name="lang" type="text" value="" />

+							</td> 

+						</tr>

+

+						<tr>

+							<td><label id="charsetlabel" for="charset">{#advlink_dlg.encoding}</label></td>

+							<td><input type="text" id="charset" name="charset" value="" /></td>

+						</tr>

+

+						<tr>

+							<td><label id="typelabel" for="type">{#advlink_dlg.mime}</label></td>

+							<td><input type="text" id="type" name="type" value="" /></td>

+						</tr>

+

+						<tr>

+							<td><label id="rellabel" for="rel">{#advlink_dlg.rel}</label></td>

+							<td><select id="rel" name="rel"> 

+									<option value="">{#not_set}</option> 

+									<option value="lightbox">Lightbox</option> 

+									<option value="alternate">Alternate</option> 

+									<option value="designates">Designates</option> 

+									<option value="stylesheet">Stylesheet</option> 

+									<option value="start">Start</option> 

+									<option value="next">Next</option> 

+									<option value="prev">Prev</option> 

+									<option value="contents">Contents</option> 

+									<option value="index">Index</option> 

+									<option value="glossary">Glossary</option> 

+									<option value="copyright">Copyright</option> 

+									<option value="chapter">Chapter</option> 

+									<option value="subsection">Subsection</option> 

+									<option value="appendix">Appendix</option> 

+									<option value="help">Help</option> 

+									<option value="bookmark">Bookmark</option>

+									<option value="nofollow">No Follow</option>

+									<option value="tag">Tag</option>

+								</select> 

+							</td>

+						</tr>

+

+						<tr>

+							<td><label id="revlabel" for="rev">{#advlink_dlg.rev}</label></td>

+							<td><select id="rev" name="rev"> 

+									<option value="">{#not_set}</option> 

+									<option value="alternate">Alternate</option> 

+									<option value="designates">Designates</option> 

+									<option value="stylesheet">Stylesheet</option> 

+									<option value="start">Start</option> 

+									<option value="next">Next</option> 

+									<option value="prev">Prev</option> 

+									<option value="contents">Contents</option> 

+									<option value="index">Index</option> 

+									<option value="glossary">Glossary</option> 

+									<option value="copyright">Copyright</option> 

+									<option value="chapter">Chapter</option> 

+									<option value="subsection">Subsection</option> 

+									<option value="appendix">Appendix</option> 

+									<option value="help">Help</option> 

+									<option value="bookmark">Bookmark</option> 

+								</select> 

+							</td>

+						</tr>

+

+						<tr>

+							<td><label id="tabindexlabel" for="tabindex">{#advlink_dlg.tabindex}</label></td>

+							<td><input type="text" id="tabindex" name="tabindex" value="" /></td>

+						</tr>

+

+						<tr>

+							<td><label id="accesskeylabel" for="accesskey">{#advlink_dlg.accesskey}</label></td>

+							<td><input type="text" id="accesskey" name="accesskey" value="" /></td>

+						</tr>

+					</table>

+				</fieldset>

+			</div>

+

+			<div id="events_panel" class="panel">

+			<fieldset>

+					<legend>{#advlink_dlg.event_props}</legend>

+

+					<table border="0" cellpadding="0" cellspacing="4">

+						<tr>

+							<td class="column1"><label for="onfocus">onfocus</label></td> 

+							<td><input id="onfocus" name="onfocus" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onblur">onblur</label></td> 

+							<td><input id="onblur" name="onblur" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onclick">onclick</label></td> 

+							<td><input id="onclick" name="onclick" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="ondblclick">ondblclick</label></td> 

+							<td><input id="ondblclick" name="ondblclick" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onmousedown">onmousedown</label></td> 

+							<td><input id="onmousedown" name="onmousedown" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onmouseup">onmouseup</label></td> 

+							<td><input id="onmouseup" name="onmouseup" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onmouseover">onmouseover</label></td> 

+							<td><input id="onmouseover" name="onmouseover" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onmousemove">onmousemove</label></td> 

+							<td><input id="onmousemove" name="onmousemove" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onmouseout">onmouseout</label></td> 

+							<td><input id="onmouseout" name="onmouseout" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onkeypress">onkeypress</label></td> 

+							<td><input id="onkeypress" name="onkeypress" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onkeydown">onkeydown</label></td> 

+							<td><input id="onkeydown" name="onkeydown" type="text" value="" /></td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="onkeyup">onkeyup</label></td> 

+							<td><input id="onkeyup" name="onkeyup" type="text" value="" /></td> 

+						</tr>

+					</table>

+				</fieldset>

+			</div>

+		</div>

+

+		<div class="mceActionPanel">

+			<input type="submit" id="insert" name="insert" value="{#insert}" />

+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />

+		</div>

+    </form>

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/advlist/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/advlist/editor_plugin.js
new file mode 100644
index 0000000..02d1697
--- /dev/null
+++ b/dojopuzzles/media/js/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")},createControl:function(d,b){var f=this,e,h;if(d=="numlist"||d=="bullist"){if(f[d][0].title=="advlist.def"){h=f[d][0]}function c(i,k){var j=true;a(k.styles,function(m,l){if(f.editor.dom.getStyle(i,l)!=m){j=false;return false}});return j}function g(){var k,i=f.editor,l=i.dom,j=i.selection;k=l.getParent(j.getNode(),"ol,ul");if(!k||k.nodeName==(d=="bullist"?"OL":"UL")||c(k,h)){i.execCommand(d=="bullist"?"InsertUnorderedList":"InsertOrderedList")}if(h){k=l.getParent(j.getNode(),"ol,ul");if(k){l.setStyles(k,h.styles);k.removeAttribute("_mce_style")}}}e=b.createSplitButton(d,{title:"advanced."+d+"_desc","class":"mce_"+d,onclick:function(){g()}});e.onRenderMenu.add(function(i,j){j.onShowMenu.add(function(){var m=f.editor.dom,l=m.getParent(f.editor.selection.getNode(),"ol,ul"),k;if(l||h){k=f[d];a(j.items,function(n){var o=true;n.setSelected(0);if(l&&!n.isDisabled()){a(k,function(p){if(p.id==n.id){if(!c(l,p)){o=false;return false}}});if(o){n.setSelected(1)}}});if(!l){j.items[h.id].setSelected(1)}}});j.add({id:f.editor.dom.uniqueId(),title:"advlist.types","class":"mceMenuItemTitle"}).setDisabled(1);a(f[d],function(k){k.id=f.editor.dom.uniqueId();j.add({id:k.id,title:k.title,onclick:function(){h=k;g()}})})});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/dojopuzzles/media/js/tiny_mce/plugins/advlist/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/advlist/editor_plugin_src.js
new file mode 100644
index 0000000..a61887a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/advlist/editor_plugin_src.js
@@ -0,0 +1,154 @@
+/**

+ * 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");

+		},

+

+		createControl: function(name, cm) {

+			var t = this, btn, format;

+

+			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 (t.editor.dom.getStyle(node, name) != value) {

+							state = false;

+							return false;

+						}

+					});

+

+					return state;

+				};

+

+				function applyListFormat() {

+					var list, ed = t.editor, dom = ed.dom, sel = ed.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))

+						ed.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('_mce_style');

+						}

+					}

+				};

+

+				btn = cm.createSplitButton(name, {

+					title : 'advanced.' + name + '_desc',

+					'class' : 'mce_' + name,

+					onclick : function() {

+						applyListFormat();

+					}

+				});

+

+				btn.onRenderMenu.add(function(btn, menu) {

+					menu.onShowMenu.add(function() {

+						var dom = t.editor.dom, list = dom.getParent(t.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);

+						}

+					});

+

+					menu.add({id : t.editor.dom.uniqueId(), title : 'advlist.types', 'class' : 'mceMenuItemTitle'}).setDisabled(1);

+

+					each(t[name], function(item) {

+						item.id = t.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/dojopuzzles/media/js/tiny_mce/plugins/autoresize/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/autoresize/editor_plugin.js
new file mode 100644
index 0000000..1676b15
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/autoresize/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.AutoResizePlugin",{init:function(a,c){var d=this;if(a.getParam("fullscreen_is_enabled")){return}function b(){var h=a.getDoc(),e=h.body,j=h.documentElement,g=tinymce.DOM,i=d.autoresize_min_height,f;f=tinymce.isIE?e.scrollHeight:j.offsetHeight;if(f>d.autoresize_min_height){i=f}g.setStyle(g.get(a.id+"_ifr"),"height",i+"px");if(d.throbbing){a.setProgressState(false);a.setProgressState(true)}}d.editor=a;d.autoresize_min_height=a.getElement().offsetHeight;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.onInit.add(function(f,e){f.setProgressState(true);d.throbbing=true;f.getBody().style.overflowY="hidden"});a.onLoadContent.add(function(f,e){b();setTimeout(function(){b();f.setProgressState(false);d.throbbing=false},1250)})}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/dojopuzzles/media/js/tiny_mce/plugins/autoresize/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/autoresize/editor_plugin_src.js
new file mode 100644
index 0000000..c260b7a
--- /dev/null
+++ b/dojopuzzles/media/js/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;
+
+			if (ed.getParam('fullscreen_is_enabled'))
+				return;
+
+			/**
+			 * This method gets executed each time the editor needs to resize.
+			 */
+			function resize() {
+				var d = ed.getDoc(), b = 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 ? b.scrollHeight : de.offsetHeight;
+
+				// Don't make it smaller than the minimum height
+				if (myHeight > t.autoresize_min_height)
+					resizeHeight = myHeight;
+
+				// Resize content element
+				DOM.setStyle(DOM.get(ed.id + '_ifr'), 'height', resizeHeight + 'px');
+
+				// if we're throbbing, we'll re-throb to match the new size
+				if (t.throbbing) {
+					ed.setProgressState(false);
+					ed.setProgressState(true);
+				}
+			};
+
+			t.editor = ed;
+
+			// Define minimum height
+			t.autoresize_min_height = ed.getElement().offsetHeight;
+
+			// 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)) {
+				// Things to do when the editor is ready
+				ed.onInit.add(function(ed, l) {
+					// Show throbber until content area is resized properly
+					ed.setProgressState(true);
+					t.throbbing = true;
+
+					// Hide scrollbars
+					ed.getBody().style.overflowY = "hidden";
+				});
+
+				ed.onLoadContent.add(function(ed, l) {
+					resize();
+
+					// Because the content area resizes when its content CSS loads,
+					// and we can't easily add a listener to its onload event,
+					// we'll just trigger a resize after a short loading period
+					setTimeout(function() {
+						resize();
+
+						// Disable throbber
+						ed.setProgressState(false);
+						t.throbbing = false;
+					}, 1250);
+				});
+			}
+
+			// 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);
+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/autosave/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/autosave/editor_plugin.js
new file mode 100644
index 0000000..6e48540
--- /dev/null
+++ b/dojopuzzles/media/js/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|&nbsp;|<\/?p[^>]*>|<br[^>]*>/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(){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();m.save("TinyMCE")},getItem:function(l){var m=i.getElement();m.load("TinyMCE");return m.getAttribute(l)},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,i=h.storage;if(i){content=i.getItem(h.key);if(content){h.editor.setContent(content);h.onRestoreDraft.dispatch(h,{content:content})}}},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()<i.getTime()){return b}h.removeDraft()}else{return b}}}return false},removeDraft:function(){var h=this,k=h.storage,i=h.key,j;if(k){j=k.getItem(i);k.removeItem(i);k.removeItem(i+"_expires");if(j){h.onRemoveDraft.dispatch(h,{content:j})}}},"static":{_beforeUnloadHandler:function(h){var i;e.each(tinyMCE.editors,function(j){if(j.plugins.autosave){j.plugins.autosave.storeDraft()}if(j.getParam("fullscreen_is_enabled")){return}if(!i&&j.isDirty()&&j.getParam("autosave_ask_before_unload")){i=j.getLang("autosave.unload_msg")}});return i}}});e.PluginManager.add("autosave",e.plugins.AutoSave)})(tinymce);
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/autosave/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/autosave/editor_plugin_src.js
new file mode 100644
index 0000000..581e8f6
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/autosave/editor_plugin_src.js
@@ -0,0 +1,422 @@
+/**

+ * 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

+ *

+ * Adds auto-save capability to the TinyMCE text editor to rescue content

+ * inadvertently lost. This plugin was originally developed by Speednet

+ * and that project can be found here: http://code.google.com/p/tinyautosave/

+ *

+ * TECHNOLOGY DISCUSSION:

+ * 

+ * The plugin attempts to use the most advanced features available in the current browser to save

+ * as much content as possible.  There are a total of four different methods used to autosave the

+ * content.  In order of preference, they are:

+ * 

+ * 1. localStorage - A new feature of HTML 5, localStorage can store megabytes of data per domain

+ * on the client computer. Data stored in the localStorage area has no expiration date, so we must

+ * manage expiring the data ourselves.  localStorage is fully supported by IE8, and it is supposed

+ * to be working in Firefox 3 and Safari 3.2, but in reality is is flaky in those browsers.  As

+ * HTML 5 gets wider support, the AutoSave plugin will use it automatically. In Windows Vista/7,

+ * localStorage is stored in the following folder:

+ * C:\Users\[username]\AppData\Local\Microsoft\Internet Explorer\DOMStore\[tempFolder]

+ * 

+ * 2. sessionStorage - A new feature of HTML 5, sessionStorage works similarly to localStorage,

+ * except it is designed to expire after a certain amount of time.  Because the specification

+ * around expiration date/time is very loosely-described, it is preferrable to use locaStorage and

+ * manage the expiration ourselves.  sessionStorage has similar storage characteristics to

+ * localStorage, although it seems to have better support by Firefox 3 at the moment.  (That will

+ * certainly change as Firefox continues getting better at HTML 5 adoption.)

+ * 

+ * 3. UserData - A very under-exploited feature of Microsoft Internet Explorer, UserData is a

+ * way to store up to 128K of data per "document", or up to 1MB of data per domain, on the client

+ * computer.  The feature is available for IE 5+, which makes it available for every version of IE

+ * supported by TinyMCE.  The content is persistent across browser restarts and expires on the

+ * date/time specified, just like a cookie.  However, the data is not cleared when the user clears

+ * cookies on the browser, which makes it well-suited for rescuing autosaved content.  UserData,

+ * like other Microsoft IE browser technologies, is implemented as a behavior attached to a

+ * specific DOM object, so in this case we attach the behavior to the same DOM element that the

+ * TinyMCE editor instance is attached to.

+ */

+

+(function(tinymce) {

+	// Setup constants to help the compressor to reduce script size

+	var PLUGIN_NAME = 'autosave',

+		RESTORE_DRAFT = 'restoredraft',

+		TRUE = true,

+		undefined,

+		unloadHandlerAdded,

+		Dispatcher = tinymce.util.Dispatcher;

+

+	/**

+	 * This plugin adds auto-save capability to the TinyMCE text editor to rescue content

+	 * inadvertently lost. By using localStorage.

+	 *

+	 * @class tinymce.plugins.AutoSave

+	 */

+	tinymce.create('tinymce.plugins.AutoSave', {

+		/**

+		 * 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, url) {

+			var self = this, settings = ed.settings;

+

+			self.editor = ed;

+

+			// Parses the specified time string into a milisecond number 10m, 10s etc.

+			function parseTime(time) {

+				var multipels = {

+					s : 1000,

+					m : 60000

+				};

+

+				time = /^(\d+)([ms]?)$/.exec('' + time);

+

+				return (time[2] ? multipels[time[2]] : 1) * parseInt(time);

+			};

+

+			// Default config

+			tinymce.each({

+				ask_before_unload : TRUE,

+				interval : '30s',

+				retention : '20m',

+				minlength : 50

+			}, function(value, key) {

+				key = PLUGIN_NAME + '_' + key;

+

+				if (settings[key] === undefined)

+					settings[key] = value;

+			});

+

+			// Parse times

+			settings.autosave_interval = parseTime(settings.autosave_interval);

+			settings.autosave_retention = parseTime(settings.autosave_retention);

+

+			// Register restore button

+			ed.addButton(RESTORE_DRAFT, {

+				title : PLUGIN_NAME + ".restore_content",

+				onclick : function() {

+					if (ed.getContent({draft: true}).replace(/\s|&nbsp;|<\/?p[^>]*>|<br[^>]*>/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() {

+						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();

+								userDataElement.save("TinyMCE");

+							},

+

+							getItem : function(key) {

+								var userDataElement = ed.getElement();

+

+								userDataElement.load("TinyMCE");

+

+								return userDataElement.getAttribute(key);

+							},

+

+							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;

+

+			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/dojopuzzles/media/js/tiny_mce/plugins/autosave/langs/en.js b/dojopuzzles/media/js/tiny_mce/plugins/autosave/langs/en.js
new file mode 100644
index 0000000..fce6bd3
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/autosave/langs/en.js
@@ -0,0 +1,4 @@
+tinyMCE.addI18n('en.autosave',{

+restore_content: "Restore auto-saved content",

+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?"

+});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/bbcode/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/bbcode/editor_plugin.js
new file mode 100644
index 0000000..930fdff
--- /dev/null
+++ b/dojopuzzles/media/js/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.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");b(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");b(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");b(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");b(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");b(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");b(/<font>(.*?)<\/font>/gi,"$1");b(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");b(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");b(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");b(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");b(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");b(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");b(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");b(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");b(/<u class=\"quoteStyle\">(.*?)<\/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 style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");b(/<u>/gi,"[u]");b(/<blockquote[^>]*>/gi,"[quote]");b(/<\/blockquote>/gi,"[/quote]");b(/<br \/>/gi,"\n");b(/<br\/>/gi,"\n");b(/<br>/gi,"\n");b(/<p>/gi,"");b(/<\/p>/gi,"\n");b(/&nbsp;/gi," ");b(/&quot;/gi,'"');b(/&lt;/gi,"<");b(/&gt;/gi,">");b(/&amp;/gi,"&");return a},_punbb_bbcode2html:function(a){a=tinymce.trim(a);function b(c,d){a=a.replace(c,d)}b(/\n/gi,"<br />");b(/\[b\]/gi,"<strong>");b(/\[\/b\]/gi,"</strong>");b(/\[i\]/gi,"<em>");b(/\[\/i\]/gi,"</em>");b(/\[u\]/gi,"<u>");b(/\[\/u\]/gi,"</u>");b(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,'<a href="$1">$2</a>');b(/\[url\](.*?)\[\/url\]/gi,'<a href="$1">$1</a>');b(/\[img\](.*?)\[\/img\]/gi,'<img src="$1" />');b(/\[color=(.*?)\](.*?)\[\/color\]/gi,'<font color="$1">$2</font>');b(/\[code\](.*?)\[\/code\]/gi,'<span class="codeStyle">$1</span>&nbsp;');b(/\[quote.*?\](.*?)\[\/quote\]/gi,'<span class="quoteStyle">$1</span>&nbsp;');return a}});tinymce.PluginManager.add("bbcode",tinymce.plugins.BBCodePlugin)})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/bbcode/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/bbcode/editor_plugin_src.js
new file mode 100644
index 0000000..5586637
--- /dev/null
+++ b/dojopuzzles/media/js/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: <strong> to [b]

+			rep(/<a.*?href=\"(.*?)\".*?>(.*?)<\/a>/gi,"[url=$1]$2[/url]");

+			rep(/<font.*?color=\"(.*?)\".*?class=\"codeStyle\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");

+			rep(/<font.*?color=\"(.*?)\".*?class=\"quoteStyle\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");

+			rep(/<font.*?class=\"codeStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[code][color=$1]$2[/color][/code]");

+			rep(/<font.*?class=\"quoteStyle\".*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[quote][color=$1]$2[/color][/quote]");

+			rep(/<span style=\"color: ?(.*?);\">(.*?)<\/span>/gi,"[color=$1]$2[/color]");

+			rep(/<font.*?color=\"(.*?)\".*?>(.*?)<\/font>/gi,"[color=$1]$2[/color]");

+			rep(/<span style=\"font-size:(.*?);\">(.*?)<\/span>/gi,"[size=$1]$2[/size]");

+			rep(/<font>(.*?)<\/font>/gi,"$1");

+			rep(/<img.*?src=\"(.*?)\".*?\/>/gi,"[img]$1[/img]");

+			rep(/<span class=\"codeStyle\">(.*?)<\/span>/gi,"[code]$1[/code]");

+			rep(/<span class=\"quoteStyle\">(.*?)<\/span>/gi,"[quote]$1[/quote]");

+			rep(/<strong class=\"codeStyle\">(.*?)<\/strong>/gi,"[code][b]$1[/b][/code]");

+			rep(/<strong class=\"quoteStyle\">(.*?)<\/strong>/gi,"[quote][b]$1[/b][/quote]");

+			rep(/<em class=\"codeStyle\">(.*?)<\/em>/gi,"[code][i]$1[/i][/code]");

+			rep(/<em class=\"quoteStyle\">(.*?)<\/em>/gi,"[quote][i]$1[/i][/quote]");

+			rep(/<u class=\"codeStyle\">(.*?)<\/u>/gi,"[code][u]$1[/u][/code]");

+			rep(/<u class=\"quoteStyle\">(.*?)<\/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 style=\"text-decoration: ?underline;\">(.*?)<\/span>/gi,"[u]$1[/u]");

+			rep(/<u>/gi,"[u]");

+			rep(/<blockquote[^>]*>/gi,"[quote]");

+			rep(/<\/blockquote>/gi,"[/quote]");

+			rep(/<br \/>/gi,"\n");

+			rep(/<br\/>/gi,"\n");

+			rep(/<br>/gi,"\n");

+			rep(/<p>/gi,"");

+			rep(/<\/p>/gi,"\n");

+			rep(/&nbsp;/gi," ");

+			rep(/&quot;/gi,"\"");

+			rep(/&lt;/gi,"<");

+			rep(/&gt;/gi,">");

+			rep(/&amp;/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 <strong>

+			rep(/\n/gi,"<br />");

+			rep(/\[b\]/gi,"<strong>");

+			rep(/\[\/b\]/gi,"</strong>");

+			rep(/\[i\]/gi,"<em>");

+			rep(/\[\/i\]/gi,"</em>");

+			rep(/\[u\]/gi,"<u>");

+			rep(/\[\/u\]/gi,"</u>");

+			rep(/\[url=([^\]]+)\](.*?)\[\/url\]/gi,"<a href=\"$1\">$2</a>");

+			rep(/\[url\](.*?)\[\/url\]/gi,"<a href=\"$1\">$1</a>");

+			rep(/\[img\](.*?)\[\/img\]/gi,"<img src=\"$1\" />");

+			rep(/\[color=(.*?)\](.*?)\[\/color\]/gi,"<font color=\"$1\">$2</font>");

+			rep(/\[code\](.*?)\[\/code\]/gi,"<span class=\"codeStyle\">$1</span>&nbsp;");

+			rep(/\[quote.*?\](.*?)\[\/quote\]/gi,"<span class=\"quoteStyle\">$1</span>&nbsp;");

+

+			return s; 

+		}

+	});

+

+	// Register plugin

+	tinymce.PluginManager.add('bbcode', tinymce.plugins.BBCodePlugin);

+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/contextmenu/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/contextmenu/editor_plugin.js
new file mode 100644
index 0000000..9749e51
--- /dev/null
+++ b/dojopuzzles/media/js/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(d){var f=this,g;f.editor=d;f.onContextMenu=new tinymce.util.Dispatcher(this);d.onContextMenu.add(function(h,i){if(!i.ctrlKey){if(g){h.selection.setRng(g)}f._getMenu(h).showMenu(i.clientX,i.clientY);a.add(h.getDoc(),"click",function(j){e(h,j)});a.cancel(i)}});d.onRemove.add(function(){if(f._menu){f._menu.removeAll()}});function e(h,i){g=null;if(i&&i.button==2){g=h.selection.getRng();return}if(f._menu){f._menu.removeAll();f._menu.destroy();a.remove(h.getDoc(),"click",e)}}d.onMouseDown.add(e);d.onKeyDown.add(e)},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(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;f.add({title:"advanced.cut_desc",icon:"cut",cmd:"Cut"}).setDisabled(e);f.add({title:"advanced.copy_desc",icon:"copy",cmd:"Copy"}).setDisabled(e);f.add({title:"advanced.paste_desc",icon:"paste",cmd:"Paste"});if((d.nodeName=="A"&&!h.dom.getAttrib(d,"name"))||!e){f.addSeparator();f.add({title:"advanced.link_desc",icon:"link",cmd:h.plugins.advlink?"mceAdvLink":"mceLink",ui:true});f.add({title:"advanced.unlink_desc",icon:"unlink",cmd:"UnLink"})}f.addSeparator();f.add({title:"advanced.image_desc",icon:"image",cmd:h.plugins.advimage?"mceAdvImage":"mceImage",ui:true});f.addSeparator();g=f.addMenu({title:"contextmenu.align"});g.add({title:"contextmenu.left",icon:"justifyleft",cmd:"JustifyLeft"});g.add({title:"contextmenu.center",icon:"justifycenter",cmd:"JustifyCenter"});g.add({title:"contextmenu.right",icon:"justifyright",cmd:"JustifyRight"});g.add({title:"contextmenu.full",icon:"justifyfull",cmd:"JustifyFull"});l.onContextMenu.dispatch(l,f,d,e);return f}});tinymce.PluginManager.add("contextmenu",tinymce.plugins.ContextMenu)})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js
new file mode 100644
index 0000000..13813a6
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/contextmenu/editor_plugin_src.js
@@ -0,0 +1,147 @@
+/**

+ * 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, lastRng;

+

+			t.editor = ed;

+

+			/**

+			 * 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);

+

+			ed.onContextMenu.add(function(ed, e) {

+				if (!e.ctrlKey) {

+					// Restore the last selection since it was removed

+					if (lastRng)

+						ed.selection.setRng(lastRng);

+

+					t._getMenu(ed).showMenu(e.clientX, e.clientY);

+					Event.add(ed.getDoc(), 'click', function(e) {

+						hide(ed, e);

+					});

+					Event.cancel(e);

+				}

+			});

+

+			ed.onRemove.add(function() {

+				if (t._menu)

+					t._menu.removeAll();

+			});

+

+			function hide(ed, e) {

+				lastRng = null;

+

+				// Since the contextmenu event moves

+				// the selection we need to store it away

+				if (e && e.button == 2) {

+					lastRng = ed.selection.getRng();

+					return;

+				}

+

+				if (t._menu) {

+					t._menu.removeAll();

+					t._menu.destroy();

+					Event.remove(ed.getDoc(), 'click', hide);

+				}

+			};

+

+			ed.onMouseDown.add(hide);

+			ed.onKeyDown.add(hide);

+		},

+

+		/**

+		 * 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, 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;

+

+			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);

+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/directionality/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/directionality/editor_plugin.js
new file mode 100644
index 0000000..bce8e73
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/directionality/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Directionality",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceDirectionLTR",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="ltr"){a.dom.setAttrib(d,"dir","ltr")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addCommand("mceDirectionRTL",function(){var d=a.dom.getParent(a.selection.getNode(),a.dom.isBlock);if(d){if(a.dom.getAttrib(d,"dir")!="rtl"){a.dom.setAttrib(d,"dir","rtl")}else{a.dom.setAttrib(d,"dir","")}}a.nodeChanged()});a.addButton("ltr",{title:"directionality.ltr_desc",cmd:"mceDirectionLTR"});a.addButton("rtl",{title:"directionality.rtl_desc",cmd:"mceDirectionRTL"});a.onNodeChange.add(c._nodeChange,c)},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/dojopuzzles/media/js/tiny_mce/plugins/directionality/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/directionality/editor_plugin_src.js
new file mode 100644
index 0000000..4444959
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/directionality/editor_plugin_src.js
@@ -0,0 +1,82 @@
+/**

+ * 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;

+

+			ed.addCommand('mceDirectionLTR', function() {

+				var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock);

+

+				if (e) {

+					if (ed.dom.getAttrib(e, "dir") != "ltr")

+						ed.dom.setAttrib(e, "dir", "ltr");

+					else

+						ed.dom.setAttrib(e, "dir", "");

+				}

+

+				ed.nodeChanged();

+			});

+

+			ed.addCommand('mceDirectionRTL', function() {

+				var e = ed.dom.getParent(ed.selection.getNode(), ed.dom.isBlock);

+

+				if (e) {

+					if (ed.dom.getAttrib(e, "dir") != "rtl")

+						ed.dom.setAttrib(e, "dir", "rtl");

+					else

+						ed.dom.setAttrib(e, "dir", "");

+				}

+

+				ed.nodeChanged();

+			});

+

+			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/dojopuzzles/media/js/tiny_mce/plugins/emotions/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/emotions/editor_plugin.js
new file mode 100644
index 0000000..dbdd8ff
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/emotions/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/emotions/editor_plugin_src.js
new file mode 100644
index 0000000..71d5416
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/emotions/emotions.htm b/dojopuzzles/media/js/tiny_mce/plugins/emotions/emotions.htm
new file mode 100644
index 0000000..55a1d72
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/emotions.htm
@@ -0,0 +1,40 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#emotions_dlg.title}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="js/emotions.js"></script>

+</head>

+<body style="display: none">

+	<div align="center">

+		<div class="title">{#emotions_dlg.title}:<br /><br /></div>

+

+		<table border="0" cellspacing="0" cellpadding="4">

+		  <tr>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-cool.gif','emotions_dlg.cool');"><img src="img/smiley-cool.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cool}" title="{#emotions_dlg.cool}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-cry.gif','emotions_dlg.cry');"><img src="img/smiley-cry.gif" width="18" height="18" border="0" alt="{#emotions_dlg.cry}" title="{#emotions_dlg.cry}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-embarassed.gif','emotions_dlg.embarassed');"><img src="img/smiley-embarassed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.embarassed}" title="{#emotions_dlg.embarassed}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-foot-in-mouth.gif','emotions_dlg.foot_in_mouth');"><img src="img/smiley-foot-in-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.foot_in_mouth}" title="{#emotions_dlg.foot_in_mouth}" /></a></td>

+		  </tr>

+		  <tr>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-frown.gif','emotions_dlg.frown');"><img src="img/smiley-frown.gif" width="18" height="18" border="0" alt="{#emotions_dlg.frown}" title="{#emotions_dlg.frown}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-innocent.gif','emotions_dlg.innocent');"><img src="img/smiley-innocent.gif" width="18" height="18" border="0" alt="{#emotions_dlg.innocent}" title="{#emotions_dlg.innocent}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-kiss.gif','emotions_dlg.kiss');"><img src="img/smiley-kiss.gif" width="18" height="18" border="0" alt="{#emotions_dlg.kiss}" title="{#emotions_dlg.kiss}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-laughing.gif','emotions_dlg.laughing');"><img src="img/smiley-laughing.gif" width="18" height="18" border="0" alt="{#emotions_dlg.laughing}" title="{#emotions_dlg.laughing}" /></a></td>

+		  </tr>

+		  <tr>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-money-mouth.gif','emotions_dlg.money_mouth');"><img src="img/smiley-money-mouth.gif" width="18" height="18" border="0" alt="{#emotions_dlg.money_mouth}" title="{#emotions_dlg.money_mouth}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-sealed.gif','emotions_dlg.sealed');"><img src="img/smiley-sealed.gif" width="18" height="18" border="0" alt="{#emotions_dlg.sealed}" title="{#emotions_dlg.sealed}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-smile.gif','emotions_dlg.smile');"><img src="img/smiley-smile.gif" width="18" height="18" border="0" alt="{#emotions_dlg.smile}" title="{#emotions_dlg.smile}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-surprised.gif','emotions_dlg.surprised');"><img src="img/smiley-surprised.gif" width="18" height="18" border="0" alt="{#emotions_dlg.surprised}" title="{#emotions_dlg.surprised}" /></a></td>

+		  </tr>

+		  <tr>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-tongue-out.gif','emotions_dlg.tongue_out');"><img src="img/smiley-tongue-out.gif" width="18" height="18" border="0" alt="{#emotions_dlg.tongue-out}" title="{#emotions_dlg.tongue_out}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-undecided.gif','emotions_dlg.undecided');"><img src="img/smiley-undecided.gif" width="18" height="18" border="0" alt="{#emotions_dlg.undecided}" title="{#emotions_dlg.undecided}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-wink.gif','emotions_dlg.wink');"><img src="img/smiley-wink.gif" width="18" height="18" border="0" alt="{#emotions_dlg.wink}" title="{#emotions_dlg.wink}" /></a></td>

+			<td><a href="javascript:EmotionsDialog.insert('smiley-yell.gif','emotions_dlg.yell');"><img src="img/smiley-yell.gif" width="18" height="18" border="0" alt="{#emotions_dlg.yell}" title="{#emotions_dlg.yell}" /></a></td>

+		  </tr>

+		</table>

+	</div>

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-cool.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-cool.gif
new file mode 100644
index 0000000..ba90cc3
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-cool.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-cry.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-cry.gif
new file mode 100644
index 0000000..74d897a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-cry.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif
new file mode 100644
index 0000000..963a96b
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-embarassed.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif
new file mode 100644
index 0000000..16f68cc
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-foot-in-mouth.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-frown.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-frown.gif
new file mode 100644
index 0000000..716f55e
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-frown.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif
new file mode 100644
index 0000000..334d49e
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-innocent.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif
new file mode 100644
index 0000000..4efd549
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-kiss.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif
new file mode 100644
index 0000000..1606c11
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-laughing.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif
new file mode 100644
index 0000000..ca2451e
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-money-mouth.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif
new file mode 100644
index 0000000..b33d3cc
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-sealed.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-smile.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-smile.gif
new file mode 100644
index 0000000..e6a9e60
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-smile.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif
new file mode 100644
index 0000000..cb99cdd
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-surprised.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif
new file mode 100644
index 0000000..2075dc1
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-tongue-out.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif
new file mode 100644
index 0000000..bef7e25
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-undecided.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-wink.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-wink.gif
new file mode 100644
index 0000000..9faf1af
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-wink.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-yell.gif b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-yell.gif
new file mode 100644
index 0000000..648e6e8
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/img/smiley-yell.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/emotions/js/emotions.js b/dojopuzzles/media/js/tiny_mce/plugins/emotions/js/emotions.js
new file mode 100644
index 0000000..c549367
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/js/emotions.js
@@ -0,0 +1,22 @@
+tinyMCEPopup.requireLangPack();

+

+var EmotionsDialog = {

+	init : function(ed) {

+		tinyMCEPopup.resizeToInnerSize();

+	},

+

+	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/dojopuzzles/media/js/tiny_mce/plugins/emotions/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/emotions/langs/en_dlg.js
new file mode 100644
index 0000000..3b57ad9
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/emotions/langs/en_dlg.js
@@ -0,0 +1,20 @@
+tinyMCE.addI18n('en.emotions_dlg',{

+title:"Insert emotion",

+desc:"Emotions",

+cool:"Cool",

+cry:"Cry",

+embarassed:"Embarassed",

+foot_in_mouth:"Foot in mouth",

+frown:"Frown",

+innocent:"Innocent",

+kiss:"Kiss",

+laughing:"Laughing",

+money_mouth:"Money mouth",

+sealed:"Sealed",

+smile:"Smile",

+surprised:"Surprised",

+tongue_out:"Tongue out",

+undecided:"Undecided",

+wink:"Wink",

+yell:"Yell"

+});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/example/dialog.htm b/dojopuzzles/media/js/tiny_mce/plugins/example/dialog.htm
new file mode 100644
index 0000000..50b2b34
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/example/dialog.htm
@@ -0,0 +1,22 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#example_dlg.title}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="js/dialog.js"></script>

+</head>

+<body>

+

+<form onsubmit="ExampleDialog.insert();return false;" action="#">

+	<p>Here is a example dialog.</p>

+	<p>Selected text: <input id="someval" name="someval" type="text" class="text" /></p>

+	<p>Custom arg: <input id="somearg" name="somearg" type="text" class="text" /></p>

+

+	<div class="mceActionPanel">

+		<input type="button" id="insert" name="insert" value="{#insert}" onclick="ExampleDialog.insert();" />

+		<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />

+	</div>

+</form>

+

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/example/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/example/editor_plugin.js
new file mode 100644
index 0000000..ec1f81e
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/example/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/example/editor_plugin_src.js
new file mode 100644
index 0000000..9a0e7da
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/example/img/example.gif b/dojopuzzles/media/js/tiny_mce/plugins/example/img/example.gif
new file mode 100644
index 0000000..1ab5da4
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/example/img/example.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/example/js/dialog.js b/dojopuzzles/media/js/tiny_mce/plugins/example/js/dialog.js
new file mode 100644
index 0000000..fa83411
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/example/langs/en.js b/dojopuzzles/media/js/tiny_mce/plugins/example/langs/en.js
new file mode 100644
index 0000000..e0784f8
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/example/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/example/langs/en_dlg.js
new file mode 100644
index 0000000..ebcf948
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/fullpage/css/fullpage.css b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/css/fullpage.css
new file mode 100644
index 0000000..7a3334f
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/css/fullpage.css
@@ -0,0 +1,182 @@
+/* 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;

+}

+

+/* Head list classes */

+

+.headlistwrapper {

+	width: 100%;

+}

+

+.addbutton, .removebutton, .moveupbutton, .movedownbutton {

+	border-top: 1px solid;

+	border-left: 1px solid;

+	border-bottom: 1px solid;

+	border-right: 1px solid;

+	border-color: #F0F0EE;

+	cursor: default;

+	display: block;

+	width: 20px;

+	height: 20px;

+}

+

+#doctypes {

+	width: 200px;

+}

+

+.addbutton:hover, .removebutton:hover, .moveupbutton:hover, .movedownbutton:hover {

+	border: 1px solid #0A246A;

+	background-color: #B6BDD2;

+}

+

+.addbutton {

+	background-image: url('../images/add.gif');

+	float: left;

+	margin-right: 3px;

+}

+

+.removebutton {

+	background-image: url('../images/remove.gif');

+	float: left;

+}

+

+.moveupbutton {

+	background-image: url('../images/move_up.gif');

+	float: left;

+	margin-right: 3px;

+}

+

+.movedownbutton {

+	background-image: url('../images/move_down.gif');

+	float: left;

+}

+

+.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/dojopuzzles/media/js/tiny_mce/plugins/fullpage/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/editor_plugin.js
new file mode 100644
index 0000000..aeaa669
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.FullPagePlugin",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceFullPageProperties",function(){a.windowManager.open({file:b+"/fullpage.htm",width:430+parseInt(a.getLang("fullpage.delta_width",0)),height:495+parseInt(a.getLang("fullpage.delta_height",0)),inline:1},{plugin_url:b,head_html:c.head})});a.addButton("fullpage",{title:"fullpage.desc",cmd:"mceFullPageProperties"});a.onBeforeSetContent.add(c._setContent,c);a.onSetContent.add(c._setBodyAttribs,c);a.onGetContent.add(c._getContent,c)},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}},_setBodyAttribs:function(d,a){var l,c,e,g,b,h,j,f=this.head.match(/body(.*?)>/i);if(f&&f[1]){l=f[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);if(l){for(c=0,e=l.length;c<e;c++){g=l[c].split("=");b=g[0].replace(/\s/,"");h=g[1];if(h){h=h.replace(/^\s+/,"").replace(/\s+$/,"");j=h.match(/^["'](.*)["']$/);if(j){h=j[1]}}else{h=b}d.dom.setAttrib(d.getBody(),"style",h)}}}},_createSerializer:function(){return new tinymce.dom.Serializer({dom:this.editor.dom,apply_source_formatting:true})},_setContent:function(d,b){var h=this,a,j,f=b.content,g,i="";if(b.format=="raw"&&h.head){return}if(b.source_view&&d.getParam("fullpage_hide_in_source_view")){return}f=f.replace(/<(\/?)BODY/gi,"<$1body");a=f.indexOf("<body");if(a!=-1){a=f.indexOf(">",a);h.head=f.substring(0,a+1);j=f.indexOf("</body",a);if(j==-1){j=f.indexOf("</body",j)}b.content=f.substring(a+1,j);h.foot=f.substring(j);function e(c){return c.replace(/<\/?[A-Z]+/g,function(k){return k.toLowerCase()})}h.head=e(h.head);h.foot=e(h.foot)}else{h.head="";if(d.getParam("fullpage_default_xml_pi")){h.head+='<?xml version="1.0" encoding="'+d.getParam("fullpage_default_encoding","ISO-8859-1")+'" ?>\n'}h.head+=d.getParam("fullpage_default_doctype",'<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');h.head+="\n<html>\n<head>\n<title>"+d.getParam("fullpage_default_title","Untitled document")+"</title>\n";if(g=d.getParam("fullpage_default_encoding")){h.head+='<meta http-equiv="Content-Type" content="'+g+'" />\n'}if(g=d.getParam("fullpage_default_font_family")){i+="font-family: "+g+";"}if(g=d.getParam("fullpage_default_font_size")){i+="font-size: "+g+";"}if(g=d.getParam("fullpage_default_text_color")){i+="color: "+g+";"}h.head+="</head>\n<body"+(i?' style="'+i+'"':"")+">\n";h.foot="\n</body>\n</html>"}},_getContent:function(a,c){var b=this;if(!c.source_view||!a.getParam("fullpage_hide_in_source_view")){c.content=tinymce.trim(b.head)+"\n"+tinymce.trim(c.content)+"\n"+tinymce.trim(b.foot)}}});tinymce.PluginManager.add("fullpage",tinymce.plugins.FullPagePlugin)})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/fullpage/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/editor_plugin_src.js
new file mode 100644
index 0000000..a2c9df8
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/editor_plugin_src.js
@@ -0,0 +1,153 @@
+/**

+ * 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.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,

+					head_html : t.head

+				});

+			});

+

+			// Register buttons

+			ed.addButton('fullpage', {title : 'fullpage.desc', cmd : 'mceFullPageProperties'});

+

+			ed.onBeforeSetContent.add(t._setContent, t);

+			ed.onSetContent.add(t._setBodyAttribs, 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

+

+		_setBodyAttribs : function(ed, o) {

+			var bdattr, i, len, kv, k, v, t, attr = this.head.match(/body(.*?)>/i);

+

+			if (attr && attr[1]) {

+				bdattr = attr[1].match(/\s*(\w+\s*=\s*".*?"|\w+\s*=\s*'.*?'|\w+\s*=\s*\w+|\w+)\s*/g);

+

+				if (bdattr) {

+					for(i = 0, len = bdattr.length; i < len; i++) {

+						kv = bdattr[i].split('=');

+						k = kv[0].replace(/\s/,'');

+						v = kv[1];

+

+						if (v) {

+							v = v.replace(/^\s+/,'').replace(/\s+$/,'');

+							t = v.match(/^["'](.*)["']$/);

+

+							if (t)

+								v = t[1];

+						} else

+							v = k;

+

+						ed.dom.setAttrib(ed.getBody(), 'style', v);

+					}

+				}

+			}

+		},

+

+		_createSerializer : function() {

+			return new tinymce.dom.Serializer({

+				dom : this.editor.dom,

+				apply_source_formatting : true

+			});

+		},

+

+		_setContent : function(ed, o) {

+			var t = this, sp, ep, c = o.content, v, st = '';

+

+			// 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' && t.head)

+				return;

+

+			if (o.source_view && ed.getParam('fullpage_hide_in_source_view'))

+				return;

+

+			// Parse out head, body and footer

+			c = c.replace(/<(\/?)BODY/gi, '<$1body');

+			sp = c.indexOf('<body');

+

+			if (sp != -1) {

+				sp = c.indexOf('>', sp);

+				t.head = c.substring(0, sp + 1);

+

+				ep = c.indexOf('</body', sp);

+				if (ep == -1)

+					ep = c.indexOf('</body', ep);

+

+				o.content = c.substring(sp + 1, ep);

+				t.foot = c.substring(ep);

+

+				function low(s) {

+					return s.replace(/<\/?[A-Z]+/g, function(a) {

+						return a.toLowerCase();

+					})

+				};

+

+				t.head = low(t.head);

+				t.foot = low(t.foot);

+			} else {

+				t.head = '';

+				if (ed.getParam('fullpage_default_xml_pi'))

+					t.head += '<?xml version="1.0" encoding="' + ed.getParam('fullpage_default_encoding', 'ISO-8859-1') + '" ?>\n';

+

+				t.head += ed.getParam('fullpage_default_doctype', '<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">');

+				t.head += '\n<html>\n<head>\n<title>' + ed.getParam('fullpage_default_title', 'Untitled document') + '</title>\n';

+

+				if (v = ed.getParam('fullpage_default_encoding'))

+					t.head += '<meta http-equiv="Content-Type" content="' + v + '" />\n';

+

+				if (v = ed.getParam('fullpage_default_font_family'))

+					st += 'font-family: ' + v + ';';

+

+				if (v = ed.getParam('fullpage_default_font_size'))

+					st += 'font-size: ' + v + ';';

+

+				if (v = ed.getParam('fullpage_default_text_color'))

+					st += 'color: ' + v + ';';

+

+				t.head += '</head>\n<body' + (st ? ' style="' + st + '"' : '') + '>\n';

+				t.foot = '\n</body>\n</html>';

+			}

+		},

+

+		_getContent : function(ed, o) {

+			var t = this;

+

+			if (!o.source_view || !ed.getParam('fullpage_hide_in_source_view'))

+				o.content = tinymce.trim(t.head) + '\n' + tinymce.trim(o.content) + '\n' + tinymce.trim(t.foot);

+		}

+	});

+

+	// Register plugin

+	tinymce.PluginManager.add('fullpage', tinymce.plugins.FullPagePlugin);

+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/fullpage/fullpage.htm b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/fullpage.htm
new file mode 100644
index 0000000..c32afaf
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/fullpage.htm
@@ -0,0 +1,571 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#fullpage_dlg.title}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="../../utils/mctabs.js"></script>

+	<script type="text/javascript" src="../../utils/form_utils.js"></script>

+	<script type="text/javascript" src="js/fullpage.js"></script>

+	<link href="css/fullpage.css" rel="stylesheet" type="text/css" />

+</head>

+<body id="advlink" style="display: none">

+    <form onsubmit="updateAction();return false;" name="fullpage" action="#">

+		<div class="tabs">

+			<ul>

+				<li id="meta_tab" class="current"><span><a href="javascript:mcTabs.displayTab('meta_tab','meta_panel');" onmousedown="return false;">{#fullpage_dlg.meta_tab}</a></span></li>

+				<li id="appearance_tab"><span><a href="javascript:mcTabs.displayTab('appearance_tab','appearance_panel');" onmousedown="return false;">{#fullpage_dlg.appearance_tab}</a></span></li>

+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_tab}</a></span></li>

+			</ul>

+		</div>

+

+		<div class="panel_wrapper">

+			<div id="meta_panel" class="panel current">

+				<fieldset>

+					<legend>{#fullpage_dlg.meta_props}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="nowrap"><label for="metatitle">{#fullpage_dlg.meta_title}</label>&nbsp;</td>

+							<td><input type="text" id="metatitle" name="metatitle" value="" class="mceFocus" /></td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="metakeywords">{#fullpage_dlg.meta_keywords}</label>&nbsp;</td>

+							<td><textarea id="metakeywords" name="metakeywords" rows="4"></textarea></td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="metadescription">{#fullpage_dlg.meta_description}</label>&nbsp;</td>

+							<td><textarea id="metadescription" name="metadescription" rows="4"></textarea></td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="metaauthor">{#fullpage_dlg.author}</label>&nbsp;</td>

+							<td><input type="text" id="metaauthor" name="metaauthor" value="" /></td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="metacopyright">{#fullpage_dlg.copyright}</label>&nbsp;</td>

+							<td><input type="text" id="metacopyright" name="metacopyright" value="" /></td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="metarobots">{#fullpage_dlg.meta_robots}</label>&nbsp;</td>

+							<td>

+								<select id="metarobots" name="metarobots">

+											<option value="">{#not_set}</option> 

+											<option value="index,follow">{#fullpage_dlg.meta_index_follow}</option>

+											<option value="index,nofollow">{#fullpage_dlg.meta_index_nofollow}</option>

+											<option value="noindex,follow">{#fullpage_dlg.meta_noindex_follow}</option>

+											<option value="noindex,nofollow">{#fullpage_dlg.meta_noindex_nofollow}</option>

+								</select>

+							</td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#fullpage_dlg.langprops}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="docencoding">{#fullpage_dlg.encoding}</label></td> 

+							<td>

+								<select id="docencoding" name="docencoding"> 

+										<option value="">{#not_set}</option>

+								</select>

+							</td> 

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="doctypes">{#fullpage_dlg.doctypes}</label>&nbsp;</td>

+							<td>

+								<select id="doctypes" name="doctypes">

+										<option value="">{#not_set}</option>

+								</select>

+							</td>

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="langcode">{#fullpage_dlg.langcode}</label>&nbsp;</td>

+							<td><input type="text" id="langcode" name="langcode" value="" /></td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="langdir">{#fullpage_dlg.langdir}</label></td> 

+							<td>

+								<select id="langdir" name="langdir"> 

+										<option value="">{#not_set}</option> 

+										<option value="ltr">{#fullpage_dlg.ltr}</option> 

+										<option value="rtl">{#fullpage_dlg.rtl}</option> 

+								</select>

+							</td> 

+						</tr>

+						<tr>

+							<td class="nowrap"><label for="xml_pi">{#fullpage_dlg.xml_pi}</label>&nbsp;</td>

+							<td><input type="checkbox" id="xml_pi" name="xml_pi" class="checkbox" /></td>

+						</tr>

+					</table>

+				</fieldset>

+			</div>

+

+			<div id="appearance_panel" class="panel">

+				<fieldset>

+					<legend>{#fullpage_dlg.appearance_textprops}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="fontface">{#fullpage_dlg.fontface}</label></td> 

+							<td>

+								<select id="fontface" name="fontface" onchange="changedStyleField(this);">

+										<option value="">{#not_set}</option>

+								</select>

+							</td> 

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="fontsize">{#fullpage_dlg.fontsize}</label></td> 

+							<td>

+								<select id="fontsize" name="fontsize" onchange="changedStyleField(this);">

+										<option value="">{#not_set}</option>

+								</select>

+							</td>

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="textcolor">{#fullpage_dlg.textcolor}</label></td> 

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="textcolor" name="textcolor" type="text" value="" size="9" onchange="updateColor('textcolor_pick','textcolor');changedStyleField(this);" /></td>

+										<td id="textcolor_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#fullpage_dlg.appearance_bgprops}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="bgimage">{#fullpage_dlg.bgimage}</label></td> 

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="bgimage" name="bgimage" type="text" value="" onchange="changedStyleField(this);" /></td>

+										<td id="bgimage_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="bgcolor">{#fullpage_dlg.bgcolor}</label></td> 

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');changedStyleField(this);" /></td>

+										<td id="bgcolor_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td> 

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#fullpage_dlg.appearance_marginprops}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="leftmargin">{#fullpage_dlg.left_margin}</label></td> 

+							<td><input id="leftmargin" name="leftmargin" type="text" value="" onchange="changedStyleField(this);" /></td>

+							<td class="column1"><label for="rightmargin">{#fullpage_dlg.right_margin}</label></td> 

+							<td><input id="rightmargin" name="rightmargin" type="text" value="" onchange="changedStyleField(this);" /></td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="topmargin">{#fullpage_dlg.top_margin}</label></td> 

+							<td><input id="topmargin" name="topmargin" type="text" value="" onchange="changedStyleField(this);" /></td>

+							<td class="column1"><label for="bottommargin">{#fullpage_dlg.bottom_margin}</label></td> 

+							<td><input id="bottommargin" name="bottommargin" type="text" value="" onchange="changedStyleField(this);" /></td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#fullpage_dlg.appearance_linkprops}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="link_color">{#fullpage_dlg.link_color}</label></td> 

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="link_color" name="link_color" type="text" value="" size="9" onchange="updateColor('link_color_pick','link_color');changedStyleField(this);" /></td>

+										<td id="link_color_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td>

+

+							<td class="column1"><label for="visited_color">{#fullpage_dlg.visited_color}</label></td> 

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="visited_color" name="visited_color" type="text" value="" size="9" onchange="updateColor('visited_color_pick','visited_color');changedStyleField(this);" /></td>

+										<td id="visited_color_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td class="column1"><label for="active_color">{#fullpage_dlg.active_color}</label></td> 

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="active_color" name="active_color" type="text" value="" size="9" onchange="updateColor('active_color_pick','active_color');changedStyleField(this);" /></td>

+										<td id="active_color_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td>

+

+							<td>&nbsp;</td>

+							<td>&nbsp;</td>

+

+<!--							<td class="column1"><label for="hover_color">{#fullpage_dlg.hover_color}</label></td> 

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="hover_color" name="hover_color" type="text" value="" size="9" onchange="changedStyleField(this);" /></td>

+										<td id="hover_color_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td> -->

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#fullpage_dlg.appearance_style}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="stylesheet">{#fullpage_dlg.stylesheet}</label></td> 

+							<td><table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="stylesheet" name="stylesheet" type="text" value="" /></td>

+										<td id="stylesheet_browsercontainer">&nbsp;</td>

+									</tr>

+								</table></td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="style">{#fullpage_dlg.style}</label></td> 

+							<td><input id="style" name="style" type="text" value="" onchange="changedStyleField(this);" /></td>

+						</tr>

+					</table>

+				</fieldset>

+			</div>

+

+			<div id="advanced_panel" class="panel">

+				<div id="addmenu">

+					<table border="0" cellpadding="0" cellspacing="0">

+						<tr><td><a href="javascript:addHeadElm('title');" onmousedown="return false;"><span>{#fullpage_dlg.add_title}</span></a></td></tr>

+						<tr><td><a href="javascript:addHeadElm('meta');" onmousedown="return false;"><span>{#fullpage_dlg.add_meta}</span></a></td></tr>

+						<tr><td><a href="javascript:addHeadElm('script');" onmousedown="return false;"><span>{#fullpage_dlg.add_script}</span></a></td></tr>

+						<tr><td><a href="javascript:addHeadElm('style');" onmousedown="return false;"><span>{#fullpage_dlg.add_style}</span></a></td></tr>

+						<tr><td><a href="javascript:addHeadElm('link');" onmousedown="return false;"><span>{#fullpage_dlg.add_link}</span></a></td></tr>

+						<tr><td><a href="javascript:addHeadElm('base');" onmousedown="return false;"><span>{#fullpage_dlg.add_base}</span></a></td></tr>

+						<tr><td><a href="javascript:addHeadElm('comment');" onmousedown="return false;"><span>{#fullpage_dlg.add_comment}</span></a></td></tr>

+					</table>

+				</div>

+

+				<fieldset>

+					<legend>{#fullpage_dlg.head_elements}</legend>

+

+					<div class="headlistwrapper">

+						<div class="toolbar">

+							<div style="float: left">

+								<a id="addbutton" href="javascript:showAddMenu();" onmousedown="return false;" class="addbutton" title="{#fullpage_dlg.add}"></a>

+								<a href="#" onmousedown="return false;" class="removebutton" title="{#fullpage_dlg.remove}"></a>

+							</div>

+							<div style="float: right">

+								<a href="#" onmousedown="return false;" class="moveupbutton" title="{#fullpage_dlg.moveup}"></a>

+								<a href="#" onmousedown="return false;" class="movedownbutton" title="{#fullpage_dlg.movedown}"></a>

+							</div>

+							<br style="clear: both" />

+						</div>

+						<select id="headlist" size="26" onchange="updateHeadElm(this.options[this.selectedIndex].value);">

+							<option value="title_0">&lt;title&gt;Some title bla bla bla&lt;/title&gt;</option>

+							<option value="meta_1">&lt;meta name="keywords"&gt;Some bla bla bla&lt;/meta&gt;</option>

+							<option value="meta_2">&lt;meta name="description"&gt;Some bla bla bla bla bla bla bla bla bla&lt;/meta&gt;</option>

+							<option value="script_3">&lt;script language=&quot;javascript&quot;&gt;...&lt;/script&gt;</option>

+							<option value="style_4">&lt;style&gt;...&lt;/style&gt;</option>

+							<option value="base_5">&lt;base href="." /&gt;</option>

+							<option value="comment_6">&lt;!-- ... --&gt;</option>

+							<option value="link_7">&lt;link href="." /&gt;</option>

+						</select>

+					</div>

+				</fieldset>

+

+				<fieldset id="meta_element">

+					<legend>{#fullpage_dlg.meta_element}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="element_meta_type">{#fullpage_dlg.type}</label></td> 

+							<td><select id="element_meta_type">

+										<option value="name">name</option>

+										<option value="http-equiv">http-equiv</option>

+								</select></td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="element_meta_name">{#fullpage_dlg.name}</label></td> 

+							<td><input id="element_meta_name" name="element_meta_name" type="text" value="" /></td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="element_meta_content">{#fullpage_dlg.content}</label></td> 

+							<td><input id="element_meta_content" name="element_meta_content" type="text" value="" /></td>

+						</tr>

+					</table>

+

+					<input type="button" id="meta_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />

+				</fieldset>

+

+				<fieldset id="title_element">

+					<legend>{#fullpage_dlg.title_element}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="element_title">{#fullpage_dlg.meta_title}</label></td> 

+							<td><input id="element_title" name="element_title" type="text" value="" /></td>

+						</tr>

+					</table>

+

+					<input type="button" id="title_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />

+				</fieldset>

+

+				<fieldset id="script_element">

+					<legend>{#fullpage_dlg.script_element}</legend>

+

+					<div class="tabs">

+						<ul>

+							<li id="script_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('script_props_tab','script_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>

+							<li id="script_value_tab"><span><a href="javascript:mcTabs.displayTab('script_value_tab','script_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>

+						</ul>

+					</div>

+

+					<br style="clear: both" />

+

+					<div class="panel_wrapper">

+						<div id="script_props_panel" class="panel current">

+							<table border="0" cellpadding="4" cellspacing="0">

+								<tr>

+									<td class="column1"><label for="element_script_type">{#fullpage_dlg.type}</label></td> 

+									<td><select id="element_script_type">

+										<option value="text/javascript">text/javascript</option>

+										<option value="text/jscript">text/jscript</option>

+										<option value="text/vbscript">text/vbscript</option>

+										<option value="text/vbs">text/vbs</option>

+										<option value="text/ecmascript">text/ecmascript</option>

+										<option value="text/xml">text/xml</option>

+									</select></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_script_src">{#fullpage_dlg.src}</label></td> 

+									<td><table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="element_script_src" name="element_script_src" type="text" value="" /></td>

+										<td id="script_src_pickcontainer">&nbsp;</td>

+									</tr>

+								</table></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_script_charset">{#fullpage_dlg.charset}</label></td> 

+									<td><select id="element_script_charset"><option value="">{#not_set}</option></select></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_script_defer">{#fullpage_dlg.defer}</label></td> 

+									<td><input type="checkbox" id="element_script_defer" name="element_script_defer" class="checkbox" /></td>

+								</tr>

+							</table>

+						</div>

+

+						<div id="script_value_panel" class="panel">

+							<textarea id="element_script_value"></textarea>

+						</div>

+					</div>

+

+					<input type="button" id="script_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />

+				</fieldset>

+

+				<fieldset id="style_element">

+					<legend>{#fullpage_dlg.style_element}</legend>

+

+					<div class="tabs">

+						<ul>

+							<li id="style_props_tab" class="current"><span><a href="javascript:mcTabs.displayTab('style_props_tab','style_props_panel');" onmousedown="return false;">{#fullpage_dlg.properties}</a></span></li>

+							<li id="style_value_tab"><span><a href="javascript:mcTabs.displayTab('style_value_tab','style_value_panel');" onmousedown="return false;">{#fullpage_dlg.value}</a></span></li>

+						</ul>

+					</div>

+

+					<br style="clear: both" />

+

+					<div class="panel_wrapper">

+						<div id="style_props_panel" class="panel current">

+							<table border="0" cellpadding="4" cellspacing="0">

+								<tr>

+									<td class="column1"><label for="element_style_type">{#fullpage_dlg.type}</label></td> 

+									<td><select id="element_style_type">

+										<option value="text/css">text/css</option>

+									</select></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_style_media">{#fullpage_dlg.media}</label></td> 

+									<td><select id="element_style_media"></select></td>

+								</tr>

+							</table>

+						</div>

+

+						<div id="style_value_panel" class="panel">

+							<textarea id="element_style_value"></textarea>

+						</div>

+					</div>

+

+					<input type="button" id="style_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />

+				</fieldset>

+

+				<fieldset id="base_element">

+					<legend>{#fullpage_dlg.base_element}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td class="column1"><label for="element_base_href">{#fullpage_dlg.href}</label></td> 

+							<td><input id="element_base_href" name="element_base_href" type="text" value="" /></td>

+						</tr>

+						<tr>

+							<td class="column1"><label for="element_base_target">{#fullpage_dlg.target}</label></td> 

+							<td><input id="element_base_target" name="element_base_target" type="text" value="" /></td>

+						</tr>

+					</table>

+

+					<input type="button" id="base_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />

+				</fieldset>

+

+				<fieldset id="link_element">

+					<legend>{#fullpage_dlg.link_element}</legend>

+

+					<div class="tabs">

+						<ul>

+							<li id="link_general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('link_general_tab','link_general_panel');" onmousedown="return false;">{#fullpage_dlg.general_props}</a></span></li>

+							<li id="link_advanced_tab"><span><a href="javascript:mcTabs.displayTab('link_advanced_tab','link_advanced_panel');" onmousedown="return false;">{#fullpage_dlg.advanced_props}</a></span></li>

+						</ul>

+					</div>

+

+					<br style="clear: both" />

+

+					<div class="panel_wrapper">

+						<div id="link_general_panel" class="panel current">

+							<table border="0" cellpadding="4" cellspacing="0">

+								<tr>

+									<td class="column1"><label for="element_link_href">{#fullpage_dlg.href}</label></td> 

+									<td><table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="element_link_href" name="element_link_href" type="text" value="" /></td>

+										<td id="link_href_pickcontainer">&nbsp;</td>

+									</tr>

+								</table></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_link_title">{#fullpage_dlg.meta_title}</label></td> 

+									<td><input id="element_link_title" name="element_link_title" type="text" value="" /></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_link_type">{#fullpage_dlg.type}</label></td> 

+									<td><select id="element_link_type" name="element_link_type">

+										<option value="text/css">text/css</option>

+										<option value="text/javascript">text/javascript</option>

+									</select></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_link_media">{#fullpage_dlg.media}</label></td> 

+									<td><select id="element_link_media" name="element_link_media"></select></td>

+								</tr>

+								<tr>

+									<td><label for="element_style_rel">{#fullpage_dlg.rel}</label></td>

+									<td><select id="element_style_rel" name="element_style_rel"> 

+											<option value="">{#not_set}</option> 

+											<option value="stylesheet">Stylesheet</option>

+											<option value="alternate">Alternate</option>

+											<option value="designates">Designates</option>

+											<option value="start">Start</option>

+											<option value="next">Next</option>

+											<option value="prev">Prev</option>

+											<option value="contents">Contents</option>

+											<option value="index">Index</option>

+											<option value="glossary">Glossary</option>

+											<option value="copyright">Copyright</option>

+											<option value="chapter">Chapter</option>

+											<option value="subsection">Subsection</option>

+											<option value="appendix">Appendix</option>

+											<option value="help">Help</option>

+											<option value="bookmark">Bookmark</option>

+										</select> 

+									</td>

+								</tr>

+							</table>

+						</div>

+

+						<div id="link_advanced_panel" class="panel">

+							<table border="0" cellpadding="4" cellspacing="0">

+								<tr>

+									<td class="column1"><label for="element_link_charset">{#fullpage_dlg.charset}</label></td> 

+									<td><select id="element_link_charset"><option value="">{#not_set}</option></select></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_link_hreflang">{#fullpage_dlg.hreflang}</label></td> 

+									<td><input id="element_link_hreflang" name="element_link_hreflang" type="text" value="" /></td>

+								</tr>

+								<tr>

+									<td class="column1"><label for="element_link_target">{#fullpage_dlg.target}</label></td> 

+									<td><input id="element_link_target" name="element_link_target" type="text" value="" /></td>

+								</tr>

+								<tr>

+									<td><label for="element_style_rev">{#fullpage_dlg.rev}</label></td>

+									<td><select id="element_style_rev" name="element_style_rev"> 

+											<option value="">{#not_set}</option> 

+											<option value="alternate">Alternate</option> 

+											<option value="designates">Designates</option> 

+											<option value="stylesheet">Stylesheet</option> 

+											<option value="start">Start</option> 

+											<option value="next">Next</option> 

+											<option value="prev">Prev</option> 

+											<option value="contents">Contents</option> 

+											<option value="index">Index</option> 

+											<option value="glossary">Glossary</option> 

+											<option value="copyright">Copyright</option> 

+											<option value="chapter">Chapter</option> 

+											<option value="subsection">Subsection</option> 

+											<option value="appendix">Appendix</option> 

+											<option value="help">Help</option> 

+											<option value="bookmark">Bookmark</option> 

+										</select> 

+									</td>

+								</tr>

+							</table>

+						</div>

+					</div>

+

+					<input type="button" id="link_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />

+				</fieldset>

+

+				<fieldset id="comment_element">

+					<legend>{#fullpage_dlg.comment_element}</legend>

+

+					<textarea id="element_comment_value"></textarea>

+

+					<input type="button" id="comment_updateelement" class="updateElementButton" name="update" value="{#update}" onclick="updateElement();" />

+				</fieldset>

+			</div>

+		</div>

+

+		<div class="mceActionPanel">

+			<input type="submit" id="insert" name="update" value="{#update}" />

+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />

+		</div>

+    </form>

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/fullpage/js/fullpage.js b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/js/fullpage.js
new file mode 100644
index 0000000..a1bb719
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/js/fullpage.js
@@ -0,0 +1,471 @@
+/**

+ * fullpage.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 doc;

+

+var defaultDocTypes = 

+	'XHTML 1.0 Transitional=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">,' +

+	'XHTML 1.0 Frameset=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Frameset//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-frameset.dtd">,' +

+	'XHTML 1.0 Strict=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">,' +

+	'XHTML 1.1=<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.1//EN" "http://www.w3.org/TR/xhtml11/DTD/xhtml11.dtd">,' +

+	'HTML 4.01 Transitional=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">,' +

+	'HTML 4.01 Strict=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" "http://www.w3.org/TR/html4/strict.dtd">,' +

+	'HTML 4.01 Frameset=<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN" "http://www.w3.org/TR/html4/frameset.dtd">';

+

+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 defaultMediaTypes = 

+	'all=all,' +

+	'screen=screen,' +

+	'print=print,' +

+	'tty=tty,' +

+	'tv=tv,' +

+	'projection=projection,' +

+	'handheld=handheld,' +

+	'braille=braille,' +

+	'aural=aural';

+

+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 init() {

+	var f = document.forms['fullpage'], el = f.elements, e, i, p, doctypes, encodings, mediaTypes, fonts, ed = tinyMCEPopup.editor, dom = tinyMCEPopup.dom, style;

+

+	// Setup doctype select box

+	doctypes = ed.getParam("fullpage_doctypes", defaultDocTypes).split(',');

+	for (i=0; i<doctypes.length; i++) {

+		p = doctypes[i].split('=');

+

+		if (p.length > 1)

+			addSelectValue(f, 'doctypes', p[0], p[1]);

+	}

+

+	// Setup fonts select box

+	fonts = ed.getParam("fullpage_fonts", defaultFontNames).split(';');

+	for (i=0; i<fonts.length; i++) {

+		p = fonts[i].split('=');

+

+		if (p.length > 1)

+			addSelectValue(f, 'fontface', p[0], p[1]);

+	}

+

+	// Setup fontsize select box

+	fonts = ed.getParam("fullpage_fontsizes", defaultFontSizes).split(',');

+	for (i=0; i<fonts.length; i++)

+		addSelectValue(f, 'fontsize', fonts[i], fonts[i]);

+

+	// Setup mediatype select boxs

+	mediaTypes = ed.getParam("fullpage_media_types", defaultMediaTypes).split(',');

+	for (i=0; i<mediaTypes.length; i++) {

+		p = mediaTypes[i].split('=');

+

+		if (p.length > 1) {

+			addSelectValue(f, 'element_style_media', p[0], p[1]);

+			addSelectValue(f, 'element_link_media', p[0], p[1]);

+		}

+	}

+

+	// Setup encodings select box

+	encodings = ed.getParam("fullpage_encodings", defaultEncodings).split(',');

+	for (i=0; i<encodings.length; i++) {

+		p = encodings[i].split('=');

+

+		if (p.length > 1) {

+			addSelectValue(f, 'docencoding', p[0], p[1]);

+			addSelectValue(f, 'element_script_charset', p[0], p[1]);

+			addSelectValue(f, 'element_link_charset', p[0], p[1]);

+		}

+	}

+

+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');

+	document.getElementById('link_color_pickcontainer').innerHTML = getColorPickerHTML('link_color_pick','link_color');

+	//document.getElementById('hover_color_pickcontainer').innerHTML = getColorPickerHTML('hover_color_pick','hover_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('link_href_pickcontainer').innerHTML = getBrowserHTML('link_href_browser','element_link_href','file','fullpage');

+	document.getElementById('script_src_pickcontainer').innerHTML = getBrowserHTML('script_src_browser','element_script_src','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';

+

+	// Add iframe

+	dom.add(document.body, 'iframe', {id : 'documentIframe', src : 'javascript:""', style : {display : 'none'}});

+	doc = dom.get('documentIframe').contentWindow.document;

+	h = tinyMCEPopup.getWindowArg('head_html');

+

+	// Preprocess the HTML disable scripts and urls

+	h = h.replace(/<script>/gi, '<script type="text/javascript">');

+	h = h.replace(/type=([\"\'])?/gi, 'type=$1-mce-');

+	h = h.replace(/(src=|href=)/g, '_mce_$1');

+

+	// Write in the content in the iframe

+	doc.write(h + '</body></html>');

+	doc.close();

+

+	// Parse xml and doctype

+	xmlVer = getReItem(/<\?\s*?xml.*?version\s*?=\s*?"(.*?)".*?\?>/gi, h, 1);

+	xmlEnc = getReItem(/<\?\s*?xml.*?encoding\s*?=\s*?"(.*?)".*?\?>/gi, h, 1);

+	docType = getReItem(/<\!DOCTYPE.*?>/gi, h.replace(/\n/g, ''), 0).replace(/ +/g, ' ');

+	f.langcode.value = getReItem(/lang="(.*?)"/gi, h, 1);

+

+	// Parse title

+	if (e = doc.getElementsByTagName('title')[0])

+		el.metatitle.value = e.textContent || e.text;

+

+	// Parse meta

+	tinymce.each(doc.getElementsByTagName('meta'), function(n) {

+		var na = (n.getAttribute('name', 2) || '').toLowerCase(), va = n.getAttribute('content', 2), eq = n.getAttribute('httpEquiv', 2) || '';

+

+		e = el['meta' + na];

+

+		if (na == 'robots') {

+			selectByValue(f, 'metarobots', tinymce.trim(va), true, true);

+			return;

+		}

+

+		switch (eq.toLowerCase()) {

+			case "content-type":

+				tmp = getReItem(/charset\s*=\s*(.*)\s*/gi, va, 1);

+

+				// Override XML encoding

+				if (tmp != "")

+					xmlEnc = tmp;

+

+				return;

+		}

+

+		if (e)

+			e.value = va;

+	});

+

+	selectByValue(f, 'doctypes', docType, true, true);

+	selectByValue(f, 'docencoding', xmlEnc, true, true);

+	selectByValue(f, 'langdir', doc.body.getAttribute('dir', 2) || '', true, true);

+

+	if (xmlVer != '')

+		el.xml_pi.checked = true;

+

+	// Parse appearance

+

+	// Parse primary stylesheet

+	tinymce.each(doc.getElementsByTagName("link"), function(l) {

+		var m = l.getAttribute('media', 2) || '', t = l.getAttribute('type', 2) || '';

+

+		if (t == "-mce-text/css" && (m == "" || m == "screen" || m == "all") && (l.getAttribute('rel', 2) || '') == "stylesheet") {

+			f.stylesheet.value = l.getAttribute('_mce_href', 2) || '';

+			return false;

+		}

+	});

+

+	// Get from style elements

+	tinymce.each(doc.getElementsByTagName("style"), function(st) {

+		var tmp = parseStyleElement(st);

+

+		for (x=0; x<tmp.length; x++) {

+			if (tmp[x].rule.indexOf('a:visited') != -1 && tmp[x].data['color'])

+				f.visited_color.value = tmp[x].data['color'];

+

+			if (tmp[x].rule.indexOf('a:link') != -1 && tmp[x].data['color'])

+				f.link_color.value = tmp[x].data['color'];

+

+			if (tmp[x].rule.indexOf('a:active') != -1 && tmp[x].data['color'])

+				f.active_color.value = tmp[x].data['color'];

+		}

+	});

+

+	f.textcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "text");

+	f.active_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "alink");

+	f.link_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "link");

+	f.visited_color.value = tinyMCEPopup.dom.getAttrib(doc.body, "vlink");

+	f.bgcolor.value = tinyMCEPopup.dom.getAttrib(doc.body, "bgcolor");

+	f.bgimage.value = tinyMCEPopup.dom.getAttrib(doc.body, "background");

+

+	// Get from style info

+	style = tinyMCEPopup.dom.parseStyle(tinyMCEPopup.dom.getAttrib(doc.body, 'style'));

+

+	if (style['font-family'])

+		selectByValue(f, 'fontface', style['font-family'], true, true);

+	else

+		selectByValue(f, 'fontface', ed.getParam("fullpage_default_fontface", ""), true, true);

+

+	if (style['font-size'])

+		selectByValue(f, 'fontsize', style['font-size'], true, true);

+	else

+		selectByValue(f, 'fontsize', ed.getParam("fullpage_default_fontsize", ""), true, true);

+

+	if (style['color'])

+		f.textcolor.value = convertRGBToHex(style['color']);

+

+	if (style['background-image'])

+		f.bgimage.value = style['background-image'].replace(new RegExp("url\\('?([^']*)'?\\)", 'gi'), "$1");

+

+	if (style['background-color'])

+		f.bgcolor.value = style['background-color'];

+

+	if (style['margin']) {

+		tmp = style['margin'].replace(/[^0-9 ]/g, '');

+		tmp = tmp.split(/ +/);

+		f.topmargin.value = tmp.length > 0 ? tmp[0] : '';

+		f.rightmargin.value = tmp.length > 1 ? tmp[1] : tmp[0];

+		f.bottommargin.value = tmp.length > 2 ? tmp[2] : tmp[0];

+		f.leftmargin.value = tmp.length > 3 ? tmp[3] : tmp[0];

+	}

+

+	if (style['margin-left'])

+		f.leftmargin.value = style['margin-left'].replace(/[^0-9]/g, '');

+

+	if (style['margin-right'])

+		f.rightmargin.value = style['margin-right'].replace(/[^0-9]/g, '');

+

+	if (style['margin-top'])

+		f.topmargin.value = style['margin-top'].replace(/[^0-9]/g, '');

+

+	if (style['margin-bottom'])

+		f.bottommargin.value = style['margin-bottom'].replace(/[^0-9]/g, '');

+

+	f.style.value = tinyMCEPopup.dom.serializeStyle(style);

+

+	// 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');

+}

+

+function getReItem(r, s, i) {

+	var c = r.exec(s);

+

+	if (c && c.length > i)

+		return c[i];

+

+	return '';

+}

+

+function updateAction() {

+	var f = document.forms[0], nl, i, h, v, s, head, html, l, tmp, addlink = true, ser;

+

+	head = doc.getElementsByTagName('head')[0];

+

+	// Fix scripts without a type

+	nl = doc.getElementsByTagName('script');

+	for (i=0; i<nl.length; i++) {

+		if (tinyMCEPopup.dom.getAttrib(nl[i], '_mce_type') == '')

+			nl[i].setAttribute('_mce_type', 'text/javascript');

+	}

+

+	// Get primary stylesheet

+	nl = doc.getElementsByTagName("link");

+	for (i=0; i<nl.length; i++) {

+		l = nl[i];

+

+		tmp = tinyMCEPopup.dom.getAttrib(l, 'media');

+

+		if (tinyMCEPopup.dom.getAttrib(l, '_mce_type') == "text/css" && (tmp == "" || tmp == "screen" || tmp == "all") && tinyMCEPopup.dom.getAttrib(l, 'rel') == "stylesheet") {

+			addlink = false;

+

+			if (f.stylesheet.value == '')

+				l.parentNode.removeChild(l);

+			else

+				l.setAttribute('_mce_href', f.stylesheet.value);

+

+			break;

+		}

+	}

+

+	// Add new link

+	if (f.stylesheet.value != '') {

+		l = doc.createElement('link');

+

+		l.setAttribute('type', 'text/css');

+		l.setAttribute('_mce_href', f.stylesheet.value);

+		l.setAttribute('rel', 'stylesheet');

+

+		head.appendChild(l);

+	}

+

+	setMeta(head, 'keywords', f.metakeywords.value);

+	setMeta(head, 'description', f.metadescription.value);

+	setMeta(head, 'author', f.metaauthor.value);

+	setMeta(head, 'copyright', f.metacopyright.value);

+	setMeta(head, 'robots', getSelectValue(f, 'metarobots'));

+	setMeta(head, 'Content-Type', getSelectValue(f, 'docencoding'));

+

+	doc.body.dir = getSelectValue(f, 'langdir');

+	doc.body.style.cssText = f.style.value;

+

+	doc.body.setAttribute('vLink', f.visited_color.value);

+	doc.body.setAttribute('link', f.link_color.value);

+	doc.body.setAttribute('text', f.textcolor.value);

+	doc.body.setAttribute('aLink', f.active_color.value);

+

+	doc.body.style.fontFamily = getSelectValue(f, 'fontface');

+	doc.body.style.fontSize = getSelectValue(f, 'fontsize');

+	doc.body.style.backgroundColor = f.bgcolor.value;

+

+	if (f.leftmargin.value != '')

+		doc.body.style.marginLeft = f.leftmargin.value + 'px';

+

+	if (f.rightmargin.value != '')

+		doc.body.style.marginRight = f.rightmargin.value + 'px';

+

+	if (f.bottommargin.value != '')

+		doc.body.style.marginBottom = f.bottommargin.value + 'px';

+

+	if (f.topmargin.value != '')

+		doc.body.style.marginTop = f.topmargin.value + 'px';

+

+	html = doc.getElementsByTagName('html')[0];

+	html.setAttribute('lang', f.langcode.value);

+	html.setAttribute('xml:lang', f.langcode.value);

+

+	if (f.bgimage.value != '')

+		doc.body.style.backgroundImage = "url('" + f.bgimage.value + "')";

+	else

+		doc.body.style.backgroundImage = '';

+

+	ser = tinyMCEPopup.editor.plugins.fullpage._createSerializer();

+	ser.setRules('-title,meta[http-equiv|name|content],base[href|target],link[href|rel|type|title|media],style[type],script[type|language|src],html[lang|xml::lang|xmlns],body[style|dir|vlink|link|text|alink],head');

+

+	h = ser.serialize(doc.documentElement);

+	h = h.substring(0, h.lastIndexOf('</body>'));

+

+	if (h.indexOf('<title>') == -1)

+		h = h.replace(/<head.*?>/, '$&\n' + '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');

+	else

+		h = h.replace(/<title>(.*?)<\/title>/, '<title>' + tinyMCEPopup.dom.encode(f.metatitle.value) + '</title>');

+

+	if ((v = getSelectValue(f, 'doctypes')) != '')

+		h = v + '\n' + h;

+

+	if (f.xml_pi.checked) {

+		s = '<?xml version="1.0"';

+

+		if ((v = getSelectValue(f, 'docencoding')) != '')

+			s += ' encoding="' + v + '"';

+

+		s += '?>\n';

+		h = s + h;

+	}

+

+	h = h.replace(/type=\"\-mce\-/gi, 'type="');

+

+	tinyMCEPopup.editor.plugins.fullpage.head = h;

+	tinyMCEPopup.editor.plugins.fullpage._setBodyAttribs(tinyMCEPopup.editor, {});

+	tinyMCEPopup.close();

+}

+

+function changedStyleField(field) {

+}

+

+function setMeta(he, k, v) {

+	var nl, i, m;

+

+	nl = he.getElementsByTagName('meta');

+	for (i=0; i<nl.length; i++) {

+		if (k == 'Content-Type' && tinyMCEPopup.dom.getAttrib(nl[i], 'http-equiv') == k) {

+			if (v == '')

+				nl[i].parentNode.removeChild(nl[i]);

+			else

+				nl[i].setAttribute('content', "text/html; charset=" + v);

+

+			return;

+		}

+

+		if (tinyMCEPopup.dom.getAttrib(nl[i], 'name') == k) {

+			if (v == '')

+				nl[i].parentNode.removeChild(nl[i]);

+			else

+				nl[i].setAttribute('content', v);

+			return;

+		}

+	}

+

+	if (v == '')

+		return;

+

+	m = doc.createElement('meta');

+

+	if (k == 'Content-Type')

+		m.httpEquiv = k;

+	else

+		m.setAttribute('name', k);

+

+	m.setAttribute('content', v);

+	he.appendChild(m);

+}

+

+function parseStyleElement(e) {

+	var v = e.innerHTML;

+	var p, i, r;

+

+	v = v.replace(/<!--/gi, '');

+	v = v.replace(/-->/gi, '');

+	v = v.replace(/[\n\r]/gi, '');

+	v = v.replace(/\s+/gi, ' ');

+

+	r = [];

+	p = v.split(/{|}/);

+

+	for (i=0; i<p.length; i+=2) {

+		if (p[i] != "")

+			r[r.length] = {rule : tinymce.trim(p[i]), data : tinyMCEPopup.dom.parseStyle(p[i+1])};

+	}

+

+	return r;

+}

+

+function serializeStyleElement(d) {

+	var i, s, st;

+

+	s = '<!--\n';

+

+	for (i=0; i<d.length; i++) {

+		s += d[i].rule + ' {\n';

+

+		st = tinyMCE.serializeStyle(d[i].data);

+

+		if (st != '')

+			st += ';';

+

+		s += st.replace(/;/g, ';\n');

+		s += '}\n';

+

+		if (i != d.length - 1)

+			s += '\n';

+	}

+

+	s += '\n-->';

+

+	return s;

+}

+

+tinyMCEPopup.onInit.add(init);

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/fullpage/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/langs/en_dlg.js
new file mode 100644
index 0000000..f5801b8
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullpage/langs/en_dlg.js
@@ -0,0 +1,85 @@
+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:"Src",

+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/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/editor_plugin.js
new file mode 100644
index 0000000..4437bd2
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.DOM;tinymce.create("tinymce.plugins.FullScreenPlugin",{init:function(c,d){var e=this,f={},b;e.editor=c;c.addCommand("mceFullScreen",function(){var h,i=a.doc.documentElement;if(c.getParam("fullscreen_is_enabled")){if(c.getParam("fullscreen_new_window")){closeFullscreen()}else{a.win.setTimeout(function(){tinymce.dom.Event.remove(a.win,"resize",e.resizeFunc);tinyMCE.get(c.getParam("fullscreen_editor_id")).setContent(c.getContent({format:"raw"}),{format:"raw"});tinyMCE.remove(c);a.remove("mce_fullscreen_container");i.style.overflow=c.getParam("fullscreen_html_overflow");a.setStyle(a.doc.body,"overflow",c.getParam("fullscreen_overflow"));a.win.scrollTo(c.getParam("fullscreen_scrollx"),c.getParam("fullscreen_scrolly"));tinyMCE.settings=tinyMCE.oldSettings},10)}return}if(c.getParam("fullscreen_new_window")){h=a.win.open(d+"/fullscreen.htm","mceFullScreenPopup","fullscreen=yes,menubar=no,toolbar=no,scrollbars=no,resizable=yes,left=0,top=0,width="+screen.availWidth+",height="+screen.availHeight);try{h.resizeTo(screen.availWidth,screen.availHeight)}catch(g){}}else{tinyMCE.oldSettings=tinyMCE.settings;f.fullscreen_overflow=a.getStyle(a.doc.body,"overflow",1)||"auto";f.fullscreen_html_overflow=a.getStyle(i,"overflow",1);b=a.getViewPort();f.fullscreen_scrollx=b.x;f.fullscreen_scrolly=b.y;if(tinymce.isOpera&&f.fullscreen_overflow=="visible"){f.fullscreen_overflow="auto"}if(tinymce.isIE&&f.fullscreen_overflow=="scroll"){f.fullscreen_overflow="auto"}if(tinymce.isIE&&(f.fullscreen_html_overflow=="visible"||f.fullscreen_html_overflow=="scroll")){f.fullscreen_html_overflow="auto"}if(f.fullscreen_overflow=="0px"){f.fullscreen_overflow=""}a.setStyle(a.doc.body,"overflow","hidden");i.style.overflow="hidden";b=a.getViewPort();a.win.scrollTo(0,0);if(tinymce.isIE){b.h-=1}n=a.add(a.doc.body,"div",{id:"mce_fullscreen_container",style:"position:"+(tinymce.isIE6||(tinymce.isIE&&!a.boxModel)?"absolute":"fixed")+";top:0;left:0;width:"+b.w+"px;height:"+b.h+"px;z-index:200000;"});a.add(n,"div",{id:"mce_fullscreen"});tinymce.each(c.settings,function(j,k){f[k]=j});f.id="mce_fullscreen";f.width=n.clientWidth;f.height=n.clientHeight-15;f.fullscreen_is_enabled=true;f.fullscreen_editor_id=c.id;f.theme_advanced_resizing=false;f.save_onsavecallback=function(){c.setContent(tinyMCE.get(f.id).getContent({format:"raw"}),{format:"raw"});c.execCommand("mceSave")};tinymce.each(c.getParam("fullscreen_settings"),function(l,j){f[j]=l});if(f.theme_advanced_toolbar_location==="external"){f.theme_advanced_toolbar_location="top"}e.fullscreenEditor=new tinymce.Editor("mce_fullscreen",f);e.fullscreenEditor.onInit.add(function(){e.fullscreenEditor.setContent(c.getContent());e.fullscreenEditor.focus()});e.fullscreenEditor.render();e.fullscreenElement=new tinymce.dom.Element("mce_fullscreen_container");e.fullscreenElement.update();e.resizeFunc=tinymce.dom.Event.add(a.win,"resize",function(){var m=tinymce.DOM.getViewPort(),k=e.fullscreenEditor,j,l;j=k.dom.getSize(k.getContainer().firstChild);l=k.dom.getSize(k.getContainer().getElementsByTagName("iframe")[0]);k.theme.resizeTo(m.w-j.w+l.w,m.h-j.h+l.h)})}});c.addButton("fullscreen",{title:"fullscreen.desc",cmd:"mceFullScreen"});c.onNodeChange.add(function(h,g){g.setActive("fullscreen",h.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/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/editor_plugin_src.js
new file mode 100644
index 0000000..0efd9bb
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/editor_plugin_src.js
@@ -0,0 +1,151 @@
+/**

+ * 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;

+

+			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({format : 'raw'}), {format : 'raw'});

+							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;

+

+					n = DOM.add(DOM.doc.body, 'div', {id : 'mce_fullscreen_container', style : 'position:' + (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel) ? 'absolute' : 'fixed') + ';top:0;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({format : 'raw'}), {format : 'raw'});

+						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().firstChild);

+						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);

+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/fullscreen.htm b/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/fullscreen.htm
new file mode 100644
index 0000000..4c4f27e
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/fullscreen/fullscreen.htm
@@ -0,0 +1,109 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title></title>

+	<script type="text/javascript" src="../../tiny_mce.js"></script>

+	<script type="text/javascript">

+		function patchCallback(settings, key) {

+			if (settings[key])

+				settings[key] = "window.opener." + settings[key];

+		}

+

+		var settings = {}, paSe = window.opener.tinyMCE.activeEditor.settings, oeID = window.opener.tinyMCE.activeEditor.id;

+

+		// Clone array

+		for (var n in paSe)

+			settings[n] = paSe[n];

+

+		// Override options for fullscreen

+		for (var n in paSe.fullscreen_settings)

+			settings[n] = paSe.fullscreen_settings[n];

+

+		// Patch callbacks, make them point to window.opener

+		patchCallback(settings, 'urlconverter_callback');

+		patchCallback(settings, 'insertlink_callback');

+		patchCallback(settings, 'insertimage_callback');

+		patchCallback(settings, 'setupcontent_callback');

+		patchCallback(settings, 'save_callback');

+		patchCallback(settings, 'onchange_callback');

+		patchCallback(settings, 'init_instance_callback');

+		patchCallback(settings, 'file_browser_callback');

+		patchCallback(settings, 'cleanup_callback');

+		patchCallback(settings, 'execcommand_callback');

+		patchCallback(settings, 'oninit');

+

+		// Set options

+		delete settings.id;

+		settings['mode'] = 'exact';

+		settings['elements'] = 'fullscreenarea';

+		settings['add_unload_trigger'] = false;

+		settings['ask'] = false;

+		settings['document_base_url'] = window.opener.tinyMCE.activeEditor.documentBaseURI.getURI();

+		settings['fullscreen_is_enabled'] = true;

+		settings['fullscreen_editor_id'] = oeID;

+		settings['theme_advanced_resizing'] = false;

+		settings['strict_loading_mode'] = true;

+

+		settings.save_onsavecallback = function() {

+			window.opener.tinyMCE.get(oeID).setContent(tinyMCE.get('fullscreenarea').getContent({format : 'raw'}), {format : 'raw'});

+			window.opener.tinyMCE.get(oeID).execCommand('mceSave');

+			window.close();

+		};

+

+		function unloadHandler(e) {

+			moveContent();

+		}

+

+		function moveContent() {

+			window.opener.tinyMCE.get(oeID).setContent(tinyMCE.activeEditor.getContent());

+		}

+

+		function closeFullscreen() {

+			moveContent();

+			window.close();

+		}

+

+		function doParentSubmit() {

+			moveContent();

+

+			if (window.opener.tinyMCE.selectedInstance.formElement.form)

+				window.opener.tinyMCE.selectedInstance.formElement.form.submit();

+

+			window.close();

+

+			return false;

+		}

+

+		function render() {

+			var e = document.getElementById('fullscreenarea'), vp, ed, ow, oh, dom = tinymce.DOM;

+

+			e.value = window.opener.tinyMCE.get(oeID).getContent();

+

+			vp = dom.getViewPort();

+			settings.width = vp.w;

+			settings.height = vp.h - 15;

+

+			tinymce.dom.Event.add(window, 'resize', function() {

+				var vp = dom.getViewPort();

+

+				tinyMCE.activeEditor.theme.resizeTo(vp.w, vp.h);

+			});

+

+			tinyMCE.init(settings);

+		}

+

+		// Add onunload

+		tinymce.dom.Event.add(window, "beforeunload", unloadHandler);

+	</script>

+</head>

+<body style="margin:0;overflow:hidden;width:100%;height:100%" scrolling="no" scroll="no">

+<form onsubmit="doParentSubmit();">

+<textarea id="fullscreenarea" style="width:100%; height:100%"></textarea>

+</form>

+

+<script type="text/javascript">

+	render();

+</script>

+

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/iespell/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/iespell/editor_plugin.js
new file mode 100644
index 0000000..e9cba10
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/iespell/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/iespell/editor_plugin_src.js
new file mode 100644
index 0000000..1b2bb98
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/editor_plugin.js
new file mode 100644
index 0000000..e57c943
--- /dev/null
+++ b/dojopuzzles/media/js/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(r,j){var y=this,i,k="",q=y.editor,g=0,s=0,h,m,n,o,l,v,x;r=r||{};j=j||{};if(!r.inline){return y.parent(r,j)}if(!r.type){y.bookmark=q.selection.getBookmark(1)}i=d.uniqueId();h=d.getViewPort();r.width=parseInt(r.width||320);r.height=parseInt(r.height||240)+(tinymce.isIE?8:0);r.min_width=parseInt(r.min_width||150);r.min_height=parseInt(r.min_height||100);r.max_width=parseInt(r.max_width||2000);r.max_height=parseInt(r.max_height||2000);r.left=r.left||Math.round(Math.max(h.x,h.x+(h.w/2)-(r.width/2)));r.top=r.top||Math.round(Math.max(h.y,h.y+(h.h/2)-(r.height/2)));r.movable=r.resizable=true;j.mce_width=r.width;j.mce_height=r.height;j.mce_inline=true;j.mce_window_id=i;j.mce_auto_focus=r.auto_focus;y.features=r;y.params=j;y.onOpen.dispatch(y,r,j);if(r.type){k+=" mceModal";if(r.type){k+=" mce"+r.type.substring(0,1).toUpperCase()+r.type.substring(1)}r.resizable=false}if(r.statusbar){k+=" mceStatusbar"}if(r.resizable){k+=" mceResizable"}if(r.minimizable){k+=" mceMinimizable"}if(r.maximizable){k+=" mceMaximizable"}if(r.movable){k+=" mceMovable"}y._addAll(d.doc.body,["div",{id:i,"class":(q.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"},r.title||""]],["div",{id:i+"_middle","class":"mceMiddle"},["div",{id:i+"_left","class":"mceLeft"}],["span",{id:i+"_content"}],["div",{id:i+"_right","class":"mceRight"}]],["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(!r.type){g+=d.get(i+"_left").clientWidth;g+=d.get(i+"_right").clientWidth;s+=d.get(i+"_top").clientHeight;s+=d.get(i+"_bottom").clientHeight}d.setStyles(i,{top:r.top,left:r.left,width:r.width+g,height:r.height+s});x=r.url||r.file;if(x){if(tinymce.relaxedDomain){x+=(x.indexOf("?")==-1?"?":"&")+"mce_rdomain="+tinymce.relaxedDomain}x=tinymce._addVer(x)}if(!r.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:r.width,height:r.height});d.setAttrib(i+"_ifr","src",x)}else{d.add(i+"_wrapper","a",{id:i+"_ok","class":"mceButton mceOk",href:"javascript:;",onmousedown:"return false;"},"Ok");if(r.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",r.content.replace("\n","<br />"))}n=a.add(i,"mousedown",function(t){var u=t.target,f,p;f=y.windows[i];y.focus(i);if(u.nodeName=="A"||u.nodeName=="a"){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 y._startDrag(i,t,u.className)}else{if(d.hasClass(u,"mceResize")){return y._startDrag(i,t,u.className.substring(13))}}}}}});o=a.add(i,"click",function(f){var p=f.target;y.focus(i);if(p.nodeName=="A"||p.nodeName=="a"){switch(p.className){case"mceClose":y.close(null,i);return a.cancel(f);case"mceButton mceOk":case"mceButton mceCancel":r.button_func(p.className=="mceButton mceOk");return a.cancel(f)}}});v=y.windows[i]={id:i,mousedown_func:n,click_func:o,element:new b(i,{blocker:1,container:q.getContainer()}),iframeElement:new b(i+"_ifr"),features:r,deltaWidth:g,deltaHeight:s};v.iframeElement.on("focus",function(){y.focus(i)});if(y.count==0&&y.editor.getParam("dialog_type","modal")=="modal"){d.add(d.doc.body,"div",{id:"mceModalBlocker","class":(y.editor.settings.inlinepopups_skin||"clearlooks2")+"_modalBlocker",style:{zIndex:y.zIndex-1}});d.show("mceModalBlocker")}else{d.setStyle("mceModalBlocker","z-index",y.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})}y.focus(i);y._fixIELayout(i,1);if(d.get(i+"_ok")){d.get(i+"_ok").focus()}y.count++;return v},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}},_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;g<h.length;g++){f._addAll(k,h[g])}}}},_startDrag:function(v,G,E){var o=this,u,z,C=d.doc,f,l=o.windows[v],h=l.element,y=h.getXY(),x,q,F,g,A,s,r,j,i,m,k,n,B;g={x:0,y:0};A=d.getViewPort();A.w-=2;A.h-=2;j=G.screenX;i=G.screenY;m=k=n=B=0;u=a.add(C,"mouseup",function(p){a.remove(C,"mouseup",u);a.remove(C,"mousemove",z);if(f){f.remove()}h.moveBy(m,k);h.resizeBy(n,B);q=h.getSize();d.setStyles(v+"_ifr",{width:q.w-l.deltaWidth,height:q.h-l.deltaHeight});o._fixIELayout(v,1);return a.cancel(p)});if(E!="Move"){D()}function D(){if(f){return}o._fixIELayout(v,0);d.add(C.body,"div",{id:"mceEventBlocker","class":"mceEventBlocker "+(o.editor.settings.inlinepopups_skin||"clearlooks2"),style:{zIndex:o.zIndex+1}});if(tinymce.isIE6||(tinymce.isIE&&!d.boxModel)){d.setStyles("mceEventBlocker",{position:"absolute",left:A.x,top:A.y,width:A.w-2,height:A.h-2})}f=new b("mceEventBlocker");f.update();x=h.getXY();q=h.getSize();s=g.x+x.x-A.x;r=g.y+x.y-A.y;d.add(f.get(),"div",{id:"mcePlaceHolder","class":"mcePlaceHolder",style:{left:s,top:r,width:q.w,height:q.h}});F=new b("mcePlaceHolder")}z=a.add(C,"mousemove",function(w){var p,H,t;D();p=w.screenX-j;H=w.screenY-i;switch(E){case"ResizeW":m=p;n=0-p;break;case"ResizeE":n=p;break;case"ResizeN":case"ResizeNW":case"ResizeNE":if(E=="ResizeNW"){m=p;n=0-p}else{if(E=="ResizeNE"){n=p}}k=H;B=0-H;break;case"ResizeS":case"ResizeSW":case"ResizeSE":if(E=="ResizeSW"){m=p;n=0-p}else{if(E=="ResizeSE"){n=p}}B=H;break;case"mceMove":m=p;k=H;break}if(n<(t=l.features.min_width-q.w)){if(m!==0){m+=n-t}n=t}if(B<(t=l.features.min_height-q.h)){if(k!==0){k+=B-t}B=t}n=Math.min(n,l.features.max_width-q.w);B=Math.min(B,l.features.max_height-q.h);m=Math.max(m,A.x-(s+A.x));k=Math.max(k,A.y-(r+A.y));m=Math.min(m,(A.w+A.x)-(s+q.w+A.x));k=Math.min(k,(A.h+A.y)-(r+q.h+A.y));if(m+k!==0){if(s+m<0){m=0}if(r+k<0){k=0}F.moveTo(s+m,r+k)}if(n+B!==0){F.resizeTo(q.w+n,q.h+B)}return a.cancel(w)});return a.cancel(G)},resizeBy:function(g,h,i){var f=this.windows[i];if(f){f.element.resizeBy(g,h);f.iframeElement.resizeBy(g,h)}},close:function(j,l){var h=this,g,k=d.doc,f=0,i,l;l=h._findId(l||j);if(!h.windows[l]){h.parent(j);return}h.count--;if(h.count==0){d.remove("mceModalBlocker")}if(g=h.windows[l]){h.onClose.dispatch(h);a.remove(k,"mousedown",g.mousedownFunc);a.remove(k,"click",g.clickFunc);a.clear(l);a.clear(l+"_ifr");d.setAttrib(l+"_ifr","src",'javascript:""');g.element.remove();delete h.windows[l];e(h.windows,function(m){if(m.zIndex>f){i=m;f=m.zIndex}});if(i){h.focus(i.id)}}},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/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js
new file mode 100644
index 0000000..0c1de37
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/editor_plugin_src.js
@@ -0,0 +1,635 @@
+/**

+ * 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;

+

+			f = f || {};

+			p = p || {};

+

+			// Run native windows

+			if (!f.inline)

+				return t.parent(f, p);

+

+			// 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, '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'}],

+							['span', {id : id + '_content'}],

+							['div', {id : id + '_right', 'class' : 'mceRight'}]

+						],

+

+						['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', '<br />'));

+			}

+

+			// 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 == '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);

+					}

+				}

+			});

+

+			// 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

+			} 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});

+

+			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;

+			}

+		},

+

+		_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<ne.length; i++)

+					t._addAll(te, ne[i]);

+			}

+		},

+

+		_startDrag : function(id, se, ac) {

+			var t = this, mu, mm, d = DOM.doc, eb, w = t.windows[id], we = w.element, sp = we.getXY(), p, sz, ph, cp, vp, sx, sy, sex, sey, dx, dy, dw, dh;

+

+			// Get positons and sizes

+//			cp = DOM.getPos(t.editor.getContainer());

+			cp = {x : 0, y : 0};

+			vp = DOM.getViewPort();

+

+			// Reduce viewport size to avoid scrollbars while dragging

+			vp.w -= 2;

+			vp.h -= 2;

+

+			sex = se.screenX;

+			sey = se.screenY;

+			dx = dy = dw = dh = 0;

+

+			// Handle mouse up

+			mu = Event.add(d, 'mouseup', function(e) {

+				Event.remove(d, 'mouseup', mu);

+				Event.remove(d, 'mousemove', mm);

+

+				if (eb)

+					eb.remove();

+

+				we.moveBy(dx, dy);

+				we.resizeBy(dw, dh);

+				sz = we.getSize();

+				DOM.setStyles(id + '_ifr', {width : sz.w - w.deltaWidth, height : sz.h - w.deltaHeight});

+				t._fixIELayout(id, 1);

+

+				return Event.cancel(e);

+			});

+

+			if (ac != 'Move')

+				startMove();

+

+			function startMove() {

+				if (eb)

+					return;

+

+				t._fixIELayout(id, 0);

+

+				// Setup event blocker

+				DOM.add(d.body, 'div', {

+					id : 'mceEventBlocker',

+					'class' : 'mceEventBlocker ' + (t.editor.settings.inlinepopups_skin || 'clearlooks2'),

+					style : {zIndex : t.zIndex + 1}

+				});

+

+				if (tinymce.isIE6 || (tinymce.isIE && !DOM.boxModel))

+					DOM.setStyles('mceEventBlocker', {position : 'absolute', left : vp.x, top : vp.y, width : vp.w - 2, height : vp.h - 2});

+

+				eb = new Element('mceEventBlocker');

+				eb.update();

+

+				// Setup placeholder

+				p = we.getXY();

+				sz = we.getSize();

+				sx = cp.x + p.x - vp.x;

+				sy = cp.y + p.y - vp.y;

+				DOM.add(eb.get(), 'div', {id : 'mcePlaceHolder', 'class' : 'mcePlaceHolder', style : {left : sx, top : sy, width : sz.w, height : sz.h}});

+				ph = new Element('mcePlaceHolder');

+			};

+

+			// Handle mouse move/drag

+			mm = Event.add(d, 'mousemove', function(e) {

+				var x, y, v;

+

+				startMove();

+

+				x = e.screenX - sex;

+				y = e.screenY - sey;

+

+				switch (ac) {

+					case 'ResizeW':

+						dx = x;

+						dw = 0 - x;

+						break;

+

+					case 'ResizeE':

+						dw = x;

+						break;

+

+					case 'ResizeN':

+					case 'ResizeNW':

+					case 'ResizeNE':

+						if (ac == "ResizeNW") {

+							dx = x;

+							dw = 0 - x;

+						} else if (ac == "ResizeNE")

+							dw = x;

+

+						dy = y;

+						dh = 0 - y;

+						break;

+

+					case 'ResizeS':

+					case 'ResizeSW':

+					case 'ResizeSE':

+						if (ac == "ResizeSW") {

+							dx = x;

+							dw = 0 - x;

+						} else if (ac == "ResizeSE")

+							dw = x;

+

+						dh = y;

+						break;

+

+					case 'mceMove':

+						dx = x;

+						dy = y;

+						break;

+				}

+

+				// Boundary check

+				if (dw < (v = w.features.min_width - sz.w)) {

+					if (dx !== 0)

+						dx += dw - v;

+

+					dw = v;

+				}

+	

+				if (dh < (v = w.features.min_height - sz.h)) {

+					if (dy !== 0)

+						dy += dh - v;

+

+					dh = v;

+				}

+

+				dw = Math.min(dw, w.features.max_width - sz.w);

+				dh = Math.min(dh, w.features.max_height - sz.h);

+				dx = Math.max(dx, vp.x - (sx + vp.x));

+				dy = Math.max(dy, vp.y - (sy + vp.y));

+				dx = Math.min(dx, (vp.w + vp.x) - (sx + sz.w + vp.x));

+				dy = Math.min(dy, (vp.h + vp.y) - (sy + sz.h + vp.y));

+

+				// Move if needed

+				if (dx + dy !== 0) {

+					if (sx + dx < 0)

+						dx = 0;

+	

+					if (sy + dy < 0)

+						dy = 0;

+

+					ph.moveTo(sx + dx, sy + dy);

+				}

+

+				// Resize if needed

+				if (dw + dh !== 0)

+					ph.resizeTo(sz.w + dw, sz.h + dh);

+

+				return Event.cancel(e);

+			});

+

+			return Event.cancel(se);

+		},

+

+		resizeBy : function(dw, dh, id) {

+			var w = this.windows[id];

+

+			if (w) {

+				w.element.resizeBy(dw, dh);

+				w.iframeElement.resizeBy(dw, dh);

+			}

+		},

+

+		close : function(win, id) {

+			var t = this, w, d = DOM.doc, ix = 0, fw, id;

+

+			id = t._findId(id || win);

+

+			// Probably not inline

+			if (!t.windows[id]) {

+				t.parent(win);

+				return;

+			}

+

+			t.count--;

+

+			if (t.count == 0)

+				DOM.remove('mceModalBlocker');

+

+			if (w = t.windows[id]) {

+				t.onClose.dispatch(t);

+				Event.remove(d, 'mousedown', w.mousedownFunc);

+				Event.remove(d, 'click', w.clickFunc);

+				Event.clear(id);

+				Event.clear(id + '_ifr');

+

+				DOM.setAttrib(id + '_ifr', 'src', 'javascript:""'); // Prevent leak

+				w.element.remove();

+				delete t.windows[id];

+

+				// Find front most window and focus that

+				each (t.windows, function(w) {

+					if (w.zIndex > ix) {

+						fw = w;

+						ix = w.zIndex;

+					}

+				});

+

+				if (fw)

+					t.focus(fw.id);

+			}

+		},

+

+		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/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif
new file mode 100644
index 0000000..94abd08
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/alert.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif
new file mode 100644
index 0000000..e671094
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/button.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif
new file mode 100644
index 0000000..6baf64a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/buttons.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif
new file mode 100644
index 0000000..497307a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/confirm.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif
new file mode 100644
index 0000000..c894b2e
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/corners.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif
new file mode 100644
index 0000000..c2a2ad4
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/horizontal.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif
new file mode 100644
index 0000000..43a735f
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/img/vertical.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css
new file mode 100644
index 0000000..e624327
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/skins/clearlooks2/window.css
@@ -0,0 +1,100 @@
+/* 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)}
+
+/* IE9 fixes */
+.clearlooks2.ie9 .mceTop .mceCenter {clip:auto;}
+.clearlooks2.ie9 .mceMiddle {clip:auto;}
+.clearlooks2.ie9 .mceMiddle .mceLeft, .clearlooks2.ie9 .mceMiddle .mceRight {top: 23px;}
+.clearlooks2.ie9 .mceAlert .mceMiddle span, .clearlooks2.ie9 .mceConfirm .mceMiddle span {top:13px;}
+.clearlooks2.ie9 .mceModal .mceMiddle {top:23px}
+.clearlooks2.ie9 .mceModal .mceMiddle .mceLeft, .clearlooks2.ie9 .mceModal .mceMiddle .mceRight {top: 0}
+.clearlooks2.ie9 .mceMiddle .mceIcon {top:13px}
+.clearlooks2.ie9 .mceTop .mceCenter {top:0; right:auto; left:6px; width:calc(100%-12px)}
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/template.htm b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/template.htm
new file mode 100644
index 0000000..f9ec642
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/inlinepopups/template.htm
@@ -0,0 +1,387 @@
+<!-- <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd"> -->

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+<title>Template for dialogs</title>

+<link rel="stylesheet" type="text/css" href="skins/clearlooks2/window.css" />

+</head>

+<body>

+

+<div class="mceEditor">

+	<div class="clearlooks2" style="width:400px; height:100px; left:10px;">

+		<div class="mceWrapper">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Blured</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:100px; left:420px;">

+		<div class="mceWrapper mceMovable mceFocus">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Focused</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:120px;">

+		<div class="mceWrapper mceMovable mceFocus mceStatusbar">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:120px;">

+		<div class="mceWrapper mceMovable mceFocus mceStatusbar mceResizable">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar, Resizable</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:230px;">

+		<div class="mceWrapper mceMovable mceFocus mceResizable mceMaximizable">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Resizable, Maximizable</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:230px;">

+		<div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximizable">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Blurred, Maximizable, Statusbar, Resizable</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:100px; left:10px; top:340px;">

+		<div class="mceWrapper mceMovable mceFocus mceResizable mceMaximized mceMinimizable mceMaximizable">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Maximized, Maximizable, Minimizable</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:100px; left:420px; top:340px;">

+		<div class="mceWrapper mceMovable mceStatusbar mceResizable mceMaximized mceMinimizable mceMaximizable">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Blured</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>Content</span>

+				<div class="mceRight"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Statusbar text.</span>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceMin" href="#"></a>

+			<a class="mceMax" href="#"></a>

+			<a class="mceMed" href="#"></a>

+			<a class="mceClose" href="#"></a>

+			<a class="mceResize mceResizeN" href="#"></a>

+			<a class="mceResize mceResizeS" href="#"></a>

+			<a class="mceResize mceResizeW" href="#"></a>

+			<a class="mceResize mceResizeE" href="#"></a>

+			<a class="mceResize mceResizeNW" href="#"></a>

+			<a class="mceResize mceResizeNE" href="#"></a>

+			<a class="mceResize mceResizeSW" href="#"></a>

+			<a class="mceResize mceResizeSE" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:130px; left:10px; top:450px;">

+		<div class="mceWrapper mceMovable mceFocus mceModal mceAlert">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Alert</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>

+					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.

+				</span>

+				<div class="mceRight"></div>

+				<div class="mceIcon"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceButton mceOk" href="#">Ok</a>

+			<a class="mceClose" href="#"></a>

+		</div>

+	</div>

+

+	<div class="clearlooks2" style="width:400px; height:130px; left:420px; top:450px;">

+		<div class="mceWrapper mceMovable mceFocus mceModal mceConfirm">

+			<div class="mceTop">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+				<span>Confirm</span>

+			</div>

+

+			<div class="mceMiddle">

+				<div class="mceLeft"></div>

+				<span>

+					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.

+					</span>

+				<div class="mceRight"></div>

+				<div class="mceIcon"></div>

+			</div>

+

+			<div class="mceBottom">

+				<div class="mceLeft"></div>

+				<div class="mceCenter"></div>

+				<div class="mceRight"></div>

+			</div>

+

+			<a class="mceMove" href="#"></a>

+			<a class="mceButton mceOk" href="#">Ok</a>

+			<a class="mceButton mceCancel" href="#">Cancel</a>

+			<a class="mceClose" href="#"></a>

+		</div>

+	</div>

+</div>

+

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/insertdatetime/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/insertdatetime/editor_plugin.js
new file mode 100644
index 0000000..938ce6b
--- /dev/null
+++ b/dojopuzzles/media/js/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<d){for(var f=0;f<(d-g.length);f++){g="0"+g}}return g}a=a.replace("%D","%m/%d/%y");a=a.replace("%r","%I:%M:%S %p");a=a.replace("%Y",""+e.getFullYear());a=a.replace("%y",""+e.getYear());a=a.replace("%m",b(e.getMonth()+1,2));a=a.replace("%d",b(e.getDate(),2));a=a.replace("%H",""+b(e.getHours(),2));a=a.replace("%M",""+b(e.getMinutes(),2));a=a.replace("%S",""+b(e.getSeconds(),2));a=a.replace("%I",""+((e.getHours()+11)%12+1));a=a.replace("%p",""+(e.getHours()<12?"AM":"PM"));a=a.replace("%B",""+c.getLang("insertdatetime.months_long").split(",")[e.getMonth()]);a=a.replace("%b",""+c.getLang("insertdatetime.months_short").split(",")[e.getMonth()]);a=a.replace("%A",""+c.getLang("insertdatetime.day_long").split(",")[e.getDay()]);a=a.replace("%a",""+c.getLang("insertdatetime.day_short").split(",")[e.getDay()]);a=a.replace("%%","%");return a}});tinymce.PluginManager.add("insertdatetime",tinymce.plugins.InsertDateTime)})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/insertdatetime/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/insertdatetime/editor_plugin_src.js
new file mode 100644
index 0000000..181c791
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/insertdatetime/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.InsertDateTime', {

+		init : function(ed, url) {

+			var t = this;

+

+			t.editor = ed;

+

+			ed.addCommand('mceInsertDate', function() {

+				var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_dateFormat", ed.getLang('insertdatetime.date_fmt')));

+

+				ed.execCommand('mceInsertContent', false, str);

+			});

+

+			ed.addCommand('mceInsertTime', function() {

+				var str = t._getDateTime(new Date(), ed.getParam("plugin_insertdate_timeFormat", ed.getLang('insertdatetime.time_fmt')));

+

+				ed.execCommand('mceInsertContent', false, str);

+			});

+

+			ed.addButton('insertdate', {title : 'insertdatetime.insertdate_desc', cmd : 'mceInsertDate'});

+			ed.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

+			};

+		},

+

+		// Private methods

+

+		_getDateTime : function(d, fmt) {

+			var ed = this.editor;

+

+			function addZeros(value, len) {

+				value = "" + value;

+

+				if (value.length < len) {

+					for (var 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", "" + ed.getLang("insertdatetime.months_long").split(',')[d.getMonth()]);

+			fmt = fmt.replace("%b", "" + ed.getLang("insertdatetime.months_short").split(',')[d.getMonth()]);

+			fmt = fmt.replace("%A", "" + ed.getLang("insertdatetime.day_long").split(',')[d.getDay()]);

+			fmt = fmt.replace("%a", "" + ed.getLang("insertdatetime.day_short").split(',')[d.getDay()]);

+			fmt = fmt.replace("%%", "%");

+

+			return fmt;

+		}

+	});

+

+	// Register plugin

+	tinymce.PluginManager.add('insertdatetime', tinymce.plugins.InsertDateTime);

+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/layer/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/layer/editor_plugin.js
new file mode 100644
index 0000000..f88a6dd
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/layer/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.Layer",{init:function(a,b){var c=this;c.editor=a;a.addCommand("mceInsertLayer",c._insertLayer,c);a.addCommand("mceMoveForward",function(){c._move(1)});a.addCommand("mceMoveBackward",function(){c._move(-1)});a.addCommand("mceMakeAbsolute",function(){c._toggleAbsolute()});a.addButton("moveforward",{title:"layer.forward_desc",cmd:"mceMoveForward"});a.addButton("movebackward",{title:"layer.backward_desc",cmd:"mceMoveBackward"});a.addButton("absolute",{title:"layer.absolute_desc",cmd:"mceMakeAbsolute"});a.addButton("insertlayer",{title:"layer.insertlayer_desc",cmd:"mceInsertLayer"});a.onInit.add(function(){if(tinymce.isIE){a.getDoc().execCommand("2D-Position",false,true)}});a.onNodeChange.add(c._nodeChange,c);a.onVisualAid.add(c._visualAid,c)},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}},_nodeChange:function(b,a,e){var c,d;c=this._getParentLayer(e);d=b.dom.getParent(e,"DIV,P,IMG");if(!d){a.setDisabled("absolute",1);a.setDisabled("moveforward",1);a.setDisabled("movebackward",1)}else{a.setDisabled("absolute",0);a.setDisabled("moveforward",!c);a.setDisabled("movebackward",!c);a.setActive("absolute",c&&c.style.position.toLowerCase()=="absolute")}},_visualAid:function(a,c,b){var d=a.dom;tinymce.each(d.select("div,p",c),function(f){if(/^(absolute|relative|static)$/i.test(f.style.position)){if(b){d.addClass(f,"mceItemVisualAid")}else{d.removeClass(f,"mceItemVisualAid")}}})},_move:function(h){var b=this.editor,f,g=[],e=this._getParentLayer(b.selection.getNode()),c=-1,j=-1,a;a=[];tinymce.walk(b.getBody(),function(d){if(d.nodeType==1&&/^(absolute|relative|static)$/i.test(d.style.position)){a.push(d)}},"childNodes");for(f=0;f<a.length;f++){g[f]=a[f].style.zIndex?parseInt(a[f].style.zIndex):0;if(c<0&&a[f]==e){c=f}}if(h<0){for(f=0;f<g.length;f++){if(g[f]<g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{if(g[c]>0){a[c].style.zIndex=g[c]-1}}}else{for(f=0;f<g.length;f++){if(g[f]>g[c]){j=f;break}}if(j>-1){a[c].style.zIndex=g[j];a[j].style.zIndex=g[c]}else{a[c].style.zIndex=g[c]+1}}b.execCommand("mceRepaint")},_getParentLayer:function(a){return this.editor.dom.getParent(a,function(b){return b.nodeType==1&&/^(absolute|relative|static)$/i.test(b.style.position)})},_insertLayer:function(){var a=this.editor,b=a.dom.getPos(a.dom.getParent(a.selection.getNode(),"*"));a.dom.add(a.getBody(),"div",{style:{position:"absolute",left:b.x,top:(b.y>20?b.y:20),width:100,height:100},"class":"mceItemVisualAid"},a.selection.getContent()||a.getLang("layer.content"))},_toggleAbsolute:function(){var a=this.editor,b=this._getParentLayer(a.selection.getNode());if(!b){b=a.dom.getParent(a.selection.getNode(),"DIV,P,IMG")}if(b){if(b.style.position.toLowerCase()=="absolute"){a.dom.setStyles(b,{position:"",left:"",top:"",width:"",height:""});a.dom.removeClass(b,"mceItemVisualAid")}else{if(b.style.left==""){b.style.left=20+"px"}if(b.style.top==""){b.style.top=20+"px"}if(b.style.width==""){b.style.width=b.width?(b.width+"px"):"100px"}if(b.style.height==""){b.style.height=b.height?(b.height+"px"):"100px"}b.style.position="absolute";a.addVisual(a.getBody())}a.execCommand("mceRepaint");a.nodeChanged()}}});tinymce.PluginManager.add("layer",tinymce.plugins.Layer)})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/layer/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/layer/editor_plugin_src.js
new file mode 100644
index 0000000..d5aa865
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/layer/editor_plugin_src.js
@@ -0,0 +1,212 @@
+/**

+ * 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.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() {

+				if (tinymce.isIE)

+					ed.getDoc().execCommand('2D-Position', false, true);

+			});

+

+			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|static)$/i.test(e.style.position)) {

+					if (s)

+						dom.addClass(e, 'mceItemVisualAid');

+					else

+						dom.removeClass(e, 'mceItemVisualAid');	

+				}

+			});

+		},

+

+		_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<nl.length; i++) {

+				z[i] = nl[i].style.zIndex ? parseInt(nl[i].style.zIndex) : 0;

+

+				if (ci < 0 && nl[i] == le)

+					ci = i;

+			}

+

+			if (d < 0) {

+				// Move back

+

+				// Try find a lower one

+				for (i=0; i<z.length; i++) {

+					if (z[i] < z[ci]) {

+						fi = i;

+						break;

+					}

+				}

+

+				if (fi > -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.length; i++) {

+					if (z[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, p = ed.dom.getPos(ed.dom.getParent(ed.selection.getNode(), '*'));

+

+			ed.dom.add(ed.getBody(), 'div', {

+				style : {

+					position : 'absolute',

+					left : p.x,

+					top : (p.y > 20 ? p.y : 20),

+					width : 100,

+					height : 100

+				},

+				'class' : 'mceItemVisualAid'

+			}, ed.selection.getContent() || ed.getLang('layer.content'));

+		},

+

+		_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');

+				} 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.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/dojopuzzles/media/js/tiny_mce/plugins/legacyoutput/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/legacyoutput/editor_plugin.js
new file mode 100644
index 0000000..29d43c5
--- /dev/null
+++ b/dojopuzzles/media/js/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.serializer;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:"full"}},bold:{inline:"b"},italic:{inline:"i"},underline:{inline:"u"},strikethrough:{inline:"strike"},fontname:{inline:"font",attributes:{face:"%value"}},fontsize:{inline:"font",attributes:{size:function(f){return a.inArray(e,f.value)+1}}},forecolor:{inline:"font",styles:{color:"%value"}},hilitecolor:{inline:"font",styles:{backgroundColor:"%value"}}});d._setup();a.each("b,i,u,strike".split(","),function(f){var g=d.rules[f];if(!g){d.addRules(f)}});if(!d.rules.font){d.addRules("font[face|size|color|style]")}a.each(c.split(","),function(f){var h=d.rules[f],g;if(h){a.each(h.attribs,function(j,i){if(i.name=="align"){g=true;return false}});if(!g){h.attribs.push({name:"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/dojopuzzles/media/js/tiny_mce/plugins/legacyoutput/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/legacyoutput/editor_plugin_src.js
new file mode 100644
index 0000000..e852da1
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/legacyoutput/editor_plugin_src.js
@@ -0,0 +1,136 @@
+/**

+ * 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),

+					serializer = editor.serializer;

+

+				// 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 : 'full'}},

+

+					// Change the basic formatting elements to use deprecated element types

+					bold : {inline : 'b'},

+					italic : {inline : 'i'},

+					underline : {inline : 'u'},

+					strikethrough : {inline : 'strike'},

+

+					// 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', styles : {color : '%value'}},

+					hilitecolor : {inline : 'font', styles : {backgroundColor : '%value'}}

+				});

+

+				// Force parsing of the serializer rules

+				serializer._setup();

+

+				// Check that deprecated elements are allowed if not add them

+				tinymce.each('b,i,u,strike'.split(','), function(name) {

+					var rule = serializer.rules[name];

+

+					if (!rule)

+						serializer.addRules(name);

+				});

+

+				// Add font element if it's missing

+				if (!serializer.rules["font"])

+					serializer.addRules("font[face|size|color|style]");

+

+				// Add the missing and depreacted align attribute for the serialization engine

+				tinymce.each(alignElements.split(','), function(name) {

+					var rule = serializer.rules[name], found;

+

+					if (rule) {

+						tinymce.each(rule.attribs, function(name, attr) {

+							if (attr.name == 'align') {

+								found = true;

+								return false;

+							}

+						});

+

+						if (!found)

+							rule.attribs.push({name : '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);
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/css/content.css b/dojopuzzles/media/js/tiny_mce/plugins/media/css/content.css
new file mode 100644
index 0000000..1bf6a75
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/css/content.css
@@ -0,0 +1,6 @@
+.mceItemFlash, .mceItemShockWave, .mceItemQuickTime, .mceItemWindowsMedia, .mceItemRealMedia {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);}

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/css/media.css b/dojopuzzles/media/js/tiny_mce/plugins/media/css/media.css
new file mode 100644
index 0000000..2d08794
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/css/media.css
@@ -0,0 +1,16 @@
+#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 { width: 240px }

+#width, #height { width: 40px }

+#src, #media_type { width: 250px }

+#class { width: 120px }

+#prev { margin: 0; border: 1px solid black; width: 380px; height: 230px; overflow: auto }

+.panel_wrapper div.current { height: 390px; 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 }

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/media/editor_plugin.js
new file mode 100644
index 0000000..4bbe367
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.each;tinymce.create("tinymce.plugins.MediaPlugin",{init:function(b,c){var e=this;e.editor=b;e.url=c;function f(g){return/^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(g.className)}b.onPreInit.add(function(){b.serializer.addRules("param[name|value|_mce_value]")});b.addCommand("mceMedia",function(){b.windowManager.open({file:c+"/media.htm",width:430+parseInt(b.getLang("media.delta_width",0)),height:470+parseInt(b.getLang("media.delta_height",0)),inline:1},{plugin_url:c})});b.addButton("media",{title:"media.desc",cmd:"mceMedia"});b.onNodeChange.add(function(h,g,i){g.setActive("media",i.nodeName=="IMG"&&f(i))});b.onInit.add(function(){var g={mceItemFlash:"flash",mceItemShockWave:"shockwave",mceItemWindowsMedia:"windowsmedia",mceItemQuickTime:"quicktime",mceItemRealMedia:"realmedia"};b.selection.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.selection.onBeforeSetContent.add(e._objectsToSpans,e);if(b.settings.content_css!==false){b.dom.loadCSS(c+"/css/content.css")}if(b.theme&&b.theme.onResolveName){b.theme.onResolveName.add(function(h,i){if(i.name=="img"){a(g,function(l,j){if(b.dom.hasClass(i.node,j)){i.name=l;i.title=b.dom.getAttrib(i.node,"title");return false}})}})}if(b&&b.plugins.contextmenu){b.plugins.contextmenu.onContextMenu.add(function(i,h,j){if(j.nodeName=="IMG"&&/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(j.className)){h.add({title:"media.edit",icon:"media",cmd:"mceMedia"})}})}});b.onBeforeSetContent.add(e._objectsToSpans,e);b.onSetContent.add(function(){e._spansToImgs(b.getBody())});b.onPreProcess.add(function(g,i){var h=g.dom;if(i.set){e._spansToImgs(i.node);a(h.select("IMG",i.node),function(k){var j;if(f(k)){j=e._parse(k.title);h.setAttrib(k,"width",h.getAttrib(k,"width",j.width||100));h.setAttrib(k,"height",h.getAttrib(k,"height",j.height||100))}})}if(i.get){a(h.select("IMG",i.node),function(m){var l,j,k;if(g.getParam("media_use_script")){if(f(m)){m.className=m.className.replace(/mceItem/g,"mceTemp")}return}switch(m.className){case"mceItemFlash":l="d27cdb6e-ae6d-11cf-96b8-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="application/x-shockwave-flash";break;case"mceItemShockWave":l="166b1bca-3f9c-11cf-8075-444553540000";j="http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0";k="application/x-director";break;case"mceItemWindowsMedia":l=g.getParam("media_wmp6_compatible")?"05589fa1-c356-11ce-bf01-00aa0055595a":"6bf52a52-394a-11d3-b153-00c04f79faa6";j="http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701";k="application/x-mplayer2";break;case"mceItemQuickTime":l="02bf25d5-8c17-4b23-bc80-d3488abddc6b";j="http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0";k="video/quicktime";break;case"mceItemRealMedia":l="cfcdaa03-8be4-11cf-b84b-0020afbbccfa";j="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0";k="audio/x-pn-realaudio-plugin";break}if(l){h.replace(e._buildObj({classid:l,codebase:j,type:k},m),m)}})}});b.onPostProcess.add(function(g,h){h.content=h.content.replace(/_mce_value=/g,"value=")});function d(g,h){h=new RegExp(h+'="([^"]+)"',"g").exec(g);return h?b.dom.decode(h[1]):""}b.onPostProcess.add(function(g,h){if(g.getParam("media_use_script")){h.content=h.content.replace(/<img[^>]+>/g,function(j){var i=d(j,"class");if(/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(i)){at=e._parse(d(j,"title"));at.width=d(j,"width");at.height=d(j,"height");j='<script type="text/javascript">write'+i.substring(7)+"({"+e._serialize(at)+"});<\/script>"}return j})}})},getInfo:function(){return{longname:"Media",author:"Moxiecode Systems AB",authorurl:"http://tinymce.moxiecode.com",infourl:"http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media",version:tinymce.majorVersion+"."+tinymce.minorVersion}},_objectsToSpans:function(b,e){var c=this,d=e.content;d=d.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi,function(g,f,i){var h=c._parse(i);return'<img class="mceItem'+f+'" title="'+b.dom.encode(i)+'" src="'+c.url+'/img/trans.gif" width="'+h.width+'" height="'+h.height+'" />'});d=d.replace(/<object([^>]*)>/gi,'<span class="mceItemObject" $1>');d=d.replace(/<embed([^>]*)\/?>/gi,'<span class="mceItemEmbed" $1></span>');d=d.replace(/<embed([^>]*)>/gi,'<span class="mceItemEmbed" $1>');d=d.replace(/<\/(object)([^>]*)>/gi,"</span>");d=d.replace(/<\/embed>/gi,"");d=d.replace(/<param([^>]*)>/gi,function(g,f){return"<span "+f.replace(/value=/gi,"_mce_value=")+' class="mceItemParam"></span>'});d=d.replace(/\/ class=\"mceItemParam\"><\/span>/gi,'class="mceItemParam"></span>');e.content=d},_buildObj:function(g,h){var d,c=this.editor,f=c.dom,e=this._parse(h.title),b;b=c.getParam("media_strict",true)&&g.type=="application/x-shockwave-flash";e.width=g.width=f.getAttrib(h,"width")||100;e.height=g.height=f.getAttrib(h,"height")||100;if(e.src){e.src=c.convertURL(e.src,"src",h)}if(b){d=f.create("span",{id:e.id,_mce_name:"object",type:"application/x-shockwave-flash",data:e.src,style:f.getAttrib(h,"style"),width:g.width,height:g.height})}else{d=f.create("span",{id:e.id,_mce_name:"object",classid:"clsid:"+g.classid,style:f.getAttrib(h,"style"),codebase:g.codebase,width:g.width,height:g.height})}a(e,function(j,i){if(!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(i)){if(g.type=="application/x-mplayer2"&&i=="src"&&!e.url){i="url"}if(j){f.add(d,"span",{_mce_name:"param",name:i,_mce_value:j})}}});if(!b){f.add(d,"span",tinymce.extend({_mce_name:"embed",type:g.type,style:f.getAttrib(h,"style")},e))}return d},_spansToImgs:function(e){var d=this,f=d.editor.dom,b,c;a(f.select("span",e),function(g){if(f.getAttrib(g,"class")=="mceItemObject"){c=f.getAttrib(g,"classid").toLowerCase().replace(/\s+/g,"");switch(c){case"clsid:d27cdb6e-ae6d-11cf-96b8-444553540000":f.replace(d._createImg("mceItemFlash",g),g);break;case"clsid:166b1bca-3f9c-11cf-8075-444553540000":f.replace(d._createImg("mceItemShockWave",g),g);break;case"clsid:6bf52a52-394a-11d3-b153-00c04f79faa6":case"clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95":case"clsid:05589fa1-c356-11ce-bf01-00aa0055595a":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}return}if(f.getAttrib(g,"class")=="mceItemEmbed"){switch(f.getAttrib(g,"type")){case"application/x-shockwave-flash":f.replace(d._createImg("mceItemFlash",g),g);break;case"application/x-director":f.replace(d._createImg("mceItemShockWave",g),g);break;case"application/x-mplayer2":f.replace(d._createImg("mceItemWindowsMedia",g),g);break;case"video/quicktime":f.replace(d._createImg("mceItemQuickTime",g),g);break;case"audio/x-pn-realaudio-plugin":f.replace(d._createImg("mceItemRealMedia",g),g);break;default:f.replace(d._createImg("mceItemFlash",g),g)}}})},_createImg:function(c,h){var b,g=this.editor.dom,f={},e="",d;d=["id","name","width","height","bgcolor","align","flashvars","src","wmode","allowfullscreen","quality","data"];b=g.create("img",{src:this.url+"/img/trans.gif",width:g.getAttrib(h,"width")||100,height:g.getAttrib(h,"height")||100,style:g.getAttrib(h,"style"),"class":c});a(d,function(i){var j=g.getAttrib(h,i);if(j){f[i]=j}});a(g.select("span",h),function(i){if(g.hasClass(i,"mceItemParam")){f[g.getAttrib(i,"name")]=g.getAttrib(i,"_mce_value")}});if(f.movie){f.src=f.movie;delete f.movie}if(!f.src){f.src=f.data;delete f.data}h=g.select(".mceItemEmbed",h)[0];if(h){a(d,function(i){var j=g.getAttrib(h,i);if(j&&!f[i]){f[i]=j}})}delete f.width;delete f.height;b.title=this._serialize(f);return b},_parse:function(b){return tinymce.util.JSON.parse("{"+b+"}")},_serialize:function(b){return tinymce.util.JSON.serialize(b).replace(/[{}]/g,"")}});tinymce.PluginManager.add("media",tinymce.plugins.MediaPlugin)})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/media/editor_plugin_src.js
new file mode 100644
index 0000000..fc84e5b
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/editor_plugin_src.js
@@ -0,0 +1,414 @@
+/**

+ * 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.MediaPlugin', {

+		init : function(ed, url) {

+			var t = this;

+			

+			t.editor = ed;

+			t.url = url;

+

+			function isMediaElm(n) {

+				return /^(mceItemFlash|mceItemShockWave|mceItemWindowsMedia|mceItemQuickTime|mceItemRealMedia)$/.test(n.className);

+			};

+

+			ed.onPreInit.add(function() {

+				// Force in _value parameter this extra parameter is required for older Opera versions

+				ed.serializer.addRules('param[name|value|_mce_value]');

+			});

+

+			// Register commands

+			ed.addCommand('mceMedia', function() {

+				ed.windowManager.open({

+					file : url + '/media.htm',

+					width : 430 + parseInt(ed.getLang('media.delta_width', 0)),

+					height : 470 + parseInt(ed.getLang('media.delta_height', 0)),

+					inline : 1

+				}, {

+					plugin_url : url

+				});

+			});

+

+			// Register buttons

+			ed.addButton('media', {title : 'media.desc', cmd : 'mceMedia'});

+

+			ed.onNodeChange.add(function(ed, cm, n) {

+				cm.setActive('media', n.nodeName == 'IMG' && isMediaElm(n));

+			});

+

+			ed.onInit.add(function() {

+				var lo = {

+					mceItemFlash : 'flash',

+					mceItemShockWave : 'shockwave',

+					mceItemWindowsMedia : 'windowsmedia',

+					mceItemQuickTime : 'quicktime',

+					mceItemRealMedia : 'realmedia'

+				};

+

+				ed.selection.onSetContent.add(function() {

+					t._spansToImgs(ed.getBody());

+				});

+

+				ed.selection.onBeforeSetContent.add(t._objectsToSpans, t);

+

+				if (ed.settings.content_css !== false)

+					ed.dom.loadCSS(url + "/css/content.css");

+

+				if (ed.theme && ed.theme.onResolveName) {

+					ed.theme.onResolveName.add(function(th, o) {

+						if (o.name == 'img') {

+							each(lo, function(v, k) {

+								if (ed.dom.hasClass(o.node, k)) {

+									o.name = v;

+									o.title = ed.dom.getAttrib(o.node, 'title');

+									return false;

+								}

+							});

+						}

+					});

+				}

+

+				if (ed && ed.plugins.contextmenu) {

+					ed.plugins.contextmenu.onContextMenu.add(function(th, m, e) {

+						if (e.nodeName == 'IMG' && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(e.className)) {

+							m.add({title : 'media.edit', icon : 'media', cmd : 'mceMedia'});

+						}

+					});

+				}

+			});

+

+			ed.onBeforeSetContent.add(t._objectsToSpans, t);

+

+			ed.onSetContent.add(function() {

+				t._spansToImgs(ed.getBody());

+			});

+

+			ed.onPreProcess.add(function(ed, o) {

+				var dom = ed.dom;

+

+				if (o.set) {

+					t._spansToImgs(o.node);

+

+					each(dom.select('IMG', o.node), function(n) {

+						var p;

+

+						if (isMediaElm(n)) {

+							p = t._parse(n.title);

+							dom.setAttrib(n, 'width', dom.getAttrib(n, 'width', p.width || 100));

+							dom.setAttrib(n, 'height', dom.getAttrib(n, 'height', p.height || 100));

+						}

+					});

+				}

+

+				if (o.get) {

+					each(dom.select('IMG', o.node), function(n) {

+						var ci, cb, mt;

+

+						if (ed.getParam('media_use_script')) {

+							if (isMediaElm(n))

+								n.className = n.className.replace(/mceItem/g, 'mceTemp');

+

+							return;

+						}

+

+						switch (n.className) {

+							case 'mceItemFlash':

+								ci = 'd27cdb6e-ae6d-11cf-96b8-444553540000';

+								cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';

+								mt = 'application/x-shockwave-flash';

+								break;

+

+							case 'mceItemShockWave':

+								ci = '166b1bca-3f9c-11cf-8075-444553540000';

+								cb = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';

+								mt = 'application/x-director';

+								break;

+

+							case 'mceItemWindowsMedia':

+								ci = ed.getParam('media_wmp6_compatible') ? '05589fa1-c356-11ce-bf01-00aa0055595a' : '6bf52a52-394a-11d3-b153-00c04f79faa6';

+								cb = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';

+								mt = 'application/x-mplayer2';

+								break;

+

+							case 'mceItemQuickTime':

+								ci = '02bf25d5-8c17-4b23-bc80-d3488abddc6b';

+								cb = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';

+								mt = 'video/quicktime';

+								break;

+

+							case 'mceItemRealMedia':

+								ci = 'cfcdaa03-8be4-11cf-b84b-0020afbbccfa';

+								cb = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';

+								mt = 'audio/x-pn-realaudio-plugin';

+								break;

+						}

+

+						if (ci) {

+							dom.replace(t._buildObj({

+								classid : ci,

+								codebase : cb,

+								type : mt

+							}, n), n);

+						}

+					});

+				}

+			});

+

+			ed.onPostProcess.add(function(ed, o) {

+				o.content = o.content.replace(/_mce_value=/g, 'value=');

+			});

+

+			function getAttr(s, n) {

+				n = new RegExp(n + '=\"([^\"]+)\"', 'g').exec(s);

+

+				return n ? ed.dom.decode(n[1]) : '';

+			};

+

+			ed.onPostProcess.add(function(ed, o) {

+				if (ed.getParam('media_use_script')) {

+					o.content = o.content.replace(/<img[^>]+>/g, function(im) {

+						var cl = getAttr(im, 'class');

+

+						if (/^(mceTempFlash|mceTempShockWave|mceTempWindowsMedia|mceTempQuickTime|mceTempRealMedia)$/.test(cl)) {

+							at = t._parse(getAttr(im, 'title'));

+							at.width = getAttr(im, 'width');

+							at.height = getAttr(im, 'height');

+							im = '<script type="text/javascript">write' + cl.substring(7) + '({' + t._serialize(at) + '});</script>';

+						}

+

+						return im;

+					});

+				}

+			});

+		},

+

+		getInfo : function() {

+			return {

+				longname : 'Media',

+				author : 'Moxiecode Systems AB',

+				authorurl : 'http://tinymce.moxiecode.com',

+				infourl : 'http://wiki.moxiecode.com/index.php/TinyMCE:Plugins/media',

+				version : tinymce.majorVersion + "." + tinymce.minorVersion

+			};

+		},

+

+		// Private methods

+		_objectsToSpans : function(ed, o) {

+			var t = this, h = o.content;

+

+			h = h.replace(/<script[^>]*>\s*write(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)\(\{([^\)]*)\}\);\s*<\/script>/gi, function(a, b, c) {

+				var o = t._parse(c);

+

+				return '<img class="mceItem' + b + '" title="' + ed.dom.encode(c) + '" src="' + t.url + '/img/trans.gif" width="' + o.width + '" height="' + o.height + '" />'

+			});

+

+			h = h.replace(/<object([^>]*)>/gi, '<span class="mceItemObject" $1>');

+			h = h.replace(/<embed([^>]*)\/?>/gi, '<span class="mceItemEmbed" $1></span>');

+			h = h.replace(/<embed([^>]*)>/gi, '<span class="mceItemEmbed" $1>');

+			h = h.replace(/<\/(object)([^>]*)>/gi, '</span>');

+			h = h.replace(/<\/embed>/gi, '');

+			h = h.replace(/<param([^>]*)>/gi, function(a, b) {return '<span ' + b.replace(/value=/gi, '_mce_value=') + ' class="mceItemParam"></span>'});

+			h = h.replace(/\/ class=\"mceItemParam\"><\/span>/gi, 'class="mceItemParam"></span>');

+

+			o.content = h;

+		},

+

+		_buildObj : function(o, n) {

+			var ob, ed = this.editor, dom = ed.dom, p = this._parse(n.title), stc;

+			

+			stc = ed.getParam('media_strict', true) && o.type == 'application/x-shockwave-flash';

+

+			p.width = o.width = dom.getAttrib(n, 'width') || 100;

+			p.height = o.height = dom.getAttrib(n, 'height') || 100;

+

+			if (p.src)

+				p.src = ed.convertURL(p.src, 'src', n);

+

+			if (stc) {

+				ob = dom.create('span', {

+					id : p.id,

+					_mce_name : 'object',

+					type : 'application/x-shockwave-flash',

+					data : p.src,

+					style : dom.getAttrib(n, 'style'),

+					width : o.width,

+					height : o.height

+				});

+			} else {

+				ob = dom.create('span', {

+					id : p.id,

+					_mce_name : 'object',

+					classid : "clsid:" + o.classid,

+					style : dom.getAttrib(n, 'style'),

+					codebase : o.codebase,

+					width : o.width,

+					height : o.height

+				});

+			}

+

+			each (p, function(v, k) {

+				if (!/^(width|height|codebase|classid|id|_cx|_cy)$/.test(k)) {

+					// Use url instead of src in IE for Windows media

+					if (o.type == 'application/x-mplayer2' && k == 'src' && !p.url)

+						k = 'url';

+

+					if (v)

+						dom.add(ob, 'span', {_mce_name : 'param', name : k, '_mce_value' : v});

+				}

+			});

+

+			if (!stc)

+				dom.add(ob, 'span', tinymce.extend({_mce_name : 'embed', type : o.type, style : dom.getAttrib(n, 'style')}, p));

+

+			return ob;

+		},

+

+		_spansToImgs : function(p) {

+			var t = this, dom = t.editor.dom, im, ci;

+

+			each(dom.select('span', p), function(n) {

+				// Convert object into image

+				if (dom.getAttrib(n, 'class') == 'mceItemObject') {

+					ci = dom.getAttrib(n, "classid").toLowerCase().replace(/\s+/g, '');

+

+					switch (ci) {

+						case 'clsid:d27cdb6e-ae6d-11cf-96b8-444553540000':

+							dom.replace(t._createImg('mceItemFlash', n), n);

+							break;

+

+						case 'clsid:166b1bca-3f9c-11cf-8075-444553540000':

+							dom.replace(t._createImg('mceItemShockWave', n), n);

+							break;

+

+						case 'clsid:6bf52a52-394a-11d3-b153-00c04f79faa6':

+						case 'clsid:22d6f312-b0f6-11d0-94ab-0080c74c7e95':

+						case 'clsid:05589fa1-c356-11ce-bf01-00aa0055595a':

+							dom.replace(t._createImg('mceItemWindowsMedia', n), n);

+							break;

+

+						case 'clsid:02bf25d5-8c17-4b23-bc80-d3488abddc6b':

+							dom.replace(t._createImg('mceItemQuickTime', n), n);

+							break;

+

+						case 'clsid:cfcdaa03-8be4-11cf-b84b-0020afbbccfa':

+							dom.replace(t._createImg('mceItemRealMedia', n), n);

+							break;

+

+						default:

+							dom.replace(t._createImg('mceItemFlash', n), n);

+					}

+					

+					return;

+				}

+

+				// Convert embed into image

+				if (dom.getAttrib(n, 'class') == 'mceItemEmbed') {

+					switch (dom.getAttrib(n, 'type')) {

+						case 'application/x-shockwave-flash':

+							dom.replace(t._createImg('mceItemFlash', n), n);

+							break;

+

+						case 'application/x-director':

+							dom.replace(t._createImg('mceItemShockWave', n), n);

+							break;

+

+						case 'application/x-mplayer2':

+							dom.replace(t._createImg('mceItemWindowsMedia', n), n);

+							break;

+

+						case 'video/quicktime':

+							dom.replace(t._createImg('mceItemQuickTime', n), n);

+							break;

+

+						case 'audio/x-pn-realaudio-plugin':

+							dom.replace(t._createImg('mceItemRealMedia', n), n);

+							break;

+

+						default:

+							dom.replace(t._createImg('mceItemFlash', n), n);

+					}

+				}			

+			});

+		},

+

+		_createImg : function(cl, n) {

+			var im, dom = this.editor.dom, pa = {}, ti = '', args;

+

+			args = ['id', 'name', 'width', 'height', 'bgcolor', 'align', 'flashvars', 'src', 'wmode', 'allowfullscreen', 'quality', 'data'];	

+

+			// Create image

+			im = dom.create('img', {

+				src : this.url + '/img/trans.gif',

+				width : dom.getAttrib(n, 'width') || 100,

+				height : dom.getAttrib(n, 'height') || 100,

+				style : dom.getAttrib(n, 'style'),

+				'class' : cl

+			});

+

+			// Setup base parameters

+			each(args, function(na) {

+				var v = dom.getAttrib(n, na);

+

+				if (v)

+					pa[na] = v;

+			});

+

+			// Add optional parameters

+			each(dom.select('span', n), function(n) {

+				if (dom.hasClass(n, 'mceItemParam'))

+					pa[dom.getAttrib(n, 'name')] = dom.getAttrib(n, '_mce_value');

+			});

+

+			// Use src not movie

+			if (pa.movie) {

+				pa.src = pa.movie;

+				delete pa.movie;

+			}

+

+			// No src try data

+			if (!pa.src) {

+				pa.src = pa.data;

+				delete pa.data;

+			}

+

+			// Merge with embed args

+			n = dom.select('.mceItemEmbed', n)[0];

+			if (n) {

+				each(args, function(na) {

+					var v = dom.getAttrib(n, na);

+

+					if (v && !pa[na])

+						pa[na] = v;

+				});

+			}

+

+			delete pa.width;

+			delete pa.height;

+

+			im.title = this._serialize(pa);

+

+			return im;

+		},

+

+		_parse : function(s) {

+			return tinymce.util.JSON.parse('{' + s + '}');

+		},

+

+		_serialize : function(o) {

+			return tinymce.util.JSON.serialize(o).replace(/[{}]/g, '');

+		}

+	});

+

+	// Register plugin

+	tinymce.PluginManager.add('media', tinymce.plugins.MediaPlugin);

+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/img/flash.gif b/dojopuzzles/media/js/tiny_mce/plugins/media/img/flash.gif
new file mode 100644
index 0000000..cb192e6
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/img/flash.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/img/flv_player.swf b/dojopuzzles/media/js/tiny_mce/plugins/media/img/flv_player.swf
new file mode 100644
index 0000000..042c2ab
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/img/flv_player.swf
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/img/quicktime.gif b/dojopuzzles/media/js/tiny_mce/plugins/media/img/quicktime.gif
new file mode 100644
index 0000000..3b04991
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/img/quicktime.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/img/realmedia.gif b/dojopuzzles/media/js/tiny_mce/plugins/media/img/realmedia.gif
new file mode 100644
index 0000000..fdfe0b9
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/img/realmedia.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/img/shockwave.gif b/dojopuzzles/media/js/tiny_mce/plugins/media/img/shockwave.gif
new file mode 100644
index 0000000..5f235df
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/img/shockwave.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/img/trans.gif b/dojopuzzles/media/js/tiny_mce/plugins/media/img/trans.gif
new file mode 100644
index 0000000..3884865
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/img/trans.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/img/windowsmedia.gif b/dojopuzzles/media/js/tiny_mce/plugins/media/img/windowsmedia.gif
new file mode 100644
index 0000000..ab50f2d
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/img/windowsmedia.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/js/embed.js b/dojopuzzles/media/js/tiny_mce/plugins/media/js/embed.js
new file mode 100644
index 0000000..f8dc810
--- /dev/null
+++ b/dojopuzzles/media/js/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 += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';

+	h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';

+	h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';

+	h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';

+	h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';

+	h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';

+	h += '>';

+

+	for (n in p)

+		h += '<param name="' + n + '" value="' + p[n] + '">';

+

+	h += '<embed type="' + mt + '"';

+

+	for (n in p)

+		h += n + '="' + p[n] + '" ';

+

+	h += '></embed></object>';

+

+	document.write(h);

+}

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/js/media.js b/dojopuzzles/media/js/tiny_mce/plugins/media/js/media.js
new file mode 100644
index 0000000..86cfa98
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/js/media.js
@@ -0,0 +1,630 @@
+tinyMCEPopup.requireLangPack();

+

+var oldWidth, oldHeight, ed, url;

+

+if (url = tinyMCEPopup.getParam("media_external_list_url"))

+	document.write('<script language="javascript" type="text/javascript" src="' + tinyMCEPopup.editor.documentBaseURI.toAbsolute(url) + '"></script>');

+

+function init() {

+	var pl = "", f, val;

+	var type = "flash", fe, i;

+

+	ed = tinyMCEPopup.editor;

+

+	tinyMCEPopup.resizeToInnerSize();

+	f = document.forms[0]

+

+	fe = ed.selection.getNode();

+	if (/mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) {

+		pl = fe.title;

+

+		switch (ed.dom.getAttrib(fe, 'class')) {

+			case 'mceItemFlash':

+				type = 'flash';

+				break;

+

+			case 'mceItemFlashVideo':

+				type = 'flv';

+				break;

+

+			case 'mceItemShockWave':

+				type = 'shockwave';

+				break;

+

+			case 'mceItemWindowsMedia':

+				type = 'wmp';

+				break;

+

+			case 'mceItemQuickTime':

+				type = 'qt';

+				break;

+

+			case 'mceItemRealMedia':

+				type = 'rmp';

+				break;

+		}

+

+		document.forms[0].insert.value = ed.getLang('update', 'Insert', true); 

+	}

+

+	document.getElementById('filebrowsercontainer').innerHTML = getBrowserHTML('filebrowser','src','media','media');

+	document.getElementById('qtsrcfilebrowsercontainer').innerHTML = getBrowserHTML('qtsrcfilebrowser','qt_qtsrc','media','media');

+	document.getElementById('bgcolor_pickcontainer').innerHTML = getColorPickerHTML('bgcolor_pick','bgcolor');

+

+	var html = getMediaListHTML('medialist','src','media','media');

+	if (html == "")

+		document.getElementById("linklistrow").style.display = 'none';

+	else

+		document.getElementById("linklistcontainer").innerHTML = html;

+

+	// Resize some elements

+	if (isVisible('filebrowser'))

+		document.getElementById('src').style.width = '230px';

+

+	// Setup form

+	if (pl != "") {

+		pl = tinyMCEPopup.editor.plugins.media._parse(pl);

+

+		switch (type) {

+			case "flash":

+				setBool(pl, 'flash', 'play');

+				setBool(pl, 'flash', 'loop');

+				setBool(pl, 'flash', 'menu');

+				setBool(pl, 'flash', 'swliveconnect');

+				setStr(pl, 'flash', 'quality');

+				setStr(pl, 'flash', 'scale');

+				setStr(pl, 'flash', 'salign');

+				setStr(pl, 'flash', 'wmode');

+				setStr(pl, 'flash', 'base');

+				setStr(pl, 'flash', 'flashvars');

+			break;

+

+			case "qt":

+				setBool(pl, 'qt', 'loop');

+				setBool(pl, 'qt', 'autoplay');

+				setBool(pl, 'qt', 'cache');

+				setBool(pl, 'qt', 'controller');

+				setBool(pl, 'qt', 'correction');

+				setBool(pl, 'qt', 'enablejavascript');

+				setBool(pl, 'qt', 'kioskmode');

+				setBool(pl, 'qt', 'autohref');

+				setBool(pl, 'qt', 'playeveryframe');

+				setBool(pl, 'qt', 'tarsetcache');

+				setStr(pl, 'qt', 'scale');

+				setStr(pl, 'qt', 'starttime');

+				setStr(pl, 'qt', 'endtime');

+				setStr(pl, 'qt', 'tarset');

+				setStr(pl, 'qt', 'qtsrcchokespeed');

+				setStr(pl, 'qt', 'volume');

+				setStr(pl, 'qt', 'qtsrc');

+			break;

+

+			case "shockwave":

+				setBool(pl, 'shockwave', 'sound');

+				setBool(pl, 'shockwave', 'progress');

+				setBool(pl, 'shockwave', 'autostart');

+				setBool(pl, 'shockwave', 'swliveconnect');

+				setStr(pl, 'shockwave', 'swvolume');

+				setStr(pl, 'shockwave', 'swstretchstyle');

+				setStr(pl, 'shockwave', 'swstretchhalign');

+				setStr(pl, 'shockwave', 'swstretchvalign');

+			break;

+

+			case "wmp":

+				setBool(pl, 'wmp', 'autostart');

+				setBool(pl, 'wmp', 'enabled');

+				setBool(pl, 'wmp', 'enablecontextmenu');

+				setBool(pl, 'wmp', 'fullscreen');

+				setBool(pl, 'wmp', 'invokeurls');

+				setBool(pl, 'wmp', 'mute');

+				setBool(pl, 'wmp', 'stretchtofit');

+				setBool(pl, 'wmp', 'windowlessvideo');

+				setStr(pl, 'wmp', 'balance');

+				setStr(pl, 'wmp', 'baseurl');

+				setStr(pl, 'wmp', 'captioningid');

+				setStr(pl, 'wmp', 'currentmarker');

+				setStr(pl, 'wmp', 'currentposition');

+				setStr(pl, 'wmp', 'defaultframe');

+				setStr(pl, 'wmp', 'playcount');

+				setStr(pl, 'wmp', 'rate');

+				setStr(pl, 'wmp', 'uimode');

+				setStr(pl, 'wmp', 'volume');

+			break;

+

+			case "rmp":

+				setBool(pl, 'rmp', 'autostart');

+				setBool(pl, 'rmp', 'loop');

+				setBool(pl, 'rmp', 'autogotourl');

+				setBool(pl, 'rmp', 'center');

+				setBool(pl, 'rmp', 'imagestatus');

+				setBool(pl, 'rmp', 'maintainaspect');

+				setBool(pl, 'rmp', 'nojava');

+				setBool(pl, 'rmp', 'prefetch');

+				setBool(pl, 'rmp', 'shuffle');

+				setStr(pl, 'rmp', 'console');

+				setStr(pl, 'rmp', 'controls');

+				setStr(pl, 'rmp', 'numloop');

+				setStr(pl, 'rmp', 'scriptcallbacks');

+			break;

+		}

+

+		setStr(pl, null, 'src');

+		setStr(pl, null, 'id');

+		setStr(pl, null, 'name');

+		setStr(pl, null, 'vspace');

+		setStr(pl, null, 'hspace');

+		setStr(pl, null, 'bgcolor');

+		setStr(pl, null, 'align');

+		setStr(pl, null, 'width');

+		setStr(pl, null, 'height');

+

+		if ((val = ed.dom.getAttrib(fe, "width")) != "")

+			pl.width = f.width.value = val;

+

+		if ((val = ed.dom.getAttrib(fe, "height")) != "")

+			pl.height = f.height.value = val;

+

+		oldWidth = pl.width ? parseInt(pl.width) : 0;

+		oldHeight = pl.height ? parseInt(pl.height) : 0;

+	} else

+		oldWidth = oldHeight = 0;

+

+	selectByValue(f, 'media_type', type);

+	changedType(type);

+	updateColor('bgcolor_pick', 'bgcolor');

+

+	TinyMCE_EditableSelects.init();

+	generatePreview();

+}

+

+function insertMedia() {

+	var fe, f = document.forms[0], h;

+

+	tinyMCEPopup.restoreSelection();

+

+	if (!AutoValidator.validate(f)) {

+		tinyMCEPopup.alert(ed.getLang('invalid_data'));

+		return false;

+	}

+

+	f.width.value = f.width.value == "" ? 100 : f.width.value;

+	f.height.value = f.height.value == "" ? 100 : f.height.value;

+

+	fe = ed.selection.getNode();

+	if (fe != null && /mceItem(Flash|ShockWave|WindowsMedia|QuickTime|RealMedia)/.test(ed.dom.getAttrib(fe, 'class'))) {

+		switch (f.media_type.options[f.media_type.selectedIndex].value) {

+			case "flash":

+				fe.className = "mceItemFlash";

+				break;

+

+			case "flv":

+				fe.className = "mceItemFlashVideo";

+				break;

+

+			case "shockwave":

+				fe.className = "mceItemShockWave";

+				break;

+

+			case "qt":

+				fe.className = "mceItemQuickTime";

+				break;

+

+			case "wmp":

+				fe.className = "mceItemWindowsMedia";

+				break;

+

+			case "rmp":

+				fe.className = "mceItemRealMedia";

+				break;

+		}

+

+		if (fe.width != f.width.value || fe.height != f.height.value)

+			ed.execCommand('mceRepaint');

+

+		fe.title = serializeParameters();

+		fe.width = f.width.value;

+		fe.height = f.height.value;

+		fe.style.width = f.width.value + (f.width.value.indexOf('%') == -1 ? 'px' : '');

+		fe.style.height = f.height.value + (f.height.value.indexOf('%') == -1 ? 'px' : '');

+		fe.align = f.align.options[f.align.selectedIndex].value;

+	} else {

+		h = '<img src="' + tinyMCEPopup.getWindowArg("plugin_url") + '/img/trans.gif"' ;

+

+		switch (f.media_type.options[f.media_type.selectedIndex].value) {

+			case "flash":

+				h += ' class="mceItemFlash"';

+				break;

+

+			case "flv":

+				h += ' class="mceItemFlashVideo"';

+				break;

+

+			case "shockwave":

+				h += ' class="mceItemShockWave"';

+				break;

+

+			case "qt":

+				h += ' class="mceItemQuickTime"';

+				break;

+

+			case "wmp":

+				h += ' class="mceItemWindowsMedia"';

+				break;

+

+			case "rmp":

+				h += ' class="mceItemRealMedia"';

+				break;

+		}

+

+		h += ' title="' + serializeParameters() + '"';

+		h += ' width="' + f.width.value + '"';

+		h += ' height="' + f.height.value + '"';

+		h += ' align="' + f.align.options[f.align.selectedIndex].value + '"';

+

+		h += ' />';

+

+		ed.execCommand('mceInsertContent', false, h);

+	}

+

+	tinyMCEPopup.close();

+}

+

+function updatePreview() {

+	var f = document.forms[0], type;

+

+	f.width.value = f.width.value || '320';

+	f.height.value = f.height.value || '240';

+

+	type = getType(f.src.value);

+	selectByValue(f, 'media_type', type);

+	changedType(type);

+	generatePreview();

+}

+

+function getMediaListHTML() {

+	if (typeof(tinyMCEMediaList) != "undefined" && tinyMCEMediaList.length > 0) {

+		var html = "";

+

+		html += '<select id="linklist" name="linklist" style="width: 250px" onchange="this.form.src.value=this.options[this.selectedIndex].value;updatePreview();">';

+		html += '<option value="">---</option>';

+

+		for (var i=0; i<tinyMCEMediaList.length; i++)

+			html += '<option value="' + tinyMCEMediaList[i][1] + '">' + tinyMCEMediaList[i][0] + '</option>';

+

+		html += '</select>';

+

+		return html;

+	}

+

+	return "";

+}

+

+function getType(v) {

+	var fo, i, c, el, x, f = document.forms[0];

+

+	fo = ed.getParam("media_types", "flash=swf;flv=flv;shockwave=dcr;qt=mov,qt,mpg,mp3,mp4,mpeg;shockwave=dcr;wmp=avi,wmv,wm,asf,asx,wmx,wvx;rmp=rm,ra,ram").split(';');

+

+	// YouTube

+	if (v.match(/watch\?v=(.+)(.*)/)) {

+		f.width.value = '425';

+		f.height.value = '350';

+		f.src.value = 'http://www.youtube.com/v/' + v.match(/v=(.*)(.*)/)[0].split('=')[1];

+		return 'flash';

+	}

+

+	// Google video

+	if (v.indexOf('http://video.google.com/videoplay?docid=') == 0) {

+		f.width.value = '425';

+		f.height.value = '326';

+		f.src.value = 'http://video.google.com/googleplayer.swf?docId=' + v.substring('http://video.google.com/videoplay?docid='.length) + '&hl=en';

+		return 'flash';

+	}

+

+	for (i=0; i<fo.length; i++) {

+		c = fo[i].split('=');

+

+		el = c[1].split(',');

+		for (x=0; x<el.length; x++)

+		if (v.indexOf('.' + el[x]) != -1)

+			return c[0];

+	}

+

+	return null;

+}

+

+function switchType(v) {

+	var t = getType(v), d = document, f = d.forms[0];

+

+	if (!t)

+		return;

+

+	selectByValue(d.forms[0], 'media_type', t);

+	changedType(t);

+

+	// Update qtsrc also

+	if (t == 'qt' && f.src.value.toLowerCase().indexOf('rtsp://') != -1) {

+		alert(ed.getLang("media_qt_stream_warn"));

+

+		if (f.qt_qtsrc.value == '')

+			f.qt_qtsrc.value = f.src.value;

+	}

+}

+

+function changedType(t) {

+	var d = document;

+

+	d.getElementById('flash_options').style.display = 'none';

+	d.getElementById('flv_options').style.display = 'none';

+	d.getElementById('qt_options').style.display = 'none';

+	d.getElementById('shockwave_options').style.display = 'none';

+	d.getElementById('wmp_options').style.display = 'none';

+	d.getElementById('rmp_options').style.display = 'none';

+

+	if (t)

+		d.getElementById(t + '_options').style.display = 'block';

+}

+

+function serializeParameters() {

+	var d = document, f = d.forms[0], s = '';

+

+	switch (f.media_type.options[f.media_type.selectedIndex].value) {

+		case "flash":

+			s += getBool('flash', 'play', true);

+			s += getBool('flash', 'loop', true);

+			s += getBool('flash', 'menu', true);

+			s += getBool('flash', 'swliveconnect', false);

+			s += getStr('flash', 'quality');

+			s += getStr('flash', 'scale');

+			s += getStr('flash', 'salign');

+			s += getStr('flash', 'wmode');

+			s += getStr('flash', 'base');

+			s += getStr('flash', 'flashvars');

+		break;

+

+		case "qt":

+			s += getBool('qt', 'loop', false);

+			s += getBool('qt', 'autoplay', true);

+			s += getBool('qt', 'cache', false);

+			s += getBool('qt', 'controller', true);

+			s += getBool('qt', 'correction', false, 'none', 'full');

+			s += getBool('qt', 'enablejavascript', false);

+			s += getBool('qt', 'kioskmode', false);

+			s += getBool('qt', 'autohref', false);

+			s += getBool('qt', 'playeveryframe', false);

+			s += getBool('qt', 'targetcache', false);

+			s += getStr('qt', 'scale');

+			s += getStr('qt', 'starttime');

+			s += getStr('qt', 'endtime');

+			s += getStr('qt', 'target');

+			s += getStr('qt', 'qtsrcchokespeed');

+			s += getStr('qt', 'volume');

+			s += getStr('qt', 'qtsrc');

+		break;

+

+		case "shockwave":

+			s += getBool('shockwave', 'sound');

+			s += getBool('shockwave', 'progress');

+			s += getBool('shockwave', 'autostart');

+			s += getBool('shockwave', 'swliveconnect');

+			s += getStr('shockwave', 'swvolume');

+			s += getStr('shockwave', 'swstretchstyle');

+			s += getStr('shockwave', 'swstretchhalign');

+			s += getStr('shockwave', 'swstretchvalign');

+		break;

+

+		case "wmp":

+			s += getBool('wmp', 'autostart', true);

+			s += getBool('wmp', 'enabled', false);

+			s += getBool('wmp', 'enablecontextmenu', true);

+			s += getBool('wmp', 'fullscreen', false);

+			s += getBool('wmp', 'invokeurls', true);

+			s += getBool('wmp', 'mute', false);

+			s += getBool('wmp', 'stretchtofit', false);

+			s += getBool('wmp', 'windowlessvideo', false);

+			s += getStr('wmp', 'balance');

+			s += getStr('wmp', 'baseurl');

+			s += getStr('wmp', 'captioningid');

+			s += getStr('wmp', 'currentmarker');

+			s += getStr('wmp', 'currentposition');

+			s += getStr('wmp', 'defaultframe');

+			s += getStr('wmp', 'playcount');

+			s += getStr('wmp', 'rate');

+			s += getStr('wmp', 'uimode');

+			s += getStr('wmp', 'volume');

+		break;

+

+		case "rmp":

+			s += getBool('rmp', 'autostart', false);

+			s += getBool('rmp', 'loop', false);

+			s += getBool('rmp', 'autogotourl', true);

+			s += getBool('rmp', 'center', false);

+			s += getBool('rmp', 'imagestatus', true);

+			s += getBool('rmp', 'maintainaspect', false);

+			s += getBool('rmp', 'nojava', false);

+			s += getBool('rmp', 'prefetch', false);

+			s += getBool('rmp', 'shuffle', false);

+			s += getStr('rmp', 'console');

+			s += getStr('rmp', 'controls');

+			s += getStr('rmp', 'numloop');

+			s += getStr('rmp', 'scriptcallbacks');

+		break;

+	}

+

+	s += getStr(null, 'id');

+	s += getStr(null, 'name');

+	s += getStr(null, 'src');

+	s += getStr(null, 'align');

+	s += getStr(null, 'bgcolor');

+	s += getInt(null, 'vspace');

+	s += getInt(null, 'hspace');

+	s += getStr(null, 'width');

+	s += getStr(null, 'height');

+

+	s = s.length > 0 ? s.substring(0, s.length - 1) : s;

+

+	return s;

+}

+

+function setBool(pl, p, n) {

+	if (typeof(pl[n]) == "undefined")

+		return;

+

+	document.forms[0].elements[p + "_" + n].checked = pl[n] != 'false';

+}

+

+function setStr(pl, p, n) {

+	var f = document.forms[0], e = f.elements[(p != null ? p + "_" : '') + n];

+

+	if (typeof(pl[n]) == "undefined")

+		return;

+

+	if (e.type == "text")

+		e.value = pl[n];

+	else

+		selectByValue(f, (p != null ? p + "_" : '') + n, pl[n]);

+}

+

+function getBool(p, n, d, tv, fv) {

+	var v = document.forms[0].elements[p + "_" + n].checked;

+

+	tv = typeof(tv) == 'undefined' ? 'true' : "'" + jsEncode(tv) + "'";

+	fv = typeof(fv) == 'undefined' ? 'false' : "'" + jsEncode(fv) + "'";

+

+	return (v == d) ? '' : n + (v ? ':' + tv + ',' : ":\'" + fv + "\',");

+}

+

+function getStr(p, n, d) {

+	var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];

+	var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;

+

+	if (n == 'src')

+		v = tinyMCEPopup.editor.convertURL(v, 'src', null);

+

+	return ((n == d || v == '') ? '' : n + ":'" + jsEncode(v) + "',");

+}

+

+function getInt(p, n, d) {

+	var e = document.forms[0].elements[(p != null ? p + "_" : "") + n];

+	var v = e.type == "text" ? e.value : e.options[e.selectedIndex].value;

+

+	return ((n == d || v == '') ? '' : n + ":" + v.replace(/[^0-9]+/g, '') + ",");

+}

+

+function jsEncode(s) {

+	s = s.replace(new RegExp('\\\\', 'g'), '\\\\');

+	s = s.replace(new RegExp('"', 'g'), '\\"');

+	s = s.replace(new RegExp("'", 'g'), "\\'");

+

+	return s;

+}

+

+function generatePreview(c) {

+	var f = document.forms[0], p = document.getElementById('prev'), h = '', cls, pl, n, type, codebase, wp, hp, nw, nh;

+

+	p.innerHTML = '<!-- x --->';

+

+	nw = parseInt(f.width.value);

+	nh = parseInt(f.height.value);

+

+	if (f.width.value != "" && f.height.value != "") {

+		if (f.constrain.checked) {

+			if (c == 'width' && oldWidth != 0) {

+				wp = nw / oldWidth;

+				nh = Math.round(wp * nh);

+				f.height.value = nh;

+			} else if (c == 'height' && oldHeight != 0) {

+				hp = nh / oldHeight;

+				nw = Math.round(hp * nw);

+				f.width.value = nw;

+			}

+		}

+	}

+

+	if (f.width.value != "")

+		oldWidth = nw;

+

+	if (f.height.value != "")

+		oldHeight = nh;

+

+	// After constrain

+	pl = serializeParameters();

+

+	switch (f.media_type.options[f.media_type.selectedIndex].value) {

+		case "flash":

+			cls = 'clsid:D27CDB6E-AE6D-11cf-96B8-444553540000';

+			codebase = 'http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0';

+			type = 'application/x-shockwave-flash';

+			break;

+

+		case "shockwave":

+			cls = 'clsid:166B1BCA-3F9C-11CF-8075-444553540000';

+			codebase = 'http://download.macromedia.com/pub/shockwave/cabs/director/sw.cab#version=8,5,1,0';

+			type = 'application/x-director';

+			break;

+

+		case "qt":

+			cls = 'clsid:02BF25D5-8C17-4B23-BC80-D3488ABDDC6B';

+			codebase = 'http://www.apple.com/qtactivex/qtplugin.cab#version=6,0,2,0';

+			type = 'video/quicktime';

+			break;

+

+		case "wmp":

+			cls = ed.getParam('media_wmp6_compatible') ? 'clsid:05589FA1-C356-11CE-BF01-00AA0055595A' : 'clsid:6BF52A52-394A-11D3-B153-00C04F79FAA6';

+			codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';

+			type = 'application/x-mplayer2';

+			break;

+

+		case "rmp":

+			cls = 'clsid:CFCDAA03-8BE4-11cf-B84B-0020AFBBCCFA';

+			codebase = 'http://activex.microsoft.com/activex/controls/mplayer/en/nsmp2inf.cab#Version=5,1,52,701';

+			type = 'audio/x-pn-realaudio-plugin';

+			break;

+	}

+

+	if (pl == '') {

+		p.innerHTML = '';

+		return;

+	}

+

+	pl = tinyMCEPopup.editor.plugins.media._parse(pl);

+

+	if (!pl.src) {

+		p.innerHTML = '';

+		return;

+	}

+

+	pl.src = tinyMCEPopup.editor.documentBaseURI.toAbsolute(pl.src);

+	pl.width = !pl.width ? 100 : pl.width;

+	pl.height = !pl.height ? 100 : pl.height;

+	pl.id = !pl.id ? 'obj' : pl.id;

+	pl.name = !pl.name ? 'eobj' : pl.name;

+	pl.align = !pl.align ? '' : pl.align;

+

+	// Avoid annoying warning about insecure items

+	if (!tinymce.isIE || document.location.protocol != 'https:') {

+		h += '<object classid="' + cls + '" codebase="' + codebase + '" width="' + pl.width + '" height="' + pl.height + '" id="' + pl.id + '" name="' + pl.name + '" align="' + pl.align + '">';

+

+		for (n in pl) {

+			h += '<param name="' + n + '" value="' + pl[n] + '">';

+

+			// Add extra url parameter if it's an absolute URL

+			if (n == 'src' && pl[n].indexOf('://') != -1)

+				h += '<param name="url" value="' + pl[n] + '" />';

+		}

+	}

+

+	h += '<embed type="' + type + '" ';

+

+	for (n in pl)

+		h += n + '="' + pl[n] + '" ';

+

+	h += '></embed>';

+

+	// Avoid annoying warning about insecure items

+	if (!tinymce.isIE || document.location.protocol != 'https:')

+		h += '</object>';

+

+	p.innerHTML = "<!-- x --->" + h;

+}

+

+tinyMCEPopup.onInit.add(init);

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/media/langs/en_dlg.js
new file mode 100644
index 0000000..6d0a996
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/langs/en_dlg.js
@@ -0,0 +1,103 @@
+tinyMCE.addI18n('en.media_dlg',{

+title:"Insert / edit embedded media",

+general:"General",

+advanced:"Advanced",

+file:"File/URL",

+list:"List",

+size:"Dimensions",

+preview:"Preview",

+constrain_proportions:"Constrain proportions",

+type:"Type",

+id:"Id",

+name:"Name",

+class_name:"Class",

+vspace:"V-Space",

+hspace:"H-Space",

+play:"Auto play",

+loop:"Loop",

+menu:"Show menu",

+quality:"Quality",

+scale:"Scale",

+align:"Align",

+salign:"SAlign",

+wmode:"WMode",

+bgcolor:"Background",

+base:"Base",

+flashvars:"Flashvars",

+liveconnect:"SWLiveConnect",

+autohref:"AutoHREF",

+cache:"Cache",

+hidden:"Hidden",

+controller:"Controller",

+kioskmode:"Kiosk mode",

+playeveryframe:"Play every frame",

+targetcache:"Target cache",

+correction:"No correction",

+enablejavascript:"Enable JavaScript",

+starttime:"Start time",

+endtime:"End time",

+href:"Href",

+qtsrcchokespeed:"Choke speed",

+target:"Target",

+volume:"Volume",

+autostart:"Auto start",

+enabled:"Enabled",

+fullscreen:"Fullscreen",

+invokeurls:"Invoke URLs",

+mute:"Mute",

+stretchtofit:"Stretch to fit",

+windowlessvideo:"Windowless video",

+balance:"Balance",

+baseurl:"Base URL",

+captioningid:"Captioning id",

+currentmarker:"Current marker",

+currentposition:"Current position",

+defaultframe:"Default frame",

+playcount:"Play count",

+rate:"Rate",

+uimode:"UI Mode",

+flash_options:"Flash options",

+qt_options:"Quicktime options",

+wmp_options:"Windows media player options",

+rmp_options:"Real media player options",

+shockwave_options:"Shockwave options",

+autogotourl:"Auto goto URL",

+center:"Center",

+imagestatus:"Image status",

+maintainaspect:"Maintain aspect",

+nojava:"No java",

+prefetch:"Prefetch",

+shuffle:"Shuffle",

+console:"Console",

+numloop:"Num loops",

+controls:"Controls",

+scriptcallbacks:"Script callbacks",

+swstretchstyle:"Stretch style",

+swstretchhalign:"Stretch H-Align",

+swstretchvalign:"Stretch V-Align",

+sound:"Sound",

+progress:"Progress",

+qtsrc:"QT Src",

+qt_stream_warn:"Streamed rtsp resources should be added to the QT Src field under the advanced tab.\nYou should also add a non streamed version to the Src field..",

+align_top:"Top",

+align_right:"Right",

+align_bottom:"Bottom",

+align_left:"Left",

+align_center:"Center",

+align_top_left:"Top left",

+align_top_right:"Top right",

+align_bottom_left:"Bottom left",

+align_bottom_right:"Bottom right",

+flv_options:"Flash video options",

+flv_scalemode:"Scale mode",

+flv_buffer:"Buffer",

+flv_startimage:"Start image",

+flv_starttime:"Start time",

+flv_defaultvolume:"Default volumne",

+flv_hiddengui:"Hidden GUI",

+flv_autostart:"Auto start",

+flv_loop:"Loop",

+flv_showscalemodes:"Show scale modes",

+flv_smoothvideo:"Smooth video",

+flv_jscallback:"JS Callback"

+});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/media/media.htm b/dojopuzzles/media/js/tiny_mce/plugins/media/media.htm
new file mode 100644
index 0000000..73a903f
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/media/media.htm
@@ -0,0 +1,817 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#media_dlg.title}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="js/media.js"></script>

+	<script type="text/javascript" src="../../utils/mctabs.js"></script>

+	<script type="text/javascript" src="../../utils/validate.js"></script>

+	<script type="text/javascript" src="../../utils/form_utils.js"></script>

+	<script type="text/javascript" src="../../utils/editable_selects.js"></script>

+	<link href="css/media.css" rel="stylesheet" type="text/css" />

+</head>

+<body style="display: none">

+    <form onsubmit="insertMedia();return false;" action="#">

+		<div class="tabs">

+			<ul>

+				<li id="general_tab" class="current"><span><a href="javascript:mcTabs.displayTab('general_tab','general_panel');generatePreview();" onmousedown="return false;">{#media_dlg.general}</a></span></li>

+				<li id="advanced_tab"><span><a href="javascript:mcTabs.displayTab('advanced_tab','advanced_panel');" onmousedown="return false;">{#media_dlg.advanced}</a></span></li>

+			</ul>

+		</div>

+

+		<div class="panel_wrapper">

+			<div id="general_panel" class="panel current">

+				<fieldset>

+					<legend>{#media_dlg.general}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+							<tr>

+								<td><label for="media_type">{#media_dlg.type}</label></td>

+								<td>

+									<select id="media_type" name="media_type" onchange="changedType(this.value);generatePreview();">

+										<option value="flash">Flash</option>

+										<!-- <option value="flv">Flash video (FLV)</option> -->

+										<option value="qt">Quicktime</option>

+										<option value="shockwave">Shockwave</option>

+										<option value="wmp">Windows Media</option>

+										<option value="rmp">Real Media</option>

+									</select>

+								</td>

+							</tr>

+							<tr>

+							<td><label for="src">{#media_dlg.file}</label></td>

+							  <td>

+									<table border="0" cellspacing="0" cellpadding="0">

+									  <tr>

+										<td><input id="src" name="src" type="text" value="" class="mceFocus" onchange="switchType(this.value);generatePreview();" /></td>

+										<td id="filebrowsercontainer">&nbsp;</td>

+									  </tr>

+									</table>

+								</td>

+							</tr>

+							<tr id="linklistrow">

+								<td><label for="linklist">{#media_dlg.list}</label></td>

+								<td id="linklistcontainer"><select id="linklist"><option value=""></option></select></td>

+							</tr>

+							<tr>

+								<td><label for="width">{#media_dlg.size}</label></td>

+								<td>

+									<table border="0" cellpadding="0" cellspacing="0">

+										<tr>

+											<td><input type="text" id="width" name="width" value="" class="size" onchange="generatePreview('width');" /> x <input type="text" id="height" name="height" value="" class="size"  onchange="generatePreview('height');" /></td>

+											<td>&nbsp;&nbsp;<input id="constrain" type="checkbox" name="constrain" class="checkbox" /></td>

+											<td><label id="constrainlabel" for="constrain">{#media_dlg.constrain_proportions}</label></td>

+										</tr>

+									</table>

+								</td>

+							</tr>

+					</table>

+				</fieldset>

+

+				<fieldset>

+					<legend>{#media_dlg.preview}</legend>

+					<div id="prev"></div>

+				</fieldset>

+			</div>

+

+			<div id="advanced_panel" class="panel">

+				<fieldset>

+					<legend>{#media_dlg.advanced}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0" width="100%">

+						<tr>

+							<td><label for="id">{#media_dlg.id}</label></td>

+							<td><input type="text" id="id" name="id" onchange="generatePreview();" /></td>

+							<td><label for="name">{#media_dlg.name}</label></td>

+							<td><input type="text" id="name" name="name" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="align">{#media_dlg.align}</label></td>

+							<td>

+								<select id="align" name="align" onchange="generatePreview();">

+									<option value="">{#not_set}</option> 

+									<option value="top">{#media_dlg.align_top}</option>

+									<option value="right">{#media_dlg.align_right}</option>

+									<option value="bottom">{#media_dlg.align_bottom}</option>

+									<option value="left">{#media_dlg.align_left}</option>

+								</select>

+							</td>

+

+							<td><label for="bgcolor">{#media_dlg.bgcolor}</label></td>

+							<td>

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input id="bgcolor" name="bgcolor" type="text" value="" size="9" onchange="updateColor('bgcolor_pick','bgcolor');generatePreview();" /></td>

+										<td id="bgcolor_pickcontainer">&nbsp;</td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td><label for="vspace">{#media_dlg.vspace}</label></td>

+							<td><input type="text" id="vspace" name="vspace" class="number" onchange="generatePreview();" /></td>

+							<td><label for="hspace">{#media_dlg.hspace}</label></td>

+							<td><input type="text" id="hspace" name="hspace" class="number" onchange="generatePreview();" /></td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset id="flash_options">

+					<legend>{#media_dlg.flash_options}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td><label for="flash_quality">{#media_dlg.quality}</label></td>

+							<td>

+								<select id="flash_quality" name="flash_quality" onchange="generatePreview();">

+									<option value="">{#not_set}</option> 

+									<option value="high">high</option>

+									<option value="low">low</option>

+									<option value="autolow">autolow</option>

+									<option value="autohigh">autohigh</option>

+									<option value="best">best</option>

+								</select>

+							</td>

+

+							<td><label for="flash_scale">{#media_dlg.scale}</label></td>

+							<td>

+								<select id="flash_scale" name="flash_scale" onchange="generatePreview();">

+									<option value="">{#not_set}</option> 

+									<option value="showall">showall</option>

+									<option value="noborder">noborder</option>

+									<option value="exactfit">exactfit</option>

+									<option value="noscale">noscale</option>

+								</select>

+							</td>

+						</tr>

+

+						<tr>

+							<td><label for="flash_wmode">{#media_dlg.wmode}</label></td>

+							<td>

+								<select id="flash_wmode" name="flash_wmode" onchange="generatePreview();">

+									<option value="">{#not_set}</option> 

+									<option value="window">window</option>

+									<option value="opaque">opaque</option>

+									<option value="transparent">transparent</option>

+								</select>

+							</td>

+

+							<td><label for="flash_salign">{#media_dlg.salign}</label></td>

+							<td>

+								<select id="flash_salign" name="flash_salign" onchange="generatePreview();">

+									<option value="">{#not_set}</option> 

+									<option value="l">{#media_dlg.align_left}</option>

+									<option value="t">{#media_dlg.align_top}</option>

+									<option value="r">{#media_dlg.align_right}</option>

+									<option value="b">{#media_dlg.align_bottom}</option>

+									<option value="tl">{#media_dlg.align_top_left}</option>

+									<option value="tr">{#media_dlg.align_top_right}</option>

+									<option value="bl">{#media_dlg.align_bottom_left}</option>

+									<option value="br">{#media_dlg.align_bottom_right}</option>

+								</select>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flash_play" name="flash_play" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="flash_play">{#media_dlg.play}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flash_loop" name="flash_loop" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="flash_loop">{#media_dlg.loop}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flash_menu" name="flash_menu" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="flash_menu">{#media_dlg.menu}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flash_swliveconnect" name="flash_swliveconnect" onchange="generatePreview();" /></td>

+										<td><label for="flash_swliveconnect">{#media_dlg.liveconnect}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+					</table>

+

+					<table>

+						<tr>

+							<td><label for="flash_base">{#media_dlg.base}</label></td>

+							<td><input type="text" id="flash_base" name="flash_base" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="flash_flashvars">{#media_dlg.flashvars}</label></td>

+							<td><input type="text" id="flash_flashvars" name="flash_flashvars" onchange="generatePreview();" /></td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset id="flv_options">

+					<legend>{#media_dlg.flv_options}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td><label for="flv_scalemode">{#media_dlg.flv_scalemode}</label></td>

+							<td>

+								<select id="flv_scalemode" name="flv_scalemode" onchange="generatePreview();">

+									<option value="">{#not_set}</option> 

+									<option value="none">none</option>

+									<option value="double">double</option>

+									<option value="full">full</option>

+								</select>

+							</td>

+

+							<td><label for="flv_buffer">{#media_dlg.flv_buffer}</label></td>

+							<td><input type="text" id="flv_buffer" name="flv_buffer" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="flv_startimage">{#media_dlg.flv_startimage}</label></td>

+							<td><input type="text" id="flv_startimage" name="flv_startimage" onchange="generatePreview();" /></td>

+

+							<td><label for="flv_starttime">{#media_dlg.flv_starttime}</label></td>

+							<td><input type="text" id="flv_starttime" name="flv_starttime" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="flv_defaultvolume">{#media_dlg.flv_defaultvolume}</label></td>

+							<td><input type="text" id="flv_defaultvolume" name="flv_defaultvolume" onchange="generatePreview();" /></td>

+

+

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flv_hiddengui" name="flv_hiddengui" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="flv_hiddengui">{#media_dlg.flv_hiddengui}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flv_autostart" name="flv_autostart" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="flv_autostart">{#media_dlg.flv_autostart}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flv_loop" name="flv_loop" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="flv_loop">{#media_dlg.flv_loop}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flv_showscalemodes" name="flv_showscalemodes" onchange="generatePreview();" /></td>

+										<td><label for="flv_showscalemodes">{#media_dlg.flv_showscalemodes}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flv_smoothvideo" name="flash_flv_flv_smoothvideosmoothvideo" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="flv_smoothvideo">{#media_dlg.flv_smoothvideo}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="flv_jscallback" name="flv_jscallback" onchange="generatePreview();" /></td>

+										<td><label for="flv_jscallback">{#media_dlg.flv_jscallback}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset id="qt_options">

+					<legend>{#media_dlg.qt_options}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_loop" name="qt_loop" onchange="generatePreview();" /></td>

+										<td><label for="qt_loop">{#media_dlg.loop}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_autoplay" name="qt_autoplay" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="qt_autoplay">{#media_dlg.play}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_cache" name="qt_cache" onchange="generatePreview();" /></td>

+										<td><label for="qt_cache">{#media_dlg.cache}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_controller" name="qt_controller" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="qt_controller">{#media_dlg.controller}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_correction" name="qt_correction" onchange="generatePreview();" /></td>

+										<td><label for="qt_correction">{#media_dlg.correction}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_enablejavascript" name="qt_enablejavascript" onchange="generatePreview();" /></td>

+										<td><label for="qt_enablejavascript">{#media_dlg.enablejavascript}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_kioskmode" name="qt_kioskmode" onchange="generatePreview();" /></td>

+										<td><label for="qt_kioskmode">{#media_dlg.kioskmode}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_autohref" name="qt_autohref" onchange="generatePreview();" /></td>

+										<td><label for="qt_autohref">{#media_dlg.autohref}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_playeveryframe" name="qt_playeveryframe" onchange="generatePreview();" /></td>

+										<td><label for="qt_playeveryframe">{#media_dlg.playeveryframe}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="qt_targetcache" name="qt_targetcache" onchange="generatePreview();" /></td>

+										<td><label for="qt_targetcache">{#media_dlg.targetcache}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td><label for="qt_scale">{#media_dlg.scale}</label></td>

+							<td><select id="qt_scale" name="qt_scale" class="mceEditableSelect" onchange="generatePreview();">

+									<option value="">{#not_set}</option> 

+									<option value="tofit">tofit</option>

+									<option value="aspect">aspect</option>

+								</select>

+							</td>

+

+							<td colspan="2">&nbsp;</td>

+						</tr>

+

+						<tr>

+							<td><label for="qt_starttime">{#media_dlg.starttime}</label></td>

+							<td><input type="text" id="qt_starttime" name="qt_starttime" onchange="generatePreview();" /></td>

+

+							<td><label for="qt_endtime">{#media_dlg.endtime}</label></td>

+							<td><input type="text" id="qt_endtime" name="qt_endtime" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="qt_target">{#media_dlg.target}</label></td>

+							<td><input type="text" id="qt_target" name="qt_target" onchange="generatePreview();" /></td>

+

+							<td><label for="qt_href">{#media_dlg.href}</label></td>

+							<td><input type="text" id="qt_href" name="qt_href" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="qt_qtsrcchokespeed">{#media_dlg.qtsrcchokespeed}</label></td>

+							<td><input type="text" id="qt_qtsrcchokespeed" name="qt_qtsrcchokespeed" onchange="generatePreview();" /></td>

+

+							<td><label for="qt_volume">{#media_dlg.volume}</label></td>

+							<td><input type="text" id="qt_volume" name="qt_volume" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="qt_qtsrc">{#media_dlg.qtsrc}</label></td>

+							<td colspan="4">

+							<table border="0" cellspacing="0" cellpadding="0">

+								  <tr>

+									<td><input type="text" id="qt_qtsrc" name="qt_qtsrc" onchange="generatePreview();" /></td>

+									<td id="qtsrcfilebrowsercontainer">&nbsp;</td>

+								  </tr>

+							</table>

+							</td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset id="wmp_options">

+					<legend>{#media_dlg.wmp_options}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_autostart" name="wmp_autostart" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="wmp_autostart">{#media_dlg.autostart}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_enabled" name="wmp_enabled" onchange="generatePreview();" /></td>

+										<td><label for="wmp_enabled">{#media_dlg.enabled}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_enablecontextmenu" name="wmp_enablecontextmenu" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="wmp_enablecontextmenu">{#media_dlg.menu}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_fullscreen" name="wmp_fullscreen" onchange="generatePreview();" /></td>

+										<td><label for="wmp_fullscreen">{#media_dlg.fullscreen}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_invokeurls" name="wmp_invokeurls" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="wmp_invokeurls">{#media_dlg.invokeurls}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_mute" name="wmp_mute" onchange="generatePreview();" /></td>

+										<td><label for="wmp_mute">{#media_dlg.mute}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_stretchtofit" name="wmp_stretchtofit" onchange="generatePreview();" /></td>

+										<td><label for="wmp_stretchtofit">{#media_dlg.stretchtofit}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="wmp_windowlessvideo" name="wmp_windowlessvideo" onchange="generatePreview();" /></td>

+										<td><label for="wmp_windowlessvideo">{#media_dlg.windowlessvideo}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td><label for="wmp_balance">{#media_dlg.balance}</label></td>

+							<td><input type="text" id="wmp_balance" name="wmp_balance" onchange="generatePreview();" /></td>

+

+							<td><label for="wmp_baseurl">{#media_dlg.baseurl}</label></td>

+							<td><input type="text" id="wmp_baseurl" name="wmp_baseurl" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="wmp_captioningid">{#media_dlg.captioningid}</label></td>

+							<td><input type="text" id="wmp_captioningid" name="wmp_captioningid" onchange="generatePreview();" /></td>

+

+							<td><label for="wmp_currentmarker">{#media_dlg.currentmarker}</label></td>

+							<td><input type="text" id="wmp_currentmarker" name="wmp_currentmarker" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="wmp_currentposition">{#media_dlg.currentposition}</label></td>

+							<td><input type="text" id="wmp_currentposition" name="wmp_currentposition" onchange="generatePreview();" /></td>

+

+							<td><label for="wmp_defaultframe">{#media_dlg.defaultframe}</label></td>

+							<td><input type="text" id="wmp_defaultframe" name="wmp_defaultframe" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="wmp_playcount">{#media_dlg.playcount}</label></td>

+							<td><input type="text" id="wmp_playcount" name="wmp_playcount" onchange="generatePreview();" /></td>

+

+							<td><label for="wmp_rate">{#media_dlg.rate}</label></td>

+							<td><input type="text" id="wmp_rate" name="wmp_rate" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="wmp_uimode">{#media_dlg.uimode}</label></td>

+							<td><input type="text" id="wmp_uimode" name="wmp_uimode" onchange="generatePreview();" /></td>

+

+							<td><label for="wmp_volume">{#media_dlg.volume}</label></td>

+							<td><input type="text" id="wmp_volume" name="wmp_volume" onchange="generatePreview();" /></td>

+						</tr>

+

+					</table>

+				</fieldset>

+

+				<fieldset id="rmp_options">

+					<legend>{#media_dlg.rmp_options}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_autostart" name="rmp_autostart" onchange="generatePreview();" /></td>

+										<td><label for="rmp_autostart">{#media_dlg.autostart}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_loop" name="rmp_loop" onchange="generatePreview();" /></td>

+										<td><label for="rmp_loop">{#media_dlg.loop}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_autogotourl" name="rmp_autogotourl" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="rmp_autogotourl">{#media_dlg.autogotourl}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_center" name="rmp_center" onchange="generatePreview();" /></td>

+										<td><label for="rmp_center">{#media_dlg.center}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_imagestatus" name="rmp_imagestatus" checked="checked" onchange="generatePreview();" /></td>

+										<td><label for="rmp_imagestatus">{#media_dlg.imagestatus}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_maintainaspect" name="rmp_maintainaspect" onchange="generatePreview();" /></td>

+										<td><label for="rmp_maintainaspect">{#media_dlg.maintainaspect}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_nojava" name="rmp_nojava" onchange="generatePreview();" /></td>

+										<td><label for="rmp_nojava">{#media_dlg.nojava}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_prefetch" name="rmp_prefetch" onchange="generatePreview();" /></td>

+										<td><label for="rmp_prefetch">{#media_dlg.prefetch}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="rmp_shuffle" name="rmp_shuffle" onchange="generatePreview();" /></td>

+										<td><label for="rmp_shuffle">{#media_dlg.shuffle}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								&nbsp;

+							</td>

+						</tr>

+

+						<tr>

+							<td><label for="rmp_console">{#media_dlg.console}</label></td>

+							<td><input type="text" id="rmp_console" name="rmp_console" onchange="generatePreview();" /></td>

+

+							<td><label for="rmp_controls">{#media_dlg.controls}</label></td>

+							<td><input type="text" id="rmp_controls" name="rmp_controls" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="rmp_numloop">{#media_dlg.numloop}</label></td>

+							<td><input type="text" id="rmp_numloop" name="rmp_numloop" onchange="generatePreview();" /></td>

+

+							<td><label for="rmp_scriptcallbacks">{#media_dlg.scriptcallbacks}</label></td>

+							<td><input type="text" id="rmp_scriptcallbacks" name="rmp_scriptcallbacks" onchange="generatePreview();" /></td>

+						</tr>

+					</table>

+				</fieldset>

+

+				<fieldset id="shockwave_options">

+					<legend>{#media_dlg.shockwave_options}</legend>

+

+					<table border="0" cellpadding="4" cellspacing="0">

+						<tr>

+							<td><label for="shockwave_swstretchstyle">{#media_dlg.swstretchstyle}</label></td>

+							<td>

+								<select id="shockwave_swstretchstyle" name="shockwave_swstretchstyle" onchange="generatePreview();">

+									<option value="none">{#not_set}</option>

+									<option value="meet">Meet</option>

+									<option value="fill">Fill</option>

+									<option value="stage">Stage</option>

+								</select>

+							</td>

+

+							<td><label for="shockwave_swvolume">{#media_dlg.volume}</label></td>

+							<td><input type="text" id="shockwave_swvolume" name="shockwave_swvolume" onchange="generatePreview();" /></td>

+						</tr>

+

+						<tr>

+							<td><label for="shockwave_swstretchhalign">{#media_dlg.swstretchhalign}</label></td>

+							<td>

+								<select id="shockwave_swstretchhalign" name="shockwave_swstretchhalign" onchange="generatePreview();">

+									<option value="none">{#not_set}</option>

+									<option value="left">{#media_dlg.align_left}</option>

+									<option value="center">{#media_dlg.align_center}</option>

+									<option value="right">{#media_dlg.align_right}</option>

+								</select>

+							</td>

+

+							<td><label for="shockwave_swstretchvalign">{#media_dlg.swstretchvalign}</label></td>

+							<td>

+								<select id="shockwave_swstretchvalign" name="shockwave_swstretchvalign" onchange="generatePreview();">

+									<option value="none">{#not_set}</option>

+									<option value="meet">Meet</option>

+									<option value="fill">Fill</option>

+									<option value="stage">Stage</option>

+								</select>

+							</td>

+						</tr>

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="shockwave_autostart" name="shockwave_autostart" onchange="generatePreview();" checked="checked" /></td>

+										<td><label for="shockwave_autostart">{#media_dlg.autostart}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="shockwave_sound" name="shockwave_sound" onchange="generatePreview();" checked="checked" /></td>

+										<td><label for="shockwave_sound">{#media_dlg.sound}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+

+

+						<tr>

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="shockwave_swliveconnect" name="shockwave_swliveconnect" onchange="generatePreview();" /></td>

+										<td><label for="shockwave_swliveconnect">{#media_dlg.liveconnect}</label></td>

+									</tr>

+								</table>

+							</td>

+

+							<td colspan="2">

+								<table border="0" cellpadding="0" cellspacing="0">

+									<tr>

+										<td><input type="checkbox" class="checkbox" id="shockwave_progress" name="shockwave_progress" onchange="generatePreview();" checked="checked" /></td>

+										<td><label for="shockwave_progress">{#media_dlg.progress}</label></td>

+									</tr>

+								</table>

+							</td>

+						</tr>

+					</table>

+				</fieldset>

+			</div>

+		</div>

+

+		<div class="mceActionPanel">

+			<input type="submit" id="insert" name="insert" value="{#insert}" />

+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />

+		</div>

+	</form>

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/nonbreaking/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/nonbreaking/editor_plugin.js
new file mode 100644
index 0000000..eb40a6a
--- /dev/null
+++ b/dojopuzzles/media/js/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)?'<span _mce_bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</span>':"&nbsp;")});a.addButton("nonbreaking",{title:"nonbreaking.nonbreaking_desc",cmd:"mceNonBreaking"});if(a.getParam("nonbreaking_force_tab")){a.onKeyDown.add(function(d,f){if(tinymce.isIE&&f.keyCode==9){d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");d.execCommand("mceNonBreaking");tinymce.dom.Event.cancel(f)}})}},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/dojopuzzles/media/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/nonbreaking/editor_plugin_src.js
new file mode 100644
index 0000000..ca83ee2
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/nonbreaking/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.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) ? '<span _mce_bogus="1" class="mceItemHidden mceItemNbsp">&nbsp;</span>' : '&nbsp;');

+			});

+

+			// Register buttons

+			ed.addButton('nonbreaking', {title : 'nonbreaking.nonbreaking_desc', cmd : 'mceNonBreaking'});

+

+			if (ed.getParam('nonbreaking_force_tab')) {

+				ed.onKeyDown.add(function(ed, e) {

+					if (tinymce.isIE && e.keyCode == 9) {

+						ed.execCommand('mceNonBreaking');

+						ed.execCommand('mceNonBreaking');

+						ed.execCommand('mceNonBreaking');

+						tinymce.dom.Event.cancel(e);

+					}

+				});

+			}

+		},

+

+		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/dojopuzzles/media/js/tiny_mce/plugins/noneditable/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/noneditable/editor_plugin.js
new file mode 100644
index 0000000..9945cd8
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/noneditable/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var a=tinymce.dom.Event;tinymce.create("tinymce.plugins.NonEditablePlugin",{init:function(d,e){var f=this,c,b;f.editor=d;c=d.getParam("noneditable_editable_class","mceEditable");b=d.getParam("noneditable_noneditable_class","mceNonEditable");d.onNodeChange.addToTop(function(h,g,k){var j,i;j=h.dom.getParent(h.selection.getStart(),function(l){return h.dom.hasClass(l,b)});i=h.dom.getParent(h.selection.getEnd(),function(l){return h.dom.hasClass(l,b)});if(j||i){f._setDisabled(1);return false}else{f._setDisabled(0)}})},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}},_block:function(c,d){var b=d.keyCode;if((b>32&&b<41)||(b>111&&b<124)){return}return a.cancel(d)},_setDisabled:function(d){var c=this,b=c.editor;tinymce.each(b.controlManager.controls,function(e){e.setDisabled(d)});if(d!==c.disabled){if(d){b.onKeyDown.addToTop(c._block);b.onKeyPress.addToTop(c._block);b.onKeyUp.addToTop(c._block);b.onPaste.addToTop(c._block)}else{b.onKeyDown.remove(c._block);b.onKeyPress.remove(c._block);b.onKeyUp.remove(c._block);b.onPaste.remove(c._block)}c.disabled=d}}});tinymce.PluginManager.add("noneditable",tinymce.plugins.NonEditablePlugin)})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/noneditable/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/noneditable/editor_plugin_src.js
new file mode 100644
index 0000000..656c971
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/noneditable/editor_plugin_src.js
@@ -0,0 +1,90 @@
+/**

+ * 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;

+

+	tinymce.create('tinymce.plugins.NonEditablePlugin', {

+		init : function(ed, url) {

+			var t = this, editClass, nonEditClass;

+

+			t.editor = ed;

+			editClass = ed.getParam("noneditable_editable_class", "mceEditable");

+			nonEditClass = ed.getParam("noneditable_noneditable_class", "mceNonEditable");

+

+			ed.onNodeChange.addToTop(function(ed, cm, n) {

+				var sc, ec;

+

+				// Block if start or end is inside a non editable element

+				sc = ed.dom.getParent(ed.selection.getStart(), function(n) {

+					return ed.dom.hasClass(n, nonEditClass);

+				});

+

+				ec = ed.dom.getParent(ed.selection.getEnd(), function(n) {

+					return ed.dom.hasClass(n, nonEditClass);

+				});

+

+				// Block or unblock

+				if (sc || ec) {

+					t._setDisabled(1);

+					return false;

+				} else

+					t._setDisabled(0);

+			});

+		},

+

+		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

+			};

+		},

+

+		_block : function(ed, e) {

+			var k = e.keyCode;

+

+			// Don't block arrow keys, pg up/down, and F1-F12

+			if ((k > 32 && k < 41) || (k > 111 && k < 124))

+				return;

+

+			return Event.cancel(e);

+		},

+

+		_setDisabled : function(s) {

+			var t = this, ed = t.editor;

+

+			tinymce.each(ed.controlManager.controls, function(c) {

+				c.setDisabled(s);

+			});

+

+			if (s !== t.disabled) {

+				if (s) {

+					ed.onKeyDown.addToTop(t._block);

+					ed.onKeyPress.addToTop(t._block);

+					ed.onKeyUp.addToTop(t._block);

+					ed.onPaste.addToTop(t._block);

+				} else {

+					ed.onKeyDown.remove(t._block);

+					ed.onKeyPress.remove(t._block);

+					ed.onKeyUp.remove(t._block);

+					ed.onPaste.remove(t._block);

+				}

+

+				t.disabled = s;

+			}

+		}

+	});

+

+	// Register plugin

+	tinymce.PluginManager.add('noneditable', tinymce.plugins.NonEditablePlugin);

+})();
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/css/content.css b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/css/content.css
new file mode 100644
index 0000000..c949d58
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/css/content.css
@@ -0,0 +1 @@
+.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/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/editor_plugin.js
new file mode 100644
index 0000000..a212f69
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.PageBreakPlugin",{init:function(b,d){var f='<img src="'+d+'/img/trans.gif" class="mcePageBreak mceItemNoResize" />',a="mcePageBreak",c=b.getParam("pagebreak_separator","<!-- pagebreak -->"),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.settings.content_css!==false){b.dom.loadCSS(d+"/css/content.css")}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(/<img[^>]+>/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/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/editor_plugin_src.js
new file mode 100644
index 0000000..4e1eb0a
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/editor_plugin_src.js
@@ -0,0 +1,77 @@
+/**

+ * 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 = '<img src="' + url + '/img/trans.gif" class="mcePageBreak mceItemNoResize" />', cls = 'mcePageBreak', sep = ed.getParam('pagebreak_separator', '<!-- pagebreak -->'), 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.settings.content_css !== false)

+					ed.dom.loadCSS(url + "/css/content.css");

+

+				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(/<img[^>]+>/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/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/img/pagebreak.gif b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/img/pagebreak.gif
new file mode 100644
index 0000000..acdf408
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/img/pagebreak.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/img/trans.gif b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/img/trans.gif
new file mode 100644
index 0000000..3884865
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/pagebreak/img/trans.gif
Binary files differ
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/paste/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/paste/editor_plugin.js
new file mode 100644
index 0000000..77a7489
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/paste/editor_plugin.js
@@ -0,0 +1 @@
+(function(){var c=tinymce.each,d=null,a={paste_auto_cleanup_on_paste: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_text_use_dialog:false,paste_text_sticky:false,paste_text_notifyalways:false,paste_text_linebreaktype:"p",paste_text_replacements:[[/\u2026/g,"..."],[/[\x93\x94\u201c\u201d]/g,'"'],[/[\x60\x91\x92\u2018\u2019]/g,"'"]]};function b(e,f){return e.getParam(f,a[f])}tinymce.create("tinymce.plugins.PastePlugin",{init:function(e,f){var g=this;g.editor=e;g.url=f;g.onPreProcess=new tinymce.util.Dispatcher(g);g.onPostProcess=new tinymce.util.Dispatcher(g);g.onPreProcess.add(g._preProcess);g.onPostProcess.add(g._postProcess);g.onPreProcess.add(function(j,k){e.execCallback("paste_preprocess",j,k)});g.onPostProcess.add(function(j,k){e.execCallback("paste_postprocess",j,k)});e.pasteAsPlainText=false;function i(l,j){var k=e.dom;g.onPreProcess.dispatch(g,l);l.node=k.create("div",0,l.content);g.onPostProcess.dispatch(g,l);l.content=e.serializer.serialize(l.node,{getInner:1});if((!j)&&(e.pasteAsPlainText)){g._insertPlainText(e,k,l.content);if(!b(e,"paste_text_sticky")){e.pasteAsPlainText=false;e.controlManager.setActive("pastetext",false)}}else{if(/<(p|h[1-6]|ul|ol)/.test(l.content)){g._insertBlockContent(e,k,l.content)}else{g._insert(l.content)}}}e.addCommand("mceInsertClipboardContent",function(j,k){i(k,true)});if(!b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(k,j){var l=tinymce.util.Cookie;e.pasteAsPlainText=!e.pasteAsPlainText;e.controlManager.setActive("pastetext",e.pasteAsPlainText);if((e.pasteAsPlainText)&&(!l.get("tinymcePasteText"))){if(b(e,"paste_text_sticky")){e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}else{e.windowManager.alert(e.translate("paste.plaintext_mode_sticky"))}if(!b(e,"paste_text_notifyalways")){l.set("tinymcePasteText","1",new Date(new Date().getFullYear()+1,12,31))}}})}e.addButton("pastetext",{title:"paste.paste_text_desc",cmd:"mcePasteText"});e.addButton("selectall",{title:"paste.selectall_desc",cmd:"selectall"});function h(s){var m,q,k,l=e.selection,p=e.dom,r=e.getBody(),j;if(e.pasteAsPlainText&&(s.clipboardData||p.doc.dataTransfer)){s.preventDefault();i({content:(s.clipboardData||p.doc.dataTransfer).getData("Text").replace(/\r?\n/g,"<br />")});return}if(p.get("_mcePaste")){return}m=p.add(r,"div",{id:"_mcePaste","class":"mcePaste"},'\uFEFF<br _mce_bogus="1">');if(r!=e.getDoc().body){j=p.getPos(e.selection.getStart(),r).y}else{j=r.scrollTop}p.setStyles(m,{position:"absolute",left:-10000,top:j,width:1,height:1,overflow:"hidden"});if(tinymce.isIE){k=p.doc.body.createTextRange();k.moveToElementText(m);k.execCommand("Paste");p.remove(m);if(m.innerHTML==="\uFEFF"){e.execCommand("mcePasteWord");s.preventDefault();return}i({content:m.innerHTML});return tinymce.dom.Event.cancel(s)}else{function o(n){n.preventDefault()}p.bind(e.getDoc(),"mousedown",o);p.bind(e.getDoc(),"keydown",o);q=e.selection.getRng();m=m.firstChild;k=e.getDoc().createRange();k.setStart(m,0);k.setEnd(m,1);l.setRng(k);window.setTimeout(function(){var t="",n=p.select("div.mcePaste");c(n,function(v){var u=v.firstChild;if(u&&u.nodeName=="DIV"&&u.style.marginTop&&u.style.backgroundColor){p.remove(u,1)}c(p.select("div.mcePaste",v),function(w){p.remove(w,1)});c(p.select("span.Apple-style-span",v),function(w){p.remove(w,1)});c(p.select("br[_mce_bogus]",v),function(w){p.remove(w)});t+=v.innerHTML});c(n,function(u){p.remove(u)});if(q){l.setRng(q)}i({content:t});p.unbind(e.getDoc(),"mousedown",o);p.unbind(e.getDoc(),"keydown",o)},0)}}if(b(e,"paste_auto_cleanup_on_paste")){if(tinymce.isOpera||/Firefox\/2/.test(navigator.userAgent)){e.onKeyDown.add(function(j,k){if(((tinymce.isMac?k.metaKey:k.ctrlKey)&&k.keyCode==86)||(k.shiftKey&&k.keyCode==45)){h(k)}})}else{e.onPaste.addToTop(function(j,k){return h(k)})}}if(b(e,"paste_block_drop")){e.onInit.add(function(){e.dom.bind(e.getBody(),["dragend","dragover","draggesture","dragdrop","drop","drag"],function(j){j.preventDefault();j.stopPropagation();return false})})}g._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(i,f){var l=this.editor,k=f.content,q=tinymce.grep,p=tinymce.explode,g=tinymce.trim,m,j;function e(h){c(h,function(o){if(o.constructor==RegExp){k=k.replace(o,"")}else{k=k.replace(o[0],o[1])}})}if(/class="?Mso|style="[^"]*\bmso-|w:WordDocument/i.test(k)||f.wordContent){f.wordContent=true;e([/^\s*(&nbsp;)+/gi,/(&nbsp;|<br[^>]*>)+\s*$/gi]);if(b(l,"paste_convert_headers_to_strong")){k=k.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi,"<p><strong>$1</strong></p>")}if(b(l,"paste_convert_middot_lists")){e([[/<!--\[if !supportLists\]-->/gi,"$&__MCE_ITEM__"],[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi,"$1__MCE_ITEM__"]])}e([/<!--[\s\S]+?-->/gi,/<(!|script[^>]*>.*?<\/script(?=[>\s])|\/?(\?xml(:\w+)?|img|meta|link|style|\w:\w+)(?=[\s\/>]))[^>]*>/gi,[/<(\/?)s>/gi,"<$1strike>"],[/&nbsp;/gi,"\u00a0"]]);do{m=k.length;k=k.replace(/(<[a-z][^>]*\s)(?:id|name|language|type|on\w+|\w+:\w+)=(?:"[^"]*"|\w+)\s?/gi,"$1")}while(m!=k.length);if(b(l,"paste_retain_style_properties").replace(/^none$/i,"").length==0){k=k.replace(/<\/?span[^>]*>/gi,"")}else{e([[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\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(u,h,t){var v=[],o=0,r=p(g(t).replace(/&quot;/gi,"'"),";");c(r,function(s){var w,y,z=p(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":v[o++]=w.replace(/^mso-|-alt$/g,"")+":"+x(y);return;case"horiz-align":v[o++]="text-align:"+y;return;case"vert-align":v[o++]="vertical-align:"+y;return;case"font-color":case"mso-foreground":v[o++]="color:"+y;return;case"mso-background":case"mso-highlight":v[o++]="background:"+y;return;case"mso-default-height":v[o++]="min-height:"+x(y);return;case"mso-default-width":v[o++]="min-width:"+x(y);return;case"mso-padding-between-alt":v[o++]="border-collapse:separate;border-spacing:"+x(y);return;case"text-line-through":if((y=="single")||(y=="double")){v[o++]="text-decoration:line-through"}return;case"mso-zero-height":if(y=="yes"){v[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}v[o++]=w+":"+z[1]}});if(o>0){return h+' style="'+v.join(";")+'"'}else{return h}}]])}}if(b(l,"paste_convert_headers_to_strong")){e([[/<h[1-6][^>]*>/gi,"<p><strong>"],[/<\/h[1-6][^>]*>/gi,"</strong></p>"]])}j=b(l,"paste_strip_class_attributes");if(j!=="none"){function n(r,o){if(j==="all"){return""}var h=q(p(o.replace(/^(["'])(.*)\1$/,"$2")," "),function(s){return(/^(?!mso)/i.test(s))});return h.length?' class="'+h.join(" ")+'"':""}k=k.replace(/ class="([^"]+)"/gi,n);k=k.replace(/ class=(\w+)/gi,n)}if(b(l,"paste_remove_spans")){k=k.replace(/<\/?span[^>]*>/gi,"")}f.content=k},_postProcess:function(h,j){var g=this,f=g.editor,i=f.dom,e;if(j.wordContent){c(i.select("a",j.node),function(k){if(!k.href||k.href.indexOf("#_Toc")!=-1){i.remove(k,1)}});if(b(f,"paste_convert_middot_lists")){g._convertLists(h,j)}e=b(f,"paste_retain_style_properties");if((tinymce.is(e,"string"))&&(e!=="all")&&(e!=="*")){e=tinymce.explode(e.replace(/^none$/i,""));c(i.select("*",j.node),function(n){var o={},l=0,m,p,k;if(e){for(m=0;m<e.length;m++){p=e[m];k=i.getStyle(n,p);if(k){o[p]=k;l++}}}i.setAttrib(n,"style","");if(e&&l>0){i.setStyles(n,o)}else{if(n.nodeName=="SPAN"&&!n.className){i.remove(n,true)}}})}}if(b(f,"paste_remove_styles")||(b(f,"paste_remove_styles_if_webkit")&&tinymce.isWebKit)){c(i.select("*[style]",j.node),function(k){k.removeAttribute("style");k.removeAttribute("_mce_style")})}else{if(tinymce.isWebKit){c(i.select("*",j.node),function(k){k.removeAttribute("_mce_style")})}}},_convertLists:function(h,f){var j=h.editor.dom,i,m,e=-1,g,n=[],l,k;c(j.select("p",f.node),function(u){var r,v="",t,s,o,q;for(r=u.firstChild;r&&r.nodeType==3;r=r.nextSibling){v+=r.nodeValue}v=u.innerHTML.replace(/<\/?\w+[^>]*>/gi,"").replace(/&nbsp;/g,"\u00a0");if(/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(v)){t="ul"}if(/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(v)){t="ol"}if(t){g=parseFloat(u.style.marginLeft||0);if(g>e){n.push(g)}if(!i||t!=l){i=j.create(t);j.insertAfter(i,u)}else{if(g>e){i=m.appendChild(j.create(t))}else{if(g<e){o=tinymce.inArray(n,g);q=j.getParents(i.parentNode,t);i=q[q.length-1-o]||i}}}c(j.select("span",u),function(w){var p=w.innerHTML.replace(/<\/?\w+[^>]*>/gi,"");if(t=="ul"&&/^[\u2022\u00b7\u00a7\u00d8o]/.test(p)){j.remove(w)}else{if(/^[\s\S]*\w+\.(&nbsp;|\u00a0)*\s*/.test(p)){j.remove(w)}}});s=u.innerHTML;if(t=="ul"){s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^[\u2022\u00b7\u00a7\u00d8o]\s*(&nbsp;|\u00a0)+\s*/,"")}else{s=u.innerHTML.replace(/__MCE_ITEM__/g,"").replace(/^\s*\w+\.(&nbsp;|\u00a0)+\s*/,"")}m=i.appendChild(j.create("li",0,s));j.remove(u);e=g;l=t}else{i=e=0}});k=f.node.innerHTML;if(k.indexOf("__MCE_ITEM__")!=-1){f.node.innerHTML=k.replace(/__MCE_ITEM__/g,"")}},_insertBlockContent:function(l,h,m){var f,j,g=l.selection,q,n,e,o,i,k="mce_marker";function p(t){var s;if(tinymce.isIE){s=l.getDoc().body.createTextRange();s.moveToElementText(t);s.collapse(false);s.select()}else{g.select(t,1);g.collapse(false)}}this._insert('<span id="'+k+'"></span>',1);j=h.get(k);f=h.getParent(j,"p,h1,h2,h3,h4,h5,h6,ul,ol,th,td");if(f&&!/TD|TH/.test(f.nodeName)){j=h.split(f,j);c(h.create("div",0,m).childNodes,function(r){q=j.parentNode.insertBefore(r.cloneNode(true),j)});p(q)}else{h.setOuterHTML(j,m);g.select(l.getBody(),1);g.collapse(0)}while(n=h.get(k)){h.remove(n)}n=g.getStart();e=h.getViewPort(l.getWin());o=l.dom.getPos(n).y;i=n.clientHeight;if(o<e.y||o+i>e.y+e.h){l.getDoc().body.scrollTop=o<e.y?o:o-e.h+25}},_insert:function(g,e){var f=this.editor,i=f.selection.getRng();if(!f.selection.isCollapsed()&&i.startContainer!=i.endContainer){f.getDoc().execCommand("Delete",false,null)}f.execCommand(tinymce.isGecko?"insertHTML":"mceInsertContent",false,g,{skip_undo:e})},_insertPlainText:function(j,x,v){var t,u,l,k,r,e,p,f,n=j.getWin(),z=j.getDoc(),s=j.selection,m=tinymce.is,y=tinymce.inArray,g=b(j,"paste_text_linebreaktype"),o=b(j,"paste_text_replacements");function q(h){c(h,function(i){if(i.constructor==RegExp){v=v.replace(i,"")}else{v=v.replace(i[0],i[1])}})}if((typeof(v)==="string")&&(v.length>0)){if(!d){d=("34,quot,38,amp,39,apos,60,lt,62,gt,"+j.serializer.settings.entities).split(",")}if(/<(?:p|br|h[1-6]|ul|ol|dl|table|t[rdh]|div|blockquote|fieldset|pre|address|center)[^>]*>/i.test(v)){q([/[\n\r]+/g])}else{q([/\r+/g])}q([[/<\/(?:p|h[1-6]|ul|ol|dl|table|div|blockquote|fieldset|pre|address|center)>/gi,"\n\n"],[/<br[^>]*>|<\/tr>/gi,"\n"],[/<\/t[dh]>\s*<t[dh][^>]*>/gi,"\t"],/<[a-z!\/?][^>]*>/gi,[/&nbsp;/gi," "],[/&(#\d+|[a-z0-9]{1,10});/gi,function(i,h){if(h.charAt(0)==="#"){return String.fromCharCode(h.slice(1))}else{return((i=y(d,h))>0)?String.fromCharCode(d[i-1]):" "}}],[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi,"$1"],[/\n{3,}/g,"\n\n"],/^\s+|\s+$/g]);v=x.encode(v);if(!s.isCollapsed()){z.execCommand("Delete",false,null)}if(m(o,"array")||(m(o,"array"))){q(o)}else{if(m(o,"string")){q(new RegExp(o,"gi"))}}if(g=="none"){q([[/\n+/g," "]])}else{if(g=="br"){q([[/\n/g,"<br />"]])}else{q([/^\s+|\s+$/g,[/\n\n/g,"</p><p>"],[/\n/g,"<br />"]])}}if((l=v.indexOf("</p><p>"))!=-1){k=v.lastIndexOf("</p><p>");r=s.getNode();e=[];do{if(r.nodeType==1){if(r.nodeName=="TD"||r.nodeName=="BODY"){break}e[e.length]=r}}while(r=r.parentNode);if(e.length>0){p=v.substring(0,l);f="";for(t=0,u=e.length;t<u;t++){p+="</"+e[t].nodeName.toLowerCase()+">";f+="<"+e[e.length-t-1].nodeName.toLowerCase()+">"}if(l==k){v=p+f+v.substring(l+7)}else{v=p+v.substring(l+4,k+4)+f+v.substring(k+7)}}}j.execCommand("mceInsertRawHTML",false,v+'<span id="_plain_text_marker">&nbsp;</span>');window.setTimeout(function(){var h=x.get("_plain_text_marker"),B,i,A,w;s.select(h,false);z.execCommand("Delete",false,null);h=null;B=s.getStart();i=x.getViewPort(n);A=x.getPos(B).y;w=B.clientHeight;if((A<i.y)||(A+w>i.y+i.h)){z.body.scrollTop=A<i.y?A:A-i.h+25}},0)}},_legacySupport:function(){var f=this,e=f.editor;e.addCommand("mcePasteWord",function(){e.windowManager.open({file:f.url+"/pasteword.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})});if(b(e,"paste_text_use_dialog")){e.addCommand("mcePasteText",function(){e.windowManager.open({file:f.url+"/pastetext.htm",width:parseInt(b(e,"paste_dialog_width")),height:parseInt(b(e,"paste_dialog_height")),inline:1})})}e.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/dojopuzzles/media/js/tiny_mce/plugins/paste/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/paste/editor_plugin_src.js
new file mode 100644
index 0000000..bedb3af
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/paste/editor_plugin_src.js
@@ -0,0 +1,952 @@
+/**

+ * 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,

+		entities = null,

+		defs = {

+			paste_auto_cleanup_on_paste : 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_text_use_dialog : false,

+			paste_text_sticky : false,

+			paste_text_notifyalways : false,

+			paste_text_linebreaktype : "p",

+			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);

+			});

+

+			// Initialize plain text flag

+			ed.pasteAsPlainText = false;

+

+			// 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;

+

+				// Execute pre process handlers

+				t.onPreProcess.dispatch(t, o);

+

+				// Create DOM structure

+				o.node = dom.create('div', 0, o.content);

+

+				// Execute post process handlers

+				t.onPostProcess.dispatch(t, o);

+

+				// Serialize content

+				o.content = ed.serializer.serialize(o.node, {getInner : 1});

+

+				// Plain text option active?

+				if ((!force_rich) && (ed.pasteAsPlainText)) {

+					t._insertPlainText(ed, dom, o.content);

+

+					if (!getParam(ed, "paste_text_sticky")) {

+						ed.pasteAsPlainText = false;

+						ed.controlManager.setActive("pastetext", false);

+					}

+				} else if (/<(p|h[1-6]|ul|ol)/.test(o.content)) {

+					// Handle insertion of contents containing block elements separately

+					t._insertBlockContent(ed, dom, o.content);

+				} 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_sticky'));

+						}

+

+						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, sel = ed.selection, dom = ed.dom, body = ed.getBody(), posY;

+

+				// Check if browser supports direct plaintext access

+				if (ed.pasteAsPlainText && (e.clipboardData || dom.doc.dataTransfer)) {

+					e.preventDefault();

+					process({content : (e.clipboardData || dom.doc.dataTransfer).getData('Text').replace(/\r?\n/g, '<br />')});

+					return;

+				}

+

+				if (dom.get('_mcePaste'))

+					return;

+

+				// Create container to paste into

+				n = dom.add(body, 'div', {id : '_mcePaste', 'class' : 'mcePaste'}, '\uFEFF<br _mce_bogus="1">');

+

+				// 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;

+

+				// Styles needs to be applied after the element is added to the document since WebKit will otherwise remove all styles

+				dom.setStyles(n, {

+					position : 'absolute',

+					left : -10000,

+					top : posY,

+					width : 1,

+					height : 1,

+					overflow : 'hidden'

+				});

+

+				if (tinymce.isIE) {

+					// 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') {

+						ed.execCommand('mcePasteWord');

+						e.preventDefault();

+						return;

+					}

+

+					// Process contents

+					process({content : n.innerHTML});

+

+					// 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 caret into hidden div

+					n = n.firstChild;

+					rng = ed.getDoc().createRange();

+					rng.setStart(n, 0);

+					rng.setEnd(n, 1);

+					sel.setRng(rng);

+

+					// Wait a while and grab the pasted contents

+					window.setTimeout(function() {

+						var h = '', 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);

+							}

+

+							// WebKit duplicates the divs so we need to remove them

+							each(dom.select('div.mcePaste', n), function(n) {

+								dom.remove(n, 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[_mce_bogus]', n), function(n) {

+								dom.remove(n);

+							});

+

+							h += n.innerHTML;

+						});

+

+						// Remove the nodes

+						each(nl, 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.add(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);

+					});

+				}

+			}

+

+			// Block all drag/drop events

+			if (getParam(ed, "paste_block_drop")) {

+				ed.onInit.add(function() {

+					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) {

+			//console.log('Before preprocess:' + o.content);

+

+			var ed = this.editor,

+				h = o.content,

+				grep = tinymce.grep,

+				explode = tinymce.explode,

+				trim = tinymce.trim,

+				len, stripClass;

+

+			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]);

+				});

+			}

+

+			// 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*(&nbsp;)+/gi,				// &nbsp; entities at the start of contents

+					/(&nbsp;|<br[^>]*>)+\s*$/gi		// &nbsp; entities at the end of contents

+				]);

+

+				if (getParam(ed, "paste_convert_headers_to_strong")) {

+					h = h.replace(/<p [^>]*class="?MsoHeading"?[^>]*>(.*?)<\/p>/gi, "<p><strong>$1</strong></p>");

+				}

+

+				if (getParam(ed, "paste_convert_middot_lists")) {

+					process([

+						[/<!--\[if !supportLists\]-->/gi, '$&__MCE_ITEM__'],					// Convert supportLists to a list item marker

+						[/(<span[^>]+(?:mso-list:|:\s*symbol)[^>]+>)/gi, '$1__MCE_ITEM__']		// Convert mso-list and symbol spans to item markers

+					]);

+				}

+

+				process([

+					// Word comments like conditional comments etc

+					/<!--[\s\S]+?-->/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 <s> into <strike> for line-though

+					[/<(\/?)s>/gi, "<$1strike>"],

+

+					// Replace nsbp entites to char since it's easier to handle

+					[/&nbsp;/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 <span style="mso-spacerun:yes">___</span> to string of alternating breaking/non-breaking spaces of same length

+						[/<span\s+style\s*=\s*"\s*mso-spacerun\s*:\s*yes\s*;?\s*"\s*>([\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(/&quot;/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 <strong>

+			if (getParam(ed, "paste_convert_headers_to_strong")) {

+				process([

+					[/<h[1-6][^>]*>/gi, "<p><strong>"],

+					[/<\/h[1-6][^>]*>/gi, "</strong></p>"]

+				]);

+			}

+

+			// 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 (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('_mce_style');

+				});

+			} else {

+				if (tinymce.isWebKit) {

+					// We need to compress the styles on WebKit since if you paste <img border="0" /> it will become <img border="0" style="... lots of junk ..." />

+					// 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('_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(/&nbsp;/g, '\u00a0');

+

+				// Detect unordered lists look for bullets

+				if (/^(__MCE_ITEM__)+[\u2022\u00b7\u00a7\u00d8o]\s*\u00a0*/.test(val))

+					type = 'ul';

+

+				// Detect ordered lists 1., a. or ixv.

+				if (/^__MCE_ITEM__\s*\w+\.\s*\u00a0{2,}/.test(val))

+					type = 'ol';

+

+				// Check if node value matches the list pattern: o&nbsp;&nbsp;

+				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' && /^[\u2022\u00b7\u00a7\u00d8o]/.test(html))

+							dom.remove(span);

+						else if (/^[\s\S]*\w+\.(&nbsp;|\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]\s*(&nbsp;|\u00a0)+\s*/, '');

+					else

+						html = p.innerHTML.replace(/__MCE_ITEM__/g, '').replace(/^\s*\w+\.(&nbsp;|\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, '');

+		},

+

+		/**

+		 * This method will split the current block parent and insert the contents inside the split position.

+		 * This logic can be improved so text nodes at the start/end remain in the start/end block elements

+		 */

+		_insertBlockContent : function(ed, dom, content) {

+			var parentBlock, marker, sel = ed.selection, last, elm, vp, y, elmHeight, markerId = 'mce_marker';

+

+			function select(n) {

+				var r;

+

+				if (tinymce.isIE) {

+					r = ed.getDoc().body.createTextRange();

+					r.moveToElementText(n);

+					r.collapse(false);

+					r.select();

+				} else {

+					sel.select(n, 1);

+					sel.collapse(false);

+				}

+			}

+

+			// Insert a marker for the caret position

+			this._insert('<span id="' + markerId + '"></span>', 1);

+			marker = dom.get(markerId);

+			parentBlock = dom.getParent(marker, 'p,h1,h2,h3,h4,h5,h6,ul,ol,th,td');

+

+			// If it's a parent block but not a table cell

+			if (parentBlock && !/TD|TH/.test(parentBlock.nodeName)) {

+				// Split parent block

+				marker = dom.split(parentBlock, marker);

+

+				// Insert nodes before the marker

+				each(dom.create('div', 0, content).childNodes, function(n) {

+					last = marker.parentNode.insertBefore(n.cloneNode(true), marker);

+				});

+

+				// Move caret after marker

+				select(last);

+			} else {

+				dom.setOuterHTML(marker, content);

+				sel.select(ed.getBody(), 1);

+				sel.collapse(0);

+			}

+

+			// Remove marker if it's left

+			while (elm = dom.get(markerId))

+				dom.remove(elm);

+

+			// Get element, position and height

+			elm = sel.getStart();

+			vp = dom.getViewPort(ed.getWin());

+			y = ed.dom.getPos(elm).y;

+			elmHeight = elm.clientHeight;

+

+			// Is element within viewport if not then scroll it into view

+			if (y < vp.y || y + elmHeight > vp.y + vp.h)

+				ed.getDoc().body.scrollTop = y < vp.y ? y : y - vp.h + 25;

+		},

+

+		/**

+		 * 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);

+

+			// It's better to use the insertHTML method on Gecko since it will combine paragraphs correctly before inserting the contents

+			ed.execCommand(tinymce.isGecko ? 'insertHTML' : '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(ed, dom, h) {

+			var i, len, pos, rpos, node, breakElms, before, after,

+				w = ed.getWin(),

+				d = ed.getDoc(),

+				sel = ed.selection,

+				is = tinymce.is,

+				inArray = tinymce.inArray,

+				linebr = getParam(ed, "paste_text_linebreaktype"),

+				rl = getParam(ed, "paste_text_replacements");

+

+			function process(items) {

+				each(items, function(v) {

+					if (v.constructor == RegExp)

+						h = h.replace(v, "");

+					else

+						h = h.replace(v[0], v[1]);

+				});

+			};

+

+			if ((typeof(h) === "string") && (h.length > 0)) {

+				if (!entities)

+					entities = ("34,quot,38,amp,39,apos,60,lt,62,gt," + ed.serializer.settings.entities).split(",");

+

+				// 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(h)) {

+					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

+					[/<br[^>]*>|<\/tr>/gi, "\n"],				// Single linebreak for <br /> tags and table rows

+					[/<\/t[dh]>\s*<t[dh][^>]*>/gi, "\t"],		// Table cells get tabs betweem them

+					/<[a-z!\/?][^>]*>/gi,						// Delete all remaining tags

+					[/&nbsp;/gi, " "],							// Convert non-break spaces to regular spaces (remember, *plain text*)

+					[

+						// HTML entity

+						/&(#\d+|[a-z0-9]{1,10});/gi,

+

+						// Replace with actual character

+						function(e, s) {

+							if (s.charAt(0) === "#") {

+								return String.fromCharCode(s.slice(1));

+							}

+							else {

+								return ((e = inArray(entities, s)) > 0)? String.fromCharCode(entities[e-1]) : " ";

+							}

+						}

+					],

+					[/(?:(?!\n)\s)*(\n+)(?:(?!\n)\s)*/gi, "$1"],	// Cool little RegExp deletes whitespace around linebreak chars.

+					[/\n{3,}/g, "\n\n"],							// Max. 2 consecutive linebreaks

+					/^\s+|\s+$/g									// Trim the front & back

+				]);

+

+				h = dom.encode(h);

+

+				// Delete any highlighted text before pasting

+				if (!sel.isCollapsed()) {

+					d.execCommand("Delete", false, null);

+				}

+

+				// Perform default or custom replacements

+				if (is(rl, "array") || (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") {

+					process([

+						[/\n+/g, " "]

+					]);

+				}

+				else if (linebr == "br") {

+					process([

+						[/\n/g, "<br />"]

+					]);

+				}

+				else {

+					process([

+						/^\s+|\s+$/g,

+						[/\n\n/g, "</p><p>"],

+						[/\n/g, "<br />"]

+					]);

+				}

+

+				// This next piece of code handles the situation where we're pasting more than one paragraph of plain

+				// text, and we are pasting the content into the middle of a block node in the editor.  The block

+				// node gets split at the selection point into "Para A" and "Para B" (for the purposes of explaining).

+				// The first paragraph of the pasted text is appended to "Para A", and the last paragraph of the

+				// pasted text is prepended to "Para B".  Any other paragraphs of pasted text are placed between

+				// "Para A" and "Para B".  This code solves a host of problems with the original plain text plugin and

+				// now handles styles correctly.  (Pasting plain text into a styled paragraph is supposed to make the

+				// plain text take the same style as the existing paragraph.)

+				if ((pos = h.indexOf("</p><p>")) != -1) {

+					rpos = h.lastIndexOf("</p><p>");

+					node = sel.getNode(); 

+					breakElms = [];		// Get list of elements to break 

+

+					do {

+						if (node.nodeType == 1) {

+							// Don't break tables and break at body

+							if (node.nodeName == "TD" || node.nodeName == "BODY") {

+								break;

+							}

+

+							breakElms[breakElms.length] = node;

+						}

+					} while (node = node.parentNode);

+

+					// Are we in the middle of a block node?

+					if (breakElms.length > 0) {

+						before = h.substring(0, pos);

+						after = "";

+

+						for (i=0, len=breakElms.length; i<len; i++) {

+							before += "</" + breakElms[i].nodeName.toLowerCase() + ">";

+							after += "<" + breakElms[breakElms.length-i-1].nodeName.toLowerCase() + ">";

+						}

+

+						if (pos == rpos) {

+							h = before + after + h.substring(pos+7);

+						}

+						else {

+							h = before + h.substring(pos+4, rpos+4) + after + h.substring(rpos+7);

+						}

+					}

+				}

+

+				// Insert content at the caret, plus add a marker for repositioning the caret

+				ed.execCommand("mceInsertRawHTML", false, h + '<span id="_plain_text_marker">&nbsp;</span>');

+

+				// Reposition the caret to the marker, which was placed immediately after the inserted content.

+				// Needs to be done asynchronously (in window.setTimeout) or else it doesn't work in all browsers.

+				// The second part of the code scrolls the content up if the caret is positioned off-screen.

+				// This is only necessary for WebKit browsers, but it doesn't hurt to use for all.

+				window.setTimeout(function() {

+					var marker = dom.get('_plain_text_marker'),

+						elm, vp, y, elmHeight;

+

+					sel.select(marker, false);

+					d.execCommand("Delete", false, null);

+					marker = null;

+

+					// Get element, position and height

+					elm = sel.getStart();

+					vp = dom.getViewPort(w);

+					y = dom.getPos(elm).y;

+					elmHeight = elm.clientHeight;

+

+					// Is element within viewport if not then scroll it into view

+					if ((y < vp.y) || (y + elmHeight > vp.y + vp.h)) {

+						d.body.scrollTop = y < vp.y ? y : y - vp.h + 25;

+					}

+				}, 0);

+			}

+		},

+

+		/**

+		 * 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/dojopuzzles/media/js/tiny_mce/plugins/paste/js/pastetext.js b/dojopuzzles/media/js/tiny_mce/plugins/paste/js/pastetext.js
new file mode 100644
index 0000000..c524f9e
--- /dev/null
+++ b/dojopuzzles/media/js/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 += '<p>' + row + '</p>';

+				});

+			}

+		}

+

+		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/dojopuzzles/media/js/tiny_mce/plugins/paste/js/pasteword.js b/dojopuzzles/media/js/tiny_mce/plugins/paste/js/pasteword.js
new file mode 100644
index 0000000..a52731c
--- /dev/null
+++ b/dojopuzzles/media/js/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 = '<iframe id="iframe" src="javascript:\'\';" frameBorder="0" style="border: 1px solid gray"></iframe>';

+		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 += '<link href="' + ed.documentBaseURI.toAbsolute('' + u) + '" rel="stylesheet" type="text/css" />';

+		});

+

+		// Write content into iframe

+		doc.open();

+		doc.write('<html><head>' + cssHTML + '</head><body class="mceContentBody" spellcheck="false"></body></html>');

+		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/dojopuzzles/media/js/tiny_mce/plugins/paste/langs/en_dlg.js b/dojopuzzles/media/js/tiny_mce/plugins/paste/langs/en_dlg.js
new file mode 100644
index 0000000..eeac778
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/paste/langs/en_dlg.js
@@ -0,0 +1,5 @@
+tinyMCE.addI18n('en.paste_dlg',{

+text_title:"Use CTRL+V on your keyboard to paste the text into the window.",

+text_linebreaks:"Keep linebreaks",

+word_title:"Use CTRL+V on your keyboard to paste the text into the window."

+});
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/paste/pastetext.htm b/dojopuzzles/media/js/tiny_mce/plugins/paste/pastetext.htm
new file mode 100644
index 0000000..b655945
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/paste/pastetext.htm
@@ -0,0 +1,27 @@
+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#paste.paste_text_desc}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="js/pastetext.js"></script>

+</head>

+<body onresize="PasteTextDialog.resize();" style="display:none; overflow:hidden;">

+	<form name="source" onsubmit="return PasteTextDialog.insert();" action="#">

+		<div style="float: left" class="title">{#paste.paste_text_desc}</div>

+

+		<div style="float: right">

+			<input type="checkbox" name="linebreaks" id="linebreaks" class="wordWrapCode" checked="checked" /><label for="linebreaks">{#paste_dlg.text_linebreaks}</label>

+		</div>

+

+		<br style="clear: both" />

+

+		<div>{#paste_dlg.text_title}</div>

+

+		<textarea id="content" name="content" rows="15" cols="100" style="width: 100%; height: 100%; font-family: 'Courier New',Courier,mono; font-size: 12px;" dir="ltr" wrap="soft" class="mceFocus"></textarea>

+

+		<div class="mceActionPanel">

+			<input type="submit" name="insert" value="{#insert}" id="insert" />

+			<input type="button" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" id="cancel" />

+		</div>

+	</form>

+</body> 

+</html>
\ No newline at end of file
diff --git a/dojopuzzles/media/js/tiny_mce/plugins/paste/pasteword.htm b/dojopuzzles/media/js/tiny_mce/plugins/paste/pasteword.htm
new file mode 100644
index 0000000..0f6bb41
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/paste/pasteword.htm
@@ -0,0 +1,21 @@
+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+	<title>{#paste.paste_word_desc}</title>

+	<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+	<script type="text/javascript" src="js/pasteword.js"></script>

+</head>

+<body onresize="PasteWordDialog.resize();" style="display:none; overflow:hidden;">

+	<form name="source" onsubmit="return PasteWordDialog.insert();" action="#">

+		<div class="title">{#paste.paste_word_desc}</div>

+

+		<div>{#paste_dlg.word_title}</div>

+

+		<div id="iframecontainer"></div>

+

+		<div class="mceActionPanel">

+			<input type="submit" id="insert" name="insert" value="{#insert}" />

+			<input type="button" id="cancel" name="cancel" value="{#cancel}" onclick="tinyMCEPopup.close();" />

+		</div>

+	</form>

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/preview/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/preview/editor_plugin.js
new file mode 100644
index 0000000..507909c
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/preview/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/preview/editor_plugin_src.js
new file mode 100644
index 0000000..80f00f0
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/preview/example.html b/dojopuzzles/media/js/tiny_mce/plugins/preview/example.html
new file mode 100644
index 0000000..b2c3d90
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/preview/example.html
@@ -0,0 +1,28 @@
+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+<script language="javascript" src="../../tiny_mce_popup.js"></script>

+<script type="text/javascript" src="jscripts/embed.js"></script>

+<script type="text/javascript">

+tinyMCEPopup.onInit.add(function(ed) {

+	var dom = tinyMCEPopup.dom;

+

+	// Load editor content_css

+	tinymce.each(ed.settings.content_css.split(','), function(u) {

+		dom.loadCSS(ed.documentBaseURI.toAbsolute(u));

+	});

+

+	// Place contents inside div container

+	dom.setHTML('content', ed.getContent());

+});

+</script>

+<title>Example of a custom preview page</title>

+</head>

+<body>

+

+Editor contents: <br />

+<div id="content">

+<!-- Gets filled with editor contents -->

+</div>

+

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/preview/jscripts/embed.js b/dojopuzzles/media/js/tiny_mce/plugins/preview/jscripts/embed.js
new file mode 100644
index 0000000..f8dc810
--- /dev/null
+++ b/dojopuzzles/media/js/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 += '<object classid="clsid:' + cls + '" codebase="' + cb + '"';

+	h += typeof(p.id) != "undefined" ? 'id="' + p.id + '"' : '';

+	h += typeof(p.name) != "undefined" ? 'name="' + p.name + '"' : '';

+	h += typeof(p.width) != "undefined" ? 'width="' + p.width + '"' : '';

+	h += typeof(p.height) != "undefined" ? 'height="' + p.height + '"' : '';

+	h += typeof(p.align) != "undefined" ? 'align="' + p.align + '"' : '';

+	h += '>';

+

+	for (n in p)

+		h += '<param name="' + n + '" value="' + p[n] + '">';

+

+	h += '<embed type="' + mt + '"';

+

+	for (n in p)

+		h += n + '="' + p[n] + '" ';

+

+	h += '></embed></object>';

+

+	document.write(h);

+}

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/preview/preview.html b/dojopuzzles/media/js/tiny_mce/plugins/preview/preview.html
new file mode 100644
index 0000000..67e7b14
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/preview/preview.html
@@ -0,0 +1,17 @@
+<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

+<html xmlns="http://www.w3.org/1999/xhtml">

+<head>

+<script type="text/javascript" src="../../tiny_mce_popup.js"></script>

+<script type="text/javascript" src="jscripts/embed.js"></script>

+<script type="text/javascript"><!--

+document.write('<base href="' + tinyMCEPopup.getWindowArg("base") + '">');

+// -->

+</script>

+<title>{#preview.preview_desc}</title>

+</head>

+<body id="content">

+<script type="text/javascript">

+	document.write(tinyMCEPopup.editor.getContent());

+</script>

+</body>

+</html>

diff --git a/dojopuzzles/media/js/tiny_mce/plugins/print/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/print/editor_plugin.js
new file mode 100644
index 0000000..b5b3a55
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/print/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/print/editor_plugin_src.js
new file mode 100644
index 0000000..3933fe6
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/save/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/save/editor_plugin.js
new file mode 100644
index 0000000..8e93996
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/save/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/save/editor_plugin_src.js
new file mode 100644
index 0000000..f5a3de8
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/css/searchreplace.css b/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/css/searchreplace.css
new file mode 100644
index 0000000..ecdf58c
--- /dev/null
+++ b/dojopuzzles/media/js/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/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/editor_plugin.js b/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/editor_plugin.js
new file mode 100644
index 0000000..cd9c985
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/editor_plugin.js
@@ -0,0 +1 @@
+(function(){tinymce.create("tinymce.plugins.SearchReplacePlugin",{init:function(a,c){function b(d){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/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js b/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/editor_plugin_src.js
new file mode 100644
index 0000000..1433a06
--- /dev/null
+++ b/dojopuzzles/media/js/tiny_mce/plugins/searchreplace/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.SearchReplacePlugin', {

+		init : function(ed, url) {

+			function open(m) {

+				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');

+		},

+