function parseBBCode(unpreparedData)
{
var preparedData = "";
var unpreparedData = unpreparedData.replace("\r\n", "\n");
var unpreparedData = unpreparedData.replace("\r", "\n");

var tag="";
var tagContent=-1;
var elementContent="";
var preparedData="";
var tagStack=[];

var parameterNames=[];
var parameterValues=[];
   for(var i=0; i<unpreparedData.length; i++)
   {
      if(unpreparedData[i]=="\n")
      {
         if(i+1<unpreparedData.length && unpreparedData[i+1]=="\n")
         {
         preparedData += "<p />";
         i++;
         continue;
         }
      preparedData += "<br />";
      }
      else if(unpreparedData[i]=="[")
      {
         for(x=i+1; x<unpreparedData.length; x++, i++)
         {
            if(unpreparedData[x]=='/')
            {
            var endingTag = "";
               for(z=x+1; z<unpreparedData.length && unpreparedData[z]!=']'; z++, x++, i++)
               {
               endingTag += unpreparedData[z];
               }
               if(tagStack.length < 1)
               {
               return "CRITICAL ERROR: ending tag '" + endingTag + "' found, but no beginning tag specified.";
               }
               if(endingTag!=tagStack[tagStack.length-1])
               {
               return "CRITICAL ERROR: was expecting tag '" + tagStack[tagStack.length-1] + "', but found tag '" + endingTag + "'. (You most likely forgot to put an ending '" + tagStack[tagStack.length-1] + "' or put a '" + endingTag + "' in the wrong spot.";
               }
            tagStack.pop();
               switch(endingTag)
               {
               case 'url':
               preparedData += "</a>";
               break;
      
               case 'color':
               preparedData += "</font>";
               break;

               case 'numberedList':
               preparedData += "</ol>";
               break;

               case 'list':
               preparedData += "</ul>";
               break;

               case '*':
               preparedData += "</li>";

               case 'img':
               preparedData += "<img src=\"" + tagContent + "\" />";
               tagContent = -1;
               break;

               case 'b':
               preparedData += "</b>";
               break;

               case 'i':
               preparedData += "</i>";
               break;

               case 'u':
               preparedData += "</u>";
               break;

               default:
               return "CRITICAL ERROR: Found unknown tag '" + endingTag + "'; if you meant to type this and do not want it to be interpreted as a tag, put [noBBCode][/noBBCode] tags around it, like so: [noBBCode][/whateEverYouWant]and some text, or whatever[/noBBCode]";
               break;
               }
            }
            else if(unpreparedData[x]==']')
            {
            i++;
            break;
            }
            else if(unpreparedData[x]==' ')
            {
            parameterLength=parameterNames.length;
            parameterNames[parameterLength]="";
            parameterValues[parameterLength]="";
               for(z=x+1; z<unpreparedData.length && unpreparedData[z]!=' ' && unpreparedData[z]!=']'; z++, i++)
               {
               parameterNames[parameterLength] += unpreparedData[x];
               }
               for(; z<unpreparedData.length && unpreparedData[z]!=' ' && unpreparedData[z]!=']'; z++, i++)
               {
               parameterValues[parameterLength] += unpreparedData[x];
               }
            }
            else if(unpreparedData[x]=='=')
            {
            parameterNames[0] = tag;
            parameterValues[0] = "";
               for(z=x+1; z<unpreparedData.length && unpreparedData[z]!="]"; z++, x++, i++)
               {
               parameterValues[0] += unpreparedData[z];
               }
            }
            else
            {
            tag += unpreparedData[x];
            }
         }
         if(tag!='')
         {
         tagStack.push(tag);
            switch(tag)
            {
            case 'url':
               if(parameterNames[0]!='url')
               {
               return "url tag found, but no url specified...\n";
               }
            preparedData += "<a href=\"" + parameterValues[0] + "\">";
            break;
         
            case 'color':
               if(parameterNames[0]!='color')
               {
               return "color tag found, but no color specified...\n";
               }
            preparedData += "<font color=\"" + parameterValues[0] + "\">";
            break;

            case 'numberedList':
            preparedData += "<ol>";
            break;

            case 'list':
            preparedData += "<ul>";
            break;

            case '*':
            var found=0;
               for(z=0; z<tagStack.length; z++)
               {
                  if(tagStack[z]=='numberedList' || tagStack[z]=='list')
                  {
                  found = 1;
                  } 
               }
               if(found==0)
               {
               return "[*] found outside of a list.";
               }
            preparedData += "<li>";
            break;

            case 'img':
            tagContent="";
            break;

            case 'b':
            preparedData += "<b>";
            break;

            case 'i':
            preparedData += "<i>";
            break;

            case 'u':
            preparedData += "<u>";
            break;

            default:
            return "CRITICAL ERROR: Found unknown tag '" + tag + "'; if you meant to type this and do not want it to be interpreted as a tag, put [noBBCode][/noBBCode] tags around it, like so: [noBBCode][whateEverYouWant]and some text, or whatever[andSomeMoreTagsIfYouWant][/noBBCode]";
             break;
            }
         tag="";
         }
      }
      else
      {
         if(tagContent==-1)
         {
         preparedData += unpreparedData[i];
         }
         else
         {
         tagContent += unpreparedData[i];
         }
      }
   }
return preparedData;
}