﻿(function($) {
	$.fn.listnav = function(options) {
		var opts = $.extend({}, $.fn.listnav.defaults, options);
		//var letters = ['_','a','b','c','d','e','f','g','h','i','j','k','l','m','n','o','p','q','r','s','t','u','v','w','x','y','z'];
var letters = ['_','ת','ש','ר','ק','צ','פ','ע','ס','נ','מ','ל','כ','י','ט','ח','ז','ו','ה','ד','ג','ב','א'];
//א','ב','ג','ד','ה','ו','ז','ח','ט','י','כ','ל','מ','נ','ס','ע','פ','צ','ק','ר','ש','ת'];


			
		var firstClick = false;
		
		return this.each(function(){
			var $wrapper, list, $list, $letters, $letterCount, id;
			id = this.id;
			$wrapper = $('#' + id + '-nav'); // user must abide by the convention: <ul id="myList"> for list and <div id="myList-nav"> for nav wrapper
			$list = $(this);

			var counts = {}, allCount = 0, isAll = true, numCount = 0, prevLetter = '';

			function init(){
				$wrapper.append( createLettersHtml() );
				
				$letters = $('.ln-letters', $wrapper).slice(0,1); // will always be a single item
				$('.z', $letters).addClass('ln-last'); // allows for styling a case where last item needs right border set (because items before that only have top, left and bottom so that border between items isn't doubled)

				addClasses();
				addNoMatchLI();
				if (opts.flagDisabled) addDisabledClass();
				bindHandlers();
				
				$list.show(); 
			
				if (opts.initLetter != ''){
					firstClick = true;
					$('.' + opts.initLetter.toLowerCase(), $letters).slice(0,1).click(); // click the initLetter if there was one
				}
				else {
						for(var i=((opts.includeNums)?0:1);i<letters.length;i++){
							if(counts[letters[i]] > 0){
								firstClick = true;
								$('.' + letters[i], $letters).slice(0,1).click();
								break;
							}
						}				
					}
			}

			// adds a class to each LI that has text content inside of it (ie, inside an <a>, a <div>, nested DOM nodes, etc)
			//
			function addClasses(){
				var str, firstChar;
				$($list).children().each(function(){
					str = $(this).text().replace(/\s+/g,''); //.toLowerCase(); // strip all white space from text (including tabs and linebreaks that might have been in the HTML) // thanks to Liam Byrne, liam@onsight.ie
					if (str != '') {
						firstChar = str.slice(0,1).toLowerCase();
						if(! isNaN(firstChar)) firstChar = '_'; // use '_' if the first char is a number
						$(this).addClass('ln-' + firstChar);

						if(counts[firstChar] == undefined) counts[firstChar] = 0;
						counts[firstChar]++;
						allCount++;
					}
				});
			}
			
			function addDisabledClass(){
				for(var i=0;i<letters.length;i++){
					if(counts[letters[i]] == undefined) $('.' + letters[i], $letters).addClass('ln-disabled');
				}
			}

			function addNoMatchLI(){
				$list.append('<li class="ln-no-match" style="display:none">' + opts.noMatchText + '</li>');
			}
		
			function getLetterCount(el){
				if($(el).hasClass('all')) return allCount;
				else {
					var count = counts[ $(el).attr('class').split(' ')[0] ];
					return (count != undefined) ? count : 0; // some letters may not have a count in the hash
				}
			}
	
			function bindHandlers(){
							
				// click handler for letters: shows/hides relevant LI's
				//
				$('.ln-letters a').live("click",function(){
					$('.ln-letters a').removeClass('ln-selected');

					var letter = $(this).attr('class').split(' ')[0];
					//alert(letter);
				 
						if(isAll){
							$list.children().hide();
							isAll = false;
						} else if (prevLetter != '') $('.ln-' + prevLetter).hide();
						
						var count = getLetterCount(this);
						if (count > 0) {
							$('.ln-no-match').hide(); // in case it's showing
							$('.ln-' + letter).show();
						}
						else $('.ln-no-match').show();
						
						prevLetter = letter;
					
					
					$(this).addClass('ln-selected');
					$(this).blur();
					if (!firstClick && (opts.onClick != null)) opts.onClick(letter);
					else firstClick = false;
					return false;
				});
			}
			
			// creates the HTML for the letter links
			//	
			function createLettersHtml(){
				var html = [];
				for(var i=1;i<letters.length;i++){
					html.push('<a class="' + letters[i] + '" href="#">' + letters[i].toUpperCase() + '</a>');
				}
				return '<div class="ln-letters">' + html.join('') + '</div>' ;
			}

			init();
		});
	};

	$.fn.listnav.defaults = {
		initLetter: '',
		includeAll: true,
		includeNums: true,
		flagDisabled: true,
		noMatchText: 'No matching entries',
		showCounts: true,
		cookieName: null,
		onClick: null
	};
})(jQuery);
