User:Santaferra

From Wikipedia, the free encyclopedia

This is my attempt at converting Tables in javascript from HTML to MediaWiki format.


var fallBackExtensions = "Calendar,Gnuplot,KwInclude,InputBox,kw_include_file";

function aboutMe(){
        //Local Variables for Current WYSIWYG
        var majorVersion = "0";
        var minorVersion = "4";
        
        return "Version: " + majorVersion + "." + minorVersion;
}
var is = new Is();
//calendar,kwinclude,gnuplot
function convertWiki(source, extensions){
        
        //This one liner is to remove all carriage returns that MSIE uses and replace them with newlines        
        source = source.replace(/\n\r/g, "\n");
        source = source.replace(/<lt;!--\n-->/mgi, "\n");
        source = source.replace(/\n \n/g, "\n");
        source = source.replace(/<lt;p>\&nbsp\;<lt;\/p>/mgi, "<lt;p><lt;/p>");

        //Local Variables
        var firstPos = 0;
        var secondPos = 0;
        var currentPos = 0;
        var refPos = 0;
        var sbt = "";       //String Before Token
        var sat = "";       //String After Token
        var convertStr = source; //String to Convert
        var token = "";
        var tempStr = "";   //Used for random Processing
        var linkStr = "";   //String for holding Links
        var linkTextStr = ""; //String for holding the text of links
        var i = 0;  //For Loop Counter
        var tempChar = "";   //For Checking Previous Characters
        //var align = "", frameOrThumb = "", width = "", height = "";
        var indentStack = "\n";
        //List of Extensions to Support
        var extList = [];
        if(extensions != null){
                extensions = extensions.toLowerCase();
                extList = extensions.split(',');
        }
        else{
                extensions = fallBackExtensions;
                extensions = extensions.toLowerCase();
                extList = extensions.split(',');                
        }
        var found = false;

        //BUILD Conversion Variable Here
        var toWiki = {};
        
        //Tokens to Search For
        toWiki.start = {};
        toWiki.start['<lt;b>'] = "'''";
        toWiki.start['<lt;strong>'] = "'''";
        toWiki.start['<lt;em>'] = "''";
        toWiki.start['<lt;i>'] = "''";
        toWiki.start['<lt;h1>'] = "=";
        toWiki.start['<lt;h2>'] = "==";
        toWiki.start['<lt;h3>'] = "===";
        toWiki.start['<lt;h4>'] = "====";
        toWiki.start['<lt;h5>'] = "=====";
        toWiki.start['<lt;h6>'] = "======";
        toWiki.start['<lt;p>'] = "\n";
        toWiki.start['<lt;br />'] = "\n";
        toWiki.start['<lt;hr />'] = "----";
        toWiki.start['<lt;pre>'] = "<lt;pre>";
        toWiki.start['<lt;table'] = "<lt;table";
        toWiki.start['<lt;a'] = "<lt;a";
        toWiki.start['<lt;math>'] = "<lt;math>";
        toWiki.start['<lt;nowiki>'] = "<lt;nowiki>";      
        toWiki.start['<lt;dl>'] = "";
        toWiki.start['<lt;ol>'] = "";
        toWiki.start['<lt;ul>'] = "";
        toWiki.start['<lt;/dl>'] = "";
        toWiki.start['<lt;/ol>'] = "";
        toWiki.start['<lt;/ul>'] = "";
        toWiki.start['<lt;dd>'] = "";
        toWiki.start['<lt;dt>'] = "";
        toWiki.start['<lt;li>'] = "";
        toWiki.start['<lt;img'] = "<lt;img";
        toWiki.start['<lt;div'] = "<lt;div";
        toWiki.start['<lt;!--'] = "<lt;!--";
        toWiki.start['<lt;tt>'] = "<lt;tt>";
        
        //Token Matching Pattern
        toWiki.match = {};
        toWiki.match['<lt;b>'] = "<lt;/b>";
        toWiki.match['<lt;strong>'] = "<lt;/strong>";
        toWiki.match['<lt;em>'] = "<lt;/em>";
        toWiki.match['<lt;i>'] = "<lt;/i>";
        toWiki.match['<lt;h1>'] = "<lt;/h1>";
        toWiki.match['<lt;h2>'] = "<lt;/h2>";
        toWiki.match['<lt;h3>'] = "<lt;/h3>";
        toWiki.match['<lt;h4>'] = "<lt;/h4>";
        toWiki.match['<lt;h5>'] = "<lt;/h5>";
        toWiki.match['<lt;h6>'] = "<lt;/h6>";
        toWiki.match['<lt;p>'] = "<lt;/p>";
        toWiki.match['<lt;br />'] = "";
        toWiki.match['<lt;hr />'] = ""; 
        toWiki.match['<lt;pre>'] = "voodoo";
        toWiki.match['<lt;table'] = "voodoo";
        toWiki.match['<lt;a'] = "voodoo";
        toWiki.match['<lt;math>'] = "voodoo";
        toWiki.match['<lt;nowiki>'] = "voodoo"; 
        toWiki.match['<lt;dl>'] = "voodoo";
        toWiki.match['<lt;ol>'] = "voodoo";
        toWiki.match['<lt;ul>'] = "voodoo";
        toWiki.match['<lt;/dl>'] = "voodoo";
        toWiki.match['<lt;/ol>'] = "voodoo";
        toWiki.match['<lt;/ul>'] = "voodoo";
        toWiki.match['<lt;dd>'] = "voodoo";     
        toWiki.match['<lt;dt>'] = "voodoo";
        toWiki.match['<lt;li>'] = "voodoo";
        toWiki.match['<lt;img'] = "voodoo";
        toWiki.match['<lt;div'] = "voodoo";
        toWiki.match['<lt;!--'] = "voodoo";
        toWiki.match['<lt;tt>'] = "<lt;/tt>";     
        
        //Token Ending Pattern
        toWiki.end = {};
        toWiki.end['<lt;/b>'] = "'''";
        toWiki.end['<lt;/strong>'] = "'''";
        toWiki.end['<lt;/em>'] = "''";
        toWiki.end['<lt;/i>'] = "''";
        toWiki.end['<lt;/h1>'] = "=";
        toWiki.end['<lt;/h2>'] = "==";
        toWiki.end['<lt;/h3>'] = "===";
        toWiki.end['<lt;/h4>'] = "====";
        toWiki.end['<lt;/h5>'] = "=====";
        toWiki.end['<lt;/h6>'] = "======";      
        toWiki.end['<lt;/p>'] = "";
        toWiki.end['<lt;pre>'] = "<lt;/pre>";
        toWiki.end['<lt;table'] = "<lt;/table>";
        toWiki.end['<lt;a'] = "<lt;/a>";
        toWiki.end['<lt;math>'] = "<lt;/math>";
        toWiki.end['<lt;nowiki>'] = "<lt;/nowiki>";       
        toWiki.end['<lt;dd>'] = "<lt;/dd>";       
        toWiki.end['<lt;dt>'] = "<lt;/dt>";       
        toWiki.end['<lt;li>'] = "<lt;/li>";
        toWiki.end['<lt;!--'] = "-->";  
        toWiki.end['<lt;/tt>'] = "<lt;/tt>";
        
        /*************Main Body of Algorithm*************/
        
        //Preserve Formatting (This is a fallback for TinyMCE's settings)
        convertStr = convertStr.replace(/</g,"<lt;");
        convertStr = convertStr.replace(/>/g,">");
        convertStr = convertStr.replace(/"/g,"\"");
        convertStr = convertStr.replace(/\<lt;br \/\>/g, "\n");
        convertStr = convertStr.replace(/\<lt;br\>/g, "\n");


        //WHILE Current Position of Parsing is Not at end of String
        while(currentPos <lt; convertStr.length && currentPos > -1){
                //Grab First Token
                firstPos = convertStr.indexOf("<lt;", currentPos);
                secondPos = convertStr.indexOf(">", firstPos);
                token = convertStr.substring(firstPos, secondPos+1);
        
                //IF Token needs modification first, currently only "table" tags
                if(token.indexOf("<lt;table") > -1){
                        token = "<lt;table";
                        secondPos = firstPos + 5;
                }
                else if(token.indexOf("<lt;a") > -1){
                        token = "<lt;a";
                        secondPos = firstPos + 1;
                }
                else if(token.indexOf("<lt;img") > -1){
                        token = "<lt;img";
                        secondPos = firstPos + 3;
                }
                else if(token.indexOf("<lt;div") > -1){
                        token = "<lt;div";
                        secondPos = firstPos + 3;
                }
                else if(token.indexOf("<lt;!--") > -1){
                        token = "<lt;!--";
                        secondPos = firstPos + 3;
                }
                else if(token != "<lt;pre>"  && token.indexOf("<lt;p") > -1){
                        
                        //Strip the Paragraph tagging here
                        token = "<lt;p>";
                        //convertStr = convertStr.substring(0, firstPos) + "<lt;p>" + convertStr.substring(secondPos+1, convertStr.length+1);
                }
                //IF Token is Known Conversion
                if(toWiki.start[token] != null && firstPos > -1)        {
                        //Advance Current Position to Trim Cycles
                        currentPos = firstPos;
                
                        //Replace Token in String
                        convertStr = convertStr.substring(0,firstPos) + toWiki.start[token] + convertStr.substring(secondPos + 1, convertStr.length+1);
                        
                        //IF Special Processing Needed 'voodoo'
                        if(toWiki.match[token] == "voodoo"){
                        
                                //Identify Which Case we are Dealing with
                                if(token == "<lt;math>"){

                                        //<lt;pre>/<lt;math> tags is to not be parsed so find closing tag
                                        secondPos = convertStr.indexOf(toWiki.end[token], firstPos);
                                        //firstPos = convertStr.indexOf(toWiki.end[token],token);
                                
                                        //Move Cursor to Closing Tag
                                        currentPos = secondPos;
                                }
                                //Identify Which Case we are Dealing with
                                if(token == "<lt;nowiki>"){

                                        //<lt;pre>/<lt;math> tags is to not be parsed so find closing tag
                                        secondPos = convertStr.indexOf(toWiki.end[token], firstPos);
                                        //firstPos = convertStr.indexOf(toWiki.end[token],token);
                                
                                        //Move Cursor to Closing Tag
                                        currentPos = secondPos;
                                }                               
                                else if(token == "<lt;pre>"){
                                        var tempAry = [];
                                        //Change the format to no pre tag
                                        secondPos = convertStr.indexOf(toWiki.end[token], firstPos);
                                        tempStr = convertStr.substring(firstPos, secondPos + 6);

                                        //String Pre Tags
                                        tempStr = tempStr.replace(/\<lt;pre\>/,"");
                                        tempStr = tempStr.replace(/\<lt;\/pre\>/,"");
                                        tempStr = tempStr.replace(/\r/g, "\n");
                                        tempStr = tempStr.replace(/ /g, " ");
                                        tempAry = tempStr.split('\n');                                  
                                        
                                        tempStr = "";
                                        //FOR All Items in the list
                                        for(var eachLine = 0; eachLine <lt; tempAry.length; eachLine++){
                                                if(tempAry[eachLine] != ""){
                                                        //Reinsert the items into the temporary string
                                                        if(tempAry[eachLine].charAt(0) != " "){
                                                                tempStr = tempStr + " " + tempAry[eachLine] + "\n";
                                                        }
                                                        else{
                                                        
                                                                tempStr = tempStr + tempAry[eachLine] + "\n";
                                                        }
                                                }
                                        }
                                        
                                        //Reinsert the temp string back into the system
                                        convertStr = convertStr.substring(0,firstPos) + tempStr + convertStr.substring(secondPos + 7, convertStr.length+1);
                                
                                        //Move Cursor to Closing Tag
                                        currentPos = firstPos + tempStr.length;
                                        
                                }
                                else if(token == "<lt;table"){

                                        //Identify Ending Tag
                                        secondPos = convertStr.indexOf(toWiki.end[token], firstPos);
                                        //WHILE There are Tables Within Tables
                                        refPos = convertStr.indexOf("<lt;table", firstPos + 5);
                                        while(refPos > firstPos && refPos <lt; secondPos){
                                        
                                                //Take out second table and convert it
                                                convertStr = convertStr.substring(0, refPos) + html2wikiTable(convertStr.substring(refPos, secondPos + 8), extensions) 
                                                             + convertStr.substring(secondPos+8,convertStr.length+1);
                                                //Advance Current Second Position Token
                                                secondPos = convertStr.indexOf(toWiki.end[token], firstPos);
                                                
                                                //Advance Reference Position
                                                refPos = convertStr.indexOf("<lt;table", firstPos + 5);
                                        }
                                
                                        //Convert Current Table  + "\n"
                                        token = html2wikiTable(convertStr.substring(firstPos, secondPos + 8), extensions);
                                        convertStr = convertStr.substring(0, firstPos) 
                                                                 + token
                                                     + convertStr.substring(secondPos+8,convertStr.length+1);
                                                                        

                                }
                                else if(token == "<lt;a"){
                                        //Process Links Here
                                        //Readjust Second Position
                                        secondPos = convertStr.indexOf(">", firstPos); 
                                        //Fetch Entire Link Item
                                        refPos = convertStr.indexOf(toWiki.end[token], currentPos); //Get <lt;/a>
                                        
                                        linkTextStr = convertStr.substring(currentPos, refPos+4);

                                        //Get the Text of the Link
                                        linkTextStr = convertStr.substring(secondPos + 1, refPos); //Stuff between >...<lt;/a>

                                        //This is an appropiate link Converted Right
                                        firstPos = convertStr.indexOf("href=", currentPos);
                                        refPos = convertStr.indexOf('"', firstPos + 6);                                    
                                        linkStr = convertStr.substring(firstPos+6,refPos);
                                        linkStr = linkStr.replace(/%20/g, " ");
                                        
                                        //IF the Link str starts with http:...
                                        if(linkStr.indexOf("http") == 0){
                                                refPos = convertStr.indexOf(toWiki.end[token], currentPos);
                                                linkStr = linkStr.replace(/ /g, "%20");
        
                                                if(convertStr.substring(secondPos + 1, refPos) == linkStr){
                                                        //Process with single Brackets and space divider
                                                        convertStr = convertStr.substring(0, currentPos) 
                                                                                 + "[" + linkStr + "]"
                                                                     + convertStr.substring(refPos+4,convertStr.length+1);                                                              
                                                }
                                                else{   
                                                //Process with single Brackets and space divider
                                                convertStr = convertStr.substring(0, currentPos) 
                                                                         + "[" + linkStr + " " + convertStr.substring(secondPos + 1, refPos) + "]"
                                                             + convertStr.substring(refPos+4,convertStr.length+1);
                                                }
                                        }
                                else if(linkStr.toLowerCase().indexOf("mailto:") == 0){ //Must be a different link
                                                //Process with double brackets and | divider
                                                refPos = convertStr.indexOf(toWiki.end[token], currentPos);
                                                
                                                if(convertStr.substring(secondPos + 1, refPos) == linkStr){
                                                        //Process with single Brackets and space divider
                                                        convertStr = convertStr.substring(0, currentPos) 
                                                                                 + "[" + linkStr + "]"
                                                                     + convertStr.substring(refPos+4,convertStr.length+1);                                                              
                                                }
                                                else{
                                                        //Process with single Brackets and space divider
                                                        convertStr = convertStr.substring(0, currentPos) 
                                                                                 + "[" + linkStr + " " + convertStr.substring(secondPos + 1, refPos) + "]"
                                                                     + convertStr.substring(refPos+4,convertStr.length+1);                                              
                                                }
                                        }
                                        else { //Must be a different link
                                                //Process with double brackets and | divider
                                                refPos = convertStr.indexOf(toWiki.end[token], currentPos);
                                                
                                                if(convertStr.substring(secondPos + 1, refPos) == linkStr){
                                                        //Process with single Brackets and space divider
                                                        convertStr = convertStr.substring(0, currentPos) 
                                                                                 + "[[" + linkStr + "]]"
                                                                     + convertStr.substring(refPos+4,convertStr.length+1);                                                              
                                                }
                                                else{
                                                        //Process with single Brackets and space divider
                                                        convertStr = convertStr.substring(0, currentPos) 
                                                                                 + "[[" + linkStr + "|" + convertStr.substring(secondPos + 1, refPos) + "]]"
                                                                     + convertStr.substring(refPos+4,convertStr.length+1);                                              
                                                }
                                        }
                                        
                                }
                                else if(token == "<lt;dl>"){

                                        indentStack = indentStack + ":";
                                
                                }
                                else if(token == "<lt;ul>"){

                                        indentStack = indentStack + "*";
                                }
                                else if(token == "<lt;ol>"){

                                        indentStack = indentStack + "#";
                                }
                                else if(token == "<lt;/dl>" || token == "<lt;/ul>" || token == "<lt;/ol>"){
                                        indentStack = indentStack.substring(0, indentStack.length-1);
                                                
                                        //Force a new line if we need it
                                        if(convertStr.charAt(currentPos-1) != "\n" &&
                                           convertStr.charAt(currentPos-1) != "\n"){
                                                
                                                convertStr = convertStr.substring(0,currentPos) + "\n"
                                                                         + convertStr.substring(currentPos, convertStr.length+1);                                       
                                        }
                                        

                                }
                                else if(token == "<lt;dd>" || token == "<lt;li>"){

                                        //Obtain new token location
                                        token = toWiki.end[token];
                                        secondPos = convertStr.indexOf(token, firstPos);
                                        //while we have a nested Table
                                        refPos = convertStr.indexOf("<lt;table");
                                        if(refPos >= firstPos && refPos <lt; secondPos){
                                                while(convertStr.indexOf("<lt;/table>",firstPos) > secondPos
                                                      && secondPos > -1){
                                                        secondPos = convertStr.indexOf(token, secondPos + 1);
                                                }
                                        }
                                        firstPos = secondPos;
                                        secondPos = firstPos + token.length;
                                        
                                        if(convertStr.charAt(currentPos - 1) == "\n"){
                                                convertStr = convertStr.substring(0,currentPos) +  indentStack.substring(1, indentStack.length)
                                                             + convertStr.substring(currentPos,firstPos)
                                                                         + convertStr.substring(secondPos, convertStr.length+1);
                                        }
                                        else if(convertStr.charAt(currentPos - 1) != "\n" &&
                                           convertStr.charAt(currentPos - 1) != ":" &&
                                           convertStr.charAt(currentPos - 1) != "*" &&
                                           convertStr.charAt(currentPos - 1) != "#" &&
                                           convertStr.charAt(currentPos - 1) != ";"){
                                                
                                                //Put in the Colonsand the data after that upto the Firstposition
                                                convertStr = convertStr.substring(0,currentPos) +  indentStack
                                                             + convertStr.substring(currentPos,firstPos)
                                                                         + convertStr.substring(secondPos, convertStr.length+1);                                                        

                                        }
                                        else{

                                                //Putin the Colons and the data after that upto the Firstposition
                                                //indentStack.substring(indentStack.length - 1, indentStack.length)
                                                convertStr = convertStr.substring(0,currentPos) + indentStack.substring(indentStack.length - 1, indentStack.length)
                                                             + convertStr.substring(currentPos,firstPos)
                                                                         + convertStr.substring(secondPos, convertStr.length+1);                                                
                                        }
        
                                }
                                else if(token == "<lt;dt>"){ //-1

                                        indentStack = indentStack.substring(0, indentStack.length -1);
                                        indentStack = indentStack + ";";
                                
                                        //Obtain new token location
                                        token = toWiki.end[token];
                                        firstPos = convertStr.indexOf(token, firstPos);
                                        secondPos = firstPos + token.length;
        
                                        if(convertStr.charAt(currentPos - 1) != "\n" &&
                                           convertStr.charAt(currentPos - 1) != ":" &&
                                           convertStr.charAt(currentPos - 1) != "*" &&
                                           convertStr.charAt(currentPos - 1) != "#" &&
                                           convertStr.charAt(currentPos - 1) != ";"){
                                                
                                                //Put in the Colonsand the data after that upto the Firstposition
                                                convertStr = convertStr.substring(0,currentPos) +  indentStack
                                                             + convertStr.substring(currentPos,firstPos)
                                                                         + convertStr.substring(secondPos, convertStr.length+1);                                                        
        
                                        }
                                        else{

                                                //Put in the Colonsand the data after that upto the Firstposition
                                                //indentStack.substring(indentStack.length - 1, indentStack.length)
                                                convertStr = convertStr.substring(0,currentPos) + indentStack.substring(indentStack.length - 1, indentStack.length)
                                                             + convertStr.substring(currentPos,firstPos)
                                                                         + convertStr.substring(secondPos, convertStr.length+1);                                                

                                        }                                       
                                
                                }
                                else if(token == "<lt;img"){
                                        //Process the Image information here
                                        //Find Ending Section for the Image tag
                                        secondPos = convertStr.indexOf("/>", firstPos); 

                                        //IF its the magnify item 
                                        // just remove the tag
                                        // set type as "thumb"
                                        //Get Alt if it exists
                                        //Get the Image Name
                                        //Build [[Image:Name.img
                                        //if alt != ""
                                        //tack on |alt
                                        //IF Thumb Image
                                        //IF Alignment Set
                                        //Close out token ]]
                                                
                                        //Clear all Div Settings
                                        
                                        //Move Cursor
                                        currentPos = secondPos;
                                }
                                else if(token == "<lt;div"){
                                        //Process the Div information here
                                        secondPos = convertStr.indexOf("/>", firstPos);                                    
                                        //IF the Div has a class
                                                //IF the Class has text "thumb t" none/left/right/center
                                                //IF the class has text "thumbinner"
                                                //IF the class is "magnify"
                                                //IF the class is "thumbcaption"
                                                
                                        //Move Cursor                                           
                                        currentPos = secondPos;
                                }
                                else if(token == "<lt;!--"){
                                        //Current Pos is the beginning of <lt;!--
                                        //Need to find the matching -->
                                        secondPos = convertStr.indexOf("-->", currentPos); 
                                        
                                        //Pluck this string out
                                        tempStr = convertStr.substring(currentPos, secondPos + 4);
                                        tempStr = tempStr.toLowerCase();
                                
                                        //Now we need to check if this string has key words in it
                                        //FOR All Possible Keys
                                        for(var extPos = 0; extPos <lt; extList.length && !found; extPos++){
                                                if(tempStr.indexOf("<lt;" + extList[extPos] + ">") > -1 && 
                                                   tempStr.indexOf("<lt;/" + extList[extPos] + ">") > -1 ){
                                                        found = true;
                                                }
                                        }
                                        //IF Found Strip the Comment Tags
                                        if(found){
                                                convertStr = convertStr.substring(0, currentPos) +
                                                             convertStr.substring(currentPos + 4, secondPos) +
                                                             convertStr.substring(secondPos + 3, convertStr.length);
                                                currentPos = currentPos + tempStr.length - 7; 
                                                found = false;
                                        }
                                        else{
                                                //Move Currentposition to second pos
                                                currentPos = secondPos;
                                        }
                                }                                                                       
                                else if(token == ""){
                                        alert("Error: In a broken section search key\"voodoo 1\"");
                                }
                
                        }
                        //ELSE IF Just a normal Parsing Token
                        else if(toWiki.match[token] != ""){
                                //Obtain new token location
                                token = toWiki.match[token];
                                firstPos = convertStr.indexOf(token, firstPos);
                                secondPos = firstPos + token.length;

                                //Replace Match
                                convertStr = convertStr.substring(0,firstPos) + toWiki.end[token] + convertStr.substring(secondPos, convertStr.length+1);
                        }
                        //IF Neither IF is activated, then this tagging is meant to only occur once.

                }
                else if(currentPos > -1){
                        //Advance Position in the Conversion String
                        currentPos = currentPos + 1;
                }

        }//END WHILE More to Parse
        
        //Perform Cleanup on Random Items
        convertStr = convertStr.replace(/ \n/mgi, " \n");
        convertStr = convertStr.replace(/\n /mgi, "\n");
        convertStr = convertStr.replace(/ /mgi, " ");

//alert(source + "\n" + convertStr);

        return convertStr;      
}
/*
 * The Following Method is Designed to Convert Wikipedia Text to HTML
 * 
 */

