// operatedInput v0.2.8
// by Boiko A.S. aka Alex_B | admin@MaxAman-Soft.ru
// www.MaxAman-Soft.ru | http://joomlaforum.ru

/*вывод подсказок*/
function unmark2(elementID){
	var boxID = 'err_'+elementID;
	if (document.getElementById(boxID) != null){
		var box = document.getElementById(boxID);
		box.parentNode.removeChild(box);
		document.getElementById(elementID).className='';
	}
}
function mark2(elementID, HTMLtex){
	var target = document.getElementById(elementID);
	var boxID = 'err_'+elementID;
	if (document.getElementById(boxID) != null) unmark2(elementID);
	target.className='text_error';
	target.insertAdjacentHTML('afterEnd', '<span id='+boxID+'><br/>'+HTMLtex+ '</span>');
}

/*выделение в поле ввода*/
function setSelectionRange(element, start, end)
{
  if(end === undefined) end = start;
  // firefox
  if("selectionStart" in element)
  {
    element.setSelectionRange(start, end);
  }
  // ie win
  else if (document.selection && document.selection.createRange) {
  {
    var range = element.createTextRange();
    range.collapse(true);
    range.moveStart("character", start);
    range.moveEnd("character", end - start);
  }
  if (!window.opera) range.select();

}
}

/*поиск выделения в поле ввода*/
function getSelectionRange(element){
  var result = {start:-1, end:-1};

  // firefox
  if("selectionStart" in element)
    result = {start: element.selectionStart, end: element.selectionEnd};
  // ie win
  else if(document.selection)
  {
    // inputs only
    var range = document.selection.createRange();
    if(range.parentElement() == element)
    {
      var rangeS = range.duplicate();
      rangeS.moveEnd("textedit", 1);
      var rangeE = range.duplicate();
      rangeE.moveStart("textedit", -1);
      result = {start: element.value.length - rangeS.text.length, end: rangeE.text.length};
    }
  }

  return result;
}

/*визуализация маски*/
function visualizationMask(input,mask,replacementCharacter){
//	var input = document.getElementById(inputID);
	var shielded = false; //флаг экранированного символа
	var maskShant; //курсор в маске
	var maskLen = mask.length; //длинна маски
	var synchronizeMask = '';  //синхронизированная с полем ввода маска
   	for(maskShant =0; maskShant<maskLen; maskShant++){
		var rule = mask.charAt(maskShant); //символ в маске
		if((mask.charAt(maskShant-1)=='/') && (!shielded)){
			synchronizeMask += 'n';  //nonSpecial символ
			input.value += rule;
			if(input.setSelectionRange) {var end = input.value.length;input.setSelectionRange(end,end);}
			shielded = true;
		}
		else{
   			switch (rule){
   				case '/':
					shielded = false;
					break;

       			case '0':
					synchronizeMask += rule;
       				input.value += replacementCharacter;
					if(input.setSelectionRange) {var end = input.value.length;input.setSelectionRange(end,end);}
					break;

       			case 'R':
					synchronizeMask += rule;
       				input.value += replacementCharacter;
					if(input.setSelectionRange) {var end = input.value.length;input.setSelectionRange(end,end);}
					break;

				default:
					synchronizeMask += 'n';
					input.value += rule;
					if(input.setSelectionRange) {var end = input.value.length;input.setSelectionRange(end,end);}
					break;
   			}
		}
	}//end for
	return synchronizeMask;
}

/*определение символа синхронизированной маски соответствующего позиции курсора в поле ввода*/
function getMaskChar(input,synchronizeMask){
	return synchronizeMask.charAt(getSelectionRange(input).start);
}

