﻿

function inputfilter_init()
{
	$$('input[type="text"]').each(
	    function (input) { 
	    	input = $(input);
	    	var vt = input.getAttribute("validationtype");
            if (vt != null) 
            {
            	if (vt != 'split')
            	{
            	input
				    .observe("keydown", NumericInput_OnKeyDown)
				    .observe("keyup", NumericInput_OnKeyUp)
				    .observe("blur", NumericInput_OnBlur)
				    .observe("focus", NumericInput_OnFocus) 
				    .observe("change", NumericInput_OnChange); 
		        }else{
				    var portions = input.getAttribute('portions');
				    if (portions != null)
				    {
					    var p = portions.split(",");
					    var wrapper = new Element('div');
					    var seperatorCharacters = (input.getAttribute('seperatorChar')?input.getAttribute('seperatorChar'):'');
					    if(seperatorCharacters != '' && input.value != '') var cv = input.value.split(seperatorCharacters);     					
					    if(cv==undefined && input.value.length > 0 && input.value.indexOf(seperatorCharacters) == 0)
					    {
    					        var n = 0;
    					        var t = input.value.toArray()
    					        cv = [];
    					        p.each(function(ps,i){
    					            ps = ps.parseInt();
    					            cv.push(t.slice(n,n+ps).join(''));
    					            n+=ps;
    					        });  
					    }
					    input.insert({ before: wrapper }).remove();
					    wrapper.insert(new Element('input', { type:'hidden', id:input.id, name:input.name, 'seperatorChar':seperatorCharacters }));
					    
					    p.each(function(ps,i){
						    if (i == p.size()-1)
						    {
							    var section = new Element('input', { type:'text', id:input.id + '_' + (i+1), name:input.name + '_' + (i+1), size:ps, length:ps, maxlength:ps });
						    }else{
							    var section = new Element('input', { type:'text', id:input.id + '_' + (i+1), name:input.name + '_' + (i+1), size:ps, length:ps});
						    }
						    if(cv && cv.length > i) section.value = cv[i].substring(0,ps);
						    section.addClassName('autowidth').observe('keydown',NumericInput_OnKeyDown).observe('keyup',NumericInput_OnKeyUp).observe('change',SplitInput_OnChange).observe('keydown',SplitInput_KeyDown);
 						    wrapper.insert(section);
						    if (i != p.size()-1) wrapper.insert(new Element('span', { className:'seperator' }).update(seperatorCharacters));
					    });
				    }
		        }
		    }
	     });
}
var lastHighlight;
function SplitInput_KeyDown(e)
{
       var key = (e.keyCode)?e.keyCode:(e.which)?e.which:undefined;
	if (key != undefined) {
		if (key != 8)
		{
			if ((this.value.length+1) > this.getAttribute('length') && key != 9)
			{
				var ni = this.next('input[type=text]');
				if (ni != null)
				{
					ni.focus();
					setCaretPos(ni,ni.value.length);
				}
			}
			if (key == 9)
			{
				var ni = this.next('input[type=text]');
				if (ni != null)
				{
					ni.focus();
					setCaretPos(ni,ni.value.length);
					e.stop();		
				}
			}
		}else{
			if (key == 8)
			{
				//backspace
				if (getCaretPos(this) == 0)
				{
					var pi = this.previous('input[type=text]');
					if (pi != null)
					{
						pi.focus();
						setCaretPos(pi,pi.value.length);
						e.stop();
					}
				}
			}
		}
	}
}

function SplitInput_OnChange(e)
{
	//filter inputs
	var validatorRegEx = new RegExp("^([0-9]*)$");
	var numRegEx = new RegExp("[0-9]*","g");		
	this.up().select('input[type=text]').each(function (ps) {
		var ns = ps.value;
		var OK = validatorRegEx.test(ns);
		if (!OK)
		{
			var matches = ns.match(numRegEx);
			ns = matches.join("");
			ps.value = ns;
		}
	});
	//inputs have been filtered
	//divy up the paste content
	if ((this.value.length) > this.getAttribute('length'))
	{
		var content = this.value;
		var l = this.getAttribute('length')
		this.value = content.substring(0,l);
		content = content.substring(l,content.length-l);
		var ci = this.next('input[type=text]');
		while(ci != null)
		{
			var l = ci.getAttribute('length');
			ci.value = content.substring(0,l);
			content = content.substring(l);		
			ci = ci.next('input[type=text]');
		}
		this.up().select('input[type=text]').last().focus();
	}

	var hf = this.up().select('input[type=hidden]').reduce();
	var seperator = (hf.getAttribute('seperatorChar')?hf.getAttribute('seperatorChar'):'');
	var items = this.up().select('input[type=text]').inject([], function (arr, p) { arr.push(p.value); return arr; });
	hf.value = items.join(seperator);
}
function formatCurrency(s)
{
    return s.toFixed(2).toString().split('').reverse().join('').replace(/(?=\d*\.?)(\d{3})/g,'$1,').split('').reverse().join('').replace(/^[\,]/,'')
}
function NumericInput_OnBlur(e)
{
	var srcElement = Event.element(e);
	var validationType = srcElement.getAttribute("validationtype");
	if (validationType == 'currency' && srcElement.value != '' && srcElement.value.toArray()[0] != '$')
	    srcElement.value = '$' + formatCurrency(srcElement.value.parseCurrency());	
	
}//123456789

