/*
Html2Xhtml : Javascript Mini HTML to XHTML Parser 
--------------------------------------------------

Copyright ¨Ï 2006 All rights reserved. Jacob Lee <letsgolee@lycos.co.kr>

Free for noncommercial && commercial use.
*/
function getXHTML(data){
  return new Html2Xhtml(data).parse()
};

function Html2Xhtml(data){
  this.data=data||''
};

Html2Xhtml.prototype.setHTML=function(data){
  this.data=data||this.data
};

Html2Xhtml.prototype.parse=function(){
  var state=0;
  var xhtml='';
  var p=0;
  var unget=false;
  var tagname='';
  var attrname='';
  var attrval='';
  var quot='';
  var data=this.data;
  var len=data.length;
  var phpval='';
  var tagtype=0;
  var insidepre=false;
  while(1){
    if(p>=len&&!unget){
      return xhtml
    }
    if(unget){
      unget=false
    }else{
      var c=data.substr(p++,1)
    }
    switch(state){
      case 0:if(c=='<'){
        state=1;break
      }
      /* Tirei porque estava subtituindo      
      var cc=c.charCodeAt();
      if(Html2Xhtml.charEntities[cc]){
        xhtml+='&'+Html2Xhtml.charEntities[cc]+';'
      }else{
        xhtml+=c
      }*/
      xhtml+=c
      break;
      
      case 1:if(/[a-zA-Z]/.test(c)){
        state=2;
        tagtype=1;
        //tagname=c.toLowerCase();
        tagname=c;
        break
      }
      if(c=='/'){
        state=2;
        tagtype=-1;
        break
      }
      if(c=='!'){
        if(data.substr(p,2)=='--'){
          xhtml+='<!--';
          p+=2;
          state=9;
          break
        }
        xhtml+='<!';
        state=10;
        break
      }
      if(c=='?'){
        state=11;
        xhtml+='<'+'?';
        break
      }
      xhtml+='&lt;';
      unget=true;
      state=0;
      break;
      
      case 2:if(Html2Xhtml.isSpaceChar[c]){
        xhtml+=(!insidepre&&tagtype>0&&Html2Xhtml.hasNLBefore[tagname]&&xhtml.length&&xhtml.substr(xhtml.length-1,1)!='\n'?'\n':'')+(tagtype>0?'<':'</')+tagname;
        state=3;
        break
      }
      if(c=='/'){
        xhtml+=(!insidepre&&tagtype>0&&Html2Xhtml.hasNLBefore[tagname]&&xhtml.length&&xhtml.substr(xhtml.length-1,1)!='\n'?'\n':'')+(tagtype>0?'<':'</')+tagname;
        if(data.substr(p,1)!='>'){
          state=3;break
        }
        state=4;
        break
      }
      if(c=='>'){
        xhtml+=(!insidepre&&tagtype>0&&Html2Xhtml.hasNLBefore[tagname]&&xhtml.length&&xhtml.substr(xhtml.length-1,1)!='\n'?'\n':'')+(tagtype>0?'<':'</')+tagname;
        unget=true;
        state=4;
        break
      }
      //tagname+=c.toLowerCase();
      tagname+=c;
      break;
      
      case 3:if(Html2Xhtml.isSpaceChar[c]){
        break
      }
      if(c=='/'){
        if(data.substr(p,1)!='>'){
          break
        }
        state=4;
        break
      }
      if(c=='>'){
        unget=true;
        state=4;
        break
      }
      //attrname=c.toLowerCase();
      attrname=c;
      attrval='';
      state=5;
      break;
      
      case 4:xhtml+=(Html2Xhtml.isEmptyTag[tagname]?' />':'>')+(!insidepre&&tagtype<0&&Html2Xhtml.hasNLAfter[tagname]&&p<len&&data.substr(p,1)!='\n'?'\n':'');
      if(tagtype>0&&Html2Xhtml.dontAnalyzeContent[tagname]){
        state=13;
        attrname=attrval=quot='';
        tagtype=0;
        break
      }
      if(tagname=='pre'){
        insidepre=!insidepre
      }
      state=0;
      tagname=attrname=attrval=quot='';
      tagtype=0;
      break;
      
      case 5:if(Html2Xhtml.isSpaceChar[c]){
        xhtml+=' '+attrname;if(Html2Xhtml.isEmptyAttr[attrname]){
          xhtml+='="'+attrname+'"'
        }
        state=3;
        break
      }
      if(c=='/'){
        xhtml+=' '+attrname;
        if(Html2Xhtml.isEmptyAttr[attrname]){
          xhtml+='="'+attrname+'"'
        }
        if(data.substr(p,1)!='>'){
          state=3;
          break
        }
        state=4;
        break
      }
      if(c=='>'){
        xhtml+=' '+attrname;
        if(Html2Xhtml.isEmptyAttr[attrname]){
          xhtml+='="'+attrname+'"'
        }
        unget=true;
        state=4;
        break
      }
      if(c=='='){
        xhtml+=' '+attrname+'=';
        state=6;
        break
      }
      if(c=='"'||c=="'"){
        attrname+='?'
      }else{
        //attrname+=c.toLowerCase()
        attrname+=c
      }
      break;
      
      case 6:if(Html2Xhtml.isSpaceChar[c]){
        xhtml+=(Html2Xhtml.isEmptyAttr[attrname]?'"'+attrname+'"':'""');
        state=3;
        break
      }
      if(c=='>'){
        xhtml+=(Html2Xhtml.isEmptyAttr[attrname]?'"'+attrname+'"':'""');
        unget=true;
        state=4;
        break
      }
      if(c=='/'&&data.substr(p,1)=='>'){
        xhtml+=(Html2Xhtml.isEmptyAttr[attrname]?'"'+attrname+'"':'""');
        state=4;
        break
      }
      if(c=='"'||c=="'"){
        quot=c;state=8;break
      }
      attrval=c;
      state=7;
      break;
      
      case 7:if(Html2Xhtml.isSpaceChar[c]){
        xhtml+='"'+Html2Xhtml.escapeQuot(attrval,'"')+'"';state=3;break
      }
      if(c=='/'&&data.substr(p,1)=='>'){
        xhtml+='"'+Html2Xhtml.escapeQuot(attrval,'"')+'"';
        state=4;
        break
      }
      if(c=='>'){
        unget=true;
        xhtml+='"'+Html2Xhtml.escapeQuot(attrval,'"')+'"';
        state=4;
        break
      }
      attrval+=c;
      break;
      
      case 8:if(c==quot){
        xhtml+='"'+Html2Xhtml.escapeQuot(attrval,'"')+'"';
        state=3;
        break
      }
      attrval+=c;
      break;
      
      case 9:if(c=='-'&&data.substr(p,2)=='->'){
        p+=2;xhtml+='-->';
        state=0;
        break
      }
      xhtml+=c;
      break;
      
      case 10:if(c=='>'){
        state=0
      }
      xhtml+=c;
      break;
      
      case 11:if(c=="'"||c=='"'){
        quot=c;
        state=12;
        break
      }
      if(c=='?'&&data.substr(p,1)=='>'){
        state=0;
        xhtml+='?'+'>';
        p++;
        break
      }
      xhtml+=c;
      break;
      
      case 12:if(c==quot){
        state=11;
        xhtml+=quot+Html2Xhtml.escapeQuot(phpval,quot)+quot;
        phpval=quot='';break
      }
      phpval+=c;
      break;
      
      case 13:if(c=='<'&&data.substr(p,tagname.length+1).toLowerCase()=='/'+tagname){
        unget=true;
        state=0;
        tagname='';
        break
      }
      if(tagname=='textarea'){
        xhtml+=Html2Xhtml.escapeHTMLChar(c)
      }else{
        xhtml+=c
      }
      break
    }
  }
  return xhtml
};

