//
//  search_triggers.js
//
//
//  Sets all event handlers for the page load on search results
//

var iTunesGeoMap = {
	US: "US",
	AU: "AU",
	CA_EN: "CA",
	CA_FR: "CA",
	DE: "DE",
	UK: "GB",
	FR: "FR",
	CH_DE: "CH",
	CH_FR: "CH",
	JP: "JP",
	IT: "IT",
	ES: "ES",
	NL: "NL",
	BE_FR: "BE",
	BE_NL: "BE",
	LA: "LA",
	KR: "KR",
	SE: "SE",
	DK: "DK",
	FI: "FI",
	NO: "NO",
	BR: "BR"
};

lastSelectedRating = false;
// An array of ids that correspond to elements
var domTriggers = {
  
  // Feedback form
  'feedback_form' : function(element){
    feedbackForm = new FeedbackForm(null, element);
    
    element.onsubmit = function(){
      this.submit();
      return false;
    }.bind(feedbackForm);
    
    var raters = document.getElementsByClassName('rater', element)[0].getElementsByTagName('a');
    for(var i = 0;i<raters.length;i++){
      rater = raters[i];
      rater.onclick = function(){
        $('feedback_rating').value = this.firstChild.nodeValue;
        if (lastSelectedRating); Element.removeClassName(lastSelectedRating, 'selected');
        Element.addClassName(this, 'selected');
        lastSelectedRating = this;
        return false;
      }
    }
  },
  
  // Sidebar collapseable elements
  'sidebar' : function(element){
    h3s = element.getElementsByTagName('h3');
    for(var i=0;i<h3s.length;i++){
      h3 = h3s[i];
      if (h3.getAttribute('container')){
        h3.onclick = function(){
          var container = $(this.getAttribute('container'));
          Element.hasClassName(this, 'collapsed') ? Effect.BlindDown(container , {duration: .2}) : Effect.BlindUp(container , {duration: .2});
          Element.hasClassName(this, 'collapsed') ? Element.removeClassName(this, 'collapsed') : Element.addClassName(this, 'collapsed');
        }
      }
    }
  },
  'clear-searches' : function(element){
    element.onclick = function(){
      SavedSearch.clear();
      return false;
    }
  }
}



var CategoryTrigger = Class.create();
Object.extend(CategoryTrigger.prototype, Event.Listener);
Object.extend(CategoryTrigger.prototype, {
	
	initialize: function(trigger, category, env) {
		this.trigger = trigger;
		this.category = category;
		this.env = env;
		
		Event.observe(trigger, 'click', function(evt) {
			Event.stop(evt);
			this.select();
		}.bindAsEventListener(this));
		
		if (this.category) {
			this.listenForEvent(this.category, 'showmore', false, this.indicateSelected);
			//TODO listen for the category claiming it's empty so we know not to do anything
		} else {
			this.listenForEvent(this.env.searchApp, 'showall', false, this.indicateSelected);
		}
		
	},
	
	select: function() {
		
		if (this.env.currentTrigger == this) {
			return;
		}
		
		if (this.category) {
			this.env.searchApp.isolateCategory(this.category);
		} else {
			this.env.searchApp.showAllCategories();
		}
		
		this.indicateSelected();
		
	},
	
	indicateSelected: function() {
		if (this.env.currentTrigger != this) {
			Element.addClassName(this.trigger, 'selected');
			this.env.currentTrigger.deselect();
			this.env.currentTrigger = this;
		}
	},
	
	deselect: function() {
		Element.removeClassName(this.trigger, 'selected');
	}
	
	
});


