$( function() {
	/**
	 * Functionality for universitu & facultyselct in front-page leaderboard
	 */
	var EnterSchoolSelect = function() {
		var self = this;
		
		self.universitiesInput = null;
		
		self.hasFaculties = false;
		
		self.enclosingParagraph = null;
		
		self.noFacultiesElement = $('<span>').addClass('entry-select-no-faculties-message warning-message message').text(AppConfig.texts.noFacultiesToSelect);
		
		/**
		 * Map CZ & SK unicode to ASCII
		 */
		self.accentMap = {
			"\u013e":"l",
			"\u0161":"s",
			"\u010d":"c",
			"\u0165":"t",
			"\u017e":"z",
			"\u00fd":"y",
			"\u00e1":"a",
			"\u00ed":"i",
			"\u00e9":"e",
			"\u011b":"e",
			"\u00e4":"a",
			"\u00f4":"o",
			"\u0148":"n",
			"\u010f":"d",
			"\u0159":"r",
			"\u016f":"u",
			"\u00fa":"u"
		};
		
		/**
		 * Transliterate Unicode string to ASCII
		 */
		self.normalize = function( term ) {
			termLC = term ? term.toLowerCase() : '';
			var ret = "";
			for ( var i = 0; i < termLC.length; i++ ) {
				ret += self.accentMap[ termLC.charAt(i) ] || termLC.charAt(i);
			}
			return ret;
		}
		
		/**
		 * Replace all metacharacters and stuff
		 */
		self.escapeRegex = function( value ) {
			return value.replace(/[-[\]{}()*+?.,\\^$|#\s]/g, "\\$&");
		}
		
		/**
		 * Function for filtering results based on value of input
		 * 
		 * @return Array of matching results
		 */
		self.filterResults = function( request, callback ) {
			var matcher = new RegExp( self.normalize( self.escapeRegex(request.term) ), "i" );
			var results = $.grep( entrySelectUniversities, function(value) {
				return matcher.test( self.normalize(value.nazev) ) || matcher.test( self.normalize(value.mesto) ) || matcher.test( self.normalize(value.oficialni_zkratka) );
			} ).slice( 0, 10 );
			
			if( callback ) callback( results ); else return results;
		}
		
		self.invalidateUniversity = function() {
			$("#unid").val(0);
			self.enclosingParagraph.slideUp();
		}
		
		/**
		 * Called when user selects an university from drop-down menu
		 * 
		 * Setups faculty options for faculty combobox
		 */
		self.setupFacultiesSelect = function( id, callback ) {
			var faculties = entrySelectFaculties[ id ];
			
			// remove previously attached faculties
			self.select.empty();
			
			// if there is any faculty to display, do it
			if( faculties ) {
				// if faculties is array of faculties (it can be a single instance), append all the array members to select
				if( faculties.length > 1 ) {
					$('<option>').val(0).text(AppConfig.texts.noFaculty).appendTo(self.select);
					for( var i in faculties ) {
						$('<option>').val(faculties[i].id).text(faculties[i].nazev).appendTo(self.select);
					}
					
					self.select.show().removeAttr('disabled');
				} else {
					self.select.hide().attr('disabled', 'disabled');
					self.enclosingParagraph.append( self.noFacultiesElement );
				}
				
				self.enclosingParagraph.slideDown( 300, callback );
			} else {
				self.enclosingParagraph.slideUp();
			}
			
			self.select.change();
		}
		
		/**
		 * Rolls the facultiesdrop down menu out
		 */
		self.launchFacultySelect = function() {
			$('#enter-university-faculty').siblings('button').click();
		}
		
		self.universitiesInput = $('#enter-university-input');
		
		/**
		 * Setups autocomplete input for university select
		 */
		self.universitiesInput.autocomplete( {
			source: self.filterResults,
			
			focus: function( event, ui ) {
				self.universitiesInput.val( ui.item.nazev );
				return false;
			},
			
			change: function( event, ui ) {
				if( !ui.item ) {
					self.invalidateUniversity();
				}
				
				self.setupFacultiesSelect( ui.item ? ui.item.id : null );
			},
			
			select: function( event, ui ) {
				self.universitiesInput.val( ui.item.label );
				$("#unid").val( ui.item.id );
				
				self.setupFacultiesSelect( ui.item.id, self.launchFacultySelect );
	
				return false;
			}
		} )
		.addClass('ui-autocomplete-input ui-widget ui-widget-content ui-corner-left ui-corner-right')
		.data( "autocomplete" )._renderItem = function( ul, item ) {
			return $( "<li/>" )
				.data( "item.autocomplete", item )
				.append( '<a><span class="enter-universities-list-item">' + item.oficialni_zkratka + "</span><br />" + item.nazev + ", " + item.mesto + "</a>" )
				.appendTo( ul );
		}
		
		self.select = $('#enter-university-faculty').change( function() {
			$('#fakid').val(self.select.val());
		});
		
		self.enclosingParagraph = self.select.closest('p');
		
		/**
		 * Setup the faculties combobox and hide it until user selects university
		 */
		self.enclosingParagraph.hide();
		
		self.universitiesInput.closest('form').submit( function(event) {
			var unid = $('#unid').val();
			var fakid = $('#fakid').val();
			var uni = $.grep( entrySelectUniversities, function(value) {
				return value && value.id == unid;
			}).pop();
			
			if( !unid || !uni || uni.nazev != self.universitiesInput.val() ) {
				// alert user about no faculty issue
				alert('Zadaná univerzita/fakulta na primátu není. Zkus vybrat jinou.');
				return false;
			}
		} );
		
		/**
		 * Setup dialog modal window displaying university select
		 */
		$('#entry-select-enter').fancybox({
			titleShow: false,
			enableEscapeButton: false,
			scrolling: 'no'
		});
		
		/**
		 * Fancybox reacts to window resizing, so close university select on window resize
		 */
		$(window).resize( function() {
			self.universitiesInput.data('autocomplete').close();
		});
	}
	
	var enterSchoolSelect = new EnterSchoolSelect();
} );
