/*
	v.1 Creates a slider of a radio button or a single open end grid.
	
	Info: The CSS-class fieldSlider needs to have a width in order
	for the slider to work properly.
	
	TODO: Dual handles when there are two text fields.
*/
 
 $(document).ready(function() {
	$('input[type="submit"]').hover(function() {
		$(this).toggleClass("submitHover");
	});
      //Don't run the script if mdetect.js has confirmed that we're running on a iPhone-type unit.
      if(typeof isTierIphone == 'undefined' || !isTierIphone) {
        $("div[class*='slider']").find("table").find("tr:has(input)").each(function(i) {
            slider(this);
        });
      }
	  var replaceLinkWithLabel = function() {
			a =  $(this);
			var label = $("<label></label>");
			var id = a.attr("name").split("setvalue");
			id = id.length == 2 ? id[1] : "";
			label.text(a.attr("title")).attr("for", id);
			a.replaceWith(label);
	  };
	  var createButtonsAndAppend = function(from, to) {
			from =  $(from);
			to =  $(to);
			var last = from
				.find("label, input[type=radio], input[type=checkbox]")
					.appendTo(to)
					.css("margin-right", "0px")
					.show()
					.last();
			var buttons = to.buttonset();
			var totalWidth = 0;
			var labels = to.find("label").each(function() {
				totalWidth += $(this).outerWidth();
			});
			if(to.innerWidth() < totalWidth) {
				labels.first().removeClass("ui-corner-left");
				labels.last().removeClass("ui-corner-right");
			}
			else {
				last.addClass("ui-corner-right");
			}	  
	  };
	  
	    $(".gridbuttons").find("table").find("tr:has(input)").each(function(i) {
			var tr = $(this);
			var tds = tr.children("td")
				.has("input[type=radio], input[type=checkbox]").hide();
			tr.find("a")
				.each(replaceLinkWithLabel);
			var td = $(document.createElement("td"))
				.attr("colspan", tds.length);
			var div = $(document.createElement("div"))
				.addClass("horizontalButtons gridButtonRow")
				.appendTo(td);
			tr.append(td);
			createButtonsAndAppend(this, div);

        });
		$(".buttons").each(function(i) {
			var div = $(document.createElement("div"))
				.addClass("horizontalButtons");
			var table = $(this)
				.find("table").first()
					.hide()
					.after(div);
			createButtonsAndAppend(this, div);
			
		});
 });
 
 var slider = function (gridRow) {
	var that = {};
	var type = null;
	var uiSlider;
	var inputs;
	var altInputs; // sflasdjflökasdjfklöj
	var newCell;
	var slideTriggeredChange = false;
	var sliderSettings = {
		range: "min",
		min: 0,
		max: 5,
		step: 1
	};
	var currentValue;
	initialise = function () {
		setFieldInputs(gridRow);
		if(inputs.length>0) {
			type = "field";
			createFieldSlider();
		}
		else {
			setRadioInputs(gridRow);
			if(inputs.length>0) {
				type = "radio";
				createRadioButtonSlider();	
			}
		}
	};
	var altInputsChange = function() {
		var value = getSelectedRadioPosition(gridRow);
		if(value !== undefined && value === -1) {
			uiSlider.slider("value", null);
		}
	};
	var createRadioButtonSlider = function () {
		sliderSettings.max = inputs.length-1;
		inputs.css("display", "inline");
		var value = getSelectedRadioPosition(gridRow);
		newCell = appendCell(gridRow);
		uiSlider = createSlider(newCell);
		hideInputCells();
		uiSlider.bind( "slidestop", onUpdateRadioSlider);
		altInputs.change(altInputsChange);
		if(value !== undefined && value !== -1) $(uiSlider).slider("value", +value);

	};
	var createFieldSlider = function () {
		var settings = getFieldSettings();
		inputs.css("display", "inline");
		var value = getFieldValue(gridRow);
		sliderSettings.max = settings.max !== null ? settings.max : sliderSettings.max;
		sliderSettings.min = settings.min !== null ? settings.min : sliderSettings.min;
		sliderSettings.step = settings.step !== null ? settings.step : sliderSettings.step;
		newCell = appendCell(gridRow);
		uiSlider = createSlider(newCell);
		uiSlider.slider("value", +value);
		$(uiSlider).bind( "slide", onUpdateFieldSlider);
		$(inputs).change(onFieldChange);
		//hideInputCells();
	};	
	var setFieldInputs = function (el) {
		inputs = $(el).find("input:text").last().addClass("slideField");
	};
	var setRadioInputs = function (el) {
		var allInputs = $(el).find('input[type="radio"]');
		inputs = allInputs.not(".alternateDesign");
		altInputs = allInputs.filter(".alternateDesign");
	};
	var getSelectedRadioPosition = function (el) {
		return inputs.index($(el).find("input:radio:checked"));
	}
	var getFieldValue = function (el) {
		return $(el).find("input:text").last().val();
	}
	var appendCell = function (row) {
		var cell = document.createElement("td");
		var tds = $(row).children("td")
		var alts = tds.has("input.alternateDesign");
		if(alts.length) tds = alts;
		tds.last().before(cell);
		return cell;
	};
	var onUpdateRadioSlider = function (event, ui) {
		$(inputs[ui.value]).click();
	};
	var onUpdateFieldSlider = function (event, ui) {
		if(ui.value != currentValue) {
			$(inputs).val(ui.value);
			$(inputs).trigger("change");
			slideTriggeredChange = true;
		}

	};
	var onFieldChange = function () {
		if(slideTriggeredChange) {
			slideTriggeredChange = false;
			return;
		}
		var value = +this.value;
		if(+value < +sliderSettings.min || isNaN(value)) this.value = value = sliderSettings.min;
		else if(+value > +sliderSettings.max) this.value = value = sliderSettings.max;
		$(uiSlider).slider("value", value);
	};
	var createSlider = function (container) {
		var slider = $(document.createElement("div"));
		$(container).append(slider);
		slider.slider(sliderSettings).addClass(type + 'Slider');
		return slider;
	};
	var getFieldSettings = function () {
		var s = getClassSettings($(inputs).attr("class"), "slider");
		var settings = [];
		settings.max = s.length == 1 && !isNaN(s[0]) ? +s[0] : null;
		settings.max = s.length > 1 && !isNaN(s[1]) ? +s[1] : null;
		settings.min = s.length > 1 && !isNaN(s[0]) ? +s[0] : null;
		settings.step = s.length > 2 && !isNaN(s[2]) ? +s[2] : null;			
		return settings;
	};
	var getClassSettings = function (str, className) {
		var pattern = new RegExp('\\b'+className+'\\w*\\b');
		var settingsString = str.match(pattern);
		var settings = settingsString.length > 0 ? settingsString[0].split("_") : {};
		settings = settings.length > 1 ? settings.slice(1) : {};
		return settings;
	};
	var hideInputCells = function () {
		$(gridRow).find("td:has(input:not(.alternateDesign))").hide().last().each(function () {
			$(newCell).addClass(this.className);
		});
		$(newCell).attr("colspan", inputs.length);
	};
	initialise();
	return that;
 };
