// Bit-wise rotate left
var rotl = function (n, b) {
    return (n << b) | (n >>> (32 - b));
};

// Bit-wise rotate right
var rotr = function (n, b) {
    return (n << (32 - b)) | (n >>> b);
};

// Swap big-endian to little-endian and vice versa
var endian = function (n) {
    // If number given, swap endian
    if (n.constructor == Number) {
        return rotl(n,  8) & 0x00FF00FF | rotl(n, 24) & 0xFF00FF00;
    }

    // Else, assume array and swap all items
    for (var i = 0; i < n.length; i++) {
        n[i] = endian(n[i]);
    }
    return n;
}

var Key = require('./eckey');

module.exports = {
    Address: require('./address'),
    Key: Key.ECKey,
    ECKey: Key.ECKey,
    ECPubKey: Key.ECPubKey,
    Message: require('./message'),
    BigInteger: require('./jsbn/jsbn'),
    Crypto: require('crypto-js'), //should we expose this at all?
    Script: require('./script'),
    Opcode: require('./opcode'),
    Transaction: require('./transaction').Transaction,
    Util: require('./util'),
    TransactionIn: require('./transaction').TransactionIn,
    TransactionOut: require('./transaction').TransactionOut,
    ECPointFp: require('./jsbn/ec').ECPointFp,
    Wallet: require('./wallet'),
    network: require('./network'),

    ecdsa: require('./ecdsa'),
    HDWallet: require('./hdwallet.js'),

    // base58 encoding/decoding to bytes
    base58: require('./base58'),

    // conversions
    convert: require('./convert'),

    endian: endian
}