// Removing search results
function hideSearchResults() {
/* hiding search results as the user clicks on the different categories */
  $('#resultdialog').removeClass('active');
	$("#resultlist").removeClass().addClass('all');
	$("#resultlinks").removeClass().addClass('all');
	$("#searchcount").removeClass().addClass('all');
}
/* closing the searhc result dialog */
$('#resultclose').click(function(e) {
  e.preventDefault();
  hideSearchResults();
});

$(document.body).click(function() {
});

/* START non link areas where cursor should change to pointing hand */
$('.t_button').mouseover(function() {
    $('.t_button').css('cursor','pointer');
});
/* END non link areas  */
/* Changing font size to smaller */
$('#smallA').click(function() {
		$('.mainContent .heading,.mainContent h1, .mainContent h2, .mainContent h3, .mainContent p, .mainContent li, .mainContent table').css('font-size','smaller');
		$('.t_button').removeClass('active')
		$(this).addClass('active')
});

/* Reset font size */
$('#medA').click(function() {
		$('.mainContent .heading').css('font','600 16px/1 Arial');
		$('.mainContent h1').css('font','600 18px/1.2 Arial');
		$('.mainContent h2').css('font','600 16px/1.2 Arial');
		$('.mainContent h3').css('font','600 14px/1.2 Arial');
		$('.mainContent p').css('font','13px/20px Verdana');
		$('.mainContent li').css('font','400 13px/1 Verdana');
		$('.mainContent li').css('line-height','14px');
		$('.mainContent .toc li').css('font', 'normal 10px/1.2 Verdana');
		$('.mainContent table').css('font','13px/1.2 Verdana');
		$('.mainContent .heading').css('font','600 16px/1 Arial');
		$('.mainContent .indexboxcont li').css('font','600 13px/1 Verdana');
		$('.t_button').removeClass('active')
		$(this).addClass('active')
});
/* Changing font size to bigger */
$('#bigA').click(function() {
		$('.mainContent .heading,.mainContent h1, .mainContent h2, .mainContent h3, .mainContent p, .mainContent li, .mainContent table').css('font-size','large');
		$('.mainContent .heading,.mainContent h1, .mainContent h2, .mainContent h3, .mainContent p, .mainContent li, .mainContent table').css('line-height','25px');
		$('.t_button').removeClass('active')
		$(this).addClass('active')
});

/* Show page content after closing feedback box */
$('.feedclose').click(function() {
	$('.bd').show();
	$('.hd').show();
	$('.footer').show();
	$('#feedbackBox').hide();
	$('#blurpage').hide();
});

/* Hide page content and show feedback box */
$('.feedback').click(function() {
	$('.bd').hide();
	$('.hd').hide();
	$('.footer').hide();
	$('#feedbackBox').show();
	$('#blurpage').show();
});
/* Default search URL */
var qturl = "";

/* The next function handles the response data (in xml) returned by the search engine */

// Process data sent back from the server. The data is structured as a XML.
/*
XML structure handled by function processNokiaData()
<page> - container for each page returned
<pageWords/> - contains keywords
<pageTitle/> - contains page title/header content 
<pageUrl/> - contains page URL - URL relative to root
<pageType> - contains page type - APIPage/Article/Example
</page>
*/


