/*
Copyright (c) 2010 Nathan Garabedian, All Rights Reserved.
Please contact me for permission to use this code (kttydoggy-a-t-yahoo-d-o-t-com)

DOS Emulation Website 
Written in JavaScript by Nathan Garabedian

Version 1.00

*/
/*global document: false, window: false, navigator: false, Image: false */

var ver="1.00";
var chars=0;
var columns=0;
var command='';
var prevcommand='';
var readyForKeypress=false;
var dbg=false;
function rnd(min,max) {return Math.floor(Math.random()*max+min);}
function id(x) {return document.getElementById(x);}
function d(x) {if(dbg) {var y=id("status");y.innerHTML=x+"<br />"+y.innerHTML;}}
function whichBrs() { 
	var agt=navigator.userAgent.toLowerCase(); 
	if (agt.indexOf("opera") != -1) {return 'Opera';}
	if (agt.indexOf("staroffice") != -1) {return 'Star Office';}
	if (agt.indexOf("webtv") != -1) {return 'WebTV';}
	if (agt.indexOf("beonex") != -1) {return 'Beonex';}
	if (agt.indexOf("chimera") != -1) {return 'Chimera';} 
	if (agt.indexOf("netpositive") != -1) {return 'NetPositive';}
	if (agt.indexOf("phoenix") != -1) {return 'Phoenix';}
	if (agt.indexOf("firefox") != -1) {return 'Firefox';}
	if (agt.indexOf("safari") != -1) {return 'Safari';}
	if (agt.indexOf("skipstone") != -1) {return 'SkipStone';}
	if (agt.indexOf("msie") != -1) {return 'IE';}
	if (agt.indexOf("netscape") != -1) {return 'Netscape';}
	if (agt.indexOf("mozilla/5.0") != -1) {return 'Mozilla';}
	if (agt.indexOf('\/') != -1) { 
		if (agt.substr(0,agt.indexOf('\/')) != 'mozilla') { 
			return navigator.userAgent.substr(0,agt.indexOf('\/')); 
		} else {
			return 'Netscape';
		}
	} else if (agt.indexOf(' ') != -1) {
		return navigator.userAgent.substr(0,agt.indexOf(' ')); 
	} else {
		return navigator.userAgent; 
	}
} 

function insertChar(ch) {
	var newchar = document.createElement("img");
	newchar.setAttribute("src","ascii/" + ch.toString(16) + ".png");
	newchar.setAttribute("alt",String.fromCharCode(ch));
	var curs = id('cursor');
	curs.parentNode.insertBefore(newchar,curs);
}

function addChar(obj,ch) {
	var newchar = document.createElement("img");
	newchar.setAttribute("src","ascii/" + ch.toString(16) + ".png");
	newchar.setAttribute("alt",String.fromCharCode(ch));
	obj.appendChild(newchar);
}

function insertBr() {
	columns++;
	var newchar = document.createElement("br");
	var curs = id('cursor');
	curs.parentNode.insertBefore(newchar,curs);
	if( columns>23 ) {
		var firstchar = id('dosbox').firstChild;

		while( firstchar.tagName.toLowerCase() != 'br' ) {
			firstchar.parentNode.removeChild(firstchar);
			firstchar = id('dosbox').firstChild;
		}	
		firstchar.parentNode.removeChild(firstchar);
		
	}
} 

function writeStr(str,obj) {
	for( var i=0; i<str.length; i++ ) {
		if( str.charCodeAt(i)==10 ) {
			insertBr();
		} else {
			if(obj===undefined) {
				insertChar(str.charCodeAt(i));
			} else {
				addChar(obj,str.charCodeAt(i));
			}
		}
	}
}

function writeLink(link,cmds,str) {
	// add link
	var newchar = document.createElement("a");
	newchar.setAttribute("href",link);
	var curs = id('cursor');
	curs.parentNode.insertBefore(newchar,curs);

	// add string under link
	writeStr(str,newchar);
}

var files = [
	["BLOG.EXE",0,"load","http://www.aqfire.com/blog/"],
	["BOOT.COM",15,"load","http://www.aqfire.com/boot/"],
	["MOBILE.BAT",244,"load","http://www.aqfire.com/m/"],
	["TECHBLOG.EXE",312,"load","http://www.aqfire.com/techblog"]
];