function convertHTML(source, extensions){

if(extensions == null){
        extensions = fallBackExtensions;

}
        var convertedText = source;   //Text to be converted
        var currentLine = "";         //Current Line of the Wiki text that needs to be changed
        var firstPos = 0;             //First Position for Substring use
        var secondPos = 0;            //Second Position for Substring use
        var refPos = 0;               //Reference Position if in Multilayers
        var found = false;            //Whether or not a Token has been found
        var tokenPos = 0;             //Counter for Which Token we are Checking for
        var currentPos = 0;           //Position in String Source
        var token = "";               //Token For current Working Item
        var counter = 0;                          //Counter of Random Items
        var colonCounter = 0;         //Coutner of Colons at Beginning of a Line
        var semiCounter = 0;          //Counter of Semi Colons
        var poundCounter = 0;         //Counter of Pound Signs
        var astCounter = 0;           //Coutner of Asteriks 
        var inColon = false;              //In a Colon Block
        var inSemi = false;           //In a Semi Colon Block
        var inPound = false;          //In a Pound Sign Block
        var inAst = false;            //In an Asterick Block
        var colonStack = [];              //Track of Previous Line Items
        var useToken = false;         //Whether to Use a Token Addendum
        var poundStack = [];
        var astStack = [];
        var semiStack = [];
        var convStack = [];           //Stack of Which tokens used last
        var inTable = 0;          //Whetehr we are parsing a table...
        var inPre = false;        //Whether we are in a being built pre block
        var tempStr = "";
        
        //Object for Identifying Key Characters
        var toHtml = {};
        
        //Characters to Check For
        toHtml.key = {};
        toHtml.key[0] = "\n";    //this is here as a fall back for refactoring
        toHtml.key[1] = "'";
        toHtml.key[2] = "<lt;";
        toHtml.key[3] = "{";          
        toHtml.key[4] = ":";
        toHtml.key[5] = ";";
        toHtml.key[6] = "#";
        toHtml.key[7] = "*";
        toHtml.key[8] = "[";
        toHtml.key[9] = "=";
        toHtml.key[10] = "-";
        
var keylength = 11;      //This always need to be set to highest value in toHtml.key size plus ONE

        //Starting for Character Change Overs universally
        toHtml.start = {};
        toHtml.start["'''''"] = "<lt;b><lt;i>";    
        toHtml.start["'''"] = "<lt;b>";
        toHtml.start["''"] = "<lt;i>";
        toHtml.start["{|"] = "{|";
        toHtml.start["="] = "<lt;h1>";
        toHtml.start["=="] = "<lt;h2>";       
        toHtml.start["==="] = "<lt;h3>";
        toHtml.start["===="] = "<lt;h4>";     
        toHtml.start["====="] = "<lt;h5>";
        toHtml.start["======"] = "<lt;h6>";
        toHtml.start[":"] = "<lt;dl><lt;dd>";
        toHtml.start["*"] = "<lt;ul><lt;li>";
        toHtml.start["#"] = "<lt;ol><lt;li>";           
        toHtml.start[";"] = "<lt;dl><lt;dt>";
        
        //Matchign Section
        toHtml.match = {};
        toHtml.match["'''''"] = "'''''";    
        toHtml.match["'''"] = "'''";
        toHtml.match["''"] = "''";
        toHtml.match["{|"] = "|}";
        toHtml.match["="] = "=";
        toHtml.match["=="] = "==";  
        toHtml.match["==="] = "===";
        toHtml.match["===="] = "====";      
        toHtml.match["====="] = "=====";
        toHtml.match["======"] = "======";
        toHtml.match[":"] = "<lt;/dd><lt;dd>";  
        toHtml.match["*"] = "<lt;/li><lt;li>";
        toHtml.match["#"] = "<lt;/li><lt;li>";
        toHtml.match[";"] = "<lt;/dt><lt;dt>";
        toHtml.match[":;"] = "<lt;/dd><lt;dt>";
        toHtml.match[";:"] = "<lt;/dt><lt;dd>";

        //End Mathign Token
        toHtml.end = {};
        toHtml.end["'''''"] = "<lt;b><lt;i>";    
        toHtml.end["'''"] = "<lt;/b>";
        toHtml.end["''"] = "<lt;/i>";
        toHtml.end["|}"] = "|}";
        toHtml.end["="] = "<lt;/h1>";
        toHtml.end["=="] = "<lt;/h2>";        
        toHtml.end["==="] = "<lt;/h3>";
        toHtml.end["===="] = "<lt;/h4>";      
        toHtml.end["====="] = "<lt;/h5>";
        toHtml.end["======"] = "<lt;/h6>";
        toHtml.end[":"] = "<lt;/dd><lt;/dl>";
        toHtml.end["*"] = "<lt;/li><lt;/ul>";
        toHtml.end["#"] = "<lt;/li><lt;/ol>";
        toHtml.end[";"] = "<lt;/dt><lt;/dl>";

        /*************Main Body*****************/
        
        //Prepare any extensions to be lower cased for easy checking
        extensions = extensions.toLowerCase();

        //WHILE Current Position is Previous
        while(currentPos <lt; convertedText.length) {

                //FOR Every Token Key
                for(tokenPos = 0; tokenPos <lt; keylength && !found; tokenPos++){

                        //IF Current Character is a Token
                        if(convertedText.charAt(currentPos) == toHtml.key[tokenPos]){
                                found = true;
                                switch(tokenPos){
                                case 0: //Case \n
                                        //IF we have a blank space before the new line
                                        if(convertedText.charAt(currentPos + 1) == " " && !inPre){
                                                inPre = true;
                                                //Creat the pre tag for this section
                                                convertedText = convertedText.substring(0,currentPos) + "<lt;pre>" +
                                                                convertedText.substring(currentPos, convertedText.length + 1);
                                                currentPos = currentPos + 4;
                                                               
                                        }
                                        else if(convertedText.charAt(currentPos + 1) != " " && inPre){

                                                inPre = false;
                                                //Creat the pre tag for this section
                                                convertedText = convertedText.substring(0,currentPos) + "<lt;/pre>" +
                                                                convertedText.substring(currentPos, convertedText.length + 1);                                          
                                                currentPos = currentPos + 5;
        
                                        }       
                                
                                        //IF We have 2 New Lines in a Row
                                        if(convertedText.charAt(currentPos - 1) == "\n" && inTable <lt;= 0){
                                                
                                                //Experiment
                                                if(currentPos + 2 <lt; convertedText.length){
                                                        convertedText = convertedText.substring(0, currentPos)
                                                                        + "<lt;p><lt;/p>"
                                                                        + convertedText.substring(currentPos + 1, convertedText.length+1);
                                                }
                                                else {
                                                        convertedText = convertedText.substring(0, currentPos)
                                                                        + "<lt;p><lt;/p>"
                                                                        + convertedText.substring(convertedText.length, convertedText.length+1);                                                        
                                                }
                                                currentPos = currentPos + 6;
                                                
                                                
                                        }//END IF We have 2 New LInes in a Row

                                        //IF We are in any of the Special Cases
                                        if((convStack.length > 0) ||
                                            (convertedText.charAt(currentPos + 1) == ":" 
                                             || convertedText.charAt(currentPos + 1) == "*" 
                                             || convertedText.charAt(currentPos + 1) == "#"
                                             || convertedText.charAt(currentPos + 1) == ";")){
                                                
                                                if(inPre){
                                                        currentPos = currentPos - 5;
                                                }
                                                
                                                //Grab all Special Characters for next few items
                                                var tempPos = currentPos + 1; 
                                                var tempChar = "";
                                                var tempStack = [];
                                                var insertStr = "";
                                                var isDiff = false;
                                                tempChar = convertedText.charAt(tempPos);
                                                while((tempChar == ":" || tempChar == "*" || tempChar == "#" || tempChar == ";") && tempPos <lt; convertedText.length){
                                                        tempStack.push(tempChar);
                                                        tempPos++;
                                                        tempChar = convertedText.charAt(tempPos);
                                                }

                                                //Check the Current Stack of Items and find divergence point
                                                var divergencePoint = 0;
                                                var divPos = 0;
                                                while(tempStack[divPos] == convStack[divPos] && divPos <lt; tempStack.length && divPos <lt; convStack.length){
                                                        divPos++;
                                                }
                                                divergencePoint = divPos;
  
                                                //IF There isn't a Divergence
                                                if(divergencePoint == tempStack.length && divergencePoint == convStack.length){
 
                                                        //Build a Quick Insert Str
                                                        insertStr = toHtml.match[convStack[convStack.length-1]]
        

                                                }
                                                else{
                                                        //Close out Old Stack Items and remove them from the stack
                                                        //FOR All items that need to be removed in reverse order
                                                        if(convStack.length > 0){
                                        
                                                                for(divPos = convStack.length - 1; (divPos > divergencePoint - 1 && divPos > -1); divPos = divPos - 1){
                                                                        //Add the Closeout tag to the Insert Str
                                                                        insertStr = insertStr + toHtml.end[convStack[divPos]];
                                                                        convStack.pop();
                                                                
                                                                }//END FOR


                                                                //IF there is a need to remove one last item
                                                                if(convStack.length == 1 && tempStack.length == 0){
                                                                        convStack.pop();
                                                                }
        
                                                                        
                                                                //Insert the Change Over item
                                                                if(convStack.length > 0 && convStack.length <lt;= tempStack.length 
                                                                   && divergencePoint >= convStack.length){
                                                                        tempStr = convStack[divergencePoint] + tempStack[divergencePoint];
                                                                        if(toHtml.match[tempStr] == null){
                                                                                insertStr = insertStr + toHtml.match[convStack[convStack.length-1]];
                                                                        }
                                                                        else{
                                                                                insertStr = insertStr + toHtml.match[convStack[tempStr]];
                                                                        }
                                                                
                                                                }
                                                                                                                                        
                                                        }
                                        
                                                        //Build up the stack with the new items and insert the new items text
                                                        if(tempStack.length > 0 && tempStack.length != convStack.length){
                                                                for(divPos = convStack.length; divPos <lt; tempStack.length; divPos ++){
                                                                        //Add the Starting Tags
                                                                        insertStr = insertStr + toHtml.start[tempStack[divPos]];
                                                                        convStack.push(tempStack[divPos]);
                                                                        
                                                                }//END FOR      
                                                        }
                                                }//END IF No Divergence

        
                                                //Insert the String
                                                convertedText = convertedText.substring(0, currentPos+1) 
                                                                                + insertStr
                                                                + convertedText.substring(tempPos,convertedText.length+1);                                              
                                                //currentPos = currentPos + insertStr.length;
                                                
                                                if(inPre){
                                                        currentPos = convertedText.indexOf("\n", currentPos);
                                                }
                                        
                                        }//END IF Special Cases
                                        
                                
                                        
                                        break;
                                case 1: //Case '

                                        //Identify if this is one of the key cases
                                        //Grab Token of first 5 characters
                                        token = convertedText.substring(currentPos, currentPos + 5);
                                
                                        //IF Token is 5 Apostraphes
                                        if(token.indexOf("'''''") > -1){
                                                //Leave Token Alone!
                                        }
                                        //ELSE IF Token is 3 apostraphes
                                        else if(token.indexOf("'''") > -1){
                                                //Convert Token to 3 Apostraphes only
                                                token = "'''";
                                        }
                                        //ELSE IF Token is 2 Apostraphes
                                        else if(token.indexOf("''") > -1){
                                                //Convert Token to 2 Apostraphes Only
                                                token = "''";
                                        }

                                        //IF token exists properly                                      
                                        if(toHtml.start[token] != null){
                                                //Get Position of Ending Part
                                                secondPos = convertedText.indexOf(toHtml.match[token],currentPos + 1);

                                                //IF Matching 2nd Position Exists
                                                if(secondPos > -1){
                                                        //Replace First Part
                                                        convertedText = convertedText.substring(0,currentPos) +
                                                                        toHtml.start[token] + 
                                                                        convertedText.substring((currentPos + token.length),convertedText.length+1);
        
                                                        //Get Position of Ending Part
                                                        secondPos = convertedText.indexOf(toHtml.match[token],currentPos + 1);
                                                        
                                                        //Replace Second Part (ending token)
                                                        token = toHtml.match[token];
                                                        convertedText = convertedText.substring(0,secondPos) +
                                                                        toHtml.end[token] + 
                                                                        convertedText.substring((secondPos + token.length),convertedText.length+1);     
                                                }//END IF 2nd Token Exists
                                                
                                        }//END IF Token Exists Properly
                                        break;
                                case 2: //Case <lt; for possible <lt;pre>,<lt;math>, or <lt;nowiki> blocks
                                        //Identify Possible > after current loc
                                        firstPos = convertedText.indexOf(">",currentPos);
                                        
                                        //IF > exists in String
                                        if(firstPos > -1){
                                                //Grab the Token of <lt;?>
                                                token = convertedText.substring(currentPos,firstPos+1);
                                                token = token.toLowerCase();

                                                //IF Token is <lt;pre> tag
                                                if(token == "<lt;pre>"){
                                                        //Find Matching <lt;/pre> tag
                                                        secondPos = convertedText.indexOf("<lt;/pre>",currentPos);
                                                        
                                                        //IF Matching Tag Exists
                                                        if(secondPos > -1){
                                                                //Grab a Temporary String, Move it to the 
                                                                tempStr = convertedText.substring(currentPos + 5, secondPos);
                                                                tempStr = tempStr.replace(/<lt;/g,"<");
                                                                tempStr = tempStr.replace(/>/g,">");
                                                                convertedText = convertedText.substring(0, currentPos) + "<lt;pre>"
                                                                                + tempStr 
                                                                                + convertedText.substring(secondPos, convertedText.length + 1);
                                                                secondPos = convertedText.indexOf("<lt;/pre>",currentPos);

                                                                //Advance Current Position to Second Position in string
                                                                currentPos = convertedText.indexOf("<lt;/pre>",currentPos);
                                                        }
                                                        
                                                }
                                                //ELSE IF Token is <lt;math> tag
                                                else if(token == "<lt;math>"){
                                                        //Find Matching <lt;/math> tag
                                                        secondPos = convertedText.indexOf("<lt;/math>",currentPos);
                                                        
                                                        //IF Matching Tag Exists
                                                        if(secondPos > -1){

                                                                //Advance Current Position to Second Position in string
                                                                currentPos = secondPos;
                                                        }
                                                        
                                                }
                                                //ELSE IF Token is <lt;nowiki> tag
                                                else if(token == "<lt;nowiki>"){
                                                        //Find Matching <lt;/nowiki> tag
                                                        secondPos = convertedText.indexOf("<lt;/nowiki>",currentPos);
                                                        
                                                        //IF Matching Tag Exists
                                                        if(secondPos > -1){
                                                                tempStr = convertedText.substring(currentPos + 8, secondPos);
                                                                tempStr = tempStr.replace(/<lt;/g,"<");
                                                                tempStr = tempStr.replace(/>/g,">");
                                                                convertedText = convertedText.substring(0, currentPos) + "<lt;nowiki>"
                                                                                + tempStr 
                                                                                + convertedText.substring(secondPos, convertedText.length + 1);
                                                                secondPos = convertedText.indexOf("<lt;/nowiki>",currentPos);
                                                                //Advance Current Position to Second Position in string
                                                                currentPos = secondPos;
                                                        }                                                       
                                                        
                                                }
                                                //ELSE IF This Token Starts with <lt;table
                                                else if(token.indexOf("<lt;table") == 0){
                                                        if(inTable <lt; 0){
                                                                inTable = 0;
                                                        }
                                                        inTable = inTable + 1;
                                                        currentLine = convertedText.substring(currentPos, firstPos+1);
                                                        if(currentLine.indexOf("\n") == -1){
                                                                currentPos = convertedText.indexOf(">", currentPos);
                                                        }                                                       
                                                }
                                                else if(token == "<lt;/table>"){
                                                        inTable = inTable - 1;  
                                                }
                                                else if(extensions.indexOf(token.substring(1,token.length-1)) > -1 &&
                                                        (extensions.indexOf(token.substring(1,token.length-1))) == 0 ||
                                                        (extensions.charAt(extensions.indexOf(token.substring(1,token.length-1))) == "," &&
                                                        (extensions.charAt(extensions.indexOf(token.substring(1,token.length-1)) + token.length - 2) == ","
                                                         || extensions.indexOf(token.substring(1,token.length-1)) + token.length - 1 == extensions.length))
                                                        ){
                                                        //Find Matching Tag
                                                        var endTag = 0;
                                                        var endString = "<lt;/";
                                                        endString = endString + token.substring(1,token.length);
                                                        endTag = convertedText.toLowerCase().indexOf(endString, currentPos);
                                                                                                        
                                                        //IF There is a matching tag
                                                        if(endTag > -1){

                                                                //Surround Entire Bit by Comments
                                                                convertedText = convertedText.substring(0,currentPos)
                                                                                + "<lt;!--"
                                                                                + convertedText.substring(currentPos,(endTag + endString.length)).replace(/\n/g,"<lt;br />")
                                                                                + "-->"
                                                                                + convertedText.substring((endTag + endString.length),convertedText.length + 1);
                                                                        
                                                                //Advance Cursor to be after converted Section
                                                                currentPos = endTag + token.length + 8;
                                                        }
                                                        else{ // Must not be a Matching Tag
                                                                //Just Advance Cursor to Ending Item
                                                                currentLine = convertedText.substring(currentPos, firstPos+1);
                                                                if(currentLine.indexOf("\n") == -1){
                                                                        currentPos = convertedText.indexOf(">", currentPos);
                                                                }                                                               
                                                        }//END IF There is a Matching Tag
                                                }
                                                else{ //Just advance cursor to Ending Item
                                                        currentLine = convertedText.substring(currentPos, firstPos+1);
                                                        if(currentLine.indexOf("\n") == -1){
                                                                currentPos = convertedText.indexOf(">", currentPos);
                                                        }
                                                }
                                        }//END IF > exists in String
                                        
                                        break;
                                case 3: //Case Current Char is {  Possible Table Block
                                        //IF This is a Table Starter
                                        if(convertedText.indexOf("{|",currentPos) == currentPos){
                                                //Convert The Token key to appropiate tag
                                                token = "{|";
                                                token = toHtml.match[token];
                                                
                                                //Identify Ending Tag
                                                secondPos = convertedText.indexOf(toHtml.end[token], currentPos);
                                                //WHILE There are Tables Within Tables
                                                refPos = convertedText.indexOf("{|", currentPos + 2);
                                                while(refPos > currentPos && refPos <lt; secondPos && refPos != -1){

                                                        token = "";
                                                        token = convertedText.substring(refPos, secondPos + 2);
                                                        token = wiki2htmlTable(token, extensions);

                                                        //Take out second table and convert it
                                                        convertedText = convertedText.substring(0, refPos) +  token
                                                                     + convertedText.substring(secondPos+2,convertedText.length+1);

                                                        
                                                        //Advance Current Second Position Token
                                                        token = "";
                                                        token = "|}";
                                                        secondPos = convertedText.indexOf(toHtml.end[token], currentPos);
                                                
                                                        //Advance Reference Position
                                                        refPos = convertedText.indexOf("{|", currentPos + 2);

                                                }
                                            //IF There is no Closing to the Current table
                                            if(secondPos == -1){
                                                //Magically create an end to this table 
                                                secondPos  = convertedText.length - 2;
                                            }
                                                //Convert Current Table
                                                token = "";
                                                token = convertedText.substring(currentPos, secondPos + 2 );
                                                token = wiki2htmlTable(token, extensions);
                                                
                                                convertedText = convertedText.substring(0, currentPos) 
                                                                         + token
                                                             + convertedText.substring(secondPos+2,convertedText.length+1);
                                                
                                                //Move Cursor to after Table                                            
                                                currentPos = currentPos + token.length-1;                    
                                        }
                                        break;
                                case 4: //Case : indent block

                                        //Check if this is flush with the Left margin 
                                        if(currentPos == 0 || convertedText.charAt(currentPos - 1) == "\n" ){
                                                //Reset the Token
                                                token = "";
                                                
                                                //IF Colon Counter hasn't been set yet
                                                if(!inColon){
                                                        //Set Colon Counter to 1 (So far)
                                                        colonCounter = 1;
                                                        
                                                        //Build Start of Token
                                                        token = "<lt;dl><lt;dd>";
                                                        
                                                        //Setup the First Item to being created and true
                                                        colonStack[1] = true;
                                                        
                                                        //Push Being in indent block                            
                                                        convStack.push(":");                                                  
                                                }
                                                //Set Reference Position to next in String
                                                refPos = currentPos + 1;
                                                
                                                //WHILE Next Character is a ":"
                                                counter = 1;
                                                while(convertedText.charAt(refPos) == ":"){
                                                        //Increment Counter and Move Cursor
                                                        counter = counter + 1;
                                                        refPos = refPos + 1;
                                                        convStack.push(":");
                                                }
                                                
                                                //IF in a colon block and We are previously used
                                                if(inColon && colonStack[counter]){
                                                        useToken = true;
                                                }
                                                
                                                //WHILE Current Count of Every ":" 
                                                while(colonCounter <lt; counter){
                                                        //add <lt;dl><lt;dd>
                                                        token = "<lt;dl><lt;dd>" + token;
                                                        
                                                        //Set Current Flag of Used to True
                                                        colonStack[colonCounter] = true;
                                                        
                                                        //Increment Amount of Colons Counted
                                                        colonCounter++;
                                                }
                                                while(counter <lt; colonCounter){
                                                        //Add <lt;dl><lt;dd>
                                                        token = token + "<lt;/dd><lt;/dl>";
                                                        
                                                        //Set Current Flag of Used to False
                                                        colonStack[colonCounter] = false;                                                       
                                                        
                                                        //Decrement Colons counted
                                                        colonCounter--;                                         

                                                }

                                                //IF We need to Alter the Token
                                                if(useToken){
                                                        //Change the Token Appropiately
                                                        token = token + "<lt;/dd><lt;dd>";
                                                        
                                                        //Flip this Flag Back to False
                                                        useToken = false;
                                                }

                                                //Replace Colons on this Line with Token Generated
                                                convertedText = convertedText.substring(0, currentPos) 
                                                                                + token
                                                                + convertedText.substring(refPos,convertedText.length+1);
                                                
                                                //Move Cursor to After Changed Token
                                                currentPos = currentPos + token.length - 1;
                                                                                                
                                                //Set to being In a Colon Set
                                                inColon = true;
                                        }
                                        break;
                                case 5: //Case ; Situation

                                        //Check if this is flush with the Left margin
                                        if(currentPos == 0 || convertedText.charAt(currentPos - 1) == "\n"){
                                                //Reset the Token
                                                token = "";
                                                
                                                //IF Pound Hasn't been Started
                                                if(!inSemi){
                                                        //Set Semi Counter to 1 (So far)
                                                        semiCounter = 1;
                                                        
                                                        //Build Start of Token
                                                        token = "<lt;dl><lt;dt>";
                                                        
                                                        //Setup the First Item to being created and true
                                                        semiStack[1] = true;

                                                        //Push Being in pound block                             
                                                        convStack.push(";");
                                                        
                                                }
                                                //Set Reference Position to next in String
                                                refPos = currentPos + 1;
                                                
                                                //WHILE Next Character is a ";"
                                                counter = 1;
                                                while(convertedText.charAt(refPos) == ";"){
                                                        //Increment Counter and Move Cursor
                                                        counter = counter + 1;
                                                        refPos = refPos + 1;
                                                        convStack.push(";");
                                                }
                                                
                                                //IF in a pound block and We are previously used
                                                if(inSemi && semiStack[counter]){
                                                        useToken = true;
                                                }
                                                
                                                //WHILE Current Count of Every "#" 
                                                while(semiCounter <lt; counter){
                                                        //add <lt;dl><lt;dt>
                                                        token = "<lt;dl><lt;dt>" + token;
                                                        
                                                        //Set Current Flag of Used to True
                                                        semiStack[semiCounter] = true;
                                                        
                                                        //Increment Amount of Pounds Counted
                                                        semiCounter++;
                                                }
                                                while(counter <lt; semiCounter){
                                                        //Add 
                                                        token = token + "<lt;/dt><lt;/dl>";
                                                        
                                                        //Set Current Flag of Used to False
                                                        semiStack[semiCounter] = false;                                                 
                                                        
                                                        //Decrement Pounds counted
                                                        semiCounter--;                                          

                                                }

                                                //IF We need to Alter the Token
                                                if(useToken){
                                                        //Change the Token Appropiately
                                                        token = token + "<lt;/dt><lt;dt>";
                                                        
                                                        //Flip this Flag Back to False
                                                        useToken = false;
                                                }

                                                //Replace Colons on this Line with Token Generated
                                                convertedText = convertedText.substring(0, currentPos) 
                                                                                + token
                                                                + convertedText.substring(refPos,convertedText.length+1);
                                                
                                                //Move Cursor to After Changed Token
                                                currentPos = currentPos + token.length - 1;
                                                                                                
                                                //Set to being In a Pound Set
                                                inPound = true;
                                        
                                        }                                       
                                        break;
                                case 6: //Case # Numbered Indents

                                        //Check if this is flush with the Left margin
                                        if(currentPos == 0 || convertedText.charAt(currentPos - 1) == "\n"){
                                                //Reset the Token
                                                token = "";
                                                
                                                //IF Pound Hasn't been Started
                                                if(!inPound){
                                                        //Set Pound Counter to 1 (So far)
                                                        poundCounter = 1;
                                                        
                                                        //Build Start of Token
                                                        token = "<lt;ol><lt;li>";
                                                        
                                                        //Setup the First Item to being created and true
                                                        poundStack[1] = true;

                                                        //Push Being in pound block                             
                                                        convStack.push("#");
                                                        
                                                }
                                                //Set Reference Position to next in String
                                                refPos = currentPos + 1;
                                                
                                                //WHILE Next Character is a "#"
                                                counter = 1;
                                                while(convertedText.charAt(refPos) == "#"){
                                                        //Increment Counter and Move Cursor
                                                        counter = counter + 1;
                                                        refPos = refPos + 1;
                                                        convStack.push("#");
                                                }
                                                
                                                //IF in a pound block and We are previously used
                                                if(inPound && poundStack[counter]){
                                                        useToken = true;
                                                }
                                                
                                                //WHILE Current Count of Every "#" 
                                                while(poundCounter <lt; counter){
                                                        //add <lt;ul><lt;li>
                                                        token = "<lt;ol><lt;li>" + token;
                                                        
                                                        //Set Current Flag of Used to True
                                                        poundStack[poundCounter] = true;
                                                        
                                                        //Increment Amount of Pounds Counted
                                                        poundCounter++;
                                                }
                                                while(counter <lt; poundCounter){
                                                        //Add 
                                                        token = token + "<lt;/li><lt;/ol>";
                                                        
                                                        //Set Current Flag of Used to False
                                                        poundStack[poundCounter] = false;                                                       
                                                        
                                                        //Decrement Pounds counted
                                                        poundCounter--;                                         

                                                }

                                                //IF We need to Alter the Token
                                                if(useToken){
                                                        //Change the Token Appropiately
                                                        token = token + "<lt;/li><lt;li>";
                                                        
                                                        //Flip this Flag Back to False
                                                        useToken = false;
                                                }

                                                //Replace Colons on this Line with Token Generated
                                                convertedText = convertedText.substring(0, currentPos) 
                                                                                + token
                                                                + convertedText.substring(refPos,convertedText.length+1);
                                                
                                                //Move Cursor to After Changed Token
                                                currentPos = currentPos + token.length - 1;
                                                                                                
                                                //Set to being In a Pound Set
                                                inPound = true;
                                        }
                                        break;
                                case 7: //Case * Bulletted Indents

                                        //Check if this is flush with the Left margin
                                        if(currentPos == 0 || convertedText.charAt(currentPos - 1) == "\n"){
                                                //Reset the Token
                                                token = "";
                                                
                                                //IF ast Hasn't been Started
                                                if(!inAst){
                                                        //Set ast Counter to 1 (So far)
                                                        astCounter = 1;
                                                        
                                                        //Build Start of Token
                                                        token = "<lt;ul><lt;li>";
                                                        
                                                        //Setup the First Item to being created and true
                                                        astStack[1] = true;

                                                        //Push Being in indent block                            
                                                        convStack.push("*");
                                                }
                                                //Set Reference Position to next in String
                                                refPos = currentPos + 1;
                                                
                                                //WHILE Next Character is a "*"
                                                counter = 1;
                                                while(convertedText.charAt(refPos) == "*"){
                                                        //Increment Counter and Move Cursor
                                                        counter = counter + 1;
                                                        refPos = refPos + 1;
                                                        convStack.push("*");
                                                }
                                                
                                                //IF in a ast block and We are previously used
                                                if(inAst && astStack[counter]){
                                                        useToken = true;
                                                }
                                                
                                                //WHILE Current Count of Every "*" 
                                                while(astCounter <lt; counter){
                                                        //add <lt;ul><lt;li>
                                                        token = "<lt;ul><lt;li>" + token;
                                                        
                                                        //Set Current Flag of Used to True
                                                        astStack[astCounter] = true;
                                                        
                                                        //Increment Amount of asts Counted
                                                        astCounter++;
                                                }
                                                while(counter <lt; astCounter){
                                                        //Add 
                                                        token = token + "<lt;/li><lt;/ul>";
                                                        
                                                        //Set Current Flag of Used to False
                                                        astStack[astCounter] = false;                                                   
                                                        
                                                        //Decrement asts counted
                                                        astCounter--;                                           

                                                }

                                                //IF We need to Alter the Token
                                                if(useToken){
                                                        //Change the Token Appropiately
                                                        token = token + "<lt;/li><lt;li>";
                                                        
                                                        //Flip this Flag Back to False
                                                        useToken = false;
                                                }

                                                //Replace Colons on this Line with Token Generated
                                                convertedText = convertedText.substring(0, currentPos) 
                                                                                + token
                                                                + convertedText.substring(refPos,convertedText.length+1);
                                                
                                                //Move Cursor to After Changed Token
                                                currentPos = currentPos + token.length - 1;
                                                                                                
                                                //Set to being In a ast Set
                                                inAst = true;
                                        }
                                        break;
                                case 8: //Case [ References

                                        //Several Cases to Consider TODO
                                        //IF This isn't last character in string
                                        if(currentPos != convertedText.length-1){
                                                //IF This has a [ to the right
                                                if(convertedText.charAt(currentPos+1) == "["){
                                                
                                                        //IF This has a matching ]] Tag
                                                        secondPos = convertedText.indexOf("]]",currentPos);
                                                        if(secondPos > -1){
                                                                //See if the Link has a link within it (crazy people out there)
                                                                refPos = convertedText.indexOf("[[", currentPos + 2);
                                                                while(refPos <lt; secondPos && refPos > -1){
                                                                        secondPos = convertedText.indexOf("]]",secondPos + 2);
                                                                        refPos = convertedText.indexOf("[[", refPos + 2);
                                                                }
                                                                
                                                                //Grab the Token between these two Items
                                                                token = convertedText.substring(currentPos, secondPos + 2);

                                                                //IF Token doesn't have a new line
                                                                if(token.indexOf("\n") == -1){

                                                                        //SWITCH On 3rd Character in String
                                                                        switch(token.toUpperCase().charAt(2)){
        
                                                                                case "I":
                                                                                        //Check if this is Image Link
                                                                                        if(token.toUpperCase().indexOf("IMAGE:") == 2){
/*
                                                                                                //Trim Image
                                                                                                token = token.substring(2, token.length-2);
                        
                                                                                                //Split current token on "|"
                                                                                                var tokenArray = token.split("|");

                                                                                                //Variables needed for Image Processing
                                                                                                var alt = "";
                                                                                                var src = "";
                                                                                                var longdesc = "";
                                                                                                var imgClass = "";
                                                                                                var align = "none";
                                                                                                var width = "";
                                                                                                var height = "";
                                                                                                var imgCap = "";
                                                                                                var tempToken = "";
                                                                                                var divCounter = 1;
                                                                                                var useEnlarge = false;
                                                                                                var useFrame = false;

                                                                                                //Build up Basic Elements of Image link
                                                                                                longdesc = tokenArray[0];
                                                                                                src = tokenArray[0].split(":")[1];
                                                                                                
                                                                                                //WHILE There are more Tokens in the Array
                                                                                                counter = 1;
                                                                                                while(tokenArray[counter] != null){
                                                                                                        //Identify Token Type
                                                                                                        var currToken = tokenArray[counter].toUpperCase();
                                                                                                        if(currToken == "THUMB" || currToken == "THUMBNAIL"){
                                                                                                                imgClass = "thumbimage";
                                                                                                                useEnlarge = true;
                                                                                                                useFrame = true;
                                                                                                                
                                                                                                        }
                                                                                                        else if(currToken == "FRAME"){
                                                                                                                imgClass = "thumbimage";
                                                                                                                useEnlarge = false;
                                                                                                                useFrame = true;
                                                                                                        }
                                                                                                        else if(currToken == "LEFT" || currToken == "RIGHT" || currToken == "CENTER" || currToken == "NONE"){
                                                                                                                align = tokenArray[counter].toLowerCase();
                                                                                                        }
                                                                                                        else if(currToken.indexOf("PX") == currToken.length - 2){
                                                                                                                //Parse for Number of pixels
                                                                                                                var pxPattern = /\d+X\d+PX/;
                                                                                                                var singPxPattern = /\d+PX/;
                                                                                                                if(pxPattern.test(currToken)){
                                                                                                                        firstPos = currToken.indexOf("X");
                                                                                                                        width = currToken.substring(0,firstPos);
                                                                                                                        height = currToken.substring(firstPos + 1, currToken.length - 2);
                                                                                                                }
                                                                                                                else if(singPxPattern.test(currToken)){
                                                                                                                        width = tokenArray[counter].substring(tokenArray[counter].length - 2);
                                                                                                                }
                                                                                                                else{ //Must not be a Pixel Pattern Setup
                                                                                                                        //alt = convertHTML(tokenArray[counter]);
                                                                                                                        //alt = alt.replace(/"/g, "'");
                                                                                                                        alt = tokenArray[counter];
                                                                                                                }
                                                                                                                                                                                                        
                                                                                                        }
                                                                                                        else { //must be a caption element check for links in it, extend if needed
                                                                                                                //alt = convertHTML(tokenArray[counter]);
                                                                                                                //alt = alt.replace(/\"/g, "'");
                                                                                                                alt = tokenArray[counter];
                                                                                                        }//END Identify Type
                                                                                                        //Increment Counter
                                                                                                        counter++;
                                                                                                }
                                                                                                
                                                                                                //Build the Token for Use
                                                                                                //First Put Alignment Div into play
                                                                                                token = "";
                                                                                                token = "<lt;div class=\"thumb t"+ align + "\">";
                                                                                                
                                                                                                //Then if there is a frame place that
                                                                                                if(useFrame){
                                                                                                        token = token + "<lt;div class=\"thumbinner\">";
                                                                                                        divCounter++;
                                                                                                }
                                                                                                //Insert Image Proper
                                                                                                token = token + "<lt;img alt=\"" + alt + "\" "
                                                                                                        + "longdesc=\"" + longdesc +  "\" ";
                                                                                                if(useFrame){
                                                                                                        token = token + "class=\"thumbimage\" ";
                                                                                                }
                                                                                                token = token + "src=\"" + src + "\" ";
                                                                        
                                                                                                if(width != ""){
                                                                                                        token = token + "width=\"" + width + "\" ";
                                                                                                }
                                                                                                if (height != ""){
                                                                                                        token = token + "height=\"" + height + "\" ";
                                                                                                }
                                                                                                token = token + "/>";
                                                                                                if(useFrame){
                                                                                                        token = token + "<lt;div class=\"thumbcaption\">";
                                                                                                        divCounter++;
                                                                                                }
                                                                                                //IF Have to have Enlarge option
                                                                                                if(useEnlarge){
                                                                                                        token = token + "<lt;div class=\"magnify\" style=\"float:right\"><lt;img src=\"/mediawiki/skins/common/images/magnify-clip.png\" width=\"15\" height=\"11\" alt=\"\" /><lt;/div>";
                                                                                                }
                                                                                                
                                                                                                //Close out any remaning Divs
                                                                                                while(divCounter > 0){
                                                                                                        token = token + "<lt;/div>";
                                                                                                        divCounter--;
                                                                                                }
                                                                                        
                                                                                                //Replace Token back into string
                                                                                                convertedText = convertedText.substring(0, currentPos) 
                                                                                                                                + token
                                                                                                                + convertedText.substring(secondPos+2,convertedText.length+1);                                                                                                  

                                                                                            //Move Cursor up                                                                                            
                                                                                            currentPos = currentPos + token.length - 1;
*/

                                                                                        //Skip the Image Processing for now:
                                                                                        currentPos = currentPos + 2;
                                                                                        }

                                                                                        else { //Must be a regular link
                                                                                                //Process basic Link
                                                                                                firstPos = token.indexOf("|");
                                                                                                if(firstPos > -1){
                                                                                                        token = token.replace(/\[\[(.*?)\|(.*?)\]\]/,"<lt;a href=\"$1\">$2<lt;/a>");
                                                                                                }
                                                                                                else {
                                                                                                        token = token.replace(/\[\[(.*?)\]\]/,"<lt;a href=\"$1\">$1<lt;/a>");                                                                                           
                                                                                                }
                                                                                                //Replace Token back into string
                                                                                                convertedText = convertedText.substring(0, currentPos) 
                                                                                                                                + token
                                                                                                                + convertedText.substring(secondPos+2,convertedText.length+1);
                                                                                                //Advance Current Position
                                                                                                currentPos = currentPos + token.indexOf(">");                                                                                                                      
                                                                                        }

                                                                                        break;

                                                                                case ":":
                                                                                        //Link Processing here, don't show the :, but keep it
                                                                                        firstPos = token.indexOf("|");
                                                                                        if(firstPos > -1){
                                                                                                token = token.replace(/\[\[\:(.*?)\|(.*?)\]\]/,"<lt;a href=\":$1\">$2<lt;/a>");
                                                                                        }
                                                                                        else {
                                                                                                token = token.replace(/\[\[\:(.*?)\]\]/,"<lt;a href=\":$1\">$1<lt;/a>");                                                                                                
                                                                                        }
                                                                                        //Replace Token back into string
                                                                                        convertedText = convertedText.substring(0, currentPos) 
                                                                                                                        + token
                                                                                                        + convertedText.substring(secondPos+2,convertedText.length+1);
                                                                                        //Advance Current Position
                                                                                        currentPos = currentPos + token.indexOf(">");                                                                                                      
                                                                                        break;

                                                                                default:
                                                                                
                                                                                        //Process basic Link
                                                                                        firstPos = token.indexOf("|");
                                                                                        if(firstPos > -1){
                                                                                                token = token.replace(/\[\[(.*?)\|(.*?)\]\]/,"<lt;a href=\"$1\">$2<lt;/a>");
                                                                                        }
                                                                                        else {
                                                                                                token = token.replace(/\[\[(.*?)\]\]/,"<lt;a href=\"$1\">$1<lt;/a>");                                                                                           
                                                                                        }
                                                                                        //Replace Token back into string
                                                                                        convertedText = convertedText.substring(0, currentPos) 
                                                                                                                        + token
                                                                                                        + convertedText.substring(secondPos+2,convertedText.length+1);
                                                                                        //Advance Current Position
                                                                                        currentPos = currentPos + token.indexOf(">");                                                                                              
                                                                                        break;

                                                                        }//END SWITCH


                                                                }//END IF This Doesn't have a \n character in it
                                                        
                                                        }//END IF This has a matching ]] tag
                                        
                                                }
                                                else{ //Must not have a [ to the right of current position
                                                        //IF This has a matching ]
                                                        secondPos = convertedText.indexOf("]",currentPos);
                                                        if(secondPos > -1){
                                                                token = convertedText.substring(currentPos, secondPos + 1);
                                                                //Check for a New Line in token
                                                                if(token.indexOf("\n") == -1){
                                                                        //Check for blank space in token
                                                                        if(token.indexOf(" ") > -1){
                                                                                //Case 1: [http://link Wording]
                                                                                token = token.replace(/\[(.*?)\s(.*?)\]/, "<lt;a href=\"$1\">$2<lt;/a>");
                                                                        }
                                                                        else {//Case 2: [http://link]
                                                                                token = token.replace(/\[(.*?)\]/, "<lt;a href=\"$1\">$1<lt;/a>");                                                                      
                                                                        }
                                                                        //Insert Token back into string
                                                                        convertedText = convertedText.substring(0, currentPos) 
                                                                                                        + token
                                                                                        + convertedText.substring(secondPos+1,convertedText.length+1);
                                                                        currentPos = currentPos + token.indexOf(">");
                                                                }
                                                        }

                                                }//END IF There is only one [

                                        }//END IF This is Last Character in String

                                        break;
                                case 9: //Case = headers
                                        if(currentPos == 0 || convertedText.charAt(currentPos - 1) == "\n" || convertedText.charAt(currentPos - 1) == ">" ){
                                                //Set our Reference Position to Next Position in string
                                                refPos = currentPos + 1;
        
                                                //Set count of = settings to 1
                                                counter = 1;
                                                
                                                //WHILE Current Character is =
                                                while(convertedText.charAt(refPos) == "="){
                                                        //Increment Counter and Move Cursor
                                                        counter = counter + 1;
                                                        refPos = refPos + 1;
                                                }                                       
                                                //Set Token to number of = that we have
                                                token = "";
                                                for(tokenPos = 0; tokenPos <lt; counter; tokenPos++){
                                                        token = token + "=";
                                                }
                                                
                                                //See if we can find an ending token
                                                secondPos = convertedText.indexOf(toHtml.match[token], currentPos + token.length);
        
                                                //IF there is a matching pair of this item
                                                if(secondPos > -1){
                                                        //Replace First Part
                                                        convertedText = convertedText.substring(0,currentPos) +
                                                                        toHtml.start[token] + 
                                                                        convertedText.substring((currentPos + token.length),convertedText.length+1);
        
                                                        //Get Position of Ending Part
                                                        secondPos = convertedText.indexOf(toHtml.match[token],currentPos + 1);
                                                        
                                                        //Replace Second Part (ending token)
                                                        token = toHtml.match[token];
                                                        convertedText = convertedText.substring(0,secondPos) +
                                                                        toHtml.end[token] + 
                                                                        convertedText.substring((secondPos + token.length),convertedText.length+1);                                                             
                                                }
                                        }
                                        break;
                                case 10: //Case - Hyphen posible Horizontal Line
                                        //Quick Test is to check if last position was a newline
                                        if(currentPos == 0 || convertedText.charAt(currentPos - 1) == "\n"){
                                                
                                                //Identify This Current Line of text
                                                secondPos = convertedText.indexOf("\n", currentPos);
                                                currentLine = convertedText.substring(currentPos, secondPos);
                                                                        
                                                //IF this is meant to be a horizontal line
                                                if(currentLine == "----"){
                                                        //Change Hyphens to Proper Tag in Converted Text
                                                        convertedText = convertedText.substring(0,currentPos) +
                                                                    "<lt;hr />" + 
                                                                        convertedText.substring((secondPos),convertedText.length+1);    
                                                }
                                        
                                        }
                                        break;
                                default: 
                                        alert("Unhandled Token Case");
                                }
                        }//END SWITCH On Token
                }//END FOR Every Token Key
                
                //Set flag to not Found
                found = false;
                
                //Increment Position in String
                currentPos = currentPos + 1;
                
        }//WHILE There is More to Convert

        //While We have to close out a stack item
        while(convStack.length > 0){
                convertedText = convertedText + toHtml.end[convStack[convStack.length -1]];
                convStack.pop();
        }


        //Do a force Convert of New Lines Manually 
        convertedText = convertedText.replace(/<lt;!--\n-->/mgi, "\n");
        convertedText = convertedText.replace(/<lt;!--<lt;p><lt;\/p>-->/mgi, "<lt;p><lt;/p>");
        convertedText = convertedText.replace(/\n/mgi, "<lt;!--\n-->");
        
        return convertedText;   
}

