function validate_form(form) {
	var element;
	var i;
	var func = false;
	var fail_func = false;
	if (arguments.length > 1) {
		func = arguments[1]; 
	}
	if (arguments.length > 2) {
		fail_func = arguments[2]; 
	}
	for (i = 0; i < form.elements.length, element = form.elements[i]; i++) {
		if (element.offsetWidth == 0) {
			continue;
		}
		Ext.get(element).removeClass('notification');
		normalTextInTh(element);
	}
	if (document.getElementById('loading-mask')) {
        $('#loading-mask').show();
        $('#loading-mask').height($('BODY').height());
        $('.ext-el-mask-msg').show();
        $('.ext-el-mask-msg').vCenter();
        if (Ext.isIE) {
        	$('form select').hide();
        }
//        $('.ext-el-mask-msg')[0].style.top = form.offsetTop + Math.round(form.offsetHeight / 2) + 'px';
        
	} else {
		form.disabled = true; 
	}
		//for http form validation
	if(document.location.href.substr(0, 7) == 'http://' && CONST.BASE_URL.substr(0, 8) == 'https://'){
		var base_url = 'http://' + CONST.BASE_URL.substring(8);
	}else{
		var base_url = CONST.BASE_URL;
	}
	var form_enctype = form.enctype;
	form.enctype = 'application/x-www-form-urlencoded';
	var conn = new Ext.data.Connection();
	conn.request({
		url: base_url + 'validate/cmd/default/x_form/' + form.attributes.name.nodeValue,
		form: form,
		func: func,
		failFunc: fail_func,
		isUpload: false,
		callback: on_validate_result
	});
	form.enctype = form_enctype;
	return false;
}

function on_validate_result(options, success, response) {
	var result = true;
	response = Ext.util.JSON.decode(response.responseText);
        $('form select').show();
	if (response && response.value) {
		if (response.value !== true) {
			var messages = [];
			var i;
			var f;
            var focused = false;
			for (i = 0; i < response.value.length; i++) {
				if (messages.indexOf(response.value[i].message) < 0) {
					messages.push(response.value[i].message);
                    }
				f = false;
				if (response.value[i].field == 'phone' && !options.form.elements[response.value[i].field]) {
					f = options.form.elements['phone[number]'];
					Ext.get(f).addClass('notification');
					orangeTextInTh(f.parentNode.parentNode.parentNode);
				} else if (response.value[i].field == 'price') {
					orangeTextInTh(options.form.elements[response.value[i].field]);
				} else {
					f = options.form.elements[response.value[i].field];
					Ext.get(f).addClass('notification'); //TODO
					orangeTextInTh(f);
				}
				if (f) {
                    if (!focused) {
                        if (navigator.appName != "Microsoft Internet Explorer") {
                            Ext.get(f).focus();
                        }
                        focused = true;
                    }
					if (navigator.appName == "Microsoft Internet Explorer" || f.addEventListener("focus" , setNormalColor, false)){ // set event (for normal browsers)	
						f.attachEvent("onfocus" , setNormalColor) // set event (for IE)
					}
					if (navigator.appName == "Microsoft Internet Explorer" || f.addEventListener("keydown" , setNormalColor, false)){ // set event (for normal browsers)
						f.attachEvent("onkeydown" , setNormalColor) // set event (for IE)
					}
				}
			}
			if (messages.length) {
				showError(messages.join('</li><li>'));
				window.scrollTo(0, 0);
                //document.getElementById('errorbox').scrollIntoView();
			}
			if (options.failFunc) {
				options.failFunc(options.form);
			}
		} else {
			options.form.disabled = false; 
			if (options.func) {
				if (document.getElementById('loading-mask')) {
			        $('#loading-mask').hide();
			        $('.ext-el-mask-msg').hide();
				}
				options.func(options.form);
			} else { 
				options.form.submit();
			}
			return;
		}
	} 
	if (document.getElementById('loading-mask')) {
        $('#loading-mask').hide();
        $('.ext-el-mask-msg').hide();
	} else {
		options.form.disabled = false; 
	}
}

function showElementNotice(el, message) {
	Ext.get(el).addClass('notification');
	showError(message);
	el.focus();
}

