/**
 * jQuery.related_fields - Plugin for related fields
 * Written by Anton Yevzhakov (anber AT anber DOT ru)
 * Licensed under the WTFPL (http://sam.zoy.org/wtfpl/).
 * Date: 2010/05/06
 *
 * @author Anton Yevzhakov
 * @version 0.1
 *
 **/
/**
 * TODO:
 *      • позиция курсора при переключении фокуса
 *      • стрелки в WebKit
 *      • проверить в IE и Opera
 **/
if(!Array.indexOf){
    Array.prototype.indexOf = function(obj){
        for(var i=0; i<this.length; i++){
            if(this[i]==obj){
                return i;
            }
        }
        return -1;
    }
}
new function($) {
	$.fn.related_fields = function(settings) {
		var wrapper = $(this);
		var settings = settings || {};
		var allowed = settings.allowed || [48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 96, 97, 98, 99, 100, 101, 102, 103, 104, 105];
		var services = settings.services || [8, 9, 16, 17, 18, 37, 38, 39, 40, 46];
		
		var getSelectionStart = function(o) {
			if (o.createTextRange) {
				var r = document.selection.createRange().duplicate();
				r.moveEnd('character', o.value.length);
				if (r.text == '') return o.value.length;
				return o.value.lastIndexOf(r.text);
			} else return o.selectionStart;
		}
		
		var getSelectionEnd = function(o) {
			if (o.createTextRange) {
				var r = document.selection.createRange().duplicate();
				r.moveStart('character', -o.value.length);
				return r.text.length;
			} else return o.selectionEnd;
		}
		
		$('input:first-child', wrapper).each(function(i, el) {
			var wrapper = $(el).parent();
			// Нажали и забыли отпустить
			$('input', $(wrapper)).keypress(function(event) {
				var kc = event.keyCode;
				var len = $(this).val().length;
				var max_len = $(this).attr('maxlength');
				var ss = getSelectionStart(this);
				var se = getSelectionEnd(this);
				var is_s = ss != se;
				
				// Backspace
				if (kc == 8 && ss == 0 && !is_s) $(this).prev('.phone-field').focus();
				// Del
				if (kc == 46 && ss == len && !is_s) $(this).next('.phone-field').focus();
				// Символ
				if (kc == 0 && max_len == ss && !is_s) $(this).next('.phone-field').focus();
			});
			// Нажали
			$('input', $(wrapper)).keydown(function(event) {
				var kc = event.keyCode;
				var len = $(this).val().length;
				var max_len = $(this).attr('maxlength');
				var ss = getSelectionStart(this);
				var se = getSelectionEnd(this);
				var is_s = ss != se;
				
				// Стрелка влево
				if (kc == 37 && ss == 0) $(this).prev('.phone-field').focus();
				// Стрелка вправо
				if (kc == 39 && ss == len) $(this).next('.phone-field').focus();
				// Backspace
				if (kc == 8 && ss == 0 && !is_s) $(this).prev('.phone-field').focus();
				// Del
				if (kc == 46 && ss == len && !is_s) $(this).next('.phone-field').focus();
				// Разрешённые символы
				if (allowed.indexOf(kc) != -1 && max_len == ss && !is_s) $(this).next('.phone-field').select();
				// Глушим неразрешённые символы
				if (allowed.indexOf(kc) == -1 && services.indexOf(kc) == -1) return false;
			});
			// Отпустили
			$('input', $(wrapper)).keyup(function(event) {
				var kc = event.keyCode;
				var len = $(this).val().length;
				var max_len = $(this).attr('maxlength');
				var ss = getSelectionStart(this);
				var se = getSelectionEnd(this);
				var is_s = ss != se;
				
				// Разрешённые символы
				if (allowed.indexOf(kc) != -1 && max_len == ss && !is_s) $(this).next('.phone-field').select();
			});
		})
	}
}(jQuery);

$(function() {
	$('.phone-wrapper').related_fields();
})