/*анализ несимвольных клавиш (onkeydown)*/
function analysisKey(inputID,input,key,synchronizeMask,replacementCharacter){
	unmark2(inputID);
	var Selection = getSelectionRange(input);

	//нужно для перемещения между полями кнопкой tab
	if((Selection.end -Selection.start)>1){
		setSelectionRange(input, 0, 1);
		var Selection = getSelectionRange(input);
        var push = true;
				if (synchronizeMask.charAt(Selection.end) == ''){//если достигнут конец синхронизированной маски
					push = false;
					Selection = getSelectionRange(input);
					setSelectionRange(input,Selection.start-1,Selection.start);
				}
				while (push){
	    			setSelectionRange(input,Selection.end,Selection.end+1);
					if (getMaskChar(input,synchronizeMask) == 'n'){
						if (synchronizeMask.charAt(Selection.end+1) == ''){
							push = false;
							//сдвиг влево
							var push2 = true;
							while (push2){
								Selection = getSelectionRange(input)
		    	  				setSelectionRange(input,Selection.start-1,Selection.start);
								if (getMaskChar(input,synchronizeMask) == 'n'){Selection = getSelectionRange(input);push2 = true;}
								else{ push2 = false;}
							} //end сдвига влево
						}
						else{Selection = getSelectionRange(input);push = true;}
					}
					else{ push = false;}
				}
		Selection = getSelectionRange(input);
	}


//	var previousCharacter = input.value;//запомним предыдущий символ для backspace для Opera
	switch (key){
		case 37:  //left
			input.onkeyup = function(e){
				var push = true;
				if (synchronizeMask.charAt(Selection.start-1) == ''){//если достигнут конец синхронизированной маски
					push = false;
					Selection = getSelectionRange(input);
					setSelectionRange(input,Selection.end,Selection.end+1);
				}
				while (push){
	    			setSelectionRange(input,Selection.start-1,Selection.start);
					if (getMaskChar(input,synchronizeMask) == 'n'){
						if (synchronizeMask.charAt(Selection.start-1) == ''){
							push = false;
							//сдвиг вправо
							var push2 = true;
							while (push2){
		    	  				setSelectionRange(input,Selection.end,Selection.end+1);
								if (getMaskChar(input,synchronizeMask) == 'n'){Selection = getSelectionRange(input);push2 = true;}
								else{ push2 = false;}
							} //end сдвига вправо
						}
						else{Selection = getSelectionRange(input);push = true;}
					}
					else{ push = false;}
				}
			}
			break;

		case 39:  //right
			input.onkeyup = function(e){
				var push = true;
				if (synchronizeMask.charAt(Selection.end) == ''){//если достигнут конец синхронизированной маски
					push = false;
					Selection = getSelectionRange(input);
					setSelectionRange(input,Selection.start-1,Selection.start);
				}
				while (push){
	    			setSelectionRange(input,Selection.end,Selection.end+1);
					if (getMaskChar(input,synchronizeMask) == 'n'){
						if (synchronizeMask.charAt(Selection.end+1) == ''){
							push = false;
							//сдвиг влево
							var push2 = true;
							while (push2){
								Selection = getSelectionRange(input)
		    	  				setSelectionRange(input,Selection.start-1,Selection.start);
								if (getMaskChar(input,synchronizeMask) == 'n'){Selection = getSelectionRange(input);push2 = true;}
								else{ push2 = false;}
							} //end сдвига влево
						}
						else{Selection = getSelectionRange(input);push = true;}
					}
					else{ push = false;}
				}
			}
			break;

		case 46:  //del
			var start = Selection.start;
			var value =  input.value;
			var s = (window.opera) ? 0: 1;
			var left=value.substring(0,start);
			var right=value.substring(start+s);

            input.onkeyup = function(e){
    	        input.value = left+ replacementCharacter +right;
            	setSelectionRange(input,start,start+1);
            }
			break;

		case 9:  //tab
			break;

		case 16:  //shift
			break;

		case 17:  //ctrl
			break;

		case 18:  //alt
			break;

		case 8:  //backspace
			var start = Selection.start;
//			setSelectionRange(input,start-2,start-1);
			var value =  input.value;
			var s = (window.opera) ? 0: 1;
			var left=value.substring(0,start);
			var right=value.substring(start+s);


            input.onkeyup = function(e){
    	        input.value = left+ replacementCharacter +right;
            	var push = true;
				if (synchronizeMask.charAt(Selection.start-1) == ''){//если достигнут конец синхронизированной маски
					push = false;
					Selection = getSelectionRange(input);
					setSelectionRange(input,Selection.end,Selection.end+1);
				}
				while (push){
	    			setSelectionRange(input,Selection.start-1,Selection.start);
					if (getMaskChar(input,synchronizeMask) == 'n'){
						if (synchronizeMask.charAt(Selection.start-1) == ''){
							push = false;
							//сдвиг вправо
							var push2 = true;
							while (push2){
		    	  				setSelectionRange(input,Selection.end,Selection.end+1);
								if (getMaskChar(input,synchronizeMask) == 'n'){Selection = getSelectionRange(input);push2 = true;}
								else{ push2 = false;}
							} //end сдвига вправо
						}
						else{Selection = getSelectionRange(input);push = true;}
					}
					else{ push = false;}
				}
            }
			break;

		default:
			//непосредственно проверка ввода
			var permit = true;
			function doRule(e){
				if((Selection.end -Selection.start)!=1){return false;}
				var evt = e || window.event;
				var code = evt.charCode || evt.keyCode;
				var rule = getMaskChar(input,synchronizeMask);
                switch (rule){
					case '0':
						if ((code < 48) || (code > 57)){mark2(inputID,'ожидается цифра');permit = false;}
						break;

					case 'R':
						if ((code < 1040) || (code > 1103)){mark2(inputID,'ожидается русская буква');permit = false;}
						break;

                   default:
                   		permit = false;
						break;
                }
                return permit;
			}//end непосредственной проверки ввода
			input.onkeypress = doRule;

			input.onkeyup = function(e){
				input.onkeypress = null;
				if(permit){
					var push = true;
					if (synchronizeMask.charAt(Selection.end) == ''){//если достигнут конец синхронизированной маски
						push = false;
						Selection = getSelectionRange(input);
						setSelectionRange(input,Selection.start-1,Selection.start);
					}
					while (push){
		    			setSelectionRange(input,Selection.end,Selection.end+1);
						if (getMaskChar(input,synchronizeMask) == 'n'){
							if (synchronizeMask.charAt(Selection.end+1) == ''){
								push = false;
								//сдвиг влево
								var push2 = true;
								while (push2){
									Selection = getSelectionRange(input)
		    	  					setSelectionRange(input,Selection.start-1,Selection.start);
									if (getMaskChar(input,synchronizeMask) == 'n'){Selection = getSelectionRange(input);push2 = true;}
									else{ push2 = false;}
								} //end сдвига влево
							}
							else{Selection = getSelectionRange(input);push = true;}
						}
						else{ push = false;}
					}
				}

			}
			break;
	}
}

