class HTMLElementEx{constructor(original){this.Element=original;}
readAttribute(attributeName,defaultValue=null){if(!this.Element.hasAttribute(attributeName))
return defaultValue;return this.Element.attributes[attributeName].textContent;}
readAttributeInt(attributeName,defaultValue=null){if(!this.Element.hasAttribute(attributeName))
return defaultValue;return parseInt(this.Element.attributes[attributeName].textContent);}
readAttributeBool(attributeName,defaultValue=null){if(!this.Element.hasAttribute(attributeName))
return defaultValue;return SutoriTools.ParseBool(this.Element.attributes[attributeName].textContent);}
readAttributeCulture(attributeName){if(!this.Element.hasAttribute(attributeName))
return SutoriCulture.None;return SutoriTools.ParseCulture(this.Element.attributes[attributeName].textContent);}
readAttributeSolver(attributeName){if(!this.Element.hasAttribute(attributeName))
return SutoriSolver.None;return SutoriTools.ParseSolver(this.Element.attributes[attributeName].textContent);}}
class SutoriActor{constructor(){this.Attributes=new Object;this.ContentCulture=SutoriCulture.None;this.Elements=new Array();this.ID=null;this.Name='Untitled';}
static Parse(actor_e){const result=new SutoriActor();const actor_ex=new HTMLElementEx(actor_e);result.ParseExtraAttributes(actor_e,['id','name','lang']);result.ID=actor_ex.readAttribute('id');result.Name=actor_ex.readAttribute('name');result.ContentCulture=actor_ex.readAttributeCulture('lang');actor_e.querySelectorAll(':scope > *').forEach(async(element_e)=>{switch(element_e.tagName){case'text':result.Elements.push(SutoriElementText.Parse(element_e));break;case'media':result.Elements.push(SutoriElementMedia.Parse(element_e));break;}});return result;}
ParseExtraAttributes(element,exclude){const self=this;self.Attributes=new Object;for(let i=0;i-1)
continue;self.Attributes[attr.name]=attr.value;}}}
class SutoriChallengeEvent{constructor(owner,moment){this.Owner=owner;this.Moment=moment;this.ElementCount=moment.Elements.length;}}
class SutoriDocument{constructor(){this.Properties=new Map();this.Resources=new Array();this.Actors=new Array();this.Moments=new Array();this.Includes=new Array();this.CustomUriLoader=null;}
static async LoadXmlFile(uri){const result=new SutoriDocument();await result.AddDataFromXmlUri(uri);return result;}
async AddDataFromXmlUri(uri){if(this.CustomUriLoader!=null){const custom_raw_xml=await this.CustomUriLoader(uri);console.log("loading moments from "+uri);await this.AddDataFromXml(custom_raw_xml);}
else{const response=await fetch(uri);const raw_xml=await response.text();console.log("loading moments from "+uri);await this.AddDataFromXml(raw_xml);}}
async AddDataFromXml(raw_xml){const xml_parser=new DOMParser();const xml=xml_parser.parseFromString(raw_xml,"text/xml");const self=this;xml.querySelectorAll('properties > *').forEach((property_e)=>{self.Properties.set(property_e.tagName,property_e.textContent);});const includeElements=xml.querySelectorAll('include');for(let i=0;i *').forEach((resource_e)=>{if(resource_e.tagName=='image'){self.Resources.push(SutoriResourceImage.Parse(resource_e));}});xml.querySelectorAll('actors actor').forEach((actor_e)=>{self.Actors.push(SutoriActor.Parse(actor_e));});xml.querySelectorAll('moments moment').forEach((moment_e)=>{const moment=new SutoriMoment();const moment_ex=new HTMLElementEx(moment_e);self.AddMomentAttributes(moment,moment_e,['id','goto','actor','clear']);moment.ID=moment_ex.readAttribute('id');moment.Goto=moment_ex.readAttribute('goto');moment.Actor=moment_ex.readAttribute('actor');moment.Clear=moment_ex.readAttributeBool('clear',false);moment_e.querySelectorAll(':scope > *').forEach(async(element_e)=>{switch(element_e.tagName){case'text':moment.Elements.push(SutoriElementText.Parse(element_e));break;case'option':moment.Elements.push(SutoriElementOption.Parse(element_e));break;case'media':moment.Elements.push(SutoriElementMedia.Parse(element_e));break;case'load':moment.Elements.push(SutoriElementLoad.Parse(element_e));break;case'set':moment.Elements.push(SutoriElementSet.Parse(element_e));break;case'trigger':moment.Elements.push(SutoriElementTrigger.Parse(element_e));break;}});self.Moments.push(moment);});for(let i=0;i-1)
continue;moment.Attributes[attr.name]=attr.value;}}
GetResourceByID(id){return this.Resources.find(res=>res.ID==id);}
SerializeToXml(){const doc=document.implementation.createDocument(null,'document');const self=this;const root=doc.childNodes[0];if(self.Properties.size>0){const props=root.appendChild(doc.createElement('properties'));self.Properties.forEach((value,key)=>{const prop=props.appendChild(doc.createElement(key));prop.textContent=value;});}
for(var i=0;i-1)
continue;self.Attributes[attr.name]=attr.value;}}}
class SutoriEngine{constructor(document){this.Document=document;}
async GotoMomentID(momentID){const moment=this.Document.Moments.find(t=>t.ID==momentID);if(moment==null)
throw new Error("Could not find moment with id #{momentID}.");this.GotoMoment(moment);}
async GotoMoment(moment){const self=this;if(moment==null)
moment=this.Document.Moments[0];if(moment==null)
throw new Error("Document does not have any moments!");this.Cursor=moment;const loaderElements=moment.GetLoaderElements();if(loaderElements&&loaderElements.length>0){for(let i=0;ie instanceof SutoriElementLoad);return elements;}
GetElements(culture,type){const self=this;const elements=typeof culture=='undefined'?self.Elements.filter(e=>e instanceof type):self.Elements.filter(e=>e instanceof type&&(e.ContentCulture==culture||e.ContentCulture==SutoriCulture.All));return elements;}
RemoveElements(culture,type){const self=this;const elements=self.GetElements(culture,type);for(var i=0;it.ID==this.Actor);}}
class SutoriResource{ParseExtraAttributes(element,exclude){const self=this;self.Attributes=new Object;for(let i=0;i-1)
continue;self.Attributes[attr.name]=attr.value;}}}
class SutoriTools{static ParseBool(text){if(!text)
return false;const str=String(text).toLowerCase();if(str=="true")
return true;return(str==="1");}
static ParseCulture(cultureName){var _a;const stringKey=(_a=Object.entries(SutoriCulture).find(([key,val])=>val===cultureName))===null||_a===void 0?void 0:_a[0];return SutoriCulture[stringKey];}
static ParseSolver(solverName){var _a;const stringKey=(_a=Object.entries(SutoriSolver).find(([key,val])=>val===solverName))===null||_a===void 0?void 0:_a[0];return SutoriSolver[stringKey];}
static IsEmptyString(text){if(typeof text==='undefined'||text===null||text=='')
return true;if(text.length==0||text.trim().length==0)
return true;return false;}
static StringifyXml(xmlDoc){const xsltDoc=new DOMParser().parseFromString(['',' ',' ',' ',' ',' ',' ',' ',' ','',].join('\n'),'application/xml');const xsltProcessor=new XSLTProcessor();xsltProcessor.importStylesheet(xsltDoc);const resultDoc=xsltProcessor.transformToDocument(xmlDoc);return'\n'+
new XMLSerializer().serializeToString(resultDoc);}}
class SutoriElementLoad extends SutoriElement{constructor(){super();this.ContentCulture=SutoriCulture.None;this.Loaded=false;}
static Parse(element){const result=new SutoriElementLoad();result.ParseExtraAttributes(element,['mode']);result.Path=element.textContent;return result;}}
class SutoriElementMedia extends SutoriElement{constructor(){super();this.ContentCulture=SutoriCulture.None;}
static Parse(element){const result=new SutoriElementMedia();const element_ex=new HTMLElementEx(element);result.ParseExtraAttributes(element,['actor','for','resource','lang']);result.For=element_ex.readAttribute('for');result.ResourceID=element_ex.readAttribute('resource');result.ContentCulture=element_ex.readAttributeCulture('lang');return result;}}
class SutoriElementOption extends SutoriElement{constructor(){super();this.ContentCulture=SutoriCulture.None;this.Target=null;this.Solver=SutoriSolver.None;this.SolverCallback=null;}
static Parse(element){const result=new SutoriElementOption();const element_ex=new HTMLElementEx(element);result.ParseExtraAttributes(element,['lang','target','solver','solver_callback']);result.Text=element.textContent;result.ContentCulture=element_ex.readAttributeCulture('lang');result.Target=element_ex.readAttribute('target');result.Solver=element_ex.readAttributeSolver('solver');result.SolverCallback=element_ex.readAttribute('solver_callback');return result;}}
class SutoriElementSet extends SutoriElement{constructor(){super();this.ContentCulture=SutoriCulture.None;this.Name=null;}
static Parse(element){const result=new SutoriElementSet();const element_ex=new HTMLElementEx(element);result.ParseExtraAttributes(element,['name']);result.Name=element_ex.readAttribute('name');result.Value=element.textContent;return result;}}
class SutoriElementText extends SutoriElement{constructor(){super();this.ContentCulture=SutoriCulture.None;}
static Parse(element){const result=new SutoriElementText();const element_ex=new HTMLElementEx(element);result.ParseExtraAttributes(element,['lang']);result.Text=element.textContent;result.ContentCulture=element_ex.readAttributeCulture('lang');return result;}}
class SutoriElementTrigger extends SutoriElement{constructor(){super();this.ContentCulture=SutoriCulture.None;this.Action=null;}
static Parse(element){const result=new SutoriElementTrigger();const element_ex=new HTMLElementEx(element);result.ParseExtraAttributes(element,['action']);result.Body=element.textContent;result.Action=element_ex.readAttribute('action');return result;}}
class SutoriResourceImage extends SutoriResource{constructor(){super();this.ID=null;this.Name='Untitled';this.Attributes=new Object();}
static Parse(element){const result=new SutoriResourceImage();const element_ex=new HTMLElementEx(element);result.ParseExtraAttributes(element,['id','name','src']);result.ID=element_ex.readAttribute('id');result.Name=element_ex.readAttribute('name');result.Src=element_ex.readAttribute('src');result.Preload=element_ex.readAttributeBool('preload',false);return result;}}
var SutoriCulture;(function(SutoriCulture){SutoriCulture["None"]="none";SutoriCulture["All"]="all";SutoriCulture["EnUS"]="en-US";SutoriCulture["zhCN"]="zh-CN";SutoriCulture["ruRU"]="ru-RU";SutoriCulture["FrFR"]="fr-FR";SutoriCulture["esES"]="es-ES";SutoriCulture["EnGB"]="en-GB";SutoriCulture["deDE"]="de-DE";SutoriCulture["ptBR"]="pt-BR";SutoriCulture["enCA"]="en-CA";SutoriCulture["esMX"]="es-MX";SutoriCulture["itIT"]="it-IT";SutoriCulture["jaJP"]="ja-JP";})(SutoriCulture||(SutoriCulture={}));var SutoriSolver;(function(SutoriSolver){SutoriSolver["None"]="none";SutoriSolver["OptionIndex"]="option_index";SutoriSolver["KeyCharEquality"]="key_char_equality";SutoriSolver["TextEquality"]="text_equality";SutoriSolver["Custom"]="custom";})(SutoriSolver||(SutoriSolver={}));