kekule
Version:
Open source JavaScript toolkit for chemoinformatics
1 lines • 143 kB
JavaScript
Kekule.TextLinesBuffer=Class.create(ObjectEx,{CLASS_NAME:"Kekule.TextLinesBuffer",LINEBREAK:"\n",initialize:function(e){this.tryApplySuper("initialize"),this.setPropStoreFieldValue("lines",[]),e&&("string"==typeof e?this.setText(e):this.setLines(e)),this.setCurrLineNo(0)},initProperties:function(){this.defineProp("lines",{dataType:DataType.ARRAY,serializable:!1}),this.defineProp("text",{dataType:DataType.STRING,serializable:!1,getter:function(){return this.getLines().join(this.LINEBREAK)},setter:function(e){this.setPropStoreFieldValue("lines",[]),this.reset(),this.appendText(e)}}),this.defineProp("currLineNo",{dataType:DataType.INT,serializable:!1})},getUnreadLines:function(){var e=[].concat(this.getLines());return e.splice(0,this.getCurrLineNo()),e},getUnreadText:function(){return this.getUnreadLines().join(this.LINEBREAK)},appendText:function(e){var t=e.split(this.LINEBREAK);this.appendLines(t)},appendLines:function(e){this.setPropStoreFieldValue("lines",this.getLines().concat(e)),this.notifyPropSet("lines",this.getPropStoreFieldValue("lines"))},clear:function(){this.setLines([]),this.setCurrLineNo(0)},incCurrLineNo:function(e){null==e&&(e=1);var t=this.getCurrLineNo();t+=e,this.setCurrLineNo(t)},getLineAt:function(e){var t=this.getLines()[e];return t&&t.length&&"\r"===t.charAt(t.length-1)&&(t=t.substring(0,t.length-1)),t},getCurrLine:function(){return this.getLineAt(this.getCurrLineNo())},readLine:function(){var e=this.getLineAt(this.getCurrLineNo());return this.incCurrLineNo(),e},writeLine:function(e){this.getLines().splice(this.getCurrLineNo(),0,e),this.incCurrLineNo()},writeLines:function(e){for(var t=0,r=e.length;t<r;++t)this.writeLine(e[t])},writeText:function(e){var t=e.split(this.LINEBREAK);this.writeLines(t)},eof:function(){return this.getCurrLineNo()>=this.getLines().length},reset:function(){this.setCurrLineNo(0)}}),function(){Kekule.globalOptions.add("IO",{}),Kekule.IO={},Kekule.IO.ChemDataType={TEXT:"text",DOM:"dom",JSON:"json",BINARY:"bin",OTHER:"other",UNKNOWN:"unknown",isBinaryType:function(e){var t=Kekule.IO.ChemDataType;return!e||e===t.BINARY||e===t.OTHER||e===t.UNKNOWN}},Kekule.IO.DataFormat={},Kekule.IO.MimeType={TEXT:"text/plain",HTML:"text/html",XML:"text/xml",JSON:"application/json",JAVASCRIPT:"application/javascript",GIF:"image/gif",JPEG:"image/jpeg",PNG:"image/png",XPNG:"image/x-png",OCTSTREAM:"application/octet-stream"},Kekule.IO.DataFormatsManager={_formats:{},register:function(t,r,l,a,i,n,o){var u=null;u||(u=e._formats[t]),u||(u={id:t},e._formats[t]=u),u.mimeType=r;var s=DataType.isArrayValue(l)?l:[l];return s=s.map(function(e){return e?e.toLowerCase():e}),u.fileExts?Kekule.ArrayUtils.pushUnique(u.fileExts,s):u.fileExts=s,a&&a!==Kekule.IO.ChemDataType.UNKNOWN&&(u.dataType=a),u.title=i,u.description=n,o&&(u=Object.extend(u,o)),u},unregister:function(t){e._formats[t]&&delete e._formats[t]},getAllIds:function(){return Kekule.ObjUtils.getOwnedFieldNames(e._formats)},getFormatInfo:function(t){return e._formats[t]||null},getMimeType:function(t){var r=e.getFormatInfo(t);return r?r.mimeType:null},getFileExts:function(t){var r=e.getFormatInfo(t);return r?r.fileExts:null},findFormat:function(t,r){if(!t&&!r)return null;for(var l=e.getAllIds(),a=!1,i=0,n=l.length;i<n;++i){var o=e.getFormatInfo(l[i]);if((a=t&&t===o.mimeType)||(a=r&&o.fileExts.indexOf(r.toLowerCase())>=0),a)return o}return null},findFormatId:function(e,t){var r=Kekule.IO.DataFormatsManager.findFormat(e,t);return r?r.id:null}};var e=Kekule.IO.DataFormatsManager;Kekule.IO.dataFormatsManager=Kekule.IO.DataFormatsManager,Kekule.IO.ChemDataReader=Class.create(ObjectEx,{initialize:function(e){this.tryApplySuper("initialize")},CLASS_NAME:"Kekule.IO.ChemDataReader",readData:function(e,t,r,l){if(!t){var a=Kekule.IO.DataFormatsManager.getFormatInfo(r);(t=a?a.dataType:null)||(t="string"==typeof e?Kekule.IO.ChemDataType.TEXT:e.getElementsByTagName?Kekule.IO.ChemDataType.DOM:Kekule.IO.ChemDataType.BINARY)}var i=this.doReadData(e,t,r,l||{});if(i instanceof Kekule.ChemObject&&i.getSrcInfo){var n=i.getSrcInfo();n.data=e,n.dataType=t;var o=Kekule.IO.DataFormatsManager.getFormatInfo(r);o&&(n.format=r,n.mimeType=o.mimeType,n.possibleFileExts=o.fileExts)}return i},doReadData:function(e,t,r,l){}}),Kekule.IO.ChemDataWriter=Class.create(ObjectEx,{CLASS_NAME:"Kekule.IO.ChemDataWriter",initialize:function(e){this.tryApplySuper("initialize")},writeData:function(e,t,r,l){if(!t){var a=Kekule.IO.DataFormatsManager.getFormatInfo(r);t=a?a.dataType:null}return this.doWriteData(e,t,r,l||{})},doWriteData:function(e,t,r,l){}}),Kekule.IO.ChemDataReaderManager={_readers:[],register:function(e,t,r,l){if(e&&t&&r&&(!DataType.isArrayValue(r)||r.length)){if(Kekule.IO.ChemDataReaderManager.getReaderInfoById(e))return Kekule.raise(Kekule.$L("ErrorMsg.READER_ID_ALREADY_EXISTS")),null;var a={id:e,readerClass:t,formatId:DataType.isArrayValue(r)?r:[r]};return a=Object.extend(a,l),Kekule.IO.ChemDataReaderManager._readers.push(a),a}},unregister:function(e){for(var t=-1,r=Kekule.IO.ChemDataReaderManager._readers,l=0,a=r.length;l<a;++l){if(r[l].id===e){t=l;break}}if(t>=0){var i=r[t];return r.splice(t,1),i}return null},getAllReadableFormatIds:function(){for(var e=[],t=Kekule.IO.ChemDataReaderManager._readers,r=0,l=t.length;r<l;++r){var a=t[r].formatId;Kekule.ArrayUtils.pushUnique(e,a)}return e},getAllReadableFormats:function(){for(var t=[],r=Kekule.IO.ChemDataReaderManager.getAllReadableFormatIds(),l=0,a=r.length;l<a;++l){var i=e.getFormatInfo(r[l]);i&&t.push(i)}return t},getAvailableReaderInfos:function(e){for(var t=[],r=Kekule.IO.ChemDataReaderManager._readers,l=r.length-1;l>=0;--l)Kekule.ObjUtils.match(r[l],e)&&t.push(r[l]);return t},getReaderInfo:function(e){for(var t=Kekule.IO.ChemDataReaderManager._readers,r=t.length-1;r>=0;--r)if(Kekule.ObjUtils.match(t[r],e))return t[r];return null},getReaderInfoById:function(e){return Kekule.IO.ChemDataReaderManager.getReaderInfo({id:e})},getReaderInfoByFormat:function(e,t){for(var r=Kekule.IO.ChemDataReaderManager._readers,l=r.length-1;l>=0;--l)if((!t||Kekule.ObjUtils.match(r[l],t))&&r[l].formatId.indexOf(e)>=0)return r[l];return null},getReaderInfoByFileExt:function(e,t){var r=Kekule.IO.DataFormatsManager.findFormatId(null,e);return r?Kekule.IO.ChemDataReaderManager.getReaderInfoByFormat(r,t):null},createReaderOfInfo:function(e){return new e.readerClass(e.createOptions)},getReaderOfInfo:function(e){return e.instance||(e.instance=Kekule.IO.ChemDataReaderManager.createReaderOfInfo(e)),e.instance},createReader:function(e){var t=Kekule.IO.ChemDataReaderManager.getReaderInfo(e);if(t)return Kekule.IO.ChemDataReaderManager.createReaderOfInfo(t)},getReader:function(e){var t=Kekule.IO.ChemDataReaderManager.getReaderInfo(e);if(t)return Kekule.IO.ChemDataReaderManager.getReaderOfInfo(t)},createReaderById:function(e){return Kekule.IO.ChemDataReaderManager.createReader({id:e})},getReaderById:function(e){return Kekule.IO.ChemDataReaderManager.getReader({id:e})},createReaderByFormat:function(e,t){var r=Kekule.IO.ChemDataReaderManager.getReaderInfoByFormat(e,t);return r?Kekule.IO.ChemDataReaderManager.createReaderOfInfo(r):null},getReaderByFormat:function(e,t){var r=Kekule.IO.ChemDataReaderManager.getReaderInfoByFormat(e,t);return r?Kekule.IO.ChemDataReaderManager.getReaderOfInfo(r):null},createReaderByFileExt:function(e,t){var r=Kekule.IO.ChemDataReaderManager.getReaderInfoByFileExt(e,t);return r?Kekule.IO.ChemDataReaderManager.createReaderOfInfo(r):null},getReaderByFileExt:function(e,t){var r=Kekule.IO.ChemDataReaderManager.getReaderInfoByFileExt(e,t);return r?Kekule.IO.ChemDataReaderManager.getReaderOfInfo(r):null},createReaderByMimeType:function(e){var t=Kekule.IO.DataFormatsManager.findFormatId(e,null);return t?Kekule.IO.ChemDataReaderManager.createReaderByFormat(t):null},getReaderByMimeType:function(e){var t=Kekule.IO.DataFormatsManager.findFormatId(e,null);return t?Kekule.IO.ChemDataReaderManager.getReaderByFormat(t):null}},Kekule.IO.ChemDataWriterManager={_writers:[],register:function(e,t,r,l,a){if(e&&t&&l&&(!DataType.isArrayValue(l)||l.length)){var i=Kekule.IO.ChemDataWriterManager.getWriterInfoById(e);if(i)return t===i.writerClass?(Kekule.ArrayUtils.pushUnique(i.srcClasses,r),Kekule.ArrayUtils.pushUnique(i.formatId,l),i):(Kekule.raise(Kekule.$L("ErrorMsg.WRITER_ID_ALREADY_EXISTS")),null);var n={id:e,writerClass:t,srcClasses:r,formatId:DataType.isArrayValue(l)?l:[l]};return n=Object.extend(n,a),Kekule.IO.ChemDataWriterManager._writers.push(n),n}},unregister:function(e){for(var t=-1,r=Kekule.IO.ChemDataWriterManager._writers,l=0,a=r.length;l<a;++l){if(r[l].id===e){t=l;break}}if(t>=0){var i=r[t];return r.splice(t,1),i}return null},getAllWritableFormatIds:function(){for(var e=[],t=Kekule.IO.ChemDataWriterManager._writers,r=0,l=t.length;r<l;++r){var a=t[r].formatId;Kekule.ArrayUtils.pushUnique(e,a)}return e},getAllWritableFormats:function(){for(var t=[],r=Kekule.IO.ChemDataWriterManager.getAllWritableFormatIds(),l=0,a=r.length;l<a;++l){var i=e.getFormatInfo(r[l]);i&&t.push(i)}return t},getAvailableWriterInfos:function(e,t){for(var r=[],l=ClassEx.isClass(t)?t:t.getClass?t.getClass():t?null:void 0,a=Kekule.IO.ChemDataWriterManager._writers,i=a.length-1;i>=0;--i)if(Kekule.ObjUtils.match(a[i],e))if(void 0!==l){if(l)for(var n=0,o=a[i].srcClasses.length;n<o;++n)ClassEx.isOrIsDescendantOf(l,a[i].srcClasses[n])&&r.push(a[i])}else r.push(a[i]);return r},getWriterInfo:function(e,t){for(var r=Kekule.IO.ChemDataWriterManager._writers,l=r.length-1;l>=0;--l)if(Kekule.ObjUtils.match(r[l],e)){if(t){for(var a=0,i=r[l].srcClasses.length;a<i;++a)if(t instanceof r[l].srcClasses[a])return r[l];return null}return r[l]}return null},getWriterInfoById:function(e,t){return Kekule.IO.ChemDataWriterManager.getWriterInfo({id:e},t)},getWriterInfoByFormat:function(e,t,r){for(var l=Kekule.IO.ChemDataWriterManager._writers,a=l.length-1;a>=0;--a)if((!t||Kekule.ObjUtils.match(l[a],t))&&l[a].formatId.indexOf(e)>=0){if(r){for(var i=0,n=l[a].srcClasses.length;i<n;++i)if(r instanceof l[a].srcClasses[i])return l[a];return null}return l[a]}return null},getWriterInfoByFileExt:function(e,t,r){var l=Kekule.IO.DataFormatsManager.findFormatId(null,e);return l?Kekule.IO.ChemDataWriterManager.getWriterInfoByFormat(l,t,r):null},createWriterOfInfo:function(e){return new e.writerClass(e.createOptions)},getWriterOfInfo:function(e){return e.instance||(e.instance=Kekule.IO.ChemDataWriterManager.createWriterOfInfo(e)),e.instance},createWriter:function(e,t){var r=Kekule.IO.ChemDataWriterManager.getWriterInfo(e,t);return r?Kekule.IO.ChemDataWriterManager.createWriterOfInfo(r):null},getWriter:function(e,t){var r=Kekule.IO.ChemDataWriterManager.getWriterInfo(e,t);return r?Kekule.IO.ChemDataWriterManager.getWriterOfInfo(r):null},createWriterById:function(e,t){return Kekule.IO.ChemDataWriterManager.createWriter({id:e},t)},getWriterById:function(e,t){return Kekule.IO.ChemDataWriterManager.getWriter({id:e},t)},createWriterByFormat:function(e,t,r){var l=Kekule.IO.ChemDataWriterManager.getWriterInfoByFormat(e,t,r);return l?Kekule.IO.ChemDataWriterManager.createWriterOfInfo(l):null},getWriterByFormat:function(e,t,r){var l=Kekule.IO.ChemDataWriterManager.getWriterInfoByFormat(e,t,r);return l?Kekule.IO.ChemDataWriterManager.getWriterOfInfo(l):null},createWriterByFileExt:function(e,t,r){var l=Kekule.IO.ChemDataWriterManager.getWriterInfoByFileExt(e,t,r);return l?Kekule.IO.ChemDataWriterManager.createWriterOfInfo(l):null},getWriterByFileExt:function(e,t,r){var l=Kekule.IO.ChemDataWriterManager.getWriterInfoByFileExt(e,t,r);return l?Kekule.IO.ChemDataWriterManager.getWriterOfInfo(l):null},createWriterByMimeType:function(e,t){var r=Kekule.IO.DataFormatsManager.findFormatId(e,null);return r?Kekule.IO.ChemDataWriterManager.createWriterByFormat(r,null,t):null},getWriterByMimeType:function(e){var t=Kekule.IO.DataFormatsManager.findFormatId(e,null);return t?Kekule.IO.ChemDataWriterManager.getWriterByFormat(t,null):null}},Kekule.IO.loadFormatData=function(e,t,r){var l=Kekule.IO.ChemDataReaderManager.getReaderByFormat(t);if(l){var a=l.readData(e,null,t,r);if(!1===a){var i=Kekule.$L("ErrorMsg.FAIL_TO_READ_FORMAT")+t;Kekule.raise(i)}return a}i=Kekule.$L("ErrorMsg.NO_SUITABLE_READER_FOR_FORMAT")+t;return Kekule.raise(i),null},Kekule.IO.loadMimeData=function(e,t,r){return Kekule.IO.loadTypedData(e,t,null,r)},Kekule.IO.loadTypedData=function(e,t,r,l){var a;r&&(a=Kekule.UrlUtils.extractFileExt(r));var i,n=Kekule.IO.DataFormatsManager.findFormatId(t||null,a);if(n&&(i=Kekule.IO.loadFormatData(e,n,l)),!1!==i){if(i instanceof Kekule.ChemObject&&i.getSrcInfo){var o=i.getSrcInfo();t&&(o.mimeType=t),a&&(o.fileExt=a),r&&(o.url=r,o.fileName=r)}return i}var u=t?Kekule.$L("ErrorMsg.NO_SUITABLE_READER_FOR_MIMETYPE")+t:Kekule.$L("ErrorMsg.NO_SUITABLE_READER_FOR_FILEEXT")+a;return Kekule.raise(u),null},Kekule.IO.loadFileData=function(e,t,r,l){if(Kekule.BrowserFeature.fileapi){var a,i=e.name,n=Kekule.UrlUtils.extractFileExt(i);if(!(a=r?Kekule.IO.DataFormatsManager.getFormatInfo(r):Kekule.IO.DataFormatsManager.findFormat(null,n))){var o=Kekule.$L("ErrorMsg.NO_SUITABLE_READER_FOR_FILEEXT")+n;return void Kekule.raise(o)}var u=Kekule.IO.ChemDataType.isBinaryType(a.dataType),s=new FileReader;s.onload=function(e){var r=s.result,n=Kekule.IO.loadFormatData(r,a.id,l);n&&n.getSrcInfo&&(n.getSrcInfo().fileName=i);t(n,!1!==n,r)},u?s.readAsArrayBuffer(e):s.readAsText(e)}else Kekule.error(Kekule.$L("ErrorMsg.FILE_API_NOT_SUPPORTED"))},Kekule.IO.loadUrlData=function(e,t,r,l){if(!Kekule.Ajax)return Kekule.raise(Kekule.$L("ErrorMsg.AJAX_FILELOADER_NOT_FOUND")),null;Kekule.Ajax.sendRequest(e,function(a,i,n){if(a&&n){var o;if(r&&(o=Kekule.IO.DataFormatsManager.getFormatInfo(r)),!r){var u=Kekule.Ajax.getResponseMimeType(i);o=Kekule.IO.DataFormatsManager.findFormat(u)}if(!r){var s=Kekule.UrlUtils.extractFileExt(e);o=Kekule.IO.DataFormatsManager.findFormat(null,s)}if(!o){var d=Kekule.$L("ErrorMsg.NO_SUITABLE_READER_FOR_FILEEXT")+s;return void Kekule.raise(d)}var m=Kekule.IO.loadFormatData(a,o.id,l);m.getSrcInfo().fileName=e,t(m,n=!1!==m,a)}else Kekule.raise(Kekule.$L("ErrorMsg.FAIL_TO_LOAD_FILE_URL")+e)})},Kekule.IO.saveFormatData=function(e,t,r){var l=Kekule.IO.ChemDataWriterManager.getWriterByFormat(t,null,e);if(l)return l.writeData(e,null,t,r);var a=Kekule.$L("ErrorMsg.NO_SUITABLE_WRITER_FOR_FORMAT")+t;return Kekule.raise(a),null},Kekule.IO.saveMimeData=function(e,t,r){return Kekule.IO.saveTypedData(e,t,null,r)},Kekule.IO.saveTypedData=function(e,t,r,l){var a;r&&((a=Kekule.UrlUtils.extractFileExt(r))||(a=r));var i,n=Kekule.IO.DataFormatsManager.findFormatId(t||null,a);if(n&&(i=Kekule.IO.saveFormatData(e,n,l)),Kekule.ObjUtils.isUnset(i)){var o=t?Kekule.$L("ErrorMsg.NO_SUITABLE_WRITER_FOR_MIMETYPE")+t:Kekule.$L("ErrorMsg.NO_SUITABLE_WRITER_FOR_FILEEXT")+a;return Kekule.raise(o),null}return i}}(),function(){"use strict";Kekule.globalOptions.add("IO.cml",{prettyPrint:!0,enableReadRootObjList:!0,defaultRootObjListHolder:Kekule.ChemSpace}),Kekule.IO.CML={CML2CORE_NAMESPACE_URI:"http://www.xml-cml.org/schema/cml2/core",CML3_SCHEMA_NAMESPACE_URI:"http://www.xml-cml.org/schema",ARRAY_VALUE_DELIMITER:" ",TYPED_ELEM_NAMES:["string","integer","float"],TYPED_ARRAY_ELEM_NAMES:["stringArray","integerArray","floatArray"],ATOMS_REF_ATTRIBS:["atomRef","atomRefs2","atomRefs3","atomRefs4","atomRefs","atomRefArray"],BONDS_REF_ATTRIBS:["bondRef","bondRefs","bondRefArray"],MOL_REF_ATTRIBS:["moleculeRef","moleculeRefs"],DEFAULT_VALUE_DELIMITER_PATTERN:/\s+/gm},Kekule.IO.CML.LEGAL_CORE_NAMESPACE_URIS=[Kekule.IO.CML.CML2CORE_NAMESPACE_URI,Kekule.IO.CML.CML3_SCHEMA_NAMESPACE_URI],Kekule.IO.CmlUtils={_cmlUnitConvMap:[["m","m","m",!0],["second","s","sec",!0],["hour","h","hr",!1],["kg","kg","kg",!0],["k","K","K",!0],["mol","mol","mol",!0],["candela","cd","cd",!0],["radian","rad","rad",!0],["steradian","sr","sr",!0],["hertz","Hz","Hz",!0],["newton","N","N",!0],["joule","J","J",!0],["watt","W","W",!0],["pascal","Pa","Pa",!0],["coulomb","C","C",!0],["volt","V","V",!0],["ampere","A","A",!0],["ohm","[Omega]","Ω",!0],["farad","F","F",!0],["siemens","S","S",!0],["weber","Wb","Wb",!0],["tesla","T","T",!0],["henry","H","H",!0],["becquerel","Bq","Bq",!0],["gray","Gy","Gy",!0],["sievert","Sv","Sv",!0],["katal","kat","kat",!0],["molarity","_i_M__i_","mol/L",!0],["molality","_i_m__i_","mol/kg",!0],["m2","m2","m2",!0],["m3","m3","m3",!0],["m.s-1","m.s-1","m/s",!0],["m.s-2","m.s-2","m·s-2",!0],["rad.s-1","rad.s-1","rad/s",!0],["n.s","N.s","N·s",!0],["n.m.s","N.m.s","N·m·s",!0],["n.m","N.m","N·m",!0],["m-1","m-1","m-1",!0],["kg.m-3","kg.m-3","kg·m-3",!0],["kg-1.m3","kg-1.m3","kg-1·m3",!0],["m-3.mol","m-3.mol","m-3·mol",!0],["m3.mol-1","m3.mol-1","m3/mol",!0],["j.k-1","J.K-1","J/K",!0],["j.k-1.mol-1","J.K-1.mol-1","J·K-1·mol-1",!0],["j.k-1.kg-1","J.K-1.kg-1","J·K-1·kg-1",!0],["j.mol-1","J.mol-1","J/mol",!0],["j.kg-1","J.kg-1","J/kg",!0],["j.m-3","J.m-3","J·m-3",!0],["n.m-1","N.m-1 = J.m-2","N/m",!0],["w.m-2","W.m-2","W·m-2",!0],["w.m-1.k-1","W.m-1.K-1","W·m-1·K-1",!0],["m2.s-1","m2.s-1","m2/s",!0],["pa.s","Pa.s","Pa·s",!0],["pa.s","N.s.m-2","Pa·s",!0],["c.m-3","C.m-3","C·m-3",!0],["a.m-2","A.m-2","A·m-2",!0],["s.m-1","S.m-1","S/m",!0],["s.m2.mol-1","S.m2.mol-1","S·m2/mol",!0],["f.m-1","F.m-1","F/m",!0],["h.m-1","H.m-1","H/m",!0],["v.m-1","V.m-1","V/m",!0],["a.m-1","A.m-1","A/m",!0],["cd.m-2","cd.m-2","cd·m-2",!0],["c.kg-1","C.kg-1","C/kg",!0],["gy.s-1","Gy.s-1","Gy/s",!0],["j.m-1","J.m-1","J/m",!0],["ang","[Aring]","Å",!1],["deg","[deg]","deg",!1],["ang3","A3","Å3",!1],["celsius","[deg]C","℃",!1],["debye","D","D",!1],["electron","e","e",!1],["hartree","hart","hart",!1],["gpa","GPa","GPa",!1],["gpa-1","GPa-1","GPa-1",!1],["atmosphere","atm","atm",!1],["kcal.mol-1.ang-1","kcal mol-1 ang-1","kcal·mol-1·ang-1",!1],["kj.mol-1","kj mol-1","kj/mol",!1],["l","L","L",!1],["ml","mL","mL",!1],["kcal.ang-1","kcal.ang-1","kcal/Å",!1],["kcal.rad-1","kcal.rad-1","kcal/rad",!1],["ph","pH","pH",!1],["centipoise","cp","cp",!1],["km.s-1","km/s","km/s",!1],["arbitrary","arb","arb",!1]],tryParseFloat:function(e){var t=parseFloat(e);return Kekule.NumUtils.isNormalNumber(t)?t:e},convertSimpleValueByDataType:function(e,t,r){var l;switch(t){case"xsd:boolean":l=Kekule.StrUtils.strToBool(e);break;case"xsd:float":case"xsd:double":case"xsd:duration":case"xsd:decimal":l=parseFloat(e);break;case"xsd:integer":case"xsd:nonPositiveInteger":case"xsd:negativeInteger":case"xsd:long":case"xsd:int":case"xsd:short":case"xsd:byte":case"xsd:nonNegativeInteger":case"xsd:unsignedLong":case"xsd:unsignedInt":case"xsd:unsignedShort":case"xsd:unsignedByte":case"xsd:positiveInteger":l=parseInt(e);break;default:l=e}return l},getCmlTypeForDataType:function(e){return e==DataType.INT?"xsd:integer":e==DataType.FLOAT?"xsd:float":e==DataType.BOOL?"xsd:boolean":null},cmlNsTokenToKekule:function(e){return e.replace(/\:/g,".")},kekuleNsTokenToCml:function(e){return e.replace(/\./g,":")},getCmlNsValueDetails:function(e){var t=e.indexOf(":");return{namespace:t>=0?e.substring(0,t):"",localName:t>=0?e.substr(t+1):e}},getCmlNsValueLocalPart:function(e){var t=e.indexOf(":");return t>=0?e.substr(t+1):e},cmlUnitStrToMetricsUnitSymbol:function(e){for(var t,r,l=Kekule.IO.CmlUtils.getCmlNsValueLocalPart(e),a=l.toLowerCase(),i=a.length>3&&a.endsWith("s")?a.substr(0,a.length-1):null,n=(Kekule.Unit,Kekule.IO.CmlUtils._cmlUnitConvMap),o=0,u=n.length;o<u;++o)if(l===n[o][0]||l===n[o][1]){t=n[o][2];break}if(!t)for(o=0,u=n.length;o<u;++o)if(a===n[o][0].toLowerCase()||a===n[o][1].toLowerCase()){t=n[o][2];break}if(!t&&i)for(o=0,u=n.length;o<u;++o)if(i===n[o][0].toLowerCase()||i===n[o][1].toLowerCase()){t=n[o][2];break}t||(t=(r=Kekule.Unit.getUnit(l,!0))&&r.symbol);t||(t=(r=Kekule.Unit.getUnitByName(l,!0))&&r.symbol);!t&&i&&(t=(r=Kekule.Unit.getUnitByName(i,!0))&&r.symbol);return t||l},metricsUnitSymbolToCmlUnitStr:function(e){for(var t,r=Kekule.IO.CmlUtils._cmlUnitConvMap,l=0,a=r.length;l<a;++l){var i=r[l];if(e===i[2]){t=(i[3]?"siUnits:":"units:")+i[0];break}}return t||(t="units:"+e),t},cmlBondOrderToKekule:function(e){var t=parseInt(e);if(t!=t)switch(e.toUpperCase()){case"A":t=Kekule.BondOrder.EXPLICIT_AROMATIC;break;case"D":t=Kekule.BondOrder.DOUBLE;break;case"T":t=Kekule.BondOrder.TRIPLE;break;case"S":default:t=Kekule.BondOrder.SINGLE}return t},kekuleBondOrderToCml:function(e){switch(e){case Kekule.BondOrder.EXPLICIT_AROMATIC:return"A";case Kekule.BondOrder.QUAD:return"4";case Kekule.BondOrder.DOUBLE:return"D";case Kekule.BondOrder.TRIPLE:return"T";default:return"S"}},cmlBondStereoToKekule:function(e){var t;switch(e.toUpperCase()){case"E":t=Kekule.BondStereo.E;break;case"Z":t=Kekule.BondStereo.Z;break;case"C":t=Kekule.BondStereo.CIS;break;case"T":t=Kekule.BondStereo.TRANS;break;case"W":t=Kekule.BondStereo.UP;break;case"H":t=Kekule.BondStereo.DOWN;break;default:t=Kekule.BondStereo.NONE}return t},kekuleBondStereoToCml:function(e){switch(e){case Kekule.BondStereo.UP:return{value:"W"};case Kekule.BondStereo.UP_INVERTED:return{value:"W",invert:!0};case Kekule.BondStereo.DOWN:return{value:"H"};case Kekule.BondStereo.DOWN_INVERTED:return{value:"H",invert:!0};case Kekule.BondStereo.E:return{value:"E"};case Kekule.BondStereo.Z:return{value:"Z"};case Kekule.BondStereo.CIS:return{value:"C"};case Kekule.BondStereo.TRANS:return{value:"T"};default:return{value:null}}},reagentRoleToKekule:function(e){var t=Kekule.ReactionRole;switch(e){case"reagent":return t.REAGENT;case"catalyst":case"solvent":return t.CATALYST;default:return e}},kekuleReagentRoleToCml:function(e){var t=Kekule.ReactionRole;switch(e){case t.REAGENT:return"reagent";case t.CATALYST:return"catalyst";case t.SOLVENT:return"solvent";default:return e}},isDummyElementType:function(e){return"Du"==e||"Dummy"==e},isRGroupElementType:function(e){return"R"==e},isAtomListElementType:function(e){return"L"==e},getNodeElementType:function(e){if(e instanceof Kekule.Atom)return e.getSymbol();if(!(e instanceof Kekule.Pseudoatom))return e instanceof Kekule.VariableAtom?"R":e instanceof Kekule.StructureFragment?"R":e.getSymbol?e.getSymbol():"*";switch(e.getAtomType()){case Kekule.PseudoatomType.DUMMY:return"Du";case Kekule.PseudoatomType.ANY:return"A";case Kekule.PseudoatomType.HETERO:return"Q";case Kekule.PseudoatomType.CUSTOM:default:return e.getSymbol()}},createNodeByCmdElementType:function(e,t,r){return Kekule.IO.CmlUtils.isDummyElementType(t)?new Kekule.Pseudoatom(e,Kekule.PseudoatomType.DUMMY):Kekule.IO.CmlUtils.isRGroupElementType(t)?new Kekule.RGroup(e):Kekule.IO.CmlUtils.isAtomListElementType(t)?new Kekule.VariableAtom(e):Kekule.Element.isElementSymbolAvailable(t)||t==Kekule.Element.UNSET_ELEMENT?new Kekule.Atom(e,t,Math.round(r)):new Kekule.Pseudoatom(e,Kekule.PseudoatomType.CUSTOM,t)}};var e=Kekule.IO.CmlUtils;Kekule.IO.CmlDomUtils={splitCmlArrayValue:function(e){return"object"==typeof e&&e.length?e:Kekule.StrUtils.normalizeSpace(Kekule.StrUtils.trim(e)).split(Kekule.IO.CML.ARRAY_VALUE_DELIMITER)},mergeToCmlArrayValue:function(e){return e.join(" ")},analysisCmlFormulaConciseValue:function(e){for(var t,r=Kekule.IO.CmlDomUtils.splitCmlArrayValue(e),l=0,a=r.length,i=[],n=null;l<a;){var o=r[l],u=parseFloat(o);u!=u?(n&&i.push(n),n={elementType:o}):n?(n.count=u,i.push(n),n=null):l==a-1&&(t=u),++l}return{isotopes:i,formalCharge:t}},getCmlBuiltinElemInfo:function(e,t,r){var l=e.getAttribute("builtin");return!l&&t&&(e.getAttributeNS?l=e.getAttributeNS(t,"builtin"):r&&(l=r.getAttributeNS(t,"builtin",e))),l?{name:l,value:Kekule.DomUtils.getElementText(e)}:null},readCmlTypedPropertyElem:function(e,t,r){var l;if(!(l=e.getAttribute("builtin"))&&t&&(e.getAttributeNS?l=e.getAttributeNS(t,"builtin"):r&&(l=r.getAttributeNS(t,"builtin",e))),l){var a=Kekule.DomUtils.getElementText(e);switch(Kekule.DomUtils.getLocalName(e)){case"float":a=parseFloat(a);break;case"integer":a=parseInt(a)}return{name:l,value:a}}return null},readCmlTypedPropertyArrayElem:function(e,t,r){var l;if(!(l=e.getAttribute("builtin"))&&t&&(e.getAttributeNS?l=e.getAttributeNS(t,"builtin"):r&&(l=r.getAttributeNS(t,"builtin",e))),l){var a=Kekule.DomUtils.getElementText(e),i=Kekule.IO.CmlDomUtils.splitCmlArrayValue(a);switch(Kekule.DomUtils.getLocalName(e)){case"float":for(var n=0,o=i.length;n<o;++n)i[n]=parseFloat(i[n]);break;case"integer":for(n=0,o=i.length;n<o;++n)i[n]=parseInt(i[n])}return{name:l,values:i}}return null},hasDirectCmlTypedElemChildren:function(e,t){for(var r=0,l=Kekule.IO.CML.TYPED_ELEM_NAMES.length;r<l;++r){var a=Kekule.IO.CML.TYPED_ELEM_NAMES[r];if(Kekule.DomUtils.getDirectChildElems(e,null,a,t).length>0)return!0}return!1},hasDirectCmlTypedArrayElemChildren:function(e,t){for(var r=0,l=Kekule.IO.CML.TYPED_ARRAY_ELEM_NAMES.length;r<l;++r){var a=Kekule.IO.CML.TYPED_ARRAY_ELEM_NAMES[r];if(Kekule.DomUtils.getDirectChildElems(e,null,a,t).length>0)return!0}return!1},isCmlTypedElem:function(e,t){var r=Kekule.IO.CML.TYPED_ELEM_NAMES.indexOf(Kekule.DomUtils.getLocalName(e))>=0;return t&&(r=r&&e.namespaceURI==t),r},isCmlTypedArrayElem:function(e,t){var r=Kekule.IO.CML.TYPED_ARRAY_ELEM_NAMES.indexOf(Kekule.DomUtils.getLocalName(e))>=0;return t&&(r=r&&e.namespaceURI==t),r},isCmlBuiltInMarkedElem:function(e,t){var r=Kekule.DomUtils.hasAttribute(e,"builtin");return t&&r&&(r=e.namespaceURI===t),r},FILTER_TYPED_ELEM:1,FILTER_TYPEDARRAY_ELEM:2,FILTER_ALL:3,getCmlTypedElem:function(e,t,r){var l=e.namespaceURI,a=Kekule.DomUtils.getDirectChildElemsOfAttribValues(e,[{builtin:t}],null,null,l);if(a&&a.length>0)for(var i=a.length-1;i>=0;--i){if(r&Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM&&Kekule.IO.CmlDomUtils.isCmlTypedElem(a[i],l))return a[i];if(r&Kekule.IO.CmlDomUtils.FILTER_TYPEDARRAY_ELEM&&Kekule.IO.CmlDomUtils.isCmlTypedArrayElem(a[i],l))return a[i]}return null},getCmlTypedElems:function(e,t,r){var l=[],a=e.namespaceURI,i=Kekule.DomUtils.getDirectChildElemsOfAttribValues(e,[{builtin:t}],null,null,a);if(i&&i.length>0)for(var n=i.length-1;n>=0;--n)r&Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM&&Kekule.IO.CmlDomUtils.isCmlTypedElem(i[n],a)?l.push(i[n]):r&Kekule.IO.CmlDomUtils.FILTER_TYPEDARRAY_ELEM&&Kekule.IO.CmlDomUtils.isCmlTypedArrayElem(i[n],a)&&l.push(i[n]);return l.length?l:null},getCmlTypedElemValue:function(e,t,r,l){r||(r=Kekule.IO.CmlDomUtils.FILTER_ALL);var a=Kekule.IO.CmlDomUtils.getCmlTypedElem(e,t,r);if(a)return Kekule.DomUtils.getElementText(a)},getMultipleCmlTypedElemValues:function(e,t,r,l){r||(r=Kekule.IO.CmlDomUtils.FILTER_ALL);var a=Kekule.IO.CmlDomUtils.getCmlTypedElems(e,t,r);if(a){for(var i=[],n=0,o=a.length;n<o;++n)i.push(Kekule.DomUtils.getElementText(a[n]));return i}return null},getCmlElemAttribute:function(e,t,r,l){r||(r=Kekule.IO.CmlDomUtils.FILTER_ALL);var a=Kekule.DomUtils.getSameNSAttributeValue(e,t,l);return a||(a=Kekule.IO.CmlDomUtils.getCmlTypedElemValue(e,t,r,l)),a},getMultipleCmlElemAttribute:function(e,t,r,l){r||(r=Kekule.IO.CmlDomUtils.FILTER_ALL);var a=Kekule.DomUtils.getSameNSAttributeValue(e,t,l);return a||(a=Kekule.IO.CmlDomUtils.getMultipleCmlTypedElemValues(e,t,r,l)),a},setCmlElemAttribute:function(e,t,r,l){return Kekule.DomUtils.setSameNSAttributeValue(e,t,r,l)},fetchCmlElemAttributeValuesToJson:function(e,t,r,l){t||(t=Kekule.IO.CmlDomUtils.FILTER_ALL);for(var a=e.namespaceURI,i=Kekule.DomUtils.fetchAttributeValuesToJson(e,a,!0),n=Kekule.DomUtils.getDirectChildElems(e,null,null,a),o=0,u=n.length;o<u;++o){var s=n[o];if(t&Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM&&(Kekule.IO.CmlDomUtils.isCmlTypedElem(s,a)||Kekule.IO.CmlDomUtils.isCmlBuiltInMarkedElem(s,a)))(d=Kekule.IO.CmlDomUtils.readCmlTypedPropertyElem(s,a,l))&&(i[d.name]&&r?i[d.name]+=Kekule.IO.CML.ARRAY_VALUE_DELIMITER+d.value:i[d.name]=d.value);else if(t&Kekule.IO.CmlDomUtils.FILTER_TYPEDARRAY_ELEM&&Kekule.IO.CmlDomUtils.isCmlTypedArrayElem(s,a)){var d;(d=Kekule.IO.CmlDomUtils.getCmlBuiltinElemInfo(s,a,l))&&(i[d.name]&&r?i[d.name]+=Kekule.IO.CML.ARRAY_VALUE_DELIMITER+d.value:i[d.name]=d.value)}}return i},isScalarElem:function(e,t){var r="scalar"==Kekule.DomUtils.getLocalName(e);return t&&(r=r&&e.namespaceURI==t),r},getCmlId:function(e,t){return Kekule.IO.CmlDomUtils.getCmlElemAttribute(e,"id",Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM,t)},setCmlId:function(e,t,r){return Kekule.IO.CmlDomUtils.setCmlElemAttribute(e,"id",t,r)},getCmlTitle:function(e,t){return Kekule.IO.CmlDomUtils.getCmlElemAttribute(e,"title",Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM,t)},setCmlTitle:function(e,t,r){return Kekule.IO.CmlDomUtils.setCmlElemAttribute(e,"title",t,r)}};var t=Kekule.IO.CmlDomUtils;Kekule.IO.CmlElementReaderFactory={_readers:{},register:function(e,t){if(Kekule.ArrayUtils.isArray(e))for(var r=0,l=e.length;r<l;++r)Kekule.IO.CmlElementReaderFactory.register(e[r],t);else Kekule.IO.CmlElementReaderFactory._readers[e.toLowerCase()]=t},getReader:function(e){var t;t="string"!=typeof e?Kekule.DomUtils.getLocalName(e):e;var r=Kekule.IO.CmlElementReaderFactory._readers[t.toLowerCase()];return r?new r:null}},Kekule.IO.CmlElementWriterFactory={_writers:{},register:function(e,t){if(Kekule.ArrayUtils.isArray(e))for(var r=0,l=e.length;r<l;++r)Kekule.IO.CmlElementWriterFactory.register(e[r],t);else Kekule.IO.CmlElementWriterFactory._writers[e]=t},getWriter:function(e){var t;t="string"!=typeof e?DataType.getType(e):e;var r=Kekule.IO.CmlElementWriterFactory._writers[t];if(!r&&e.getClassName)for(var l=e,a=Kekule.ObjUtils.getOwnedFieldNames(Kekule.IO.CmlElementWriterFactory._writers),i=a.length-1;i>=0;--i){var n=ClassEx.findClass(a[i]);if(n&&l instanceof n){r=Kekule.IO.CmlElementWriterFactory._writers[a[i]];break}}return r?new r:null}},Kekule.IO.CmlElementHandler=Class.create(ObjectEx,{CLASS_NAME:"Kekule.IO.CmlElementHandler",initialize:function(){this.tryApplySuper("initialize"),this._childHandlers=[]},doFinalize:function(){for(var e=this._childHandlers.length-1;e>=0;--e){var t=this._childHandlers[e];t&&t.finalize&&t.finalize()}this.tryApplySuper("doFinalize")},initProperties:function(){this.defineProp("domHelper",{dataType:"Kekule.DomHelper",serializable:!1,getter:function(){return this.getPropStoreFieldValue("domHelper")||this.setPropStoreFieldValue("domHelper",new Kekule.DomHelper),this.getPropStoreFieldValue("domHelper")}}),this.defineProp("coreNamespaceURI",{dataType:DataType.STRING,serializable:!1}),this.defineProp("namespaces",{dataType:DataType.ARRAY,serializable:!1}),this.defineProp("rootEvoker",{dataType:DataType.Object,serializable:!1})},getPrefixForNamespaceUri:function(e){var t=this.getNamespaces();if(t)for(var r=0,l=t.length;r<l;++r)if(t[r].namespaceURI===e)return t[r].prefix},matchCoreNamespace:function(e){var t;return t=e?"string"!=typeof e?e.namespaceURI:e:"",!this.getCoreNamespaceURI()&&!t||this.getCoreNamespaceURI()&&this.getCoreNamespaceURI()==t},copySettingsToChildHandler:function(e){e.setDomHelper(this.getDomHelper()),e.setCoreNamespaceURI(this.getCoreNamespaceURI()),e.setNamespaces(this.getNamespaces()),e.setRootEvoker(this.getRootEvoker())},_appendChildHandler:function(e){Kekule.ArrayUtils.pushUnique(this._childHandlers,e)},_iterateChildHandlers:function(e,t,r){if(e)for(var l=0,a=this._childHandlers.length;l<a;++l){var i=this._childHandlers[l];i&&(e.apply(t,[i]),r&&i._iterateChildHandlers&&i._iterateChildHandlers(e,t,r))}}}),Kekule.IO.CmlElementReader=Class.create(Kekule.IO.CmlElementHandler,{CLASS_NAME:"Kekule.IO.CmlElementReader",readElement:function(e,t,r,l){var a=this.doReadElement(e,t,r,l);if(a&&a.getId&&!a.getId()&&a.setId){var i=Kekule.IO.CmlDomUtils.getCmlId(e,this.getDomHelper);i&&this.setObjId(a,i)}return a},doReadElement:function(e,t,r,l){},readChildElement:function(e,t,r){return this.doReadChildElement(e,t,r)},doReadChildElement:function(e,t,r){return this.doReadChildElementDef(e,t,r)},readChildElementDef:function(e,t,r){return this.doReadChildElementDef(e,t,r)},doReadChildElementDef:function(e,t,r){var l=this.doGetChildElementReader(e,t,r);if(!l)return null;try{return l.readElement(e,t,r)}finally{}},doGetChildElementReader:function(e,t,r){var l=Kekule.IO.CmlElementReaderFactory.getReader(e);return l&&(this.copySettingsToChildHandler(l),this._appendChildHandler(l)),l},iterateChildElements:function(e,t,r,l){for(var a=[],i=Kekule.DomUtils.getDirectChildElems(e,null,null,this.getCoreNamespaceURI()),n=0,o=i.length;n<o;++n){var u=this.readChildElement(i[n],t,r);u&&(a.push({element:i[n],result:u}),l&&l(i[n],u,t,r))}return a},doneReadingDocument:function(e){this.doDoneReadingDocument(),e&&this._iterateChildHandlers(function(t){t&&t.doneReadingDocument&&t.doneReadingDocument(e)})},doDoneReadingDocument:function(){},getLoadedObjById:function(e){var t=this.getRootEvoker();return t&&t.getLoadedObjById&&t.getLoadedObjById(e)},setObjIdMapValue:function(e,t){var r=this.getRootEvoker();r.setObjIdMapValue&&r.setObjIdMapValue(e,t)},setObjId:function(e,t){e.setId&&e.setId(t);var r=e.getId&&e.getId();r&&this.setObjIdMapValue(r,e)},_createChildObjsHolder:function(e,t){for(var r=new t,l=0,a=e.length;l<a;++l)r.appendChild(e[l]);return r}}),Kekule.IO.CmlElementWriter=Class.create(Kekule.IO.CmlElementHandler,{CLASS_NAME:"Kekule.IO.CmlElementWriter",writeObject:function(e,t,r){if(!t&&!l)return Kekule.error(Kekule.$L("ErrorMsg.CML_CAN_NOT_OUTPUT_TO_EMPTY_ELEMENT")),null;var l=t.ownerDocument;this.getDomHelper().getDocument!=l&&this.getDomHelper().setDocument(l);var a=this.doCreateElem(e,t,l);a?t.appendChild(a):a=t;var i=this.doWriteObject(e,a,r)||a;return i&&e&&(this.writeObjId(e,i),this.writeObjAdditionalInfo(e,i,r)),i},writeObjId:function(e,t){if(e.getId){var r=e.getId();!r&&e.setId&&(r=this.autoIdentifyForObj(e)),Kekule.IO.CmlDomUtils.setCmlId(t,r,this.getDomHelper())}},autoIdentifyForObj:function(e){return e.getId&&!e.getId()&&e.setId&&(e.getOwner&&e.getOwner()&&e.getOwner().getAutoId?e.setId(e.getOwner().getAutoId(e)):e.setId(this.getAutoIdForObj(e))),e.getId&&e.getId()},getAutoIdForObj:function(e){var t=e.getAutoIdPrefix?e.getAutoIdPrefix():"obj";return Kekule.IO.CmlElementWriter._UID_SEED||(Kekule.IO.CmlElementWriter._UID_SEED=(new Date).getTime()),++Kekule.IO.CmlElementWriter._UID_SEED,""+t+Kekule.IO.CmlElementWriter._UID_SEED.toString()},writeScalarAttribs:function(e,t,r){if(e.getScalarAttribs){var l=this.doGetChildObjectWriter("Kekule.Scalar");if(l)for(var a=0,i=e.getScalarAttribCount();a<i;++a)l.writeObject(e.getScalarAttribAt(a),t,r)}},writeObjInfoValues:function(e,t,r){if(e.getInfo){var l,a=this.getObjInfoKeysNeedToSaveToMetaList(e);if(!a||!a.length)return;for(var i=0,n=a.length;i<n;++i){var o=a[i],u=e.getInfoValue(a[i]);o&&u&&!Kekule.IO.CmlDomUtils.getCmlElemAttribute(t,o,this.getDomHelper())&&(l||(l=this.getOrCreateChildElem("metaDataList",t)),this.doWriteObjInfoValueItem(o,u,e,l,r))}}},doWriteObjInfoValueItem:function(e,t,r,l,a){return this.writeObjMetaValueToListElem(r,e,null,t,l)},writeObjMetaValueToListElem:function(e,t,r,l,a,i,n){i||(i="metaData");var o=this.createChildElem(i,a);return Kekule.IO.CmlDomUtils.setCmlElemAttribute(o,"name",t,this.getDomHelper()),Kekule.IO.CmlDomUtils.setCmlElemAttribute(o,"content",DataType.StringUtils.serializeValue(r),this.getDomHelper()),l&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(o,"metadataType",l,this.getDomHelper()),o},getObjInfoKeysNeedToSaveToMetaList:function(e){return e.getInfoKeys?e.getInfoKeys():null},writeObjAdditionalInfo:function(e,t,r){this.writeScalarAttribs(e,t,r),this.writeObjInfoValues(e,t,r)},doCreateElem:function(e,t){},createChildElem:function(e,t,r){var l=r||this.getCoreNamespaceURI(),a=this.getDomHelper().createElementNS(l,e);return t&&t.appendChild(a),a},getOrCreateChildElem:function(e,t,r){var l=this.getDomHelper().getElementsByTagNameNS(r,e,t)[0];return l||(l=this.createChildElem(e,t,r)),l},doWriteObject:function(e,t,r){},doGetChildObjectWriter:function(e,t,r){var l=Kekule.IO.CmlElementWriterFactory.getWriter(e);return l&&(this.copySettingsToChildHandler(l),this._appendChildHandler(l)),l},reportTypeMismatchError:function(e){Kekule.error(Kekule.$L("ErrorMsg.CML_ELEM_WRITER_TYPE_INPROPER").format(this.getClassName(),DataType.getType(e)))},addNamespace:function(e,t,r,l){this.getDomHelper().addNamespace(e,t,r,l)},addNamespaces:function(e,t,r){for(var l=0,a=t.length;l<a;++l)this.addNamespace(e,t[l].prefix,t[l].namespaceURI,r)},doneWritingDocument:function(e){this.doDoneWritingDocument(),e&&this._iterateChildHandlers(function(t){t&&t.doneWritingDocument&&t.doneWritingDocument(e)})},doDoneWritingDocument:function(){}}),Kekule.IO.CmlBaseListReader=Class.create(Kekule.IO.CmlElementReader,{CLASS_NAME:"Kekule.IO.CmlBaseListReader",doReadElement:function(e,t,r,l){var a=this.doCreateList(e);return a=this.doReadList(a,e,t,r,this.getDomHelper())},doCreateList:function(e){return[]},doAppendObjToList:function(e,t){return t&&t.push&&t.push(e),t},doReadChildElem:function(e,t,r,l,a){return t.readElement(e,a,this)},doReadList:function(e,t,r,l,a){var i=Kekule.DomUtils.getDirectChildElems(t,null,null,this.getCoreNamespaceURI());if(i)for(var n=0,o=i.length;n<o;++n){var u=i[n],s=this.doGetChildElementReader(u,r,this);if(s){var d=this.doReadChildElem(u,s,r,l,e);d&&this.doAppendObjToList(d,e)}}return e}}),Kekule.IO.CmlBaseListWriter=Class.create(Kekule.IO.CmlElementWriter,{CLASS_NAME:"Kekule.IO.CmlBaseListWriter",doCreateElem:function(e,t){var r=this.doGetListElemTagName(e,t);return r?this.createChildElem(r,t):null},doGetListElemTagName:function(e,t){return"list"},doWriteObject:function(e,t,r){var l=Kekule.ChemStructureUtils.getChildStructureObjs(e,!1);return this.writeList(l,t,r)},writeList:function(e,t,r){for(var l=0,a=e.length;l<a;++l){var i=e[l];if(i){var n=this.doGetChildObjectWriter(i);n&&n.writeObject(i,t,r)}}return t}}),Kekule.IO.CmlNameReader=Class.create(Kekule.IO.CmlElementReader,{CLASS_NAME:"Kekule.IO.CmlNameReader",initialize:function(){this.tryApplySuper("initialize")},doReadElement:function(e,t,r,l){var a=Kekule.DomUtils.getElementText(e),i=Kekule.IO.CmlDomUtils.getCmlElemAttribute(e,"convention");if(a){var n={};return n.name=a,i?n.convention=i:t&&t.setName&&t.setName(a),n}return null}}),Kekule.IO.CmlScalarReader=Class.create(Kekule.IO.CmlElementReader,{CLASS_NAME:"Kekule.IO.CmlScalarReader",doReadElement:function(e,t,r,l){var a=this.readScalar(e);return t&&t.appendScalarAttrib&&t.appendScalarAttrib(a),a},readScalar:function(e){var t,r=Kekule.DomUtils.fetchAttributeValuesToJson(e,this.getCoreNamespaceURI(),!0);if((o=Kekule.DomUtils.getElementText(e))&&(r.value=o),r.value&&(r.dataType?(r.value=Kekule.IO.CmlUtils.convertSimpleValueByDataType(r.value,r.dataType),r.errorValue&&(r.errorValue=Kekule.IO.CmlUtils.convertSimpleValueByDataType(r.errorValue,r.dataType,!0))):r.value=Kekule.IO.CmlUtils.tryParseFloat(r.value)),r){t=new Kekule.Scalar;for(var l=Kekule.ObjUtils.getOwnedFieldNames(r),a=0,i=l.length;a<i;++a){var n=l[a],o=r[n];switch(n){case"value":t.setValue(o);break;case"errorValue":t.setErrorValue(o);break;case"units":t.setUnit(Kekule.IO.CmlUtils.cmlUnitStrToMetricsUnitSymbol(o));break;case"title":t.setTitle(o);break;case"dictRef":t.setName(Kekule.IO.CmlUtils.cmlNsTokenToKekule(o)),t.setInfoValue("dictRef",o);break;default:t.setInfoValue(n,o)}}}return t}}),Kekule.IO.CmlScalarWriter=Class.create(Kekule.IO.CmlElementWriter,{CLASS_NAME:"Kekule.IO.CmlScalarWriter",doCreateElem:function(e,t){return this.createChildElem("scalar",t)},doWriteObject:function(t,r,l){if(!(t instanceof Kekule.Scalar))return this.reportTypeMismatchError(t),null;var a;if(Kekule.ObjUtils.isUnset(t.getValue())||(Kekule.DomUtils.setElementText(r,t.getValue()),a=DataType.getType(t.getValue())),t.getName()&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(r,"dictRef",Kekule.IO.CmlUtils.kekuleNsTokenToCml(t.getName()),this.getDomHelper()),t.getErrorValue()&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(r,"errorValue",t.getErrorValue(),this.getDomHelper()),t.getUnit()&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(r,"units",Kekule.IO.CmlUtils.metricsUnitSymbolToCmlUnitStr(t.getUnit()),this.getDomHelper()),t.getTitle()&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(r,"title",t.getTitle(),this.getDomHelper()),a){var i=e.getCmlTypeForDataType(a);i&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(r,"datatype",i,this.getDomHelper())}}}),Kekule.IO.CmlArrayReader=Class.create(Kekule.IO.CmlElementReader,{CLASS_NAME:"Kekule.IO.CmlArrayReader",initProperties:function(){this.defineProp("expandSteppedArray",{dataType:DataType.BOOL,serializable:!1}),this.defineProp("defaultItemDataType",{dataType:DataType.STRING,serializable:!1})},doReadElement:function(e,t,r,l){return this.readArray(e)},readArray:function(e){var t=Kekule.DomUtils.fetchAttributeValuesToJson(e,this.getCoreNamespaceURI(),!0);if(t.size&&(t.size=parseInt(t.size)),Kekule.ObjUtils.notUnset(t.start)&&Kekule.ObjUtils.notUnset(t.end))t.start=parseFloat(t.start),t.end=parseFloat(t.end),t.stepSize&&(t.stepSize=parseFloat(t.stepSize)),!t.size&&t.stepSize?t.size=Math.round(Math.abs((arrayJson.end-arrayJson.start)/t.stepSize)):t.size&&!t.stepSize&&(t.stepSize=(t.end-t.start)/t.size);else{var r=Kekule.DomUtils.getElementText(e);t.values=this._generateExplicitArray(t,r)}return t},_generateSteppedArray:function(e){var t=null;if(this.getExpandSteppedArray()){var r=e.size,l=e.stepSize,a=e.start;t=[a];for(var i=0;i<r;++i){if((a+=l)>e.end){t.push(e.end);break}t.push(a)}}return t},_generateExplicitArray:function(e,t){var r=!!e.delimiter,l=r?e.delimiter:Kekule.IO.CML.DEFAULT_VALUE_DELIMITER_PATTERN,a=t.split(l);r&&(a.shift(),a.pop());for(var i=e.dataType||this.getDefaultItemDataType(),n=[],o=0,u=a.length;o<u;++o){var s=a[o].trim();!r&&s&&(i?n.push(Kekule.IO.CmlUtils.convertSimpleValueByDataType(s,i)):n.push(s))}return n}}),Kekule.IO.CmlArrayWriter=Class.create(Kekule.IO.CmlElementWriter,{CLASS_NAME:"Kekule.IO.CmlArrayWriter",DEF_TAGNAME:"array",DEF_DELIMITER:" ",initProperties:function(){this.defineProp("defaultItemDataType",{dataType:DataType.STRING,serializable:!1}),this.defineProp("defaultItemDataUnit",{dataType:DataType.STRING,serializable:!1})},getArrayTagName:function(){return this.DEF_TAGNAME},getDefaultArrayValueDelimiter:function(){return this.DEF_DELIMITER},doCreateElem:function(e,t){return this.createChildElem(this.getArrayTagName(),t)},doWriteObject:function(e,t,r){var l;if(DataType.isObjectValue(e))l=Object.extend({},e);else{if(!DataType.isArrayValue(e))return this.reportTypeMismatchError(e),null;l={values:e}}return l=Object.extend(l,{unit:l.unit||r.unit||this.getDefaultItemDataUnit(),dataType:l.dataType||r.dataType||this.getDefaultItemDataType(),delimiter:l.delimiter||r.delimiter||this.getDefaultArrayValueDelimiter()}),this.writeArrayObj(l,t,r)},writeArrayObj:function(r,l,a){for(var i=this.getDomHelper(),n=["id","title","dictRef"],o=0,u=n.length;o<u;++o){var s=r[n[o]];Kekule.ObjUtils.notUnset(s)&&t.setCmlElemAttribute(l,n[o],s,i)}r.unit&&t.setCmlElemAttribute(l,"units",e.metricsUnitSymbolToCmlUnitStr(r.unit),i),r.dataType&&t.setCmlElemAttribute(l,"dataType",e.getCmlTypeForDataType(r.dataType),i);var d=r.values,m=d?d.length:r.size;if(m&&t.setCmlElemAttribute(l,"size",m,i),d){var c=r.delimiter||this.getDefaultArrayValueDelimiter();Kekule.DomUtils.setElementText(l,d.join(c)),c!==this.getDefaultArrayValueDelimiter()&&t.setCmlElemAttribute(l,"delimiter",c,i)}else Kekule.ObjUtils.notUnset(r.start)&&t.setCmlElemAttribute(l,"start",r.start,i),Kekule.ObjUtils.notUnset(r.end)&&t.setCmlElemAttribute(l,"end",r.end,i)}}),Kekule.IO.CmlMetaDataReader=Class.create(Kekule.IO.CmlElementReader,{CLASS_NAME:"Kekule.IO.CmlMetaReader",doReadElement:function(e,t,r,l){var a=this.readMeta(e);return t&&t.setInfoValue&&a.key&&a.value&&t.setInfoValue(a.key,a.value),a},readMeta:function(e){var t=Kekule.DomUtils.fetchAttributeValuesToJson(e,this.getCoreNamespaceURI(),!0);return{key:t.name,value:DataType.StringUtils.deserializeValue(t.content),metadataType:t.metadataType}}}),Kekule.IO.CmlMetaDataListReader=Class.create(Kekule.IO.CmlBaseListReader,{CLASS_NAME:"Kekule.IO.CmlMetaListReader",doReadChildElem:function(e,t,r,l,a){return t.readElement(e,r,this)}}),Kekule.IO.CmlConditionListReader=Class.create(Kekule.IO.CmlBaseListReader,{CLASS_NAME:"Kekule.IO.CmlConditionListReader"}),Kekule.IO.CmlParameterReader=Class.create(Kekule.IO.CmlElementReader,{CLASS_NAME:"Kekule.IO.CmlParameterReader",doReadElement:function(e,t,r,l){return this.readParameter(e,t,r)},readParameter:function(e,t,r){var l=Kekule.DomUtils.fetchAttributeValuesToJson(e,this.getCoreNamespaceURI(),!0),a={key:l.name||l.dictRef,value:DataType.StringUtils.deserializeValue(l.value),title:l.title};this.iterateChildElements(e,t,r,function(e,t){"scalar"===Kekule.DomUtils.getLocalName(e).toLowerCase()&&(a.value=t)});return a}}),Kekule.IO.CmlParameterListReader=Class.create(Kekule.IO.CmlBaseListReader,{CLASS_NAME:"Kekule.IO.CmlParameterListReader"}),Kekule.IO.CmlChemStructureReader=Class.create(Kekule.IO.CmlElementReader,{CLASS_NAME:"Kekule.IO.CmlChemStructureReader",initialize:function(){this.tryApplySuper("initialize")},hasAtomChildren:function(e,t){return t.getElementsByTagNameNS(this.getCoreNamespaceURI(),"atom",e).length},getAtomChildren:function(e,t){return t.getElementsByTagNameNS(this.getCoreNamespaceURI(),"atom",e)},atomInfoToJSON:function(e,t){return Kekule.IO.CmlDomUtils.fetchCmlElemAttributeValuesToJson(e,Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM,!0,t)},arrayedAtomInfosToJSON:function(e,t){for(var r=["id","atomID","elementType","isotope","hydrogenCount","formalCharge","count","xFract","yFract","zFract","x2","y2","x3","y3","z3"],l=["id","id","elementType","isotope","hydrogenCount","formalCharge","count","xFract","yFract","zFract","x2","y2","x3","y3","z3"],a=[],i=0,n=r.length;i<n;++i){var o,u=[];(o=Kekule.IO.CmlDomUtils.getCmlElemAttribute(e,r[i],Kekule.IO.CmlDomUtils.FILTER_TYPEDARRAY_ELEM,t))&&(u=Kekule.IO.CmlDomUtils.splitCmlArrayValue(o));for(var s=0,d=u.length;s<d;++s)a[s]||(a[s]={}),u[s]&&(a[s][l[i]]=u[s])}return a}}),Kekule.IO.CmlFormulaReader=Class.create(Kekule.IO.CmlChemStructureReader,{CLASS_NAME:"Kekule.IO.CmlFormulaReader",doReadElement:function(e,t,r,l){return this.readFormula(e,this.getDomHelper())},readFormula:function(e,t){var r=new Kekule.MolecularFormula,l=Kekule.IO.CmlDomUtils.getCmlElemAttribute(e,"formalCharge",Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM,t);l&&r.setCharge(parseFloat(l));var a=Kekule.IO.CmlDomUtils.getCmlElemAttribute(e,"concise",Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM,t),i=Kekule.IO.CmlDomUtils.getCmlElemAttribute(e,"inline",Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM,t);if(a)this.setConcise(r,a);else if(i)this.setInlineFormula(r,i);else for(var n=Kekule.DomUtils.getDirectChildElems(e,null,null,this.getCoreNamespaceURI()),o=0,u=n.length;o<u;++o)switch(Kekule.DomUtils.getLocalName(n[o])){case"formula":this.readSubFormula(r,n[o],t);break;case"atomArray":this.readAtomArray(r,n[o],t);break;default:Kekule.IO.CmlDomUtils.isCmlTypedElem(e)||Kekule.IO.CmlDomUtils.isCmlTypedArrayElem(e)||this.readChildElementDef(e,r)}return r},readConsice:function(e){var t=null;return e&&(t=new Kekule.MolecularFormula,this.setConcise(t,e)),t},setConcise:function(e,t){var r=Kekule.IO.CmlDomUtils.analysisCmlFormulaConciseValue(t);return r.isotopes&&r.isotopes.length&&this.createSectionsFromAtomAttribs(e,r.isotopes),r.formalCharge&&e.setCharge(r.formalCharge),e},setInlineFormula:function(e,t){return Kekule.FormulaUtils.textToFormula(t,null,e),e},readAtomArray:function(e,t,r){var l=[],a=this.getAtomChildren(t,r);if(a.length>0)for(var i=0,n=a.length;i<n;++i){var o=a[i],u=this.atomInfoToJSON(o,r);l.push(u)}else l=this.arrayedAtomInfosToJSON(t,r);return this.createSectionsFromAtomAttribs(e,l),e},createSectionsFromAtomAttribs:function(e,t){for(var r=0,l=t.length;r<l;++r){var a=t[r].elementType;if(a){var i=Kekule.IO.CmlUtils.createNodeByCmdElementType(null,a),n=t[r].formalCharge||0,o=t[r].count;e.appendSection(i,o,n)}}},readSubFormula:function(e,t,r){var l=this.readElement(t,r),a=Kekule.IO.CmlDomUtils.getCmlElemAttribute(t,"count",Kekule.IO.CmlDomUtils.FILTER_TYPED_ELEM,r);e.appendSection(l,parseFloat(a)||1,l.getCharge()||0)}}),Kekule.IO.CmlFormulaWriter=Class.create(Kekule.IO.CmlElementWriter,{CLASS_NAME:"Kekule.IO.CmlFormulaWriter",doCreateElem:function(e,t){return this.createChildElem("formula",t)},doWriteObject:function(e,t,r){if(!(e instanceof Kekule.MolecularFormula))return this.reportTypeMismatchError(e),null;for(var l=[],a=[],i=[],n=0,o=e.getSectionCount();n<o;++n){var u=e.getSectionAt(n);if(u.obj instanceof Kekule.MolecularFormula){this.createAtomArrayElem(l,a,i,t),l=[],a=[],i=[];this.writeSubFormula(u.obj,u.count||1,t,r)}else l.push(Kekule.IO.CmlUtils.getNodeElementType(u.obj)),a.push(u.count||1),i.push(e.getSectionCharge(u)||0),n==o-1&&this.createAtomArrayElem(l,a,i,t)}e.getCharge()&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(t,"formalCharge",e.getCharge(),this.getDomHelper())},writeSubFormula:function(e,t,r,l){var a=this.createChildElem("formula",r);return this.doWriteObject(e,a,l),t>1&&Kekule.IO.CmlDomUtils.setCmlElemAttribute(a,"count",t,this.getDomHelper()),a},createAtomArrayElem:function(e,t,r,l){if(!(e.length<=0)){var a=this.createChildElem("atomArray",l),i=Kekule.IO.CmlDomUtils.mergeToCmlArrayValue(e),n=Kekule.IO.CmlDomUtils.mergeToCmlArrayValue(t);Kekule.IO.CmlDomUtils.setCmlElemAttribute(a,"elementType",i,this.getDomHelper()),Kekule.IO.CmlDomUtils.setCmlElemAttribute(a,"count",n,this.getDomHelper());for(var o=!1,u=0,s=r.length;u<s;++u)if(r[u]){o=!0;break}if(o){var d=Kekule.IO.CmlDomUtils.mergeToCmlArrayValue(t);Kekule.IO.CmlDomUtils.setCmlElemAttribute(a,"formalCharge",d,this.getDomHelper())}return a}}}),Kekule.IO.CmlMoleculeReader=Class.create(Kekule.IO.CmlChemStructureReader,{CLASS_NAME:"Kekule.IO.CmlMoleculeReader",initialize:function(){this.tryApplySuper("initialize")},initProperties:function(){this.defineProp("structureBuilder",{dataType:"Kekule.ChemStructureBuilder",serializable:!1,getter:function(){return this.getPropStoreFieldValue("structureBuilder")||this.setPropStoreFieldValue("structureBuilder",new Kekule.ChemStructureBuilder),this.getPropStoreFieldValue("structureBuilder")},setter:null})},doReadElement:function(e,t,r,l){return this.readMolecule(e,r,this.getDomHelper())},doReadChildElement:function(e,t,r){if("molecule"==Kekule.DomUtils.getLocalNam