diff --git a/css/hues-res.css b/css/hues-res.css new file mode 100644 index 0000000..0ddd48b --- /dev/null +++ b/css/hues-res.css @@ -0,0 +1,126 @@ +#huesResources { + position: relative; + margin: 5px; + height: 385px; + font-size: 16px; +} + +.res-packscontainer, .res-packcontainer { + position: absolute; +} + +.res-packscontainer { + width: 43%; + left: 0; + margin-right: 10px; +} + +.res-packcontainer { + width: 55%; + right: 0; + margin-left: 10px; +} + +.res-header { + padding: 5px 0px; +} + +#res-curheader { + padding-top: 0px; +} + +#res-packlist { + height: 120px; +} + +#res-remotelist { + height: 150px; +} + +.res-list { + border: 2px solid black; + background: rgba(255,255,255,0.3); + overflow: auto; + overflow-x: hidden; +} + +.res-listitem { + font-size: 10px; + border-bottom: 1px solid black; +} + +.res-listitem > span { + display: block; + width: 100%; + height: 100%; + padding: 2px; +} + +.res-listitem :hover { + background: rgba(255,255,255,0.5); +} + +.res-listitem input[type="checkbox"] { + display: none; +} + +.res-buttons { + display: flex; + justify-content: space-between; + padding: 0px 0px; +} + +.res-button { + font-size: 10px; + margin: 3px 2px; + padding: 3px; + background: rgba(127,127,127, 0.5); + border-color: rgb(0,0,0); + border-width: 1px; + border-style: solid; + cursor: pointer; + /* Don't want double click to select */ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; +} + +#res-packinfo { + margin-top: 5px; + font-size: 9px; + display: flex; + justify-content: space-between; +} + +#res-packcreator > a:link, #res-packcreator > a:visited { + color: inherit; + text-decoration: none; +} + +#res-packdesc { + border: 3px solid gray; + background: rgba(255,255,255,0.5); + font-size: 9px; + height: 85px; +} + +#res-packtabs { + display: flex; + justify-content: space-between; +} + +#res-packtabs > div { + flex-grow: 1; +} + +#res-packcontents { + height: 170px; +} + +#res-packbuttons > .res-button { + flex-grow: 1; + text-align: center; +} \ No newline at end of file diff --git a/css/style.css b/css/style.css index 8ae6079..a0e8729 100644 --- a/css/style.css +++ b/css/style.css @@ -12,7 +12,7 @@ html, body { height: 100%; margin: 0; padding: 0; overflow: hidden; - background-color:#ffffff; + background-color:#fff; } h1 { @@ -87,8 +87,8 @@ h1, h2, h3 { left: 0; z-index: 10; opacity: 1; - transition: opacity 2s linear; - -webkit-transition: opacity 2s linear; + transition: opacity 1s linear; + -webkit-transition: opacity 1s linear; } #preloadHelper.loaded { @@ -158,6 +158,7 @@ input.tab-input[type="radio"]:checked + label { border-width: 2px; border-style: solid; font-family: 'PetMe64Web'; + width: 640px; } #huesSettings { @@ -174,13 +175,6 @@ input.tab-input[type="radio"]:checked + label { .settings-buttons{ margin: 10px 2px 10px 0px; - /* Don't want double click to select */ - -webkit-touch-callout: none; - -webkit-user-select: none; - -khtml-user-select: none; - -moz-user-select: none; - -ms-user-select: none; - user-select: none; } .settings-checkbox{ @@ -196,6 +190,13 @@ input.tab-input[type="radio"]:checked + label { border-width: 1px; border-style: solid; cursor: pointer; + /* Don't want double click to select */ + -webkit-touch-callout: none; + -webkit-user-select: none; + -khtml-user-select: none; + -moz-user-select: none; + -ms-user-select: none; + user-select: none; } label.settings-label:hover { diff --git a/index.html b/index.html index 5d80f88..31153bf 100644 --- a/index.html +++ b/index.html @@ -8,6 +8,7 @@ + @@ -50,7 +51,8 @@
- Soon + +
diff --git a/js/HuesUI.js b/js/HuesUI.js index 4eaedcc..14de2ee 100644 --- a/js/HuesUI.js +++ b/js/HuesUI.js @@ -44,41 +44,40 @@ function HuesUI(parent) { } HuesUI.prototype.initUI = function() { - var doc = this.root.ownerDocument var that = this; // Major info, image, song names - var imageName = doc.createElement("div"); + var imageName = document.createElement("div"); this.imageName = imageName; - this.imageLink = doc.createElement("a"); + this.imageLink = document.createElement("a"); this.imageLink.target = "_blank"; this.imageName.appendChild(this.imageLink); - var songName = doc.createElement("div"); + var songName = document.createElement("div"); this.songName = songName; - this.songLink = doc.createElement("a"); + this.songLink = document.createElement("a"); this.songLink.target = "_blank"; this.songName.appendChild(this.songLink); - var hueName = doc.createElement("div"); + var hueName = document.createElement("div"); this.hueName = hueName; // Prev/next controls - var imagePrev = doc.createElement("div"); + var imagePrev = document.createElement("div"); imagePrev.textContent = "<"; imagePrev.onclick = function() {that.core.previousImage();}; this.imagePrev = imagePrev; - var imageNext = doc.createElement("div"); + var imageNext = document.createElement("div"); imageNext.textContent = ">"; imageNext.onclick = function() {that.core.nextImage();}; this.imageNext = imageNext; - var songPrev = doc.createElement("div"); + var songPrev = document.createElement("div"); songPrev.textContent = "<"; this.songPrev = songPrev; songPrev.onclick = function() {that.core.previousSong();}; - var songNext = doc.createElement("div"); + var songNext = document.createElement("div"); songNext.textContent = ">"; songNext.onclick = function() {that.core.nextSong();}; this.songNext = songNext; @@ -93,26 +92,26 @@ HuesUI.prototype.initUI = function() { this.imageList = imageList; // Beat timer, x and y blur, millis timer - this.timer = doc.createElement("div"); + this.timer = document.createElement("div"); this.timer.textContent = "T=$0x0000"; - this.beatCount = doc.createElement("div"); + this.beatCount = document.createElement("div"); this.beatCount.textContent = "B=$0x00"; - this.xBlur = doc.createElement("div"); + this.xBlur = document.createElement("div"); this.xBlur.textContent = "X=$0x00"; - this.yBlur = doc.createElement("div"); + this.yBlur = document.createElement("div"); this.yBlur.textContent = "Y=$0x00"; // Config stuff - this.settingsToggle = doc.createElement("div"); + this.settingsToggle = document.createElement("div"); this.settingsToggle.innerHTML = ''; this.settingsToggle.onclick = function() { that.core.settings.toggle(); } - this.hideToggle = doc.createElement("div"); + this.hideToggle = document.createElement("div"); this.hideToggle.innerHTML = "▼"; this.hideToggle.onclick = function() { that.toggleHide(); @@ -230,15 +229,14 @@ RetroUI.prototype.constructor = RetroUI; RetroUI.prototype.initUI = function() { HuesUI.prototype.initUI.call(this); - var doc = this.root.ownerDocument; var that = this; - var container = doc.createElement("div"); + var container = document.createElement("div"); container.className = "hues-r-container"; this.root.appendChild(container); this.container = container; - this.mode = doc.createElement("div"); + this.mode = document.createElement("div"); container.appendChild(this.mode); container.appendChild(this.imageName); container.appendChild(this.timer); @@ -246,28 +244,28 @@ RetroUI.prototype.initUI = function() { container.appendChild(this.xBlur); container.appendChild(this.yBlur); - this.colourIndex = doc.createElement("div"); + this.colourIndex = document.createElement("div"); this.colourIndex.textContent = "C=$0x00"; container.appendChild(this.colourIndex); - this.version = doc.createElement("div"); + this.version = document.createElement("div"); container.appendChild(this.version); container.appendChild(this.hueName); container.appendChild(this.songName); - this.beatBar = doc.createElement("div"); + this.beatBar = document.createElement("div"); container.appendChild(this.beatBar); - this.controls = doc.createElement("div"); + this.controls = document.createElement("div"); this.controls.className = "hues-r-controls"; - var imageMode = doc.createElement("div"); - this.imageModeManual = doc.createElement("div"); + var imageMode = document.createElement("div"); + this.imageModeManual = document.createElement("div"); this.imageModeManual.textContent = "NORMAL"; this.imageModeManual.onclick = function() {that.core.setIsFullAuto(false);}; this.imageModeManual.className = "hues-r-manualmode hues-r-button"; - this.imageModeAuto = doc.createElement("div"); + this.imageModeAuto = document.createElement("div"); this.imageModeAuto.textContent = "FULL AUTO"; this.imageModeAuto.onclick = function() {that.core.setIsFullAuto(true);}; this.imageModeAuto.className = "hues-r-automode hues-r-button"; @@ -289,7 +287,7 @@ RetroUI.prototype.initUI = function() { this.root.appendChild(this.controls); - var subControl = doc.createElement("div"); + var subControl = document.createElement("div"); subControl.className = "hues-r-subcontrols"; subControl.appendChild(this.settingsToggle); this.imageList.textContent = "C"; @@ -299,7 +297,7 @@ RetroUI.prototype.initUI = function() { this.root.appendChild(subControl); - this.hideRestore = doc.createElement("div"); + this.hideRestore = document.createElement("div"); this.hideRestore.className = "hues-r-hiderestore"; this.hideRestore.innerHTML = "▲"; this.hideRestore.onclick = function() { @@ -382,13 +380,12 @@ ModernUI.prototype.constructor = ModernUI; ModernUI.prototype.initUI = function() { HuesUI.prototype.initUI.call(this); - var doc = this.root.ownerDocument; var that = this; this.imageName.className = "hues-m-imagename"; this.songName.className = "hues-m-songtitle"; - var controls = doc.createElement("div"); + var controls = document.createElement("div"); controls.className = "hues-m-controls"; this.root.appendChild(controls); this.controls = controls; @@ -396,7 +393,7 @@ ModernUI.prototype.initUI = function() { controls.appendChild(this.imageName); controls.appendChild(this.songName); - var leftBox = doc.createElement("div"); + var leftBox = document.createElement("div"); leftBox.className = "hues-m-leftbox"; controls.appendChild(leftBox); this.leftBox = leftBox; @@ -404,23 +401,23 @@ ModernUI.prototype.initUI = function() { this.hueName.className = "hues-m-huename"; leftBox.appendChild(this.hueName); - var volCluster = doc.createElement("div"); + var volCluster = document.createElement("div"); volCluster.className = "hues-m-vol-cluster"; leftBox.appendChild(volCluster); this.settingsToggle.className = "hues-m-cog"; volCluster.appendChild(this.settingsToggle); - var volBar = doc.createElement("div"); + var volBar = document.createElement("div"); volBar.className = "hues-m-vol-bar"; volCluster.appendChild(volBar); - var label = doc.createElement("div"); + var label = document.createElement("div"); label.textContent = "VOL"; label.className = "hues-m-vol-label"; volBar.appendChild(label); - var infoToggle = doc.createElement("div"); + var infoToggle = document.createElement("div"); infoToggle.innerHTML = '?'; infoToggle.className = "hues-m-question"; infoToggle.onclick = function() { @@ -428,7 +425,7 @@ ModernUI.prototype.initUI = function() { } volCluster.appendChild(infoToggle); - var input = doc.createElement("input"); + var input = document.createElement("input"); input.type = "range"; input.min = 0; input.max = 1; @@ -439,21 +436,21 @@ ModernUI.prototype.initUI = function() { that.core.soundManager.setVolume(parseFloat(input.value)); } - var rightBox = doc.createElement("div"); + var rightBox = document.createElement("div"); rightBox.className = "hues-m-rightbox"; controls.appendChild(rightBox); this.rightBox = rightBox; //Song/image controls - var songs = doc.createElement("div"); + var songs = document.createElement("div"); songs.className = "hues-m-controlblock"; this.songList.className = "hues-m-songbutton"; - var songControls = doc.createElement("div"); + var songControls = document.createElement("div"); songControls.className = "hues-m-controlbuttons"; this.songPrev.className = "hues-m-prevbutton" this.songNext.className = "hues-m-nextbutton" - var songShuffle = doc.createElement("div"); + var songShuffle = document.createElement("div"); songShuffle.innerHTML = ''; songShuffle.className = "hues-m-actbutton"; songShuffle.onclick = function() {that.core.randomSong();}; @@ -464,16 +461,16 @@ ModernUI.prototype.initUI = function() { songs.appendChild(songControls); rightBox.appendChild(songs); - var images = doc.createElement("div"); + var images = document.createElement("div"); images.className = "hues-m-controlblock"; var imageList = document.createElement("div"); imageList.textContent = "IMAGES"; imageList.className = "hues-m-songbutton"; - var imageControls = doc.createElement("div"); + var imageControls = document.createElement("div"); imageControls.className = "hues-m-controlbuttons"; - this.imageMode = doc.createElement("div"); + this.imageMode = document.createElement("div"); this.imageMode.innerHTML = "▶"; // PLAY this.imageMode.className = "hues-m-actbutton"; this.imageMode.onclick = function() {that.core.toggleFullAuto();}; @@ -486,9 +483,9 @@ ModernUI.prototype.initUI = function() { images.appendChild(imageControls); rightBox.appendChild(images); - var leftInfo = doc.createElement("div"); + var leftInfo = document.createElement("div"); leftInfo.className = "hues-m-leftinfo"; - var rightInfo = doc.createElement("div"); + var rightInfo = document.createElement("div"); rightInfo.className = "hues-m-rightinfo"; leftInfo.appendChild(this.xBlur); leftInfo.appendChild(this.yBlur); @@ -499,22 +496,22 @@ ModernUI.prototype.initUI = function() { controls.appendChild(leftInfo); controls.appendChild(rightInfo); - var beatBar = doc.createElement("div"); + var beatBar = document.createElement("div"); beatBar.className = "hues-m-beatbar"; this.root.appendChild(beatBar); this.beatBar = beatBar; - var beatLeft = doc.createElement("div"); + var beatLeft = document.createElement("div"); beatLeft.className = "hues-m-beatleft"; beatBar.appendChild(beatLeft); this.beatLeft = beatLeft; - var beatRight = doc.createElement("div"); + var beatRight = document.createElement("div"); beatRight.className = "hues-m-beatright"; beatBar.appendChild(beatRight); this.beatRight = beatRight; - var beatCenter = doc.createElement("div"); + var beatCenter = document.createElement("div"); beatCenter.className = "hues-m-beatcenter"; this.root.appendChild(beatCenter); this.beatCenter = beatCenter; @@ -614,22 +611,21 @@ WeedUI.prototype.initUI = function() { RetroUI.prototype.initUI.call(this); this.container.removeChild(this.beatBar) - var doc = this.root.ownerDocument; this.controls.className = "hues-w-controls"; this.subControls.className = "hues-w-subcontrols"; - var beatBar = doc.createElement("div"); + var beatBar = document.createElement("div"); beatBar.className = "hues-w-beatbar"; this.root.appendChild(beatBar); this.beatBar = beatBar; - var beatLeft = doc.createElement("div"); + var beatLeft = document.createElement("div"); beatLeft.className = "hues-w-beatleft"; beatBar.appendChild(beatLeft); this.beatLeft = beatLeft; - var beatRight = doc.createElement("div"); + var beatRight = document.createElement("div"); beatRight.className = "hues-w-beatright"; beatBar.appendChild(beatRight); this.beatRight = beatRight; @@ -657,8 +653,7 @@ WeedUI.prototype.beat = function() { this.beatCount.textContent = "B=" + this.intToHex2(this.core.getSafeBeatIndex()); if(["x", "o", "X", "O"].indexOf(beats[0]) != -1) { - var doc = this.root.ownerDocument; - var beatCenter = doc.createElement("div"); + var beatCenter = document.createElement("div"); beatCenter.className = "hues-w-beataccent"; var rot = this.round10(15 - Math.random() * 30); var x = this.round10(- this.xVariance / 2 + Math.random() * this.xVariance); diff --git a/js/ResourceManager.js b/js/ResourceManager.js index a198b97..1adbb6f 100644 --- a/js/ResourceManager.js +++ b/js/ResourceManager.js @@ -11,6 +11,30 @@ function Resources() { this.rToLoad = [] this.loadFinishCallback = null; this.progressCallback = null; + + this.root = null; + this.packView = { + name: null, + creator: null, + size: null, + desc: null, + songCount: null, + imageCount: null, + songList: null, + imageList: null, + totalSongs: null, + totalImages: null + }; + this.packsView = { + respackList: null, + remoteList: null, + progressBar: null, + progressStatus: null, + progressCurrent: null, + progressTop: null, + progressPercent: null + }; + this.initUI(); } // Array of URLs to load, and a callback for when we're done @@ -65,9 +89,16 @@ Resources.prototype.updateProgress = function() { Resources.prototype.addPack = function(pack) { console.log("Added", pack.name, "to respacks"); + var id = "res" + this.resourcePacks.length; this.resourcePacks.push(pack); this.addResourcesToArrays(pack); this.rebuildEnabled(); + this.updateTotals(); + + this.appendListItem("respacks", pack.name, id, this.packsView.respackList); + if(id == "res0") { + this.selectPack(0); + } } Resources.prototype.addResourcesToArrays = function(pack) { @@ -129,4 +160,195 @@ Resources.prototype.getSongNames = function() { names.push(this.allSongs[i]); } return names; +} + +Resources.prototype.initUI = function() { + this.root = document.getElementById("huesResources"); + + var packsContainer = document.createElement("div"); + packsContainer.className = "res-packscontainer"; + + var packHeader = document.createElement("div"); + packHeader.textContent = "Current respacks"; + packHeader.className = "res-header"; + packHeader.id = "res-curheader"; + var packList = document.createElement("div"); + packList.className = "res-list"; + packList.id = "res-packlist"; + this.packsView.respackList = packList; + var remoteHeader = document.createElement("div"); + remoteHeader.textContent = "Remote respacks"; + remoteHeader.className = "res-header"; + var remoteList = document.createElement("div"); + remoteList.className = "res-list"; + remoteList.id = "res-remotelist"; + this.packsView.remoteList = remoteList; + + var buttons = document.createElement("div"); + buttons.className = "res-buttons"; + var loadRemote = document.createElement("div"); + loadRemote.className = "res-button"; + loadRemote.textContent = "LOAD"; + var loadLocal = document.createElement("div"); + loadLocal.className = "res-button"; + loadLocal.textContent = "LOAD ZIPS"; + buttons.appendChild(loadRemote); + buttons.appendChild(loadLocal); + + var progressContainer = document.createElement("div"); + var progressBar = document.createElement("div"); + var progressStatus = document.createElement("div"); + var progressCurrent = document.createElement("div"); + var progressTop = document.createElement("div"); + var progressPercent = document.createElement("div"); + this.packsView.progressBar = progressBar; + this.packsView.progressStatus = progressStatus; + this.packsView.progressCurrent = progressCurrent; + this.packsView.progressTop = progressTop; + this.packsView.progressPercent = progressPercent; + progressContainer.appendChild(progressBar); + progressContainer.appendChild(progressStatus); + progressContainer.appendChild(progressCurrent); + progressContainer.appendChild(progressTop); + progressContainer.appendChild(progressPercent); + + packsContainer.appendChild(packHeader); + packsContainer.appendChild(packList); + packsContainer.appendChild(remoteHeader); + packsContainer.appendChild(remoteList); + packsContainer.appendChild(buttons); + packsContainer.appendChild(progressContainer); + + var indivView = document.createElement("div"); + indivView.className = "res-packcontainer"; + + var packName = document.createElement("div"); + var packInfo = document.createElement("div"); + packInfo.id = "res-packinfo"; + var packCreator = document.createElement("div"); + packCreator.id = "res-packcreator"; + var packCreatorText = document.createElement("a"); + packCreator.appendChild(packCreatorText); + packInfo.appendChild(packCreator); + var packSize = document.createElement("div"); + packInfo.appendChild(packSize); + var packDesc = document.createElement("div"); + packDesc.id = "res-packdesc"; + + var packTabs = document.createElement("div"); + packTabs.id = "res-packtabs"; + var songCount = document.createElement("div"); + songCount.textContent = "Songs:"; + packTabs.appendChild(songCount); + var imageCount = document.createElement("div"); + imageCount.textContent = "Images:"; + packTabs.appendChild(imageCount); + + var packContents = document.createElement("div"); + packContents.className = "res-list"; + packContents.id = "res-packcontents"; + var songList = document.createElement("div"); + packContents.appendChild(songList); + var imageList = document.createElement("div"); + packContents.appendChild(imageList); + + var packButtons = document.createElement("div"); + packButtons.className = "res-buttons"; + packButtons.id = "res-packbuttons"; + var enableAll = document.createElement("div"); + enableAll.textContent = "ENABLE ALL"; + enableAll.className = "res-button"; + var invert = document.createElement("div"); + invert.textContent = "INVERT"; + invert.className = "res-button"; + var disableAll = document.createElement("div"); + disableAll.textContent = "DISABLE ALL"; + disableAll.className = "res-button"; + packButtons.appendChild(enableAll); + packButtons.appendChild(invert); + packButtons.appendChild(disableAll); + + var totalCounts = document.createElement("div"); + var totalSongs = document.createElement("div"); + totalSongs.textContent = "Total Songs:"; + var totalImages = document.createElement("div"); + totalImages.textContent = "Total images:"; + totalCounts.appendChild(totalSongs); + totalCounts.appendChild(totalImages); + + this.packView.name = packName; + this.packView.creator = packCreatorText; + this.packView.size = packSize; + this.packView.desc = packDesc; + this.packView.songCount = songCount; + this.packView.imageCount = imageCount; + this.packView.songList = songList; + this.packView.imageList = imageList; + this.packView.totalSongs = totalSongs; + this.packView.totalImages = totalImages; + + indivView.appendChild(packName); + indivView.appendChild(packInfo); + indivView.appendChild(packDesc); + indivView.appendChild(packTabs); + indivView.appendChild(packContents); + indivView.appendChild(packButtons); + indivView.appendChild(totalCounts); + + this.root.appendChild(packsContainer); + this.root.appendChild(indivView); +} + +Resources.prototype.updateTotals = function() { + this.packView.totalSongs.textContent = "Total songs: " + + this.enabledSongs.length + "/" + this.allSongs.length; + this.packView.totalImages.textContent = "Total images: " + + this.enabledImages.length + "/" + this.allImages.length; +} + +Resources.prototype.selectPack = function(id) { + var pack = this.resourcePacks[id]; + + this.packView.name.textContent = pack.name; + this.packView.creator.textContent = pack.author; + this.packView.creator.href = pack.link ? pack.link : ""; + this.packView.size.textContent = Math.round(pack.size / 1024, 2) + "kiB"; + this.packView.desc.textContent = pack.description; + this.packView.songCount.textContent = "Songs: " + pack.songs.length; + this.packView.imageCount.textContent = "Images: " + pack.images.length; + + var songList = this.packView.songList; + var imageList = this.packView.imageList; + while (songList.firstElementChild) { + songList.removeChild(songList.firstElementChild) + } + while (imageList.firstElementChild) { + imageList.removeChild(imageList.firstElementChild) + } + + for(var i = 0; i < pack.songs.length; i++) { + var song = pack.songs[i]; + this.appendListItem("songs", song.title, "song" + i, songList); + } + + for(var i = 0; i < pack.images.length; i++) { + var image = pack.images[i]; + this.appendListItem("images", image.name, "image" + i, imageList); + } +} + +Resources.prototype.appendListItem = function(name, value, id, root) { + var div = document.createElement("div"); + div.className = "res-listitem"; + var checkbox = document.createElement("input"); + checkbox.type = "checkbox"; + checkbox.name = name; + checkbox.value = value; + checkbox.id = id; + checkbox.checked = true; + var label = document.createElement("span"); + label.textContent = value; + div.appendChild(checkbox); + div.appendChild(label); + root.appendChild(div); } \ No newline at end of file diff --git a/js/ResourcePack.js b/js/ResourcePack.js index 6ed2365..b3a1ce2 100644 --- a/js/ResourcePack.js +++ b/js/ResourcePack.js @@ -157,7 +157,8 @@ Respack.prototype.parseXML = function() { if (this.songs.length > 0) { if (this._songFile) { this._songFile.getText(function(text) { - //XML parser will complain about a bare '&' + //XML parser will complain about a bare '&', but some respacks use & + text = text.replace(/&/g, '&'); text = text.replace(/&/g, '&'); that.parseSongFile(text); // Go to next in series @@ -173,6 +174,7 @@ Respack.prototype.parseXML = function() { } if (this.images.length > 0 && this._imageFile) { this._imageFile.getText(function(text) { + text = text.replace(/&/g, '&'); text = text.replace(/&/g, '&'); that.parseImageFile(text); that._imageFile = null; @@ -182,6 +184,7 @@ Respack.prototype.parseXML = function() { } if (this._infoFile) { this._infoFile.getText(function(text) { + text = text.replace(/&/g, '&'); text = text.replace(/&/g, '&'); that.parseInfoFile(text); that._infoFile = null;