疯掉了,尽然有js写的操作系统


Posted in Javascript onApril 23, 2007

http://www.masswerk.at/jsuix/

// JS/UIX v0.44
// (c) mass:werk (N.Landsteiner) 2003
// all rights reserved

// term gui

var conf_term_x=102;
var conf_term_y=34;
var conf_kbd_offset=34;
var termImgPath='jsuix_support/';
var termDiv='termDiv';
var termBgColor='#181818';
var termFrameColor='#555555';
var termPageColor='#222222';
var conf_repeat_delay1=320;
var conf_repeat_delay2=170;

var termKbdDiv='termKbdDiv';
var termKbdBgColor='#222222';
var keycapspath='jsuix_support/keycaps/';

var termSubDivs=false;
var termLayers=false;
var termDocNS4=null;
var termStringStart='';
var termStringEnd='';

var termKbdDocNS4=null;
var termKbdOn=false;
var keycapsShift=false;
var keycapsCpslk=false;
var keycapsShiftRef=new Array();
var keycapsCpslkRef=new Array();

var termSpecials=new Array();
termSpecials[0]=' ';
termSpecials[1]='$';
termSpecials[2]=' ';
termSpecials[3]='?';
termSpecials[4]='#';
termSpecials[32]=' ';
termSpecials[34]='"';
termSpecials[38]='&';
termSpecials[60]='<';
termSpecials[62]='>';
termSpecials[127]='◊';

var termStyles=new Array(1,2,4,8);
var termStyleOpen=new Array();
var termStyleClose=new Array();
termStyleOpen[1]='<SPAN CLASS="termReverse">';
termStyleClose[1]='<\/SPAN>';
termStyleOpen[2]='<U>';
termStyleClose[2]='<\/U>';
termStyleOpen[4]='<I>';
termStyleClose[4]='<\/I>';
termStyleOpen[8]='<STRIKE>';
termStyleClose[8]='<\/STRIKE>';

// buttons UI

var termImgNames=new Array('left_lo', 'left_hi', 'right_lo', 'right_hi', 'delete_lo', 'delete_hi', 'esc_lo', 'esc_hi', 'kbd_show_lo', 'kbd_show_hi', 'kbd_hide_lo', 'kbd_hide_hi');
var termImages=new Array();

function termImgPreload(path,imgnames) {
    for (var i=0; i<imgnames.length; i++) {
        var n=imgnames[i];
        termImages[n]=new Image();
        termImages[n].src=path+n+'.gif'
    }
}

if (document.images) termImgPreload(termImgPath,termImgNames);

function termSetImg(n,v) {
    if (document.images) {
        var img=(termLayers)? termDocNS4.images['term_'+n] : document.images['term_'+n];
        var stat=(v)? '_hi' : '_lo';
        img.src=termImages[n+stat].src
    }
}

// UI keyboard
// key maps (200=left shift, 202=right shift, 204=CpsLock)

var termKeyMap= [
    [96,49,50,51,52,53,54,55,56,57,48,45,61,8],
    [27,113,119,101,114,116,121,117,105,111,112,91,93,13],
    [204,97,115,100,102,103,104,106,107,108,59,39,35],
    [200,92,122,120,99,118,98,110,109,44,46,47,30,202],
    [32,28,31,29]
];
var termKeyMapShift=[
    [126,33,34,35,36,37,94,38,42,40,41,95,43,8],
    [27,81,87,69,82,84,89,85,73,79,80,123,125,13],
    [204,65,83,68,70,71,72,74,75,76,58,34,64],
    [200,124,90,88,67,86,66,78,77,60,62,63,30,202],
    [32,28,31,29]
];
var termKeyMapCpslk=[
    [96,49,50,51,52,53,54,55,56,57,48,45,61,8],
    [27,81,87,69,82,84,89,85,73,79,80,91,93,13],
    [204,65,83,68,70,71,72,74,75,76,59,39,35],
    [200,92,90,88,67,86,66,78,77,44,46,47,30,202],
    [32,28,31,29]
];
var termKeyWdth=[
    [35,35,35,35,35,35,35,35,35,35,35,35,35,69],
    [55,35,35,35,35,35,35,35,35,35,35,35,35,0],
    [65,35,35,35,35,35,35,35,35,35,35,35,35],
    [49,35,35,35,35,35,35,35,35,35,35,35,35,54],
    [252,35,35,35]
];

