/*
 * jquery-counter plugin
 *
 * Copyright (c) 2009 Martin Conte Mac Donell <Reflejo@gmail.com>
 * Dual licensed under the MIT and GPL licenses.
 * http://docs.jquery.com/License
 */
jQuery.fn.countdown = function(userOptions)
{
  // Default options
  var options = {
    stepTime: 60,
    // startTime and format MUST follow the same format.
    // also you cannot specify a format unordered (e.g. hh:ss:mm is wrong)
    format: "dd:hh:mm:ss",
    startTime: "01:12:32:55",
    digitImages: 6,
    digitWidth: 16,
    digitHeight: 24,
    timerEnd: function(){},
    image: "images/digits.png"
  };
  var digits = [], interval;
  
  // Draw digits in given container
  var createDigits = function(where) 
  {
    var c = 0;
    // Iterate each startTime digit, if it is not a digit
    // we'll asume that it's a separator
    for (var i = 0; i < options.startTime.length; i++)
    {
		
	  // alert(options.startTime.length + " - " + options.startTime + " - " + options.startTime.substr(i, 1) + " - " + parseInt(options.startTime.substr(i, 1)));
		
      if (parseInt(options.startTime.substr(i, 1)) >= 0) 
      {		
		elem = $('<div id="cnt_' + i + '" class="cntDigit" />').css({
          height: options.digitHeight * options.digitImages * 10, 
          float: 'left', position: 'relative', background: 'url(\'' + options.image + '\')',
          width: options.digitWidth});
        digits.push(elem);

		// alert(digits.length);

        margin(c, -((parseInt(options.startTime.substr(i, 1)) * options.digitHeight * options.digitImages)));
        digits[c].__max = 9;
        // Add max digits, for example, first digit of minutes (mm) has 
        // a max of 5. Conditional max is used when the left digit has reach
        // the max. For example second "hours" digit has a conditional max of 4 
        // alert(options.format.substr(i, 1));
		switch (options.format.substr(i, 1)) {
          case 'h':
            digits[c].__max = (c % 2 == 0) ? 2: 9;
            if (c % 2 == 0)
              digits[c].__condmax = 4;
			break;
          case 'd': 
            digits[c].__max = 9;
            break;
          case 'm':
          case 's':
            digits[c].__max = (c % 2 == 0) ? 5: 9;
        }
        ++c;
      }
      else
	  {
        elem = $('<div class="separator"/>').css({float: 'left'}).text(options.startTime.substr(i, 1));
	  }
      where.append(elem);
    }
  };
  
  // Set or get element margin
  var margin = function(elem, val) 
  {
	if (val !== undefined)
		return digits[elem].css({'top': val + 'px'});
	  
	return parseInt(digits[elem].css('top').replace('px', ''));
  };

  // Makes the movement. This is done by "digitImages" steps.
  var moveStep = function(elem) 
  {
	// alert('e: ' + elem)
	// alert('e: ' + elem + ', id: ' + digits[elem].attr('id'));
	digits[elem]._digitInitial = -(digits[elem].__max * options.digitHeight * options.digitImages);
	return function _move() {
	  //alert(margin(elem) + ' + ' + options.digitHeight);
	  mtop = margin(elem) + options.digitHeight;
      if (mtop == options.digitHeight) {
		margin(elem, digits[elem]._digitInitial);
		if (elem > 0)
		{
			moveStep(elem - 1)();
		}
		else 
        {
		  clearInterval(interval);
          for (var i=0; i < digits.length; i++) margin(i, 0);
          options.timerEnd();
          return;
        }
        if ((elem > 0) && (digits[elem].__condmax !== undefined) && (digits[elem - 1]._digitInitial == margin(elem - 1)))
          margin(elem, -(digits[elem].__condmax * options.digitHeight * options.digitImages));
		return;
      }

	  margin(elem, mtop);
	  if (margin(elem) / options.digitHeight % options.digitImages != 0)
        setTimeout(_move, options.stepTime);
		//_move();
		
      if (mtop == 0) digits[elem].__ismax = true;
    }
  };

  $.extend(options, userOptions);
  this.css({height: options.digitHeight, overflow: 'hidden'});
  createDigits(this);
  interval = setInterval(moveStep(digits.length - 1), 1000);
};

