
var js_options = {
	errorIDPrefix: "jsvalidator" // prefix of the id of the element above that will attach to the name or id of the form element. don't use spaces or special characters.
};

//the fields name that need server validation
var need_extra_validation = new Array('captcha', 'username_u', 'city', 'city_mark', 'email', 'pass2', //'web', 
		   'u_usernameAdmin', 'u_emailAdmin', //'c_webAdmin', 'c_cityAdmin', 'c_cityAdminEdit', 
           'adminName', 'adminEmail', 'markAdminEmail', 'adminEmailEdit', 'u_email', 'markAdminName', 
           'adminMarkEmailEdit', 'u_usernameEdit', 'u_emailEdit', 'u_usernameMA', 'u_emailMA',
           'p_name', 'pe_name', 'rfq_name', 'rfqe_name', 'news_name', 'newse_name', 'text', 'p_description', 'text10','r_message','message','c_other_text');
           
//the errors displayes for the fields that need server validation
var other_errors = {
	captcha: 'Invalid security code.',
	username_u: 'already in the database.',
	u_usernameAdmin: 'Username already in the database.',
	city: 'The company from this city already in database.',
	city_mark: 'The company from this city already exists in our database, but is inactive.',
	email: 'address already in database.',
	u_emailAdmin: 'Email address already in database.',
	adminEmail: 'Email address already in database.',
	markAdminEmail: 'Email address already in database.',
	adminMarkEmailEdit: 'Email address already in database.',
	markAdminName: 'This admin already exists in the database',
	pass2: 'Please verify your password again.',
	web: 'Invalid URL.',
	c_web: 'Invalid URL.',
	c_webAdmin: 'Invalid URL.',
	c_cityAdmin: 'This combination of company name and city already exists in the database.',
	c_cityAdminEdit: 'This combination of company name and city already exists in the database.',
	adminName: 'This admin already exists in the database',
	adminEmailEdit: 'This administrator email already exists in the database.',
	u_email: ' address already in database.',
	pack_discount: 'Discount must be a number',
	u_usernameEdit: 'The edited username is already in the database.',
	u_emailEdit: 'The edited e-mail is already in the database.',
	u_usernameMA: 'The username is already in the database.',
	u_emailMA: 'The e-mail is already in the database.',
	p_name: 'Your company already posted a product with this name.',
	pe_name: 'Your company already posted a product with this name.',
	rfq_name: 'Your company already posted a procurement request with this name.',
	rfqe_name: 'Your company already posted a procurement request with this name.',
    news_name: 'Your company already posted a release with this name.',
	newse_name: 'Your company already posted a release with this name.',
    text: 'is required. You must use between 100 and 1000 words.',
    text_id: 'is required. You must use between 100 and 1000 words.',
    p_description: 'is required. You must use between 100 and 1000 words.',
    text10: 'is required. You must use between 10 and 1000 words.',
    message: 'is required. You must use at least 50 characters.',
    r_message: 'is required. You must use at least 50 characters.',
    c_other_text: 'Additional option "Other" for <a href="#" name="text">Company type</a> is too short. Use at least 3 characters.'

};
	
