//global variables and objects
var webserviceLocation = '/service/Charities.asmx/CharityAutocomplete';
////Cities autocomplete
var webserviceCity = '/service/Cities.asmx/CityAutocomplete';

var webserviceReturns = 'xml';
var listClass = 'sonicSuggestionList';
var eventHookClass = 'sonicSuggest';
//// Cites hook Class
var eventHookClassCity = 'sonicSuggestCity';

var currentXmlFile = '';
//Regular Expression Patterns
var alphaNumericRegEx = '[a-zA-Z0-9]';
//Regular expression Function
function regExChecker(stringToCheck, patternToCheckAgainst)
{
var result = false;
if (stringToCheck.match(patternToCheckAgainst))
{
result = true;
}
return result;
}
//Find the last character of a string
function getTheLastCharacter (string)
{
var stringLength = string.length;
var result = string.substring(stringLength - 1);
return result;
}
//Ask the webservice to create the XML
function askTheServer (queryString, field)
{
$.ajax ({
    type: 'GET',
    url: webserviceLocation,
    data: {'CharityName': queryString},
    dataType: webserviceReturns,
    error: function (error, errorThrown){queryError (error, errorThrown)},
    success: function(data){
    currentXmlFile = data;
    querySucceeds(data, field)}
});
}
////Ask the webservice to create the XML for Cities
function askTheServerCities (queryString, field)
{
$.ajax ({
    type: 'GET',
    url: webserviceCity,
    data: {'CityName': queryString},
    dataType: webserviceReturns,
    error: function (error, errorThrown){queryError (error, errorThrown)},
    success: function(data){
    currentXmlFile = data;
    querySucceedsCity(data, field)}
});
}

//When the webservice hits an error, do the following
function queryError (error, errorThrown)
{
//console.log('Error: ' + error + ', Error Thrown: ' + errorThrown);
return false;
}
//When the webservice returns successfully, do the following
function querySucceeds (returnedXML, field)
{
clearList();
if ($(returnedXML).find('Charity').length > 0)
{
$('body').append('<ul class="' + listClass + '"></ul>');
positionList('#' + field);
$(returnedXML).find('Charity').each(function(i)
{
    $('.' + listClass).append('<li><a href="#">' + $('Name',this).text() + '</a></li>');
    if ( i == 9 ) return false;
});
addSuggestionToInput(field);
boldMatchingSearchQuery ($('#' + field).val());
}
}
//// Cities Webservice success
function querySucceedsCity (returnedXML, field)
{
clearList();
if ($(returnedXML).find('City').length > 0)
{
$('body').append('<ul class="' + listClass + '"></ul>');
positionList('#' + field);
$(returnedXML).find('City').each(function(i) {
    $('.' + listClass).append('<li><a href="#">' + $('Name',this).text() + '</a></li>');
    if ( i == 9 ) return false;
});
addSuggestionToInput(field);
boldMatchingSearchQuery ($('#' + field).val());
}
}
//When a suggested option is clicked
function addSuggestionToInput(field)
{
$('.' + listClass + ' a').bind('click', function() {
    var suggested = $(this).text();
    $('#' + field).val(suggested);
    clearList()
    return false;
});
}
//Position the list
function positionList(activeInput)
{
var pos = $(activeInput).offset();
var aiWidth = $(activeInput).outerWidth();
var slWidth = aiWidth;
var left = (pos.left + aiWidth - slWidth) + "px";//May not need to subtract aiWidth from slWidth
var top = $(activeInput).height() + pos.top + 5 + "px";
$('.' + listClass).css( { 
    'position': 'absolute',
    'margin': '0px auto',
    'padding' : '0px',
    'left': left, 
    'top': top,
    'width': slWidth
} );
}
//Bold the text that matches in the search query
function boldMatchingSearchQuery (textToMatch)
{
	//Regular Expression to find words that starts with textToMatch - search is case-insensitive (i)
	var searchText = new RegExp("\\b" + textToMatch, "i");
	$('.' + listClass + ' a').each(function(){
		//Put the matched text into a variable - we don't want to change the case of the matched text
		var matchedText = $(this).html().match(searchText);
		$(this).html(
			$(this).html().replace(searchText, '<strong>' + matchedText + '</strong>')
	    );
	});
}
//Remove the list
function clearList()
{
$('.' + listClass).remove();
}
//Allowing the up and down keys to be used for selection
function highLightSelection (keyCode)
{
    if (keyCode == 38)
    {
        var currentSelection = $('.' + listClass).children().find('.selected');
        if (currentSelection = null)
        {
            return false;
        }
        else
        {
            currentSelection.Parent().addClass('selected');
        }
    }
    else if (keyCode == 40)
    {
        
    }
    else
    {
        return false;
    }
}
//Event listener for the keypress
function waitForKeyPress (activeField)
{
waitForBlur();//check if you lose focus before anything is pressed
//$(activeField).attr('autocomplete', 'off');
$(activeField).keyup(function(keyPressed) {
        var fieldValue = $(this).val();
        var fieldId = $(this).attr('id');
        if (fieldValue.length > 0)
        {
            if (regExChecker(getTheLastCharacter(fieldValue),alphaNumericRegEx))
            {
                askTheServer(fieldValue, fieldId);
            }
        else {return false;}
        }
        else {clearList();}
});
}
//// Event Listner City for key press
function waitForKeyPressCity (activeField)
{
waitForBlurCity();//check if you lose focus before anything is pressed
$(activeField).keyup(function(keyPressed) {
        var fieldValue = $(this).val();
        var fieldId = $(this).attr('id');
        if (fieldValue.length > 0)
        {
            if (regExChecker(getTheLastCharacter(fieldValue),alphaNumericRegEx))
            {
                askTheServerCities(fieldValue, fieldId);
            }
        else {return false;}
        }
        else {clearList();}
});
}
//Event Listener for unfocus
function waitForBlurCity()
{
$('.' + eventHookClassCity).blur(function() {
    $('.' + listClass).slideUp(300, function(){
        clearList();
    });
});
}

