/**
	cnsl v1.1 // Skye Klein 2008 Some Rights Reserved.
	This software is distributed under a Creative Commons Attribution-Non-Commercial-Share Alike 3.0 license.
	You may reuse, redistribute and make variations on this code providing that your derivation is for non-commercial purposes, 
	is attributed to the original author (Skye Klein / (i)=x) and is distributed under the same Creative commons license.

	This is (very) beta software and is currently under redevelopment. You are strongly advised to wait for the updated
	version if you wish to use this code. Contact iequalsx at gmail dot com for more information.
*/
var cnsl=new Object();cnsl.lineBreak="[nl]";cnsl.writeRate=1;cnsl.maxInputLen=128;cnsl.screenWidth=60;function in_array(sNeedle,aHaystack){for(var i=0;i<aHaystack.length;i++){if(sNeedle==aHaystack[i]){return true;}}
return false;};Array.prototype.add=function(s){return this[this.length]=s;};String.prototype.trim=function(){return this.replace(/^\s+|\s+$/g,'');};String.prototype.pad=function(l,s,t){return s||(s=" "),(l-=this.length)>0?(s=new Array(Math.ceil(l/s.length)
+1).join(s)).substr(0,t=!t?l:t==1?0:Math.ceil(l/2))
+this+s.substr(0,l-t):this;};cnsl.lastCommand=null;cnsl.lineBreakLen=cnsl.lineBreak.length;cnsl.cursorBlinkStatus=1;cnsl.outputCount=0;cnsl.l4m3r=false;cnsl.httpRequest=false;cnsl.xmlDoc=null;cnsl.currentDir=null;cnsl.path=new Array();cnsl.cursorBlink=function(){if(cnsl.cursorBlinkStatus==1){cnsl.inputCursor.style.visibility="hidden";cnsl.cursorBlinkStatus=0;}
else{cnsl.inputCursor.style.visibility="visible";cnsl.cursorBlinkStatus=1;}};cnsl.setStyle=function(oElem,sStyle,sVal){oElem.style[sStyle]=sVal;};cnsl.clearInput=function(){cnsl.inputField.value="";cnsl.inputDisplay.innerHTML="";};cnsl.clearOutput=function(){for(var i=0;i<cnsl.outputCount;i++){var thisElem=document.getElementById("output"+i);thisElem.parentNode.removeChild(thisElem);}
cnsl.outputCount=0;};cnsl.writeOutput=function(sElemID,sString,sHtmlTag){if(sHtmlTag!=""){var oNode=document.createElement(sHtmlTag);if(sString!=""){oNode.innerHTML=sString.replace(/(<([^>]+)>)/ig,"");}}
else{var oNode=document.createTextNode(sString);}
document.getElementById(sElemID).appendChild(oNode);};cnsl.sendOutput=function(sString){sString=sString.trim().replace(/\n/g,cnsl.lineBreak)+cnsl.lineBreak;var newElem=document.createElement("span");newElem.id="output"+cnsl.outputCount;var outputElem=cnsl.outputCursor.parentNode.insertBefore(newElem,cnsl.outputCursor);cnsl.setStyle(cnsl.inputCursor,"visibility","hidden");cnsl.setStyle(cnsl.outputCursor,"visibility","visible");setTimeout("cnsl.setStyle(cnsl.inputCursor, 'visibility', 'visible')",(sString.length*cnsl.writeRate));setTimeout("cnsl.setStyle(cnsl.outputCursor, 'visibility', 'hidden')",(sString.length*cnsl.writeRate));for(var i=0;i<sString.length;i++){var str="";var htmlTag="";if(sString.substr(i,cnsl.lineBreakLen)==cnsl.lineBreak){str="";htmlTag="br";i+=(cnsl.lineBreakLen-1);}
else if(sString.substr(i,1)=="<"){var openTagOPos=i;var openTagCPos=sString.indexOf(">",i);var closeTagCPos=sString.indexOf(">",openTagCPos+1);htmlTag=sString.substr((openTagOPos+1),(openTagCPos-1)-i);str=sString.substr(openTagOPos,(closeTagCPos+1)-i);i+=(str.length-1);}
else if(sString.substr(i,1)=="\\"){str="\\\u005C";}
else if(sString.substr(i,1)==" "){str="\u00A0";}
else if(sString.substr(i,1)=="'"){str="\\\'";}
else{str=sString.substr(i,1);}
setTimeout("cnsl.writeOutput('output"+cnsl.outputCount+"', '"+str+"', '"+htmlTag+"')",(i*cnsl.writeRate));}
cnsl.outputCount++;};cnsl.buildInterface=function(){var outputWrap=document.createElement("div");outputWrap.id="outputWrap";var outputCursor=document.createElement("span");outputCursor.id="outputCursor";outputCursor.innerHTML="&nbsp;";cnsl.outputCursor=outputWrap.appendChild(outputCursor);cnsl.outputWrap=document.body.appendChild(outputWrap);var inputWrap=document.createElement("div");inputWrap.id="inputWrap";var inputDisplay=document.createElement("span");inputDisplay.id="inputDisplay";cnsl.inputDisplay=inputWrap.appendChild(inputDisplay);var inputCursor=document.createElement("span");inputCursor.id="inputCursor";inputCursor.innerHTML="&nbsp;";cnsl.inputCursor=inputWrap.appendChild(inputCursor);window.setInterval("cnsl.cursorBlink()",400);cnsl.inputWrap=document.body.appendChild(inputWrap);var inputField=document.createElement("input");inputField.id="inputField";inputField.type="text";cnsl.inputField=document.body.appendChild(inputField);cnsl.inputField.focus();document.onclick=function(){cnsl.inputField.focus();};document.onmousedown=function(){cnsl.inputField.focus();};document.onmouseup=function(){cnsl.inputField.focus();};cnsl.inputField.onkeydown=function(evt){evt=(evt)?evt:event;var charCode=(evt.charCode)?evt.charCode:((evt.which)?evt.which:evt.keyCode);if(charCode>=48&&charCode<91){if(cnsl.inputField.value.length<=cnsl.maxInputLen){cnsl.inputDisplay.innerHTML+=String.fromCharCode(charCode);}}
else{switch(charCode){default:return false;break;case 8:cnsl.inputDisplay.innerHTML=cnsl.inputField.value.substr(0,((cnsl.inputField.value.length)-1))
break;case 32:cnsl.inputDisplay.innerHTML+="&nbsp;";break;case 38:cnsl.inputDisplay.innerHTML=cnsl.lastCommand;cnsl.inputField.value=cnsl.lastCommand;break;case 37:case 39:case 40:return false;break;case 190:cnsl.inputDisplay.innerHTML+=".";break;case 13:case 3:cnsl.lastCommand=cnsl.inputField.value;cnsl.clearInput();cnsl.processCommand(cnsl.lastCommand);break;}}};};cnsl.processCommand=function(sCommand){cmdSplit=sCommand.split(" ");if(cmdSplit[0]==""){cnsl.sendOutput("");}
else{switch(cmdSplit[0].toLowerCase()){case"reset":window.location=window.location;break;case"clear":cnsl.clearOutput();break;case"go":cnsl.sendOutput("launching "+"http://"+cmdSplit[1].replace("http://",""),"cnsl_go");window.open("http://"+cmdSplit[1].replace("http://",""),"cnsl_go","width=800,height=600,menubar=yes,resizable=yes,scrollbars=yes,status=yes,toolbar=yes");break;case"help":case"system":cnsl.clearOutput();var aOutput=new Array();aOutput.add("<u>"+(cmdSplit[0].toUpperCase()).pad(cnsl.screenWidth,"_",1)+"</u>");aOutput.add(cnsl.xmlDoc.getElementsByTagName(cmdSplit[0]).item(0).childNodes[0].data);cnsl.sendOutput(aOutput.join(cnsl.lineBreak)+
cnsl.promptText);break;case"contact":window.location="mailto:i.equals.x@gmail.com?subject=adNI";break;case"list":cnsl.clearOutput();cnsl.sendOutput(cnsl.formatDir()+
cnsl.promptText);break;case"back":if(cnsl.path.length>1){cnsl.path.pop();var prevDir=cnsl.path.pop();cnsl.path.add(prevDir);cnsl.currentDir=cnsl.getDirectory(prevDir);cnsl.processCommand("list");}
break;case"open":case"get":if(cnsl.currentDir["contents"][cmdSplit[1]]){var itemName=cnsl.currentDir["contents"][cmdSplit[1]]["name"];switch(cnsl.currentDir["contents"][cmdSplit[1]]["type"]){case"dir":var openDir=cnsl.getDirectory(itemName);cnsl.currentDir=openDir;cnsl.path.add(itemName);cnsl.processCommand("list");break;case"file":var fileURL=cnsl.currentDir["contents"][cmdSplit[1]]["href"];var fileExt=fileURL.split(".").pop();switch(fileExt){default:cnsl.sendOutput(cnsl.lineBreak+"Opening: `"+itemName+"`");window.location=fileURL;break;case"xml":cnsl.request(fileURL,"",function(){cnsl.displayFile(itemName);});break;case"jpg":case"gif":case"png":cnsl.clearOutput();cnsl.sendOutput("<u>"+itemName.pad(cnsl.screenWidth,"_",1)+"</u>");var newElem=document.createElement("span");newElem.id="output"+cnsl.outputCount;newElem.className="img";var newImage=document.createElement("img");newImage.src=fileURL;newElem.appendChild(document.createElement("br"));newElem.appendChild(newImage);newElem.appendChild(document.createElement("br"));var outputElem=cnsl.outputCursor.parentNode.insertBefore(newElem,cnsl.outputCursor);cnsl.outputCount++;break;}
break;}}
else{if(typeof(cmdSplit[1])=="undefined"){cmdSplit[1]="";}
cnsl.sendOutput(cnsl.lineBreak+"Invalid item: `"+cmdSplit[1]+"`");}
break;default:cnsl.sendOutput(cnsl.lineBreak+"Systax error: `"+cmdSplit[0]+"`"+cnsl.lineBreak+"Enter HELP to list valid commands.");break;}}};cnsl.getDirectory=function(sDirName){var allDirs=cnsl.xmlDoc.getElementsByTagName("dir");for(var i=0;i<allDirs.length;i++){if(allDirs[i].getAttribute("name")==sDirName){var thisDir=allDirs[i];var thisDirItems=thisDir.childNodes;break;}}
var currentDir=new Object();currentDir["name"]=sDirName;if(thisDir.getElementsByTagName("description").item(0).childNodes[0]){currentDir["description"]=thisDir.getElementsByTagName("description").item(0).childNodes[0].data;}
currentDir["contents"]=new Object();var count=1;for(var i=0;i<thisDirItems.length;i++){switch(thisDirItems[i].nodeName){case"dir":case"file":var thisItem=new Object();thisItem["type"]=thisDirItems[i].nodeName;thisItem["name"]=thisDirItems[i].getAttribute("name");if(thisDirItems[i].getAttribute("tag")){thisItem["tag"]=thisDirItems[i].getAttribute("tag");}
else if(thisDirItems[i].getElementsByTagName("description").item(0).childNodes[0]){thisItem["description"]=thisDirItems[i].getElementsByTagName("description").item(0).childNodes[0].data;}
if(thisDirItems[i].getAttribute("href")){thisItem["href"]=thisDirItems[i].getAttribute("href");}
if(thisDirItems[i].getAttribute("size")){thisItem["size"]=thisDirItems[i].getAttribute("size");}
currentDir["contents"][count]=thisItem;count++;break;}}
return currentDir;};cnsl.formatDir=function(){var aDirs=new Array();var aFiles=new Array();for(var x in cnsl.currentDir["contents"]){switch(cnsl.currentDir["contents"][x]["type"]){case"dir":aDirs.add(x.pad(3," ",1)+"<strong>"+cnsl.currentDir["contents"][x]["name"]+"</strong>");if(cnsl.currentDir["contents"][x]["tag"]){aDirs.add("".pad(3," ")+cnsl.currentDir["contents"][x]["tag"]);}
break;case"file":aFiles.add(x.pad(3," ",1)+"<strong>"+cnsl.currentDir["contents"][x]["name"]+"</strong>"+" ("+cnsl.currentDir["contents"][x]["size"]+" "+
cnsl.currentDir["contents"][x]["href"].split(".").pop()+")");if(cnsl.currentDir["contents"][x]["description"]){aFiles.add("".pad(3," ")+cnsl.currentDir["contents"][x]["description"]);}
break;}}
var aOutput=new Array();aOutput.add("<u>/"+(cnsl.path.join("/")+"/").pad(cnsl.screenWidth,"_",1)+"</u>");if(cnsl.currentDir["description"]){aOutput.add(cnsl.currentDir["description"]);}
aOutput.add("");aOutput.add("<u>"+"DIRS".pad(cnsl.screenWidth,"_",1)+"</u>");aOutput=aOutput.concat(aDirs);aOutput.add("");aOutput.add("<u>"+"FILES".pad(cnsl.screenWidth,"_",1)+"</u>");aOutput=aOutput.concat(aFiles);aOutput.add("");return aOutput.join(cnsl.lineBreak);};cnsl.request=function(url,parameters,callback){cnsl.httpRequest=false;if(window.XMLHttpRequest){cnsl.httpRequest=new XMLHttpRequest();if(cnsl.httpRequest.overrideMimeType){cnsl.httpRequest.overrideMimeType('text/xml');}}
else if(window.ActiveXObject){try{cnsl.httpRequest=new ActiveXObject("Msxml2.XMLHTTP");}
catch(e){try{cnsl.httpRequest=new ActiveXObject("Microsoft.XMLHTTP");}catch(e){}}}
if(!cnsl.httpRequest){document.write('Cannot create XMLHTTP instance');return false;}
cnsl.httpRequest.onreadystatechange=callback;cnsl.httpRequest.open('GET',url+parameters,true);cnsl.httpRequest.send(null);};cnsl.receiveXML=function(){if(cnsl.httpRequest.readyState==4){if(cnsl.httpRequest.status==200){cnsl.xmlDoc=cnsl.httpRequest.responseXML.getElementsByTagName("cnsl").item(0);cnsl.currentDir=cnsl.getDirectory("HOME");cnsl.path.add("HOME");cnsl.welcomeText=cnsl.xmlDoc.getElementsByTagName("welcome").item(0).childNodes[0].data;cnsl.promptText=cnsl.xmlDoc.getElementsByTagName("prompttext").item(0).childNodes[0].data;var dirOutput=cnsl.formatDir();cnsl.sendOutput(cnsl.welcomeText+
dirOutput+
cnsl.promptText);}
else{cnsl.sendOutput("Http request failed. Enter RESET to try again.");}}};cnsl.displayFile=function(fileName){if(cnsl.httpRequest.readyState==4){if(cnsl.httpRequest.status==200){cnsl.clearOutput();cnsl.sendOutput("<u>"+fileName.pad(cnsl.screenWidth,"_",1)+"</u>"+
cnsl.lineBreak+
cnsl.httpRequest.responseXML.getElementsByTagName("content").item(0).childNodes[0].data);}}};cnsl.init=function(){cnsl.buildInterface();var ts=new Date();cnsl.request("_cnsl/cnsl.xml.php","?ts="+ts,function(){cnsl.receiveXML();});};cnsl.init();