function getFormattedFileString(file,ext,size,date,time) {
	var retval = file;
	for( var i=9;i>2;i-- ) {
		if( file.length < i ) {
			retval += ' ';
		}
	}
	retval += ext;
	for( var i=2;i>0;i-- ) {
		if( ext.length < i ) {
			retval += ' ';
		}
	}
	size = ''+size;
	for( var i=14;i>0;i-- ) {
		if( size.length < i ) {
			retval += ' ';
		}
	}
	retval += size + " " + date + "  " + time;
	return retval;
}

function listCmds() {
	writeStr("Valid Commands:\n\n");
    writeStr("VER        - AQ-DOS Version\n");
    writeStr("HELP,MENU  - This menu\n");
    writeStr("DIR,LS     - List Directory Contents\n");
    writeStr("<FILENAME> - Run Program (load website)\n\n");
    prompt();	
}

function listDir() {
	writeStr("\n Volume in drive A is WWW_AQFIRE_COM\n");
	writeStr(" Volume Serial Number is 12FE-0750\n");
	writeStr(" Directory of A:\\\n\n");
	
	var bytes = 0;
	var fcount = 0;
	for( f in files ) {
		if( files[f] && files[f][1] > 0 ) {
			fcount++;
			bytes += files[f][1];
			if( files[f][2]=="load") {
				var fname = files[f][0].split('.');
				
				writeLink(files[f][3],fname[0]+";"+files[f][0],
					getFormattedFileString(
						fname[0],fname[1],files[f][1],
						'03-01-10','12:00a')
				);
				insertBr();
			}
		}
	}
	writeStr("        "+fcount+" file(s)            "+bytes+" bytes     \n");
	writeStr("                          "+(368640-bytes)+" bytes free\n");//368640
    prompt();
}

function prompt() {
	command = '';
	chars = 0;
	writeStr("A:\\>");
    readyForKeypress=true;
}

function cls() {
    columns=0;
    id('dosbox').innerHTML = '';
    setupCursor();
    prompt()
}

function init() {
	preloadImages();
	// hide/show status window
	if( dbg===false ) {
		id('status').style.display='none';
	}
	
	// init cursor
    setupCursor();
    writeStr("\nStarting AQ-DOS...");
    setTimeout(simulateDOSBoot,2000);
    
}

function setupCursor() {
	// init cursor
	var cursor = document.createElement("img");
	cursor.src = "http://www.aqfire.com/ascii/cursor2.gif";
	cursor.width = "8";
	cursor.height = "16";
	cursor.id = "cursor";//setAttribute("id","cursor");
	//cursor.style.backgroundImage="url('http://www.aqfire.com/cursor2.gif')";
	//cursor.style.backgroundRepeat="no-repeat";
	//cursor.style.width="8px";
	//cursor.style.height="16px";
	//cursor.style.display="inline-block";
	id('dosbox').appendChild(cursor);
}

function simulateDOSBoot() {
    
 	// setup screen
	writeStr("\n\n\nA:\\>dir\n");
    setTimeout(listDir,1000);
}

function doBackspace() {
	chars--;
	command = command.substring(0,command.length-1);

	//check for <br>
	var curs = id('cursor').previousSibling;
	if( curs.tagName.toLowerCase()=='br' ){
		curs.parentNode.removeChild(curs);
	}
	curs = id('cursor').previousSibling;
	curs.parentNode.removeChild(curs);	
}

