 /**
 * this file validates data from form (form -credit cart payment)
 */

var ErrorMessage = "Your information is incomplete or incorrect. Please correct the fields below and try again:";
var ErrorMessage1 = "Empty field";
var ErrorMessage2 = "Incorrect data";
var ErrorMessage3 = "Incorrect length";
var IdMessageError = 'message_error';
var IdMessageErrorSpan = 'message_error_span';
var cvv2Count = 3;
var error_message = "";
var error = 0;

//this function validates all payment form data
//@param id_form is a id form
//@return true or false
function validate(id_form) {
   var o_form = document.getElementById(id_form);

   isCorrectText(o_form.firstName, '');
   isCorrectText(o_form.lastName, '');
   isCorrectNumericField(o_form.creditCardNumber, 16);
   isCorrectCvv2Number(o_form.cvv2Number.name, o_form.cvv2Number.value, o_form.cvv2Number.id);
   isCorrectData(o_form.address1, '/.');
   if(o_form.address2.value) isCorrectData(o_form.address2, '/.');
   isCorrectText(o_form.city_name, '');
   isCorrectText(o_form.state, '');
   isCorrectData(o_form.zip, '-');
   isCorrectText(o_form.country, '');
   isCorrectNumericField(o_form.amount, 10);

   if(error > 0)
   	return false;
   else
   	return true;
}

//this function sets limit of Cvv2 data length
//@param obj_this is a field object
//@param field_name is a filed name
//@param field_id is a fiels id
function setCvv2Count(obj_this, field_name, field_id) {
	var o_field = document.getElementById(field_id);

	if(obj_this.value == 'Amex') {
		cvv2Count = 4;
		isCorrectCvv2Number(field_name, o_field.value, o_field.id);
	} else {
		cvv2Count = 3;
		isCorrectCvv2Number(field_name, o_field.value, o_field.id);
	}
}

//this function checks if variable is empty
//@param text is data to check
//@return true if data is empty or false
function isEmpty(text) {
  if ((text.length==0) ||
  (text==null)) {
     return true;
  }
  else { return false; }
}

//this function checks if current string has got only numeric chars
//@param text is data to check
//@return true if data is numeric or false
function isNumeric(text) {
  var valid_chars = "0123456789.";
  var is_number=true;
  var char;

  for (i = 0; i < text.length && is_number == true; i++) {
     char = text.charAt(i);
     if (valid_chars.indexOf(char) == -1) {
        	is_number = false;
        }
     }
  return is_number;
}

//this function checks if current string hasn't got numeric chars
//@param text is data to check
//@return true if data isn't numeric or false
function isNotNumeric(text) {
  var valid_chars = "0123456789";
  var is_not_number=true;
  var char;

  for (i = 0; i < text.length && is_not_number == true; i++) {
     char = text.charAt(i);
     if (valid_chars.indexOf(char) != -1) {
        	is_not_number = false;
        }
     }
  return is_not_number;
}

//this function checks if current string has got valid chars
//@param text is data to check
//@param available_char is a available char
//@return true if data has got valid chars or false
function isValidChar(text, available_char) {
  var valid_chars = "`~!@#$%^&*()+=_{}[]|\"\\';:,./<>?-";
  var is_valid_char=false;
  var char;

  for (i = 0; i < text.length && is_valid_char == false; i++) {
     char = text.charAt(i);

    if (valid_chars.indexOf(char) != -1 && available_char.indexOf(char) == -1) {
    		//alert('valid_chars.indexOf(char): '+valid_chars.indexOf(char)+' available_char.indexOf(char): '+available_char.indexOf(char)+' char: '+char+' available_char: '+available_char);
        	is_valid_char = true;
        }
     }

  return is_valid_char;
}

//this function checks if current data from field is correct text (no numeric chars)
//@param obj_this is a field object
//@param available_char is a available char

