var REQUEST_COUNTER = 0;
var MAX_CATG_HITS_GLOBAL = 10;
var MAX_TOTAL_HITS_GLOBAL = 0;
var MAX_CATG_HITS = 40;

var s_searching_for = 'Søker etter';
var s_search_for = 'Søk etter';
var s_please_wait = 'vennligst vent';
var s_products = 'Produkter';
var s_no_products = 'gir ingen treff';
var s_too_many_products = 'gir for mange treff';
var s_no_hits = 'treff';
var s_search_title = 'Søkeresultat';
var s_search_pre_text = 'For';
var s_products_match = 'produkter funnet, ';
var s_products_match_single = 'produkt funnet, ';
var s_articles_match = 'artikler funnet.';
var s_articles_match_single = 'artikkel funnet.';
var s_products_listed = 'produkter vises i resultatlisten.';
var s_products_listed_single = 'produkt vises i resultatlisten.';
var s_clear_search_results = 'Fjern søk';
var s_productnu = 'Produktnr: ';
var s_error_install = 'WebOn ajax søk er ikke riktig satt opp!';
var s_goto_ptype_search = '&raquo; Vis alle treff...';

function getSearchSettings (search_id) {
	var settings = $H();
	switch (search_id) {
		case 'search_string':
			settings['statusMonitor'] = 'statusMonitor';
			settings['container'] = 'search_list';
			settings['show_id'] = 'tab_generic_2';
			settings['hide_id'] = 'tab_generic_1';
			break;
		case 'search':
			settings['statusMonitor'] = 'statusMonGlobal';
			settings['container'] = 'search_list_global';
			settings['show_id'] = 'bd';
			settings['hide_id'] = 'globalsearch';
			break;
	}
	settings['ptypes'] = $H({'tele': 'Mobil', 'spill': 'Spill', 'film': 'Film', 'multimedia': 'Lyd & Bilde', 'data': 'Data', 'innhold': 'Innhold'});
	return settings;
}

function dynamicSearch (search_id, ptype) {
  var settings = getSearchSettings(search_id);
  var el = $( search_id );  
  if ( el == undefined ) { return; }
  
  if(el.setAttribute) {el.setAttribute('autocomplete','off');}
  var text = el.value;
  if ( text.length < MIN_SEARCH_CHAR ) {
    ++REQUEST_COUNTER;
    closeSearch(search_id, false, settings);
	return;
  }
  var statusMonitor = $( settings['statusMonitor'] );
  var origcontainer = $( settings['container'] );
  if (!statusMonitor || !origcontainer) {
  	alert(s_err_install);
	return;
  }
  var container = origcontainer;
  container.id = settings['container'];
  if (ptype == undefined) { ptype = ''; }
  statusMonitor.innerHTML = s_searching_for + ' <em>'+ text +'</em>, ' + s_please_wait + '...';

  var thisCounter = ++REQUEST_COUNTER;
  var handler = function( hreq ) {
    if ( REQUEST_COUNTER != thisCounter ) { return; }
    var json = hreq.responseText.split( '__boundary__' );
    var data = eval("(" + json[1] + ")");
    if ( data.listing[0] == undefined) {
      if (!el.className.match(/warning$/)) { el.className = el.className + ' warning'; }
      statusMonitor.innerHTML = s_search_for + ' <em>'+ text +'</em> ' + s_no_products + '.';
    } else if (data.listing.length > MAX_TOTAL_HITS_GLOBAL && MAX_TOTAL_HITS_GLOBAL != 0) {
      if (!el.className.match(/warning$/)) { el.className = el.className + ' warning'; }
      statusMonitor.innerHTML = s_search_for + ' <em>'+ text +'</em> ' + s_too_many_products + '.';
    } else {
      el.className = el.className.replace(/warning$/, "");
    }
    if (ptype != '') {
      displaySearchResultCategory( settings, statusMonitor, container, text, data );
    } else {
      displaySearchResultGlobal( settings, statusMonitor, container, text, data);
    }
  }
  var limit = (ptype) ? MAX_CATG_HITS : MAX_TOTAL_HITS_GLOBAL;
  var criterias = '';
  if (ptype != '') { criterias = getSearchCriterias(false); }
  var url = URL_BASE + 'func=search.ajax_search&ptype=' + ptype + '&limit=' + limit + criterias + '&input='+ text;

  new Ajax.Request( url, { onSuccess: handler } );
  do_switch(settings, settings['show_id']);
}

