/*
 * wymagane elementy mootools
 * 
 
 */

/**
 * Sprawdza, czy jakikolwiek checkbox z grupy objetej
 * zadanym selektorem jest zaznaczony
 * @param selector string
 * @return boolean
 */


function stripHTML(text){
	var re= /<\S[^><]*>/g
	return text.replace(re, "");
}

function trim(text) {
	return text.replace(/^\s+|\s+$/g,"");
}

function validateIsAnyCheckboxChecked( selector ) {
	var anyChecked = false;
	$$('.'+selector).each(function(item){
		if ( item.checked ) {
			anyChecked = true;
		} 
	});
	return anyChecked;
}

var validator_defined = true;

var FormValidator = function(form, params)
 { 
 	this.form = form;
 	this.params = params;
	this.deleteField = function(field){
		delete this.params[field];
	};
	this.addEx = function(exParam){
		if(validator!=null){
			var ext = this.exceptions;
			isInside = false;
			for(var i=0;i<ext.length;i++){
				if(ext[i]==exParam){
					isInside = true;
				}
			}
			if(isInside==false){
				this.exceptions.push(exParam);
			}
		}		
	};
	this.removeEx = function(exParam){
		if(validator!=null){
			var ext = this.exceptions;
			this.exceptions = new Array();
			for(var i=0;i<ext.length;i++){
				if(ext[i]!=exParam){
					this.exceptions.push(ext[i]);
				}
			}
		}	
	};
 	document.getElementById(form).onsubmit = this.submitEvent;
 	document.getElementById(form).formValidator = this;
 }

//register validator
function $rv(name,validator)
{
 	FormValidator.prototype.validators[name] = validator;
}
 
FormValidator.prototype = {
	validators: {},
	exceptions: [],
	submitEvent: function(e)
	{
		//pamietaj this = form
		var params = this.formValidator.params;
		var complete = true;
		for(var i in params)
		{
			var doCheck = true;
			var p = params[i];
			if(this.formValidator.exceptions!=null){
				for(var x=0;x<this.formValidator.exceptions.length;x++)
				{
					if(i == this.formValidator.exceptions[x]){
						doCheck = false;
						break;
					}
				}
			}
			
			if(doCheck){
				if(!p.type || !p.error_field  || !p.error_message) {
					alert("Error!\nMissing reqired parameters for input field: " + i + "\nCheck if 'type', 'error_field' and 'error_message' are defined properly.");
					return false;
				}
			
				if(!this.formValidator.validators[p.type])
				{
					alert('No such validator type: '+p.type);
					return false;
				}
				var input = document.getElementById(i);
				var validator = this.formValidator.validators[p.type];
				validator.error = '';

				try{
					if(validator.checkValid(input,p) == false)
					{
						if(p.error_field != 'IGNORE')
						{
							var ef = document.getElementById(p.error_field);
							if(!ef)
							{
								alert("Error field not found");
								return false;
							}
							ef.innerHTML = validator.error;							
							$(ef).addClass('error-text');
						}
						$(input).addClass('error-input');
						complete = false;
					}else{
						if(p.error_field != 'IGNORE')
						{
							var ef = document.getElementById(p.error_field);
							ef.innerHTML = '';
							$(ef).removeClass('error-text');
						}
						$(input).removeClass('error-input');
					}
				}catch(ex)
				{
					alert(ex);
					return false;
				}
			}
		}
		return complete;
	}
}

$rv("tinymce",{
	checkValid: function(input,p)
	{
		var text = input.contentDocument.getElementsByClassName('mceContentBody');
		text = text[0].innerHTML;
		text = trim(stripHTML(text));
		if(p.min_length != undefined)
		{
			if(text.length < p.min_length)
			{
				this.error = p.error_message;
				return false;
			}
		}
		if(p.max_length != undefined)
		{
			if(text.length > p.max_length)
			{
				this.error = p.error_message;
				return false;
			}
		}
		if(p.only_string != undefined ) {
			myRe = new RegExp ("[^0-9]*");
			if ( text.length != myRe.exec( text )[0].length ) {
				this.error = p.error_message;
				return false;
			}
		}
		return true;
	}
});