var keycapsImgNames=new Array(200,201,202,203,204,205);

function termKeyCaps(k) {
    if ((k<28) && (k>=32) && (repeatTimer)) clearTimeout(repeatTimer);
    if (k==204) {
        keycapsCpslk=(!keycapsCpslk);
        var cnr=(keycapsCpslk)? 205:204;
        termKbdSetImg(204,cnr)
    }
    else if ((k==200) || (k==202)) {
        keycapsShift=(!keycapsShift);
        var m=(keycapsShift)? 1:0;
        termKbdSetImg(200,200+m);
        termKbdSetImg(202,202+m)
    }
    else {
        var ch=0;
        if (keycapsShift) {
            ch=keycapsShiftRef[k]
            keycapsShift=false;
            termKbdSetImg(200,200);
            termKbdSetImg(202,202)
        }
        else if (keycapsCpslk) ch=keycapsCpslkRef[k]
        else ch=k;
        keyHandler({which:ch,jsuix_remapped:true})
    }
}

function termKbdSetImg(n,v) {
    if (document.images) {
        var img=(termLayers)? termKbdDocNS4.images['key'+n] : document.images['key'+n];
        img.src=termImages[v].src
    }
}

function termSetKbdButton(v) {
    if (document.images) {
        var img=(termLayers)? termDocNS4.images.term_kbd_show : document.images.term_kbd_show;
        var n=(termKbdOn)? 'kbd_hide' : 'kbd_show';
        var stat=(v)? '_hi' : '_lo';
        img.src=termImages[n+stat].src
    }
}

function termKbdShow() {
    if (termKbdOn) {
        setDivVisibility(termKbdDiv,0);
        termKbdOn=false;
        termSetKbdButton(0)
    }
    else {
        termImgPreload(keycapspath,keycapsImgNames);
        keycapsShift=false;
        keycapsCpslk=false;
        var s='<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">\n';
        s+='<TR><TD WIDTH="7" BGCOLOR="'+termPageColor+'"><IMG SRC="'+keycapspath+'spacer.gif" WIDTH="7" HEIGHT="2"><\/TD>\n';
        s+='<TD BGCOLOR="'+termPageColor+'">'+termMakeKbd()+'</TD>\n';
        s+'<TD WIDTH="7" BGCOLOR="'+termPageColor+'"><IMG SRC="'+keycapspath+'spacer.gif" WIDTH="7" HEIGHT="2"><\/TD><\TR>\n';
        s+='<TR><TD HEIGHT="10" COLSPAN="3" BGCOLOR="'+termPageColor+'"><IMG SRC="'+keycapspath+'spacer.gif" WIDTH="2" HEIGHT="10"><\/TD><\/TR>\n';
        s+='<\/TABLE>';
        writeElement(termKbdDiv,s);
        setDivXY(termKbdDiv,conf_term_x,conf_term_y+conf_kbd_offset+conf_rows*conf_rowheigt);
        if (termLayers) termKbdDocNS4=document.layers[termKbdDiv].document;
        termKbdOn=true;
        setDivVisibility(termKbdDiv,1);
        termSetKbdButton(0)
    }
}