function isCorrectText(obj_this, available_char){
	 var field_name = obj_this.name;
	 var field_value = obj_this.value;
	 var error_field = 0;
	 if(!available_char) available_char='';

	 if(isEmpty(field_value)) { error_field++; error_message = ErrorMessage1;}
	 if(isValidChar(field_value, available_char) && error_field==0) { error_field++; error_message = ErrorMessage2;}
	 if(field_value.length < 2 && error_field==0) { error_field++; error_message = ErrorMessage3;}
	 if(!isNotNumeric(field_value) && error_field==0) { error_field++; error_message = ErrorMessage2;}

	 if(error_field > 0) {
		showErrorField(obj_this.id, obj_this.name, error_message);
	 } else {
	 	hideErrorField(obj_this.id, obj_this.name);
	}
}

//this function checks if current data from field has got only numeric chars
//@param obj_this is a field object
//@param count_number is a available length
function isCorrectNumericField(obj_this, count_number) {
	var field_name = obj_this.name;
	var field_value = obj_this.value;
	var error_field = 0;

	if(isEmpty(field_value)) { error_field++; error_message = ErrorMessage1;}
	if(field_name!='amount' && field_name !='qty')
		if(field_value.length > count_number && error_field==0) { error_field++; error_message = ErrorMessage3;}
	else
		if(field_value.length != count_number && error_field==0) { error_field++; error_message = ErrorMessage3;}
	if(!isNumeric(field_value) && error_field==0) { error_field++; error_message = ErrorMessage2;}


	if(error_field > 0) {
		showErrorField(obj_this.id, obj_this.name, error_message);
	} else {
	 	hideErrorField(obj_this.id, obj_this.name);
	}
}

//this function check if current data from fiels is a correct Cvv2 - cart number
//@param field_name is a field name
//@param field_value is a fiels value
//@param field_id is a field id
function isCorrectCvv2Number(field_name,field_value, field_id ) {
	var error_field = 0;

	if(isEmpty(field_value)) { error_field++; error_message = ErrorMessage1;}
	if(!isEmpty(field_value)) {
		if(field_value.length != cvv2Count) { error_field++; error_message = ErrorMessage3;}
		if(!isNumeric(field_value)) { error_field++; error_message = ErrorMessage2;}
	}
	if(error_field > 0) {
		showErrorField(field_id, field_name, error_message);
	} else {
	 	hideErrorField(field_id, field_name);
	}
}

//this function check if current data from field is correct (hasn't got valid chars)
//@param obj_this is a field object
//@param count_number is a available length
function isCorrectData(obj_this, available_char) {
	var field_name = obj_this.name;
	var field_value = obj_this.value;
	var error_field = 0;

	if(isEmpty(field_value)) { error_field++; error_message = ErrorMessage1;}
	if(isValidChar(field_value, available_char) && error_field==0) { error_field++; error_message = ErrorMessage2;}
	if(field_value.length < 2 && error_field==0) { error_field++; error_message = ErrorMessage3;}

	if(error_field > 0) {
		showErrorField(obj_this.id, obj_this.name, error_message);
	} else {
	 	hideErrorField(obj_this.id, obj_this.name);
	}
}

//this function check if current data from field is correct (hasn't got valid chars)
//@param obj_this is a field object
//@param count_number is a available length
function isCorrectDataWithEmpty(obj_this, available_char) {
	var field_name = obj_this.name;
	var field_value = obj_this.value;
	var error_field = 0;
	
	if(field_value !='') {
		if(isValidChar(field_value, available_char) && error_field==0) { error_field++; error_message = ErrorMessage2;}
		if(field_value.length < 2 && error_field==0) { error_field++; error_message = ErrorMessage3;}
	}
	
	if(error_field > 0) {
		showErrorField(obj_this.id, obj_this.name, error_message);
	} else {
	 	hideErrorField(obj_this.id, obj_this.name);
	}
}