Html2Xhtml.escapeQuot=function(str,quot){
  if(!quot){
    quot='"'
  }
  if(quot=='"'){
    return str.replace(/"/ig,'\\"')
  }
  return str.replace(/'/ig,"\\'")
};

Html2Xhtml.escapeHTMLChar=function(c){
  if(c=='&'){
    return'&amp;'
  }
  if(c=='<'){
    return'&lt;'
  }
  if(c=='>'){
    return'&gt;'
  }
  /* Tirei porque estava subtituindo
  var cc=c.charCodeAt();
  if(Html2Xhtml.charEntities[cc]){
    return'&'+Html2Xhtml.charEntities[cc]+';'
  }else{
    return c
  }*/
  return c 
};

Html2Xhtml.isSpaceChar={' ':1,'\r':1,'\n':1,'\t':1};
Html2Xhtml.isEmptyTag={'area':1,'base':1,'basefont':1,'br':1,'hr':1,'img':1,'input':1,'link':1,'meta':1,'param':1};
Html2Xhtml.isEmptyAttr={'checked':1,'compact':1,'declare':1,'defer':1,'disabled':1,'ismap':1,'multiple':1,'noresize':1,'nosave':1,'noshade':1,'nowrap':1,'readonly':1,'selected':1};
Html2Xhtml.hasNLBefore={'div':1,'p':1,'table':1,'tbody':1,'tr':1,'td':1,'th':1,'title':1,'head':1,'body':1,'script':1,'comment':1,'li':1,'meta':1,'h1':1,'h2':1,'h3':1,'h4':1,'h5':1,'h6':1,'hr':1,'ul':1,'ol':1,'option':1,'link':1};
Html2Xhtml.hasNLAfter={'html':1,'head':1,'body':1,'p':1,'th':1,'style':1};
Html2Xhtml.dontAnalyzeContent={'textarea':1,'script':1,'style':1};
Html2Xhtml.charEntities={
  160:'nbsp',
  161:'iexcl',
  162:'cent',
  163:'pound',
  164:'curren',
  165:'yen',
  166:'brvbar',
  167:'sect',
  168:'uml',
  169:'copy',
  170:'ordf',
  171:'laquo',
  172:'not',
  173:'shy',
  174:'reg',
  175:'macr',
  176:'deg',
  177:'plusmn',
  178:'sup2',
  179:'sup3',
  180:'acute',
  181:'micro',
  182:'para',
  183:'middot',
  184:'cedil',
  185:'sup1',
  186:'ordm',
  187:'raquo',
  188:'frac14',
  189:'frac12',
  190:'frac34',
  191:'iquest',
  192:'agrave',
  193:'aacute',
  194:'acirc',
  195:'atilde',
  196:'auml',
  197:'aring',
  198:'aelig',
  199:'ccedil',
  200:'egrave',
  201:'eacute',
  202:'ecirc',
  203:'euml',
  204:'igrave',
  205:'iacute',
  206:'icirc',
  207:'iuml',
  208:'eth',
  209:'ntilde',
  210:'ograve',
  211:'oacute',
  212:'ocirc',
  213:'otilde',
  214:'ouml',
  215:'times',
  216:'oslash',
  217:'ugrave',
  218:'uacute',
  219:'ucirc',
  220:'uuml',
  221:'yacute',
  222:'thorn',
  223:'szlig',
  224:'agrave',
  225:'aacute',
  226:'acirc',
  227:'atilde',
  228:'auml',
  229:'aring',
  230:'aelig',
  231:'ccedil',
  232:'egrave',
  233:'eacute',
  234:'ecirc',
  235:'euml',
  236:'igrave',
  237:'iacute',
  238:'icirc',
  239:'iuml',
  240:'eth',
  241:'ntilde',
  242:'ograve',
  243:'oacute',
  244:'ocirc',
  245:'otilde',
  246:'ouml',
  247:'divide',
  248:'oslash',
  249:'ugrave',
  250:'uacute',
  251:'ucirc',
  252:'uuml',
  253:'yacute',
  254:'thorn',
  255:'yuml',
  338:'oelig',
  339:'oelig',
  352:'scaron',
  353:'scaron',
  376:'yuml',
  710:'circ',
  732:'tilde',
  8194:'ensp',
  8195:'emsp',
  8201:'thinsp',
  8204:'zwnj',
  8205:'zwj',
  8206:'lrm',
  8207:'rlm',
  8211:'ndash',
  8212:'mdash',
  8216:'lsquo',
  8217:'rsquo',
  8218:'sbquo',
  8220:'ldquo',
  8221:'rdquo',
  8222:'bdquo',
  8224:'dagger',
  8225:'dagger',
  8240:'permil',
  8249:'lsaquo',
  8250:'rsaquo',
  8364:'euro',
  402:'fnof',
  913:'alpha',
  914:'beta',
  915:'gamma',
  916:'delta',
  917:'epsilon',
  918:'zeta',
  919:'eta',
  920:'theta',
  921:'iota',
  922:'kappa',
  923:'lambda',
  924:'mu',
  925:'nu',
  926:'xi',
  927:'omicron',
  928:'pi',
  929:'rho',
  931:'sigma',
  932:'tau',
  933:'upsilon',
  934:'phi',
  935:'chi',
  936:'psi',
  937:'omega',
  945:'alpha',
  946:'beta',
  947:'gamma',
  948:'delta',
  949:'epsilon',
  950:'zeta',
  951:'eta',
  952:'theta',
  953:'iota',
  954:'kappa',
  955:'lambda',
  956:'mu',
  957:'nu',
  958:'xi',
  959:'omicron',
  960:'pi',
  961:'rho',
  962:'sigmaf',
  963:'sigma',
  964:'tau',
  965:'upsilon',
  966:'phi',
  967:'chi',
  968:'psi',
  969:'omega',
  977:'thetasym',
  978:'upsih',
  982:'piv',
  8226:'bull',
  8230:'hellip',
  8242:'prime',
  8243:'prime',
  8254:'oline',
  8260:'frasl',
  8472:'weierp',
  8465:'image',
  8476:'real',
  8482:'trade',
  8501:'alefsym',
  8592:'larr',
  8593:'uarr',
  8594:'rarr',
  8595:'darr',
  8596:'harr',
  8629:'crarr',
  8656:'larr',
  8657:'uarr',
  8658:'rarr',
  8659:'darr',
  8660:'harr',
  8704:'forall',
  8706:'part',
  8707:'exist',
  8709:'empty',
  8711:'nabla',
  8712:'isin',
  8713:'notin',
  8715:'ni',
  8719:'prod',
  8721:'sum',
  8722:'minus',
  8727:'lowast',
  8730:'radic',
  8733:'prop',
  8734:'infin',
  8736:'ang',
  8743:'and',
  8744:'or',
  8745:'cap',
  8746:'cup',
  8747:'int',
  8756:'there4',
  8764:'sim',
  8773:'cong',
  8776:'asymp',
  8800:'ne',
  8801:'equiv',
  8804:'le',
  8805:'ge',
  8834:'sub',
  8835:'sup',
  8836:'nsub',
  8838:'sube',
  8839:'supe',
  8853:'oplus',
  8855:'otimes',
  8869:'perp',
  8901:'sdot',
  8968:'lceil',
  8969:'rceil',
  8970:'lfloor',
  8971:'rfloor',
  9001:'lang',
  9002:'rang',
  9426:'copy',
  9674:'loz',
  9824:'spades',
  9827:'clubs',
  9829:'hearts',
  9830:'diams'
};
