/**
 * The getElementById implementation
 */
function dgi(id){
	var el = document.getElementById(id);
	
	if (!el) {
		var err = new Error('001', 'Can not find the element with ID=' + id);
		err.name = 'getElementById error';
		throw (err);
	}
	
    return el;
}

/**
 * Checks if variable value is empty.
 *
 */
function isEmpty(someVar) {
    return (someVar === "" || someVar === 0   
              || someVar === "0" || someVar === null  
              || someVar === false  
              ||  (isArray(someVar) && someVar.length === 0));
}

/**
 * Checkes if variable is array.
 *
 */
function isArray(someVar) {
    return ((someVar instanceof Array) ||
    		(someVar instanceof Object && !isNaN(someVar.length)));
}

/**
 * Shows warnings
 */
function warning(str) {
	 if (!isEmpty(str)) {
	 	alert(str);
	 	return false;
	 }
	 return true;
}
/**
 * Get field label values. 
 */
function getLabel(field){
    var labels = field.form.getElementsByTagName('label');
    for(var i = 0, l = labels.length; i < l; i++) {
		if(labels[i].htmlFor == field.name) {
	    	return labels[i].innerHTML;
	    }
    }
}

/**
 * The pattern object
 */
var pattern = {
	'caption' : /^[A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ \&,\.\?\!\~\@\#\$№\%\^\*+\–=\{\}\[\]\|\\\/""`''\n\r\t:;—«»\)\(\-]*$/i,
	//'caption' : /^([\w''"" ,\!\?:;\.-№\#]|\&)*$/i, // for test
	
	'tags' : /^[A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ ,\.\?\!\/\""`’''\n\r\t\:;\)\(\-]*$/i,
	
	'name' : /^[A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ][A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ ,""''-]+[A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ""]$/i,
	
	'noEmpty' : /([\w]|[А-Яа-яІЇЄЁҐіїєёґ])+/gi,
	//'noEmpty' : /^.*\S.*$/i,
	
	'login' : /^[0-9A-Za-z_-]{4,}$/i,
	
	//'password' : /^[\x20-\x7E]{6,}$/,
	
	'email' : /^[0-9a-z_A-Z][\w\.-]*[a-zA-Z_0-9]@[a-zA-Z0-9][\w\.-]*[a-zA-Z0-9]\.[a-zA-Z][a-zA-Z\.]*[a-zA-Z]$/i,
	
	'occupation' : /^([A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ]([A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ'' ,-])+[A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ]|)$/i,
	
	'company' : /^([A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ]([A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ''"" ,-])+[A-Za-z0-9_А-Яа-яІЇЄЁҐіїєёґ""]|)$/
}

/**
 * The simple validator object
 */
var simpleValidator = {
	'compare' : function (regExpObj, string, id) { 
    	var match = regExpObj.test(string); 
    	dgi(id).className = (match ? 'valid' : 'invalid');
    	return match;
	},
	
	'sentence' : function (field, id) {
	//alert(field.value);    
    	return this.compare(pattern.caption, field.value, id);
    },
    
    'name' : function(field, id) {
    	return this.compare(pattern.name, field.value, id);
    },
    
    'tags' : function (field, id) {    
    	return this.compare(pattern.tags, field.value, id);
    },
    
    'noEmpty' : function(field, id) {
    	var empty = isEmpty(field.value); 
    	dgi(id).className = (!empty ? 'valid' : 'invalid');
    	return !empty;
    	//return this.compare(pattern.noEmpty, field.value, id);
    },
    
    'email' : function(field, id) {
    	return this.compare(pattern.email, field.value, id);
    },
    
    'login' : function(field, id) {
    	return this.compare(pattern.login, field.value, id);
    },
    
    'password' : function(field, id) {
    	var valid = (!isEmpty(field.value) && field.value.length > 5);
    	dgi(id).className = (valid ? 'valid' : 'invalid');
    	return valid;
    },
    
    'confirm' : function (field1, field2, id) {
    	var confirm = (field1.value == field2.value);
    	dgi(id).className = (confirm ? 'valid' : 'invalid');
    	return confirm;
	},
	
	'dropdown' : function(dropdown, id, invalidValue) {
		invalidValue = (invalidValue == null) ? '0' : invalidValue;
    	
    	var valid = (dropdown.options[dropdown.selectedIndex].value != invalidValue);
    	
    	dgi(id).className = (valid ? 'valid' : 'invalid');
    	
    	return valid;
	}
}

/**
 * The error messages object
 */
var errorMsg = {
	
	'dropdown' : function (field) {
    	return 'Выберите значение для поля «' + getLabel(field) + '»';
	},
	
	'login' : function (field) {
    	return 'Поле «' + getLabel(field) + '» не содержит правильный логин';
	},
	
	'noEmpty' : function (field) {
    	return 'Поле «' + getLabel(field) + '» не может быть пустым';
	},
	
	'email' : function (field) {
    	return 'Поле «' + getLabel(field) + '» не содержит правильный email-адрес';
	},
	
	'name' : function (field) {
    	return 'Поле «' + getLabel(field) + '» имеет недопустимый формат';
	},
	
	'sentence' : {
		'optional' : function (field){
    		return 'Поле «' + getLabel(field) + '» содержит запрещенные символы';
		},
		
		'required' : function (field) {
    		return 'Поле «' + getLabel(field) + '» пустое или содержит запрещенные символы';
		}  
	},

	'password' : function (field) {
    	return 'Пароль должен иметь не менее 6 валидных знаков';
	},

	'confirm' : function (field1, field2) {
    	return 'Поле «' + getLabel(field1) + '» не совпадает с полем «' + getLabel(field2) + '»';
	},

	'number' : function (field) {
    	return 'Поле «' + getLabel(field) + '» не содержит правильное число';
	},
	
	'range' : function (field1, field2, num1, num2) {
    	return 'Поля «' + getLabel(field1) + '» и «' + getLabel(field2) + '» должны содержать диапазон чисел от ' + num1 + ' до ' + num2;
	},
	
	'tags' : function (field) {
    	return 'Поле «' + getLabel(field) + '» может содержать только буквы, цифры и знаки препинания';
	}
}


/**
 * The field checker object.
 */
var fieldChecker = {
	'isRequired' : function (argArray) {
		return (isArray(argArray) && argArray.length > 2) ? argArray[2] : false ;
	},

	'caption' : function(fieldId, labelId) {
		var required = this.isRequired(arguments);
		var msg = ''; 
		var field = dgi(fieldId); 
    		
    	if (field) {
    		if (required) {
    			msg += (simpleValidator.sentence(field, labelId) && simpleValidator.noEmpty(field, labelId))
    					? '' 
    					: ' * ' + errorMsg.sentence.required(field) + "\r\n";
    		} else {
    			msg += (simpleValidator.sentence(field, labelId)) 
    					? '' 
    					: ' * ' + errorMsg.sentence.optional(field) + "\r\n";
    		}
    	}
		
		return msg; 
	},
	
	'noempty' : function (fieldId, labelId) {
		var msg = ''; 
		var field = dgi(fieldId);

		msg += (simpleValidator.noEmpty(field, labelId)) ? '' : ' * ' + errorMsg.noEmpty(field) + "\r\n";
		
    	return msg;
	},
	
	'tags' : function(fieldId, labelId) {
		var msg = ''; 
		var field = dgi(fieldId);
		
    	if (field) {
    		msg += (simpleValidator.tags(field, labelId)) ? '' : ' * ' + errorMsg.tags(field) + "\r\n";
    	}
		
		return msg;
	},
	
	'login' : function(fieldId, labelId) {
		var msg = ''; 
		var field = dgi(fieldId);
		
    	if (field) {
    		msg += (simpleValidator.noEmpty(field, labelId) && simpleValidator.login(field, labelId))
    					? '' 
    					: ' * ' + errorMsg.login(field) + "\r\n";
    	}
		
		return msg;
	},
	
	'email' : function(fieldId, labelId) {
		var msg = ''; 
		var field = dgi(fieldId);
		
    	if (field) {
    		msg += (simpleValidator.noEmpty(field, labelId) && simpleValidator.email(field, labelId))
    					? '' 
    					: ' * ' + errorMsg.email(field) + "\r\n";
    	}
		
		return msg;
	},
	
	'password' : function(fieldId, labelId) {
		var msg = ''; 
		var field = dgi(fieldId);
		
    	if (field) {
    		msg += (simpleValidator.password(field, labelId))
    					? '' 
    					: ' * ' + errorMsg.password(field) + "\r\n";
    	}
		
		return msg;
	},
	
	'confirm' : function(fieldId1, fieldId2, labelId) {
		var msg = ''; 
		var field1 = dgi(fieldId1);
		var field2 = dgi(fieldId2);
		
    	if (field1 && field2) {
    		msg += (simpleValidator.confirm(field1, field2, labelId))
    					? '' 
    					: ' * ' + errorMsg.confirm(field1, field2) + "\r\n";
    	}
		
		return msg;
	},
	
	'name' : function(fieldId, labelId) {
		var msg = ''; 
		var field = dgi(fieldId);
		
    	if (field) {
    		msg += (simpleValidator.name(field, labelId))
    					? '' 
    					: ' * ' + errorMsg.name(field) + "\r\n";
    	}
		
		return msg;
	},
	
	'dropdown' : function(fieldId, id, invalidValue) {
		var msg = '';
		
		var field = dgi(fieldId);
		
    	if (field) {
    		msg += (simpleValidator.dropdown(field, id, invalidValue))
    					? '' 
    					: ' * ' + errorMsg.dropdown(field) + "\r\n";
    	}
		
		return msg;
	}
	

}

/**
 * The form validator object
 */
var formValidator = {

	'f_photo' : function() {
		var msg = '';
		
		msg += fieldChecker.caption('name', 'photoCaptionValidLabel');
		msg += fieldChecker.caption('desc', 'photoDescValidLabel');
		msg += fieldChecker.tags('tagNames', 'photoTagsValidLabel');
				
		return warning(msg);
	},
	
	'f_video' : function() {
		var msg = '';
		
		msg += fieldChecker.caption('name', 'videoCaptionValidLabel');
		msg += fieldChecker.caption('desc', 'videoDescValidLabel');
		msg += fieldChecker.tags('tagNames', 'videoTagsValidLabel');
				
		return warning(msg);
	},
	
	'f_blogadd' : function() {
		var msg = '';
		
		msg += fieldChecker.caption('subject', 'subjectValidLabel', true);
		//msg += fieldChecker.noempty('memo', 'articleValidLabel');
		msg += fieldChecker.tags('tagNames', 'articleTagsValidLabel');
				
		return warning(msg);
	},
	
	'f_directoryedit' : function() {
		var msg = '';
		
		msg += fieldChecker.caption('dir.name', 'galleryTitleValidLabel', true);
		return warning(msg);
	},
	
	'f_topicadd' : function() {
		var msg = '';
		
		msg += fieldChecker.noEmpty('memo', 'memoValidLabel');
		return warning(msg);
	},
	
	'f_community' : function() {
		var msg = '';
		
		msg += fieldChecker.caption('group.name', 'communityTitleValidLabel', true);
		return warning(msg);
	},
	
	'f_signup' : function() {
		var msg = '';
		
		msg += fieldChecker.login('login', 'loginValidLabel');
		msg += fieldChecker.email('email', 'emailValidLabel');
		msg += fieldChecker.password('password', 'passwordValidLabel');
		msg += fieldChecker.confirm('password', 'confirm', 'passwordConfirmValidLabel');
		
		return warning(msg);
	},
	
	'f_login' : function() {
		var msg = '';
		
		msg += fieldChecker.login('login', 'loginValidLabel');
		msg += fieldChecker.password('password', 'passworddValidLabel');
				
		return warning(msg);
	},
	
	'f_editprofile' : function() {
		var msg = '';
		
		var pswd = dgi('password');
		
		if (!isEmpty(pswd.value)) {
			msg += fieldChecker.password('password', 'passwordValidLabel');
			msg += fieldChecker.confirm('password', 'confirm', 'passwordConfirmValidLabel');
		}
		
		msg += fieldChecker.email('email', 'emailValidLabel');
		
		var uname = dgi('user.userProfile.name');
		
		if (!isEmpty(uname.value)) {
			msg += fieldChecker.name('user.userProfile.name', 'usernameValidLabel');
		}
		
		/*
		var gender = dgi('user.userProfile.sex');
    	
    	if (gender.selectedIndex != -1) {
	    	msg += fieldChecker.dropdown('user.userProfile.sex', 'genderValidLabel', 0);
		}
		*/
		
		return warning(msg);
    }
}