//this function shows error message
//@param field_name is a field name
//@param field_value is a fiels value
//@param error_message is a error message
function showErrorField(field_id, field_name, error_message) {
	//var field_id = obj_this.id;
	//var field_name = obj_this.name;
	var id_field_text = 'txt_'+field_name;
	var id_field_span = 'sp_'+field_name;
	var id_field_txt_span = 'sp_txt_'+field_name;

	var o_id_field_span = document.getElementById(id_field_span);
	var o_IdMessageError = document.getElementById(IdMessageError);

	if(!document.getElementById(id_field_txt_span) || document.getElementById(IdMessageErrorSpan).value != error_message) {
		if(!document.getElementById(id_field_txt_span)) error++;

		var obj ="<span id="+id_field_txt_span+">"+error_message+"</span>";
		setCssStyle(id_field_text, 'FF0000', '', '', '', '', '', '' ,'', '', '');
		setCssStyle(id_field_span, 'FF0000', '10', '', '', '', '', '' ,'', '', '');
		setCssStyle(field_id, 'FF0000', '', '', '', '', '', '' ,'', '', '');
		o_id_field_span.innerHTML=obj;
	}

	if(!document.getElementById(IdMessageErrorSpan)) {
		var obj_error = "<span id="+IdMessageErrorSpan+"><b>"+ErrorMessage+"</b></span>";
		setCssStyle(IdMessageError, 'FF0000', '', '14', '', '', '', '' ,'', '', '');
		o_IdMessageError.innerHTML=obj_error;
	}
}

//this function hides error message
//@param field_id is a field id
//@param field_name is a fiels name
function hideErrorField(field_id, field_name) {
	//var field_id = obj_this.id;
	//var field_name = obj_this.name;
	var id_field_text = 'txt_'+field_name;
	var id_field_span = 'sp_'+field_name;
	var id_field_txt_span = 'sp_txt_'+field_name;

	if(document.getElementById(id_field_txt_span)) {
		error--;
		setCssStyle(id_field_text, '747474', '', '', '', '', '', '' ,'', '', '');
		setCssStyle(field_id, '000000', '', '', '', '', '', '' ,'', '', '');
		removeElement(id_field_txt_span, id_field_span);
	}

	if(document.getElementById(IdMessageErrorSpan) && error == 0) {
		removeElement(IdMessageErrorSpan, IdMessageError);
	}
}

//this function sets css style into current field
function setCssStyle(id_element, color, font_size, height, width, margin, padding, display ,position, visibility, class_name) {
	var obj_element=document.getElementById(id_element);

	if(color) obj_element.style.color = '#'+color;
	if(height) obj_element.style.height = height+'px';
	if(width) obj_element.style.width = width+'px';
	if(margin) obj_element.style.margin = margin+'px';
	if(padding) obj_element.style.padding = padding+'px';
	if(display) obj_element.style.display = display;
	if(position) obj_element.style.position = position;
	if(visibility) obj_element.style.visibility = visibility;
	if(class_name) obj_element.className = class_name;
	if(font_size) obj_element.style.fontSize = font_size+'px';
}


//this function remove current element
function removeElement(div_id, div_id_parent)
{
 	obj_div_id=document.getElementById(div_id);
 	obj_div_id_parent=document.getElementById(div_id_parent);
 	obj_div_id_parent.removeChild(obj_div_id);
}

//function validate subscription payment form
function validateSubscriptionForm(id_form) {
   var o_form = document.getElementById(id_form);

   isCorrectNumericField(o_form.qty, 4);

   if(error != 0) {
   		//return false;
   } else {
   		return document.getElementById('continue').submit();
	}
}

//this function check correct payment quantity (is allowed only numeric chars)
//and change item price on the site
function checkCorrectPaymentQuantity(this_obj, count_number, total_cost, cost_value, pp_qty_value, selected_subcritpion_cost)
{
	isCorrectNumericField(this_obj, count_number);
	change_total_cost(this_obj.id, total_cost, cost_value, pp_qty_value, selected_subcritpion_cost);
}