function NumericInput_OnFocus(e)
{
	var srcElement = Event.element(e);
	var cp = getCaretPos(srcElement);
	var validationType = srcElement.getAttribute("validationtype");
	if (validationType == 'currency' && srcElement.value != '' && srcElement.value.toArray()[0] == '$') {
		srcElement.value = srcElement.value.substring(1);	
		setCaretPos(srcElement,cp-1);
	}
}
function NumericInput_OnChange(e)
{
	var srcElement = Event.element(e);
	var validationType = srcElement.getAttribute("validationtype");
	var ns = srcElement.value;
	if (validationType != null)
	{
		if (validationType == 'numeric')
		{
			var validatorRegEx = new RegExp("^([0-9]*)$");
			var OK = validatorRegEx.test(ns);
			if (!OK)
			{
				var numRegEx = new RegExp("[0-9]*","g");		
				var matches = ns.match(numRegEx);
				ns = matches.join("");
			}
		}
		else
		{
			if(validationType == 'decimal' || validationType == 'currency')
			{
				var dprx = "";
				var dp = srcElement.getAttribute("decimalPlaces");
				if (dp != null) dprx = "([.0-9]{1," + (new Number(dp)+1) + "})?$"
				var validatorRegEx = new RegExp("^([0-9]*)" + dprx);
				var OK = validatorRegEx.test(ns);
				if (!OK)
				{	
					var numRegEx = new RegExp("[0-9.]*","g");
					var matches = srcElement.value.match(numRegEx);
					ns = matches.join("");
					var allowedDp = srcElement.getAttribute("decimalplaces")
					if (srcElement.value.lastIndexOf(".") != -1) { 
						var dpc = ns.substr(ns.lastIndexOf(".")+1); 
						dp = dpc.length; 
						if (dp > allowedDp)
							ns = ns.replace("."+dpc, "." + dpc.substring(0,allowedDp));
					}
					srcElement.value = ns;
				}		
			}else{
				//new Insertion.Top($('debug'),'changed with validation<br/>');	
			}
		}
		//just to ensure the max length is not violated by a paste
		var ml = srcElement.getAttribute('maxlength');
		if(Prototype.Browser.IE && ml == '2147483647') ml = null; //ie fix
		srcElement.value = ns.substring(ml?ns.length-ml:0);
		
		//if there is a min/max attribute
		var minV = srcElement.getAttribute('minvalue');
		var maxV = srcElement.getAttribute('maxvalue');
		if (minV!=null && parseInt(srcElement.value) < minV) srcElement.value = minV;
        if (maxV!=null && parseInt(srcElement.value) > maxV) srcElement.value = maxV;
	}
}
function getCaretPos(oField)
{
	var iCaretPos = 0;
	if (Prototype.Browser.IE)
	{
		var oSel = document.selection.createRange();
		oSel.moveStart ('character', -oField.value.length);
		iCaretPos = oSel.text.length;
	}else{
	 iCaretPos = oField.selectionEnd;
	}
	return iCaretPos;
}
function setCaretPos(oField, iCaretPos)
{
	if (Prototype.Browser.IE)
	{
		var oSel = document.selection.createRange();
		oSel.moveStart('character', -oField.value.length);
		oSel.moveStart('character', iCaretPos);
		oSel.moveEnd('character', 0);
		oSel.select();
	}else{
		oField.selectionStart = iCaretPos;
		oField.selectionEnd = iCaretPos;
		oField.focus();
	}
}
var ctrlKey = false;
function NumericInput_OnKeyUp(e)
{
    var key = (e.keyCode)?e.keyCode:(e.which)?e.which:undefined;
	if (key != undefined) {
		if (key == 17)
		{
			//user releasing ctrl
			ctrlKey = false;
		}
	}
}
function NumericInput_OnKeyDown(e)
{
        var key = (e.keyCode)?e.keyCode:(e.which)?e.which:undefined;
	    if (key != undefined) {
		    if (key==17)
		    {
			    //user pressing ctrl
			    ctrlKey = true;
			    return;
		    }
		    if (ctrlKey && (key == 86 || key == 67 || key == 88))
		    {
			    //ctrl + xcv
			    return;
		    }
		    var srcElement = Event.element(e);
		    var validationType = srcElement.getAttribute("validationtype");
		    var dp = 0; 
		    var allowedDp = srcElement.getAttribute("decimalplaces")
		    if (srcElement.value.lastIndexOf(".") != -1) dp = srcElement.value.substr(srcElement.value.lastIndexOf(".")+1).length + 1;
		    var ml = srcElement.getAttribute('maxlength');
		    if(Prototype.Browser.IE && ml == '2147483647') ml = null; //ie fix
		    if (ml == null || (ml != null && srcElement.value.length <= ml))
		    {
		        if (getSel(srcElement) == '')
		        {
			    if ((validationType == 'currency' || validationType == 'decimal') && dp > allowedDp) //check it's length of decimal places
				    if (srcElement.value.lastIndexOf(".") < getCaretPos(srcElement))
					    if (key<8||key>9) //if not tab/backspace
						    if (!(key >= 35 && key <= 40) && key != 46 && key != 116)  //if not arrows, home, end, delete, f5
							        failedValidation(e,key,srcElement);
			    if (key<8||key>9) //if not tab/backspace
				    if (!(key >= 35 && key <= 40) && key != 46 && key != 110) //if not arrows, home, end, delete, num pad .
			               if (key<48||(key>57 && !(key >= 96 && key <=105)) ||e.shiftKey) //if not a number and shift not pressed (symbols)
					            if ((validationType != "decimal" && validationType!= "currency") || (validationType == 'decimal' && (key == 190 || key == 110) && !srcElement.value.toArray().select(function (c) { return c=="."; }).length == 0) || (validationType == 'decimal' && key != 190) || (validationType == 'currency' && key == 190 && !srcElement.value.toArray().select(function (c) { return c=="."; }).length == 0) || (validationType == 'currency' && key != 190))
						            failedValidation(e,key,srcElement);
		       }else{
			    if (key<8||key>9) //if not tab/backspace
				    if (!(key >= 35 && key <= 40) && key != 46 && key != 110 && key != 116) //if not arrows, home, end, delete, num pad ., f5
			               if (key<48||(key>57 && !(key >= 96 && key <=105)) ||e.shiftKey) //if not a number and shift not pressed (symbols)
					    failedValidation(e,key,srcElement);
		       }						        
		    }else{
			    if(srcElement.value.length <= ml) failedValidation(e,key,srcElement);
		    }
	}
}
function failedValidation(e,key,srcElement)
{
	Event.stop(e);
	if (lastHighlight) lastHighlight.cancel();
	if (key >= 20) lastHighlight = new Effect.Highlight(srcElement, { duration: .5, startcolor:"#ff9999",endcolor:"#ffffff",restorecolor:"#ffffff"});
	return;
}
function getSel(oField)
{
	var caretInfo = getCaretInfo(oField);
	return oField.value.substring(caretInfo.start,caretInfo.end);
}

