var current_search_matches = {
	regex_match : Object(),
	regular_match : Object()
};

/**
* get near searched elements stored on current_search_matches
*
* @param string search_word
* @param boolean is_regex
* @return Object
*/
function getNearSearchedTarget(search_word, is_regex)
{
	// no key on current_search_matches
	if (search_word == '')
	{
		return null;
	}
	
	// remove last char (to find prev search)
	var subsearch_word = search_word.substr(0, search_word.length-1);
	if (current_search_matches.regex_match[subsearch_word] && is_regex)
	{
		return current_search_matches.regex_match[subsearch_word];
	}
	else if (current_search_matches.regular_match[subsearch_word])
	{
		return current_search_matches.regular_match[subsearch_word];
	}
	
	// recursive search
	return getNearSearchedTarget(subsearch_word, is_regex)
}

/**
* get match objects from search_target
*
* @param string search_word
* @param Object search_target
* @return Object
*/
function getMatchObjects(search_word, search_target)
{
	// nothing to search
	if (search_word == '')
	{
		return null;
	}
	
	// init values
	var matches = Object();
	search_word = search_word.toLowerCase();
	search_target_original = search_target;
	matches[search_word] = Array();
	var is_regex = true;
	var regex = new RegExp('^'+search_word);
	
	// existing keyword search_word matches
	if (current_search_matches.regex_match[search_word] && current_search_matches.regex_match[search_word].length > 0)
	{
		return current_search_matches.regex_match[search_word];
	}
	else if (current_search_matches.regular_match[search_word])
	{
		return current_search_matches.regular_match[search_word];
	}
	
	// check for near current_search_word_matches key to search_word in
	var near_searched_target = getNearSearchedTarget(search_word, is_regex);
	if (near_searched_target)
	{
		search_target = near_searched_target;
	}
	
	// iterate object for matches (regex)
	for (i in search_target)
	{
		if (search_target[i].network_name.toLowerCase().match(regex))
		{
			matches[search_word].push(search_target[i]);
		}
	}
	
	// if empty start match, search between words
	if (matches[search_word].length == 0)
	{
		is_regex = false;
		
		// check for near current_search_matches key to search_word in
		var near_searched_target = getNearSearchedTarget(search_word, is_regex);
		if (near_searched_target)
		{
			search_target = near_searched_target;
		}
		else
		{
			// if no nearkey in noreg history we use the initial search_target
			search_target = search_target_original;
		}
		
		// iterate object for matches (no regex)
		for (i in search_target)
		{
			if (search_target[i].network_name.toLowerCase().match(search_word))
			{
				matches[search_word].push(search_target[i]);
			}
		}
	}
	
	// add search_word key to current_search_matches
	if (is_regex && !current_search_matches.regex_match[search_word])
	{
		current_search_matches.regex_match[search_word] = matches[search_word];
	}
	else if (!current_search_matches.regular_match[search_word])
	{
		current_search_matches.regular_match[search_word] = matches[search_word];
	}
	
	// return matches
	return matches[search_word];
}

/**
* network search field keyup
*
* @param string search_word
* @param Object network_checkboxes
* @param Object search_target
* @return Object
*/
function networkSearchOnKeyupHandler(search_word, network_checkboxes, search_target)
{
	var offset_top = -1 * network_checkboxes.position().top;
	
	if (search_word == '')
	{
		// if empty search_word we remove highlight and we scroll to the first element
		var li_network = network_checkboxes.find('li:first');
		network_checkboxes.parent().scrollTop(li_network.position().top + offset_top);
		if (jQuery.fn.highlight)
		{
			network_checkboxes.removeHighlight();
		}
	}
	else
	{
		var match = getMatchObjects(search_word, search_target);
		if (match && match.length > 0)
		{
			var li_network = $('#li_network_checkboxes_' + match[0].network_id);
			
			// scroll to first match
			network_checkboxes.parent().scrollTop(li_network.position().top + offset_top);
			
			// remove previous highlights and we highlight the characters that it matches from current search_word
			if (jQuery.fn.highlight)
			{
				network_checkboxes.removeHighlight();
				li_network.find('label').highlight(search_word);
			}
		}
	}
}

/**
* get total checked networks (excluding "Other" network)
*
* @return integer
*/
function getTotalCheckedNetworks()
{
	var network_checkboxes = $('#network_checkboxes');
	var total_checked = network_checkboxes.find('input.checkbox:checked').length;
	if (total_checked > 0)
	{
		if (total_checked == 1 && $('#network_checkboxes_:checked').length == 1)
		{
			total_checked = 0;
		}
	}
	
	return total_checked;
}

