var sys={
'_cwd':'',
'_d':0,
'init':function(){
sys.welcome();
sys.prompt();
$(document).click(function(){
if($('#less').css('display')=='none') $('#input').focus();
}).keyup(function(e){
if($('#less').css('display')=='none'){
return;
}
if (e.target.tagName=='INPUT' || e.target.tagName=='TEXTAREA') {
return;
}
if(e.keyCode==81 || e.keyCode==27){//q,esc
sys.quitRead();
}
});
},
'read':function(file){
  if (!file.match(/\.html$/)) {
    sys.error(file+': No such file');
    return;
  }
  var t=sys.load('/logs/'+file);
  if (!t) {
    sys.error(file+': No such file or directory');
  }
  var content = t.match(/<body>([\u0000-\uffff]*)<\/body>/m)[1];
  if (!content) {
    sys.error(file+': Is a directory');
  }
  sys._odw=document.write;
  document.write=function(){};
  $('#lessContent').html(content);
  $('#lessContent #commentForm form').append('<input type="hidden" name="reurl"" value="'+location.href+'logs/'+file+'"/>');
  $('#log').hide();$('#current').hide();$('#less').show();
},
'quitRead':function(){
  $('#less').hide();
  $('#log').show();
  $('#current').show();
  document.write=sys._odw;
},
'getPrompt':function(){
return '<span class="prompt">guest <span class="cwd">/'+sys._cwd+'</span> $ </span>';
},
'clear':function() {
$('#log').html('');
},
'print':function(text){
$('#log').append('<li>'+text+'</li>');
},
'error':function(text){
$('#log').append('<li class="error">'+text+'</li>');
},
'dir':function(s){
return '<span class="dir" onclick="sys.execCommand(\'cd '+s+'\')">'+s+'</span>';
},
'file':function(s){
return '<span class="file" onclick="sys.execCommand(\'less '+s+'\')">'+s+'</span>';
},
'welcome':function(){
var w=
" ####   ###   #   #   ####   ###   #      ##### \n"+
"#      #   #  ##  #  #      #   #  #      #     \n"+
"#      #   #  # # #   ###   #   #  #      ####  \n"+
"#      #   #  #  ##      #  #   #  #      #     \n"+
" ####   ###   #   #  ####    ###   #####  ##### \n"+
"\n"+
"####   #       ###    ###  \n"+
"#   #  #      #   #  #     \n"+
"####   #      #   #  #  ## \n"+
"#   #  #      #   #  #   # \n"+
"####   #####   ###    ###  \n";
sys.print('<pre>'+w+'</pre>');
sys.print($('#head a').html());
sys.print($('#head a').attr('href'));
sys.print($('#head div.desc').html());
sys.print('<br>type "help" for usage.<br>');
},
'blogUrl':function(){
return $('#head a').attr('href');
},
'urlToName':function(url){
return url.match(/\/(\d+\.html).*$/)[1];
},
'nameToUrl':function(name){
return sys.blogUrl()+name;
},
'prompt':function(){
$('#current').html(sys.getPrompt()).append('<input type="text" id="input" />');
$('#input').focus().keypress(function (e){
  if(e.which==13){
    sys.execCommand(this.value);
  }
});
},
'execCommand':function(s){
sys.print(sys.getPrompt()+s);
var cmd=sys.parseCommand(s);
if (!cmd) {
return;
}
sys.doCommand(cmd);
$('#input').val('');
$('#current span.cwd').html('/'+sys._cwd);
window.scrollTo(0,1048575);
},
'parseCommand':function(s){
var trimed=s.replace(/^\s+/,'').replace(/\s+$/,'')
var cmd=trimed.split(/\s+/,1)[0];
if(!cmd){
  return;
}
var arg=trimed.substr(cmd.length).replace(/^\s+/,'');
return {'cmd':cmd, 'arg':arg};
},
'doCommand':function(cmd){
if(!command[cmd.cmd]){
  sys.error('command '+cmd.cmd+' not found. type "help" for usage.');
  return;
}
command[cmd.cmd](cmd.arg);
},
'load':function(url){
sys.load.cache=sys.load.cache||{};
if (!sys.load.cache[url]){
switch (url) {
case '/logs/links.html': 
  sys.load.cache[url] = sys.linksHtml();
  break;
case '/logs/catelogs.html':
  sys.load.cache[url] = sys.catelogHtml();
  break;
case '/logs/tags.html':
  sys.load.cache[url] = sys.tagHtml();
  break;
default:
  sys.load.cache[url] = $.ajax({
    'url':url,
    'async':false
    }).responseText;
  break;
}
}
return sys.load.cache[url];
},
'links':function() {
var ret={'name':$('#links h2').html(),'items':{}};
$('#links li a').each(function(){
  ret.items[$(this).attr('href')] = $(this).html();
});
return ret;
},
'linksHtml':function(){
var links=sys.links();
var ret='<body><div><div class="content"><ul>';
for (url in links.items){
ret+='<li><a target="_blank" href="'+url+'">'+links.items[url]+'</a></li>';
}
ret+='</ul></div></div></body>';
return ret;
},
'catelogs':function(){
var ret={'name':$('#cats h2').html(),'items':{}};
$('#cats li a').each(function(){
var name = $(this).attr('href').replace(/\//g, '');
ret.items[name] = $(this).text();
});
return ret;
},
'catelogHtml':function(){
var cats = sys.catelogs();
var ret = '<body><div><div class="content"><ul>';
for (name in cats.items){
ret+='<li><span style="margin-right:4em">'+name+'</span>'+cats.items[name]+'</li>';
}
ret+='</ul></div></div></body>';
return ret;
},
'tags':function(){
var tags={'name':$('#tags h2').html(),'items':[]};
var t=sys.load('/tags/');
$(t).find('#main a').each(function(){
tags.items.push($(this).text().replace(/\[\d+\]$/, ''));
});
return tags;
},
'tagHtml':function(){
var tags = sys.tags();
var ret = '<body><div><div class="content"><ul>';
for (var i in tags.items){
ret+='<li>'+tags.items[i]+'</li>';
}
ret+='</ul></div></div></body>';
return ret;
},
'list':function(path){
  path = path || '';
  if (path[0] != '/') {
    path = sys.realPath(path);
  }
  if (!path) {
    return;
  }
  var sp = (path == '/' ? [''] : path.split('/'));
  
  for (var i in sp) {
    var ret = {}
    if (i == 0) {
     if (!sys._d) {
        sys._d={};
        $('#archives li a').each(function(){
          sys._d[$(this).text().match(/^\d+/)[0]]=0;
        });
      }
      for (var j in sys._d) {
        ret[j] = 0
      }
      ret['links.html'] = sys.links().name;
      ret['catelogs.html'] = sys.catelogs().name;
      ret['tags.html'] = $('#tags h2').html();
    }
    if (i == 1) {
      if (!sp[1].match(/^\d{4}$/)) {
        return;
      }
      if (!sys._d[sp[1]]) {
        sys._d[sp[1]]={};
        var t=sys.load('/logs/'+sp[1]+'/');
        $(t).find('#postList>li').each(function(){
          var d=$(this).find('>h3>a').attr('href').match(/\/\d{4}\/(\d{1,2})\//)[1];
          sys._d[sp[1]][d]={};
          $(this).find('div.content a').each(function(){
            var f=sys.urlToName($(this).attr('href'));
            sys._d[sp[1]][d][f]=$(this).html();
          });
        });
      }
      for (var j in sys._d[sp[1]]) {
        ret[j] = 0
      }
    }
    if (i == 2) {
      if (!sp[2].match(/^\d{1,2}$/)) {
        return;
      }
      if (!sys._d[sp[1]][sp[2]]) {
        return;
      }
      ret = sys._d[sp[1]][sp[2]];
    }
    if (i > 2) {
      return;
    }
  }
  return ret; 
},
'realPath':function(path) {
  var sp = path.split('/');
  var a = (sys._cwd == '' ? [] : sys._cwd.split('/'));
  for (var i in sp) {
    if (sp[i] == '' || sp[i] == '.') {
      continue;
    }
    if (sp[i] == '..') {
      if (a.length==0) {
        return;
      }
      a = a.slice(0, -1);
      continue;
    }
    a.push(sp[i]);
  }
  return '/'+a.join('/');
}
}
var command={
  'ls':function(arg){
    path = arg || '';
    if (path[0] != '/') {
      path = sys.realPath(path);
    }
    var list = sys.list(path);
    if (!list) {
      sys.error('ls: '+arg+': No such file or directory');
      return;
    }
    for (var i in list) {
      if (list[i]) {
        sys.print(sys.file(i)+list[i]);
      } else {
        sys.print(sys.dir(i));
      }
    }
  },
  'cd':function(arg){
    if (!arg) {
      return;
    }
    var path = (arg[0]=='/' ? arg : sys.realPath(arg));
    var list = sys.list(path);
    if (!list) {
      sys.error('cd: '+arg+': No such file or directory');
      return;
    }
    sys._cwd = path.slice(1);
    return;
  },
  'new':function(arg){
    arg=arg||'';
    var m = arg.match(/^(?:-c\s+(\w+)|-t\s+(\S+))?\s*(\d+)?$/);
    if (!m) {
      return;
    }
    var c = m[1];var t=m[2];var p=parseInt(m[3])||1;
    if (!c && !t && p<=1){
      var i=$('#postList>li>h3>a');
    } else {
      var url = '/index_'+p+'.html';
      if (c) {
        url = '/'+c+'/'+url;
      } else if (t) {
        url = '/tag/'+encodeURIComponent(t)+'/';
      }
      var t=sys.load(url);
      i=$(t).find('#postList>li>h3>a')
    }
    i.each(function(k,v){
      var item=sys.file(sys.urlToName($(this).attr('href')))+$(this).html();
      sys.print(item);
    });
  },
  'newcmt':function(){
	$('#nComments li').each(function(){
	  var a=$(this).find('>a');
	  sys.print(a.html()+ ' @ '+ sys.urlToName(a.attr('href')));
	});
  },
  'cat':function(file){
    if (!file.match(/\.html$/)) {
      sys.error(file+': No such file');
      return;
    }
    var t=sys.load('/logs/'+file);
    if (!t) {
      sys.error(file+': No such file or directory');
      return;
    }
    var content = $(t).find('div.content').html();
    if (!content) {
      sys.error('cat: '+file+': Is a directory');
      return;
    } 
    sys.print($(t).find('div.content').html());
  },
  'less':function(file){
    sys.read(file);
  },
  'pwd':function(){
    sys.print('/'+sys._cwd);
  },
  'clear':function(){
    sys.clear();
  },
  'about':function(){
    sys.print('<a href="http://syre.blogbus.com" target="_blank">模板作者：</a><a href="http://www.xiezhenye.com" target="_blank">神仙</a>');
  },
  'help':function(arg){
    if (!arg) {
      sys.print('avaliable commands: ');
      sys.print('ls [DIR]');
      sys.print('cd DIR');
      sys.print('new [-c CATEGORY|-t TAG] [PAGE]');
      sys.print('less [FILE]');
      sys.print('cat [FILE]');
      sys.print('clear');
      sys.print('reboot');
      sys.print('about');
      sys.print('help');
    }
  },
  'reboot':function(){
    window.location.reload();
  }
};
sys.print('connection to server...');