function getCaretInfo(oTextarea) {
	var docObj = oTextarea.ownerDocument;
	var result = {start:0, end:0, caret:0};
	
	if (navigator.appVersion.indexOf("MSIE")!=-1) {
		if (oTextarea.tagName.toLowerCase() == "textarea") {
			if (oTextarea.value.charCodeAt(oTextarea.value.length-1) < 14) {
				oTextarea.value=oTextarea.value.replace(/34/g,'')+String.fromCharCode(28);
			}
			var oRng = docObj.selection.createRange();
			var oRng2 = oRng.duplicate();
			oRng2.moveToElementText(oTextarea);
			oRng2.setEndPoint('StartToEnd', oRng);
			result.end = oTextarea.value.length-oRng2.text.length;
			oRng2.setEndPoint('StartToStart', oRng);
			result.start = oTextarea.value.length-oRng2.text.length; 
			result.caret = result.end;
			if (oTextarea.value.substr(oTextarea.value.length-1) == String.fromCharCode(28)) {
				oTextarea.value = oTextarea.value.substr(0, oTextarea.value.length-1);
			}			
		} else {
			var range = docObj.selection.createRange();
			var r2 = range.duplicate();			
			result.start = 0 - r2.moveStart('character', -100000);
			result.end = result.start + range.text.length;	
			result.caret = result.end;
		}			
	} else {
		result.start = oTextarea.selectionStart;
    	result.end = oTextarea.selectionEnd;
		result.caret = result.end;
	}
	if (result.start < 0) {
		 result = {start:0, end:0, caret:0};
	}	
	return result;
}