$rv("string",{
	checkValid: function(input,p)
	{
		if(p.min_length != undefined)
		{
			if(input.value.length < p.min_length)
			{
				this.error = p.error_message;
				return false;
			}
		}
		if(p.max_length != undefined)
		{
			if(input.value.length > p.max_length)
			{
				this.error = p.error_message;
				return false;
			}
		}
		if(p.only_string != undefined ) {
			myRe = new RegExp ("[^0-9]*");
			//alert(myRe.exec( input.value )[0]);
			if ( input.value.length != myRe.exec( input.value )[0].length ) {
				this.error = p.error_message;
				return false;
			}
		}
		return true;
	}
});

$rv("password",{
	checkValid: function(input,p)
	{
		var input2 = document.getElementById(input.id+'Repeated');
		if(input.value != input2.value)
		{
			this.error = p.error_message_dont_match;
			return false;
		}
		if(p.min_length != undefined)
		{
			if(input.value.length < p.min_length)
			{
				this.error = p.error_message;
				return false;
			}
		}
		if(p.max_length != undefined)
		{
			if(input.value.length > p.max_length)
			{
				this.error = p.error_message;
				return false;
			}
		}
		return true;
	}
});

$rv("integer",{
	checkValid: function(input,p)
	{
		var isNumber = false;
		if(p.negative_allowed)
		{
			var isNumber = /^[+-]?\d+(\.\d+)?$/.test(input.value);			
		}else{
			var isNumber = /^\d+?$/.test(input.value);
		}

		if(!isNumber)
		{
			this.error = p.error_message;
			return false;
		}
		
		if(p.min_value)
		{
			if(parseInt(input.value) < parseInt(p.min_value))
			{
				this.error = p.error_message;
				return false;				
			}
		}
		
		if(p.max_value)
		{
			if(parseInt(input.value) > parseInt(p.max_value))
			{
				this.error = p.error_message;
				return false;				
			}
		}

		return true;
	}
})

$rv("double",{
	checkValid: function(input,p)
	{
		var isNumber = false;
		if(p.negative_allowed)
		{
			var isNumber = /^[-+]?\d+([\.\,]\d+){0,1}?$/.test(input.value);			
		}else{
			var isNumber = /^\d+([\.\,]\d+){0,1}?$/.test(input.value);
		}
		if(!isNumber)
		{
			this.error = p.error_message;
			return false;
		}
		var val = input.value;
		if(p.negative_allowed) val = val.replace('-','');

		if(p.min_value)
		{
			if(val < p.min_value)
			{
				this.error = p.error_message;
				return false;				
			}
		}
		if(p.max_value)
		{
			if(val > p.max_value)
			{
				this.error = p.error_message;
				return false;				
			}
		}
		return true;
	}
})

$rv("email",{
	checkValid: function(input,p){
		var re = /^([a-z0-9._-]+)@(([a-z0-9\-]+\.)+[a-z]{2,4})$/i;
    	if(!re.test(input.value))
    	{
			this.error = p.error_message;
			return false;				
    	}
    	return true;
	}
})

$rv("date",{
	isValidDate: function(dateStr, format) {
	   if (format == null) { format = "MDY"; }
	   format = format.toUpperCase();
	   if (format.length != 3) { format = "MDY"; }
	   if ( (format.indexOf("M") == -1) || (format.indexOf("D") == -1) ||
	      (format.indexOf("Y") == -1) ) { format = "MDY"; }
	   if (format.substring(0, 1) == "Y") { // If the year is first
	      var reg1 = /^\d{2}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	      var reg2 = /^\d{4}(\-|\/|\.)\d{1,2}\1\d{1,2}$/
	   } else if (format.substring(1, 2) == "Y") { // If the year is second
	      var reg1 = /^\d{1,2}(\-|\/|\.)\d{2}\1\d{1,2}$/
	      var reg2 = /^\d{1,2}(\-|\/|\.)\d{4}\1\d{1,2}$/
	   } else { // The year must be third
	      var reg1 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{2}$/
	      var reg2 = /^\d{1,2}(\-|\/|\.)\d{1,2}\1\d{4}$/
	   }
	   // If it doesn't conform to the right format (with either a 2 digit year or 4 digit year), fail
	   if ( (reg1.test(dateStr) == false) && (reg2.test(dateStr) == false) ) { return false; }
	   var parts = dateStr.split(RegExp.$1); // Split into 3 parts based on what the divider was
	   // Check to see if the 3 parts end up making a valid date
	   if (format.substring(0, 1) == "M") { var mm = parts[0]; } else
	      if (format.substring(1, 2) == "M") { var mm = parts[1]; } else { var mm = parts[2]; }
	   if (format.substring(0, 1) == "D") { var dd = parts[0]; } else
	      if (format.substring(1, 2) == "D") { var dd = parts[1]; } else { var dd = parts[2]; }
	   if (format.substring(0, 1) == "Y") { var yy = parts[0]; } else
	      if (format.substring(1, 2) == "Y") { var yy = parts[1]; } else { var yy = parts[2]; }
	   if (parseFloat(yy) <= 50) { yy = (parseFloat(yy) + 2000).toString(); }
	   if (parseFloat(yy) <= 99) { yy = (parseFloat(yy) + 1900).toString(); }
	   var dt = new Date(parseFloat(yy), parseFloat(mm)-1, parseFloat(dd), 0, 0, 0, 0);
	   if (parseFloat(dd) != dt.getDate()) { return false; }
	   if (parseFloat(mm)-1 != dt.getMonth()) { return false; }
	   return true;
   },
   
   checkValid: function(input,p){
   		var format = 'DMY';
   		if(p.date_format) format = p.date_format;
   		if(!this.isValidDate(input.value,format))
   		{
   			this.error = p.error_message;
			return false;				
    	}
    	return true;
   } 
});

