(function($){
        $.fn.jwTabs = function(f){
                var f=$.extend(
                        {
                                fade:null,
                                tabTitleReference:null,
                                tabContainerName:'tab-items',
                                tabPrependTo:'content',
                                tabDef: null,
                                startTab: 0,
                                switchToTabOnDropChange: false
                        },f);
                						 
								var getCookieName = function()
								{
									var url = document.location.toString();
									return 'jwntabs' + '--' + this.tabContainerName + '--';
								}
								
								var getCookie = function(name)
								{
									var cname = name + "=";               
									var dc = document.cookie;   
									if (dc.length > 0) 
									{
									  var begin = dc.indexOf(cname);       
									  if (begin != -1) 
									  {
									  	begin += cname.length;       
									    var end = dc.indexOf(";", begin);
									    if (end == -1) end = dc.length;
									    return dc.substring(begin, end);
									  }
									}
									return '';
								}
								
								var setCookie = function(name, value) 
								{ 
									document.cookie = name + "=" + value;
								}
								
								var getDivsAsOptions = function(a, source, startIndex)
								{
									var result = '';
									
									for (var i = 0; i < a.length; i++)
										result += '<li rel="' + i + '"' + (startIndex == i ? ' class="active"' : '') + '>' +
											source.children('div:#' + expandId(a[i])).find(f.tabTitleReference).filter(':first').text() +
											'</li>';
											
									return result;
								}
								
								var showTabContent = function (el)
								{
                	f.fade ? el.fadeIn(f.fade) : el.show();
                }
                
                var expandId = function (id)
                {
                	return isNaN(parseInt(id)) ? id : 'category_' + id;
                }
								
								var tabDefCreateTab = function(i, html, source)
								{
									this.tabIndex = i;
									this.divs = source;
									
									if (this.tabType != 'hidden')
									{
										html += '<li class="left"><a href="" rel="'+i+'">';
									
										if (this.tabType == 'all')
											html += this.tabTitle + '</a>';
										else if (this.tabType == 'single')
										{
											html += (this.tabTitle != '' ? this.tabTitle :
												(f.tabTitleReference ? source.children('div:#' + expandId(this.tabRef)).find(f.tabTitleReference).filter(':first').text() : i.toString())) + '</a>';
										}
										else if (this.tabType == 'drop')
										{
											var startIndex = parseInt(getCookie(getCookieName() + 'startIndex--' + this.tabIndex));
											this.dropIndex = isNaN(startIndex) ? this.startIndex : startIndex;
											html += '<span class="drop">';
											html += this.tabTitle + '</span></a>';
											html += '<div class="subselect"><ul>' + getDivsAsOptions(this.tabRef, source, this.dropIndex) + '</ul></div>';
										}
										
										html += '</li>';
									}
									else
										html += '<li style="display: none"></li>';
									
									return html;	
								}
								
								var tabDefAttachEvents = function(li)
								{
									this.tabObject = li;
									this.spanObject = $(li).find('span').get(0);
									this.submenu = $(li).find('div').get(0);
									
									var that = this;
									$(li).children('a').click(function() { that.onClick(); return false; });
									if (this.tabType == 'drop')
										$(li).hover(function () { that.onDropClick(); return false; }, function () { });
								}
								
								var tabDefShow = function()
								{									
									if (this.tabType == 'single' || this.tabType == 'hidden')
										showTabContent(this.divs.find('div:#' + expandId(this.tabRef)));
									else if (this.tabType == 'drop')
									{
										var id = expandId(this.tabRef[this.dropIndex]);
										for (var i = 0; i < this.tabRef.length; i++)
											if (expandId(this.tabRef[i]) == id)
												showTabContent($('#' + expandId(this.tabRef[i])));
											else
												$('#' + expandId(this.tabRef[i])).hide();
									}
								}
								
								var tabDefHide = function()
								{
									if (this.tabType == 'single' || this.tabType == 'hidden')
										this.divs.find('div:#' + expandId(this.tabRef)).hide();
									else if (this.tabType == 'drop')
									{
										for (var i = 0; i < this.tabRef.length; i++)
											$('#' + expandId(this.tabRef[i])).hide();
									}
								}
								
								var tabDefClick = function()
								{
									if ($(this.tabObject).hasClass('tab-selected'))
										return;
									
									$('#'+f.tabContainerName).find('li.tab-selected').removeClass('tab-selected');
									
									if (this.tabType == 'all')
										for (var i = 0; i < f.tabDef.length; i++)
											f.tabDef[i].onShow();
									else if (this.tabType == 'single' || this.tabType == 'drop')
									{
										for (var i = 0; i < f.tabDef.length; i++)
											if (f.tabDef[i] != this)
												f.tabDef[i].onHide();
										this.onShow();
									}
									
									$(this.tabObject).addClass('tab-selected');
									setCookie(getCookieName() + 'startTab', this.tabIndex);
								}
								
								var tabDefDropClick = function()
								{
									var that = this;
									
									$(this.submenu).find('li').unbind('click').click(function () {
										that.dropIndex = parseInt($(this).attr('rel'));
										$(that.submenu).find('li').removeClass('active');
										$(this).addClass('active');
										$(that.submenu).slideUp("fast");
										that.onDropChange();
									});
									$(this.submenu).slideDown("fast").show();	
									$(this.tabObject).hover(function() {  }, function() {
      		        	$(that.submenu).slideUp("fast");  
  		         		});
								}
								
								var tabDefDropChange = function()
								{
									setCookie(getCookieName() + 'startIndex--' + this.tabIndex, this.dropIndex);
									if ((!f.switchToTabOnDropChange) || $(this.tabObject).hasClass('tab-selected'))
										this.onShow();
									else if (f.switchToTabOnDropChange)
										this.onClick();
								}
                
                return this.each(function(){
                
	        				// add methods to tabDef objects
	        				for (var i = 0; i < f.tabDef.length; i++)
	        				{
	        					f.tabDef[i].createTab = tabDefCreateTab;
	        					f.tabDef[i].attachEvents = tabDefAttachEvents;
	        					f.tabDef[i].onShow = tabDefShow;
	        					f.tabDef[i].onHide = tabDefHide;
	        					f.tabDef[i].onClick = tabDefClick;
	        					f.tabDef[i].onDropChange = tabDefDropChange;
	        					f.tabDef[i].onDropClick = tabDefDropClick;
	        				}
                
                  var divs = $(this);
                  
									var tabContainer = '<ul id="'+f.tabContainerName+'" class="clearfix"><div class="tooltip"><div>Wybierz uczelnię</div></div>';
                  for (var i = 0; i < f.tabDef.length; i++)
                  	tabContainer = f.tabDef[i].createTab(i, tabContainer, divs);
									tabContainer += '</ul>';
                  $(tabContainer).prependTo("#" + f.tabPrependTo);
                  
                  i = 0;
                  $('#'+f.tabContainerName).children('li').each(function() {
                  	f.tabDef[i++].attachEvents(this);
                  });
                  
                  var startTab = parseInt(getCookie(getCookieName() + 'startTab'));
                  f.tabDef[isNaN(startTab) ? f.startTab : startTab].onClick();
                });
        }
})(jQuery);
