# Dojo toolkit

Dojo es un framework que contiene API y widgets (controles) para facilitar el desarrollo de aplicaciones Web que utilicen tecnología AJAX. Contiene un sistema de empaquetado inteligente, los efectos de UI, drag and drop API, widget API, abstracción de eventos, almacenamiento de API en el cliente, e interacción de API con AJAX.
Resuelve asuntos de usabilidad comunes como pueden ser la navegación y detección del navegador, soportar cambios de URL en la barra de URLs para luego regresar a ellas (bookmarking), y la habilidad de degradar cuando AJAX/JavaScript no es completamente soportado en el cliente. Es conocido como "la navaja suiza del ejército de las bibliotecas Javascript". Proporciona una gama más amplia de opciones en una sola biblioteca JavaScript y es compatible con navegadores antiguos.

## Origen y desarrollo

Dojo Toolkit tiene su origen en 2004 con Alex Russell, quien inició un proyecto para mejorar el desarrollo de DHTML. Para ello contactó con otros programadores, de los cuales destacan David Schontzler y Dylan Schiemann. Ellos, junto con Russell, son considerados los fundadores de este framework. Sin embargo, no fueron los únicos: una amplia comunidad de desarrolladores quisieron contribuir en el proyecto, que concluyó en la formación de Dojo Foundation.
A día de hoy se han realizado ocho grandes actualizaciones en las que han participado sesenta desarrolladores con más de un millón de descargas.
Es de destacar que esta biblioteca es de código abierto y se puede descargar de forma gratuita en su página oficial. La licencia nos permite crear aplicaciones, utilizarlo en productos comerciales y modificarlo. Cuenta con el patrocinio de IBM, Google, AOL y Nexaweb.
Estas son algunas razones por las que esta caja de herramientas está cubierta por una gran comunidad, con multitud de desarrolladores e información que la hacen muy accesible y transparente de cara a nuevos usuarios. De hecho, cualquier usuario puede navegar por el chat IRC y conversar con contribuidores del proyecto e incluso participar en reuniones oficiales para discutir temas estratégicos.

## Características
### Complementos

Los complementos de Dojo son componentes preempaquetados de código JavaScript, HTML y CSS que pueden ser usados para enriquecer aplicaciones web.
* Menús, pestañas y tooltips.
* Tablas ordenables, gráficos dinámicos y dibujado de vectores 2D.
* Efectos de animación y la posibilidad de crear animaciones personalizables.
* Soporte para arrastrar y soltar.
* Formularios y rutinas de validación para los parámetros.
* Calendario, selector de tiempo y reloj.
* Editor en línea de texto enriquecido.
* Núcleo de componentes (dijit) accesible desde versiones anteriores y lector de pantalla.

### Comunicación asíncrona

Una característica importante de las aplicaciones AJAX es la comunicación asíncrona entre el navegador y el servidor. Tradicionalmente, se realizaba con el comando JavaScript XMLHttpRequest. Dojo provee de una capa de abstracción (dojo.io.bind) para varios navegadores web con la que se pueden usar otros transportes (como IFrames ocultos) y diferentes formatos de datos. De esta forma podemos obtener los campos que se van a enviar como parámetros del formulario de una manera sencilla.

### Sistema de paquetes

Dojo provee de un sistema de paquetes para facilitar el desarrollo modular. El script de inicio inicializa una serie de jerarquías de paquetes de espacios de nombre (io, event, etc.) bajo el paquete raíz dojo. Después de la inicialización del paquete dojo, cualquier otro paquete puede ser cargado (vía XMLHttpRequest o cualquier otro transporte similar) usando las utilidades ofrecidas en el arranque. También es posible inicializar paquetes adicionales dentro o al mismo nivel que el paquete dojo, permitiendo extensiones o bibliotecas de terceros.
Los paquetes de Dojo pueden contener múltiples archivos. Cualquier paquete o archivo puede depender de otro. En este caso, cuando el paquete es cargado, cualquier dependencia será también cargada.
Dojo también brinda una manera de crear perfiles; el sistema ofrece una lista de paquetes y usa Apache Ant para crear un archivo JavaScript comprimido que contiene dichos paquetes y dependencias. De esta manera se tiene todo el código necesario para ser cargado y es inicializado de una sola vez, permitiendo así el cacheado (la mayoría de los navegadores web no permiten el cacheado de archivos vía XMLHttpRequest).

### Almacenamiento de datos en el cliente

