diff --git a/addons/rainbow_link/conf/info.xml b/addons/rainbow_link/conf/info.xml
new file mode 100644
index 000000000..2134040d3
--- /dev/null
+++ b/addons/rainbow_link/conf/info.xml
@@ -0,0 +1,34 @@
+
+
+ 레인보우 링크 애드온
+ Rainbow 链接
+ Addon for rainbow links
+ Adición Enlace Arco Iris
+ レインボーリンク
+
+ dynamicdrive.com
+ dynamicdrive.com
+ dynamicdrive.com
+ dynamicdrive.com
+ dynamicdrive.com
+
+ rainbow.js를 header에 추가하여 링크가 걸린 글의 색을 무지개색으로 나타냅니다.
+ 이 애드온의 rainbow.js는 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>에 저작권이 있습니다.
+
+
+ 把rainbow.js添加到header区使链接显示为彩虹色。
+ 此插件的rainbow.js文件版权属于 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>
+
+
+ This addon adds a file named "rainbow.js" to headers, then linked text will get chameleon(rainbow) color change effect.
+ "rainbow.js" Copyrightⓒ2007 <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>.
+
+
+ incluye rainbow.js en header para mostrar enlaces en colores de arco iris.
+ <a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a> tiene derecho de autor sobre rainbow.js
+
+
+ 「rainbow.js」をヘッダーに追加し、リンクされている文字列の色を虹色で表示します。この機能拡張の「 rainbow.js」は「<a href="http://www.dynamicdrive.com" target="_blank">Dynamicdrive.com</a>」に著作権があります。
+
+
+
diff --git a/addons/rainbow_link/js/rainbow.js b/addons/rainbow_link/js/rainbow.js
new file mode 100644
index 000000000..5e8421bcb
--- /dev/null
+++ b/addons/rainbow_link/js/rainbow.js
@@ -0,0 +1,245 @@
+/************************************************************************/
+/* Rainbow Links Version 1.03 (2003.9.20) */
+/* Script updated by Dynamicdrive.com for IE6 */
+/* Copyright (C) 1999-2001 TAKANASHI Mizuki */
+/* takanasi@hamal.freemail.ne.jp */
+/*----------------------------------------------------------------------*/
+/* Read it somehow even if my English text is a little wrong! ;-) */
+/* */
+/* Usage: */
+/* Insert '' into the BODY section, */
+/* right after the BODY tag itself, before anything else. */
+/* You don't need to add "onMouseover" and "onMouseout" attributes!! */
+/* */
+/* If you'd like to add effect to other texts(not link texts), then */
+/* add 'onmouseover="doRainbow(this);"' and */
+/* 'onmouseout="stopRainbow();"' to the target tags. */
+/* */
+/* This Script works with IE4,Netscape6,Mozilla browser and above only, */
+/* but no error occurs on other browsers. */
+/************************************************************************/
+
+
+////////////////////////////////////////////////////////////////////
+// Setting
+
+var rate = 20; // Increase amount(The degree of the transmutation)
+
+
+////////////////////////////////////////////////////////////////////
+// Main routine
+
+/*
+if (document.getElementById)
+window.onerror=new Function("return true")
+*/
+
+var objActive; // The object which event occured in
+var act = 0; // Flag during the action
+var elmH = 0; // Hue
+var elmS = 128; // Saturation
+var elmV = 255; // Value
+var clrOrg; // A color before the change
+var TimerID; // Timer ID
+
+
+if(xIE4Up) {
+ xAddEventListener(document, 'mouseover', doRainbowAnchor);
+ xAddEventListener(document, 'mouseout', stopRainbowAnchor);
+} else {
+ xAddEventListener(document, 'mouseover', Mozilla_doRainbowAnchor);
+ xAddEventListener(document, 'mouseout', Mozilla_stopRainbowAnchor);
+}
+/*
+if (document.all) {
+ document.onmouseover = doRainbowAnchor;
+ document.onmouseout = stopRainbowAnchor;
+}
+else if (document.getElementById) {
+ document.captureEvents(Event.MOUSEOVER | Event.MOUSEOUT);
+ document.onmouseover = Mozilla_doRainbowAnchor;
+ document.onmouseout = Mozilla_stopRainbowAnchor;
+}
+*/
+
+
+//=============================================================================
+// doRainbow
+// This function begins to change a color.
+//=============================================================================
+function doRainbow(obj)
+{
+ if (act == 0) {
+ act = 1;
+ if (obj)
+ objActive = obj;
+ else
+ objActive = event.srcElement;
+ clrOrg = objActive.style.color;
+ TimerID = setInterval("ChangeColor()",100);
+ }
+}
+
+
+//=============================================================================
+// stopRainbow
+// This function stops to change a color.
+//=============================================================================
+function stopRainbow()
+{
+ if (act) {
+ objActive.style.color = clrOrg;
+ clearInterval(TimerID);
+ act = 0;
+ }
+}
+
+
+//=============================================================================
+// doRainbowAnchor
+// This function begins to change a color. (of a anchor, automatically)
+//=============================================================================
+function doRainbowAnchor()
+{
+ try {
+ if (act == 0) {
+ var obj = event.srcElement;
+ while (obj.tagName != 'A' && obj.tagName != 'BODY') {
+ obj = obj.parentElement;
+ if (obj.tagName == 'A' || obj.tagName == 'BODY')
+ break;
+ }
+
+ if (obj.tagName == 'A' && obj.href != '') {
+ objActive = obj;
+ act = 1;
+ clrOrg = objActive.style.color;
+ TimerID = setInterval("ChangeColor()",100);
+ }
+ }
+ } catch(e) {
+ }
+}
+
+
+//=============================================================================
+// stopRainbowAnchor
+// This function stops to change a color. (of a anchor, automatically)
+//=============================================================================
+function stopRainbowAnchor()
+{
+ if (act) {
+ if (objActive.tagName == 'A') {
+ objActive.style.color = clrOrg;
+ clearInterval(TimerID);
+ act = 0;
+ }
+ }
+}
+
+
+//=============================================================================
+// Mozilla_doRainbowAnchor(for Netscape6 and Mozilla browser)
+// This function begins to change a color. (of a anchor, automatically)
+//=============================================================================
+function Mozilla_doRainbowAnchor(evt)
+{
+ var e = new xEvent(evt);
+ if (act == 0) {
+ obj = e.target;
+ while (obj.nodeName != 'A' && obj.nodeName != 'BODY') {
+ obj = obj.parentNode;
+ if(typeof(obj)=='undefined'||!obj) return;
+ if (obj.nodeName == 'A' || obj.nodeName == 'BODY') break;
+ }
+
+ if (obj.nodeName == 'A' && obj.href != '') {
+ objActive = obj;
+ act = 1;
+ clrOrg = obj.style.color;
+ TimerID = setInterval("ChangeColor()",100);
+ }
+ }
+}
+
+
+//=============================================================================
+// Mozilla_stopRainbowAnchor(for Netscape6 and Mozilla browser)
+// This function stops to change a color. (of a anchor, automatically)
+//=============================================================================
+function Mozilla_stopRainbowAnchor(e)
+{
+ if (act) {
+ if (objActive.nodeName == 'A') {
+ objActive.style.color = clrOrg;
+ clearInterval(TimerID);
+ act = 0;
+ }
+ }
+}
+
+
+//=============================================================================
+// Change Color
+// This function changes a color actually.
+//=============================================================================
+function ChangeColor()
+{
+ objActive.style.color = makeColor();
+}
+
+
+//=============================================================================
+// makeColor
+// This function makes rainbow colors.
+//=============================================================================
+function makeColor()
+{
+ // Don't you think Color Gamut to look like Rainbow?
+
+ // HSVtoRGB
+ if (elmS == 0) {
+ elmR = elmV; elmG = elmV; elmB = elmV;
+ }
+ else {
+ t1 = elmV;
+ t2 = (255 - elmS) * elmV / 255;
+ t3 = elmH % 60;
+ t3 = (t1 - t2) * t3 / 60;
+
+ if (elmH < 60) {
+ elmR = t1; elmB = t2; elmG = t2 + t3;
+ }
+ else if (elmH < 120) {
+ elmG = t1; elmB = t2; elmR = t1 - t3;
+ }
+ else if (elmH < 180) {
+ elmG = t1; elmR = t2; elmB = t2 + t3;
+ }
+ else if (elmH < 240) {
+ elmB = t1; elmR = t2; elmG = t1 - t3;
+ }
+ else if (elmH < 300) {
+ elmB = t1; elmG = t2; elmR = t2 + t3;
+ }
+ else if (elmH < 360) {
+ elmR = t1; elmG = t2; elmB = t1 - t3;
+ }
+ else {
+ elmR = 0; elmG = 0; elmB = 0;
+ }
+ }
+
+ elmR = Math.floor(elmR).toString(16);
+ elmG = Math.floor(elmG).toString(16);
+ elmB = Math.floor(elmB).toString(16);
+ if (elmR.length == 1) elmR = "0" + elmR;
+ if (elmG.length == 1) elmG = "0" + elmG;
+ if (elmB.length == 1) elmB = "0" + elmB;
+
+ elmH = elmH + rate;
+ if (elmH >= 360)
+ elmH = 0;
+
+ return '#' + elmR + elmG + elmB;
+}
diff --git a/addons/rainbow_link/rainbow_link.addon.php b/addons/rainbow_link/rainbow_link.addon.php
new file mode 100644
index 000000000..d47082f38
--- /dev/null
+++ b/addons/rainbow_link/rainbow_link.addon.php
@@ -0,0 +1,19 @@
+