function displaySearchResultCategory ( settings, statusMonitor, container, text, data ) {
  var totalHits = 0;
  var list = document.createElement("ul");

  // Loop through search result
  for ( var i=0; i < data.listing.length; i++ ) {
    if (totalHits >= MAX_CATG_HITS && MAX_CATG_HITS != 0) {
      break;
    }
    // Create new search result row to the corresponding category table
    var row = data.listing[i];

    totalHits++;

    // Add search result to the corresponding category table
    var a = document.createElement( 'a' );
    a.innerHTML = row.TITLE;
    a.href = URL_BASE + 'func=catalog.show&table=PRODUCT&categorynu=&func_id=' + row.PRODUCT_ID + '&catsearch=' 
			+ escape(text) + getSearchCriterias(true);

	var newNode = document.createElement("li");
	newNode.appendChild(a);
	list.appendChild(newNode);
  }

  // Show number of search hits in the status area
  var txt = (data.listing.length == 1) ? s_products_match_single : s_products_match;
  var statusstr = data.total +' ' + txt + ' <em>'+ text +'</em>';
  // If more were found than we can show, give feedback of the number shown
  if (data.total > MAX_CATG_HITS) {
    var txt2 = (data.listing.length == 1) ? s_products_listed_single : s_products_listed;
    statusstr += '<br>' + MAX_CATG_HITS + ' ' + txt2;
  }

  statusMonitor.innerHTML = statusstr;
  container.innerHTML = '';
  container.appendChild(list);
}

function displaySearchResultGlobal ( settings, statusMonitor, container, text, data ) {
  if (data.listing.length > MAX_TOTAL_HITS_GLOBAL && MAX_TOTAL_HITS_GLOBAL != 0) {
    return;
  }
  var div = $H();
  var title = $H();
  var content = $H();
  var footer = $H();
  var table = $H();
  var mykeys = settings['ptypes'].keys();
  var count = $H();
  // Initiate search divs and tables
  for (var idx = 0; idx < mykeys.length; idx++) {
	div[mykeys[idx]] = $(mykeys[idx] + '_search');
	title[mykeys[idx]] = $(mykeys[idx] + '_search_title');
	content[mykeys[idx]] = $(mykeys[idx] + '_search_content');

	content[mykeys[idx]].innerHTML = '';
  	table[mykeys[idx]] = document.createElement('table');
	table[mykeys[idx]].id = mykeys[idx] + '_search_table';
	content[mykeys[idx]].appendChild(table[mykeys[idx]]);
	
	footer[mykeys[idx]] = $(mykeys[idx] + '_search_footer');	
	footer[mykeys[idx]].innerHTML = '&nbsp;';
	count[mykeys[idx]] = 0;
  }
  // Do data runthrough and add items to the corresponding table
  var totalHits = 0;
  var tr;
  for ( var i=0; i < data.listing.length; i++ ) {
    var row = data.listing[i];
    if (table[row.PTYPE.toLowerCase()] != undefined) {		
  	  if (count[row.PTYPE.toLowerCase()] < MAX_CATG_HITS_GLOBAL || MAX_CATG_HITS_GLOBAL == 0) {
        tr = table[row.PTYPE.toLowerCase()].insertRow(-1);
        var a = document.createElement( 'a' );
        a.innerHTML = row.TITLE;
        a.href = (row.PRODUCT_ID) ? URL_BASE + 'func=catalog.show&table=PRODUCT&categorynu=&func_id=' + row.PRODUCT_ID + '&globsearch='
	    			+ escape(text) + getSearchCriterias(true)
					: URL_BASE + 'func=frontend.show&table=CONTENT&func_id=' + row.CONTENT_ID + '&publish_id=' + row.PUBLISH_ID + '&template=content';
        var productNameCell = tr.insertCell(-1);
        productNameCell.className = 'search_category';
        productNameCell.appendChild( a );
      }
	  count[row.PTYPE.toLowerCase()]++;
      totalHits++;
	}
  }
  // Loop afterwards to add elements depending on the result of the data runthrough
  for (var idx = 0; idx < mykeys.length; idx++) {
  	title[mykeys[idx]].innerHTML = settings['ptypes'][mykeys[idx]] + ' (' + count[mykeys[idx]] + ' ' + s_no_hits + ')' ;	
	if (mykeys[idx].toLowerCase() != 'innhold' && count[mykeys[idx]] > 0) {
		var footercontent = document.createElement('a');		
		footercontent.href = URL_BASE + 'func=frontend.show&template=search_product_category&open=reset&shopid=default' +
										'&page=0&menuitem=&selected=' +	'&ptype=' + mykeys[idx] + '&input=' + escape(text);
		footercontent.innerHTML = s_goto_ptype_search;
		footercontent.className = 'show_all';
		footer[mykeys[idx]].appendChild(footercontent);
	} else {
		footer[mykeys[idx]].innerHTML = '&nbsp;';
	}
  }
  // Create status text
  var prodhits = totalHits - count['innhold'];
  var prodtxt = (prodhits == 1) ? prodhits + ' ' + s_products_match_single : prodhits + ' ' + s_products_match;
  var arttxt = (count['innhold'] == 1) ?  count['innhold'] + ' ' + s_articles_match_single : count['innhold'] + ' ' + s_articles_match;
  statusMonitor.innerHTML = s_search_pre_text + ' <em>'+ text +'</em>: ' + prodtxt + ' ' + arttxt;
}

