var BB = new Array("b]","i]","u]","s]","c ","c]");
var BBA = new Array(new Array("&","&amp;"),new Array("\r",""),new Array("<","&lt;"),new Array(">","&gt;"),new Array("\n","<br>\n"));
var BBC = new Array("url","img","listephotos","listemedias","media","list","table","color","left","right","center","justify");
var BBD = new Array("*","tr","th","td", "br");

function in_sub_array(value, theArray)
{
  for (var i=0; i<theArray.length; i++) if (value == theArray[i][0]) return i;
  return -1;
}

function find_in_array(value, theArray, type)
{
  if (!type) { for (var i=0; i<theArray.length; i++) if (value.indexOf(theArray[i])>-1) return i; }
  else { for (var i=0; i<theArray.length; i++) if (value.indexOf(theArray[i])>-1) return value.indexOf(theArray[i]); }
  return -1;
}
function find_in_arrayR(value, theArray, type)
{
  if (!type) { for (var i=theArray.length; (i>0)&((value!="*")&(theArray[i]!="list")); i--) if (value.indexOf(theArray[i])>-1) return i; }
  else { for (var i=theArray.length; (i>0)&((value!="*")&(theArray[i]!="list")); i--) if (value.indexOf(theArray[i])>-1) return value.indexOf(theArray[i]); }
  return -1;
}

function closeIT(value)
{
 if (value=="*") return "";
 if (value=="list") return "</ul>";
 if ((value=="color")|(value=="c")) return "</span>";
 if ((value=="left")|(value=="right")|(value=="center")|(value=="justify")) return "</div>";
 return "</"+value+">";
}
function sur_close(value, theArray)
{
 if (in_array(value, theArray)==-1) return "";
 var out="";
 while (theArray[theArray.length-1]!=value) { out+=closeIT(theArray[theArray.length-1]); theArray.pop(); }
 out+=closeIT(theArray[theArray.length-1]); theArray.pop();
 return out;
}
function all_close(theArray)
{
 var out="";
 while (theArray.length>0) { out+=closeIT(theArray[theArray.length-1]); theArray.pop(); }
 return out;
}

function DataIndexOf(Data, search,i, j,low)
{
 if (low) return Data.substr(i+j,Data.indexOf(search,i+j)-i-j).toLowerCase();
 else return Data.substr(i+j,Data.indexOf(search,i+j)-i-j);
}

