var TRACK_KIND = {
    AUDIO: 0,
    VIDEO: 1,
    TEXT: 2,
};

function stringToArray(string) {
    return string.split("").map(function(c){ return c.charCodeAt(0); });
}

var SAMPLE_FLAG = {
    NONE: 0,
    SYNC: 1 << 0,
    CORRUPTED: 1 << 1,
    DROPPED: 1 << 2,
    DELAYED: 1 << 3,
};

function makeASample(presentationTime, decodeTime, duration, timeScale, trackID, flags, generation) {
    var byteLength = 30;
    var buffer = new ArrayBuffer(byteLength);
    var array = new Uint8Array(buffer);
    array.set(stringToArray('smpl'));

    var view = new DataView(buffer);
    view.setUint32(4, byteLength, true);
    view.setInt32(8, timeScale, true);
    view.setInt32(12, presentationTime, true);
    view.setInt32(16, decodeTime, true);
    view.setInt32(20, duration, true);
    view.setInt32(24, trackID, true);
    view.setUint8(28, flags);
    view.setUint8(29, generation);

    return buffer
}

function concatenateSamples(samples) {
    var byteLength = 0;
    samples.forEach(function(sample) { byteLength += sample.byteLength; });
    var buffer = new ArrayBuffer(byteLength);

    var offset = 0;
    samples.forEach(function(sample){
        var sourceArray = new Uint8Array(sample);
        var destArray = new Uint8Array(buffer, offset, sourceArray.byteLength);
        destArray.set(sourceArray);
        offset += sourceArray.byteLength;
    });

    return buffer;
}

function makeATrack(trackID, codec, flags) {
    var byteLength = 17;
    var buffer = new ArrayBuffer(byteLength);
    var array = new Uint8Array(buffer);
    array.set(stringToArray('trak'));

    var view = new DataView(buffer);
    view.setUint32(4, byteLength, true);
    view.setInt32(8, trackID, true);

    var codecArray = new Uint8Array(buffer, 12, 4);
    codecArray.set(stringToArray(codec));

    view.setUint8(16, flags, true);

    return buffer;
}

function makeAInit(duration, tracks) {
    var byteLength = 16 + (17 * tracks.length);
    var buffer = new ArrayBuffer(byteLength);
    var array = new Uint8Array(buffer);
    array.set(stringToArray('init'));

    if (!isNaN(duration)) {
        var view = new DataView(buffer);
        var timeScale = 1000;
        view.setUint32(4, byteLength, true);
        view.setInt32(8, duration * timeScale, true);
        view.setInt32(12, timeScale, true);
    }

    var offset = 16;
    tracks.forEach(function(track){
        var sourceArray = new Uint8Array(track);
        var destArray = new Uint8Array(buffer, offset, sourceArray.byteLength);
        destArray.set(sourceArray);
        offset += sourceArray.byteLength;
    });

    return buffer;
}

function makeAnInvalidBox() {
    var byteLength = 12;
    var buffer = new ArrayBuffer(byteLength);
    var array = new Uint8Array(buffer);
    array.set(stringToArray('invl'));

    var view = new DataView(buffer);
    view.setUint32(8, 0xFFFF, true);

    return buffer;
}