function operatedInput(inputID,mask,replacementCharacter){
	var input = document.getElementById(inputID);
	input.value = '';  //очистка поля ввода
	var synchronizeMask = visualizationMask(input,mask,replacementCharacter);  //визуализация маски

	input.onclick=setFocus;
	function setFocus(e){
		var Selection = getSelectionRange(input);
		var push = true;
				if (synchronizeMask.charAt(Selection.end) == ''){//если достигнут конец синхронизированной маски
					push = false;
					Selection = getSelectionRange(input);
					setSelectionRange(input,Selection.start-1,Selection.start);
				}
				while (push){
	    			setSelectionRange(input,Selection.end,Selection.end+1);
					if (getMaskChar(input,synchronizeMask) == 'n'){
						if (synchronizeMask.charAt(Selection.end+1) == ''){
							push = false;
							//сдвиг влево
							var push2 = true;
							while (push2){
								Selection = getSelectionRange(input)
		    	  				setSelectionRange(input,Selection.start-1,Selection.start);
								if (getMaskChar(input,synchronizeMask) == 'n'){Selection = getSelectionRange(input);push2 = true;}
								else{ push2 = false;}
							} //end сдвига влево
						}
						else{Selection = getSelectionRange(input);push = true;}
					}
					else{ push = false;}
				}
	}

	input.onkeydown = takeKey;
	function takeKey(e){
		var evt = e || window.event;
		var	key = evt.keyCode; //код клавиши
		analysisKey(inputID,input,key,synchronizeMask,replacementCharacter);  //анализ нажатой клавиши
		return true;
	}
}

/**by Thor Larholm me@jscript.dk**/
if(typeof HTMLElement!="undefined" && !
HTMLElement.prototype.insertAdjacentElement){
	HTMLElement.prototype.insertAdjacentElement = function
(where,parsedNode)
	{
		switch (where){
		case 'beforeBegin':
			this.parentNode.insertBefore(parsedNode,this)
			break;
		case 'afterBegin':
			this.insertBefore(parsedNode,this.firstChild);
			break;
		case 'beforeEnd':
			this.appendChild(parsedNode);
			break;
		case 'afterEnd':
			if (this.nextSibling)
this.parentNode.insertBefore(parsedNode,this.nextSibling);
			else this.parentNode.appendChild(parsedNode);
			break;
		}
	}

	HTMLElement.prototype.insertAdjacentHTML = function
(where,htmlStr)
	{
		var r = this.ownerDocument.createRange();
		r.setStartBefore(this);
		var parsedHTML = r.createContextualFragment(htmlStr);
		this.insertAdjacentElement(where,parsedHTML)
	}


	HTMLElement.prototype.insertAdjacentText = function
(where,txtStr)
	{
		var parsedText = document.createTextNode(txtStr)
		this.insertAdjacentElement(where,parsedText)
	}
}