function termMakeKbd() {
    var s='<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">\n';
    for (var i=0; i<termKeyMap.length; i++) {
        s+='<TR><TD NOWRAP HEIGHT="39" VALIGN="top" NOWRAP BGCOLOR="'+termKbdBgColor+'">';
        for (var k=0; k<termKeyMap[i].length; k++) {
            var kc=termKeyMap[i][k];
            keycapsShiftRef[kc]=termKeyMapShift[i][k];
            keycapsCpslkRef[kc]=termKeyMapCpslk[i][k];
            if (kc==13) {
                s+='<A HREF="javas'+'cript:termKeyCaps(13)" onfocus="if(this.blur)this.blur()"><IMG SRC="'+keycapspath+'13_1.gif" HSPACE="0" VSPACE="0" ALIGN="top" BORDER="0" WIDTH="47" HEIGHT="39"><\/A>';
                continue
            };
            if (kc==32) s+='<IMG SRC="'+keycapspath+'spacer.gif" WIDTH="139" HEIGHT="35" HSPACE="1" VSPACE="1" ALIGN="top">'
            else if (kc==28) {
                s+='<IMG SRC="'+keycapspath+'spacer.gif" WIDTH="23" HEIGHT="35" HSPACE="1" VSPACE="1" ALIGN="top">';
                s+='<A HREF="javasc'+'ript:cursorKbdLeft()" onfocus="if(this.blur)this.blur()" onmousedown="repeatSet(\'left\',1)" onmouseup="repeatClear()"><IMG SRC="'+keycapspath+kc+'.gif" NAME="key'+kc+'" HSPACE="1" VSPACE="1" ALIGN="top" BORDER="0" WIDTH="'+termKeyWdth[i][k]+'" HEIGHT="35"><\/A>';
                continue
            }
            else if (kc==29) {
                s+='<A HREF="javasc'+'ript:cursorKbdRight()" onfocus="if(this.blur)this.blur()" onmousedown="repeatSet(\'right\',1)" onmouseup="repeatClear()"><IMG SRC="'+keycapspath+kc+'.gif" NAME="key'+kc+'" HSPACE="1" VSPACE="1" ALIGN="top" BORDER="0" WIDTH="'+termKeyWdth[i][k]+'" HEIGHT="35"><\/A>';
                continue
            }
            else if (kc==8) {
                s+='<A HREF="javasc'+'ript:termKbdBackspace()" onfocus="if(this.blur)this.blur()" onmousedown="repeatSet(\'backspace\',1)" onmouseup="repeatClear()"><IMG SRC="'+keycapspath+kc+'.gif" NAME="key'+kc+'" HSPACE="1" VSPACE="1" ALIGN="top" BORDER="0" WIDTH="'+termKeyWdth[i][k]+'" HEIGHT="35"><\/A>';
                continue
            }
            s+='<A HREF="javas'+'cript:termKeyCaps('+kc+')" onfocus="if(this.blur)this.blur()"><IMG SRC="'+keycapspath+kc+'.gif" NAME="key'+kc+'" HSPACE="1" VSPACE="1" ALIGN="top" BORDER="0" WIDTH="'+termKeyWdth[i][k]+'" HEIGHT="35"><\/A>';
            if (kc==35) s+='<A HREF="javas'+'cript:termKeyCaps(13)" onfocus="if(this.blur)this.blur()"><IMG SRC="'+keycapspath+'13_2.gif" HSPACE="0" VSPACE="0" ALIGN="top" BORDER="0" WIDTH="37" HEIGHT="36"><\/A>';
        };
        s+='<\/TD><\/TR>\n';
    };
    s+='<\/TABLE>';
    return s
}

// term UI

function termHide() {
    if (repeatTimer) clearTimeout(repeatTimer);
    if (termKbdOn) termKbdShow();
    setDivVisibility(termDiv,0)
}

