/* -------------------------------------

	cusel version 2.4
	last update: 20.07.11
	смена обычного селект на стильный
	autor: Evgen Ryzhkov
	www.xiper.net
----------------------------------------	
*/	// resetPosition:true

var _initSelectObject = {};

function cuSel(params)
{
	jQuery(params.changedEl).each(
	function(num)
	{
		var chEl = jQuery(this),
			chElWid = chEl.outerWidth(), // ширина селекта
			chElClass = chEl.prop("class"), // класс селекта
			chElId = chEl.prop("id"), // id
			chElName = chEl.prop("name"), // имя
			defaultVal = chEl.val(), // начальное значение
			activeOpt = chEl.find("option[value='"+defaultVal+"']").eq(0),
			defaultText = activeOpt.text(), // начальный текст
			disabledSel = chEl.prop("disabled"), // заблокирован ли селект
			scrollArrows = params.scrollArrows,
			chElOnChange = chEl.prop("onchange"),
			chElTab = chEl.prop("tabindex"),
			chElMultiple = chEl.prop("multiple");
			
		
		var	onChangeEvent = typeof params.onChangeEvent =='function'?params.onChangeEvent:false;
		
		if(!chElId || chElMultiple)	return false; // не стилизируем селект если не задан id
		
		if(!disabledSel)
		{
			classDisCuselText = "", // для отслеживания клика по задизайбленному селекту
			classDisCusel=""; // для оформления задизейбленного селекта
		}
		else
		{
			classDisCuselText = "classDisCuselLabel";
			classDisCusel="classDisCusel";
		}
		
		if(scrollArrows)
		{
			classDisCusel+=" cuselScrollArrows";
		}
			
		activeOpt.addClass("cuselActive");  // активному оптиону сразу добавляем класс для подсветки
	
		var optionStr = chEl.html(), // список оптионов
	
		
		/* 
			делаем замену тегов option на span, полностью сохраняя начальную конструкцию
		*/
	
		spanStr = optionStr.replace(/option/ig,"span").replace(/value=/ig,"val="); // value меняем на val, т.к. jquery отказывается воспринимать value у span
	
		/* 
			для IE проставляем кавычки для значений, т.к. html() возращает код без кавычек
			что произошла корректная обработка value должно быть последний атрибутом option,
			например <option class="country" id="ukraine" value="/ukrane/">Украина</option>
		*/
		if($.browser.msie && parseInt($.browser.version) < 9)
		{
			var pattern = /(val=)(.*?)(>)/g;
			spanStr = spanStr.replace(pattern, "$1'$2'$3");
		}

	
		/* каркас стильного селекта	*/
		var cuselFrame = '<div class="cusel '+chElClass+' '+classDisCusel+'"'+
						' id=cuselFrame-'+chElId+
						' style="width:'+chElWid+'px"'+
						' tabindex="'+chElTab+'"'+
						'>'+
						'<div class="cuselFrameRight"></div>'+
						'<div class="cuselText">'+defaultText+'</div>'+
						'<div class="cusel-scroll-wrap"><div class="cusel-scroll-pane" id="cusel-scroll-'+chElId+'">'+
						(typeof params.beforeHtml=='undefined'?'':params.beforeHtml)+
						spanStr+
						(typeof params.afterHtml=='undefined'?'':params.afterHtml)+
						'</div></div>'+
						'<input type="hidden" id="'+chElId+'" name="'+chElName+'" value="'+defaultVal+'" />'+
						'</div>';
					
		/* удаляем обычный селект, на его место вставляем стильный */
		chEl.replaceWith(cuselFrame);
	
		/* если был поцеплен onchange - цепляем его полю */
		if(chElOnChange) jQuery("#"+chElId).bind('change',chElOnChange);
		if(onChangeEvent) jQuery("#"+chElId).bind('change', onChangeEvent);

	
		/*
			устаналиваем высоту выпадающих списков основываясь на числе видимых позиций и высоты одной позиции
			при чем только тем, у которых число оптионов больше числа заданного числа видимых
		*/
		var newSel = jQuery("#cuselFrame-"+chElId),
			arrSpan = newSel.find("span"),
			defaultHeight;
			
			if(!arrSpan.eq(0).text())
			{
				defaultHeight = arrSpan.eq(1).innerHeight();
				arrSpan.eq(0).css("height", arrSpan.eq(1).height());
			} 
			else
			{
				defaultHeight = arrSpan.eq(0).innerHeight();
			}
		
	
		if(arrSpan.length>params.visRows)
		{
			newSel.find(".cusel-scroll-wrap").eq(0)
				.css({height: defaultHeight*params.visRows+"px", display : "none", visibility: "visible" })
				.children(".cusel-scroll-pane").css("height",defaultHeight*params.visRows+"px");
		}
		else
		{
			newSel.find(".cusel-scroll-wrap").eq(0)
				.css({display : "none", visibility: "visible" });
		}
	
		/* вставляем в оптионы дополнительные теги */
	
		var arrAddTags = jQuery("#cusel-scroll-"+chElId).find("span[addTags]"),
			lenAddTags = arrAddTags.length;
		
		for(i=0;i<lenAddTags;i++) arrAddTags.eq(i)
										.append(arrAddTags.eq(i).attr("addTags"))
										.removeAttr("addTags");
		
		_initSelectObject[params.changedEl] = params;
		// назначаем события
		cuselEvents();
	
	});

	
/* ---------------------------------------
	привязка событий селектам
------------------------------------------
*/
	function cuselEvents()
	{
		jQuery("html").unbind("click");

		jQuery("html").click(function(e)
		{
			var clicked = jQuery(e.target),
				clickedId = clicked.attr("id"),
				clickedClass = clicked.prop("class"),
				clickedText = clicked.html();
				
			var exandlistClass = $(clicked).attr("class");
			if (typeof exandlistClass != 'undefined' && exandlistClass[0])
			{
				exandlistClass = exandlistClass.split(" ");
				var obj = $("."+exandlistClass[0], $("#SL_fullsearch"));
				if (!$(obj).closest(".longboxlist").length && (!clicked.hasClass('_strVal'))) $(".longboxlist").hide();
			}
			else $(".longboxlist").hide();
			
			if (clicked.closest('span') && clicked.closest('span').attr('val'))
			{
				clicked = jQuery(clicked.closest('span'));
				clickedId = clicked.attr('id');
				clickedClass = clicked.prop('class');
				
				if (clickedClass.indexOf('noActive')!=-1)
					return;
				
				if ($(".smcaption", clicked).length)
				{	
					var texts = $(".smcaption", clicked).html();
					clickedText = texts.replace(/<.*>/g, '');
				}
				// назначение события на клик по элементу списка - нужно для возможности
				// определить клик для списка с чекбоксами
				var objID = $(clicked).closest(".cusel-scroll-pane").attr('id').replace("cusel-scroll-","");
				var params = _initSelectObject['#'+objID];
				if (typeof params.listBoxClick=='function')
				{
					params.listBoxClick(clicked, clickedClass, clickedText, params);
					return;
				}
			}
			/* если кликнули по самому селекту (текст) */
			if((clickedClass.indexOf("cuselText")!=-1 || clickedClass.indexOf("cuselFrameRight")!=-1) && clicked.parent().prop("class").indexOf("classDisCusel")==-1)
			{
				var cuselWrap = clicked.parent().find(".cusel-scroll-wrap").eq(0);

				var temp = $(clicked).parent().find(".cusel-scroll-pane")
				if(typeof(temp.attr('id'))=="undefined") temp = temp['0']
				var objID = temp.attr('id').replace("cusel-scroll-","");
				var params = _initSelectObject['#'+objID];
				
				/* если выпадающее меню скрыто - показываем */
				cuselShowList(cuselWrap, params["resetPosition"]);
			}
			/* если кликнули по самому селекту (контейнер) */
			else if(clickedClass.indexOf("cusel")!=-1 && clickedClass.indexOf("classDisCusel")==-1 && clicked.is("div"))
			{
				var cuselWrap = clicked.find(".cusel-scroll-wrap").eq(0);
				
				/* если выпадающее меню скрыто - показываем */
				cuselShowList(cuselWrap);
		
			}
			
			/* если выбрали позицию в списке */
			else if(clicked.is(".cusel-scroll-wrap span") && clickedClass.indexOf("cuselActive")==-1)
			{
				var clickedVal;
				(clicked.attr("val") == undefined) ? clickedVal=clickedText : clickedVal=clicked.attr("val");
				clicked
					.parents(".cusel-scroll-wrap").find(".cuselActive").eq(0).removeClass("cuselActive")
					.end().parents(".cusel-scroll-wrap")
					.next().val(clickedVal)
					.end().prev().text(clickedText)
					.end().css("display","none")
					.parent(".cusel").removeClass("cuselOpen");
				clicked.addClass("cuselActive");
				clicked.parents(".cusel-scroll-wrap").find(".cuselOptHover").removeClass("cuselOptHover");
				if(clickedClass.indexOf("cuselActive")==-1)	clicked.parents(".cusel").find(".cusel-scroll-wrap").eq(0).next("input").change(); // чтобы срабатывал onchange
			}
			
			else if(clicked.parents(".cusel-scroll-wrap").is("div"))
			{
				return;
			}
			
			/*
				скрываем раскрытые списки, если кликнули вне списка
			*/
			else
			{
				jQuery(".cusel-scroll-wrap")
					.css("display","none")
					.parent(".cusel").removeClass("cuselOpen");
			}
		});

		jQuery(".cusel").unbind("keydown"); /* чтобы не было двлйного срабатывания события */

		jQuery(".cusel").keydown(function(event) {
			/*
				если селект задизайблин, с не го работает только таб
			*/
			var key, keyChar;
				
			if(window.event) key=window.event.keyCode;
			else if (event) key=event.which;
			
			if(key==null || key==0 || key==9) return true;
			
			if(jQuery(this).prop("class").indexOf("classDisCusel")!=-1) return false;
		
			/*
				если нажали стрелку вниз
			*/

			/*
				если нажали esc
			*/
			if(key==27)
			{
				var cuselActiveText = $(this).find(".cuselActive").eq(0).text();
				$(this)
					.removeClass("cuselOpen")
					.find(".cusel-scroll-wrap").eq(0).css("display","none")
					.end().find(".cuselOptHover").eq(0).removeClass("cuselOptHover");
				$(this).find(".cuselText").eq(0).text(cuselActiveText);
		
			}
		});
	}
	
	jQuery(".cusel").focus(function() { jQuery(this).addClass("cuselFocus"); });
	jQuery(".cusel").blur(function() { jQuery(this).removeClass("cuselFocus"); });
	jQuery(".cusel").hover(
		function(){ jQuery(this).addClass("cuselFocus");},
		function() { jQuery(this).removeClass("cuselFocus"); });
}





