(function ($) {
	$('html').addClass('js');
	Array.prototype.indexOf = function (obj, start) {
		for (var i = (start || 0); i < this.length; i++) {
			if (this[i] == obj) {
				return i;
			}
		}
	}
	$.fn.extend({
		getSetSSValue: function (value) {
			if (value) {
				$(this).val(value).change();
				alert(value);
				return this;
			} else {
				return selText = $(this).find(':selected').text();
			}
		},
		resetSS: function (value) {
			$this = $(this);
			$this.next().remove();
			if (value) $this.unbind().sSelect(value);
			else $this.unbind().sSelect();
		}
	});
	$.fn.sSelect = function (options) {
		return this.each(function () {
			var defaults = {
				defaultText: 'Изберете',
				animationSpeed: 0,
				ddMaxHeight: ''
			};
			var opts = $.extend(defaults, options),
			$input = $(this),
			$containerDivText = $('<div class="selectedTxt"></div>'),
			$containerDiv = $('<div class="newListSelected" tabindex="' + ($(this).attr('tabindex') != 'undefined' ? $(this).attr('tabindex') : 0) + '"></div>'),
			$newUl = $('<ul class="newList"></ul>'),
			itemIndex = -1,
			currentIndex = -1,
			keys = [],
			prevKey = false,
			newListItems = '',
			prevented = false;
			$containerDiv.insertAfter($input);
			$containerDivText.prependTo($containerDiv);
			$newUl.appendTo($containerDiv);
			$input.hide();

            $input.children().each(function (i) {
                if(this.tagName == 'OPTGROUP')
                {
                  
                    var optionTitle = $(this).attr('label');
					newListItems+='<li class="newListOptionTitle"><b>' + optionTitle + '</b></li>';
					$(this).children().each(function () {
                      ++itemIndex;
						var option = $(this).text();
						keys.push(option.charAt(0).toLowerCase());
						if ($(this).attr('selected') == true) {
                         
							opts.defaultText = option;
							currentIndex = itemIndex+i+1;
						}
						newListItems += '<li>' + option + '</li>';
					})
                }
                else
                {
                    var option = $(this).text();
					keys.push(option.charAt(0).toLowerCase());
					if ($(this).attr('selected') == true) {
						opts.defaultText = option;
						currentIndex = i;
					}
					newListItems += '<li>' + option + '</li>';
                }
					
			});
          
				$newUl.html(newListItems);
				newListItems = '';
				var $newLi = $newUl.children();

			/*if ($input.children('optgroup').length == 0) {
				$input.children().each(function (i) {
					var option = $(this).text();
					keys.push(option.charAt(0).toLowerCase());
					if ($(this).attr('selected') == true) {
						opts.defaultText = option;
						currentIndex = i;
					}
					newListItems += '<li>' + option + '</li>';
				});
				$newUl.html(newListItems);
				newListItems = '';
				var $newLi = $newUl.children();
			} else {
				$input.children('optgroup').each(function (i) {
					var optionTitle = $(this).attr('label'),
					$optGroup = $('<li class="newListOptionTitle"><strong>' + optionTitle + '</strong></li>');
					$optGroup.appendTo($newUl);
					var $optGroupList = $('<ul></ul>');
					$optGroupList.appendTo($optGroup);
					$(this).children().each(function () {++itemIndex;
						var option = $(this).text();
						keys.push(option.charAt(0).toLowerCase());
						if ($(this).attr('selected') == true) {
							opts.defaultText = option;
							currentIndex = itemIndex;
						}
						newListItems += '<li>' + option + '</li>';
					})
					$optGroupList.html(newListItems);
					newListItems = '';
				});
				var $newLi = $newUl.find('ul li');
			}*/


			var newUlHeight = $newUl.height() + 3,
			containerHeight = $containerDiv.height() + 3,
			newLiLength = $newLi.length;
			if (currentIndex != -1) {
				navigateList(currentIndex, true);
			} else {
				$containerDivText.text(opts.defaultText);
			}
			function newUlPos() {
				var containerPosY = $containerDiv.offset().top,
				docHeight = jQuery(window).height(),
				scrollTop = jQuery(window).scrollTop();
				if (newUlHeight > parseInt(opts.ddMaxHeight)) {
					newUlHeight = parseInt(opts.ddMaxHeight);
				}
				containerPosY = containerPosY - scrollTop;
				if (containerPosY + newUlHeight >= docHeight) {
					$newUl.css({
						top: '-' + newUlHeight + 'px',
						height: newUlHeight
					});
					$input.onTop = true;
				} else {
					$newUl.css({
						top: containerHeight + 'px',
						height: newUlHeight
					});
					$input.onTop = false;
				}
			}
			newUlPos();
			$(window).resize(function () {
				newUlPos();
			});
			$(window).scroll(function () {
				newUlPos();
			});
			function positionFix() {
				$containerDiv.css('position', 'relative');
			}
			function positionHideFix() {
				$containerDiv.css('position', 'static');
			}
			$containerDivText.click(function () {
				if ($newUl.is(":visible")) {
					$containerDiv.blur();
					return false;
				}
				else {
					$containerDiv.focus();
					$newUl.slideDown(opts.animationSpeed);
					positionFix();
					$newUl.scrollTop($input.liOffsetTop);
				}
			});
			$newLi.hover(function (e) {
				var $hoveredLi = $(e.target);
				$hoveredLi.addClass('newListHover');
			},
			function (e) {
				var $hoveredLi = $(e.target);
				$hoveredLi.removeClass('newListHover');
			});
			$newLi.click(function (e) {
				var $clickedLi = $(e.target);
				currentIndex = $newLi.index($clickedLi);
				prevented = true;
				navigateList(currentIndex);
				$containerDiv.blur();
			});
			function navigateList(currentIndex, init) {
				var containerOffsetTop = $containerDiv.offset().top,
				liOffsetTop = $newLi.eq(currentIndex).offset().top,
				ulScrollTop = $newUl.scrollTop();
				if ($input.onTop == true) {
					$input.liOffsetTop = (((liOffsetTop - containerOffsetTop) - containerHeight) + ulScrollTop) + parseInt(opts.ddMaxHeight);
				} else {
					$input.liOffsetTop = ((liOffsetTop - containerOffsetTop) - containerHeight) + ulScrollTop;
				}
				$newUl.scrollTop($input.liOffsetTop);
				$newLi.removeClass('hiLite').eq(currentIndex).addClass('hiLite');
				var text = $newLi.eq(currentIndex).text();
				if (init == true) {
					$input.val(text);
					$containerDivText.text(text);
					return false;
				}
				$input.val(text).change();
				$containerDivText.text(text);
			};
			$input.change(function (event) {
				$targetInput = $(event.target);
				if (prevented == true) {
					prevented = false;
					return false;
				}
				$currentOpt = $targetInput.find(':selected');
				currentIndex = $targetInput.find('option').index($currentOpt);
				navigateList(currentIndex, true);
			});
			function keyPress(element) {
				element.onkeydown = function (e) {
					if (e == null) {
						var keycode = event.keyCode;
					} else {
						var keycode = e.which;
					}
					prevented = true;
					switch (keycode) {
					case 40:
					case 39:
						incrementList();
						return false;
						break;
					case 38:
					case 37:
						decrementList();
						return false;
						break;
					case 33:
					case 36:
						gotoFirst();
						return false;
						break;
					case 34:
					case 35:
						gotoLast();
						return false;
						break;
					case 13:
					case 27:
						$containerDiv.blur();
						return false;
						break;
					}
					keyPressed = String.fromCharCode(keycode).toLowerCase();
					var currentKeyIndex = keys.indexOf(keyPressed);
					if (typeof currentKeyIndex != 'undefined') {++currentIndex;
						currentIndex = keys.indexOf(keyPressed, currentIndex);
						if (currentIndex == -1 || currentIndex == null || prevKey != keyPressed) currentIndex = keys.indexOf(keyPressed);
						navigateList(currentIndex);
						prevKey = keyPressed;
						return false;
					}
				}
			}
			function incrementList() {
				if (currentIndex < (newLiLength - 1)) {++currentIndex;
					navigateList(currentIndex);
				}
			}
			function decrementList() {
				if (currentIndex > 0) {--currentIndex;
					navigateList(currentIndex);
				}
			}
			function gotoFirst() {
				currentIndex = 0;
				navigateList(currentIndex);
			}
			function gotoLast() {
				currentIndex = newLiLength - 1;
				navigateList(currentIndex);
			}
			$containerDiv.click(function () {
				keyPress(this);
			});
			$containerDiv.focus(function () {
				$(this).addClass('newListSelFocus');
				keyPress(this);
			});
			$containerDiv.blur(function () {
				$(this).removeClass('newListSelFocus');
				$newUl.fadeOut("fast");
			});
			$containerDivText.hover(function (e) {
				var $hoveredTxt = $(e.target);
				$hoveredTxt.parent().addClass('newListSelHover');
			},
			function (e) {
				var $hoveredTxt = $(e.target);
				$hoveredTxt.parent().removeClass('newListSelHover');
			});
			$newUl.css('left', '0').hide();
		});
	};
})(jQuery);