function checkForm(form) {
	var i;
	var element;
	var temp = false;
	if (form.direction && form.direction.value != 'next') {
		return true;
	}
	var errors = '';
	var error_elements = [];
	
	for (i = 0; i < form.elements.length, element = form.elements[i]; i++) {
		if((element.name == 'contact[first_name]' || element.name == 'contact[last_name]') && element.value.length){
			temp = true;
		}
	}
	for (i = 0; i < form.elements.length, element = form.elements[i]; i++) {
		if (element.offsetWidth == 0) {
			continue;
		}
		if((element.name == 'contact[first_name]' || element.name == 'contact[last_name]') && temp){
			continue;
		}
		Ext.get(element).removeClass('notification');
		normalTextInTh(element);
		var func;
		var message;
		if (message = element.getAttribute("mandatory")) {
			if (element.value == "" || 
				element.value == "  /  /    " || 
				element.value == "(   )    -    " || 
				element.value == "   -  -    " || 
				element.value == "//" || 
				element.value == "() -" || 
				element.value == "--") {
				errors += message + "<br/>";
				error_elements.push(element);
				if(element.name == 'contact[first_name]' || element.name == 'contact[last_name]'){
					temp = true;
				}
			}
		}
		if(element.name == 'contact[first_name])'){}
		if ((func = element.getAttribute("function")) && (message = element.getAttribute("message"))) {
			if (!checkElement(func, element)) {
				errors += message + "<br/>";
				error_elements.push(element); 
			}
		}
	}
	if (errors != '') {
		showError(errors);
	}
	if (error_elements.length > 0) {
		for (i = 0; i < error_elements.length; i++) {
			Ext.get(error_elements[i]).addClass('notification');
			orangeTextInTh(error_elements[i]);
		}
		error_elements[0].focus();
		return false;
	}
	return true;
}

function checkElement(func, element) {
	if (element.value == '' || 
		element.value == "  /  /    " || 
		element.value == "(   )    -    " || 
		element.value == "   -  -    " || 
		element.value == "//" || 
		element.value == "() -" || 
		element.value == "--") {
		return true;
	}
	switch (func) {
		case 'checkReg':
			return regExpMatch(element.value, element.getAttribute('regexp'));
		break;
		case 'checkSSN':
			return regExpMatch(element.value, '^\\d{3}-?\\d{2}-?\\d{4}$');
		break;
		case 'checkFloat':
			return regExpMatch(element.value, '[0-9\.,]+');
		break;
		case 'checkLogin':
			return (element.value.length >= 4) && regExpMatch(element.value, '^[_a-zA-Z0-9-]+$');
		break;
		case 'checkPassword':
			return regExpMatch(element.value, '^[_a-zA-Z0-9-]+$') && (element.value.length >= 6);
		break;
		case 'checkPhone':
			return regExpMatch(element.value, '^[1-9]\\d*$');
		break;
		case 'checkPhones':
			return regExpMatch(element.value, '^(\\+?[\\d\\-\\(\\) ]*\\d+\s?,?\s?)*$');
		break;
		case 'checkState':
			var states = ['AK','AL','AR','AZ','CA','CO','CT','DC','DE','FL','GA','HI','IA','ID','IL','IN','KS','KY','LA','MA','MD','ME','MI','MN','MO','MS','MT','NC','ND','NE','NH','NJ','NM','NV','NY','OH','OK','OR','PA','RI','SC','SD','TN','TX','UT','VA','VT','WA','WI','WV','WY'];
			var found = false;
			for (var i = 0; i < states.length; i++) {
				if (states[i] == element.value) {
					found = true;
					break;
				}
			}
			return found;
		break;
		case 'checkEmail':
			return regExpMatch(element.value, '^[_a-zA-Z0-9-\+]+(\\.[_a-zA-Z0-9-]+)*@[a-zA-Z0-9-]+(\\.[a-zA-Z0-9-]+)*(\\.[a-zA-Z]{2,4})$');
		break;
		
		case 'checkEmailsCount':
			var emails = element.value.split(",");
			var i;
			if (emails.length > 5) {
				return false;
			}
			for (i = 0; i < emails.length; i++) {
				if(emails[i] != "") {
					emails[i] = emails[i].replace(/^\s+/, '');
					emails[i] = emails[i].replace(/\s+$/, '');
					if(!regExpMatch(emails[i], '^[_a-zA-Z0-9-\*]+(\\.[_a-zA-Z0-9-\*]+)*@[a-zA-Z0-9-\*]+(\\.[a-zA-Z0-9-\*]+)*(\\.[a-zA-Z]{2,4})$')){
						return false;
					}
				}
			}	
			return true;
			break;
		
		case 'checkDate':
			var da = element.value.split('.');			
			var dt = new Date(da[2], da[0] - 1, da[1]);
			if (dt) {
				return true;
			} else {
				return false;
			};
		break;
		case 'checkProcent':
			var val = parseInt(element.value, 10);
			if (val >=0 && val<=100){
				return true;
			}
			return false;
		break;
		case "checkIP":		
			$mas = element.value.split('.');
			if ($mas.length != 4){
				return false;
			}
			for(i=0; i<$mas.length; i++){
				digit = Number($mas[i]);
				if (isNaN(digit)){
					return false;
				}
				if (digit < 0 || digit >255){
					return false;
				}
			}
			
		break;
		default:
		    if (window[func]) {
		       return window[func]();
		    }
		    alert('SYSTEM ERROR: function "'+ func+'" does not exists');
		    return false;
	}
	return true;
}