function unitTestSuite(){
        var testString = "";
        var answerString = "";

        /*** Build Table Starter ***/
        document.write("<lt;table border=\"1\"><lt;tr><lt;th>Test Name<lt;/th><lt;th>Success Status<lt;/th><lt;th>Extra Information<lt;/th><lt;/tr>");

        /***********Testing HTML 2 Wiki Conversion**********/
/*      
        //Testing Bold
        testString = "<lt;b>bold<lt;/b>";
        answerString = "'''bold'''";
        testString = convertWiki(testString);
        tableWrite("bold: ", (testString == answerString), " ");
        
        //Testing Italic
        testString = "<lt;i>test<lt;/i>";
        answerString = "''test''";
        testString = convertWiki(testString);
        tableWrite("italic: ",(testString == answerString), " ");
        
        //Testing Strong
        testString = "<lt;strong>test<lt;/strong>";
        answerString = "'''test'''";
        testString = convertWiki(testString);
        tableWrite("strong: ",(testString == answerString)," ");
        
        //Testing Emphasized
        testString = "<lt;em>test<lt;/em>";
        answerString = "''test''";
        testString = convertWiki(testString);
        tableWrite("em: ",(testString == answerString)," ");
        
        //Testing Headers Section
        testString = "<lt;h1>test<lt;/h1>";
        answerString = "=test=";
        testString = convertWiki(testString);
        tableWrite("header 1: ",(testString == answerString)," ");

        //Testing Headers Section
        testString = "<lt;h2>test<lt;/h2>";
        answerString = "==test==";
        testString = convertWiki(testString);
        tableWrite("header 2: ",(testString == answerString)," ");             
        
        //Testing Headers Section
        testString = "<lt;h3>test<lt;/h3>";
        answerString = "===test===";
        testString = convertWiki(testString);
        tableWrite("header 3: " , (testString == answerString)," ");

        //Testing Headers Section
        testString = "<lt;h4>test<lt;/h4>";
        answerString = "====test====";
        testString = convertWiki(testString);
        tableWrite("header 4: " , (testString == answerString)," ");

        //Testing Headers Section
        testString = "<lt;h5>test<lt;/h5>";
        answerString = "=====test=====";
        testString = convertWiki(testString);
        tableWrite("header 5: " , (testString == answerString)," ");

        //Testing Headers Section
        testString = "<lt;h6>test<lt;/h6>";
        answerString = "======test======";
        testString = convertWiki(testString);
        tableWrite("header 6: " , (testString == answerString)," ");
        
        //Testing Paragraphs
        testString = "<lt;p>test<lt;/p>";
        answerString = "\ntest\n";
        testString = convertWiki(testString);
        tableWrite("paragraph: " , (testString == answerString)," ");
        
        //Testing Breaks        
        testString = "<lt;br />test<lt;br />";
        answerString = "\ntest\n";
        testString = convertWiki(testString);
        tableWrite("breaks: " , (testString == answerString)," ");
        
        //Test Pre Tags
        testString = "<lt;pre><lt;b>test<lt;/b><lt;/pre><lt;b>test 2<lt;/b>";
        answerString = "<lt;pre><lt;b>test<lt;/b><lt;/pre>'''test 2'''";
        testString = convertWiki(testString);
        tableWrite("Pre Tags: " , (testString == answerString)," ");   
        
        //Testing Simple Table
        testString = "<lt;table><lt;tr><lt;td>a<lt;/td><lt;td>b<lt;/td><lt;/tr><lt;/table>";
        answerString = "{|\n|-\n|a\n|b\n|}\n";
        testString = convertWiki(testString);
        tableWrite("Simple Table: ", (testString == answerString), (testString + "\n" + answerString));

        //Testing Table with Caption
        testString = "<lt;table><lt;caption>fucksticks<lt;/caption><lt;tr><lt;td>a<lt;/td><lt;td>b<lt;/td><lt;/tr><lt;/table>";
        answerString = "{|\n|+fucksticks\n|-\n|a\n|b\n|}\n";
        testString = convertWiki(testString);
        tableWrite("Table with Caption: ", (testString == answerString), testString);
*/

        /***********Testing Wiki 2 HTML Conversion**********/
/*
        //Testing Hyphens
        testString = "----\na----\n----\n";
        answerString = "<lt;hr />\na----\n<lt;hr />\n";
        testString = convertHTML(testString);
        tableWrite("hyphens: " , (testString == answerString)," ");

        
        //Testing Bold
        testString = "'''bold'''";
        answerString = "<lt;b>bold<lt;/b>";
        testString = convertHTML(testString);
        tableWrite("bold: " , (testString == answerString)," ");
        
        //Testing Italic
        testString = "''test''";
        answerString = "<lt;i>test<lt;/i>";
        testString = convertHTML(testString);
        tableWrite("italic: " , (testString == answerString)," ");
        
        //Testing Headers Section
        testString = "=test=";
        answerString = "<lt;h1>test<lt;/h1>";
        testString = convertHTML(testString);
        tableWrite("header 1: " , (testString == answerString)," ");

        //Testing Headers Section
        testString = "==test==";
        answerString = "<lt;h2>test<lt;/h2>";
        testString = convertHTML(testString);
        tableWrite("header 2: " , (testString == answerString)," ");           
        
        //Testing Headers Section
        testString = "===test===";
        answerString = "<lt;h3>test<lt;/h3>";
        testString = convertHTML(testString);
        tableWrite("header 3: " , (testString == answerString)," ");

        //Testing Headers Section
        testString = "====test====";
        answerString = "<lt;h4>test<lt;/h4>";
        testString = convertHTML(testString);
        tableWrite("header 4: " , (testString == answerString)," ");

        //Testing Headers Section
        testString = "=====test=====";
        answerString = "<lt;h5>test<lt;/h5>";
        testString = convertHTML(testString);
        tableWrite("header 5: " , (testString == answerString)," ");

        //Testing Headers Section
        testString = "======test======";
        answerString = "<lt;h6>test<lt;/h6>";
        testString = convertHTML(testString);
        tableWrite("header 6: " , (testString == answerString)," ");
        
        //Testing Paragraphs
        testString = "\ntest\n\n";
        answerString = "<lt;p>test<lt;/p>";
        testString = convertHTML(testString);
        tableWrite("paragraph: " , (testString == answerString)," ");
        
        //Testing Breaks        
        testString = "\ntest\n";
        answerString = "<lt;br />test<lt;br />";
        testString = convertHTML(testString);
        tableWrite("breaks: " , (testString == answerString)," ");
        
        //Test Pre Tags
        testString = "<lt;pre>'''test'''<lt;/pre>'''test 2'''";
        answerString = "<lt;pre>'''test'''<lt;/pre><lt;b>test 2<lt;/b>";
        testString = convertHTML(testString);
        tableWrite("Pre Tags: " , (testString == answerString)," ");   

        //Testing Simple Table
        testString = "{| border=\"1\"\n|-\n|a\n|b\n|}\n";
        answerString = "<lt;table border=\"1\"><lt;tr><lt;td>a<lt;/td><lt;td>b<lt;/td><lt;/tr><lt;/table>";
        testString = convertHTML(testString);
        tableWrite("Simple Table: " , (testString == answerString), (testString + "\n" + answerString));

        testString = "{| border=\"1\"\n|style=\"background: #00AA00\"|a\n\n|a\n|b\n|}\n";
        answerString = "<lt;table border=\"1\"><lt;tr><lt;td style=\"background: #00AA00\">a\n\n<lt;/td><lt;td>a\n<lt;/td><lt;td>b\n<lt;/td><lt;/tr><lt;/table>";
        testString = convertHTML(testString);
        tableWrite("Table Without Row Identifier: " , (testString == answerString), (testString + "\n" + answerString));    
        
        //Testing Indents
        testString = ":test\n";
        answerString = "<lt;dl><lt;dd>test\n<lt;/dd><lt;/dl>\n";
        testString = convertHTML(testString);
        tableWrite("indents: ", (testString == answerString), testString);
        testString = ":1\n::2\n:::3\n";
        answerString = "<lt;dl><lt;dd>1\n<lt;dl><lt;dd>2\n<lt;dl><lt;dd>3\n<lt;/dd><lt;/dl>\n<lt;/dd><lt;/dl>\n<lt;/dd><lt;/dl>\n";
        testString = convertHTML(testString);
        tableWrite("indents more: ", (testString == answerString), testString);
        testString = ":1\n::2\n:3\n";
        answerString = "<lt;dl><lt;dd>1\n<lt;dl><lt;dd>2\n<lt;/dd><lt;/dl>\n<lt;/dd><lt;dd>3\n<lt;/dd><lt;/dl>\n";
        testString = convertHTML(testString);
        tableWrite("indents stacking: ", (testString == answerString), testString);   
        
        //Testing Numbered Lines/Lists
        testString = "#test\n";
        answerString = "<lt;ol><lt;li>test\n<lt;/li><lt;/ol>\n";
        testString = convertHTML(testString);
        tableWrite("numbering: ", (testString == answerString), testString);  
        testString = "#1\n##2\n###3\n";
        answerString = "<lt;ol><lt;li>1\n<lt;ol><lt;li>2\n<lt;ol><lt;li>3\n<lt;/li><lt;/ol>\n<lt;/li><lt;/ol>\n<lt;/li><lt;/ol>\n";
        testString = convertHTML(testString);
        tableWrite("more numbering: ", (testString == answerString), testString);     
        testString = "#1\n##2\n#3\n";
        answerString = "<lt;ol><lt;li>1\n<lt;ol><lt;li>2\n<lt;/li><lt;/ol>\n<lt;/li><lt;li>3\n<lt;/li><lt;/ol>\n";
        testString = convertHTML(testString);
        tableWrite("staggered numbering: ", (testString == answerString), testString);                

        //Testing Bulletted Lines/Lists
        testString = "*test\n";
        answerString = "<lt;ul><lt;li>test\n<lt;/li><lt;/ul>\n";
        testString = convertHTML(testString);
        tableWrite("bullets: ", (testString == answerString), testString);
        testString = "*1\n**2\n***3\n";
        answerString = "<lt;ul><lt;li>1\n<lt;ul><lt;li>2\n<lt;ul><lt;li>3\n<lt;/li><lt;/ul>\n<lt;/li><lt;/ul>\n<lt;/li><lt;/ul>\n";
        testString = convertHTML(testString);
        tableWrite("more bullets: ", (testString == answerString), testString);       
        testString = "*1\n**2\n*3\n";
        answerString = "<lt;ul><lt;li>1\n<lt;ul><lt;li>2\n<lt;/li><lt;/ul>\n<lt;/li><lt;li>3\n<lt;/li><lt;/ul>\n";
        testString = convertHTML(testString);
        tableWrite("staggered numbering: ", (testString == answerString), testString);        


        //Testing tony's Testing abilities
        testString = "*:test\n";
        answerString = "<lt;ul><lt;li><lt;dl><lt;dd>test\n<lt;/dd><lt;/dl>\n<lt;/li><lt;/ul>\n";
        testString = convertHTML(testString);
        tableWrite("mixed scenario: ", (testString == answerString), testString);     
        testString = "*:test\n*testline2\n";
        answerString = "<lt;ul><lt;li><lt;dl><lt;dd>test\n<lt;/dd><lt;/dl>\n<lt;/li><lt;li>testline2\n<lt;/li><lt;/ul>\n";
        testString = convertHTML(testString);
        tableWrite("mixed scenario: ", (testString == answerString), testString);     
 
        testString = ":{| border=\"1\"\n|-\n|'''a'''\n|b\n|}\n";
        answerString = "<lt;dl><lt;dd><lt;table border=\"1\"><lt;tr ><lt;td><lt;b>a<lt;/b><lt;/td><lt;td >b<lt;/td><lt;/tr><lt;/table><lt;/dd><lt;/dl>\n";
        testString = convertHTML(testString);
        tableWrite("Indented Table: ", (testString == answerString),(testString + "\n" + answerString));    

        
        testString = "[[link]]";
        answerString = "<lt;a href=\"link\">link<lt;/a>";
        testString = convertHTML(testString);
        tableWrite("basic link:" , (testString == answerString), testString); 
        
        testString = "[[image:star.gif|150x150px|center|thumb|'''caption''']]";
        answerString = "<lt;div class=\"center\"><lt;div class=\"thumbinner\"><lt;img alt=\"caption\" longdesc=\"/mediawiki/index.php/Image:Star.gif\" class=\"thumbimage\" src=\"/mediawiki/images/0/08/Star.gif\" width=\"150\" height=\"150\" /><lt;div class=\"thumbcaption\"><lt;div class=\"magnify\" style=\"float:right\"><lt;a href=\"/mediawiki/index.php/Image:Star.gif\" class=\"internal\" title=\"Enlarge\"><lt;img src=\"/mediawiki/skins/common/images/magnify-clip.png\" width=\"15\" height=\"11\" alt=\"\" /><lt;/a><lt;/div><lt;b>caption<lt;/b><lt;/div><lt;/div><lt;/div><lt;/div>";
        testString = convertHTML(testString);
        tableWrite("image:", (testString == answerString), testString);       

        //Table in Table Testing
        testString = "{| border=\"1\" cellpadding=\"5\" cellspacing=\"0\" align=\"center\"\n|+'''An example table'''\n|-\n! style=\"background:#efefef;\" | First header\n! colspan=\"2\" style=\"background:#ffdead;\" | Second header\n|-\n| upper left\n|  \n| rowspan=2 style=\"border-bottom:3px solid grey;\" valign=\"top\" |\nright side\n|-\n| style=\"border-bottom:3px solid grey;\" | lower left\n| style=\"border-bottom:3px solid grey;\" | lower middle\n|-\n| colspan=\"3\" align=\"center\" | \n{| border=\"0\"\n|+''Adv Table''\n|-\n| align=\"center\" width=\"150px\" | [[Image:Wiki.png]]\n| align=\"center\" width=\"150px\" | [[Image:Wiki.png]]\n|-\n| align=\"center\" colspan=\"2\" style=\"border-top:1px solid red; border-right:1px solid red; border-bottom:2px solid red; border-left:1px solid red;\" |\nTwo Wikimedia logos\n|}\n|}\n";
        answerString = "FAIL";
        testString = convertHTML(testString);
        tableWrite("Table in Table:", (testString == answerString), testString);      

        testString = "{| border=\"0\"\n|+''Adv Table''\n|-\n| align=\"center\" width=\"150px\" | [[Image:Wiki.png]]\n| align=\"center\" width=\"150px\" | [[Image:Wiki.png]]\n|-\n| align=\"center\" colspan=\"2\" style=\"border-top:1px solid red; border-right:1px solid red; border-bottom:2px solid red; border-left:1px solid red;\" |\nTwo Wikimedia logos\n|}\n";
        answerString = "FAIL";
        testString = convertHTML(testString);
        tableWrite("Advanced Table 2:", (testString == answerString), testString);    
*/      
        testString = "* John\n";
        answerString = "<lt;ul><lt;li> John<lt;/li><lt;/ul>";
        testExt = "whatever,seomthing,calendar";
        testString = convertWiki(convertHTML(testString, testExt), testExt);

        tableWrite("quick test:" , (testString == answerString), testString); 
alert(convertWiki(convertHTML('* one bullet\n::* two indent bullet\n:* one indent bullet\n* one bullet\n',testExt),testExt));   
        /*****Closing out Table information******/
        document.write("<lt;/table>");
        
}
function tableWrite(testName, successLevel, extraInfo){
        if(successLevel){
                document.write("<lt;tr><lt;td>" + testName + "<lt;/td>");
        }
        else{
                document.write("<lt;tr style=\"background: #FF0000\"><lt;td>" + testName + "<lt;/td>");
        }
        document.write("<lt;td>" + successLevel + "<lt;/td>");
        document.write("<lt;td>" + extraInfo + "<lt;/td><lt;/tr>");
}
function html2wikiTable(source, extensions){
        //Local Variables
        var ssbt = "";         //SubString Before Table
        var ssat = "";         //SubString After Table
        var table_string = ""; //The Table Being Converted
        var tempStr = "";      //Temporary String, will get used and abused
        var rowStr = "";       //Row String, used for Multi Parsing
        var firstPos = 0;      //First Position before the Table
        var secondPos = 0;     //Second Position after the table
        var rowBegin = 0;      //Beginning of Row of Data
        var rowEnd = 0;        //End of Row of Data
        var dataFirst = 0;
        var dataSecond = 0;
        var dataEnd = 0;
        var newLine = "";
        
        /***********Main Body************/

        //Identify Sections of the String
        firstPos = source.indexOf("<lt;table");
        secondPos = source.indexOf("<lt;/table>") + 8;

        //Section off the Source String
        ssbt = source.substring(0,firstPos);
        table_string = source.substring(firstPos,secondPos);
        ssat = source.substring(secondPos);
        
        //Split out Table Properties
        firstPos = table_string.indexOf("<lt;table");
        secondPos = table_string.indexOf(">",firstPos);
        tempStr = table_string.substring(firstPos, secondPos);
        tempStr = tempStr.replace(/<lt;table/,"");
        if(tempStr.charAt(0) == " "){
                tempStr = tempStr.substring(1, tempStr.length + 1);
        }

        //Convert Table Properties
        table_string = table_string.replace(/<lt;table(.*?)>/,"{|" + tempStr);

        //Convert Caption if it Exists
        table_string = table_string.replace(/<lt;caption>(.*?)<lt;\/caption>/,"|+$1\n");


        //WHILE There are Table Rows to Setup
        while(table_string.indexOf("<lt;tr")>-1){
                tempStr = "";
                rowStr = "";          
                //Break Up Current Row into Row Settings and Row Data
                //<lt;tr(row settings)>(row data)<lt;/tr>
                firstPos = table_string.indexOf("<lt;tr") + 3;
                secondPos = table_string.indexOf(">", firstPos);
                tempStr = table_string.substring(firstPos,secondPos);
                rowBegin = secondPos + 1;
                rowEnd = table_string.indexOf("<lt;/tr>");
                rowStr = table_string.substring(rowBegin,rowEnd);

                
        
                //WHILE There are Table Headers
                while(rowStr.indexOf("<lt;th") > -1){
                        dataFirst = rowStr.indexOf("<lt;th");
                        dataSecond = rowStr.indexOf(">", dataFirst);
                        dataEnd = rowStr.indexOf("<lt;/th>", dataFirst);                        
                        if(rowStr.charAt(dataFirst+3) == " "){
                                rowStr = rowStr.substring(0, dataFirst+3) + rowStr.substring(dataFirst+4, rowStr.length + 1);
                                dataSecond = rowStr.indexOf(">", dataFirst);
                                dataEnd = rowStr.indexOf("<lt;/th>", dataFirst);        

                        }                               
        
                        if(rowStr.charAt(dataEnd-1) != "\n"){
                                newLine = "\n"
                        }
                        else{
                                newLine = "";
                        }

                        //IF There are Cell Properites
                        if(rowStr.substring(dataFirst+3,dataSecond) != ""){
                        
                                //Grab Settings and put it in the format
                                // ! Settings | Data \n
                                rowStr = rowStr.substring(0, dataFirst) + "!" +
                                         rowStr.substring(dataFirst+3, dataSecond) + "|" +
                                         convertWiki(rowStr.substring(dataSecond + 1, dataEnd), extensions) + newLine+
                                         rowStr.substring(dataEnd + 5, rowStr.length + 1);
                                //rowStr = rowStr.replace(/<lt;th(.*?)>(.*?)<lt;\/th>/,"!$1|$2\n");                               

                        }
                        else{
                                rowStr = rowStr.substring(0, dataFirst) + "!" +
                                         convertWiki(rowStr.substring(dataSecond + 1, dataEnd), extensions) + newLine +
                                         rowStr.substring(dataEnd + 5, rowStr.length + 1);                              
                                //rowStr = rowStr.replace(/<lt;th>(.*?)<lt;\/th>/,"!$1\n");                               
                        }
        
                }//END While There are Table Headers

                //WHILE There are Table Data Cells
                while(rowStr.indexOf("<lt;td") > -1){
                        dataFirst = rowStr.indexOf("<lt;td");
                        dataSecond = rowStr.indexOf(">", dataFirst);
                        dataEnd = rowStr.indexOf("<lt;/td>", dataFirst);
                        if(rowStr.charAt(dataFirst+3) == " "){
                                rowStr = rowStr.substring(0, dataFirst+3) + rowStr.substring(dataFirst+4, rowStr.length + 1);
                                dataSecond = rowStr.indexOf(">", dataFirst);
                                dataEnd = rowStr.indexOf("<lt;/td>", dataFirst);

                        }       

                        if(rowStr.charAt(dataEnd-1) != "\n"){
                                newLine = "\n"
                        }
                        else{
                                newLine = "";
                        }

                        //IF There are Cell Properites
                        if(rowStr.substring(dataFirst+3,dataSecond) != ""){
                                rowStr = rowStr.substring(0, dataFirst) + "|" +
                                         rowStr.substring(dataFirst+3, dataSecond) + "|" +
                                         convertWiki(rowStr.substring(dataSecond + 1, dataEnd), extensions) + newLine +
                                         rowStr.substring(dataEnd + 5, rowStr.length + 1);
                                //rowStr = rowStr.replace(/<lt;td(.*?)>(.*?)<lt;\/td>/, "|$1|$2\n");              
                        }
                        else{
                                rowStr = rowStr.substring(0, dataFirst) + "|" +
                                         convertWiki(rowStr.substring(dataSecond + 1, dataEnd), extensions) + newLine +
                                         rowStr.substring(dataEnd + 5, rowStr.length + 1);                                                              
                                //rowStr = rowStr.replace(/<lt;td>(.*?)<lt;\/td>/,"|$1\n");                               
                        }                       

                }//END While There are Table Data Cells         


                //Reinsert Blank Data Cells
                rowStr = rowStr.replace(/\|\|\|\|/g,"|| ||");
                
                //Rebuild the Table String with Modified Data
                //Rebuild the table row without the Table Row Tags
                table_string = table_string.substring(0, firstPos - 3) + "|-" + tempStr + "\n" + rowStr +
                               table_string.substring(rowEnd+5, table_string.length + 1);
               
                //table_string =  table_string.replace(/<lt;tr(.*?)>(.*?)<lt;\/tr>/, "|-" + tempStr + "\n" + rowStr);

        }//END While There are Table

        //Close Table Table Out
        table_string = table_string.replace(/<lt;\/table>/,"|}");
        table_string = table_string.replace(/<lt;tbody>/g, "");
        table_string = table_string.replace(/<lt;\/tbody>/g, "");
                
        //Remove all ">" symbols
        //table_string = table_string.replace(/>/g,"");    

        //Return the Converted String
        return ssbt + table_string + ssat;
}
function wiki2htmlTable(source, extensions){

        //Local Variables
        var ssbt = "";         //SubString Before Table
        var ssat = "";         //SubString After Table
        var table_string = ""; //The Table Being Converted
        var tempStr = "";      //Temporary String, will get used and abused
        var firstPos = 0;      //First Position before the Table
        var secondPos = 0;     //Second Position after the table
        var thirdPos = 0;      //Special variable Used for Reformatting Rows
        var tempPos = 0;       //Temporary Position
        var testPos = 0;       //Position for Testing Locations
        var rowStr = "";       //Variable to Checking for Multiple Tables
        var inRow = false;     //Whether we are currently in a row
        var endCase = false;   //End Case when the system 

        /***********Main Body************/

        //Set up Table String
        firstPos = source.indexOf("{|");
        secondPos = source.indexOf("|}") + 2; //Shifted 2 for end of table chars
        ssbt = source.substring(0,firstPos);
        table_string = source.substring(firstPos,secondPos);
        ssat = source.substring(secondPos,source.length);
        table_string = table_string.replace(/\n(\s*)\|/mgi, "\n|");
        //Convert Table Properties
        table_string = table_string.replace(/{\|(.*?)\n/,"<lt;table $1>\n");
        
        //Close Out the Table
        table_string = table_string.replace(/\|}/,"<lt;/table>");
        
        
        //Check for and Process Caption Tag if Exists in the right place
        firstPos = table_string.indexOf("\n");
        if(table_string.indexOf("|+") == (firstPos + 1)){

                secondPos = table_string.indexOf("\n", firstPos+1);
                tempStr = table_string.substring(firstPos + 3, secondPos);
                tempStr = convertHTML(tempStr, extensions);
                table_string = table_string.substring(0,firstPos+1) + "<lt;caption>" 
                               + tempStr + "<lt;/caption>" 
                               + table_string.substring(secondPos, table_string.length+1);
                firstPos = table_string.indexOf("<lt;/caption>") + 10;

        }

        //WHILE There are Newlines before End of Table
        thirdPos = table_string.indexOf("<lt;/table>", table_string.length - 10);
        while(thirdPos != (firstPos + 1) && !endCase){

                //Parse and send every line into Data Formatter Method
                secondPos = table_string.indexOf("\n", firstPos + 1);
                tempStr = table_string.substring(firstPos + 1, secondPos+1);

                //IF the line doesn't start with a | or a ! 
                if(tempStr.charAt(0) != '|' && tempStr.charAt(0) != '!'){

                        //Get position of next \n| starting at 2nd pos
                        tempPos = table_string.indexOf("\n|", secondPos);
                        if(tempPos == -1){
                                tempPos = 0;
                        }
                        //Get Position of next \n! starting at 2nd pos
                        testPos = table_string.indexOf("\n!", secondPos)
                        if(testPos <lt; tempPos && testPos > -1){
                                tempPos = testPos;
                        }
                
                        //IF we haven't found a suitable end to the string
                        if(tempPos == 0){
                                tempPos = thirdPos;
                                endCase = true;
                        }
                
                        //Adjust length of tempString to include the new data
                        secondPos = tempPos;
                        firstPos++;
                        tempStr = table_string.substring(firstPos, secondPos);


                        //Insert data into Appropiate Place
                        tempPos = table_string.indexOf("<lt;/td>", firstPos - 10);
                        if(tempPos == -1){
                                tempPos = table_string.indexOf("<lt;/th>", firstPos - 10);
                        }
                
                        //Insert Temporary String into Location
                        tempStr = convertHTML(tempStr);
                        table_string = table_string.substring(0,tempPos) 
                                                   + tempStr
                                                   + table_string.substring(tempPos, firstPos)
                                                   + table_string.substring(secondPos, table_string.length+1);                  
                        
                }
                else{ //Must Begin with Proper Line Character Setup

                        //IF Temp Str isn't a Table Row
                        if(tempStr.indexOf("|-") != 0){
                                //Convert the Currentline into proper format
                                tempStr = wiki2htmlRowLine(tempStr, extensions);
                                
                                //IF We aren't in a Table Row
                                if(!inRow){
                                        //Add on to the Temp String at beginning to start a row
                                        tempStr = "<lt;tr>" + tempStr;
                                        
                                        //Say we are in a Row
                                        inRow = true;
                                }

                        }
                        else{ // Current Line is a Table Row
                                //Close Out Previous Table Row
                                //IF Currently in a row
                                if(inRow){
                                        //Convert Rest of Line into Proper format
                                        tempPos = tempStr.indexOf("|-");
                                        testPos = tempStr.indexOf("\n");
                                        tempStr = "<lt;/tr><lt;tr " + tempStr.substring(0,tempPos) 
                                                   + tempStr.substring(tempPos+2, testPos) + ">";

                                }
                                else{
                                                
                                        //Convert Rest of Line into Proper format
                                        tempPos = tempStr.indexOf("|-");
                                        testPos = tempStr.indexOf("\n");
                                        tempStr = "<lt;tr " + tempStr.substring(0,tempPos) 
                                                   + tempStr.substring(tempPos+2, testPos) + ">";

                                        
                                        //Set In row to true
                                        inRow = true;
                                        
                                }
                                
                        }//END IF Current Line isn't a Table Row

                        //Insert Temporary String into Location
                        tempStr = convertHTML(tempStr, extensions);
                        table_string = table_string.substring(0,firstPos+1) 
                                                   + tempStr
                                                   + table_string.substring(secondPos + 1, table_string.length+1);                      
                        
                }//END IF this begins with a proper character

                //Move Cursor Forwards                     
                firstPos = firstPos + tempStr.length;
                thirdPos = table_string.indexOf("<lt;/table>", table_string.length - 10);                               

        }//END WHILE More LInes to Convert
        
        //IF We are Still in a Table Row
        if(inRow){
                //Close out Table Row
                table_string = table_string.substring(0,thirdPos) 
                           + "<lt;/tr>"
                           + table_string.substring(thirdPos, table_string.length+1);
        }//END IF We Are still in a table row
        
        //Clean up of Any Extraneous Spaces
        table_string = table_string.replace(/<lt;tr >/g, "<lt;tr>");
        table_string = table_string.replace(/<lt;td >/g, "<lt;td>");
        table_string = table_string.replace(/<lt;th >/g, "<lt;th>");

        //Return the Converted String
        return ssbt + table_string + ssat;
}
function wiki2htmlRowLine(source, extensions){
        //Local Constants
        var rowToken = {};
        rowToken.start = {};
        rowToken.start[1] = '|';
        rowToken.start[2] = '!';
        rowToken.data = {};
        rowToken.data[1] = '|';
        rowToken.data[2] = '|';
        rowToken.end = {};
        rowToken.end[1] = "||";
        rowToken.end[2] = "!!";
        rowToken.end[3] = "\n";
        

        //Local Variables
        var currentPos = 0;      //Position in the Line we are on
        var convText = "";       //Text that has been converted
        var strSettings = "";
        var strData = "";       
        var startToken = 0;
        var endToken = 0;
        var endPos = 0;          //End Position
        var dataPos = 0;         //Position for Data Element
        var tempPos = 0;
        var refPos = 0;
        
        /**********Main Body***************/

        //WHILE End Token is not newline character
        while(endToken != 3){
                //Reset End Token
                endToken = 0;  
                
                //Figure out which starter we have
                if(source.charAt(currentPos) == rowToken.start[1]){
                        startToken = 1;
                }
                else if(source.charAt(currentPos) == rowToken.start[2]){
                        startToken = 2;
                }
                //Figure out which end token we have (that's closest)
                endPos = source.indexOf(rowToken.end[1], currentPos + 1);
                if(endPos > -1){
                        endToken = 1;
                }
                tempPos = source.indexOf(rowToken.end[2], currentPos + 1);
                if(tempPos > -1 && (tempPos <lt; endPos || endPos == -1)){
                        endPos = tempPos;
                        endToken = 2;
                }               
                tempPos = source.indexOf(rowToken.end[3], currentPos + 1);
                if(tempPos > -1 && tempPos <lt; endPos){
                        endPos = tempPos;
                        endToken = 3;
                }
                //IF No End Token Found
                if(endToken == 0){
                        endPos = source.length;
                        endToken = 3;
                }               
                //Figure out if we have a Settings/Data Split
                dataPos = source.indexOf(rowToken.data[startToken], currentPos + 1);
                
                //WHILE the matching | is in a link
                tempPos = source.indexOf("[[", currentPos);

                while(tempPos > -1 && dataPos > -1  && tempPos <lt; dataPos){
                        refPos = dataPos;
                        //Move the Cursor further along in the list
                        dataPos = source.indexOf(rowToken.data[startToken], dataPos + 1);
                        tempPos = source.indexOf("[[", refPos);
                }
                if(dataPos > -1 && source.charAt(dataPos + 1) != "|"){
                        strData = source.substring(dataPos + 1, endPos);
                        strData = convertHTML(strData, extensions);
                        strSettings = source.substring(currentPos+1,dataPos);
                }
                else {
                        strData = source.substring(currentPos + 1, endPos);
                        strData = convertHTML(strData, extensions);
                }
                //IF We have Table data Section
                if(startToken == 1){
                        convText = convText + "<lt;td " + strSettings + ">"
                                   + strData + "<lt;/td>";
                }
                //ELSE IF We have Table Header Section
                else if(startToken == 2){
                        convText = convText + "<lt;th " + strSettings + ">"
                                   + strData + "<lt;/th>";                      
                }
                //Move Cursor to End Position + 1
                currentPos = endPos + 1;
        }//END WHILE End Token is not a newline character
        
        //RETURN Converted Text
        return convText;
                
}
// Ultimate client-side JavaScript client sniff.
// (C) Netscape Communications 1998.  Permission granted to reuse and distribute.
// Revised 20 April 98 to add is.nav4up and is.ie4up (see below).

