# โดโจทูลคิต
โดโจทูลคิต (เขียนตามสไตล์เป็น dōjō toolkit) เป็น โอเพนซอร์ส DHTML ทูลคิท ที่เขียนด้วยจาวาสคริปต์ ช่วยในการพัฒนาเอแจ็กซ์ในเว็บแอปพลิเคชัน ริเริ่มโดย อเล็กซ์ รัสเสล (Alex Russell) ใน พ.ศ. 2547 ภายใต้การดูแลของมูลนิธิโดโจ (Dojo Foundation) มีสัญญาอนุญาต 2 แบบให้เลือกใช้ ได้แก่ สัญญาอนุญาต BSD และ สัญญาอนุญาต Academic Free มูลนิธิโดโจเป็นองค์กรไม่แสวงหาผลประโยชน์มีวัตถุประสงค์เพื่อส่งเสริมการนำทูลคิทนี้ไปใช้งาน

 ความสามารถ 
 เครื่องมือในหน้าเว็บเพจ (Widgets) 
Dojo widgets เป็นเครื่องมือต่าง ๆ ในหน้าเว็บเพจ เขียนเป็นโค้ดสำเร็จรูปโดยใช้ JavaScript, HTML และ CSS
สนับสนุนการทำงานบนหลายเบราว์เซอร์ที่แพร่หลายในปัจจุบัน ช่วยให้เว็บเพจตอบโต้กับผู้ใช้ได้น่าสนใจ และพัฒนาง่ายขึ้น
ตัวอย่างของเครื่องมือใน Dojo widgets เช่น
 Menu, Tab และ Tooltips
 ตารางปรับการเรียงลำดับใหม่ได้, แผนภาพแบบไดนามิก และ ตัวช่วยในการสร้างภาพเวกเตอร์
 การทำ Effects ต่าง ๆ เช่น fades, wipes และ slides, และตัวช่วยในการสร้าง effects แบบต่าง ๆ
 Tree ที่สนับสนุนการ drag-n-drop
 แบบฟอร์ม และ ฟังก์ชันในการตรวจสอบความถูกต้องของแบบฟอร์ม
 Date selector, Time selector ในรูปของปฏิทิน และ นาฬิกา
 Rich Text Editor

 การสื่อสารแบบไม่ต่อเนื่อง (Asynchronous communication) 
หนึ่งในความสามารถหลักของ เอแจ็กซ์ แอปพลิเคชัน คือ การสื่อสารแบบไม่ต่อเนื่อง (Asynchronous communication) ของ เบราว์เซอร์ กับทางฝั่งเซิร์ฟเวอร์ กล่าวคือ สามารถส่งถ่ายและแสดงผลข้อมูลไปพร้อม ๆ กันโดยไม่ต้องรีโหลดทั้งหน้าใหม่หมด ปกติแล้วการทำเช่นนี้จะต้องเรียกใช้ XMLHttpRequest ใน JavaScript
ซึ่งในแต่ละเบราว์เซอร์ จะมีวิธีการเรียกใช้ที่แตกต่างกันอยู่เล็กน้อย

Dojo นำการจัดการพื้นฐาน เรื่องเกี่ยวกับข้อผิดพลาด, ปัญหาการใช้งานเกี่ยวกับปุ่ม "ย้อนกลับ", ปัญหาในการคั่นหน้า (Bookmark) และความแตกต่างระหว่างเบราว์เซอร์ของการเรียกใช้ XMLHttpRequest รวมให้เรียกผ่าน dojo.io.bind เหมือนกันทั้งหมดแทน ซึ่งสามารถปรับให้ใช้วิธีอื่นนอกจาก XMLHttpRequest ได้ด้วย (เช่น การเรียกผ่าน IFrames ที่ซ่อนไว้แทน)

 ระบบจัดการแพ็จเกจ 
Dojo มีระบบการจัดการเป็นแพ็จเกจ เพื่อให้สามารถแยกพัฒนาเป็นส่วน ๆ ได้ โดยสคริปต์ส่วนหลักทำหน้าที่จัดสภาพแวดล้อมเพื่อเตรียมโหลดแพ็จเกจที่จะใช้
โดยสร้างเนมสเปซต่าง ๆ เช่น "io", "event", "lfx", และอื่น ๆ ไว้ใต้เนมสเปซ "dojo"

