/**
 * @author lamtran
 */
function getIEVersionNumber() {
    var ua = navigator.userAgent;
    var MSIEOffset = ua.indexOf("MSIE ");
    
    if (MSIEOffset == -1) {
        return 0;
    } else {
        return parseFloat(ua.substring(MSIEOffset + 5, ua.indexOf(";", MSIEOffset)));
    }
}

var isIE7 = getIEVersionNumber() == 7;
var ErrorPopup = Class.create({
  initialize: function(orientation) {
  	if(orientation!=null){
	  	this.orientation=orientation;
	}else{
		this.orientation='left';
	}
  },

  show:function(message,target,offsetLeft){
	var offsetL = 0-($('error').getWidth());
	var offsetT = -19;
	/** ugly workaround for prototype's stupid ie7 clonePosition bug */
  	if(Prototype.Browser.IE && isIE7){
		offsetL -= 12;
	}
  	$('errorMessage').update(message);
	if(this.orientation=='up'){
		offsetL = (target.up(this.parent).getWidth()/2 -$('error').getWidth()/2);
		offsetT = target.up(this.parent).getHeight();
	}
	$('error').clonePosition(target.up(this.parent),{
		'setWidth': false,
		'setHeight': false,
		'setLeft': true,
		'setTop': true,
		'offsetLeft':offsetL,
		'offsetTop': offsetT
	});
	var pointer = $('error').select('.errorPointer')[0];
  	if(this.orientation=='up'){
		pointer.addClassName('errorPointerUp');
	}else{
		if(pointer.hasClassName('errorPointerUp')){
			pointer.removeClassName('errorPointerUp');
		}
	}
	$('error').show();
  },
  hide:function(){
  	$('error').hide();
  }
});
var clearHandle = null;
var Validator = Class.create({
	initialize: function(target,config){
		this.target = target;
		var configuration;
		if(config==null){
			configuration = {};
		}else{
			configuration = config;
		}
		this.errorPane = new ErrorPopup(configuration.orientation);
		if(configuration.parent!=null){
			this.parent = config.parent;;
		}else{
			this.parent = 'li';
		}
	},
	isBlank : function(errorMessage){
		clearTimeout(clearHandle);
		if($F(this.target).blank()){
			$(this.target).up(this.parent).removeClassName('valid');
			this.errorPane.show(errorMessage,$(this.target));
			throw Error(errorMessage);
		}
		return this;
	},
	startsWithFollowedByNumbersInRange : function(errorMessage,prefixes, range, rangeError){
		var hasPrefix = false;
		var value = $F(this.target);
		var prefixed = '';
		prefixes.each(function(prefix){
			if(value.toLowerCase().startsWith(prefix.toLowerCase())){
				hasPrefix=true;
				prefixed = prefix;
			}
		});
		var testString = $F(this.target).substring(prefixed.length,$F(this.target).length);
		
		if(!hasPrefix || testString == '' || /[^0-9]+/.test(testString) || !range.include(testString.length)){
			if(!range.include(testString.length) && hasPrefix){
				errorMsg = rangeError;
			}else{
				errorMsg = errorMessage;
			}
			$(this.target).up(this.parent).removeClassName('valid');
			this.errorPane.show(errorMsg,$(this.target));
			var tar = $(this.target);
			var scope = this;
			clearHandle = setTimeout(function(){
				tar.value='';
			},6000);
			throw Error(errorMessage);
		}
		return this;
	},
	isAlpha : function(errorMessage){
		if(/[^A-Za-z\s]+/.test($F(this.target))){
			$(this.target).up(this.parent).removeClassName('valid');
			this.errorPane.show(errorMessage,$(this.target));
			throw Error(errorMessage);
		}
		return this;
	},
	isNumeric: function(errorMessage){
		if(/[^0-9\s]+/.test($F(this.target))){
			$(this.target).up(this.parent).removeClassName('valid');
			this.errorPane.show(errorMessage,$(this.target));
			throw Error(errorMessage);
		}
		return this;
	},
	isEmail : function(errorMessage){
		if(!/^[A-Za-z0-9._%+-]+@[A-Za-z0-9.-]+\.[A-Za-z]{2,6}$/.test($F(this.target))){
			$(this.target).up(this.parent).removeClassName('valid');
			this.errorPane.show(errorMessage,$(this.target));
			throw Error(errorMessage);
		}
		return this;
	},
	isLengthMin : function(errorMessage,length){
		if($F(this.target).length<length){
			$(this.target).up(this.parent).removeClassName('valid');
			var myTemplate = new Template(errorMessage);
			var errorMessageEval = myTemplate.evaluate({
				length: $F(this.target).length
			});
			this.errorPane.show(errorMessageEval,$(this.target));
			throw Error(errorMessageEval);
		}
		return this;
	},
	isLengthMax : function(errorMessage,length){
		if($F(this.target).length>length){
			$(this.target).up(this.parent).removeClassName('valid');
			var myTemplate = new Template(errorMessage);
			var errorMessageEval = myTemplate.evaluate({
				length: $F(this.target).length
			});
			this.errorPane.show(errorMessageEval,$(this.target));
			throw Error(errorMessageEval);
		}
		return this;
	},
	isChecked : function(errorMessage){
		if($F(this.target)==null){
			$(this.target).up(this.parent).removeClassName('valid');
			this.errorPane.show(errorMessage,$(this.target));
			throw Error(errorMessage);
		}
		return this;
	},
	isUnique : function(errorMessage){
		if(Element.retrieve(this.target,'isUnique')!=null && Element.retrieve(this.target,'isUnique')==false){
			$(this.target).up(this.parent).removeClassName('valid');
			this.errorPane.show(errorMessage,$(this.target));
			throw Error(errorMessage);
		}
		return this;
	},
	clear : function(){
		$(this.target).up(this.parent).addClassName('valid');
		this.errorPane.hide();
	}
});
function showPopup(config){
	if(config==null){
		conf = {};
	}else{
		conf = config;
	}
	var windowDim = document.viewport.getDimensions();
	var windowScrolledOffset = document.viewport.getScrollOffsets();
	var popupDim = $('popup').getDimensions();
	var popup = $('popup');
	if(!conf.showHeader){
		popup.select('.panelHeader')[0].hide();
	}else{
		popup.select('.panelHeader')[0].show();
	}
	if(conf.message){
		popup.down('p').update(conf.message);
	}
	var leftOffset = windowDim.width/2 - popupDim.width/2 + windowScrolledOffset.left;
	var topOffset = windowDim.height/2 - popupDim.height/2 + windowScrolledOffset.top;
	popup.setStyle({'left':leftOffset+'px','top':topOffset+'px'});
	popup.show();
}