// Everything you always wanted to know about your JavaScript client
// but were afraid to ask ... "Is" is the constructor function for "is" object, 
// which has properties indicating:
// (1) browser vendor:
//     is.nav, is.ie, is.opera
// (2) browser version number:
//     is.major (integer indicating major version number: 2, 3, 4 ...)
//     is.minor (float   indicating full  version number: 2.02, 3.01, 4.04 ...) 
// (3) browser vendor AND major version number
//     is.nav2, is.nav3, is.nav4, is.nav4up, is.ie3, is.ie4, is.ie4up
// (4) JavaScript version number:
//     is.js (float indicating full JavaScript version number: 1, 1.1, 1.2 ...)
// (5) OS platform and version:
//     is.win, is.win16, is.win32, is.win31, is.win95, is.winnt, is.win98
//     is.os2
//     is.mac, is.mac68k, is.macppc
//     is.unix
//        is.sun, is.sun4, is.sun5, is.suni86
//        is.irix, is.irix5, is.irix6 
//        is.hpux, is.hpux9, is.hpux10
//        is.aix, is.aix1, is.aix2, is.aix3, is.aix4  
//        is.linux, is.sco, is.unixware, is.mpras, is.reliant  
//        is.dec, is.sinix, is.freebsd, is.bsd 
//     is.vms
//
// See http://www.it97.de/JavaScript/JS_tutorial/obj_hierarchy/navobjFr.html
// for a detailed list of userAgent strings.
//
// Note: you don't want your Nav4 or IE4 code to "turn off" or
// stop working when Nav5 and IE5 (or later) are released, so
// in conditional code forks, use is.nav4up ("Nav4 or greater")
// and is.ie4up ("IE4 or greater") instead of is.nav4 or is.ie4
// to check version in code which you want to work on future 
// versions.

        
function Is ()
{   // convert all characters to lowercase to simplify testing
    var agt=navigator.userAgent.toLowerCase()

    // *** BROWSER VERSION ***
    this.major = parseInt(navigator.appVersion)
    this.minor = parseFloat(navigator.appVersion)

    this.nav  = ((agt.indexOf('mozilla')!=-1) && ((agt.indexOf('spoofer')==-1)
                && (agt.indexOf('compatible') == -1)))
    this.nav2 = (this.nav && (this.major == 2))
    this.nav3 = (this.nav && (this.major == 3))
    this.nav4 = (this.nav && (this.major == 4))
    this.nav4up = this.nav && (this.major >= 4)
    this.navonly      = (this.nav && (agt.indexOf(";nav") != -1))

    this.ie   = (agt.indexOf("msie") != -1)
    this.ie3  = (this.ie && (this.major == 2))
    this.ie4  = (this.ie && (this.major == 4))
    this.ie4up  = this.ie  && (this.major >= 4)

    this.opera = (agt.indexOf("opera") != -1)
     
    // *** JAVASCRIPT VERSION CHECK *** 
    // Useful to workaround Nav3 bug in which Nav3 
    // loads <lt;SCRIPT LANGUAGE="JavaScript1.2">.
    if (this.nav2 || this.ie3) this.js = 1.0
    else if (this.nav3 || this.opera) this.js = 1.1
    else if (this.nav4 || this.ie4) this.js = 1.2
    // NOTE: In the future, update this code when newer versions of JS 
    // are released. For now, we try to provide some upward compatibility 
    // so that future versions of Nav and IE will show they are at 
    // *least* JS 1.2 capable. Always check for JS version compatibility 
    // with > or >=.
    else if ((this.nav && (this.minor > 4.05)) || (this.ie && (this.major > 4))) 
         this.js = 1.2
    else this.js = 0.0 // HACK: always check for JS version with > or >=

    // *** PLATFORM ***
    this.win   = ( (agt.indexOf("win")!=-1) || (agt.indexOf("16bit")!=-1) )
    // NOTE: On Opera 3.0, the userAgent string includes "Windows 95/NT4" on all
    //        Win32, so you can't distinguish between Win95 and WinNT.
    this.win95 = ((agt.indexOf("win95")!=-1) || (agt.indexOf("windows 95")!=-1))

    // is this a 16 bit compiled version?
    this.win16 = ((agt.indexOf("win16")!=-1)
               || (agt.indexOf("16bit")!=-1) || (agt.indexOf("windows 3.1")!=-1)
               || (agt.indexOf("windows 16-bit")!=-1) )  

    this.win31 = (agt.indexOf("windows 3.1")!=-1) || (agt.indexOf("win16")!=-1) ||
                 (agt.indexOf("windows 16-bit")!=-1)

    // NOTE: Reliable detection of Win98 may not be possible. It appears that:
    //       - On Nav 4.x and before you'll get plain "Windows" in userAgent.
    //       - On Mercury client, the 32-bit version will return "Win98", but
    //         the 16-bit version running on Win98 will still return "Win95".
    this.win98 = ((agt.indexOf("win98")!=-1)||(agt.indexOf("windows 98")!=-1))
    this.winnt = ((agt.indexOf("winnt")!=-1)||(agt.indexOf("windows nt")!=-1))
    this.win32 = this.win95 || this.winnt || this.win98 || 
                 ((this.major >= 4) && (navigator.platform == "Win32")) ||
                 (agt.indexOf("win32")!=-1) || (agt.indexOf("32bit")!=-1)

    this.os2   = (agt.indexOf("os/2")!=-1) 
                 || (navigator.appVersion.indexOf("OS/2")!=-1)  
                 || (agt.indexOf("ibm-webexplorer")!=-1)

    this.mac    = (agt.indexOf("mac")!=-1)
    this.mac68k = this.mac && ((agt.indexOf("68k")!=-1) || 
                               (agt.indexOf("68000")!=-1))
    this.macppc = this.mac && ((agt.indexOf("ppc")!=-1) || 
                               (agt.indexOf("powerpc")!=-1))

    this.sun   = (agt.indexOf("sunos")!=-1)
    this.sun4  = (agt.indexOf("sunos 4")!=-1)
    this.sun5  = (agt.indexOf("sunos 5")!=-1)
    this.suni86= this.sun && (agt.indexOf("i86")!=-1)
    this.irix  = (agt.indexOf("irix") !=-1)    // SGI
    this.irix5 = (agt.indexOf("irix 5") !=-1)
    this.irix6 = ((agt.indexOf("irix 6") !=-1) || (agt.indexOf("irix6") !=-1))
    this.hpux  = (agt.indexOf("hp-ux")!=-1)
    this.hpux9 = this.hpux && (agt.indexOf("09.")!=-1)
    this.hpux10= this.hpux && (agt.indexOf("10.")!=-1)
    this.aix   = (agt.indexOf("aix")  !=-1)      // IBM
    this.aix1  = (agt.indexOf("aix 1")  !=-1)    
    this.aix2  = (agt.indexOf("aix 2")  !=-1)    
    this.aix3  = (agt.indexOf("aix 3")  !=-1)    
    this.aix4  = (agt.indexOf("aix 4")  !=-1)    
    this.linux = (agt.indexOf("inux")!=-1)
    this.sco   = (agt.indexOf("sco")!=-1) || (agt.indexOf("unix_sv")!=-1)
    this.unixware = (agt.indexOf("unix_system_v")!=-1) 
    this.mpras    = (agt.indexOf("ncr")!=-1) 
    this.reliant  = (agt.indexOf("reliantunix")!=-1)
    this.dec   = (agt.indexOf("dec")!=-1) || (agt.indexOf("osf1")!=-1) 
           || (agt.indexOf("dec_alpha")!=-1) || (agt.indexOf("alphaserver")!=-1) 
           || (agt.indexOf("ultrix")!=-1) || (agt.indexOf("alphastation")!=-1) 
    this.sinix = (agt.indexOf("sinix")!=-1)
    this.freebsd = (agt.indexOf("freebsd")!=-1)
    this.bsd = (agt.indexOf("bsd")!=-1)
    this.unix  = (agt.indexOf("x11")!=-1) || this.sun || this.irix || this.hpux || 
                 this.sco ||this.unixware || this.mpras || this.reliant || 
                 this.dec || this.sinix || this.aix || this.linux || this.freebsd

    this.vms   = (agt.indexOf("vax")!=-1) || (agt.indexOf("openvms")!=-1)
}
 
 
 
