var emailServers=['gmail.com', 'yandex.ru', 'mail.ru', 'rambler.ru', 'bk.ru', 'mgppu.ru', 'yahoo.com'];

function checkEmail(emailField){
	if(Ext.get('maybeOtherEmail')){
		Ext.get('maybeOtherEmail').remove();
	}
	var rEmail=checkEmailServer(emailField);
	if (rEmail=='') return;	
	var p=Ext.get(emailField).findParent('div', 2, true);
	p.insertHtml('beforeEnd',
			'<span id="maybeOtherEmail" class="x-form-invalid-msg">Возможно Вы имели ввиду: <a href="#" onclick="return setRightEmail(\''+rEmail+'\', \''+emailField+'\')">'+rEmail+'</a></span>');
}

function checkEmailServer(emailField){
	var email=Ext.getCmp(emailField).getValue();
	var address=email.split('@');
	var server=address[1].split('.');
	for(var i in emailServers){
		if (address[1]==emailServers[i]) return '';
	}
	var parts=new Array();
	for(var j in emailServers){
		if (typeof emailServers[j]!='string') continue;
		parts=emailServers[j].split('.');
		if (server[0]==parts[0] && server[1]!=parts[1]) return address[0]+'@'+emailServers[j];
	}
	var dist=0;
	for(var k in emailServers){
		if (typeof emailServers[k]!='string') continue;
		dist=LeveDist(address[1], emailServers[k]);
		if (dist>0 && dist<3){
			return address[0]+'@'+emailServers[k];
		}
	}
	return ''; 
}

function setRightEmail(email, emailField){
	Ext.getCmp(emailField).setValue(email);
	Ext.get('maybeOtherEmail').remove();
	return false;
}


Ext.apply(Ext.form.VTypes, {
	'alpha' : function(v){
    	return /^[a-zA-Z_ ]+$/.test(v);
	},
	'alphaText' : 'Это поле должно содержать только латинские буквы, пробел и символ подчеркивания "_"',
	'alphaMask' : /[a-z_ ]/i,

	'alphanum' : function(v){
		return /^[a-zA-Z0-9_ ]+$/.test(v);
	},
	'alphanumText' : 'Это поле должно содержать только латинские буквы, цифры, пробел и символ подчеркивания "_"',
	'alphanumMask' : /[a-z0-9_ ]/i ,
	
	'num':  function(v) {
        return /^[\d]+$/.test(v);
    },
    'numText': 'Это поле должно содержать только цифры',
    'numMask': /\d/i ,

	'phone':  function(v) {
        return /^[\d\-\(\)]+$/.test(v);
    },
    'phoneText': 'Это поле может содержать только цифры, круглые скобки и тире',
    'phoneMask': /[\d\-\(\) ]/i ,

	'invnumber':  function(v) {
        return /^\d+(\/\d+)?$/.test(v);
    },
    'invnumberText': 'Инвентарный номер может содержать только цифры и слэш',
    'invnumberMask': /[\d\/]/i ,

	'invnumberlike':  function(v) {
        return /^[\d%]+(\/[\d%]*)?$/.test(v);
    },
    'invnumberlikeText': 'Инвентарный номер может содержать только цифры и слэш',
    'invnumberlikeMask': /[\d\/%]/i, 
    
	'yearperiod':  function(v) {
        return /^[\d\-, ]+$/.test(v);
    },
    'yearperiodText': 'Это поле может содержать только цифры, тире, запятые и пробел',
    'yearperiodMask': /[\d\-, ]/i ,
    
    'rusalpha': function (v){
    	return /^[a-zA-ZА-Яа-яёЁ_\- ]+$/.test(v);
    },
    'rusalphaText': 'Это поле должно содержать только латинские буквы, русские буквы, тире, пробел и символ подчеркивания "_"',
	'rusalphaMask' : /[a-zа-яёЁ_\- ]/i ,
    
    'rusalphanum': function (v){
    	return /^[a-zA-ZА-Яа-я0-9ёЁ_\-. ]+$/.test(v);
    },
	'rusalphanumText': 'Это поле должно содержать только латинские буквы, русские буквы, цифры, тире, пробел и символ подчеркивания "_"',
	'rusalphanumMask' : /[a-zа-я0-9ёЁ_\-. ]/i
});

/**
 * Инициализация.
 */
Ext.onReady(function(){
	Ext.QuickTips.init();
	
	Ext.getBody().on('mouseup', function(){
		Ext.select('.btnRoundOk').removeClass('x-btn-click');
	});
	
	buttonPressedView();
	
	
});

/**
 * Функция динамически подгружает js файлы.
 * 
 * @param src Адрес файла
 */
function addScript(src){
     var newScript = document.createElement("script");
     newScript.type = "text/javascript";
     newScript.src =  src;
     var first = document.getElementsByTagName("head")[0].firstChild;
     document.getElementsByTagName("head")[0].insertBefore(newScript, first);
}

/**
 * Функция динамически подгружает css файлы.
 * 
 * @param src Адрес файла
 * @param newId Id узла
 */
function addCss(src, newId){
     var newScript = document.createElement("link");
     newScript.id=newId;
     newScript.rel='stylesheet';
     newScript.type = "text/css";
     newScript.href =  src;
     newScript.media='all';
     var first = document.getElementsByTagName("head")[0].firstChild;
     document.getElementsByTagName("head")[0].insertBefore(newScript, first);
}

/**
 * Наложение выбранного стиля.
 * 
 * @param id Идентификатор элемента link
 * @param style Адрес файла
 */
function setStyle(id, style){
	Ext.util.CSS.removeStyleSheet(id);
	if (style){
		addCss(style, id);
	}
}

/**
 * Создание видимости нажатой кнопки
 */
function buttonPressedView(){
	Ext.select('.btnRoundOk').un('mousedown', doPress);
	Ext.select('.btnRoundOk').on('mousedown', doPress);

}

/**
 * Собственно нажатие кнопки
 * @param e
 * @param el HTML Элемент

 */
function doPress(e,el){
	Ext.get(el).addClass('x-btn-click');
}

function min3(a, b, c) { // вспомогательная функция
	return Math.min(Math.min(a,b),c);
}
	 
function LeveDist(s, t) {
	var cuthalf=150;
	var buf=new Array((cuthalf * 2) - 1);
	var i, j, m, n, cost, flip, result;
	s = s.substr(0,cuthalf);
	t = t.substr(0,cuthalf);
	m = s.length;
	n = t.length;
	if (m == 0){
		result = n;
	}else if (n == 0){
		result = m;
	}else {
		flip = false;
		for (i = 0; i <= n; i++){
			buf[i] = i;
		}
		for (i = 1; i<=m; i++) {
			if (flip){
				buf[0] = i;
			}else{
				buf[cuthalf] = i;
			}
			for (j = 1; j<=n; j++) {
				if (s.charAt(i-1) == t.charAt(j-1)){
					cost = 0;
				}else{
					cost = 1;
				}
				if (flip){
					buf[j] = min3((buf[cuthalf + j] + 1),
							(buf[j - 1] + 1),
							(buf[cuthalf + j - 1] + cost));
				}else{
					buf[cuthalf + j] = min3((buf[j] + 1),
							(buf[cuthalf + j - 1] + 1),
							(buf[j - 1] + cost));
				}
			}
			flip = !flip;
		}
		if (flip){
			result = buf[cuthalf + n];
		}else{
			result = buf[n];
		}
	}
	return result;
}