var lost_focus_element = false;

function onExit(event) {
	if (event.type == 'blur' && is_ie) {
		return true;
	}
	var element = getSrcElement(event);
	var func = element.getAttribute("function")
	var message = element.getAttribute("message");
	if (func && message) {
		if (!checkElement(func, element)) {
			if (is_ie) {
				alert(message);
			} else {
				lost_focus_element = element;
			}
			return false;
		}
	};
}

function onEnter(event) {
	if (is_ie) {
		return true;
	}
	if (lost_focus_element && lost_focus_element != getSrcElement(event)) {
		var message = lost_focus_element.getAttribute('message');
		if (message) {
			alert(message);
			lost_focus_element.focus();
		}
		lost_focus_element = false;
	}
}

function regExpMatch(s, re) {
	re = new RegExp(re);
	if ((s != '') && re) {
		var m = s.match(re);
		return m != null;
	}
	return true;
}

function togglePart(id, visible) {
	var element = document.getElementById(id);
	if (element) {
		if (visible) {
			element.style.display = 'block';
		} else {
			element.style.display = 'none';
		}
	}
}

function checkPasswords(form, name1, name2) {
	return true;
	if (form.elements[name1].value == ''){
		window.alert('Password doesn\'t enter');
		form.elements[name1].focus();
		return false;
	}
	if (form.elements[name2].value == ''){
		window.alert('Passwords doesn\'t enter');
		form.elements[name2].focus();
		return false;
	}
	if (form.elements[name1].value != form.elements[name2].value) {
		window.alert('Passwords doesn\'t match');
		form.elements[name1].focus();
		return false;
	}
	return true;
}

function submitCmdWC(button, cmd) {	
	if (cmd != 'cancel') {
		if (!checkForm(button.form)){
			return false;
		}
		if (button.form.elements['user[password]'] && button.form.elements['user[confirm_password]']) {
			if (!checkPasswords(button.form, 'user[password]', 'user[confirm_password]')) {
				return false;
			}
		}
	}
	button.form.elements['cmd'].value = cmd;
	button.form.submit();
	return true;
}

function submitCmdWCLoading(button, cmd) {	
	if (cmd != 'cancel') {
		if (!checkForm(button.form)){
			return false;
		}
		if (button.form.elements['password'] && button.form.elements['confirm']) {
			if (!checkPasswords(button.form, 'password', 'confirm')) {
				return false;
			}
		}
	}
	loading();
	button.form.elements['cmd'].value = cmd;
	button.form.submit();
	return true;
}

function submitCmdAnother(form, cmd) {
var form = document.getElementById(form);
	if (cmd != 'cancel') {
		if (!checkForm(form)){
			return ;
		}
		if (form.elements['password'] && form.elements['confirm']) {
			if (!checkPasswords(form, 'password', 'confirm')) {
				return;
			}
		}
	}
	form.elements['cmd'].value = cmd;
	form.submit();
}

function setAppendedGroupsValue(form, form2) {
    
    var cont = document.getElementById(form2).elements['contacts[]'];    
	var i = 0, value = '';
	if (cont.length == undefined && cont.checked){
		value += cont.value + '~~';
	}else{
		while(i < cont.length) {
			if (cont[i].checked) {
				value += cont[i].value + '~~';
			}
			i++;
		}
	}    
    if (value == '') {
		return false;
	}
    
    var groups = document.getElementById(form).elements['groups[]'];    
	value = '';
	i = 0;
	if (groups.length == undefined && groups.checked){
		value += groups.value + '~~';
	}else{
		while(i < groups.length) {
			if (groups[i].checked) {
				value += groups[i].value + '~~';
			}
			i++;
		}
	}
	if (value == '') {
		return false;
	}
	document.getElementById(form2).elements['groups'].value = value;
	return true;
}


function checkedCheckbox(name, message){
	if (!document.getElementById(name).checked){
		alert(message);
		return false;
	}
	return true;
}