function do_switch (settings, which_id) {
  var is_tabswitch = (IsTab(settings['show_id']) && IsTab(settings['hide_id'])) ? 1 : 0;
  var is_switch = (!is_tabswitch && settings['show_id'] != '' && settings['hide_id'] != ''
  					&& settings['show_id'] != undefined && settings['hide_id'] != undefined) ? 1 : 0;
  
  if (is_tabswitch) {
  	activate_tab_getobj(which_id);
  } else if (is_switch) {
    var hide = (which_id == settings['hide_id']) ? $( settings['hide_id'] ) : $( settings['show_id'] );
    var show = (which_id == settings['show_id']) ? $( settings['hide_id'] ) : $( settings['show_id'] );
    if (hide && hide.style.display != 'none') {hide.style.display = 'none';}
    if (show && show.style.display != 'block') {show.style.display = 'block';}
  }
}

function do_switch_pane (show_id, hide_id) {
  var is_tabswitch = (IsTab(show_id) && IsTab(hide_id)) ? 1 : 0;
  var is_switch = (!is_tabswitch && show_id != '' && hide_id != ''
  					&& show_id != undefined && hide_id != undefined) ? 1 : 0;
  
  if (is_tabswitch) {
  	activate_tab_getobj(show_id);
  } else if (is_switch) {
    var hide = $( hide_id );
    var show = $( show_id );
    if (hide && hide.style.display != 'none') {hide.style.display = 'none';}
    if (show && show.style.display != 'block') {show.style.display = 'block';}
  }
}

function closeSearch (search_id, bDelInput, settings) {
  var searchinput = $(search_id);
  if (searchinput) {
  	if (settings == undefined || !settings) { settings = getSearchSettings(search_id); }    
  	if (bDelInput) { searchinput.value = ''; }
	
	if (search_id == 'search') {
	    var mykeys = settings['ptypes'].keys();
	    // Initiate search divs and tables
	    for (var idx = 0; idx < mykeys.length; idx++) {
		  $(mykeys[idx] + '_search_content').innerHTML = '';
		  $(mykeys[idx] + '_search_title').innerHTML = '&nbsp;';
		  $(mykeys[idx] + '_search_footer').innerHTML = '&nbsp;';
	    }
	} else {
		$(settings['container']).innerHTML = '';
	}
    $(settings['statusMonitor']).innerHTML = '';
    searchinput.className = searchinput.className.replace(/warning$/, "");
    do_switch(settings, settings['hide_id']);
  }
}