function compile(Data) {
 var out="";
 var RowColor=0;
 var history=new Array();
 for (var i=0; i<Data.length; i++) {
   if (Data.substr(i,1).toLowerCase() != "[") { if ((in_sub_array(Data.substr(i,1).toLowerCase(), BBA)>-1)&(Data.substr(i,3).toLowerCase()!="\n[t")&(Data.substr(i,4).toLowerCase()!="\n[/t")) { out+=BBA[in_sub_array(Data.substr(i,1).toLowerCase(), BBA)][1]} else { out+=Data.substr(i,1); } }
// It's the begin of [ special instruction
   else {
     var iOld=i;
// B I U S C
     if (find_in_array(Data.substr(i,3).toLowerCase(), BB, 1)==1) {
       switch (find_in_array(Data.substr(i,3).toLowerCase(), BB, 0)) {
	 case 4: out+="<span style=\"color:"+Data.substr(i+3, Data.indexOf("]",i+3)-i-3).toLowerCase()+";\">"; history.push("c"); i=Data.indexOf("]",i+3); break;
	 case 5: break;
	 default: out+="<"+Data.substr(i+1,1)+">"; history.push(Data.substr(i+1,1).toLowerCase()); i+=2; break;
        }
      }
// * TR TH TD BR
     if (find_in_array(Data.substr(i,3).toLowerCase(), BBD, 1)==1) {
       switch (find_in_array(Data.substr(i,3).toLowerCase(), BBD, 0)) {
  // *
	 case 0: if (find_in_array("list",history,0)>-1) { if (find_in_arrayR("*",history,0)>-1) out+=sur_close("*", history); out+="<li>"; history.push("*"); i+=2; } break;
  // TR
	 case 1: if (find_in_array("table",history,0)>-1) {
	   if (find_in_arrayR("tr",history,0)>-1) out+=sur_close("tr", history);
	     out+="<tr";
	     history.push("tr");
	     if (RowColor) {out+=" class=\"tr2\""; RowColor=-1;}
	     RowColor++;
	     var mi=Data.indexOf("]",i+1)-i;
	     if (Data.substr(i,mi).toLowerCase().indexOf("center")>-1) out+=" align=\"center\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("right")>-1) out+=" align=\"right\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("left")>-1) out+=" align=\"left\"";
	     i=Data.indexOf("]",i+1);
	     out+=">";
	     if (Data.substr(i+1,1).toLowerCase()=="\n") i++;
	     if ((Data.substr(i+1,3).toLowerCase()!="[td")&(Data.substr(i+1,3).toLowerCase()!="[th")) {
	       history.push("td");
	       out+="<td>";
	      }
	    }
	   break;
	 case 2: if (find_in_array("tr",history,0)>-1) {
	   if (find_in_arrayR("th",history,0)>-1) out+=sur_close("th", history);
	   if (find_in_arrayR("td",history,0)>-1) out+=sur_close("td", history);
	     out+="<th";
	     history.push("th");
	     var mi=Data.indexOf("]",i+1)-i;
	     if (Data.substr(i,mi).toLowerCase().indexOf("center")>-1) out+=" align=\"center\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("right")>-1) out+=" align=\"right\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("left")>-1) out+=" align=\"left\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("rowspan")>-1) {
	       var dataMem=Data.substr(i+Data.substr(i,mi).toLowerCase().indexOf("rowspan")+8,mi-Data.substr(i,mi).toLowerCase().indexOf("rowspan")-8).toLowerCase();
	       if (dataMem.indexOf(" ")>-1) dataMem=dataMem.substr(0, dataMem.indexOf(" "));
	       while (dataMem.indexOf("\"")>-1) dataMem=dataMem.replace("\"","");
	       out+=" rowspan=\""+dataMem+"\"";
	       delete dataMem;
	      }
	     if (Data.substr(i,mi).toLowerCase().indexOf("colspan")>-1) {
	       var dataMem=Data.substr(i+Data.substr(i,mi).toLowerCase().indexOf("colspan")+8,mi-Data.substr(i,mi).toLowerCase().indexOf("colspan")-8).toLowerCase();
	       if (dataMem.indexOf(" ")>-1) dataMem=dataMem.substr(0, dataMem.indexOf(" "));
	       while (dataMem.indexOf("\"")>-1) dataMem=dataMem.replace("\"","");
	       out+=" colspan=\""+dataMem+"\"";
	       delete dataMem;
	      }
	     i=Data.indexOf("]",i+1);
	     out+=">";
	     if (Data.substr(i+1,1).toLowerCase()=="\n") i++;
	    }
	   break;
	 case 3: if (find_in_array("tr",history,0)>-1) {
	   if (find_in_arrayR("th",history,0)>-1) out+=sur_close("th", history);
	   if (find_in_arrayR("td",history,0)>-1) out+=sur_close("td", history);
	     out+="<td";
	     history.push("td");
	     var mi=Data.indexOf("]",i+1)-i;
	     if (Data.substr(i,mi).toLowerCase().indexOf("center")>-1) out+=" align=\"center\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("right")>-1) out+=" align=\"right\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("left")>-1) out+=" align=\"left\"";
	     if (Data.substr(i,mi).toLowerCase().indexOf("rowspan")>-1) {
	       var dataMem=Data.substr(i+Data.substr(i,mi).toLowerCase().indexOf("rowspan")+8,mi-Data.substr(i,mi).toLowerCase().indexOf("rowspan")-8).toLowerCase();
	       if (dataMem.indexOf(" ")>-1) dataMem=dataMem.substr(0, dataMem.indexOf(" "));
	       while (dataMem.indexOf("\"")>-1) dataMem=dataMem.replace("\"","");
	       out+=" rowspan=\""+dataMem+"\"";
	       delete dataMem;
	      }
	     if (Data.substr(i,mi).toLowerCase().indexOf("colspan")>-1) {
	       var dataMem=Data.substr(i+Data.substr(i,mi).toLowerCase().indexOf("colspan")+8,mi-Data.substr(i,mi).toLowerCase().indexOf("colspan")-8).toLowerCase();
	       if (dataMem.indexOf(" ")>-1) dataMem=dataMem.substr(0, dataMem.indexOf(" "));
	       while (dataMem.indexOf("\"")>-1) dataMem=dataMem.replace("\"","");
	       out+=" colspan=\""+dataMem+"\"";
	       delete dataMem;
	      }
	     i=Data.indexOf("]",i+1);
	     out+=">";
	     if (Data.substr(i+1,1).toLowerCase()=="\n") i++;
	    }
	   break;
	 case 4: out+="<br>";
	     i=Data.indexOf("]",i+1);
	   break;
	 default: break;
        }
      }
// URL MEDIA IMG LISTEPHOTOS LISTEMEDIAS LIST TABLE COLOR LEFT RIGHT CENTER JUSTIFY
     if (find_in_array(Data.substr(i,12).toLowerCase(), BBC, 1)==1) {
       switch (find_in_array(Data.substr(i,12).toLowerCase(), BBC, 0)) {
  // URL
	 case 0: out+="<a href=\"";
	   var j=i;
	   if (Data.substr(i+1,1).toLowerCase()=="u") j+=2;
	   j+=2;
	   if (Data.substr(j,1)!="]") {
	     out+=Data.substr(j+1,Data.indexOf("]",j+1)-j-1);
	     j=Data.indexOf("]",j+1);
	    }
	   if (out.substr(out.length-1,1)=="\"") out+=Data.substr(j+1,Data.toLowerCase().indexOf(((Data.substr(i+1,1).toLowerCase()=="u")?"[/url]":"[/a]"), j)-j-1);
	   out+="\">";
	   out+=Data.substr(j+1,Data.toLowerCase().indexOf(((Data.substr(i+1,1).toLowerCase()=="u")?"[/url]":"[/a]"), j)-j-1)+"</a>";
	   j=Data.toLowerCase().indexOf(((Data.substr(i+1,1).toLowerCase()=="u")?"[/url]":"[/a]"), j)+3;
	   if (Data.substr(i+1,1).toLowerCase()=="u") j+=2;
	   i=j;
	   delete j;
	  break;
  // IMG
	 case 1: out+="<img alt=\"img\"";
	   i+=4;
	   if (Data.substr(i,1)!="]") {
	     if ((DataIndexOf(Data,"]",i,1,1)=="left")|(DataIndexOf(Data,"]",i,1,1)=="right")) out+=" style=\"float:"+DataIndexOf(Data,"]",i,1,1)+";\"";
	     i=Data.indexOf("]",i+1);
	    }
	   out+=" src=\""+Data.substr(i+1,Data.toLowerCase().indexOf("[/img]", i)-i-1)+"\">";
	   i=Data.toLowerCase().indexOf("[/img]", i)+5;
	  break;
  // LISTEPHOTOS	--- WARNING : DEPRECATED because it's will be REMOVED !
	 case 2:
	   var HttpRequest=getXHR();
	   var href=Data.substr(i+13,Data.toLowerCase().indexOf("[/listephotos]", i)-i-13);
	   i=Data.toLowerCase().indexOf("[/listephotos]", i)+13;
	   while (href.indexOf(" ") >= 0) href=href.replace(" ", "%20");
	   HttpRequest.open("GET", "\/Photos\/randomX2.php?"+href, false);
	   delete href;
	   HttpRequest.send(null);
	   out+=HttpRequest.responseText;
	   delete HttpRequest;
	  break;
  // LISTEMEDIAS
	 case 3:
	   var HttpRequest=getXHR();
	   var href=Data.substr(i+13,Data.toLowerCase().indexOf("[/listemedias]", i)-i-13);
	   i=Data.toLowerCase().indexOf("[/listemedias]", i)+13;
	   while (href.indexOf(" ") >= 0) href=href.replace(" ", "%20");
	   HttpRequest.open("GET", "\/PHP\/Media.php?type=Course&id="+href+"&Extra="+(href<=0?ExtraLink:0), false);
	   delete href;
	   HttpRequest.send(null);
	   out+=HttpRequest.responseText;
	   delete HttpRequest;
	  break;
  // MEDIA
	 case 4: out+="<img alt=\"img\"";
	   i+=6;
	   if (Data.substr(i,1)!="]") {
	     if ((DataIndexOf(Data,"]",i,1,1)=="left")|(DataIndexOf(Data,"]",i,1,1)=="right")) out+=" style=\"float:"+DataIndexOf(Data,"]",i,1,1)+";\"";
	     i=Data.indexOf("]",i+1);
	    }
	   out+=" src=\"/medias/resize.php/400x400/"+Data.substr(i+1,Data.toLowerCase().indexOf("[/media]", i)-i-1)+".jpg\" onclick=\"FullMedia("+Data.substr(i+1,Data.toLowerCase().indexOf("[/media]", i)-i-1)+")\">";
	   i=Data.toLowerCase().indexOf("[/media]", i)+7;
	  break;
  // LIST
	 case 5: out+="<ul";
	   i+=5;
	   if (Data.substr(i,1)!="]") {
	     if ((DataIndexOf(Data,"]",i,1,1)==1)|(DataIndexOf(Data,"]",i,1,1)=="a")|(DataIndexOf(Data,"]",i,1,1)=="i")|(DataIndexOf(Data,"]",i,1,1)=="disc")|(DataIndexOf(Data,"]",i,1,1)=="circle")|(DataIndexOf(Data,"]",i,1,1)=="square")) out+=" type=\""+DataIndexOf(Data,"]",i,1,0)+"\"";
	     i=Data.indexOf("]",i+1);
	    }
	   history.push("list");
	   out+=">";
	  break;
  // TABLE
	 case 6: out+="<table";
	   i+=5;
	   if (Data.substr(i,1)!="]") {
	     i=Data.indexOf("]",i+1);
	    }
	   history.push("table");
	   out+=">";
	   if (Data.substr(i+1,1).toLowerCase()=="\n") i++;
	   if (Data.substr(i+1,3).toLowerCase()!="[tr") {
	     history.push("tr");
	     out+="<tr";
	     if (RowColor) {out+=" class=\"tr2\""; RowColor=-1;}
	     RowColor++;
	     out+=">";
	     if ((Data.substr(i+1,3).toLowerCase()!="[td")&(Data.substr(i+1,3).toLowerCase()!="[th")) {
	       history.push("td");
	       out+="<td>";
	      }
	    }
	  break;
  // COLOR  
	 case 7: out+="<span style=\"color:"+DataIndexOf(Data,"]",i,7,1)+";\">"; history.push("color"); i=Data.indexOf("]",i+7); break;
  // LEFT
	 case 8: out+="<div class=\"l\">"; history.push("left"); i+=5; break;
  // RIGHT
	 case 9: out+="<div class=\"r\">"; history.push("right"); i+=6; break;
  // CENTER
	 case 10: out+="<div class=\"c\">"; history.push("center"); i+=7; break;
  // JUSTIFY
	 case 11: out+="<div class=\"j\">"; history.push("jutify"); i+=8; break;
	 default: break;
        }
      }
// Here, we close all BB Tag : [/B] [/I] [/U] [/S] [/C] [/LIST]
     if ((Data.substr(i+1,1)=="/")&(DataIndexOf(Data,"]",i,2,0).indexOf(" ")<0)) {
       var back=sur_close(DataIndexOf(Data,"]",i,2,1),history);
       if (back) { out+=back; i=Data.indexOf("]",i+2); }
       delete back;
      }
// force [ if it isn't used ... It's the end of [ special instruction
     if (iOld==i) out+=Data.substr(i,1);
    }
  }
 return out+all_close(history);
}