function checkMobile(code, number) {
	var c = document.getElementById(code).value;
	var n = document.getElementById(number).value;
	if(c.length > 3 || n.length > 17 || n.length < 7 || c.length < 1) {
		return false;
	}
	return regExpMatch(c + n, '^\\+?[\\d\\-\\(\\) ]*\\d+$');
	
}

function showElementError(el, message) {
	Ext.get(el).addClass('notification');
	showError(message);
	el.focus();
}


function showElementNotice(el, message) {
	Ext.get(el).addClass('notification');
	showError(message);
	el.focus();
}

function addContactsToGroupAction(btn){
	if (btn == 'yes'){
		submitCmdAnother('contact-form', 'append_sel');
	}
}

function contactsToGroupConfirm(titleText, confirmText){
	if(setAppendedGroupsValue('group-form', 'contact-form')){
		Ext.MessageBox.confirm(titleText, confirmText, addContactsToGroupAction, this);		
		//Ext.MessageBox.confirm('Add to group', 'Are you sure you want to do that?', addContactsToGroupAction, this);		
	}
}

function submitCmdIfNotEmptyCheckbox(form_name, cmd, error_title, error_msg) {
	var type = "checkbox";
	var form = document.getElementById(form_name);		
	for(var i=0; i < form.elements.length; i++){
		if (form.elements[i].type == type){
			if (form.elements[i].checked){
				submitCmdAnother(form_name, cmd);
				return false;
			}
		}
	}
	Ext.MessageBox.alert(error_title, error_msg, null);
	return true;
}

function submitCmdIfNotEmptyCheckboxWidthConfirm (form_name, cmd, mbox_title, error_msg, confirm_msg) {
	var type = "checkbox";
	var form = document.getElementById(form_name);		
	for(var i=0; i < form.elements.length; i++){
		if (form.elements[i].type == type){
			if (form.elements[i].checked){
				confirmBeforeSubmitCmdAnother(mbox_title, confirm_msg, form_name, cmd);				
				return false;
			}
		}
	}
	Ext.MessageBox.alert(mbox_title, error_msg, null);
	return true;
}

var act_form;
var act_cmd; 
function confirmBeforeSubmitCmdAnother(title, msg, form, cmd){
	act_form = form;
	act_cmd = cmd;
	Ext.MessageBox.confirm(title, msg, actionSubmitCmdAnother, true);
}

function actionSubmitCmdAnother(btn) {
	if (btn == 'yes'){
		submitCmdAnother(act_form, act_cmd);
	}
}

/**
 * Change country code by select
 * 
 * @param object country_select select element object
 * @param string code_input_name input phone code name
 */
function onChangeCountryCode(country_select, code_input_name){
	country_select.form.elements[code_input_name].value = country_select.options[country_select.selectedIndex].getAttribute('phone');
}

function orangeTextInTh(this_tr){
	while(this_tr.tagName != 'TR'){
		if (this_tr.parentNode) {
			this_tr = this_tr.parentNode;
		} else {
			return;
		}
	}
	for(i=0; i<this_tr.childNodes.length; i++){
		if (this_tr.childNodes[i].tagName == 'TH'){
			this_tr.childNodes[i].className = 'first style7';
		}
	}
}


function normalTextInTh(this_tr){
	if(this_tr.name == 'phone[number]'){
		this_tr = this_tr.parentNode.parentNode.parentNode;
	}
	while(!this_tr.tagName || this_tr.tagName != 'TR'){
		this_tr = this_tr.parentNode;
		if (!this_tr) {
			return;
		}
	}
	var i;
	for(i=0; i<this_tr.childNodes.length; i++){
		if (this_tr.childNodes[i].tagName == 'TH'){
			this_tr.childNodes[i].className = 'first';
		}
	}
}

function showError(message) {
	var el = document.getElementById('errorbox');
	el.style.display = '';
	if (el) {
		el.innerHTML = '<li>' + message + '</li>';
	}
	
}


var setNormalColor = function(event){
	event = event || window.event; // get event object
	element = event.target || event.srcElement; // get source element
	Ext.get(element).removeClass('notification');
	if (element.name == 'phone[number]') {
		normalTextInTh(element.parentNode.parentNode.parentNode);
	} else {
		normalTextInTh(element);
	}
	if (navigator.appName == "Microsoft Internet Explorer" || element.removeEventListener("change", setNormalColor, false)){ // delete event (for normal browsers)
		element.detachEvent("change", setNormalColor); // delete event (for IE))
	}
}