// Tony, need to replace assertwiki() as well.

function assertwiki() {    // This object is used for unit tests. See example below for usage.
  var ishtml=1; //((print+"").indexOf("native code")>20);
  var ut={};
  var ut_ac={};
  var msgall="";

  this.sethtml = function() { ishtml=1; };
  this.add = function(key, ac, ac2) {
    if(key in ut) printit("["+key+"] is redefined.","red");
    ut[key]=convertWiki(convertHTML(ac+'\n','something,kw_include_file,calendar,yay'), 'something,kw_include_file,calendar,yay');
    if(ac2==undefined) {
      ut_ac[key]=ac;
    } else {
      ut_ac[key]=ac2;
    }
  };
  this.run = function(wht, mode) {   // wht="all"/key,  mode=0-pass/fail, 1-pass/fail display fail, 2-summary, 3-verbose
    var ii, tot=0, pass=0;
    if(wht=='all') {
      for(ii in ut) {
         runit(ii);
      }
    } else {
      runit(wht);
    }
    printit(msgall+"Tests="+tot+" Pass="+pass+" FAIL="+(tot-pass)+(tot==pass?" ... clean Run":" >>>>>>> NOT CLEAN"),"green");

    // Done

    function runit(key) {
      var tpass=0;
      var utac_res, res,msg1,msg2,msg3;
      if(!(key in ut)) { printit("["+key+"] is not defined","red"); return; }
      tot++;

      if(typeof(ut[key])=='function') res=ut[key]();
                               else   res=ut[key];
      res=res.replace(/^\n/, "");
      res=res.replace(/\n$/, "");
      //res=res.replace(/ /g, "+");
      res=res.replace(/  border/, " border");   // bandaid for the tables
   
      if(typeof(ut_ac[key])=='function') utac_res=ut_ac[key]();
                                  else   utac_res=ut_ac[key];
      msg1=key+" ..... Expected: ["+utac_res+"]";

      // Execute algorithm
      if(typeof(res)=='string' || typeof(res)=='number' || typeof(res)=='boolean') {
        if(res==utac_res) tpass=1;
        msg2=key+" ....... Actual: ["+res+"]";
      } else {
        if(res instanceof Array) {
          var res2=res.join();
          if(res2==utac_res) tpass=1;
          msg2=key+" ....... Actual: ["+res2+"]";
        } else {
          msg2="["+key+"] returned an unknown type. Only String, Number, boolean or Array is allowed.";
        }
      }

      // Just display stuff
      msg3=key+" is a "+(tpass?"Pass":"FAIL!!!!!!!!");
      if(mode==3 || ( mode==1 && (!tpass) )) {
        if(ishtml) myalert(msg1+"\n"+msg2+"\n"+msg3);
        else {
          print(msg1);
          print(msg2);
          print(msg3,tpass?"blue":"red");
        }
      }
      if(mode==2) {
        msgall=msgall+msg3+"\n";
      }
      if(tpass)   pass++;

    }  // end runit
  };  // end .run

    function myalert(txt) {
      if(typeof(_halttrue)!='undefined') _haltalready();
      if(txt!=undefined) {
        if(!confirm(txt+"\n\nContinue?")) { _halttrue=1; _haltalready(); }
      }
    }

  function printit(txt, clr) {
    if(ishtml) myalert("Assert:\n"+txt);
         else  print(txt, clr);
  }

}  // end assert object 

