По первой задаче получилось немного громоздко, но работает вроде как надо:
String.prototype.index = function(sep) {
var l = this.length, sl = sep.length - 1, i = 0, j = 0, w = '';
while (i < l) {
if ((this.charAt(i) == sep.charAt(0) && this.charAt(i + sl) == sep.charAt(sl)) || j != 0){
if (j <= sl) {w += this.charAt(i + j); j++;}
else if (j >= sl) if (w == sep) return i; else {w = ''; j = 0; i++; continue;}} else i++;}
return -1;
}
var s1 = 'aababaO_o',
s2 = 'aababababaO_o';
l1 = 'aba', l2 = 'abac', l3 = 'aa', l4 = 'O_o', l5 = 'abaO', l6 = 'ababaO';
alert([
[s1.index(l1), s1.indexOf(l1)],
[s1.index(l2), s1.indexOf(l2)],
[s1.index(l3), s1.indexOf(l3)],
[s1.index(l4), s1.indexOf(l4)],
[s1.index(l5), s1.indexOf(l5)],
[s2.index(l6), s2.indexOf(l6)]
].join('\n'))