
function WSSHClient() {
}

WSSHClient.prototype._generateEndpoint = function (options) {
    if (window.location.protocol == 'https:') {
        var protocol = 'wss://';
    } else {
        protocol = 'ws://';
    }

    var endpoint = protocol + document.URL.match(RegExp('//(.*?)/'))[1] + '/ws/terminal/';// + document.URL.match(/(\?.*)/);
    return endpoint;
};

WSSHClient.prototype.connect = function (options) {
    var endpoint = this._generateEndpoint(options);

    if (window.WebSocket) {
        this._connection = new WebSocket(endpoint);
    }
    else if (window.MozWebSocket) {
        this._connection = MozWebSocket(endpoint);
    }
    else {
        options.onError('WebSocket Not Supported');
        return;
    }

    this._connection.onopen = function () {
        options.onConnect();
    };

    this._connection.onmessage = function (evt) {
        try {
            options.onData(evt.data);
        } catch (e) {
            var data = JSON.parse(evt.data.toString());
            options.onError(data.error);
        }
    };

    this._connection.onclose = function (evt) {
        options.onClose();
    };
};

WSSHClient.prototype.send = function (data) {
    this._connection.send(JSON.stringify({'data': data}));
};

function openTerminal(options) {
    var client = new WSSHClient();
    var cols = 80;
    var rows = 24;

    var term = new Terminal({
        rows: rows,
        cols: cols,
        useStyle: true,
        screenKeys: true
    });
    term.open();
    term.on('data', function (data) {
        client.send(data)
    });

    var rowHeight = 0.0 + 1.00 * $('.terminal').height() / 24;
    var colWidth = 0.0 + 1.00 * $('.terminal').width() / 80;

    $('.terminal').detach().appendTo('#term');
    //term.resize(colWidth, rowHeight);
    term.write('Connecting...');
    client.connect($.extend(options, {
        onError: function (error) {
            term.write('Error: ' + error + '\r\n');
        },
        onConnect: function () {
            // Erase our connecting message
            client.send({'resize': {'rows': rowHeight, 'cols': colWidth}});
            term.write('\r');
        },
        onClose: function () {
            term.write('Connection Reset By Peer');
        },
        onData: function (data) {
            term.write(data);
        }
    }));
    return {'term': term, 'client': client};
}

function resize() {
   $('.terminal').css('width', window.innerWidth - 25);
   console.log(window.innerWidth);
   console.log(window.innerWidth - 10);
   var rows = Math.floor(window.innerHeight / rowHeight) - 2;
   var cols = Math.floor(window.innerWidth / colWidth) - 1;

   return {rows: rows, cols: cols};
}

$(document).ready(function () {
    var options = {};

    $('#ssh').show();
    var term_client = openTerminal(options);
    // by liuzheng712 because it will bring record bug
    //window.onresize = function () {
    //    var geom = resize();
    //    console.log(geom);
    //    term_client.term.resize(geom.cols, geom.rows);
    //    term_client.client.send({'resize': {'rows': geom.rows, 'cols': geom.cols}});
    //    $('#ssh').show();
    //}
    // try {
    //     $('#term-row')[0].value = localStorage.getItem('term-row');
    //     $('#term-col')[0].value = localStorage.getItem('term-col');
    // } catch (err) {
    //     $('#term-row')[0].value = 35;
    //     $('#term-col')[0].value = 100;
    // }

    // $('#col-row').click(function () {
    //     var col = $('#term-col').val();
    //     var row = $('#term-row').val();
    //     localStorage.setItem('term-col', col);
    //     localStorage.setItem('term-row', row);
        // term_client.term.resize(col, row);
        // term_client.client.send({'resize': {'rows': row, 'cols': col}});
        // $('#ssh').show();
    // });
    // $(".terminal").mouseleave(function () {
    //     $(".termChangBar").slideDown();
    // });
    // $(".terminal").mouseenter(function () {
    //     $(".termChangBar").slideUp();
    // })
});