//Event Listener for unfocus
function waitForBlur()
{
$('.' + eventHookClass).blur(function() {
    $('.' + listClass).slideUp(300, function(){
        clearList();
    });
});
}
//Initialize the whole thing
$(document).ready(function(){
$('#searchDrawer').hide();
    searchToggle();
    charitySearchSubmit();
    $('.' + eventHookClass).focus(function() {
        waitForKeyPress ($(this));
    });
 ////
    $('.' + eventHookClassCity).focus(function() {
        waitForKeyPressCity ($(this));
    });    
    
});//document.ready call ends

//Below is for the stuff outside of the plugin

//create the drawer
function searchToggle()
{
    $('#charitySearch h3').click(function() {
        var drawerMarker = this;
        $('#searchDrawer').slideToggle('300', function(){
            if ($('#charitySearch h3').is ('.open'))
            {
                $('#charitySearch h3').removeClass('open');
            }
            else
            {
                $('#charitySearch h3').addClass('open');
            }
        });
    });
}
//When the search form is submitted
function charitySearchSubmit()
{
    $('#charitySearchOptionList').hide();
    $('input#charitySearchSubmitButton').click(function(){
        var charitySubmitted = $('input#searchCharity').val();
        if (checkTheXml(charitySubmitted))
        {
            function getTheLink(charityToCheck)
            {
                $(currentXmlFile).find('Charity').each(function(i) {
                    var currentCharity = $('Name', this).text();
                    if (currentCharity.toLowerCase() == charityToCheck.toLowerCase())
                    {
                        result = $('Name', this).parent('Charity').attr('name');
                    }
                });
                return result;
            }
            var charityValidated = getTheLink(charitySubmitted);
            $('#charitySearchViewThisCharity').removeAttr('disabled');
            $('#charitySearchMessagingBox').children().remove();
            $('#charitySearchViewThisCharity').attr('href','/gallery\/#/'+ charityValidated + '/');
            $('#charitySearchSupportThisCharity').attr('href','/registration.aspx/?charity='+ charitySubmitted);
        }
        else
        {
            $('#charitySearchViewThisCharity').attr('disabled','disabled');
            $('#charitySearchMessagingBox').children().remove();
            $('#charitySearchViewThisCharity').removeAttr('href');
            $('#charitySearchMessagingBox').append('<p>The charity you are searching for is new to us.</p><p>Be the first to support<h4>' + charitySubmitted + '</h4>');
            $('#charitySearchSupportThisCharity').attr('href','/registration.aspx/?charity='+ charitySubmitted);
        }
        $('#charitySearchOptionList').fadeIn('slow');
        return false;
    });
}
//check the XML for the submitted value
function checkTheXml(charityToCheck)
{
    var result = false;
    $(currentXmlFile).find('Charity').each(function(i) {
        var currentCharity = $('Name', this).text();
        if (currentCharity.toLowerCase() == charityToCheck.toLowerCase())
        {
            result = true;
        }
    });
    return result;
}

//Hover Tooltip
$(document).ready(function(){
    $(".toolTip").hover(
    function() {
        this.tip = this.title;
        $(this).append("<div class='toolTipWrapper'>"+this.tip+"<div class='toolTipBottom'></div></div>");
        this.title = "";
        this.width = $(this).width();
	    this.height = $(this).height();
        $(this).find(".toolTipWrapper").css({left :this.width -50})
	    $(this).find(".toolTipWrapper").css({bottom :3 + this.height})
        $(".toolTipWrapper").fadeIn(300);
    },
    function() {
        $(".toolTipWrapper").fadeOut(300);
        $(this).children().remove();
        this.title = this.tip;
    })
});