/**
* network checkbox click event
*
* @param Object checkbox
* @param Object network_checkboxes
* @return Object
*/
function networkOnClickHandler(checkbox, network_checkboxes)
{
	// validate "other" network
	if ($(checkbox).attr('id') != 'network_checkboxes_')
	{
		// hide - show, if exist extra data on page
		var network_id = $(checkbox).attr('id').match(/\d+/)[0];
		
		if ($(checkbox).is(':checked'))
		{
			if (networks[network_id].has_grad_date)
			{
				if ($('#li_grad_date_' + network_id).length > 0)
				{
					// display existing fields
					$('#li_grad_date_' + network_id).show();
				}
				else
				{
					// create fields
					var li = '<li id="li_grad_date_' + network_id + '">'+
							'<label class="leftSide" for="grad_month_' + network_id + '"><span class="required">*</span>'+networks[network_id].network_name+' Graduation Date</label>'+
							'<select name="grad_month_' + network_id + '" id="grad_month_' + network_id + '">'+
								grad_date_html.grad_month_options_html+
							'</select> '+
							'<select name="grad_year_' + network_id + '" id="grad_year_' + network_id + '">'+
								grad_date_html.grad_year_options_html+
							'</select>'+
							'<a class="remove clickable" onclick="return removeNetworkOnClickHandler(' + network_id + ')">remove</a>'+
						'</li>';
					$('#networks_extra ul.extra').append(li);
				}
			}
			if (networks[network_id].has_access_code)
			{
				if ($('#li_access_code_' + network_id).length > 0)
				{
					// display existing fields
					$('#li_access_code_' + network_id).show();
				}
				else
				{
					// create field
					var li = '<li id="li_access_code_' + network_id + '">'+
							'<label class="leftSide" for="access_code_' + network_id + '"><span class="required">*</span>'+networks[network_id].network_name+' Access Code <a onclick="popup(\'validEmails.php?id=' + network_id + '\', 500, 560)" class="clickable" id="access_code_link_' + network_id + '">[?]</a></label>'+
							'<input type="text" value="" name="access_code_' + network_id + '" id="access_code_' + network_id + '" class="text"/>'+
							'<a class="remove clickable" onclick="return removeNetworkOnClickHandler(' + network_id + ')">remove</a>'+
						'</li>';
					$('#networks_extra ul.extra').append(li);
				}
			}
			if (networks[network_id].has_email_check)
			{
				if ($('#li_email_check_' + network_id).length > 0)
				{
					// display existing fields
					$('#li_email_check_' + network_id).show();
				}
				else
				{
					// create field
					var li = '<li id="li_email_check_' + network_id + '">'+
							'<label class="leftSide" for="email_check_' + network_id + '"><span class="required">*</span>'+networks[network_id].network_name+' School E-mail <a onclick="popup(\'validEmails.php?id=' + network_id + '\', 500, 560)" class="clickable" id="email_check_link_' + network_id + '">[?]</a></label>'+
							'<input type="text" value="" name="email_check_' + network_id + '" id="email_check_' + network_id + '" class="text"/>'+
							'<a class="remove clickable" onclick="return removeNetworkOnClickHandler(' + network_id + ')">remove</a>'+
						'</li>';
					$('#networks_extra ul.extra').append(li);
				}
			}
		}
		else
		{
			// hide unchecked network extra data
			$('#li_access_code_' + network_id).hide();
			$('#li_grad_date_' + network_id).hide();
			$('#li_email_check_' + network_id).hide();
		}
	}
	
	var total_checked = getTotalCheckedNetworks();
	if (total_checked > 0)
	{
		// show Selected Networks container if at least one network is selected
		$('#networks_extra').show();
	}
	else
	{
		$('#networks_extra').hide();
	}
}

/**
* "remove" link click event
*
* @param integer network_id
* @return false
*/
function removeNetworkOnClickHandler(network_id)
{
	$('#network_checkboxes_' + network_id).attr('checked', false);
	$('#li_access_code_' + network_id).hide();
	$('#li_grad_date_' + network_id).hide();
	$('#li_email_check_' + network_id).hide();
	var total_checked = getTotalCheckedNetworks();
	if (total_checked > 0)
	{
		// show Selected Networks container if at least one network is selected
		$('#networks_extra').show();
	}
	else
	{
		$('#networks_extra').hide();
	}
	
	return false;
}

document.onready = function ()
{
	// checkboxes container
	var network_checkboxes = $('#network_checkboxes');
	
	var search_target = networks;
	
	// "Other" network
	search_target[''] = {
		network_id : '',
		network_name : 'Other'
	};
	
	// search_word field
	$('#network_search').click(function(e){
		if (this.value != '')
		{
			// scroll to first match
			var match = getMatchObjects(this.value, search_target);
			if (match && match.length > 0)
			{
				network_checkboxes.parent().scrollTop($('#li_network_checkboxes_' + match[0].network_id).position().top - network_checkboxes.position().top);
			}
		}
	}).keyup(function(e){
		networkSearchOnKeyupHandler(this.value, network_checkboxes, search_target);
	});
	if ($('#network_search').val() != '')
	{
		networkSearchOnKeyupHandler($('#network_search').val(), network_checkboxes, search_target);
	}
	
	// network checkbox event
	network_checkboxes.find('input.checkbox').click(function(){
		networkOnClickHandler(this, network_checkboxes);
	});
	network_checkboxes.find('input.checkbox').each(function(){
		networkOnClickHandler(this, network_checkboxes);
	});
}