/* Usage: var results = HTML401(html_string); etc... */
(function(){var startTag=/^<(\w+)((?:\s+\w+(?:\s*=\s*(?:(?:"[^"]*")|(?:'[^']*')|[^>\s]+))?)*)\s*(\/?)>/,endTag=/^<\/(\w+)[^>]*>/,attr=/(\w+)(?:\s*=\s*(?:(?:"((?:\\.|[^"])*)")|(?:'((?:\\.|[^'])*)')|([^>\s]+)))?/g;var empty=makeMap("area,base,basefont,br,col,frame,hr,img,input,isindex,link,meta,param,embed");var block=makeMap("address,applet,blockquote,button,center,dd,del,dir,div,dl,dt,fieldset,form,frameset,hr,iframe,ins,isindex,li,map,menu,noframes,noscript,object,ol,p,pre,script,table,tbody,td,tfoot,th,thead,tr,ul");var inline=makeMap("a,abbr,acronym,applet,b,basefont,bdo,big,br,button,cite,code,del,dfn,em,font,i,iframe,img,input,ins,kbd,label,map,object,q,s,samp,script,select,small,span,strike,strong,sub,sup,textarea,tt,u,var");var closeSelf=makeMap("colgroup,dd,dt,li,options,p,td,tfoot,th,thead,tr");var fillAttrs=makeMap("checked,compact,declare,defer,disabled,ismap,multiple,nohref,noresize,noshade,nowrap,readonly,selected");var special=makeMap("script,style");var HTMLParser=this.HTMLParser=function(html,handler){var index,chars,match,stack=[],last=html;stack.last=function(){return this[this.length-1];};while(html){chars=true;if(!stack.last()||!special[stack.last()]){if(html.indexOf("<!--")==0){index=html.indexOf("-->");if(index>=0){if(handler.comment)handler.comment(html.substring(4,index));html=html.substring(index+3);chars=false;}}else if(html.indexOf("</")==0){match=html.match(endTag);if(match){html=html.substring(match[0].length);match[0].replace(endTag,parseEndTag);chars=false;}}else if(html.indexOf("<")==0){match=html.match(startTag);if(match){html=html.substring(match[0].length);match[0].replace(startTag,parseStartTag);chars=false;}}if(chars){index=html.indexOf("<");var text=index<0?html:html.substring(0,index);html=index<0?"":html.substring(index);if(handler.chars)handler.chars(text);}}else{html=html.replace(new RegExp("(.*)<\/"+stack.last()+"[^>]*>"),function(all,text){text=text.replace(/<!--(.*?)-->/g,"$1").replace(/<!\[CDATA\[(.*?)]]>/g,"$1");if(handler.chars)handler.chars(text);return"";});parseEndTag("",stack.last());}if(html==last)throw"Parse Error: "+html;last=html;}parseEndTag();function parseStartTag(tag,tagName,rest,unary){if(block[tagName]){while(stack.last()&&inline[stack.last()]){parseEndTag("",stack.last());}}if(closeSelf[tagName]&&stack.last()==tagName){parseEndTag("",tagName);}unary=empty[tagName]||!!unary;if(!unary)stack.push(tagName);if(handler.start){var attrs=[];rest.replace(attr,function(match,name){var value=arguments[2]?arguments[2]:arguments[3]?arguments[3]:arguments[4]?arguments[4]:fillAttrs[name]?name:"";attrs.push({name:name,value:value,escaped:value.replace(/(^|[^\\])"/g,'$1\\\"')});});if(handler.start)handler.start(tagName,attrs,unary);}}function parseEndTag(tag,tagName){if(!tagName)var pos=0;else
for(var pos=stack.length-1;pos>=0;pos--)if(stack[pos]==tagName)break;if(pos>=0){for(var i=stack.length-1;i>=pos;i--)if(handler.end)handler.end(stack[i]);stack.length=pos;}}};this.HTML401=function(html){var results="";HTMLParser(html,{start:function(tag,attrs,unary){results+="<"+tag;for(var i=0;i<attrs.length;i++)results+=" "+attrs[i].name+'="'+attrs[i].escaped+'"';results+=">";},end:function(tag){results+="</"+tag+">";},chars:function(text){results+=text;},comment:function(text){results+="<!--"+text+"-->";}});return results;};function makeMap(str){var obj={},items=str.split(",");for(var i=0;i<items.length;i++)obj[items[i]]=true;return obj;}})();