luhn functions for js and php
function checkluhn(cNum) {
  var arr = [0, 2, 4, 6, 8, 1, 3, 5, 7, 9],
      len = cNum.length,
      bit = 1,
      sum = 0,
      val;
  while (len) {
    val = parseInt(cNum.charAt(--len), 10);
    sum += (bit ^= 1) ? arr[val] : val;
  }
  return sum && sum % 10 === 0;
}luhnTasks = {};
luhnTasks.calculate = function(originalStr){
	var sum=0, delta=[0,1,2,3,4,-4,-3,-2,-1,0], 
	deltaIndex, deltaValue;
	for (var i=0; i<originalStr.length; i++ ){
		sum += parseInt(originalStr.substring(i,i+1));
	}
	for (var i=originalStr.length-1; i>=0; i-=2){		
		sum += delta[parseInt(originalStr.substring(i,i+1))];
	}	
	if (10-(sum%10)===10){ return 0; }
	return 10-(sum%10);
};
luhnTasks.validate = function(luhnStr){
	var luhnStrDigit, luhnStrLess;
	luhnStrDigit = parseInt(luhnStr.substring(luhnStr.length-1,luhnStr.length));
	luhnStrLess = luhnStr.substring(0,luhnStr.length-1);
	if (this.calculate(luhnStrLess)===parseInt(luhnStrDigit)){ return true; }	
	return false;
};function Luhn($number, $iterations = 1)
    {
        while ($iterations-- >= 1)
        {
            $stack = 0;
            $number = str_split(strrev($number), 1);
            foreach ($number as $key => $value)
            {
                if ($key % 2 == 0)
                {
                    $value = array_sum(str_split($value * 2, 1));
                }
                $stack += $value;
            }
            $stack %= 10;
            if ($stack != 0)
            {
                $stack -= 10;
            }
            $number = implode('', array_reverse($number)) . abs($stack);
        }
        return $number;
    }
    function Luhn_Verify($number, $iterations = 1)
    {
        $result = substr($number, 0, - $iterations);
        if ($this->Luhn($result, $iterations) == $number)
        {
            return $result;
        }
        return false;
    }