/*
 * Validator.js
 * data validation functions
 */

if(!String.prototype.startsWith){
    String.prototype.startsWith = function (str) {
        return !this.indexOf(str);
    }
}

function Validator(){
	
	this.phonenumbr = "^[0-9 ]*$";		//allows number with any number of spaces
	this.postcode 	= "^[A-Za-z]{1,2}\\d{1,2}[A-Za-z]?\\s?\\d[A-Za-z]{2}$";
	this.badChars 	= "[^0-9a-zA-Z_\\-\\'\\@\\.]*";
	this.sortcode 	= "^[0-9]{2}[-]{0,1}[0-9]{2}[-]{0,1}[0-9]{2}$";
	//rjd: better sortcode regex. allows "nn-nn-nn" and "nnnnnn"
	this.sortcode2	="^(\\d\\d\\d\\d\\d\\d|\\d\\d-\\d\\d-\\d\\d)$";
	this.sqlDate	="([0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))(T|\s)(([0-1][0-9])|(2[0-3])):([0-5][0-9]):([0-5][0-9]))|[0-9]{4}-(((0[13578]|(10|12))-(0[1-9]|[1-2][0-9]|3[0-1]))|(02-(0[1-9]|[1-2][0-9]))|((0[469]|11)-(0[1-9]|[1-2][0-9]|30)))";

	this.YRSFORPREVADDR = 3;

	//-------------------------------------
	// HasContent()
	//-------------------------------------
	this.HasContent = function(f){
		return !(f==null || f == "" || f=="null" || f=="undefined");
	};
	
	//-------------------------------------
	// IsNumber()
	//-------------------------------------
	this.IsNumber = function(f){
		if(!this.HasContent(f))
			return false;
		
		var stripped = f.replace("/[\(\)\.\-\ ]/g, ''");
		if(isNaN(parseInt(stripped)))
			return false;
		return true;
	};
		
	//-------------------------------------
	// RegexMatch() - test f against string
	// based regular expression
	//-------------------------------------
	this.RegexMatch = function(f,pattern){
		if(!this.HasContent(f))
			return false;
		
		var myregexp = new RegExp(pattern);
		return myregexp.test(f);			
	};
	
	//-------------------------------------
	// IsPhoneNum() - validate phone number
	//-------------------------------------
	this.IsPhoneNum = function(f){
		return this.RegexMatch(f,this.phonenumbr);
	};
	
	//-------------------------------------
	// IsSortCode() - validate sortcode
	//-------------------------------------
	this.IsSortcode =function(f){
		return this.RegexMatch(f,this.sortcode2);
	};
	
	//-------------------------------------
	// PrevAddressRequired()
	//-------------------------------------
	this.PrevAddressRequired = function(f){
		if(!this.IsNumber(f))
			return false;
		
		var years  = parseInt(f);
		return (years > this.YRSFORPREVADDR);	
	};
	
	//-------------------------------------
	// IsSqlDate() - 
	//-------------------------------------
	this.IsSqlDate = function(f){
		return this.RegexMatch(f, this.sqlDate);
		//return true;
	};
	
	//-------------------------------------
	// IsCTN() - 
	//-------------------------------------
	this.IsCTN = function(f){
		if(!this.HasContent(f))
			return false;
		var s = f.replace(" ","");
		return (this.RegexMatch(s,this.phonenumbr) && (s.length ==11 && s.startsWith("07")))
	};
	
	//----------------------------------------------------------------------------
	//IsSim() - validate a SIM number
	// 19 or 20 digit number
	// 12 digits for tmobile
	// 13 for orange
	// TODO: let the user specify what network we are testing for
	//----------------------------------------------------------------------------
	this.IsSim = function(f){
		if(!this.HasContent(f))
			return false;
		return (this.RegexMatch(f,this.phonenumbr) && (f.length==19 || f.length==20 || f.length==12 || f.length==13));

	};
	
	//------------------------------------------------------------------------
	// IsImei() - validate an imei
	// just a 15 digit number for now
	//------------------------------------------------------------------------
	this.IsImei = function(f){
		return (this.IsNumber(f) && f.length==15);
	};
	
	//------------------------------------------------------------------------
	// SqlDateToJs() - convert a yyyy-mm-dd sql date to a javascript one
	//------------------------------------------------------------------------
	this.SqlDateToJs = function(f){
		return new Date(f.replace(/[- ]/g,', '));
	};
};
