if(window.FSM===undefined){throw Error('Finite State Machine library (fsm.js) is required.');}
if(!Array.indexOf){Array.prototype.indexOf=function(obj){for(var i=0;i<this.length;i++){if(this[i]==obj){return i;}}
return-1;}}
var IXMO={};IXMO.Parser=function(){this._parsing_pos=0;this._parsing_line=1;this._parsing_column=0;this._character_list=new Array();this._tag_stack=new Array();this._current_entity='';this._current_tag_name='';this._current_tag_short=false;this._current_attribute_list=new Array();this._current_attribute_name='';this._current_attribute_value='';this._machine=new FSM.Machine(this);this._machine.set_initial_state('character_or_entity_or_tag');this._machine.add_transition_any('character_or_entity_or_tag',null,function(action){this.data._store_character(action);});this._machine.add_transition('<','character_or_entity_or_tag','openning_or_closing_tag');this._machine.add_transition('&','character_or_entity_or_tag','entity');this._machine.add_transitions(IXMO.Parser.ENTITY,'entity',null,function(action){this.data._current_entity+=action;});this._machine.add_transition(';','entity','character_or_entity_or_tag',function(){this.data._store_character('&'+this.data._current_entity+';');this._current_entity='';});this._machine.add_transitions([' ','\n'],'openning_or_closing_tag');this._machine.add_transitions(IXMO.Parser.ALPHA,'openning_or_closing_tag','opening_tag',function(){this.data._parsing_pos--;});this._machine.add_transition('/','openning_or_closing_tag','closing_tag');this._machine.add_transitions([' ','\n'],'opening_tag');this._machine.add_transitions(IXMO.Parser.ALPHA,'opening_tag','tag_name_opening',function(){this.data._parsing_pos--;});this._machine.add_transitions([' ','\n'],'closing_tag');this._machine.add_transitions(IXMO.Parser.ALPHA,'closing_tag','tag_name_closing',function(){this.data._parsing_pos--;});this._machine.add_transitions(IXMO.Parser.ALPHA_NUMERIC,'tag_name_opening',null,function(action){this.data._current_tag_name+=action;});this._machine.add_transitions([' ','\n'],'tag_name_opening','attribute_or_tag_end');this._machine.add_transition('/','tag_name_opening','tag_opening_short_tag',function(){this.data._current_tag_short=true;});this._machine.add_transition('>','tag_name_opening','character_or_entity_or_tag',function(){this.data._push_tag();});this._machine.add_transitions([' ','\n'],'tag_opening_short_tag');this._machine.add_transition('>','tag_opening_short_tag','character_or_entity_or_tag',function(){this.data._push_tag();});this._machine.add_transitions([' ','\n'],'attribute_or_tag_end');this._machine.add_transition('/','attribute_or_tag_end','tag_opening_short_tag',function(){this.data._current_tag_short=true;});this._machine.add_transition('>','attribute_or_tag_end','character_or_entity_or_tag',function(){this.data._push_tag();});this._machine.add_transitions(IXMO.Parser.ALPHA,'attribute_or_tag_end','attribute_name',function(){this.data._parsing_pos--;});this._machine.add_transitions(IXMO.Parser.ALPHA_NUMERIC,'tag_name_closing',null,function(action){this.data._current_tag_name+=action;});this._machine.add_transitions([' ','\n'],'tag_name_closing','tag_name_must_close');this._machine.add_transition('>','tag_name_closing','character_or_entity_or_tag',function(){this.data._pop_tag();});this._machine.add_transitions([' ','\n'],'tag_name_must_close');this._machine.add_transition('>','tag_name_must_close','character_or_entity_or_tag',function(){this.data._pop_tag();});this._machine.add_transitions(IXMO.Parser.ALPHA_NUMERIC,'attribute_name',null,function(action){this.data._current_attribute_name+=action;});this._machine.add_transitions([' ','\n'],'attribute_name','attribute_name_must_get_value');this._machine.add_transition('=','attribute_name','attribute_delimiter');this._machine.add_transitions([' ','\n'],'attribute_name_must_get_value');this._machine.add_transition('=','attribute_name_must_get_value','attribute_delimiter');this._machine.add_transitions([' ','\n'],'attribute_delimiter');this._machine.add_transition('\'','attribute_delimiter','attribute_value_single_delimiter');this._machine.add_transition('"','attribute_delimiter','attribute_value_double_delimiter');this._machine.add_transitions(IXMO.Parser.ALPHA_NUMERIC,'attribute_delimiter','attribute_value_no_delimiter',function(){this.data._parsing_pos--;});this._machine.add_transition(' ','attribute_value_no_delimiter','attribute_or_tag_end',function(){this.data._store_attribute('\"');});this._machine.add_transitions(['/','>'],'attribute_value_no_delimiter','attribute_or_tag_end',function(){this.data._parsing_pos--;this.data._store_attribute('\"');});this._machine.add_transition_any('attribute_value_no_delimiter',null,function(action){this.data._current_attribute_value+=action;});this._machine.add_transition('\'','attribute_value_single_delimiter','attribute_or_tag_end',function(){this.data._store_attribute('\'');});this._machine.add_transition_any('attribute_value_single_delimiter',null,function(action){this.data._current_attribute_value+=action;});this._machine.add_transition('"','attribute_value_double_delimiter','attribute_or_tag_end',function(){this.data._store_attribute('"');});this._machine.add_transition_any('attribute_value_double_delimiter',null,function(action){this.data._current_attribute_value+=action;});}
IXMO.Parser.ALPHA='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz'.split('');IXMO.Parser.ALPHA_NUMERIC='AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz123456789_-:'.split('');IXMO.Parser.ENTITY='#AaBbCcDdEeFfGgHhIiJjKkLlMmNnOoPpQqRrSsTtUuVvWwXxYyZz123456789_-:'.split('');IXMO.Parser.prototype._store_character=function(c){var tag_list=new Array();for(var i=0;i<this._tag_stack.length;i++){tag_list.push(this._tag_stack[i]);}
this._character_list.push(new IXMO.Character(c,tag_list));}
IXMO.Parser.prototype._push_tag=function(){var attribute_list=new Array();var attribute_name_list=new Array();for(var i=0;i<this._current_attribute_list.length;i++){attribute_list.push(this._current_attribute_list[i]);attribute_name_list.push(this._current_attribute_list[i].name);}
var tag=new IXMO.Tag(this._current_tag_name,attribute_list,this._current_tag_short);this._tag_stack.push(tag);if(this._current_tag_short){this._store_character('');this._tag_stack.pop();}
this._current_tag_name='';this._current_tag_short=false;this._current_attribute_list=new Array();}
IXMO.Parser.prototype._pop_tag=function(){var last_tag=this._tag_stack.pop();if(last_tag.original_name!=this._current_tag_name.toLowerCase()){throw Error('Unmatched tag \'</'+this._current_tag_name+'>\'.');}
this._current_tag_name='';}
IXMO.Parser.prototype._store_attribute=function(delimiter){var tag_name=this._current_tag_name;var attribute_name=this._current_attribute_name;if(!IXMO.Tag.supports_attribute(tag_name,attribute_name)){throw Error('Attribute \''+attribute_name+'\' is not supported by \''+tag_name+'\' tag.');}
var attribute=new IXMO.Attribute(attribute_name,this._current_attribute_value,delimiter);this._current_attribute_list.push(attribute);this._current_attribute_name='';this._current_attribute_value='';}
IXMO.Parser.prototype._get_parsing_error=function(message){return Error('Parsing Error at line: '+this._parsing_line+', column: '+this._parsing_column+' - '+message);}
IXMO.Parser.prototype.parse=function(xhtml){this._parsing_pos=0;this._parsing_line=1;this._parsing_column=0;this._character_list=new Array();this._tag_stack=new Array();this._current_entity='';this._current_tag_name='';this._current_tag_short=false;this._current_attribute_list=new Array();this._current_attribute_name='';this._current_attribute_value='';xhtml=xhtml.replace(/\r\n/g,'\n');xhtml=xhtml.replace(/\r/g,'\n');xhtml=xhtml.replace(/<!--.*-->/g,'');xhtml=xhtml.replace(/ +/g,' ');xhtml=xhtml.replace(/^\s+|\s+$/g,'');for(this._parsing_pos=0;this._parsing_pos<xhtml.length;this._parsing_pos++){var c=xhtml.charAt(this._parsing_pos);if(c=='\n'){this._parsing_column=0;this._parsing_line++;}
this._parsing_column++;try{this._machine.process(c);}catch(error){throw this._get_parsing_error(error.message);}}
if(this._machine.get_current_state()!='character_or_entity_or_tag'){throw Error("Invalid XHTML parser expected more content.");}
return new IXMO.Soup(this._character_list);}
IXMO.Soup=function(character_list){this._character_list=character_list||new Array();}
IXMO.Soup.prototype._make_selection=function(selection){if(!selection){selection=[0,this._character_list.length];}
if(!this.in_range(selection[0])||!this.in_range(selection[1])){throw Error('Invalid selection, outside of character range.');}
return selection;}
IXMO.Soup.prototype.split=function(position){if(position.constructor!=Array.prototype.constructor){position=[position,position];}
if(!this.in_range(position[0])||!this.in_range(position[1])){throw Error('Invalid position, outside of character range.');}
var split_left=new Array();var split_right=new Array();for(var i=0;i<position[0];i++){split_left.push(this._character_list[i].copy());}
for(var j=position[1];j<this._character_list.length;j++){split_right.push(this._character_list[j].copy());}
var soup_left=new IXMO.Soup(split_left);var soup_right=new IXMO.Soup(split_right);soup_left.trim();soup_right.trim();return[soup_left,soup_right];}
IXMO.Soup.prototype.apply_tag=function(tag,selection){selection=this._make_selection(selection);for(var i=selection[0];i<selection[1];i++){this._character_list[i].apply_tag(tag);}}
IXMO.Soup.prototype.apply_tags=function(tag_list,selection){selection=this._make_selection(selection);for(var i=0;i<tag_list.length;i++){this.apply_tag(tag_list[i],selection);}}
IXMO.Soup.prototype.remove_tag=function(tag,selection){selection=this._make_selection(selection);for(var i=selection[0];i<selection[1];i++){this._character_list[i].remove_tag(tag);}}
IXMO.Soup.prototype.remove_tags=function(tag_list,selection){selection=this._make_selection(selection);for(var i=0;i<tag_list.length;i++){this.remove_tag(tag_list[i],selection);}}
IXMO.Soup.prototype.remove_all_tags=function(selection,tag_name){selection=this._make_selection(selection);for(var i=selection[0];i<selection[1];i++){this._character_list[i].remove_all_tags(tag_name);}}
IXMO.Soup.prototype.cut=function(selection){selection=this._make_selection(selection);return new IXMO.Soup(this._character_list.splice(selection[0],selection[1]-selection[0]));}
IXMO.Soup.prototype.copy=function(selection){selection=this._make_selection(selection);var c_list=new Array();for(var i=selection[0];i<selection[1];i++){c_list.push(this._character_list[i].copy());}
return new IXMO.Soup(c_list);}
IXMO.Soup.prototype.paste=function(soup,position){if(!this.in_range(position)){throw Error('Invalid position, outside of character range.');}
var c_list=new Array();for(var i=0;i<this._character_list.length+1;i++){if(i==position){for(var j=0;j<soup._character_list.length;j++){c_list.push(soup._character_list[j].copy());}}
if(i<this._character_list.length){c_list.push(this._character_list[i].copy());}}
this._character_list=c_list;}
IXMO.Soup.prototype.erase=function(selection){selection=this._make_selection(selection);this._character_list.splice(selection[0],selection[1]-selection[0]);}
IXMO.Soup.prototype.insert=function(text,position){if(!this.in_range(position)){throw Error('Invalid position, outside of character range.');}
var c_list=new Array();for(var i=0;i<this._character_list.length+1;i++){if(i==position){var inherited_tag_list=new Array();if(i>0){inherited_tag_list=this._character_list[i-1].get_tag_list().slice(0)}
for(var j=0;j<text.length;j++){c_list.push(new IXMO.Character(text.charAt(j),inherited_tag_list));}}
if(i<this._character_list.length){c_list.push(this._character_list[i].copy());}}
this._character_list=c_list;}
IXMO.Soup.prototype.append=function(text){this.insert(text,this._character_list.length);}
IXMO.Soup.prototype.prepend=function(text){this.insert(text,0);}
IXMO.Soup.prototype.raw_select=function(selection){selection=this._make_selection(selection);var c_string_list=new Array();for(var i=selection[0];i<selection[1];i++){c_string_list.push(this._character_list[i].c);}
return c_string_list.join('');}
IXMO.Soup.prototype.has_tag=function(tag,loose,selection){selection=this._make_selection(selection);var match_count=0;for(var i=selection[0];i<selection[1];i++){var c=this._character_list[i];if(c.has_tag(tag,loose)){match_count++;}}
switch(match_count){case 0:return-1;break;case selection[1]-selection[0]:return 1;break;default:return 0;}}
IXMO.Soup.prototype.has_tags=function(tag_list,loose,selection){selection=this._make_selection(selection);var match_count=0;for(var i=0;i<tag_list.length;i++){var tag=tag_list[i];for(var j=selection[0];j<selection[1];j++){var c=this._character_list[j];if(c.has_tag(tag,loose)){match_count++;}}}
switch(match_count){case 0:return-1;break;case selection[1]-selection[0]:return 1;break;default:return 0;}}
IXMO.Soup.prototype.get_tag_list=function(selection,tag_name){selection=this._make_selection(selection);var tag_map=new Object();var tag_list=new Array();for(var i=selection[0];i<selection[1];i++){var c=this._character_list[i];var c_tag_list=c.get_tag_list(tag_name);for(var j=0;j<c_tag_list.length;j++){var tag=c_tag_list[j];if(!tag_map[tag.render_open()]){tag_map[tag.render_open()]=true;tag_list.push(tag);}}}
return tag_list;}
IXMO.Soup.prototype._optimise=function(){for(var i=0;i<this._character_list.length;i++){this._character_list[i].reset_tag_run_lengths();}
var tag_stack=new Array();var tag_rendered_stack=new Array();var prev_c=null;for(var j=this._character_list.length;j>0;j--){var c=this._character_list[j-1];var closing_tag_list=new Array();for(var k=tag_stack.length-1;k>=0;k--){var tag=tag_stack[k];closing_tag_list.push(tag);if(!c.has_tag(tag)){for(var n=0;n<closing_tag_list.length;n++){tag_stack.pop();tag_rendered_stack.pop();}
closing_tag_list=new Array();}}
var opening_tag_list=c.get_tag_list();for(var m=0;m<opening_tag_list.length;m++){var tag_rendered=opening_tag_list[m].render_open();if(tag_rendered_stack.indexOf(tag_rendered)==-1){tag_stack.push(opening_tag_list[m]);tag_rendered_stack.push(tag_rendered);}}
for(var p=0;p<tag_stack.length;p++){var tag=tag_stack[p];if(prev_c){c.set_tag_run_length(tag,prev_c.get_tag_run_length(tag)+1);}else{c.set_tag_run_length(tag,1);}}
prev_c=c;}
for(var m=0;m<this._character_list.length;m++){var c=this._character_list[m];c.order_tag_list();}}
IXMO.Soup.prototype.render=function(optimise,debug){if(optimise){this._optimise();}
var tag_stack=new Array();var tag_rendered_stack=new Array();var soup_str='';var original_parenthesis=IXMO.Tag.PARENTHESIS;for(var i=0;i<this._character_list.length;i++){var c=this._character_list[i];var closing_tag_list=new Array();for(var j=tag_stack.length-1;j>=0;j--){var tag=tag_stack[j];closing_tag_list.push(tag);if(!c.has_tag(tag)){for(var m=0;m<closing_tag_list.length;m++){if(debug){IXMO.Tag.PARENTHESIS=['[',']'];}
soup_str+=closing_tag_list[m].render_close();IXMO.Tag.PARENTHESIS=original_parenthesis;tag_stack.pop();tag_rendered_stack.pop();}
closing_tag_list=new Array();}}
var opening_tag_list=c.get_tag_list();for(var k=0;k<opening_tag_list.length;k++){var tag_rendered=opening_tag_list[k].render_open();if(tag_rendered_stack.indexOf(tag_rendered)==-1){if(debug){IXMO.Tag.PARENTHESIS=['[',']'];soup_str+=opening_tag_list[k].render_open();}else{soup_str+=tag_rendered;}
IXMO.Tag.PARENTHESIS=original_parenthesis;tag_stack.push(opening_tag_list[k]);tag_rendered_stack.push(tag_rendered);}}
soup_str+=c.c;}
for(var j=tag_stack.length-1;j>=0;j--){if(debug){IXMO.Tag.PARENTHESIS=['[',']'];}
soup_str+=tag_stack[j].render_close();IXMO.Tag.PARENTHESIS=original_parenthesis;}
return soup_str;}
IXMO.Soup.prototype.get_length=function(){return this._character_list.length;}
IXMO.Soup.prototype.in_range=function(position){return!(position<0||position>this._character_list.length);}
IXMO.Soup.prototype.trim=function(){var c_list=this._character_list;while([' ','\n'].indexOf(c_list[0])!=-1){c_list.shift();}
while([' ','\n'].indexOf(c_list[c_list.length-1])!=-1){c_list.pop();}}
IXMO.Tag=function(name,attribute_list,short_tagged){name=name.toLowerCase();this._dirty=true;this._render_open_cache='';if(short_tagged){if(IXMO.Tag.SUPPORTED_SHORT_TAG_LIST.indexOf(name)==-1){throw'The \'<'+name+'>\' tag cannot be short tagged.';}}
this._short_tagged=short_tagged;if(IXMO.Tag.SUPPORTED_TAG_LIST.indexOf(name)==-1){throw'Unsupported tag \'<'+name+'>\'';}
this._attribute_list=new Array();this._attribute_name_list=new Array();attribute_list=attribute_list||new Array();if(attribute_list.constructor==Array.prototype.constructor){for(var i=0;i<attribute_list.length;i++){this.set_attribute(attribute_list[i].name,attribute_list[i].value,attribute_list[i].get_delimiter());}}else if(attribute_list.constructor==Object.prototype.constructor){for(var attribute_name in attribute_list){this.set_attribute(attribute_name,attribute_list[attribute_name]);}}
if(IXMO.Tag.REQUIRED_ATTRIBUTE_MAP[name]){for(var j=0;j<IXMO.Tag.REQUIRED_ATTRIBUTE_MAP[name].length;s++){var required_name=IXMO.Tag.REQUIRED_ATTRIBUTE_MAP[name][j];if(!this.get_attribute(required_name)){throw'Attribute \''+required_name+'\' is required by \''+name+'\' tag.';}}}
this.original_name=name;if(IXMO.Tag.TAG_RENAME_MAP[name]){name=IXMO.Tag.TAG_RENAME_MAP[name];}
this.name=name;}
IXMO.Tag.PARENTHESIS=['<','>'];IXMO.Tag.SUPPORTED_TAG_LIST='a,abbr,acronym,address,b,bdo,big,br,cite,code,del,dfn,em,i,img,ins,kbd,q,samp,small,span,strong,sub,sup,tt,var'.split(',');IXMO.Tag.SUPPORTED_SHORT_TAG_LIST='br,img'.split(',');IXMO.Tag.SUPPORTED_ATTRIBUTE_LIST='id,class,style,title,lang,xml:lang,dir,onclick,ondblclick,onmousedown,onmouseup,onmousemove,onmouseout,onkeypress,onkeydown,onkeyup'.split(',');IXMO.Tag.SUPPORTED_ADDITIONAL_ATTRIBUTE_MAP={'del':['cite','datetime'],'ins':['cite','datetime'],'a':['charset','type','name','href','hreflang','rel','rev','shape','coords'],'q':['cite'],'img':['src','alt','longdesc','height','width','usemap','ismap']};IXMO.Tag.SUPPORTED_SPECIAL_ATTRIBUTE_MAP={'br':['id','class','style','title']};IXMO.Tag.REQUIRED_ATTRIBUTE_MAP={'bdo':['dir',]};IXMO.Tag.TAG_RENAME_MAP={'b':'strong','i':'em'};IXMO.Tag.supports_attribute=function(tag_name,attribute_name){tag_name=tag_name.toLowerCase();attribute_name=attribute_name.toLowerCase();if(IXMO.Tag.SUPPORTED_SPECIAL_ATTRIBUTE_MAP[tag_name]){if(IXMO.Tag.SUPPORTED_SPECIAL_ATTRIBUTE_MAP[tag_name].indexOf(attribute_name)==-1){return false;}}else{if(IXMO.Tag.SUPPORTED_ATTRIBUTE_LIST.indexOf(attribute_name)==-1){if(IXMO.Tag.SUPPORTED_ADDITIONAL_ATTRIBUTE_MAP[tag_name]){if(IXMO.Tag.SUPPORTED_ADDITIONAL_ATTRIBUTE_MAP[tag_name].indexOf(attribute_name)==-1){return false;}}else{return false;}}}
return true;}
IXMO.Tag.prototype.set_attribute=function(name,value,delimiter){name=name.toLowerCase();var attribute=this.get_attribute(name);if(value!=null&&value!=''){if(!attribute){attribute=new IXMO.Attribute(name,value,delimiter);this._attribute_list.push(attribute);this._attribute_name_list.push(attribute.name);}else{attribute.value=value;if(delimiter){attribute.set_delimiter(delimiter);}}}else{if(attribute){var attribute_index=this._attribute_name_list.indexOf(name);this._attribute_list.splice(attribute_index,1);this._attribute_name_list.splice(attribute_index,1);}}
this._dirty=true;}
IXMO.Tag.prototype.get_attribute=function(name){name=name.toLowerCase();var attribute_index=this._attribute_name_list.indexOf(name);if(attribute_index!=-1){return this._attribute_list[attribute_index].value;}}
IXMO.Tag.prototype.render_open=function(){if(this._dirty||this._render_open_cache.charAt(1)!=IXMO.Tag.PARENTHESIS[0]){var tag_str=IXMO.Tag.PARENTHESIS[0]+this.name
var attribute_list=this._attribute_list.slice();attribute_list.sort(IXMO.Attribute.sort_by_name);for(var i=0;i<attribute_list.length;i++){tag_str+=' '+attribute_list[i].render();}
if(this._short_tagged){tag_str+='/';}
this._render_open_cache=tag_str+IXMO.Tag.PARENTHESIS[1];this._dirty=false;}
return this._render_open_cache;}
IXMO.Tag.prototype.render_close=function(){if(this._short_tagged){return'';}else{return IXMO.Tag.PARENTHESIS[0]+'/'+this.name+IXMO.Tag.PARENTHESIS[1];}}
IXMO.Tag.prototype.is_short_tagged=function(){return this._short_tagged;}
IXMO.Tag.prototype.copy=function(){attribute_list=new Array();for(var i=0;i<this._attribute_list.length;i++){attribute_list.push(this._attribute_list[i].copy());}
return new IXMO.Tag(this.name,attribute_list,this.is_short_tagged());}
IXMO.Attribute=function(name,value,delimiter){name=name.toLowerCase();this._delimiter=null;this.name=name;this.value=value;this.set_delimiter(delimiter||'"');}
IXMO.Attribute.sort_by_name=function(a,b){if(a.name>b.name){return 1;}else if(a.name<b.name){return-1;}
return 0;}
IXMO.Attribute.prototype.render=function(){return this.name.toLowerCase()+'='+this._delimiter+this.value+this._delimiter;}
IXMO.Attribute.prototype.set_delimiter=function(delimiter){if(delimiter!='"'&&delimiter!='\''){throw'The delimiter must be either a single (\') or double (") quote.';}
if(this.value.search(delimiter)!=-1){throw'The delimiter cannot be changed to ('+delimiter+') because the Attributes value contains one or more instance of the specifed delimiter.';}
this._delimiter=delimiter;}
IXMO.Attribute.prototype.get_delimiter=function(){return this._delimiter;}
IXMO.Attribute.prototype.copy=function(){return new IXMO.Attribute(this.name,this.value,this.get_delimiter());}
IXMO.Character=function(character_str,tag_list){this._tag_list=new Array();this._tag_name_list=new Array();this._tag_rendered_list=new Array();this._tag_run_length_list=new Array();this.c=character_str;for(var i=0;i<tag_list.length;i++){this.apply_tag(tag_list[i]);}}
IXMO.Character.prototype.reset_tag_run_lengths=function(tag,run_length){this._tag_run_length_list=new Array();}
IXMO.Character.prototype.get_tag_run_length=function(tag){var run_length=0;for(var i=0;i<this._tag_run_length_list.length;i++){var tag_run_length=this._tag_run_length_list[i];if(tag_run_length.tag==tag){run_length=tag_run_length.run_length;break;}}
return run_length;}
IXMO.Character.prototype.set_tag_run_length=function(tag,run_length){for(var i=0;i<this._tag_run_length_list.length;i++){var tag_run_length=this._tag_run_length_list[i];if(tag_run_length.tag==tag){tag_run_length.run_length=run_length;return;}}
this._tag_run_length_list.push({'tag':tag,'run_length':run_length});}
IXMO.Character.prototype.get_priority_tag=function(){if(this._tag_run_length_list.length>0){return this._tag_run_length_list[this._tag_run_length_list.length-1].tag;}
return null;}
IXMO.Character.prototype.order_tag_list=function(){if(this._tag_run_length_list.length>1){this._tag_run_length_list.sort(IXMO.Character._sort_tag_by_run_length);this._tag_list=new Array();this._tag_name_list=new Array();this._tag_rendered_list=new Array();for(var i=this._tag_run_length_list.length;i>0;i--){this.apply_tag(this._tag_run_length_list[i-1].tag);}}}
IXMO.Character.prototype.apply_tag=function(tag){if(!this.has_tag(tag)){this._tag_list.push(tag);this._tag_name_list.push(tag.name);this._tag_rendered_list.push(tag.render_open());}}
IXMO.Character.prototype.apply_tags=function(tag_list){for(var i=0;i<tag_list.length;i++){this.apply_tag(tag_list[i]);}}
IXMO.Character.prototype.remove_tag=function(tag){var i=this._tag_rendered_list.indexOf(tag.render_open());if(i!=-1){this._tag_list.splice(i,1);this._tag_name_list.splice(i,1);this._tag_rendered_list.splice(i,1);}}
IXMO.Character.prototype.remove_tags=function(tag_list){for(var i=0;i<tag_list.length;i++){this.remove_tag(tag_list[i]);}}
IXMO.Character.prototype.remove_all_tags=function(tag_name){if(tag_name){var remove_list=new Array();for(var i=0;i<this._tag_list.length;i++){if(this._tag_list[i].name==tag_name){remove_list.push(this._tag_list[i]);}}
this.remove_tags(remove_list);}else{this._tag_list=new Array();this._tag_name_list=new Array();this._tag_rendered_list=new Array();}}
IXMO.Character.prototype.has_tag=function(tag,loose){if(loose){return(this._tag_name_list.indexOf(tag.name)!=-1);}else{return(this._tag_rendered_list.indexOf(tag.render_open())!=-1);}}
IXMO.Character.prototype.has_tags=function(tag_list,loose){for(var i=0;i<tag_list.length;i++){if(!this.has_tag(tag_list[i],loose)){return false;}}
return true;}
IXMO.Character.prototype.get_tag_list=function(tag_name){if(tag_name){var tag_list=new Array();for(var i=0;i<this._tag_list.length;i++){var tag=this._tag_list[i];if(tag.name==tag_name){tag_list.push(tag);}}
return tag_list;}else{return this._tag_list;}}
IXMO.Character.prototype.copy=function(){return new IXMO.Character(this.c,this._tag_list.slice());}
IXMO.Character._sort_tag_by_run_length=function(a,b){if(a.run_length>b.run_length){return 1;}else if(a.run_length<b.run_length){return-1;}
return 0;}