//setup validators like: name of validator, default message, /regular expression/ !don't forget the / in front and the / in back!!!!
var custom_validators = {
	number: {
		className: "jsvalidate_number",
		defaultMessage: "field must have a numerical value.",
		regExp: /^[-]?\d+(\.\d+)?$/
	},
	quantity: {
		className: "jsvalidate_quantity",
		defaultMessage: "field can only contain numbers.",
		regExp: /^[0-9,.-]*$/
	},
	digits: {
		className: "jsvalidate_digits",
		defaultMessage: "field can only contain numbers.",
		regExp: /^[-]?\d+(\.\d+)?$/
	},
	email: {
		className: "jsvalidate_email",
		defaultMessage: "field must contain a valid email address.",
		regExp: /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/
	},
	alpha: {
		className: "jsvalidate_alpha",
		defaultMessage: "field must contain only letters.",
		regExp: /^[a-zA-z ]*$/
	},
    alphadot: {
        className: "jsvalidate_alphadot",
        defaultMessage: "field must contain only letters.",
        regExp: /^[a-zA-z.' ]*$/
    },
	alphanum: {
		className: "jsvalidate_alphanum",
		defaultMessage: "field must contain only letters or numbers.",
		regExp: /^[a-zA-Z0-9]+$/
	},
	length: {
		className: "jsvalidate_length",
		defaultMessage: "You must use at least 4 characters.",
		regExp: /^(.){4,}$/
	},
	length3: {
		className: "jsvalidate_length3",
		defaultMessage: "You must use at least 3 characters.",
		regExp: /^(.){3,}$/
	},
	length2: {
		className: "jsvalidate_length2",
		defaultMessage: "You must use at least 2 characters.",
		regExp: /^(.){2,}$/
	},
        length264: {
		className: "jsvalidate_length264",
		defaultMessage: "field is invalid. You must use between 2 and 64 characters.",
		regExp: /^(.){2,}$/
	},
        minlength: {
		className: "jsvalidate_minlength",
		defaultMessage: "You must use at least 50 characters.",
		regExp: /^(.){50,}$/
	},
    maxlength: {
        className: "jsvalidate_maxlength",
        defaultMessage: "You must use between 3 and 255 characters.",
        regExp: /^(.){3,255}?$/
    },
    maxlength100: {
        className: "jsvalidate_maxlength100",
        defaultMessage: "You must use maximum 100 characters.",
        regExp: /^(.){2,100}?$/
    },
	doc: {
		className: "jsvalidate_doc",
		defaultMessage: "accepted file types: doc, docx, pdf, ppt, pptx, txt, rtf, xls, xlsx.",
		regExp: /^(((.+)\.((doc)|(docx)|(xls)|(xlsx)|(pdf)|(ppt)|(pptx)|(DOC)|(DOCX)|(XLS)|(XLSX)|(PDF)|(PPT)|(PPTX)|(txt)|(TXT)|(rtf)|(RTF))+)+)?$/
	},
	doc2: {
		className: "jsvalidate_doc2",
		defaultMessage: "accepted file types: doc, docx, pdf, ppt, pptx, txt, rtf, xls, xlsx.",
		regExp: /^(((.+)\.((doc)|(docx)|(xls)|(xlsx)|(pdf)|(ppt)|(pptx)|(DOC)|(DOCX)|(XLS)|(XLSX)|(PDF)|(PPT)|(PPTX)|(txt)|(TXT)|(rtf)|(RTF))+)+)?$/
	},
	image: {
		className: "jsvalidate_image",
		defaultMessage: "accepted file types: gif, jpg, png.",
		regExp: /^(.*\.(gif|jpg|jpeg|png|GIF|JPG|JPEG|PNG))*$/
	},
    html: {
        className: "jsvalidate_html",
        defaultMessage: "Accepted file types: htm, html.",
        regExp: /^(.*\.(htm|html|HTM|HTML))*$/
    },
    xls: {
        className: "jsvalidate_xls",
        defaultMessage: "Accepts only XLS files.",
        regExp: /^(.*\.(xls|XLS))*$/
    },
	required: {
		className: "jsvalidate_required",
		defaultMessage: "field is required.",
		regExp: /^(.+)$/
	},
	pass: {
		className: "jsvalidate_pass",
		defaultMessage: "Invalid password format. Use 6 to 32 characters, except spaces; case-sensitive.",
		regExp: /^[a-zA-Z0-9@*!^#]{6,32}$/
	},
	phone: {
		className: "jsvalidate_phone",
		defaultMessage: "must contain only numbers, no other special chars are allowed and should be between 9 to 20 digits.",
		regExp: /^([+]?([0-9]{9,20}))?$/
	},
	company: {
		className: "jsvalidate_company",
		defaultMessage: "Invalid format.",
		regExp: /^[a-zA-Z0-9 .&,/-]*$/
	},
	url: {
		className: "jsvalidate_url",
		defaultMessage: "Invalid format.",
		regExp: /^(.*)?$/
	},
	zipcode: {
		className: "jsvalidate_zipcode",
		defaultMessage: "Invalid format.",
		regExp: /^[a-zA-Z0-9 -]*$/
	},
	username_u: {
		className: "jsvalidate_username_u",
		defaultMessage: "Invalid format.",
		regExp: /^[a-zA-Z0-9_.]*$/
	},
	city: {
		className: "jsvalidate_city",
		defaultMessage: "Invalid format.",
		regExp: /^[a-zA-Z ,./-]*$/
	},
    keywords: {
        className: "jsvalidate_keywords",
        defaultMessage: "You must use maximum 250 characters(letters,numbers,space,coma).",
        regExp: /^[a-zA-Z0-9 ,]{0,250}$/
    },
    state: {
        className: "jsvalidate_state",
        defaultMessage: "You must use at least 2 characters or leave it blank.",
        regExp: /(^(.){2,}$)|(^$)/
    },
	discount: {
        className: "jsvalidate_discount",
        defaultMessage: "invalid value",
        regExp: /^[0-9]{0,3}$/
    },
    weburl: {
        className: "jsvalidate_weburl",
        defaultMessage: "invalid url.",
        regExp: /^http\:\/\/[a-zA-Z0-9\-\.]+\.[a-zA-Z]{2,3}(\/\S*)?$/
    },
    embed: {
        className: "jsvalidate_embed",
        defaultMessage: "invalid code.",
        regExp: /^<(object|iframe)(.)+<\/(object|iframe)>$/
    }
};


function blurAction(field_reference,form_ref){
	var field_name;
	var the_result = true;
	var these_options = eval("({})");
	var isRadio = false;
	
	field_reference = document.forms[form_ref].elements[field_reference];
	
	if(typeof field_reference.nodeType == "undefined"){
		the_field = (field_reference[0].getAttribute('name')) ? field_reference[0].getAttribute('name') : field_reference[0].getAttribute('id');
		isRadio = true;
	} else {
		the_field = (field_reference.getAttribute('id')) ? field_reference.getAttribute('id') : field_reference.getAttribute('name');
	}
	
	if(isRadio){
		classes = "";
		for(r=0; r < field_reference.length; r++){
			classes += field_reference[r].className + " ";
		}
	} else {
		classes = field_reference.className;
	}
	var validation_message = '';
		
	if(classes){
		if(classes.indexOf("{") > -1 && classes.indexOf("}") > -1){
			these_options = extractOptions(classes);
			classes = classes.replace(these_options,"");
			these_options = eval("(" + these_options + ")");
		}
		classes.trim();
		classes = RemoveDuplicates(classes);
		classes = classes.split(" ");
		var bad_field = false;
		
		errorIDPrefix = (isset(these_options['errorIDPrefix'])) ? these_options['errorIDPrefix'] : js_options['errorIDPrefix'];
		for(c=0; c < classes.length; c++){
			field_name = errorIDPrefix + '_' + the_field;
			field_name = field_name.trim();
			
			for(items in custom_validators){
				if(classes[c] == custom_validators[items]['className']){
					var thisRegExp = custom_validators[items]['regExp'];
					
					if(field_reference.tagName == 'TEXTAREA'){
                                           // tinyMCE.triggerSave();
					    //field_reference.innerHTML = encodeURI(tinyMCE.getInstanceById(the_field).getDoc().body.innerHTML);
						//alert('lala');
                        //field_reference.value = field_reference.innerHTML;
					}
					if(isset(formExamples[the_field]))
					 if(field_reference.value == formExamples[the_field])
						field_reference.value = '';
					
					if(field_reference.type == 'select-one' && field_reference.type != 'select-multiple'){
						field_reference.value.replace(/\s/g,' ');
					    field_reference.value = field_reference.value.trim();
                    }

					//alert(field_reference.name + '   '+ thisRegExp.test(field_reference.value));
					if(field_reference.type != 'file' && field_reference.type != 'select-multiple'){
                        field_reference.value = field_reference.value.replace(/\s/g,' ');
                        field_reference.value = field_reference.value.trim();
                    }
					
					//if($('[name=\''+field_name.substring(12,field_name.length)+'\']').is(':visible') || $('[name=\''+field_name.substring(12,field_name.length)+'\']').length==0) {
						
                        if(!thisRegExp.test(field_reference.value)){
							if(field_name=='jsvalidator_p_video_url' || field_name=='jsvalidator_p_video_embed'){
								if($('[name=\''+field_name.substring(12,field_name.length)+'\']').is(':visible') && field_reference.value!=''){
									bad_field = true;
									if(validation_message == ""){
										validation_message = custom_validators[items]['defaultMessage'];
									} else {
										validation_message = custom_validators[items]['defaultMessage'] + ' ' + validation_message.charAt(0).toUpperCase() + validation_message.slice(1);
									}
								}
							}else{
								bad_field = true;
								if(validation_message == ""){
									validation_message = custom_validators[items]['defaultMessage'];
								} else {
									validation_message = custom_validators[items]['defaultMessage'] + ' ' + validation_message.charAt(0).toUpperCase() + validation_message.slice(1);
								}
							}
						}
					//}
					//mandatory checkboxes
					if(field_reference.getAttribute('type') == 'checkbox' && field_reference.checked == false && classes[c] == 'jsvalidate_required'){
						bad_field = true;
						if(validation_message == ""){
							validation_message = custom_validators[items]['defaultMessage'];
						} else {
							validation_message = custom_validators[items]['defaultMessage'] + ' ' + validation_message;
						}
					}
				}
			}
		}
		//alert(field_name + " " + bad_field);
   		if(bad_field){
			var error_text='';
			
			field_name=field_name.replace("[]","");
			var field_desc=$('#'+field_name).parents('.row').find('label').html();
			
			if(field_desc!=null){
				field_desc=field_desc.split('<');
				field_desc=field_desc[0];
			}else{
				field_desc='';
			}
			var nr_er=$('.err_inner p').length+1;
			if(field_reference.type == 'select-one' || field_reference.type == 'select-multiple'){
				var input_name=field_name.substring(12,field_name.length)+'[]';
			}else{
				var input_name=field_name.substring(12,field_name.length);
			}
			error_text+='<p>'+nr_er+'. '+'<a href=\'#\' name=\''+input_name+'\'>'+field_desc+'</a> '+validation_message+'</p>';
			$('.err_inner').append(error_text);
			//close_error_box();
			error_focus();
   		} else if(bad_field == false) {
   			var bad = document.getElementById(field_name);
   			if (bad)
   				bad.style.visibility = 'hidden';
   		}
	}
	return bad_field;
}


function doSubmit(form_name) {
	var forms = new Array();
	forms[0] = document.forms[form_name];
	var attachIt;
	var fields;
	var j;
	var done = true;
	var field_failed = false;
	if($('.err_inner').length>0){
		$('.err_inner').html('');
	}
	$('.notif_error').css("display","none");
		
	if(forms.length >= 1){
		for(var i=0; i < forms.length; i++){
			form_name = forms[i].cloneNode(false).getAttribute('name');
			if(form_name){
				fields = getFields(form_name,"name");
			} else {
				fields = getFields(forms[i].getAttribute('id'),"id");
			}
			for(j=0; j < fields.length; j++){
				if(fields[j].getAttribute('name') && (!fields[j].disabled)){
					field_name = fields[j].getAttribute('name');
					field_failed = blurAction(field_name,form_name);
					if(!field_failed){
						if(need_extra_validation.inArray(field_name)){
							field_failed = doExtraValidation(fields[j]);
						}
					}
					if(field_failed){
						done = false;
					}
					
					
					
				}
			}
		}
	}
	if($('.jsvalidate_checkboxes').length>0){	
if($('.multiple_check_boxes :checked').size()==0){
				var field_desc=$('.multiple_check_boxes').parents('.row').find('label').html();
				
				if(field_desc!=null){
					field_desc=field_desc.split('<');
					field_desc=field_desc[0];
				}else{
					field_desc='';
				}
				
				var nr_er=$('.err_inner p').length+1;
				input_name=$('.multiple_check_boxes :checkbox:first').attr('name');
				var er_text='<p>'+nr_er+'. '+'<a href=\'#\' name=\''+input_name+'\'>'+field_desc+'</a> you must select at least one.</p>';
				$('.err_inner').append(er_text);
				error_focus();
				done=false;
		}
	}
	
	var error_nr=$('.err_inner p').length;

	if(error_nr==0){
		$('.notif_error').css("display","none");
	}else{
		$('.notif_error').css("display","block");
	}
					
					
	if(error_nr==1){
		$('.err_inner').prepend('<h5>We encountered <span>'+error_nr+'</span> error</h5>');
	}else if(error_nr>1){
		$('.err_inner').prepend('<h5>We encountered <span>'+error_nr+'</span> errors</h5>');
	}
	
	
	if(done) {
                if ($('.blue_button').length)
                    $('.blue_button').attr('disabled', 'disabled');
                if ($('.blue_button_no_space_large').length)
                    $('.blue_button_no_space_large').attr('disabled', 'disabled');
                if ($('.blue_button_no_space').length)
                    $('.blue_button_no_space').attr('disabled', 'disabled');
		return document.forms[form_name].submit();
	} else {
		$('a.advanced_search').focus();
		return false;
	}
}

function doExtraValidation(field) {
	var failed = false;
	var field_name = field.getAttribute('name');
	var field_value = field.value;
	var validation_message = '';
	
	
	switch(field_name){
            case "c_other_text":
                if($("#c_other_input").attr("checked")==true && field_value.length<3){
                    validation_message = other_errors[field_name];
                    field.value = '';
                    failed = true;
                }
            break;
		case "pass2": 
			if(!checkRetypePass()) {
				validation_message = other_errors[field_name];
				field.value = '';
				failed = true;
			}
			break;
        case "text":
        case "text_id":
        case "p_description":
            if(field.tagName == 'TEXTAREA') {
					     tinyMCE.triggerSave();
					     field_value = tinyMCE.getInstanceById(the_field).getDoc().body.innerHTML;
            }
            if(!checkText(field_value, 100, 1000)) {
                validation_message = other_errors[field_name];
                failed = true;
            }
            break;
        case "message":
        case "r_message":
            if(field.tagName == 'TEXTAREA') {
					     tinyMCE.triggerSave();
					     field_value = tinyMCE.getInstanceById(the_field).getDoc().body.innerHTML;
            }
            //if(!checkText(field_value, 50, 1000)) {
            if (field_value.length<50) {
                validation_message = other_errors[field_name];
                failed = true;
            }
            break;
        case "text10": 
            if(field.tagName == 'TEXTAREA') {
					     tinyMCE.triggerSave();
					     field_value = tinyMCE.getInstanceById(the_field).getDoc().body.innerHTML;
            }
            if(!checkText(field_value, 10, 1000)) {
                validation_message = other_errors[field_name];
                failed = true;
            }
            break;
		case 'city':
			if(document.getElementById('company')) {
    			var company = document.getElementById('company').value;
    			field_value += '!' + company;
    			failed = doServerValidation(field_name, field_value);
    			//company exists; go back to signup 
    			if(failed){
    				document.forms['cnameform'].c_name.value = company;
    				return document.forms['cnameform'].submit();
    			} else {
    			    failed = doServerValidation(field_name+'_mark', field_value);
    			    if(failed)
    			        validation_message = other_errors[field_name+'_mark'];
    			}
    		}
			break;
		case 'c_cityAdmin':
			if(document.getElementById('c_nameAdmin')) {
    			var company = document.getElementById('c_nameAdmin').value;
    			field_value += '!' + company;
    			failed = doServerValidation(field_name, field_value, 1);
    			//company exists; 
    			if(failed){
    				document.forms['adminAddCompany'].c_nameAdmin.value = company;
					validation_message = other_errors[field_name];
    			}
    		}
			break;
		case 'c_cityAdminEdit':
			if(document.getElementById('c_nameEdit')) {
    			var company = document.getElementById('c_nameEdit').value;
    			field_value += '!' + company + '!' + document.getElementById('id').value;
    			failed = doServerValidation(field_name, field_value, 1);
    			//company exists; 
    			if(failed){
    				document.forms['adminEditCompany'].c_nameEdit.value = company;
					validation_message = other_errors[field_name];
    			}
    		}
			break;
		case 'c_cityAdminEdit':
			if(document.getElementById('c_nameEdit')) {
    			var company = document.getElementById('c_nameEdit').value;
    			field_value += '!' + company + '!' + document.getElementById('id').value;
    			failed = doServerValidation(field_name, field_value, 1);
    			//company exists;  
    			if(failed){
    				document.forms['adminEditCompany'].c_nameEdit.value = company;
					validation_message = other_errors[field_name];
    			}
    		}
			break;
		case 'u_usernameEdit':
			if(document.getElementById('u_usernameEditH').value != document.getElementById('u_usernameEdit').value){
				failed = doServerValidation('u_username' + document.getElementById('userData').value, field_value, 1);
				validation_message = other_errors[field_name];
			}
            break;
		case 'u_emailEdit':
			if(document.getElementById('u_emailEditH').value != document.getElementById('u_emailEdit').value){
				failed = doServerValidation('u_email' + document.getElementById('userData').value, field_value, 1);
				validation_message = other_errors[field_name];
			}
            break;
		case 'adminEmailEdit':
			field_value += '!' + document.getElementById('adminNameEdit').value + '!' + document.getElementById('cid').value;
            failed = doServerValidation(field_name, field_value, 1);
            //email already exists 
            validation_message = other_errors[field_name];
            break;
        case 'adminMarkEmailEdit':
            field_value += '!' + document.getElementById('cid').value;
            failed = doServerValidation(field_name, field_value, 1);
            //email already exists 
            validation_message = other_errors[field_name];
            break;
		case 'u_usernameMA':
		case 'u_emailMA':
		case 'u_usernameAdmin':
		case 'u_emailAdmin':
		case 'c_webAdmin':
		case 'adminName':
		case 'adminEmail':
		case 'markAdminEmail':
		case 'markAdminName':
			failed = doServerValidation(field_name, field_value, 1);
			validation_message = other_errors[field_name];
			break;
        case 'pe_name':
        case 'rfqe_name':
        case 'newse_name':
            field_value += '!' + document.getElementById('id').value;
            failed = doServerValidation(field_name, field_value, 1);
            validation_message = other_errors[field_name];
            break;
            case 'captcha':
                var captcha_extra = document.getElementById('captchaid').value;
                failed = doServerValidation(field_name, field_value, 0, captcha_extra);
			validation_message = other_errors[field_name];
			break;
            break;
		default:
			if($('input[name=\''+field_name+'\']').hasClass('no_db_valid')){
				failed=false;
			}else{
				failed = doServerValidation(field_name, field_value);
				validation_message = other_errors[field_name];
			}
			break;
	}
	
	if(failed) {
		field_name = js_options['errorIDPrefix']+'_'+field_name;
		var error_text='';
		var field_desc=$('#'+field_name).parent().find('label').html();
		if(field_desc!=null){
			field_desc=field_desc.split('<');
			field_desc=field_desc[0];
		}else{
			field_desc='';
		}
		var nr_er=$('.err_inner p').length+1;
		var input_name=field_name.substring(12,field_name.length);
		error_text+='<p>'+nr_er+'. '+'<a href=\'#\' name=\''+input_name+'\'>'+field_desc+'</a> '+validation_message+'</p>';
		$('.err_inner').append(error_text);
		//close_error_box();
		error_focus();
		//document.getElementById(field_name).style.visibility = 'visible';
		//document.getElementById(field_name).innerHTML = validation_message;
		//document.getElementById(field_name).style.color = '#f00';
	}
	return failed;
}

function doServerValidation(name, value, admin, extra) {
	var vUrl;
	vUrl = secureURL + "/services/validate?value=";
	var url = vUrl + URLEncode(value) + "&type=" + name;
        if (extra)
            url += '&extra='+extra;
	var req = getXMLHTTP();
	req.open('get', url, false); //third parameter is set to false here
	req.send(null);
	response = req.responseText;
	if(response == 'false')
		return true;
	else if(response == 'true')
		return false;
	else 
		return true;
}

function getFields(formref,type){
	var els;
	if(type == "name"){
		els = document.forms[formref].elements;
	}
	if(type == "id"){
		els = Form.getElements(formref);
	}
	return els;	
}

function checkRetypePass(){
	var pass = document.getElementById('pass').value;
	var pass2 = document.getElementById('pass2').value;
	if(pass2 == pass){
		return true;
	}else{
		return false;
	}
}

function checkText(text, min, max){
    var r = 0;
	text = text.replace(/\s/g,' ');
	text = text.split(' ');
	for (z=0; z<text.length; z++) {if (text[z].length > 0) r++;}
	if(r >= min && r <= max)
	   return true;
	return false;
}


