// Copyright (C) 2013 Massachusetts Institute of Technology
//
// This program is free software; you can redistribute it and/or
// modify it under the terms of the GNU General Public License version 2,
// as published by the Free Software Foundation.
//
// This program is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with this program; if not, write to the Free Software
// Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.

// Provides the equivalent functionality of an AS ByteArray
// using JavaScript ArrayBuffers and viewers

var OffsetBuffer = function(data) {
    this.offset = 0;
    this.ab = data;
}

// Read various datatypes from the ArrayBuffer, seeking the offset.
OffsetBuffer.prototype.readString = function(length) {
    var str = this.ab2str(this.ab.slice(this.offset, this.offset + length));
    this.offset += length;
    return str;
}

OffsetBuffer.prototype.readInt = function() {
    var num = this.ab2int(this.ab.slice(this.offset, this.offset + 4));
    this.offset += 4;
    return num;
}

OffsetBuffer.prototype.readUint = function() {
    var num = this.ab2uint(this.ab.slice(this.offset, this.offset + 4));
    this.offset += 4;
    return num;
}

OffsetBuffer.prototype.readShort = function() {
    var num = this.ab2short(this.ab.slice(this.offset, this.offset + 2));
    this.offset += 2;
    return num;
}

OffsetBuffer.prototype.readBytes = function(length) {
    var bytes = this.ab.slice(this.offset, this.offset + length);
    this.offset += length;
    return bytes;
}

// Length of the internal buffer
OffsetBuffer.prototype.getLength = function() {
    return this.ab.byteLength;
}

// Number of bytes remaining from the current offset
OffsetBuffer.prototype.bytesAvailable = function() {
    return (this.getLength() - this.offset);
}

// ArrayBuffer -> JS type conversion methods
OffsetBuffer.prototype.ab2str = function(buf) {
    return String.fromCharCode.apply(null, new Uint8Array(buf));
}

// These create Javascript Numbers
OffsetBuffer.prototype.ab2int = function(buf) {
    return new Int32Array(buf)[0];
}

OffsetBuffer.prototype.ab2uint = function(buf) {
    return new Uint32Array(buf)[0];
}

OffsetBuffer.prototype.ab2short = function(buf) {
    return new Int16Array(buf)[0];
}