function processNokiaData(response){
/* fetch the responce from the server using page as the root element */
	var propertyTags = response.getElementsByTagName('page');
	/* reset counters */	
	var apiCount = 0;
	var articleCount = 0;
	var exampleCount = 0;
	var full_li_element;

/* remove any old results */
	$('#resultlist li').remove();


	/* running through the elements in the xml structure */
 	for (var i=0; i<propertyTags.length; i++) {
		/* for every element named pageWords*/
		for (var j=0; j< propertyTags[i].getElementsByTagName('pageWords').length; j++) {
			/* start a new list element */
			full_li_element = '<li';
					/* if the pageType element reads APIPage, add class name api */
      if (propertyTags[i].getElementsByTagName('pageType')[0].firstChild.nodeValue == 'APIPage') {
      	full_li_element += ' class="api"';
      	apiCount++;
      }
					/* if the pageType element reads Article, add class name article */
      else if (propertyTags[i].getElementsByTagName('pageType')[0].firstChild.nodeValue == 'Article') {
      	full_li_element += ' class="article"';
      	articleCount++;
      }
					/* if the pageType element reads Example, add class name example */
      else if (propertyTags[i].getElementsByTagName('pageType')[0].firstChild.nodeValue == 'Example') {
      	full_li_element += ' class="example"';
      	exampleCount++;
      }
			/* adding the link element*/
			full_li_element += '><a href="'+qturl;
			/* adding the URL attribute*/
			full_li_element += propertyTags[i].getElementsByTagName('pageUrl')[j].firstChild.nodeValue;
      		/* adding the link title and closing the link and list elements */
			full_li_element += '">' + propertyTags[i].getElementsByTagName('pageWords')[0].firstChild.nodeValue + '</a></li>';
			/* appending the list element to the #resultlist div*/
			$('#resultlist').append(full_li_element);
		}
	}

	/* if the result is not empty */
	if (propertyTags.length > 0) {
	/* add class name active to show the dialog */
	  $('#resultdialog').addClass('active');
	  /* setting number of hits*/
	  $('#resultcount').html(propertyTags.length);
	  $('#apicount').html(apiCount);
	  $('#articlecount').html(articleCount);
	  $('#examplecount').html(exampleCount);
	  
	}
	else {
	  $('#pageType').addClass('red');
	  }
  


  // Filtering results in display
	$('p#resultlinks a').click(function(e) {
  	e.preventDefault();
	// Displays API ref pages
		if (this.id == "showapiresults") {
			$("#resultlist").removeClass().addClass('api');
			$("#resultlinks").removeClass().addClass('api');
			$("#searchcount").removeClass().addClass('api');
		}
	// Displays Articles
		else if (this.id == "showarticleresults") {
			$("#resultlist").removeClass().addClass('article');
			$("#resultlinks").removeClass().addClass('article');
			$("#searchcount").removeClass().addClass('article');
		}
	// Displays Examples
		if (this.id == "showexampleresults") {
			$("#resultlist").removeClass().addClass('example');
			$("#resultlinks").removeClass().addClass('example');
			$("#searchcount").removeClass().addClass('example');
		}
	// Displays All
		if (this.id == "showallresults") {
			$("#resultlist").removeClass().addClass('all');
			$("#resultlinks").removeClass().addClass('all');
			$("#searchcount").removeClass().addClass('all');
		}
	});
}

//build regular expression object to find empty string or any number of blank
var blankRE=/^\s*$/;


function CheckEmptyAndLoadList()
{
	/* Start Extracting information for feedback and adding this to the feedback form */
	var pageUrl = window.location.href;
	var pageVal = $('title').html();
	$('#pageType').removeClass('red');
	$('#feedUrl').remove();
	$('#pageVal').remove();
	$('.menuAlert').remove();
	$('#feedform').append('<input id="feedUrl" name="feedUrl" value="'+pageUrl+'" style="display:none;">');
	$('#feedform').append('<input id="pageVal" name="pageVal" value="'+pageVal+'" style="display:none;">');
	/* End Extracting information for feedback and adding this to the feedback form */

	/* extracts search query */
	var value = document.getElementById('pageType').value; 
	/* if the search is less than three chars long remove class names and remove elements from old search*/
	if((blankRE.test(value)) || (value.length < 3))
	{
	$('#resultdialog').removeClass('active');
	$('#resultlist li').remove();
	}
}

// Loads on doc ready - prepares search 
	$(document).ready(function () {
	/* fetch page title*/ 
	var pageTitle = $('title').html();
	/* getting content from search box */
          var currentString = $('#pageType').val() ;
	  /* if the search box is not empty run CheckEmptyAndLoadList*/
		  if(currentString.length < 1){
      	   		CheckEmptyAndLoadList();			
		  }

		/* on key-up in the search box execute the following */
        $('#pageType').keyup(function () {
		/* extract the search box content */
          var searchString = $('#pageType').val() ;
	  /* if the string is less than three characters */
          if ((searchString == null) || (searchString.length < 3)) {
			/* remove classes and elements*/
				$('#pageType').removeClass('loading');
				 $('.searching').remove(); 
			/*  run CheckEmptyAndLoadList */
      	   		CheckEmptyAndLoadList();

				$('.report').remove();
				return;
		   }
	   /* if timer checks out */
            if (this.timer) clearTimeout(this.timer);
            this.timer = setTimeout(function () {
			/* add loading image by adding loading class */
				$('#pageType').addClass('loading');
				$('.searching').remove(); 

			/* run the actual search */
               $.ajax({
                contentType: "application/x-www-form-urlencoded",
                url: 'http://' + location.host + '/nokiasearch/GetDataServlet',
                data: 'searchString='+searchString,
                dataType:'xml',
				type: 'post',	 
                success: function (response, textStatus) {
				/* on success remove loading img */
				$('.searching').remove(); 
				$('#pageType').removeClass('loading');

                processNokiaData(response);

 }     
              });
            }, 500); /* timer set to 500 ms */
        });
      }); 