var aa=new assertwiki();

// START OF TEST CASES Ver0.3b ==================================================

aa.add('bullet0', '=== h3 ===\n* 1b\n* 1b\n:: 2i\n: 1i\n=== ah ===\n* 1b\n::* 2ib\n:* 1ib\n* 1b\n== ah ==\n::* 2i\nplain\n::: 3i\n* 1b\n::* 2ib');
aa.add('bullet1', '=== heading 3 ===\n* one bullet\n* one bullet\n:: two indent\n: one indent');
aa.add('bullet2', '* one bullet\n::* two indent bullet\n:* one indent bullet\n* one bullet');
aa.add('bullet3', '* b\n:* ib\n::* iib\n:::* iiib\nnone\n: i\n:: ii\n::: iii\n::: iii\nnone\n::: iii\n:: ii\n* b\n::* iib');
aa.add('number',  '# one\n# two two\n#three\n# four\n\n#one\n: indent');

aa.add('boldpre', '<lt;b>bold<lt;/b>\n<lt;pre>text1\ntext2\n<lt;/pre>', "'''bold'''\n text1\n text2");
aa.add('newline', 'line1\nline2\n\nline3\n\n\nline3');
aa.add('linkwiki','text [[page/page | Text]] t"ex"t [[page]] text [[page#loc|text again]]\n* bullet');
aa.add('linkhtml',"text [http://www.intel%20%abc Text] t'ex't [https://www.intel] text\n");
aa.add('mailto'  ,'[mailto:john.intel@intel?subject=xplanner_1sttimeuser_request_access mailhere] text [mailto:john.intel@intel] text');

