/*
 * --------------------------------------------------------------------
 * jQuery-Plugin - selectToUISlider - creates a UI slider component from a select element(s)
 * by Scott Jehl, scott@filamentgroup.com
 * http://www.filamentgroup.com
 * reference article: http://www.filamentgroup.com/lab/update_jquery_ui_16_slider_from_a_select_element/
 * demo page: http://www.filamentgroup.com/examples/slider_v2/index.html
 * 
 * Copyright (c) 2008 Filament Group, Inc
 * Dual licensed under the MIT (filamentgroup.com/examples/mit-license.txt) and GPL (filamentgroup.com/examples/gpl-license.txt) licenses.
 *
 * Usage Notes: please refer to our article above for documentation
 *  
 * --------------------------------------------------------------------
 */


jQuery.fn.selectToUISlider = function(settings){
	var selects = jQuery(this);
    
    var empty = function(object) {
        var type = typeof object;
        if (type === 'string') return ( object == '' );
        if (type === 'number') return ( object == 0 );
        if (type === 'object') return ( object.length == 0 );
        return false;
    };
    
    if(empty(selects)){
        return;
    }

	//accessible slider options
	var options = jQuery.extend({
		labels: 3, //number of visible labels
		tooltip: true, //show tooltips, boolean
		tooltipSrc: 'text',//accepts 'value' as well
		labelSrc: 'text',//accepts 'value' as well	,
		sliderOptions: null
	}, settings);

	//handle ID attrs - selects each need IDs for handles to find them
	var handleIds = (function(){
		var tempArr = [];
		selects.each(function(){
			tempArr.push('handle_'+jQuery(this).attr('id'));
		});
		return tempArr;
	})();
	
	//array of all option elements in select element (ignores optgroups)
	var selectOptions = (function(){
		var opts = [];
		selects.eq(0).find('option').each(function(){
			opts.push({
				value: jQuery(this).attr('value'),
				text: jQuery(this).text()
			});
		});
		return opts;
	})();
	
	//array of opt groups if present
	var groups = (function(){
		if(selects.eq(0).find('optgroup').size()>0){
			var groupedData = [];
			selects.eq(0).find('optgroup').each(function(i){
				groupedData[i] = {};
				groupedData[i].label = jQuery(this).attr('label');
				groupedData[i].options = [];
				jQuery(this).find('option').each(function(){
					groupedData[i].options.push({text: jQuery(this).text(), value: jQuery(this).attr('value')});
				});
			});
			return groupedData;
		}
		else return null;
	})();	
	
	//check if obj is array
	function isArray(obj) {
		return obj.constructor == Array;
	}
	//return tooltip text from option index
	function ttText(optIndex){
		return (options.tooltipSrc == 'text') ? selectOptions[optIndex].text : selectOptions[optIndex].value;
	}
	
	//tariff
	function sliderTariff(){
		if ($('#telefony').length != 0 && $('#taryfa').length != 0 && $('#value').length != 0) {
			var number_of_phones = $('#telefony').val();
			var tariff = $('#taryfa').val();
			var tariffTab = $('#value .taryfa-'+tariff).text().split(' ');
			$('.tariff_value').text(tariffTab[parseInt(number_of_phones)-1]);
			var minutsTab = $('#value .limit-minut-'+tariff).text().split(' ');
			$('.tariff_minuts').text(minutsTab[parseInt(number_of_phones)-1]);
		}
		else if ($('#taryfa').length != 0 && $('.tariff_minuts').length != 0) {
			var tariffTab = $('#taryfa').val().split('/');
			var tariff = parseFloat(tariffTab[0]);
			var tariffMinuts = parseFloat(tariffTab[1]);
			$('.tariff_minuts').text(tariffMinuts);
			$('.tariff_value').text(tariff);
		}
		else if ($('#doladowania').length != 0) {
			var accountTab = $('#doladowania').val().split('/');
			var account = parseFloat(accountTab[0]);
			var accountMinuts = parseFloat(accountTab[1]);
			var accountMinuts2 = accountMinuts+30;
			$('.account_value').text(account);
			$('.account_minuts').text(accountMinuts);
			$('.account_minuts2').text(accountMinuts2);
		}
	}
	
	//promo
	function sliderPromo(){
		if($('#czasTrwaniaUmowy').length != 0 && $('#wariant').length == 0 ) {
			var result = 0;
			var resultMonth1 = 0;
			var resultMonth1TvPromo = 0;
			var resultMonth2TvPromo = 0;
			var month1 = "3 miesiące";
			var month2 = "9 miesięcy";
			var variant = 1; // domyślnie pakiet
			var tariffVariant = 1; // domyślnie pakiet
			var resultSpeed = 1;
			var speedValue = [];
			var tariffValue = [];
			var selectStatus = '';
			var agreementTime = $('#czasTrwaniaUmowy').val();
			var agreementTimeTemp = agreementTime;
			if (agreementTime == 1){
				month1 = "6 miesięcy";
				month2 = "18 miesięcy";
			}
			if($('#taryfa').length != 0){ //sprawdzenie wartosci slidera taryf (tylko przy promocji tv)
				tariffValue = $('#taryfa').val().split('/');
				if(parseFloat(tariffValue[agreementTime])==0)
					variant = 2;
			}
			if($('#predkosc').length != 0 && variant == 1){//slider predkosci dla wariantu - wszystkie (3) usługi - domyślnie
				$('.variant1').fadeIn();
				$('.variant2').fadeOut('slow');
				speedValue = $('#predkosc').val().split('/');
				resultSpeed = parseFloat(speedValue[agreementTime]);
				if(resultSpeed==0)
					tariffVariant = 2;
				result += parseFloat(speedValue[agreementTime]);
				if(resultSpeed == 0) //opłata za dekoder
					resultMonth1TvPromo += 10;
				else
					resultMonth1TvPromo += 1;
				resultMonth1TvPromo += parseFloat(speedValue[agreementTime]);
			}
			else if($('#predkosc2').length != 0 && variant == 2){//slider predkosci dla wariantu - dwie usługi
				$('.variant1').fadeOut('slow');
				$('.variant2').fadeIn();
				speedValue = $('#predkosc2').val().split('/');
				resultSpeed = parseFloat(speedValue[agreementTime]);
				resultMonth1TvPromo += 10; //opłata za dekoder
				result += parseFloat(speedValue[agreementTime]);
				resultMonth1TvPromo += parseFloat(speedValue[agreementTime]);
				if(parseFloat(speedValue[agreementTime])==0)
					var selectStatus = "onlyTV";
			}
			if($('#taryfa').length != 0  && tariffVariant == 1){//slider taryf
				$('.variant1t').fadeIn();
				$('.variant2t').fadeOut('slow');
				if(resultSpeed==0)
					agreementTime=parseInt(agreementTime)+2;
				result += parseFloat(tariffValue[agreementTime]);
				resultMonth1 += parseFloat(tariffValue[agreementTime]);
				resultMonth1TvPromo += parseFloat(tariffValue[agreementTime]);
			}
			if($('#taryfa2').length != 0  && tariffVariant == 2){//slider taryf
				$('.variant1t').fadeOut('slow');
				$('.variant2t').fadeIn();
				tariffValue2 = $('#taryfa2').val().split('/');
				if(resultSpeed==0)
					agreementTime=parseInt(agreementTime)+2;
				result += parseFloat(tariffValue2[agreementTime]);
				resultMonth1 += parseFloat(tariffValue2[agreementTime]);
				resultMonth1TvPromo += parseFloat(tariffValue2[agreementTime]);
			}
			if($(".packetTv input").length != 0){
				result += checkBoxPromo();
				resultMonth1TvPromo += checkBoxPromo();
				resultMonth2TvPromo = resultMonth1TvPromo;
				// pakiet domowy
				var homePacket = $('input#p1').val();
				resultMonth1TvPromo = resultMonth1TvPromo - homePacket;
				if (agreementTimeTemp == 1){//wyjątek dla promocji tv-internet-telefon
					month1 = "12 miesięcy";
					month2 = "12 miesięcy";
				}
				else {
					month1 = "6 miesięcy";
					month2 = "6 miesięcy";
				}
				if(selectStatus == "onlyTV"){ // resetujemy ceny jeżeli tel i internet nie są zaznaczone
					resultMonth1TvPromo = 0;
					resultMonth2TvPromo = 0;
				}
			}
			$('.result').text(toRound(result));
			$('.resultMonth1').text(toRound(resultMonth1));
			$('.resultMonth1TvPromo').text(toRound(resultMonth1TvPromo));
			if ($('.p10').attr('checked'))
			{
				$('.resultMonth2TvPromo').text(toRound(resultMonth2TvPromo + 15));
			}
			else
			{
				$('.resultMonth2TvPromo').text(toRound(resultMonth2TvPromo));
			}
			$('.month1').text(month1);
			$('.month2').text(month2);
			
			if (agreementTime == 1 && $('#taryfa').val() == '55/50' && $('#predkosc').val() == '64/54')
			{
				$('.result').text('84.90');
				$('.resultMonth1').text('84.90');

			}
			if (agreementTime == 1 && $('#taryfa').val() == '55/50' && $('#predkosc').val() == '94/84')
			{
				$('.result').text('104.90');
				$('.resultMonth1').text('104.90');

			}
			if (agreementTime == 1 && $('#taryfa').val() == '69/60' && $('#predkosc').val() == '73.99/64')
			{
				$('.result').text('99.89');
				$('.resultMonth1').text('99.89');

			}
			if (agreementTime == 1 && $('#taryfa').val() == '69/60' && $('#predkosc').val() == '103.99/94')
			{
				$('.result').text('119.90');
				$('.resultMonth1').text('119.90');

			}
			
		}
	}

	//dla promocji TP
	function sliderPromoTP(){
		if($('#wariant').length != 0 && $('#czasTrwaniaUmowy').length != 0){
			var variant = 0;
			var result = 0;
			var agreementTime = $('#czasTrwaniaUmowy').val();
			var variantValue = $('#wariant').val();
			if(variantValue=='telefon'){
				$('.telefonArea').show();
				$('.internetArea').hide();
				if($('#taryfa').length != 0){//slider taryf
					var tariffValue = $('#taryfa').val().split('/');
					result += parseFloat(tariffValue[agreementTime]);
				}
			}
			if(variantValue=='internet'){
				$('.internetArea').show();
				$('.telefonArea').hide();
				$('.variant1').show();
				$('.variant2').hide();
				if($('#predkosc').length != 0){//slider internet
					var speedValue = $('#predkosc').val().split('/');
					result += parseFloat(speedValue[agreementTime]);
				}
			}
			else if(variantValue=='pakiet'){
				$('.telefonArea').show();
				$('.internetArea').show();
				$('.variant2').show();
				$('.variant1').hide();
				if($('#taryfa').length != 0){//slider taryf
					var tariffValue = $('#taryfa').val().split('/');
					result += parseFloat(tariffValue[agreementTime]);
				}
				if($('#predkosc2').length != 0){//slider internet
					var speedValue = $('#predkosc2').val().split('/');
					result += parseFloat(speedValue[agreementTime]);
				}
			}
			$('.result').text(toRound(result));
		}
	}
	
	function round(n) {
		return Math.round(n*100+((n*1000)%10>4?1:0))/100;
	}

	function toRound(kvat1) {

                val = parseFloat(kvat1);
		if (!isNaN(val)) {
			var n = round(val)+"";
			if (n.indexOf(".")==-1) {
				n += ".00";
			}
			while(n.length-n.indexOf(".")<3) {
				n += "0";
			}
			result = n;
		}

		return result;
	}
	
	//sprawdzanie pakietów TV
	function checkBoxPromo(){
		var result = 0;
		$(".packetTv").find("input").each(function(i){
			if($(this).attr('checked'))
				result += parseFloat($(this).val());
		})
		return result;
	}
	
	sliderTariff();
	sliderPromo();
	$(".packetTv input").click(function() { 
		sliderPromo();
	});
	sliderPromoTP();
	
	//plugin-generated slider options (can be overridden)
	var sliderOptions = {
		step: 1,
		min: 0,
		orientation: 'horizontal',
		max: selectOptions.length-1,
		range: selects.length > 1,//multiple select elements = true
		slide: function(e, ui) {//slide function
				var thisHandle = jQuery(ui.handle);
				//handle feedback 
				var textval = ttText(ui.value);
				thisHandle
					.attr('aria-valuetext', textval)
					.attr('aria-valuenow', ui.value)
					.find('.ui-slider-tooltip .ttContent')
						.text( textval );

				//control original select menu
				var currSelect = jQuery('#' + thisHandle.attr('id').split('handle_')[1]);
				currSelect.find('option').eq(ui.value).attr('selected', 'selected');
				sliderTariff();
				sliderPromo();
				sliderPromoTP();
		},
		values: (function(){
			var values = [];
			selects.each(function(){
				values.push( jQuery(this).get(0).selectedIndex );
			});
			return values;
		})()
	};
	
	//slider options from settings
	options.sliderOptions = (settings) ? jQuery.extend(sliderOptions, settings.sliderOptions) : sliderOptions;
		
	//select element change event	
	selects.bind('change keyup click', function(){
		var thisIndex = jQuery(this).get(0).selectedIndex;
		var thisHandle = jQuery('#handle_'+ jQuery(this).attr('id'));
		var handleIndex = thisHandle.data('handleNum');
		thisHandle.parents('.ui-slider:eq(0)').slider("values", handleIndex, thisIndex);
	});
	

	//create slider component div
	var sliderComponent = jQuery('<div></div>');

	//CREATE HANDLES
	selects.each(function(i){
		var hidett = '';
		
		//associate label for ARIA
		var thisLabel = jQuery('label[for=' + jQuery(this).attr('id') +']');
		//labelled by aria doesn't seem to work on slider handle. Using title attr as backup
		var labelText = (thisLabel.size()>0) ? 'Slider control for '+ thisLabel.text()+'' : '';
		var thisLabelId = thisLabel.attr('id') || thisLabel.attr('id', 'label_'+handleIds[i]).attr('id');
		
		
		if( options.tooltip == false ){hidett = ' style="display: none;"';}
		jQuery('<a '+
				'href="#" tabindex="0" '+
				'id="'+handleIds[i]+'" '+
				'class="ui-slider-handle" '+
				'role="slider" '+
				'aria-labelledby="'+thisLabelId+'" '+
				'aria-valuemin="'+options.sliderOptions.min+'" '+
				'aria-valuemax="'+options.sliderOptions.max+'" '+
				'aria-valuenow="'+options.sliderOptions.values[i]+'" '+
				'aria-valuetext="'+ttText(options.sliderOptions.values[i])+'" '+
			'><span class="screenReaderContext">'+labelText+'</span>'+
			'<span class="ui-slider-tooltip ui-widget-content ui-corner-all"'+ hidett +'><span class="ttContent"></span>'+
				'<span class="ui-tooltip-pointer-down ui-widget-content"><span class="ui-tooltip-pointer-down-inner"></span></span>'+
			'</span></a>')
			.data('handleNum',i)
			.appendTo(sliderComponent);
	});
	
	//CREATE SCALE AND TICS
	
	//write dl if there are optgroups
	if(groups) {
		var inc = 0;
		var scale = sliderComponent.append('<dl class="ui-slider-scale ui-helper-reset" role="presentation"></dl>').find('.ui-slider-scale:eq(0)');
		jQuery(groups).each(function(h){
			scale.append('<dt style="width: '+ (100/groups.length).toFixed(2) +'%' +'; left:'+ (h/(groups.length-1) * 100).toFixed(2)  +'%' +'"><span>'+this.label+'</span></dt>');//class name becomes camelCased label
			var groupOpts = this.options;
			jQuery(this.options).each(function(i){
				var style = (inc == selectOptions.length-1 || inc == 0) ? 'style="display: none;"' : '' ;
				var labelText = (options.labelSrc == 'text') ? groupOpts[i].text : groupOpts[i].value;
				scale.append('<dd style="left:'+ leftVal(inc) +'"><span class="ui-slider-label">'+ labelText +'</span><span class="ui-slider-tic ui-widget-content"'+ style +'></span></dd>');
				inc++;
			});
		});
	}
	//write ol
	else {
		var scale = sliderComponent.append('<ol class="ui-slider-scale ui-helper-reset" role="presentation"></ol>').find('.ui-slider-scale:eq(0)');
		jQuery(selectOptions).each(function(i){
			var style = (i == selectOptions.length-1 || i == 0) ? 'style="display: none;"' : '' ;
			var labelText = (options.labelSrc == 'text') ? this.text : this.value;
			scale.append('<li style="left:'+ leftVal(i) +'"><span class="ui-slider-label">'+ labelText +'</span><span class="ui-slider-tic ui-widget-content"'+ style +'></span></li>');
		});
	}
	
	function leftVal(i){
		return (i/(selectOptions.length-1) * 100).toFixed(2)  +'%';
		
	}
	

	
	
	//show and hide labels depending on labels pref
	//show the last one if there are more than 1 specified
	if(options.labels > 1) sliderComponent.find('.ui-slider-scale li:last span.ui-slider-label, .ui-slider-scale dd:last span.ui-slider-label').addClass('ui-slider-label-show');

	//set increment
	var increm = Math.max(1, Math.round(selectOptions.length / options.labels));
	//show em based on inc
	for(var j=0; j<selectOptions.length; j+=increm){
		if((selectOptions.length - j) > increm){//don't show if it's too close to the end label
			sliderComponent.find('.ui-slider-scale li:eq('+ j +') span.ui-slider-label, .ui-slider-scale dd:eq('+ j +') span.ui-slider-label').addClass('ui-slider-label-show');
		}
	}

	//style the dt's
	sliderComponent.find('.ui-slider-scale dt').each(function(i){
		jQuery(this).css({
			'left': ((100 /( groups.length))*i).toFixed(2) + '%'
		});
	});
	

	//inject and return 
	sliderComponent
	.insertAfter(jQuery(this).eq(this.length-1))
	.slider(options.sliderOptions)
	.attr('role','application')
	.find('.ui-slider-label')
	.each(function(){
		jQuery(this).css('marginLeft', -jQuery(this).width()/2);
	});
	
	//update tooltip arrow inner color
	sliderComponent.find('.ui-tooltip-pointer-down-inner').each(function(){
				var bWidth = jQuery('.ui-tooltip-pointer-down-inner').css('borderTopWidth');
				var bColor = jQuery(this).parents('.ui-slider-tooltip').css('backgroundColor')
				jQuery(this).css('border-top', bWidth+' solid '+bColor);
	});
	
	var values = sliderComponent.slider('values');
	
	if(isArray(values)){
		jQuery(values).each(function(i){
			sliderComponent.find('.ui-slider-tooltip .ttContent').eq(i).text( ttText(this) );
		});
	}
	else {
		sliderComponent.find('.ui-slider-tooltip .ttContent').eq(0).text( ttText(values) );
	}
	
	return this;
}




