カウントダウンタイマーなんだけど、こんな書き方をしてごめんなさい!

OKWaveの回答

http://oshiete1.goo.ne.jp/qa5834111.html

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title></title>

<body>
<form action="#">
<p>
<input type="text" value="" id="fuga">
<input type="button" value="+10m" onclick="addM(10)">
</p>
</form>

<script type="text/Javascript">
var a;
function hoge(e,y,m,d,j,f,b,ms){
a=(new Date(y,m-1,d,j||0,f||0,b||0,ms||0))-0;
(function c(){
var b=(a-(new Date))/1000|0;
if(b>0){
e.value = fuga(b,4).replace(/(\d+)(\d{2})(\d{2})(\d{2})$/,'$1日$2時$3分$4秒');
setTimeout(c,1000);
}else e.value = 'end';
})();
}
function fuga(n,t){
if(!t)return '';var w=[0,10000,24,60,60][t--],r=n/w|0,s=n%w;
return fuga(r,t)+(s<10?'0'+s:s);
}
function addM(m){a+=m*60000}

hoge( document.getElementById('fuga'), 2010, 4, 20, 0, 0, 0, 0);
</script>

こんな回答をするのなら、アップしないほうが良い。あ〜反省。
昔の俺だったら、食いついてるだろうなぁ〜
再帰って、arguments.calleeで呼ばなきゃだめか?
しかも、ショートコーディングと、回答者にわかりやすくと思って、グローバル変数つかおう!
と思って書いてたら、だめだ!こりゃ〜なコードになった!
何が必要で・・・何が不要で・・・
遊びで始めたプログラミングだしなぁ〜
公共の場に、ごみを撒き散らすのも、公害か・・・。
いっぺん、心の整理でもしてみよう!

追記
なんと御礼があった。

とても参考になりました。
本当にありがとうございました。

絶対に嘘だな!あれがあの問題での参考になるはずなどない。
再帰の中で、単位もつければ、正規表現を使わなくても済んだのに!

  • その2です。サポートで確認中だとかで、表示されてない!なんでだろう!

もろもろの指摘を受け、再度、OKWaveに投稿したサンプル

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>CountDown</title>

<body>
<form action="#">
<p>
<input type="text" value="" id="fuga">
<input type="button" value="+10m" onclick="extensionTime(10)">
</p>
</form>

<script type="text/Javascript"><!--

var time;
var base = [ 100000, 24, 60, 60, 1000 ];
var unit = [ '日', '時', '分', '秒', '' ];
var e = document.getElementById( 'fuga' );
var d = ( new Date( 2010, 4 - 1, 20, 0, 0, 0, 0 ) ).getTime( );

//____

function convert( serial ) {
  return (function ( n, c ) {
    var u = unit[ c ];
    var b = base[ c ] || 1;
    var r = Math.floor( n / b );
    var s = '';

    if( !!u )
      s = ('000000000' + ( n - r * b )).slice( -( b + '').length ) + u;
    
    if( 0 < c )
      return arguments.callee( r, c - 1 ) + s;
    else
      return n + u;
    
  })( serial, 4 );
}

//____

function disp( ) {
  time = d - ( new Date ).getTime( );
  if( 0 < time ) {
    e.value = convert( time );
    return true;
  } else {
    return false;
  }
}


function extensionTime ( minute /* Minute */ ) {
  if( 'number' === typeof minute ) {
    d += minute * 60 * 1000;
    disp( );
  }
}


function demo ( ) {
  if( disp( ) )
    setTimeout( arguments.callee, 1000 );
  else
    e.value = '終了';
}

//__

demo();

//-->
</script>

2箇所同時作動版

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN">
<title>DownCounter</title>

<body>

<form action="#">
<p>
<input type="text" value="" id="Countdown1" style="width: 15em;">
<input type="button" value="+10m" onclick="cnt1.extend(10)">
<input type="button" value="Start" onclick="cnt1.start()">
<input type="button" value="Stop" onclick="cnt1.stop()">
</p>
<p>
<input type="text" value="" id="Countdown2" style="width: 15em;">
<input type="button" value="+5m" onclick="cnt2.extend(5)">
<input type="button" value="Start" onclick="cnt2.start()">
<input type="button" value="Stop" onclick="cnt2.stop()">
</p>
</form>

<script type="text/javascript">
//@cc_on

var DownCounter = function ( ) {
 this.init.apply( this, arguments );
};


DownCounter.prototype.init = function ( target, date ) {
 this.e = target;
 this.d = date.getTime( );
 this.i = null;
 this.start();
};


DownCounter.prototype.start = function ( ) {
 var cbFunc = (function ( that ) {
  return function ( ) {
   that.disp( ) || that.stop( );
  };
 })( this );

 this.i && this.stop( );
 this.disp( );
 return this.i = setInterval( cbFunc, 1000 );
};


DownCounter.prototype.stop = function ( ) {
 if( this.i ) {
  clearInterval( this.i );
  this.i = null;
  return true;
 }
 
 return false;
};


DownCounter.prototype.extend = function ( time ) {
 this.d += time * 60 * 1000;
 return this.disp();
};


DownCounter.prototype.disp = (function ( convert ) {
 return function ( ) {
  var time = this.d - ( new Date ).getTime( );

  if( 0 < time ) {
   this.e.value = convert( time );
   return true;
  }
  
  this.e.value = '終了';
  
  return false;
 };
})((function ( ) {
   var base = [ 100000, 24, 60, 60, 1000 ];
   var unit = [ '日', '時', '分', '秒', '' ];
  
   return function ( serial ) {
    return (function ( n, c ) {
     var u = unit[ c ];
     var b = base[ c ] || 1;
     var r = Math.floor( n / b );
     var s = '';

     if( !!u )
      s = ('000000000' + ( n - r * b )).slice( -( b + '').length ) + u;
    
     if( 0 < c )
      return arguments.callee( r, c - 1 ) + s;
     else
      return n + u;
     
    })( serial, 4 );
   };
  })() );

//_____

DownCounter.create = function ( targetId, dateObject ) {
 var target;
 if( !(target = document.getElementById( targetId ) ) ||
   'object' !== typeof dateObject ) return null;
 
 return new this( target, dateObject );
};

var cnt1 = DownCounter.create( 'Countdown1', new Date( 2010, 4, 1) );
var cnt2 = DownCounter.create( 'Countdown2', new Date( 2010, 5, 1) );

</script>