หลังจากนั้นเมื่อต้องการใช้แพ็จเกจใด ค่อยโหลดแพ็จเกจนั้นๆในระหว่างการทำงานขึ้นมา (เช่น ผ่าน XMLHttpRequest) โดยระบบจัดการแพ็จเกจสามารถโหลดแพ็จเกจอื่น ๆ นอกจาก เนมสเปซ "dojo" ได้ ทำให้สามารถเพิ่มเอกซ์เทนชัน (Extension) หรือ ไลบรารี (Library) อื่น ๆ ของเราเองได้ด้วย

แพ็จเกจหนึ่ง ๆ อาจประกอบด้วยไฟล์เดียว หรือหลาย ๆ ไฟล์รวมกัน แต่ละไฟล์หรือแพ็จเกจ สามารถบอกความต้องการว่าต้องใช้ไฟล์หรือแพ็จเกจใดบ้างในการทำงาน เมื่อทำการโหลด ของที่ต้องการทั้งหมดจะถูกโหลดตามไปโดยอัตโนมัติ

แต่เว็บเบราว์เซอร์มักไม่เก็บข้อมูลจาก XMLHttpRequest ไว้ในแคช ต่างจากไฟล์ JavaScript ธรรมดาที่มักจะถูกเก็บไว้เสมอ ทำให้การอ้างแพ็จเกจต่าง ๆ ต้องทำการโหลดจากเซิร์ฟเวอร์ใหม่ทุกครั้ง
เพื่อลดปัญหาดังกล่าวจึงมีการสร้างโค้ดแบบเป็น โพรไฟล์ (Profiles) ขึ้น โดยสามารถเขียนโพรไฟล์ระบุรายการแพ็จเกจที่จำเป็น จากนั้นใช้ Apache Ant ช่วย เพื่อรวมแพ็จเกจเหล่านี้เป็นไฟล์ JavaScript ที่บีบอัดแล้วไฟล์เดียว

สำหรับโพรไฟล์การใช้งานทั่ว ๆ ไปสามารถหาดาวน์โหลด ได้ในที่เดียวกันกับที่ให้ดาวน์โหลด Dojo ฉบับเต็ม

 การเก็บข้อมูลในฝั่งผู้ใช้ 
นอกจากสนับสนุนการทำงานกับระบบคุกกี้แล้ว Dojo ยังมีระบบการเก็บข้อมูลในเครื่องผู้ใช้อย่างอื่นที่ เรียกว่า Dojo Storage ด้วย
โดย Dojo Storage สามารถทำงานกับหลายเว็บเบราว์เซอร์ที่ได้รับความนิยมในปัจจุบัน เช่น อินเทอร์เน็ตเอกซ์พลอเรอร์, ไฟร์ฟอกซ์ และ ซาฟารี

ในการทำงาน Dojo จะเลือกวิธีการเก็บข้อมูลที่เหมาะสมที่สุดในแต่ละเบราว์เซอร์เอง เช่น ในไฟร์ฟอกซ์ 2 จะใช้ระบบการเก็บข้อมูลของเบราว์เซอร์เอง (Native browser persistence), ในเบราว์เซอร์อื่น ๆ จะใช้ Flash applet โดย Flash 6+ นั้นถูกติดตั้งมากกว่า 95% ของเครื่องคอมพิวเตอร์ที่ใช้อินเทอร์เน็ตได้ ทำให้ระบบการเก็บข้อมูลนี้สามารถใช้งานได้กับเว็บแอปพลิเคชันที่อยู่ทางฝั่งเซอฟ์เวอร์ส่วนใหญ่ สำหรับเว็บแอปพลิเคชัน ที่อยู่ภายในเครื่องของผู้ใช้เอง (อย่างเช่นในซีดีสื่อการสอน หรือ URL ที่ขึ้นด้นด้วย file://)
สำหรับ ไฟร์ฟอกซ์ Dojo Storage จะใช้ XPCOM แทน และจะใช้ ActiveX แทนสำหรับ อินเทอร์เน็ตเอกซ์พลอเรอร์

นักพัฒนาสามารถใช้งาน Dojo Storage ในลักษณะเดียวกับการใช้ตารางแฮช (hash table) ผ่านการเรียก put และ get