jQuery.fn.d4slider = function(links, initialPath, keepSlide, maxSlides, opts) {

	opts = jQuery.extend({
		// defaulteja
	}, opts);
	
	var retryTimerActive = false;
	
	// tama 'this' on jquery-olio, jossa lista div.d4slider-elementeista
	this.each(function() {
	
		// täällä 'this' on div.d4slider-tyyppinen dom-elementti
	
		var slider = $(this);
		var slideWidth = slider.width();
		
		function clickHandler() {
		
			if(retryTimerActive) {
				return false;
			}
		
			var thishref = $(this).attr('href');
			
			//$('#dbg').append('click! (' + retryTimerActive + ')<br/>');
			
			var thislink = this;
			
			if(!links[thishref]) {
				//alert("nolinks: " + thishref);
				//$('#dbg').append(thishref + ": " + links[thishref] + "<br/>");
				//$('#dbg').append('Hetki...<br/>');
				retryTimerActive = true;
				
				window.setTimeout(function() {
					//$('#dbg').append('Lahtee!<br/>');
					retryTimerActive = false;
					$(thislink).trigger('click');
					//$('#dbg').append('Lahti!<br/>');
				}, 200);
				
				return false;
			}
			
			// firefoxilla tulee rumannäköinen bugiefekti, josta pääsee eroon poistamalla overflow:auton animaation ajaksi
			if(jQuery.browser.mozilla) {
				slider.find('div.d4slide').css('overflow-y', 'hidden');
				slider.animate({scrollLeft: '+=' + slideWidth + 'px'}, {complete: function() {
					slider.find('div.d4slide').css('overflow-y', 'auto');
				}});
			} else {
				slider.animate({scrollLeft: '+=' + slideWidth + 'px'});
			}
			
			// täytetään seuraava slide
			fillSlide($(this).parents('div.d4slide').next(), thishref, this);
			
			return false;
		}
		
		// slide-divin ul-listaan oikeat linkit
		
		function fillSlide(slide, thishref, left_a) {
			if(!links[thishref]) {
				$.ajax({
					type: "POST",
					contentType: "application/json; charset=utf-8",
					data: '{}',
					dataType: "json",
					url: '/sys/js/slidermenuitems.dip.js?GrandchildrenOf=' + thishref,
					success: function(addLinks) {
						links = jQuery.extend(addLinks, links);
					}
				});
			}
			
			if(!links[thishref]) {
				thishref = thishref.replace( new RegExp("[a-z0-9_-]+[/]$", "i"), "" );
			    slide = slide.parent().prev('div.d4slide');
			}
			
			if(links[thishref]) {

				slide.find('li').remove();
			
				if(!left_a) {
					slide.find('h3 a').text($('div.d4slider a[href="' + thishref + '"]:first').text());
				}
				else {
					slide.find('h3 a').text($(left_a).text());
				}
			
				slide.find('h3 a').attr('href', thishref);
			
				var childUrl;
				var arrowSpan = null;
			
				for(var i in links[thishref]) {
					var l = links[thishref][i];
					var a = document.createElement('a');
					a.href = l.Href;
					// jos num olemassa, aktivoidaan linkille slideri
					if(l.Num) {
						a.className = 'd4slidelink';
						$(a).css('width', (slideWidth-60)+'px');
						// otetaan huomioon maxSlides-rajoitus:
						// console.log("taso = " + $(slide).attr('alt') + ", i = " + i + ", maxSlides = " + maxSlides + ", maxSlides-1 = " + (maxSlides-1));
						if ( $(slide).attr('alt') < maxSlides ) {
							$(a).click(clickHandler);
							a.rel = l.Num;
							arrowEm = document.createElement('em');
							$(arrowEm).html('&raquo;');
							arrowSpan = document.createElement('span');
							$(arrowSpan).append(arrowEm);
						}
						childUrl = l.Href;
					}
				
		   			$(a).text(l.Menuname);
					
					var li = document.createElement('li');
					if(i==0){
						li.className = 'd4slider-first-li';
					}
					li.appendChild(a);
				
					if(a.rel) {
						li.appendChild(arrowSpan);
					}
					
					slide.find('ul').append(li);
				}
			
				// jos loytyi yksikin lapsi, jolla on lapsia JA niiden tietoja ei ole vielä haettu...
				if(childUrl && !links[childUrl]) {
					$.ajax({
						type: "POST",
						contentType: "application/json; charset=utf-8",
						data: '{}',
						dataType: "json",
						url: '/sys/js/slidermenuitems.dip.js?GrandchildrenOf=' + left_a.rel,
						success: function(addLinks) {
							links = jQuery.extend(addLinks, links);
						}
					});
				}
		   	}
		}
		
		// alustus

		// Jos keepSlide-asetus on päällä, pyritään säilyttämään aktiivinen slide sivua ladattaessa
		if(keepSlide) {
			// jos initialPath != '/', käydään täyttämässä slide2, slide3, jne. Oletetaan, että datat löytyvät jo links-muuttujasta.
		
			if(initialPath != "/") {
				var lastDepth = 0;
				var pathArray = [];
				var tempPath = initialPath;
				var indexOfMatch = tempPath.indexOf("/");
				while(indexOfMatch > -1) {
					if(tempPath != "/") {
					    pathSplit = tempPath.split("/");
						if(pathSplit[pathSplit.length-1]) {
							pathDepth = pathSplit.length;
							if(pathDepth > lastDepth) {
								lastDepth = pathDepth;
							}
							pathArray.push([tempPath+"/", pathDepth]);
						}
					}
					tempPath = tempPath.replace( new RegExp("[/][a-z0-9_-]*$", "i"), "" );
					indexOfMatch = tempPath.indexOf("/");
				}
				pathArray.reverse();
				for(var i=0; i<pathArray.length; i++) {
					slideToFill = $('div.d4slide-' + pathArray[i][1]);
					fillSlide(slideToFill, pathArray[i][0]);
				}
				if($('div.d4slide-'+lastDepth+' h3 a').text() == "") {
					lastDepth = lastDepth-1;
				}
				slider.scrollLeft(((lastDepth-1)*slideWidth));
			}
			slider.find('a[href="' + initialPath + '"]').addClass('d4slide-active-link');
		}
			
		slider.find('div.d4slide a.d4slidelink').click(clickHandler);
	
		slider.find('div.d4slide span').click(function() {
			// firefoxilla tulee rumannäköinen bugiefekti, josta pääsee eroon poistamalla overflow:auton animaation ajaksi
			if(jQuery.browser.mozilla) {
				slider.find('div.d4slide').css('overflow-y', 'hidden');
				slider.animate({scrollLeft: '-=' + slideWidth + 'px'}, {complete: function() {
					slider.find('div.d4slide').css('overflow-y', 'auto');
				}});
			} else {
				slider.animate({scrollLeft: '-=' + slideWidth + 'px'});
			}
			return false;
		});
	});

	return this;
};