function getSearchCriterias (bFlags) {
  var retstr = '';
  var counter = 0;
  var search_criteria = document.getElementsByName( 'search_criteria' );
  for (counter = 0; counter < search_criteria.length; counter++) {

    if (search_criteria[counter].checked) {
      if (!bFlags) {
	  	retstr += '&sc=' + escape(search_criteria[counter].value);
	  }else {
	    retstr += '&' + escape(search_criteria[counter].value) + '=1';
	  }
    }
  }
  return retstr;
}

function getControls(show_id, hide_id) {

  var close = document.createElement( 'a' );
  close.className = 'control';
  close.innerHTML = s_clear_search_results + '.';

  Event.observe( close, 'click', function() {
      var el = document.getElementById( "search_string" );
      el.value='';
      var search_criteria = document.getElementsByName( 'search_criteria' );
      for (counter = 0; counter < search_criteria.length; counter++) {
        search_criteria[counter].checked = false;
      }
      clearControls('search_input');
      clearControls('search_top');
      clearControls('search_bottom');
      dynamicSearch();
      if ( hide_id != undefined && hide_id != '') {
        var hide = $( hide_id );
        if (hide) {hide.style.display = 'block';}
      }
      if ( show_id != undefined && show_id != '') {
        var show = $( show_id );
        if (show) {show.style.display = 'none';}
      }
    }
  );

  return close;
}

function setControls(containername, show_id, hide_id) {
  var container = $(containername);
  if (!container) return;
  var cloned_container = container.cloneNode(true);
  var controls = getElementsByClassNode('search_control', cloned_container, 'span');
  for ( var i=0; i < controls.length; i++ ) {
    if (controls[i].innerHTML == '') {
      controls[i].appendChild( getControls(show_id, hide_id) );
    }
  }
  container.parentNode.replaceChild(cloned_container,container);
}

function clearControls(containername) {
  var container = $(containername);
  if (!container) return;
  var cloned_container = container.cloneNode(true);
  var controls = getElementsByClassNode('search_control', cloned_container, 'span');
  for ( var i=0; i < controls.length; i++ ) {
    if (controls[i].innerHTML != '') {
      controls[i].innerHTML = '';
    }
  }
  container.parentNode.replaceChild(cloned_container,container);
}

function clear ( element ) {
  // Remove all children of an element
  while ( element.firstChild != undefined ) {
    var e = element.removeChild( element.firstChild );
    clear( e );
  }
}

function db( message ) {

  var d = document.getElementById('debug');
  d.innerHTML += message + '<br>';
}

function getElementsByClass( searchClass, nodename, tagName) {
  var domNode = $(nodename);
  if (domNode == null) domNode = document;
  if (tagName == null) tagName = '*';
  var el = new Array();
  var tags = domNode.getElementsByTagName(tagName);
  var tcl = " "+searchClass+" ";
  for(i=0,j=0; i<tags.length; i++) {
    var test = " " + tags[i].className + " ";
    if (test.indexOf(tcl) != -1)
      el[j++] = tags[i];
  }
  return el;
}

function getElementsByClassNode( searchClass, domNode, tagName) {
  if (domNode == null) domNode = document;
  if (tagName == null) tagName = '*';
  var el = new Array();
  var tags = domNode.getElementsByTagName(tagName);
  var tcl = " "+searchClass+" ";
  for(i=0,j=0; i<tags.length; i++) {
    var test = " " + tags[i].className + " ";
    if (test.indexOf(tcl) != -1)
      el[j++] = tags[i];
  }
  return el;
}

function doCheckboxesValidation(triggerbox) {
  if ($(triggerbox)) {
    if (triggerbox == 'cb_nosub' && $(triggerbox).checked) {
      $('cb_telenor').checked = false;
      $('cb_netcom').checked = false;
    } else {
      $('cb_nosub').checked = false;
    }
  }
}