function makeTerm() {
    window.status='Building terminal ...';
    termLayers=(document.layers)? true:false;
    termSubDivs=(navigator.userAgent.indexOf('Gecko')<0);
    var s='';
    s+='<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1">\n';
    s+='<TR><TD BGCOLOR="'+termFrameColor+'" COLSPAN="2"><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="2"><TR><TD  BGCOLOR="'+termBgColor+'"><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0">\n';
    var rstr='';
    for (var c=0; c<conf_cols; c++) rstr+=' ';
    for (var r=0; r<conf_rows; r++) {
        var id=((termLayers) || (termSubDivs))? '' : ' ID="term_'+r+'"';
        s+='<TR><TD NOWRAP HEIGHT="'+conf_rowheigt+'"'+id+' CLASS="term">'+rstr+'<\/TD><\/TR>\n';
    };
    s+='<\/TABLE><\/TD><\/TR>\n';
    s+='<\/TABLE><\/TD><\/TR>\n';

    s+='<TR>\n<TD VALIGN="middle" BGCOLOR="'+termPageColor+'"><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"><TR>\n';
    s+='<TD><A HREF="javasc'+'ript:termKbdShow()" onmouseover="termSetKbdButton(1); window.status=\'show/hide full graphic keyboard\'; return true" onmouseout="termSetKbdButton(0); window.status=\'\'; return true" onfocus="if(this.blur)this.blur()"><IMG SRC="'+termImgPath+'kbd_show_lo.gif" NAME="term_kbd_show" WIDTH="73" HEIGHT="19" BORDER="0" HSPACE="5" ALT="show/hide keyboard"><\/A><\/TD><\/TR><\/TABLE><\/TD>\n';

    s+='<TD ALIGN="right"><TABLE BORDER="0" CELLSPACING="0" CELLPADDING="1"><TR>\n';
    s+='<TD><A HREF="javasc'+'ript:cursorKbdLeft()" onmouseover="termSetImg(\'left\',1); window.status=\'left\'; return true" onmouseout="termSetImg(\'left\',0); window.status=\'\'; return true" onfocus="if(this.blur)this.blur()" TITLE="cursor left" onmousedown="repeatSet(\'left\',1)" onmouseup="repeatClear()"><IMG SRC="'+termImgPath+'left_lo.gif" NAME="term_left" WIDTH="23" HEIGHT="23" ALT="cursor left" BORDER="0"><\/A><\/TD>\n';
    s+='<TD><A HREF="javasc'+'ript:cursorKbdRight()" onmouseover="termSetImg(\'right\',1); window.status=\'right\'; return true" onmouseout="termSetImg(\'right\',0); window.status=\'\'; return true" onfocus="if(this.blur)this.blur()" TITLE="cursor right" onmousedown="repeatSet(\'right\',1)" onmouseup="repeatClear()"><IMG SRC="'+termImgPath+'right_lo.gif" NAME="term_right" WIDTH="23" HEIGHT="23" ALT="cursor right" BORDER="0"><\/A><\/TD>\n';
    s+='<TD><A HREF="javasc'+'ript:termKbdBackspace()" onmouseover="termSetImg(\'delete\',1); window.status=\'backspace\'; return true" onmouseout="termSetImg(\'delete\',0); window.status=\'\'; return true" onfocus="if(this.blur)this.blur()" TITLE="backspace" onmousedown="repeatSet(\'backspace\',1)" onmouseup="repeatClear()"><IMG SRC="'+termImgPath+'delete_lo.gif" NAME="term_delete" WIDTH="23" HEIGHT="23" ALT="backspace" BORDER="0"><\/A><\/TD>\n';
    s+='<TD><A HREF="javasc'+'ript:termKbdEsc()" onmouseover="termSetImg(\'esc\',1); window.status=\'esc\'; return true" onmouseout="termSetImg(\'esc\',0); window.status=\'\'; return true" onfocus="if(this.blur)this.blur()" TITLE="esc"><IMG SRC="'+termImgPath+'esc_lo.gif" NAME="term_esc" WIDTH="23" HEIGHT="23" ALT="esc" BORDER="0"><\/A><\/TD>\n';
    s+='<\/TR><\/TABLE><\/TD><\/TR>\n';
    s+='<\/TABLE>\n';
    if (termLayers) {
        for (var r=0; r<conf_rows; r++) {
            s+='<LAYER NAME="term_'+r+'" TOP="'+(3+r*conf_rowheigt)+'" LEFT="3" CLASS="term"><\/LAYER>\n'
        };
        termDocNS4=document.layers[termDiv].document;
        termStringStart='<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR><TD NOWRAP HEIGHT="'+conf_rowheigt+'" CLASS="term">';
        termStringEnd='<\/TD><\/TR><\/TABLE>';
    }
    else if (termSubDivs) {
        for (var r=0; r<conf_rows; r++) {
            s+='<DIV ID="term_'+r+'" STYLE="position:absolute; top:'+(3+r*conf_rowheigt)+'px; left: 3px;" CLASS="term"><\/DIV>\n'
        };
        termStringStart='<TABLE BORDER="0" CELLSPACING="0" CELLPADDING="0"><TR><TD NOWRAP HEIGHT="'+conf_rowheigt+'" CLASS="term">';
        termStringEnd='<\/TD><\/TR><\/TABLE>';
    };
    writeElement(termDiv,s);
    setDivXY(termDiv,conf_term_x,conf_term_y);
    setDivVisibility(termDiv,1);
    window.status=''
}