aa.add('basic',   "=head=\n* bullet\nline text\n: indent\n'''bold''' text ''italic'' text 'another text'");
aa.add('tableconv', '<lt;table><lt;tr><lt;td>data<lt;/td><lt;td>data1<lt;/td><lt;/tr><lt;tr><lt;td>data2<lt;/td><lt;td>data3<lt;/td><lt;/tr><lt;/table>', '{||-\n|data\n|data1\n|-\n|data2\n|data3\n|}');
aa.add('heading', '=head1 =\n*hello\n=Head1a=hello again\n==Head3 2 ==\nhello line 1\n===Head3 ===\n====Head4 ====\nhello\n====Head4a ====\nhello');
aa.add('media', '[[Media:Namespace_filename.ppt| hyperlink_text]]: outtext');

aa.add('tablebasic', '{| border="0"\n|-\n! Acronym \n! Definition\n|-\n| ATPG\n| Automated Test Pattern Generation\n|-\n| SAF\n| Stuck-at-fault\n|}');
aa.add('indentbullettable', '*line1\n::{| border="0"\n|-\n! Acronym \n! Definition\n|-\n | ATPG\n   | Automated Test Pattern Generation\n|-\n| SAF\n| Stuck-at-fault\n|}', '*line1\n::{| border="0"\n|-\n! Acronym \n! Definition\n|-\n| ATPG\n| Automated Test Pattern Generation\n|-\n| SAF\n| Stuck-at-fault\n|}');
aa.add('pre', '* Bullet\n pre\n pre\n: indent\n* bullet');
aa.add('pre2', '* a\n This is a pre\nnon-pre\n<lt;pre>\ninside pre box\n<lt;b>yo<lt;/b>\n<lt;/pre>','* a\n This is a pre\nnon-pre\n inside pre box\n <lt;b>yo<lt;/b>');
aa.add('comment', '*line\n<lt;'+'!-- comment\nend----'+'>\n*line2');
aa.add('3rdparty', '*line\n<lt;kw_include_file>yay&y=a<lt;/kw_include_file>\n*line');