function submit() {
    readyForKeypress=false;
	var cmd = command.toUpperCase().split(' ');
	cmd[0] = cmd[0].split('/');
	d('command:'+cmd[0]);
	switch( cmd[0][0] ) {
		case 'BOOT':
		case 'BOOT.COM':
			openPage('http://www.aqfire.com/boot/');
			break;
		case 'BLOG':
		case 'BLOG.EXE':
			openPage('http://www.aqfire.com/blog/');
			break;
		case 'TECHBLOG':
		case 'TECHBLOG.EXE':
            openPage('http://www.aqfire.com/techblog/');
			break;
		case 'MOBILE':
		case 'MOBILE.BAT':
            openPage('http://www.aqfire.com/m/');
			break;            
        case 'CLS':
            cls();
            break;
        case 'HELP':
        case 'MENU':
        case 'INDEX':
        case '?':
            setTimeout(listCmds,1000);
            break;
		case 'DIR':
        case 'LS':
            setTimeout(listDir,1000);
			break;
		case 'VER':
			writeStr("AQ-DOS Version "+ver+"\n\n");
            prompt();
			break;
        case 'CALL': // shell to cmd
            if( cmd[1] ) {
                command = cmd[1];
                submit();
            } else {
                writeStr("Bad use of CALL\n\n");
                prompt();
            }
            break;
        // DOS COMMANDS THAT DON'T DO ANYTHING
        case 'ATTRIB':
        case 'BREAK': //break on / break off
        case 'BUFFERS': // set internal buffers
        case 'CMD':
        case 'COMMAND':
		case '':
            prompt();
			break;
		default:
			writeStr("Bad command or file name\n\n");
            prompt();
			break;
	}
}

function openPage(url) {
    writeStr('Loading '+url+" ...\n");
    window.open(url);
    prompt();
}

function doEnter() {
	insertBr();
	submit();
}

function keyPressed(e) {
    if( readyForKeypress===false ) return;
	e=e?e:window.event;
	var keyid = e.charCode ? e.charCode : e.keyCode;
	//d('e.charCode:'+e.charCode+' e.keyCode:'+e.keyCode+' keyid:'+keyid);
	//var realkey = parseInt(keyid,16);//DoAsciiHex(String.fromCharCode(keyid),"A2H");
	if( keyid==8 ) { //backspace
		if( chars > 0 ) {
			doBackspace();
		}
		return false;
	} else if( keyid==13 ) { //enter
		prevcommand = command;
		//if( chars > 0 )
		doEnter();
		return false;
	} else if( keyid==38 ) { //up arrow
		command = prevcommand;
		writeStr(command);
	} else {
		if (chars >= 255) {return;}
		chars++;
		command += String.fromCharCode(keyid);
		
		insertChar(keyid);
		if(chars ==76||chars==156||chars==236) {
			insertBr();
		}
		
/*		var cpos = findPos(curs);
		d('['+cpos[0] + ";" + cpos[1]+'] ');
		if( cpos[1] > 376) {
			curs.parentNode.style.top -= 16;
		}
*/
	}
}

function findPos(obj) {
	var curleft = 0;
	var curtop = 0;
	if(obj.offsetParent) {
		do {
			curleft += obj.offsetLeft;
			curtop += obj.offsetTop;
		} while ((obj = obj.offsetParent));
	}
	return [curleft,curtop];
}

function disableBackspace(e) {
	e=e?e:window.event;
	//d('e.keyCode:'+e.keyCode);
	switch(e.keyCode) {
		case 8:
			e.cancelBubble=true;
			e.returnValue=false;
			if( chars > 0 ) {doBackspace();}
			return false;
		case 13:
			e.cancelBubble=true;
			e.returnValue=false;
			if( chars > 0 ) {doEnter();}
			return false;
	}
	return true;
}

function sleep(delay)
{
    var start = new Date().getTime();
    while (new Date().getTime() < start + delay) {}
}

/*
function DoAsciiHex(x,dir) 
	{hex="0123456789ABCDEF";almostAscii=' !"#$%&'+"'"+'()*+,-./0123456789:;<=>?@ABCDEFGHIJKLMNOPQRSTUVWXYZ['+'\\'+']^_`abcdefghijklmnopqrstuvwxyz{|}';r="";
	if(dir=="A2H")
	{for(i=0;i<x.length;i++){let=x.charAt(i);pos=almostAscii.indexOf(let)+32;h16=Math.floor(pos/16);h1=pos%16;r+=hex.charAt(h16)+hex.charAt(h1);};};
	if(dir=="H2A")
	{for(i=0;i<x.length;i++){let1=x.charAt(2*i);let2=x.charAt(2*i+1);val=hex.indexOf(let1)*16+hex.indexOf(let2);r+=almostAscii.charAt(val-32);};};
	return r;
};
*/

//document.onload=init;
var br = whichBrs();
if(br=="IE"||br=="Safari") {
	// in ie, only 'onkeydown' can capture backspace before it sends you to previous page
	document.onkeydown=disableBackspace;
}
document.onkeypress=keyPressed;

