Thanks for the explanation of my code... as you noted, I was in a bit of a hurry. Now to further implement the usage of the named timers that you were nice enough to start (and I'm a bit surprised that you didn't do this), here's the code with the named timer also being used in the on ban event, to ensure that a double timer isn't set
Code:
on *:op:#:{
  if $opnick == $me {
    var %a = 1
    while %a <= $ibl($chan,0) {
      if $calc($ctime - $ibl($chan,%a).ctime) > 1209600 {
        .mode -b $chan $ibl($chan,%a)
    }
    else {
      $+(.timer,$chan,$ibl($chan,%a)) 1 $calc($v2 - $v1) .mode $safe($chan) -b $ibl($chan,%a)
    }
    inc %a
    }
  }
}
on *:ban:#:{
  $+(.timer,$chan,$banmask) 1 1209600 .mode -b $safe($chan) $banmask
}
alias safe return $!decode( $encode($1,m) ,m)