$rv("ipaddr",{
	//Note that we use "parseInt(parseFloat(...))" for checking. If we just used "parseInt" then if the user entered "08" for the first part, the "parseInt" would return 0, which would fail even though the number is valid.
	isValidIPAddress: function(ipaddr) {
		   var re = /^\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}$/;
		   if (re.test(ipaddr)) {
		      var parts = ipaddr.split(".");
		      if (parseInt(parseFloat(parts[0])) == 0) { return false; }
		      for (var i=0; i<parts.length; i++) {
		         if (parseInt(parseFloat(parts[i])) > 255) { return false; }
		      }
		      return true;
		   } else {
		      return false;
		   }
	},
	
	checkValid: function(input,p){
		if(!this.isValidIPAddress(input.value))
		{
			this.error = p.error_message;
			return false;	
		}
		return true;
	}
})

$rv("creditcard",{
    luhn: function(cc) {
       	var sum = 0;
       	var i;
     
       	for (i = cc.length - 2; i >= 0; i -= 2) {
          sum += Array (0, 2, 4, 6, 8, 1, 3, 5, 7, 9) [parseInt (cc.charAt (i), 10)];
       	}
       	for (i = cc.length - 1; i >= 0; i -= 2) {
          sum += parseInt (cc.charAt (i), 10);
      	}
		return (sum % 10) == 0;
   	},
    getdigits: function(s) {
    	return s.replace (/[^\d]/g, "");
 	},
 	isValidCC: function(cctype, ccnumber) {
 		var creditCardList = [
			//type      prefix   length
			["amex",    "34",    15],
			["amex",    "37",    15],
			["disc",    "6011",  16],
			["mc",      "51",    16],
			["mc",      "52",    16],
			["mc",      "53",    16],
			["mc",      "54",    16],
			["mc",      "55",    16],
			["visa",    "4",     13],
			["visa",    "4",     16]
	 	];

	    var cc = this.getdigits (ccnumber);
	    if (this.luhn (cc)) {
	       for (var i in creditCardList) {
	          if (creditCardList [i][0] == (cctype.toLowerCase ())) {
	             if (cc.indexOf (creditCardList [i][1]) == 0) {
	                if (creditCardList [i][2] == cc.length) {
	                   return true;
	                }
	             }
	          }
	       }
	    }
	    return false;
	 },
	 checkValid: function(input,p){
		if(!this.isValidCC(input.value))
		{
			this.error = p.error_message;
			return false;	
		}
		return true;
	}
})

$rv("radio",{
	checkValid: function(input,p){
		if(!p['names']){alert('Podaj nazwy pól');return false;}
		var selected = false;
		p.names.each(function(item){
			if(document.getElementById(item).checked){
				selected = true;
			}
		})
		if(selected){return true;}
		else{
			this.error = p.error_message;
			return false;
		}
	}
})

$rv("checkbox",{
	checkValid: function(input,p){
		if(!p['names']){alert('Podaj nazwy pól');return false;}
		if(p['min_selected']==null||p['min_selected']<0){alert('Podaj minimalną ilość zaznaczonych pól');return false;}
		var selected = 0;
		p.names.each(function(item){
			if(document.getElementById(item).checked){
				selected+=1;
			}
		})
		if(selected>=p['min_selected']){return true;}
		else{
			this.error = p.error_message;
			return false;
		}
	}
})



