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={}));