/*
	Common functions for whole project
	use prefix "ds_"
 */


/* delete spaces at the begin and end of input string */
function ds_doubleSidedTrim(str){
	return str.replace(/^[ ]+/, '').replace(/[ ]+$/,'');
}

function ds_clearForm() {
	var clearTemplateForm = jQuery('#viewTemplatesCommand');
	if(clearTemplateForm) {
		jQuery('input:text',clearTemplateForm).val('');
		jQuery('select',clearTemplateForm).val('');
		jQuery('textarea',clearTemplateForm).val('');
		jQuery("span[id$='.errors']", clearTemplateForm).text('');
	}
	
	var clearUserPropertyForm = jQuery('#userProperty');
	if(clearUserPropertyForm) {
		jQuery('input:text',clearUserPropertyForm).val('');
		jQuery('input:checkbox', clearUserPropertyForm).attr('checked', '')
		jQuery('select', clearUserPropertyForm).val('LongType');
		jQuery("span[id$='.errors']", clearUserPropertyForm).text('');
	}
	var clearVarTagForm = jQuery('#table_for_add_new_tag');
	if(clearVarTagForm) {
		jQuery('input:text',clearVarTagForm).val('');
		jQuery('textarea',clearVarTagForm).val('');
		jQuery("span[id$='.errors']", clearVarTagForm).text('');
	}
	var clearFeedbackForm = jQuery('#table_for_add_new_feedback'); 
	if(clearFeedbackForm) {
		jQuery('input:text',clearFeedbackForm).val('');
		jQuery("span[id$='.errors']", clearFeedbackForm).text('');
	}
	var clearContentForm = jQuery('#table_for_add_new_datasource');
	if(clearContentForm) {
		jQuery('input:text',clearContentForm).val('');
		jQuery("span[id$='.errors']", clearContentForm).text('');
	}
	
}

/* validation for Add/Edit table */
function ds_addEditTable_validateTable(param){

	var getElementFromList = function (elemName){
		if ( param.elements == null ) return null;
		for(var i = 0; i < param.elements.length; i++){
			if ( elemName == param.elements[i].name ){
				return param.elements[i];
			}
		}
		return null;
	}

	var validateField = function (field, elemParams){
		var ok = true;
		if ( (elemParams && elemParams.disableTrim) || (field.type == "file")){
			// don't trim
		} else {
			field.value = ds_doubleSidedTrim(field.value);
		}
		if ( elemParams && elemParams.regexp ){
			regexp = new RegExp(elemParams.regexp);
			ok = regexp.test(field.value);
		}  
		if (elemParams && elemParams.required)
		{
			ok = field.value.length > 0;
			if(!ok) {
				if ( elemParams && elemParams.errorMessage ) {
					return 'Please enter a ' + elemParams.errorMessage;
				} else {
					return param.defaultErrorMessage;
				}
			}
		}
		if (elemParams && elemParams.maxLength){
			ok = elemParams.maxLength >= field.value.length;
			if(!ok)
				return "The text you provided is too long. The maximum length is " + elemParams.maxLength + " characters";
		}
		if(elemParams && elemParams.minLength){
			ok = elemParams.minLength <= field.value.length;
			if(!ok)
				return "The text you provided must have at least " + elemParams.minLength + " characters";
		}

		if ( ok ) {
			return null;
		}
		if ( elemParams && elemParams.errorMessage ) {
			return elemParams.errorMessage;
		} else {
			return param.defaultErrorMessage;
		}
	}

	var error = false;
	if ( typeof param.submitButton != 'undefined' ) {
		param.table = param.submitButton.parentNode.parentNode.parentNode.parentNode.parentNode;
	}
	$(param.table).select('td.title').each(function(e){
		var tr = $(e.parentNode);
		var valInput = $(tr).select('td.value input, td.value textarea')[0];
		if (typeof valInput == 'undefined'){
			return;
		}
		var validateInform = getElementFromList(valInput.name);
		//if ( e.innerHTML.indexOf('*') > -1 || validateInform){
			if ( valInput == null ){
				valInput = $(tr).select('td.value textarea')[0];
			}
			if ( valInput != null ){
				var valueTd = $(tr).select('td.value')[0];
				var errBlock = $(valueTd).select('span.error')[0];
				var errorText = validateField(valInput, validateInform);
				if ( errorText == null ){
					if ( typeof errBlock != 'undefined' ){
						errBlock.style.display = 'none';
					}
				} else {
					if ( errBlock == null ){
						//errBlock = new Element('span', {className: 'error'}).update(errorText);
						jQuery(valueTd).append("<span class='error' style='display: block' id='"+ valInput.name +".errors'>" + errorText + "</span>");

						/* some troubles with ie6 */
						if ( navigator.appVersion.indexOf('MSIE 6') > -1 ){
							$('footer').style.bottom = '0';
							$('footer').style.left = '0';
							$('footer').style.position = 'absolute';
						}
					}
					else {
					    errBlock.style.display = 'block';
					    if(navigator.userAgent.toLowerCase().indexOf('msie') != -1)
					    	errBlock.innerText = errorText;
					    else
					    	errBlock.textContent = errorText;
					}
					error = true;
				}
			}
		//}
	});
	return !error;
}



function  ds_Validation()
{
}

ds_Validation.getEditValue = function (field)
{
	var result = field.value;

	return result;
};

