// JavaScript Document
/**
*	Based largely on Will Jessup's jQuery form validator
*	http://www.willjessup.com/?p=9
*	removed most of the formatting issues from the front end so
*	it validates (no empty divs etc)
*	
*/
var val = new function() {
	$.fn.validate = {
        init: function(o) {
					switch(o.name){
						case 'compname': this.namepart(o,2,25); break;
						case 'infrastructure': this.namepart(o,2,25); break;
						case 'companyname': this.namepart(o,2,25); break;
						case 'busunit': this.namepart(o); break;
						case 'businessunit': this.namepart(o); break;
						case 'realname': this.namepart(o); break;
						case 'yourname': this.namepart(o); break;
						case 'jobtitle': this.namepart(o,2,25); break;
						case 'postaladdress': this.lengthcheck(o,2,125); break;
						case 'phonenumber': this.telephone(o); break;
						case 'email': this.email(o); break;
						default: doValidate(o);
					}
        },
        lengthcheck: function(o,min_len,max_len) {
          if (o.value.length == 0 || o.value.length < min_len || o.value.length > max_len ){
						doError(o,o.id + ' (' + o.value.length + ') must be longer than ' + min_len + ' characters and less than ' + max_len + ' characters.');
					} else {
						doValidate(o);
					}
        },
        username: function(o) {
          var user = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\>)+]/;
          if (!o.value.match(user)) {
						if (o.value.length < 6){
						doError(o,o.id + ' (' + o.value.length + ') must be longer than 6 characters');
						} else {
						doValidate(o);
						}
					} else {
						doError(o,'found{'+o.value.match(user)+'}, only a-z,A-Z,0-9,_,- characters allowed');
					};
        },
        namepart: function(o) {
          var user = /[0-9(\*\(\)\[\]\+\_\.\,\/\?\!\[\]\{\}\|\+\*\"\:\;\"\~\\#\$\%\^\&\<\>)+]/;
          if (!o.value.match(user)) {
						this.lengthcheck(o,1,35);//doValidate(o);
					} else {
						doError(o,'found{'+o.value.match(user)+'}, only a-z,A-Z,\',`,- and space characters allowed');
					};
        },
        password: function(o) {
          var pass = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\> )+]/;
					if (!o.value.match(pass)) {
						this.lengthcheck(o,6,100);//doValidate(o);
					} else {
						doError(o,'found{'+o.value.match(pass)+'}, only a-z,A-Z,0-9,_,- characters allowed');
					};
        },
        re_password: function(o) {
          var pass = /[(\*\(\)\[\]\+\.\,\/\?\:\;\'\"\`\~\\#\$\%\^\&\<\> )+]/;
					if (!o.value.match(pass)) {
						
							temp = o.id.split("_");
							if ($("#"+temp[1]).val() == o.value){
								this.lengthcheck(o,6,100);//doValidate(o);
							}else{
								doError(o,' passwords do not match');	
							}
						
					} else {
					doError(o,'only alpha-numeric,_ and - characters allowed');
					};
        },
        url: function(o) {
          var email  = /^(http:\/\/|https:\/\/)+(([a-zA-Z0-9\_\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
           if (o.value.match(email)) {
              this.lengthcheck(o,8,150);
            } else {
							if (o.value.length == 0){
								doValidate(o);
							}else{
              	doError(o,'not a valid url: http(s)://');
							}
            };
        },
        email: function(o) {
          var email  = /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/;
           if (o.value.match(email)) {
              doSuccess(o);
            } else {
              doError(o,'not a valid email');
            };
        },
        telephone: function(o) {
          var invalid  = /[A-Za-z(\*\(\)\[\]\_\.\,\/\?\!\[\]\{\}\|\*\"\:\;\"\~\\#\$\%\^\&\<\>)]/;
           if (!o.value.match(invalid)) {
              if (o.value.length != 10 ){
				  doError(o,'please include area code like: 0891235678');
			  }else{
				  doSuccess(o);
			  }
            } else {
              doError(o,'found{'+o.value.match(invalid)+'}, not a valid telephone number.');
            };
        },
        staff_id: function(o) {
          var staff_id  = /^([0-9]{6})([A-Z]{1})+$/;
           if (o.value.match(staff_id)) {
              this.lengthcheck(o,6,7);
            } else {
              doError(o,'found{'+o.value.match(staff_id)+'}, not a valid Staff id');
            };
        },
        permalink: function(o) {
          var valid_values = /[A-Z(\*\(\)\[\]\+\.\,\/\?\!\[\]\{\}\|\+\*\'\"\:\;\'\"\`\~\\#\$\%\^\&\<\> )+]/;
           if (o.value.match(valid_values) && o.value != 0) {
				doError(o,'found{'+o.value.match(valid_values)+'}, only a-z,0-9,_,- characters allowed.');
            } else {
              this.lengthcheck(o,0,70);//doValidate(o);//doSuccess(o);
            };
        },
        release_code: function(o) {
          var valid_values = /^([A-Z]{1})([0-9]{3})\/([0-9]{2})$/;
					//var valid_values = /[a-z(\*\(\)\[\]\+\.\,\?\!\[\]\{\}\_\-\|\+\*\'\"\:\;\'\"\`\~\\#\$\%\^\&\<\> )+]/;
           if (!o.value.match(valid_values)) {
							doError(o,'must be of the form: C123/56');
            } else {
              if (o.value.length != 7){
								doError(o,o.id + '  (' + o.value.length + ') must be 7 characters');
							} else {
								doValidate(o);//doSuccess(o);
							}
					};
        },
        dob: function(o) {
          var dob  = /(0[1-9]|1[012])+\/(0[1-9]|[12][0-9]|3[01])+\/(19|20)\d\d/;
            if (o.value.match(dob)) {
              doSuccess(o);
            } else {
              doError(o,'not a valid date');
            };
        }
     };

     function doSuccess(o) {
		$('#' + o.id).removeClass("error");
		//$('#' + o.id).removeClass("validate");
		$('#' + o.id).addClass("validated");
		$('#' + o.id).parent().find(".warning").remove();
		$('#' + o.id).parent().find(".loading").remove();
     }

     function doError(o,m) {
		//$('#' + o.id).removeClass("validate");
		$('#' + o.id).removeClass("validated");
		$('#' + o.id).addClass("error");
		$('#' + o.id).parent().find(".warning").remove();
		$('#' + o.id).parent().append('<span class="warning">'+m+'</span>');
		$('#' + o.id).parent().find(".loading").remove();
     }
     //private helper, validates each type after check
     function doValidate(o) {
		/*	Any validation where server-side support is needed
		*	this is business model functionality rather than
		*	light, client side functionality
		*/
		$.post('/resources/helpers/validate.php', { id: o.id, value: o.value }, function(json) {
		eval("var args = " + json);
		
		if (args.success == true){
			/*	test for duplication class in form element
			*	refer to duplicate checking serverside page */
			if (o.className.match("no_duplicate")){
				/* validate.cfm simply queries the database for a string match.
				*	this obviously needs to be a custom written component because I don't know
				*	what you're wanting to compare.  The thinking would be that your id name
				*	is the same as it is in the datasource, so you could simply do something like:
				*	"SELECT id FROM datasource WHERE #id# = '#value#'" (coldfusion) 
				*	or
				*	"SELECT id FROM datasource WHERE {$id} = '{$value}'" (php)
				*/
				$('#' + o.id).parent().prepend('<img class="loading" src="/admin/resources/images/loading.gif" border="0" style="float:left; margin-left:-25px;"/>');

				$(".form").each(function(){
					$.post('/resources/helpers/'+this.id+'/validate.php', { id: o.id, no_duplicate: true, value: o.value }, function(json) {
						eval("var args = " + json);
						if (args.success == true || duplicate_originals[o.id] == o.value){
							doSuccess(args);
						} else {
							doError(args,args.msg);
						}
					});/**/
				});

			} else {
				doSuccess(args);
			}
		} else {
			doError(args,args.msg);
		}
		});
    };

};