var TimeToReadableTable = {
 currts: null,
 scales: [
  60, // just now
  300, // a few minutes ago
  600, // about ten minutes ago
  2400, // about a half an hour ago
  4200, // about an hour ago
  7800, // about two hours ago
  11400, // about three hours ago
  15000, // about four hours ago
  18600, // about five hours ago
  22200, // about six hours ago
  25800, // about seven hours ago
  29400, // about eight hours ago
  33000, // about nine hours ago
  36600, // about ten hours ago
  40200, // about eleven hours ago
  43800 // about twelve hours ago
 ],
 dicts: {
 'en': {
  'scales': [
   'just about now',
   'a few minutes ago',
   'about ten minutes ago',
   'about half an hour ago',
   'about an hour ago',
   'about two hours ago',
   'about three hours ago',
   'about four hours ago',
   'about five hours ago',
   'about six hours ago',
   'about seven hours ago',
   'about eight hours ago',
   'about nine hours ago',
   'about ten hours ago',
   'about eleven hours ago',
   'about twelve hours ago'
   ],
  'fdotw': 0,
  'weekdays': [
   'Sunday',
   'Monday',
   'Tuesday',
   'Wednesday',
   'Thursday',
   'Friday',
   'Saturday'
   ],
  'months': [
   'January',
   'February',
   'March',
   'April',
   'May',
   'June',
   'July',
   'August',
   'September',
   'October',
   'November',
   'December'
   ],
  'last': 'last',
  'formatw': '$L $W $T',
  'formatmd': '$D $M, $T',
  'formatfl': '$D, $T',
  'today': 'today at $T',
  'yesterday': 'yesterday at $T'
  },
 'hu': {
  'scales': [
   'az elmúlt percben',
   'pár perccel ezelőtt',
   'úgy tíz perce',
   'úgy egy félórája',
   'úgy egy órával ezelőtt',
   'úgy két órával ezelőtt',
   'úgy három órával ezelőtt',
   'úgy négy órával ezelőtt',
   'úgy öt órával ezelőtt',
   'úgy hat órával ezelőtt',
   'úgy hét órával ezelőtt',
   'úgy nyolc órával ezelőtt',
   'úgy kilenc órával ezelőtt',
   'úgy tíz órával ezelőtt',
   'úgy tizenegy órával ezelőtt',
   'úgy tizenkét órával ezelőtt'
   ],
  'fdotw': 1,
  'weekdays': [
   'vasárnap',
   'hétfő',
   'kedd',
   'szerda',
   'csütörtök',
   'péntek',
   'szombat'
   ],
  'months': [
   'január',
   'február',
   'március',
   'április',
   'május',
   'június',
   'július',
   'augusztus',
   'szeptember',
   'október',
   'november',
   'december'
   ],
  'last': 'múlt',
  'formatw': '$L $W $T',
  'formatmd': '$M $D., $T',
  'formatfl': '$D, $T',
  'today': 'ma $T',
  'yesterday': 'tegnap $T'
  }
 }
};

var TimeToReadable = {
 defaultLang: 'hu',
 increaser: null,
 convert: function(ts,lang) {
  if ( lang == '' ) lang = TimeToReadable.defaultLang;
  var its = parseInt(ts);
  var tob;
  if ( TimeToReadableTable.currts == null ) {
   tob = new Date;
   TimeToReadableTable.currts = parseInt(tob.getTime()/1000);
  }
  var cts = parseInt(TimeToReadableTable.currts);
  var dts = cts-its;
  tob = new Date;
  tob.setTime(its*1000);
  if ( !TimeToReadableTable.dicts[lang] ) return(tob.toLocaleString());
  var dob = TimeToReadableTable.dicts[lang];
  var ctob = new Date;
  ctob.setTime(cts*1000);
  daystart = cts-((parseInt(ctob.getHours())*3600)+(parseInt(ctob.getMinutes())*60)+parseInt(ctob.getSeconds())+1);
  ydaystart = daystart-86400;
  var timepart = tob.toLocaleTimeString().substr(0,5);
  if ( timepart.substr(4,1) == ':' ) timepart = timepart.substr(0,4);
  var daypart = dob.weekdays[tob.getDay()];
  var monthpart = dob.months[tob.getMonth()];
  var lastpart = dob.last;
  var i;
  var fi = -1;
  for(i=0;i<TimeToReadableTable.scales.length;i++) {
   if ( ( fi == -1 ) && ( dts <= TimeToReadableTable.scales[i] ) ) {
    fi = i;
   }
  }
  if ( fi > -1 ) return(dob.scales[fi]);
  if ( its >= daystart ) {
   var das = dob.today;
   das = das.replace('$M',monthpart);
   das = das.replace('$T',timepart);
   das = das.replace('$D',tob.getDate().toString());
   return(das);
  }
  else if ( its >= ydaystart ) {
   var das = dob.yesterday;
   das = das.replace('$M',monthpart);
   das = das.replace('$T',timepart);
   das = das.replace('$D',tob.getDate().toString());
   return(das);
  }
  else if ( dts <= 604800 ) {
   var das = dob.formatw;
   das = das.replace('$W',daypart);
   das = das.replace('$M',monthpart);
   das = das.replace('$T',timepart);
   das = das.replace('$D',tob.getDate().toString());
   var lastweek = false;
   if ( dob.fdotw == 0 )
    if ( parseInt(tob.getDay()) > parseInt(ctob.getDay()) ) lastweek = true;
   if ( dob.fdotw == 1 ) {
    var thatday = parseInt(tob.getDay());
    if ( thatday == 0 ) thatday = 7;
    var thisday = parseInt(ctob.getDay());
    if ( thisday == 0 ) thisday = 7;
    if ( thatday > thisday ) lastweek = true;
   }
   if ( lastweek == true ) 
    das = das.replace('$L',lastpart);
   else
    das = das.replace('$L','');
   return(das);
  }
  else if ( ctob.getFullYear() == tob.getFullYear() ) {
   var das = dob.formatmd;
   das = das.replace('$M',monthpart);
   das = das.replace('$T',timepart);
   das = das.replace('$D',tob.getDate().toString());
   return(das);
  }
  else {
   var das = dob.formatfl;
   das = das.replace('$D',tob.toLocaleDateString());
   das = das.replace('$T',timepart);
   return(das);
  }
 },
 convertXL: function(elem) {
  return(TimeToReadable.convert(elem.innerHTML,''));
 },
 increaseEpoch: function() {
  ++TimeToReadableTable.currts;
 },
 start: function(cep,lang) {
  if ( ( lang != '' ) && ( TimeToReadableTable.dicts[lang] ) ) {
   TimeToReadable.defaultLang = lang;
  }
  if ( cep == 0 ) {
   var tob = new Date;
   TimeToReadableTable.currts = parseInt(tob.getTime()/1000);
  } else {
   TimeToReadableTable.currts = parseInt(cep);
  }
  if ( TimeToReadable.increaser == null ) {
   TimeToReadable.increaser = setInterval(TimeToReadable.increaseEpoch,1000);
  }
  if ( Translatables.registerTranslatorFunction ) {
   Translatables.registerTranslatorFunction('timetohuman',TimeToReadable.convertXL);
  }
 },
 stop: function() {
  if ( TimeToReadable.increaser != null ) {
   clearInterval(TimeToReadable.increaser);
  }
 }
};
