//
// Licensed to the Apache Software Foundation (ASF) under one or more
// contributor license agreements.  See the NOTICE file distributed with
// this work for additional information regarding copyright ownership.
// The ASF licenses this file to You under the Apache License, Version 2.0
// (the "License"); you may not use this file except in compliance with
// the License.  You may obtain a copy of the License at
//
//      http://www.apache.org/licenses/LICENSE-2.0
//
// Unless required by applicable law or agreed to in writing, software
// distributed under the License is distributed on an "AS IS" BASIS,
// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
// See the License for the specific language governing permissions and
// limitations under the License.
//

//
// Based on http://antony.lesuisse.org/software/ajaxterm/
//  Public Domain License
//

gogo = { };

gogo.Terminal_ctor = function(div, width, height) {

   var ie = (window.ActiveXObject) ? 0 : 1;
   var query0 = "w=" + width + "&h=" + height;
   var query1 = query0 + "&k=";
   var buf = "";
   var timeout;
   var error_timeout;
   var keybuf = [];
   var sending = 0;
   var rmax = 1;
   var force = 1;

   var dstat = document.createElement('pre');
   var sled = document.createElement('span');
   var sdebug = document.createElement('span');
   var dterm = document.createElement('div');

   function debug(s) {
       sdebug.innerHTML = s;
   }

   function error() {
       sled.className = 'off';
       debug("Connection lost timeout ts:" + ((new Date).getTime()));
   }

   function update() {
       if (sending == 0) {
           sending = 1;
           sled.className = 'on';
           var r = new XMLHttpRequest();
           var send = "";
           while (keybuf.length > 0) {
               send += keybuf.pop();
           }
           var query = query1 + send;
           if (force) {
               query = query + "&f=1";
               force = 0;
           }
           r.open("POST", "gogo", true);
           r.setRequestHeader('Content-Type', 'application/x-www-form-urlencoded');
           r.onreadystatechange = function () {
               if (r.readyState == 4) {
                   if (r.status == 200) {
                       window.clearTimeout(error_timeout);
                       if (r.responseText.length > 0) {
                           dterm.innerHTML = r.responseText;
                           rmax = 100;
                       } else {
                           rmax *= 2;
                           if (rmax > 2000)
                               rmax = 2000;
                       }
                       sending=0;
                       sled.className = 'off';
                       timeout = window.setTimeout(update, rmax);
                   } else {
                       debug("Connection error status:" + r.status);
                   }
               }
           }
           error_timeout = window.setTimeout(error, 5000);
           r.send(query);
       }
   }

   function queue(s) {
       keybuf.unshift(s);
       if (sending == 0) {
           window.clearTimeout(timeout);
           timeout = window.setTimeout(update, 1);
       }
   }

   function keypress(ev) {
        // Translate to standard keycodes
        if (!ev)
            ev = window.event;
        var kc;
        if (ev.keyCode)
            kc = ev.keyCode;
        if (ev.which)
            kc = ev.which;
        if (ev.ctrlKey) {
            if (kc >= 0 && kc <= 32)
                kc = kc;
            else if (kc >= 65 && kc <= 90)
                kc -= 64;
            else if (kc >= 97 && kc <= 122)
                kc -= 96;
            else {
                switch (kc) {
                    case 54:  kc=30; break;	// Ctrl-^
                    case 109: kc=31; break;	// Ctrl-_
                    case 219: kc=27; break;	// Ctrl-[
                    case 220: kc=28; break;	// Ctrl-\
                    case 221: kc=29; break;	// Ctrl-]
                    default: return true;
                }
            }
        } else if (ev.which == 0) {
            switch(kc) {
                case 8: break;			     // Backspace
                case 9: break;               // Tab
                case 27: break;			     // ESC
                case 33:  kc = 63276; break; // PgUp
                case 34:  kc = 63277; break; // PgDn
                case 35:  kc = 63275; break; // End
                case 36:  kc = 63273; break; // Home
                case 37:  kc = 63234; break; // Left
                case 38:  kc = 63232; break; // Up
                case 39:  kc = 63235; break; // Right
                case 40:  kc = 63233; break; // Down
                case 45:  kc = 63302; break; // Ins
                case 46:  kc = 63272; break; // Del
                case 112: kc = 63236; break; // F1
                case 113: kc = 63237; break; // F2
                case 114: kc = 63238; break; // F3
                case 115: kc = 63239; break; // F4
                case 116: kc = 63240; break; // F5
                case 117: kc = 63241; break; // F6
                case 118: kc = 63242; break; // F7
                case 119: kc = 63243; break; // F8
                case 120: kc = 63244; break; // F9
                case 121: kc = 63245; break; // F10
                case 122: kc = 63246; break; // F11
                case 123: kc = 63247; break; // F12
                default: return true;
            }
        }
        if (kc == 8)
            kc = 127;

        var k = "";
        // Build character
        switch (kc) {
            case 126:   k = "~~"; break;
            case 63232: k = "~A"; break; // Up
            case 63233: k = "~B"; break; // Down
            case 63234: k = "~D"; break; // Left
            case 63235: k = "~C"; break; // Right
            case 63276: k = "~1"; break; // PgUp
            case 63277: k = "~2"; break; // PgDn
            case 63273: k = "~H"; break; // Home
            case 63275: k = "~F"; break; // End
            case 63302: k = "~3"; break; // Ins
            case 63272: k = "~4"; break; // Del
            case 63236: k = "~a"; break; // F1
            case 63237: k = "~b"; break; // F2
            case 63238: k = "~c"; break; // F3
            case 63239: k = "~d"; break; // F4
            case 63240: k = "~e"; break; // F5
            case 63241: k = "~f"; break; // F6
            case 63242: k = "~g"; break; // F7
            case 63243: k = "~h"; break; // F8
            case 63244: k = "~i"; break; // F9
            case 63245: k = "~j"; break; // F10
            case 63246: k = "~k"; break; // F11
            case 63247: k = "~l"; break; // F12
            default:    k = String.fromCharCode(kc); break;
        }
        queue(encodeURIComponent(k));

        ev.cancelBubble = true;
        if (ev.stopPropagation) ev.stopPropagation();
        if (ev.preventDefault) ev.preventDefault();

        return true;
   }

   function keydown(ev) {
       if (!ev)
          ev = window.event;
       if (ie) {
           o = { 9:1, 8:1, 27:1, 33:1, 34:1, 35:1, 36:1, 37:1, 38:1, 39:1, 40:1, 45:1, 46:1, 112:1,
                 113:1, 114:1, 115:1, 116:1, 117:1, 118:1, 119:1, 120:1, 121:1, 122:1, 123:1 };
           if (o[ev.keyCode] || ev.ctrlKey || ev.altKey) {
               ev.which = 0;
               return keypress(ev);
           }
       }
   }

   function init() {
       if (typeof(XMLHttpRequest) == "undefined") {
         XMLHttpRequest = function() {
           try { return new ActiveXObject("Msxml2.XMLHTTP.6.0"); }
             catch(e) {}
           try { return new ActiveXObject("Msxml2.XMLHTTP.3.0"); }
             catch(e) {}
           try { return new ActiveXObject("Msxml2.XMLHTTP"); }
             catch(e) {}
           try { return new ActiveXObject("Microsoft.XMLHTTP"); }
             catch(e) {}
           throw new Error("This browser does not support XMLHttpRequest.");
         };
       }
       sled.appendChild(document.createTextNode('\xb7'));
       sled.className = 'off';
       dstat.appendChild(sled);
       dstat.appendChild(document.createTextNode(' '));
       dstat.appendChild(sdebug);
       dstat.className = 'stat';
       div.appendChild(dstat);
       var d = document.createElement('div');
       d.appendChild(dterm);
       div.appendChild(d);
       document.onkeypress = keypress;
       document.onkeydown = keydown;
       timeout = window.setTimeout(update, 100);
   }

   init();

}

gogo.Terminal = function(div, width, height) {
   return new this.Terminal_ctor(div, width, height);
}