ds_Validation.getTextAreaValue = function (field)
{
	var result = field.value;

	return result;
};

ds_Validation.ValidationError =
{	
	NONE: "NONE",	
	NO_VALUE: "NO_VALUE",
	EMPTY: "EMPTY",
	VERY_SHORT: "VERY_SHORT",
	VERY_LONG: "VERY_LONG",	
	INCORRECT: "INCORRECT"		
};

ds_Validation.FieldType =
{
	REQUIRED: "REQUIRED",
	EMAIL: "EMAIL",
	COMMENT: "COMMENT",
	//UserPropertyType enum values
	LongType: "LONG",
	DoubleType: "DOUBLE",
	StringType: "STRING",
	TextType: "TEXT",
	DateType: "DATE",
	BooleanType: "BOOLEAN"
};

ds_Validation.ValidationRequiredMap =
{
	REQUIRED: true,
	EMAIL: true,
	COMMENT: true
};

ds_Validation.ValidationMinLengthMap =
{			
};

ds_Validation.ValidationMaxLengthMap =
{
		STRING: 1000,
		LONG: 19,
		TEXT: 1000
};

ds_Validation.ValidationRegExpMap =
{
	EMAIL: /^[-a-zA-Z0-9!#$%&'*+/=?^_`{|}~]+(\.[-a-zA-Z0-9!#$%&'*+/=?^_`{|}~]+)*@([a-zA-Z0-9]([-a-zA-Z0-9]{0,61}[a-zA-Z0-9])?\.)*(aero|arpa|asia|biz|cat|com|coop|edu|gov|info|int|jobs|mil|mobi|museum|name|net|org|pro|tel|travel|[a-z][a-z])$/,
	LONG: /^(\+|-)?[\d]{0,19}$/,
	DOUBLE: /^[ +-eE\.\d]{0,30}$/,
	DATE: /^[\d]{2}\.[\d]{2}.[\d]{4}$/
};

ds_Validation.ValidationAlgorithmMap =
{
	COMMENT: 
		function (text, algoData) 
		{
			var maxCommentLength = algoData["maxCommentLength"];
			
			if (text.length > maxCommentLength) 
			{
				return ds_Validation.ValidationError.VERY_LONG;
			}	
			
			var trimmedText = text.replace(/(^\s+)|(\s+$)/g, "");
			
			if (trimmedText == "")
			{
				return ds_Validation.ValidationError.EMPTY;
			}	
			
			return ds_Validation.ValidationError.NONE;
		}
};

ds_Validation.ValueGetterMap =
{
	REQUIRED: ds_Validation.getEditValue,
	EMAIL: ds_Validation.getEditValue,
	COMMENT: ds_Validation.getTextAreaValue,
	LONG: ds_Validation.getEditValue,
	DOUBLE: ds_Validation.getEditValue,
	STRING: ds_Validation.getEditValue,
	TEXT: ds_Validation.getEditValue,
	DATE: ds_Validation.getEditValue,
	BOOLEAN: ds_Validation.getEditValue
};

ds_Validation.validateText = function (text, required, minLength, maxLength, regExp, algorithm, algoData)
{
	if (text == null) 
	{
		return ds_Validation.ValidationError.NO_VALUE;
	}	
	
	if (required != null && required && text == "")
	{
		return ds_Validation.ValidationError.EMPTY;
	}
	
	if (minLength != null && text.length < minLength)
	{	
		return ds_Validation.ValidationError.VERY_SHORT;
	}
	
	if (maxLength != null && text.length > maxLength)
	{	
		return ds_Validation.ValidationError.VERY_LONG;
	}	
	
	if (regExp != null && !text.match(regExp)){
		return ds_Validation.ValidationError.INCORRECT;
	}
	
	if (algorithm != null)
	{	
		var result = algorithm(text, algoData); 
		
		return result;
	}
	
	return ds_Validation.ValidationError.NONE;
};

ds_Validation.validateValue = function (value, fieldType, algoData)
{
	var required = ds_Validation.ValidationRequiredMap[fieldType];
	var minLength = ds_Validation.ValidationMinLengthMap[fieldType];
	var maxLength = ds_Validation.ValidationMaxLengthMap[fieldType];
	var regExp = ds_Validation.ValidationRegExpMap[fieldType];
	var algorithm = ds_Validation.ValidationAlgorithmMap[fieldType];

	var result = ds_Validation.validateText(value, required, minLength, maxLength, regExp, algorithm, algoData);

	return result;
};

ds_Validation.validateField = function (field, fieldType, algoData)
{
	var valueGetter = ds_Validation.ValueGetterMap[fieldType];

	var value = valueGetter(field);

	var result = ds_Validation.validateValue(value, fieldType, algoData);

	return result;
};

ds_Validation.validateFields = function (params)
{
	var result = true;

	for (var i = 0; i < params.length; ++i)
	{
		var param = params[i];

		var field = param["field"];
		var fieldType = param["fieldType"];
		var handler = param["handler"];
		var algoData = param["algoData"];
		var clientData = param["clientData"];

		var validationError = ds_Validation.validateField(field, fieldType, algoData);

		handler(field, fieldType, validationError, algoData, clientData);

		if (validationError != ds_Validation.ValidationError.NONE)
		{
			result = false;
		}
	}

	return result;
};