aa.add('fontsize', '*line\n<lt;font size="+1"> Methodology & Planning<lt;/font>\n;hey');
aa.add('colonsemi', 'line\n; ATPG: try\n;ATPG\nyikes');
aa.add('indenttable1', '*line1\n:{| border="0"\n|-\n! Acronym \n! Definition\n|-\n|\n;ATPG\n: indent\n* bullet\n\n|}');

aa.add('nowiki', "* sentence <lt;nowiki>''''yay''''<lt;/nowiki>\n<lt;nowiki><lt;b>yay<lt;/b><lt;/nowiki>");
aa.add('twolink-a', '*[[Teams/TVPV/CTP|Nhm Carve the Pig]] / [https://dpgsites.intel.com/sites/BD_OAP_PDE/tvpv/Nehalem/CTP (Sharepoint)] : High level work assignments for Nhm');
aa.add('twolink-b', ';[https://dpgsites.intel.com/sites/BD_OAP_PDE/tvpv/Nehalem/CTP/FMEA_FoilsetColor_r6.pdf FMEA Training], [https://dpgsites.intel.com/sites/BD_OAP_PDE/tvpv/Nehalem/CTP/FMEA_template_excel_help.xls xls]: text after');
aa.add('one-linka', ':[https://dpgsites.intel.com/sites/BD_OAP_PDE/tvpv/Nehalem/CTP/TVPV%202006.mmap 2006 Team Structure & Release plan]');
aa.add('image', '; [[Image:apdfaq_xp1.jpg|frame|center| caption!!]] text\n* [[Image:apdfaq_xp1.jpg]] text\n::: [[Image:apdfaq_xp1.jpg| caption!!]]');
aa.add('italic_underline', '<lt;i>italic<lt;/i><lt;u>underline<lt;/u>\n<lt;blockquote>line1\nline2\n<lt;/blockquote><lt;'+'!-- comment --'+'>',"''italic''<lt;u>underline<lt;/u>\n<lt;blockquote>line1\nline2\n<lt;/blockquote><lt;"+"!-- comment --"+">");
aa.add('coloncolon', ": '''sub proj''': Put details here");
aa.add('tablespan', '{| border="1"\n|-\n! Head1\n! colspan="2"| Head2\n|-\n| ATPG\n|}');
aa.add('true type', "<lt;tt>true type<lt;/tt>\n");

aa.run("all",1);        // wht="all"/key,  mode=0-pass/fail, 1-pass/fail display fail, 2-summary, 3-verbose

//========================== END