function successor(str) {  
        var alphabet = 'abcdefghijklmnopqrstuvwxyz',  
            length = alphabet.length,  
            result = str,  
            i = str.length;  
  
        while(i >= 0) {  
            var last = str.charAt(--i),  
                next = '',  
                carry = false;  
  
            if (isNaN(last)) {  
                index = alphabet.indexOf(last.toLowerCase());  
  
                if (index === -1) {  
                    next = last;  
                    carry = true;  
                }  
                else {  
                    var isUpperCase = last === last.toUpperCase();  
                    next = alphabet.charAt((index + 1) % length);  
                    if (isUpperCase) {  
                        next = next.toUpperCase();  
                    }  
  
                    carry = index + 1 >= length;  
                    if (carry && i === 0) {  
                        var added = isUpperCase ? 'A' : 'a';  
                        result = added + next + result.slice(1);  
                        break;  
                    }  
                }  
            }  
            else {  
                next = +last + 1;  
                if(next > 9) {  
                    next = 0;  
                    carry = true;  
                }  
  
                if (carry && i === 0) {  
                    result = '1' + next + result.slice(1);  
                    break;  
                }  
            }  
  
            result = result.slice(0, i) + next + result.slice(i + 1);  
            if (!carry) {  
                break;  
            }  
        }  
        return result;  
    }  
  
console.log(successor('abcd'));  
console.log(successor('3456')); 