function cuSelRefresh(params)
{
	/*
		устаналиваем высоту выпадающих списков основываясь на числе видимых позиций и высоты одной позиции
		при чем только тем, у которых число оптионов больше числа заданного числа видимых
	*/

	var arrRefreshEl = params.refreshEl.split(","),
		lenArr = arrRefreshEl.length,
		i;
	
	for(i=0;i<lenArr;i++)
	{
		var refreshScroll = jQuery(arrRefreshEl[i]).parents(".cusel").find(".cusel-scroll-wrap").eq(0);
		refreshScroll.find(".cusel-scroll-pane").jScrollPaneRemoveCusel();
		refreshScroll.css({visibility: "hidden", display : "block"});
		var	arrSpan = refreshScroll.find("span"),
			defaultHeight = arrSpan.eq(0).outerHeight();
	
		if(arrSpan.length>params.visRows)
		{
			refreshScroll
				.css({height: defaultHeight*params.visRows+"px", display : "none", visibility: "visible" })
				.children(".cusel-scroll-pane").css("height",defaultHeight*params.visRows+"px");
		}
		else
		{
			refreshScroll
				.css({display : "none", visibility: "visible" });
		}
	}
	
}


/*
	фукция раскрытия/скрытия списка 
*/
function cuselShowList(cuselWrap, resetPosition)
{
	var cuselMain = cuselWrap.parent(".cusel");
	if(typeof resetPosition == "undefined") resetPosition = true;
	
	/* если выпадающее меню скрыто - показываем */
	if(cuselWrap.css("display")=="none")
	{
		jQuery(".cusel-scroll-wrap").css("display","none");
		jQuery(".cusel-scroll-wrap").parent(".cusel").removeClass("cuselOpen");

		cuselMain.addClass("cuselOpen");
		cuselWrap.css("display","block");
		var cuselArrows = false;
		if(cuselMain.prop("class").indexOf("cuselScrollArrows")!=-1) cuselArrows=true;
		if(!cuselWrap.find(".jScrollPaneContainer").eq(0).is("div"))
		{
			cuselWrap.find("div").eq(0).jScrollPaneCusel({showArrows:cuselArrows});
		}
				
		/* прокручиваем к текущему оптиону */
		if(resetPosition) cuselScrollToCurent(cuselWrap);
	}
	else
	{
		cuselWrap.css("display","none");
		cuselMain.removeClass("cuselOpen");
	}
}


/*
	функция прокрутки к текущему элементу
*/
function cuselScrollToCurent(cuselWrap)
{
	var cuselScrollEl = null;
	if(cuselWrap.find(".cuselOptHover").eq(0).is("span")) cuselScrollEl = cuselWrap.find(".cuselOptHover").eq(0);
	else if(cuselWrap.find(".cuselActive").eq(0).is("span")) cuselScrollEl = cuselWrap.find(".cuselActive").eq(0);

	if(cuselWrap.find(".jScrollPaneTrack").eq(0).is("div") && cuselScrollEl)
	{
		
		var posCurrentOpt = cuselScrollEl.position(),
			idScrollWrap = cuselWrap.find(".cusel-scroll-pane").eq(0).attr("id");

		jQuery("#"+idScrollWrap)[0].scrollTo(posCurrentOpt.top);	
	
	}	
}

