/*
* Плагин TextLimit
* использует библиотеку jQuery 1.3.2  и плагин jQuery.color 
* 
* версия 1.3
* Автор Андрей Борха diajelovic@gmail.com
*/
(function() {
	//плагин ограничения количества символов
	jQuery.fn.textLimit = function(options) {
		//опции планига по уполчанию
		var settings = jQuery.extend({
			maxSize: 50, //максимальное количество символов
			infoText: 'Доступно cимволов', //тект  в информационном боксе
			infoClass: 'infoLine', //класс для информационного бокса
			elemClass: 'textLimit', //класс добавляемый  к компоменту
			limitColor: '#ff0000', //цвет текста для информационного бокса при достижении лимита символов
			limitBackgroundColor: '#ffc0c0', //цвет фона для Поля при достижении лимита символов
			limitClass: 'limit', //класс добавляемый  к компоменту при достижении лимита
            coloredPersent: 0.2, //пороговый процент символов при котором начинается подсветка фона Поля
			color: '#000', //цвет информационного текста по умолчанию
			backgroundColor: '#fff' //цвет фона для поля по умолчанию
		}, options);
		
		//инициализация элемента
		function textLimitInit($obj){
            //установка дефолтного фона
			settings.backgroundColor = $obj.css('background-color');

			addInfo($obj);
            //проверка обрабатывать ли новую вводимую информацию
			$obj.keyup(function(){
				updateInfo($obj);
				return $obj.val().length < settings.maxSize; //если число символов не привышает максимальную позволить обработку
			})
            //проверка обрабатывать ли новую вводимую информацию
			$obj.keydown(function(event){
				var keyCode = event.keyCode;
				var allowedChars = [8, 16, 35, 36, 37, 38, 39, 40, 46];    //Backspace, delete, shift, home, end,  and arrow keys
				for(var x=0; x<allowedChars.length; x++){ if(allowedChars[x] == keyCode) {return true;}}; //если нажата одна из перечисленых выше клавиш  позволить обработку
                if(document.selection) if (document.selection.createRange().text.length > 0) return true; //проверка есть ли  выделенная область для IE
                if (this.selectionStart < this.selectionEnd) return true; //проверка есть ли  выделенная область
				return $obj.val().length < settings.maxSize; //если число символов не привышает максимальную позволить обработку
			})
            //проверка вставляется ли текст из буфера обмена
			$obj.bind('paste', function(){
				// Thanks Brian Crescimanno for the setTimeout
				setTimeout(function(){
					pasteText($obj)
				} , 300);
			});
		}
		
		//форматирование элемента
		function addInfo($obj){
			var text = $obj.val();
			var charsAvailible = settings.maxSize - text.length;
            var maxSizeAddColor = settings.maxSize * settings.coloredPersent;
            //добавление обертывающего бокса для компонента
			$obj.wrap('<div class="'+settings.elemClass+'"></div>').after('<div class="'+settings.infoClass+'">'+settings.infoText+' : '+charsAvailible+'</div>');
            //установка дефолтного цвета текста
            settings.color = $obj.next().css('color');
            //добавление оформления
			if (charsAvailible <= 0)
				$obj.css('background-color', settings.limitBackgroundColor).next().css('color', settings.limitColor).parent().addClass(settings.limitClass);
			if (charsAvailible <= maxSizeAddColor)
			{
				var bgColor = colorAnimate(settings.backgroundColor, settings.limitBackgroundColor, parseInt(100*(maxSizeAddColor - charsAvailible)/maxSizeAddColor));
				$obj.css('background', bgColor);
			}
		}

		//обновление информации
		function updateInfo($obj){
			var text = $obj.val();
			var charsAvailible = settings.maxSize - text.length;
            var maxSizeAddColor = settings.maxSize * settings.coloredPersent;
            //обновление оформления
			if (charsAvailible <= 0)
				$obj.next().css('color', settings.limitColor).parent().addClass(settings.limitClass);
			else
				$obj.next().css('color', settings.color).parent().removeClass(settings.limitClass);
			if (charsAvailible <= maxSizeAddColor)
			{
				var bgColor = colorAnimate(settings.backgroundColor, settings.limitBackgroundColor, parseInt(100*(maxSizeAddColor - charsAvailible)/maxSizeAddColor));
				$obj.css('background', bgColor);
			}
            else
                $obj.css('background', settings.backgroundColor);
			$obj.next().text(settings.infoText+' : '+charsAvailible);
		}

		//проверка вставки контента
		function pasteText($obj){
			if ($obj.val() > settings.maxSize+''){
				$obj.val($obj.val().substr(0,settings.maxSize));
			}
			updateInfo($obj);
		};
		
		//изменение цвета (процентый переход от одного цвета  в другой)
		function colorAnimate(fromColor, toColor, percent){
			var colors1 = $.RGB(fromColor);
			var colors2 = $.RGB(toColor);
			var colorsMix = colors1;
			for(var x=0; x<colors1.length; x++){ 
				colorsMix[x] = parseInt(colors1[x]) + parseInt((parseInt(colors2[x]) - parseInt(colors1[x]))*parseInt(percent)/100);
			};
			var result = 'rgb('+colorsMix[0]+', '+colorsMix[1]+', '+colorsMix[2]+')';
			return result;
		}

		return this.each(function(){
			if (this.tagName == 'INPUT' || this.tagName == 'TEXTAREA'){
				textLimitInit($(this));
			}
		});
};
})();