Adicionalmente, ofrece funciones para leer y escribir cookies, proporcionando en el lado cliente una abstracción llamada Dojo Storage. Dojo Storage permite a la aplicación web almacenar datos en el lado cliente, persistencia y seguridad. Cuando se incluye en una página web, determina cual es el mejor método para almacenar la información. Cuando la aplicación web ha sido cargada desde el sistema de archivos (por ejemplo desde file://URL), Dojo Storage usa de manera transparente XPCOM en Firefox y ActiveX en Internet Explorer para mantener la persistencia de la información. El desarrollador que use Dojo Storage no se tiene que preocupar de esto, ya que Dojo tiene una capa de abstracción con métodos put y get.

### Almacenamiento en el servidor

Desde enero de 2007, Dojo incluye las siguientes implementaciones de almacenamiento de datos en el paquete dojo.data:
* CsvStore: almacenamiento de solo lectura y acceso CSV.
* OpmlStore: almacenamiento de solo lectura y lectura jerárquica desde archivos en formato OPML.
* YahooStore: almacenamiento de solo lectura que obtiene los resultado del servicio web del buscador de Yahoo Search!.
* DeliciousStore: almacenamiento de solo lectura que obtiene los marcadores del servicio web que ofrece Del.icio.us.
* RdfStore: almacenamiento de solo lectura que usa SPARQL para comunicarse con el servidor de datos RDF.

### Soporte para Adobe Integrated Runtime (AIR)

Dojo permite usar aplicaciones Adobe AIR basadas en JavaScript. Ha sido modificada para satisfacer los requisitos de seguridad de Adobe.
La consultora Sitepen ha desarrollado una aplicación Adobe AIR llamada Dojo Toolbox usando Dojo, en la que se incluye un API y un sistema de construcción gráfico. Generalmente, el sistema de construcción se ejecuta dentro de Rhino, pero esta aplicación AIR puede ejecutarse desde el mismo AIR, sin el uso de Java.

## Arquitectura

Como caja de herramientas, la arquitectura de Dojo Toolkit consta de una serie de componentes principales.

### Dojo Base

Dojo Base es el kernel de Dojo: una biblioteca compacta y optimizada que, entre otras muchas cosas, ofrece utilidades AJAX y un sistema de paquetes y herramientas para crear y manipular jerarquías de herencia. La Base se recoge en un único archivo llamado dojo.js. Todas las funcionalidades de Base son accesibles a través de funciones o atributos dojo.*.
También se pueden añadir nuevos paquetes, que pueden estar dentro o al mismo nivel que el paquete base dojo.

### Dojo Core

Dojo Core se construye sobre Dojo Base y ofrece soluciones más avanzadas como son los efectos de animación, funcionalidades "drag and drop" o el manejo de cookies. Cualquier recurso externo a dojo.js que se tiene que importar de manera explícita es parte de Core. El sistema de paquetes de Dojo utiliza mecanismos simples como los #include de C o import de Java para acceder a sus servicios.

### Dijit

Dijit (Dojo Widget) es una biblioteca de widgets para crear interfaces gráficos. Está construida directamente sobre Dojo Core y en ocasiones no requiere de código JavaScript para ser utilizada. Los widgets son altamente portables y se pueden compartir fácilmente en cualquier servidor o incluso funcionar localmente sin servidor web mediante el protocolo file//.

### DojoX

DojoX (Dojo Extensions) es una colección independiente de subproyectos en estado de incubación que no encajan a la perfección en Dojo Core o Dijit. Cada subproyecto suele incluir un archivo readme con información sobre su estado. Se trata de la parte del proyecto abierta a nuevas ideas. Su independencia permite que las altas expectativas y la estabilidad del resto de componentes de Dojo Toolkit no se vean comprometidas.

### Util

Util es una colección de utilidades que incluye una unidad de prueba y herramientas para crear versiones personalizadas de Dojo. Estas herramientas pueden disminuir el tamaño del código e incluir capas con distintos archivos JavaScript. Esta disminución se consigue a través de ShrinkSafe, un eficiente motor de compresión independiente de Dojo.

## Desarrollo con Dojo

El desarrollo con Dojo puede hacerse bien con los IDE Aptana o Komodo. Existe una versión para la comunidad de Aptana y una versión de 21 día de prueba de Komodo. Los plugins de Dojo están disponibles para ambos (actualmente Dojo 0.4.3 y 0.9.0). Para el desarrollo WYSIWYG usando Dojo, se puede utilizar la aplicación de código abierto WaveMaker Visual Ajax Studio.

## Fundación Dojo y patrocinio

IBM y Sun Microsystems han anunciado soporte oficial para Dojo, incluyendo contribución de código.
Zend Technologies, la compañía detrás del núcleo de PHP, anunció una asociación con Dojo para incorporarlo en el framework Zend.
La fundación Dojo es una asociación sin ánimo de lucro fundada para ayudar a proyectos de código abierto. Su principal objetivo es la ayuda para las compañías en su adopción y animar el uso de los proyectos con los que colabora.
Sus patrocinadores son:
* IBM
* Sun Microsystems
* JotSpot
* SitePen
* Renkoo
* AOL
* TurboAjax
* OpenLaszlo
* Nexaweb
* Bea Systems
La fundación Dojo también colabora en los siguientes proyectos:
* Persevere
* OpenRecord
* Cometd
* DWR
* Psych Desktop (renombrado como Lucid Desktop)