var SearchEnvironment = Class.create();
Object.extend(SearchEnvironment.prototype, {

	term: null,
	categories: null,

	triggers: null,
	currentTrigger: null,

	searchApp: null,
	
	initialize: function() {

		var ss = new SavedSearch; 
		ss.render('previous-searches');

		this.term = window.location.search.toQueryParams()['q'];
		if(this.term) {
			this.term = Search.sanitize(this.term);
		} else {
			return;
		}

		var geo = "fr";
		// check for geo flag, this should be set in the embedding page
		if (typeof(searchCountry) != 'undefined' && searchCountry) {
			geo = searchCountry.toLowerCase();
			geo = geo.replace(/_/,""); // remove underscores
		}

		var requestUrl = '/cgi-bin/sp/nph-search6?site=' + geo + '_only&filter=1&snum=50&q=' + this.term;
		
		this.categories = {
			products: new Search.TextCategory('Produits', 'results-products', {
				scope: 'products', 
				requestUrl: requestUrl}),

			downloads: new Search.TextCategory('Téléchargements', 'results-downloads', {
				scope: 'downloads',
				requestUrl: requestUrl}),

			itunes: new Search.iTunesCategory('iTunes', 'results-itunes'),

			markets: new Search.TextCategory('Marchés', 'results-markets', {
				scope: 'markets',
				requestUrl: requestUrl}),

			support: new Search.TextCategory('Support', 'results-support', {
				scope: 'support',
				requestUrl: requestUrl}),

			company: new Search.TextCategory('Société', 'results-company', {
				scope: 'company',
				requestUrl: requestUrl}),
				
			store: new Search.StoreCategory('The Apple Store', 'results-store', {
					scope: 'store',
					requestUrl: requestUrl})}
	
		this.searchApp = new Search.Application(this.categories);
		//TODO only exposing this property globally temporarily becasue so much 
		//is relying on it being available :-/
		SearchResults = this.searchApp;
		
		//itunes and the store need to know its term so they can link back
		//but eh really not thrilled with this solution
		this.categories.itunes.term = this.term;
		this.categories.store.term = this.term;

		var fullSearch = new Search.FullSearchRequest(requestUrl, {
			onSuccess: SearchResults.acknowledgeResponse.bind(SearchResults),
			onFailure: SearchResults.error.bind(SearchResults) });
			
		this.searchApp.requiredRequests.push(fullSearch); //TODO hide the implementation a bit better?
		
		var country = "FR";
		// check for geo flag, this should be set in the embedding page
		if (typeof(searchCountry) != 'undefined' && searchCountry) {
			if(iTunesGeoMap[searchCountry.toUpperCase()]) {
				country = iTunesGeoMap[searchCountry.toUpperCase()];
			}
		}
		
		var iTunesSearch = new Search.iTunesSearchRequest('?media=all&country=' + country + '&limit=100&term=' + this.term, {
			onSuccess: SearchResults.acknowledgeResponse.bind(SearchResults)});	
			
		this.searchApp.optionalRequests.push(iTunesSearch); //TODO hide the implementation a bit better?

		//TODO more old stuff but eh
		domHandlers(domTriggers);
		
		this.triggers = [
			new CategoryTrigger('all-categories-trigger', null, this),
			new CategoryTrigger('markets-trigger', this.categories.markets, this),
			new CategoryTrigger('company-trigger', this.categories.company, this),
			new CategoryTrigger('support-trigger', this.categories.support, this),
			new CategoryTrigger('downloads-trigger', this.categories.downloads, this),
			//new CategoryTrigger('store-trigger', this.categories.store, this),
			new CategoryTrigger('products-trigger', this.categories.products, this),
			new CategoryTrigger('itunes-trigger', this.categories.itunes, this)]
		
	
		this.currentTrigger = this.triggers[0];
	
		this.searchApp.search(this.term);
	
		if (this.term) {
			$('barsearchapple').value = SearchResults.getTerm(true).replace(/&lt;/g, "<").replace(/&gt;/g, ">");
		}
	}
});


Event.onDOMReady(function() {
	
	var searchEnv = new SearchEnvironment();

	domHandlers(domTriggers);

  // Sidebar More Search Tools	
	if (searchEnv.term) {
		
		var termComponent = encodeURIComponent(Search.desanitize(searchEnv.term));
		
		var storeLink = $('moresearchtools-store');
		storeLink.href += '?jknr=' + termComponent;
		
		var productGuideLink = $('moresearchtools-guide');
		productGuideLink.href += 'action.lasso?-database=MacOSGuide&-layout=cgi_search&-response=/ussearch/hitlist.html&-op=bw&web_search='+termComponent+'&-maxRecords=20&-search';

		var supportLink = $('moresearchtools-support');
		supportLink.href += '?search=Go&lr=lang_en&q='+termComponent;

		var developerLink = $('moresearchtools-developer');
    	developerLink.href = developerLink.href.substring(0, developerLink.href.indexOf('search/'));
    	developerLink.href += 'cgi-bin/search.pl?&q='+termComponent+'&num=10&ie=utf8&oe=utf8&lr=lang_en&simp=1';
    }

})


function domHandlers(obj){
  for(property in obj){
    if ($(property)){ obj[property]($(property)); }
  }
}