function termDisplay(r) {
    var s=termStringStart;
    var curStyle=0;
    for (var i=0; i<conf_cols; i++) {
        var c=term[r][i];
        var cs=termStyle[r][i];
        if (cs!=curStyle) {
            if (curStyle) {
                for (var k=termStyles.length-1; k>=0; k--) {
                    var st=termStyles[k];
                    if (curStyle&st) s+=termStyleClose[st];
                }
            };
            curStyle=cs;
            for (var k=0; k<termStyles.length; k++) {
                var st=termStyles[k];
                if (curStyle&st) s+=termStyleOpen[st];
            }
        };
        s+= (termSpecials[c])? termSpecials[c] : String.fromCharCode(c);
    };
    if (curStyle>0) {
        for (var k=termStyles.length-1; k>=0; k--) {
            var st=termStyles[k];
            if (curStyle&st) s+=termStyleClose[st];
        }
    };
    s+=termStringEnd;
    writeElement('term_'+r,s,termDocNS4)
}

function termGuiReady() {
    ready=true;
    if (termGuiElementReady(termDiv, self.document)) {
        for (var r=0; r<conf_rows; r++) {
            if (termGuiElementReady('term_'+r,termDocNS4)==false) {
                ready=false;
                break
            }
        }
    }
    else ready=false;
    return ready
}

function cursorKbdLeft() {
    keyHandler({which:28})
}

function cursorKbdRight() {
    keyHandler({which:29})
}

function termKbdBackspace() {
    keyHandler({which:8})
}

function termKbdEsc() {
    keyHandler({which:27})
}

function termKbdClear() {
    if ((!cnslLock) && (!cnslRawMode)) cnslReset();
}

// UI-button repeat

function repeatSet(cmd,on) {
    if (repeatTimer) clearTimeout(repeatTimer);
    repeatTimer=setTimeout('repeatDo("'+cmd+'")',conf_repeat_delay1);
}

function repeatClear() {
    if (repeatTimer) clearTimeout(repeatTimer);
}

function repeatDo(cmd) {
    if (repeatTimer) clearTimeout(repeatTimer);
    if (cmd=='left') cursorKbdLeft()
    else if (cmd=='right') cursorKbdRight()
    else if (cmd=='backspace') termKbdBackspace();
    repeatTimer=setTimeout('repeatDo("'+cmd+'")',conf_repeat_delay2);
}

// basic dynamics

function writeElement(e,t,d) {
    if (document.layers) {
        var doc=(d)? d : self.document;
        doc.layers[e].document.open();
        doc.layers[e].document.write(t);
        doc.layers[e].document.close()
    }
    else if (document.getElementById) {
        var obj=document.getElementById(e);
        obj.innerHTML=t
    }
    else if (document.all) {
        document.all[e].innerHTML=t
    }
}

function setDivXY(d,x,y) {
    if (document.layers) {
        document.layers[d].moveTo(x,y)
    }
    else if (document.getElementById) {
        var obj=document.getElementById(d);
        obj.style.left=x+'px';
        obj.style.top=y+'px'
    }
    else if (document.all) {
        document.all[d].style.left=x+'px';
        document.all[d].style.top=y+'px'
    }
}

function setDivVisibility(d,v) {
    if (document.layers) {
        document.layers[d].visibility= (v)? 'show':'hide';
    }
    else if (document.getElementById) {
        var obj=document.getElementById(d);
        obj.style.visibility= (v)? 'visible':'hidden';
    }
    else if (document.all) {
        document.all[d].style.visibility= (v)? 'visible':'hidden';
    }
}

function termGuiElementReady(e,d) {
    if (document.layers) {
        var doc=(d)? d : self.document;
        return ((doc) && (doc.layers[e]))? true:false
    }
    else if (document.getElementById) {
        return (document.getElementById(e))? true:false
    }
    else if (document.all) {
        return (document.all[e])? true:false
    }
    else return false
}

//eof

