(function($) {
    
$.fn.odometer = function(settings) {

    settings = $.extend({}, $.fn.odometer.defaults, settings);    
    
    return this.each(function(){
    	
    	var $this = $(this); // store the actual counter
    	var currentFloat = settings.counterStart;
    	var currentString = '';
    	var timer;
    	var incrementTime = settings.incrementTime; // default second
    	var incrementAmount = settings.incrementAmount; // default isset
    	
    	setNumbers();
    	setAnimate();
    	
    	function setNumbers() {
    		currentString = _prepareNumbers(currentFloat);
    		
    		_setContainerWidth(currentString.length);
    		
	    	// loop through numbers
	    	for (var i = 0; i < currentString.length; i++) {
	            var number = currentString.charAt(i);
	            $this.append(_getNumberImage(number, i));
	        }
	    }
	    
	    function _setContainerWidth(length) {
	    	var width = settings.widthNumber * length;
	    	$this.css("width", width+"px");
	    }
	    
	    function setAnimate() {
			$this.animate({
				dummy: 1
			}, incrementTime, function() {
				updateNumbers();
			});

	    }
	    
	    function updateNumbers () {
	    	oldString = currentString;
	    	currentFloat = parseFloat(currentFloat) + incrementAmount;
	    	currentString = _prepareNumbers(_round(currentFloat));
	        
	    	_setContainerWidth(currentString.length);
	    	
	        // loop through numbers and update
	    	for (var i = 0; i < currentString.length; i++) {
	            var number = currentString.charAt(i);
	            var oldnumber = oldString.charAt(i);
	            if (number != oldnumber) {
	            	if (oldnumber == '') {
	            		$this.append(_getNumberImage(number, i));
	            	}
	            	else{
	            		_updatePosition(number, oldnumber, i, incrementTime);
	            	}
	            }
	        }
	        
	        $this.animate({
				dummy: 1
			}, incrementTime, function() {
				updateNumbers();
			});
	    }
	    
	    function _updatePosition (number, oldnumber, i, incrementTime) {
	    	var position = _getNumberPosition(number);
	    	if (settings.uneAnimation == true) {
	    		$this.children('div#number_'+i).children('img').animate({
					marginTop: '-'+position+'px'
				}, incrementTime, function() {});
	    	}
	    	else{
	    		$this.children('div#number_'+i).children('img').css('margin-top', '-'+position+'px');
	    	}
	    }
	    
	    function _getNumberImage(number, i) {
	    	return '<div class="odoNumber" id="number_'+i+'" style="width:'+settings.widthNumber+'px; height:'+settings.heightNumber+'px"><img src="'+settings.numbersImage+'" border="0" alt="'+number+'" style="margin-top:-'+_getNumberPosition(number)+'px" /></div>';
	    }
	    
	    function _getNumberPosition(number) {
	    	if (number == '.') {
	    		number = 13;
	    	}else if(number == ','){
	    		number = 12;
	    	}else if(number == 'E') {
	    		number = 14;
	    	}
	    	return settings.heightNumber + (settings.heightNumber * number);
	    }
	    
	    function _prepareNumbers(num) {
	    	num = num.toString();
	    	var n = num.split(".");
	    	if (n[1] == undefined) {
	    		n[1] = '00';
	    	}
	    	if (settings.useDecimals == true) {
	    		n = _addThousands(n[0])+','+n[1];
	    	}
	    	else{
	    		n = _addThousands(n[0]);
	    	}
	    	
	    	if (settings.useEuro == true) {
	        	n = "E"+n;
	        }
	        return n;
	    }
	    
	    function _round(n, d) {
			n = n - 0;
			if (d == null) d = 2;
			var f = Math.pow(10, d);
			n += Math.pow(10, - (d + 1));
			n = Math.round(n * f) / f;
			n += Math.pow(10, - (d + 1));
			n += '';
			return d == 0 ? n.substring(0, n.indexOf('.')) :  n.substring(0, n.indexOf('.') + d + 1);
		}
		
		function _addThousands(sValue) {
			var sRegExp = new RegExp('(-?[0-9]+)([0-9]{3})');
			
			while(sRegExp.test(sValue)) {
			sValue = sValue.replace(sRegExp, '$1.$2');
			}
			return sValue;
		} 
    	
    	
    });
    
};

$.fn.odometer.defaults = {
    counterStart: '00000',
    counterEnd: false,
    incrementTime: 1000, // every second
    incrementAmount: 1, // default 1
    numbersImage: webroot+'img/odometer/jodometer-numbers.png',
    heightNumber: 16,
    widthNumber: 10,
    useEuro: true,
    useDecimals: true,
    uneAnimation: false
};

})(jQuery);