Javascript 相关文章推荐
深入解析contentWindow, contentDocument
Jul 04 Javascript
浅谈angularJS 作用域
Jul 05 Javascript
uploadify多文件上传参数设置技巧
Nov 16 Javascript
初识简单却不失优雅的Vue.js
Sep 12 Javascript
js判断是否为空和typeof的用法(详解)
Oct 07 Javascript
微信小程序 video组件详解
Oct 25 Javascript
Vue组件tree实现树形菜单
Apr 13 Javascript
BootStrap 导航条实例代码
May 18 Javascript
JS实现手写parseInt的方法示例
Sep 24 Javascript
vue 实现数字滚动增加效果的实例代码
Jul 06 Javascript
JS实现分页导航效果
Feb 19 Javascript
vscode中的vue项目报错Property ‘xxx‘ does not exist on type ‘CombinedVueInstance<{ readyOnly...Vetur(2339)
Sep 11 Javascript
刷新时清空文本框内容的js代码
Apr 23 #Javascript
漂亮的widgets,支持换肤和后期开发新皮肤
Apr 23 #Javascript
IE与FireFox的兼容性问题分析
Apr 22 #Javascript
javascript生成/解析dom的CDATA类型的字段的代码
Apr 22 #Javascript
XML+XSL 与 HTML 两种方案的结合
Apr 22 #Javascript
用javascript实现的图片马赛克后显示并切换加文字功能
Apr 21 #Javascript
JS Timing
Apr 21 #Javascript
You might like
php文件打包 下载之使用PHP自带的ZipArchive压缩文件并下载打包好的文件
2012/06/13 PHP
php中flush()、ob_flush()、ob_end_flush()的区别介绍
2013/02/17 PHP
jQuery中的RadioButton,input,CheckBox取值赋值实现代码
2014/02/18 PHP
Linux系统递归生成目录中文件的md5的方法
2015/06/29 PHP
PHP中localeconv()函数的用法
2019/03/26 PHP
纯js实现背景图片切换效果代码
2010/11/14 Javascript
Jquery实现图片放大镜效果的思路及代码(自写)
2013/10/18 Javascript
jQuery获取节点和子节点文本的方法
2014/07/22 Javascript
用循环或if语句从json中取数据示例
2014/08/18 Javascript
采用自执行的匿名函数解决for循环使用闭包的问题
2014/09/11 Javascript
AngularJS中取消对HTML片段转义的方法例子
2015/01/04 Javascript
如何屏蔽防止别的网站嵌入框架代码
2015/08/24 Javascript
解决jQuery上传插件Uploadify出现Http Error 302错误的方法
2015/12/18 Javascript
Bootstrap3 多选和单选框(checkbox)
2016/12/29 Javascript
NodeJS仿WebApi路由示例
2017/02/28 NodeJs
Vue组件通信的四种方式汇总
2018/02/08 Javascript
详解开发react应用最好用的脚手架 create-react-app
2018/04/24 Javascript
js实现圆形显示鼠标单击位置
2020/02/11 Javascript
js瀑布流布局的实现
2020/06/28 Javascript
[01:06:59]完美世界DOTA2联赛PWL S2 Magma vs FTD 第一场 11.29
2020/12/02 DOTA
Python中使用items()方法返回字典元素对的教程
2015/05/21 Python
详解Python如何生成词云的方法
2018/06/01 Python
python3+PyQt5 实现Rich文本的行编辑方法
2019/06/17 Python
Django DRF APIView源码运行流程详解
2020/08/17 Python
CSS3制作炫酷带方向感应的鼠标滑过图片3D动画
2016/03/16 HTML / CSS
使用纯 CSS 创作一个脉动 loader效果的源码
2018/09/28 HTML / CSS
美国知名玩具品牌:Melissa & Doug
2016/08/16 全球购物
Sneaker Studio波兰:购买运动鞋
2018/04/28 全球购物
大型车展策划方案
2014/02/01 职场文书
初中生自我鉴定
2014/02/04 职场文书
毕业设计工作总结
2015/08/14 职场文书
MySQL删除和插入数据很慢的问题解决
2021/06/03 MySQL
vue+element ui实现锚点定位
2021/06/29 Vue.js
java解析XML详解
2021/07/09 Java/Android
Spring Boot 实现 WebSocket
2022/04/30 Java/Android
MySQL数据库查询之多表查询总结
2022/08/05 MySQL