/* -------------------------------------------------- */
/* Smart Search Script        OPAG Online Promotin AG */
/* -------------------------------------------------- */


/* VARIABLE INITIATION *********************************************/



// IMPORTANT GLOBAL VARIABLES///////////////
//														//
//........................................//
//	The Number of Search Possibilites:		//
//........................................//
	var _ARRAY_LENGTH = 6;
//														//
//........................................//
//  The Minimum of Searchphrase length		//
//	to perform search:							//
//........................................//
	var _MIN_INPUT_LENGTH = 2;
//														//
////////////////////////////////////////////


var _DATE = new Date();
var _START_TIME = 0;

var _SMART_SEARCH_CENTER_VISIBLE = false; //Smart Center Is Visible
var _SMART_SEARCH_CENTER_EXTENDED_VISIBLE = false;
var _SEARCHED = new Array(_ARRAY_LENGTH); //1=PLZ Search, ..., 5=Extended Search
var _INPUT; //Search Input
var _INPUT_LENGTH = 0; //Search Input Length
var _FOUND_ITEMS = 0; //Number of Found Items
var _FOUND_EXTENDED_ITEMS = 0; //Number of Items Found With Extended Search
var _EMPTY_SEARCH = new Array(); //Keywords with No Search Result in Extended Search

/* Temporary Array */
var temp = new Array(_ARRAY_LENGTH);
for(i=0; i<temp.length; i++)
	temp[i] = new Array();

/* Buffer Array */
var buffer = new Array(_ARRAY_LENGTH);
for(i=0; i<buffer.length; i++)
	buffer[i] = new Array();

/* Marker Array For Extended Search */
var marker = new Array();

/* _SEARCHED Array */
for(i=0; i<_SEARCHED.length; i++)
	_SEARCHED[i] = false;


/* Search Input Initialization */
function init_input(input){
	_INPUT = input;

	if(input.length < _INPUT_LENGTH)
		clear_searched(); // Temporary Array is Too Specific
	_INPUT_LENGTH = input.length; 
}


/* INITIAL SEARCH FUNCTION *********************************************/

//Main Search Begin
function smart_search(input, extended){
	if(input.length >= _MIN_INPUT_LENGTH){ //Performance!
		init_input(input);

		//Standard Search
		if(_FOUND_EXTENDED_ITEMS == 0) start_search();
		else if(!_SEARCHED[0] && !_SEARCHED[1]) start_search();
		else if(!extended) start_search();

		//Extended Search
		if(_FOUND_ITEMS == 0 || extended){
			if(check_input()) // No Double Search
				init_extended_search(); //Only Effectiv if No Items Where Found
		}
	}else{
		clear_search_suggestions(); // Clearing HTML Content
		clear_searched(); // Clearing Temporary Array
	}
}

/* SIMPLE SEARCH FUNCTIONS *********************************************/

//Start Search When Loaded
function start_search(){
	if(_RESSOURCES_LOADED){

/*		//Clear Extended Searched Status
		if(_SMART_SEARCH_CENTER_EXTENDED_VISIBLE)
			clear_searched();
*/

//		set_start_timestamp(); //Performance Check, Not Functual Neccessary

		close_extended_smart_search();
		show_smart_search();
		perform_search();

//		check_search_time(); //Performance Check, Not Functual Neccessary
	}
	else
		setTimeout('start_search()', 1000);
}

//Perform Search Selection
function perform_search(){

	clear_search_suggestions();
	clear_buffer_array();
	clear_item_count();
	
	if(isNaN(_INPUT)){
		search_now(1); //Ort Search
		_SEARCHED[1] = true;
		search_now(2); //Webcam-Title Search
		_SEARCHED[2] = true;
		search_now(3); //Kanton Search
		_SEARCHED[3] = true;
		search_now(4); //Region Search
		_SEARCHED[4] = true;
	}else{
		search_now(0); //PLZ Search
		_SEARCHED[0] = true;
	}
	
	update_temp_array();
}


/* EXTENDED SEARCH FUNCTIONS *********************************************/


//Extended Search (With Description Search)
function init_extended_search(){

/*	//Clear Simple Searched Status
	if(_SMART_SEARCH_CENTER_VISIBLE)
		clear_searched();
*/

	//Visual Box Change
	close_smart_search();
	show_extended_smart_search();

	load_extended_script_ressource();
	
	setTimeout('start_extended_search()', 100);
	setTimeout('log_search_result()', 100);
}

//Loading External Script Ressource
function load_extended_script_ressource(){
	if(!_EXTENDED_RESSOURCES_LOADED)
		element('smart_search_ressource_extended').src = 'scripts/smart_search_ressource_extended.js?' + _SMART_SEARCH_VERSION;
}

//Waiting for Extended Smart Search to Load
function start_extended_search(){

	if(_EXTENDED_RESSOURCES_LOADED)
		perform_extended_search();
	else
		setTimeout('start_extended_search()', 1000);
}

//Perform Extended Search Selection
function perform_extended_search(){

	clear_extended_search_suggestions();
	clear_buffer_array();
	clear_item_count();
	
	search_now(5); //Extended Special Search
	_SEARCHED[5] = true;

	//Temporary Fast Search Array
	update_temp_array();
}

//Marks Found Keywords in Description
function mark(entry, position){

	var temp_token = simplify(a[5][entry], -1).split(' ');
	var before = 0, after = 0, start = 0, end = 0;
	var length = temp_token[position].length + 8;
	var space = (50 - length) / 2;
	var result = '', left = '', right = '';
	
	for(t=0; t<temp_token.length; t++){
		if(t < position)
			before += temp_token[t].length + 1;
		if(t > position)
			after += temp_token[t].length + 1;
		
		if(t == position)
			result += '<b>' + temp_token[t] + '</b> ';
		else
			result += temp_token[t] + ' ';
	}
	
	//Left Side Bigger then Possible
	if(before > space)
		left = '...';
	else
		end = space - before;

	//Right Side Bigger then Possible
	if(after  > space)
		right = '...';
	else
		start = after - space;

	marker[entry] = left + result.substring(start + before - space, before + length + space + end) + right;
}


function clear_marker(){
	for(i=0; i<marker.length; i++)
		marker[i] = '';
}


function log_search_result(){
	if(_FOUND_EXTENDED_ITEMS == 0)
		_EMPTY_SEARCH.push(_INPUT);
}

function check_input(){
	for(n=0; n<_EMPTY_SEARCH.length; n++)
		if(simplify(_INPUT, 5) == simplify(_EMPTY_SEARCH[n], 5)) //Input Allready Had No Search Result
			return false;

	return true;
}


/* SHARED SEARCH FUNCTIONS *********************************************/

//Actual Search	
function search_now(where){
	
	//Performance Increase Through Buffer
	if(_SEARCHED[where])
		var x = temp;
	else{
		var x = a;
		
		//For Extended Search
		if(where == 5){
			for(i=0; i<x[5].length; i++)
				if(x[5][i]) x[5][i] += ' ' + a[2][i]; //Adds Webcam Title

				clear_marker(); //Just for Keeping Memory Usage Down, Not Functional Required
		}
	}

	//Performance Increase Through IndexArray
	var index_search = false;

	if(where == 1 || where == 2){
		var xs = idx[simplify(_INPUT.substr(0, 1), where)];
		index_search = true;
	}
	else
		var xs = x;

	if(xs[where])
		//Array Search
		for(i=0; i<xs[where].length; i++){
			
			//Performance Increase Through IndexArray
			if(index_search)
				var index = xs[where][i];
			else
				var index = i;
				
			//Searching
			if(x[where][index]){
				var token = simplify(x[where][index], where).split(' ');
				for(j=0; j<token.length; j++)
					if(token[j].indexOf(simplify(_INPUT, where)) == 0 && check_stop_word(token[j], where)){ //Found
					
						//Extended Search
						if(where == 5) mark(index, j);
	
						add(where, index);
//alert('added ' + index + ',round ' + j + ',loop ' + i);
						break;
					}
			}
		}
}


//Ignore Common Words
function check_stop_word(word, option){
	if(option != 5)
		return true;
	
	var stop_words = new Array('ab', 'alle', 'als', 'am', 'an', 'auch', 'auf', 'aus', 'bei', 'beide', 'beiden', 'beim', 'bereits', 'bin', 'bis', 'da', 'dahinter', 'daneben', 'darauf', 'darin', 'darüber', 'darunter', 'das', 'davor', 'dazwischen', 'dem', 'den', 'der', 'des', 'die', 'diesem', 'diesen', 'dieser', 'dieses', 'dort', 'durch', 'ein', 'eine', 'einem', 'einen', 'einer', 'eines', 'es', 'etwa', 'etwas', 'für', 'Für', 'ganz', 'gegenüber', 'gross', 'grossen', 'gut', 'haben', 'hat', 'hinter', 'hoch', 'im', 'in', 'ins', 'ist', 'je', 'kaum', 'kein', 'keine', 'keinem', 'keinen', 'keiner', 'keines', 'klein', 'lang', 'machen', 'mehr', 'mit', 'muss', 'nach', 'nah', 'neben', 'neu', 'neue', 'neuen', 'nicht', 'nichts', 'noch', 'nun', 'nur', 'oder', 'ohne', 'paar', 'recht', 'sehen', 'so', 'soll', 'sonst', 'über', 'um', 'und', 'unter', 'viel', 'viele', 'vom', 'von', 'vor', 'was', 'wenig', 'wie', 'wo', 'zeigen', 'zeigt', 'zu', 'zum', 'zur', 'zwischen');
	for(w=0; w<stop_words.length; w++)
		if(word == simplify(stop_words[w], 5))
			return false;

	return true;
}

//Add Found Items to Result
function add(where, what){

	if(where == 5) //Extended Search
		_FOUND_EXTENDED_ITEMS++;
	else
		_FOUND_ITEMS++;


	if(where == 0 || where == 1) //PLZ oder Ort
		add_html(0, '<a href="search.php?sbgr=' + a[0][what] + '&item=1&loc=' + escape(a[1][what]) + '" class=smart_search>' + a[0][what] + ', ' + cut_off(a[1][what], 1) + '</a><br>');

	else if(where == 5){ //Extended Search
		add_html(4, '<a href="webcam.php?wid=' + URI[2][what] + '" class=smart_search>' + cut_off(a[2][what], 5) + '</a><br>'); //Webcam Name
		add_html(5, '<a href="webcam.php?wid=' + URI[2][what] + '" class=smart_search>' + marker[what] + '</a><br>'); //Description
	}

	else{
		switch(where){
			case 2: var link = 'webcam.php?wid=' + URI[where][what]; //Webcam
					break;
			case 3: var link = 'search.php?item=3&sbgr=' + a[where][what]; //Kanton
					break;
			case 4: var link = 'regionen.php?rid=' + URI[where][what]; //Region
					break;
		}
		add_html(where - 1, '<a href="' + link + '" class=smart_search>' + cut_off(a[where][what], where) + '</a><br>');
	}	
	
	/* Temporary Array for Faster Searching */
	if(where == 5) buffer[5][what] = a[5][what] + ' ' + a[2][what]; //Extended Search
	else
		buffer[where][what] = a[where][what];
}

//New Search Begins
function clear_searched(){
	for(i=0; i<_SEARCHED.length; i++)
		_SEARCHED[i] = false;
}

function update_temp_array(){
	temp = buffer;
}

function clear_buffer_array(){
	delete buffer;

	buffer = new Array(_ARRAY_LENGTH);
	for(i=0; i<buffer.length; i++)
		buffer[i] = new Array();
}

function clear_item_count(){
	_FOUND_ITEMS = 0;
	_FOUND_EXTENDED_ITEMS = 0;
}



/* STRING MUTATION ***********************************************/

function simplify(s, where){

	//Extended Search
	if(where == 5)
		return simplify(s, 0).replace(/g/g, 'c').replace(/k/g, 'c').replace(/ch/g, 'j').replace(/sch/g, 'j').replace(/p/g, 'b').replace(/t/g, 'd');

	//Token Generation
	if(where == -1)
		return s.replace(/-/g, ' ').replace(/,/g, ' ');
		
	//Normal Search
	return simplify(s, -1).toLowerCase().replace(/ä/g, 'a').replace(/ö/g, 'o').replace(/ü/g, 'u');
}

function cut_off(string, option){

	//0: PLZ, 1:Ort, 2:Webcam, 3:Kanton, 4:Region, 5:Webcam erweitert
	var length	= new Array(0, 12, 22, 8, 14, 27);
	
	if(string.length  > length[option])
		return '<acronym title="' + string + '">' + string.substr(0, length[option]) + '..</acronym>';

	return string;
}


/* PERFORMANCE FUNCTIONS ***********************************************/
function set_start_timestamp(){
	_START_TIME = _DATE.getTime();
}

function check_search_time(){
	if((_DATE.getTime() - _START_TIME) > 1000)
		alert('Swiss Webcams stellt fest, dass Sie einen eher\nlangsamen Prozessor verwenden.');
}

/* VISUAL EFFECTS ***********************************************/

//Visual Content Managment
function smart_search_row_over(o){
	if(navigator.appName == 'Microsoft Internet Explorer')
		o.style.backgroundImage = 'url(img/homepage/smart_search/content_bg_light.gif)';
}
function smart_search_row_out(o){
	if(navigator.appName == 'Microsoft Internet Explorer')
		o.style.backgroundImage = 'url(img/homepage/smart_search/space_line.gif)';
}

//Window
function close_smart_search(){
	element('smart_search_center').style.visibility = 'hidden';
	_SMART_SEARCH_CENTER_VISIBLE = false;
}
function close_extended_smart_search(){
	element('smart_search_center_extended').style.visibility = 'hidden';
	_SMART_SEARCH_CENTER_EXTENDED_VISIBLE = false;
}
function show_smart_search(){
	if(!_SMART_SEARCH_CENTER_VISIBLE)
		fade_in(element('smart_search_center'));

	_SMART_SEARCH_CENTER_VISIBLE = true;
}
function show_extended_smart_search(){
	if(!_SMART_SEARCH_CENTER_EXTENDED_VISIBLE)
		fade_in(element('smart_search_center_extended'));

	_SMART_SEARCH_CENTER_EXTENDED_VISIBLE = true;
}

//Delete All Items Visually
function clear_search_suggestions(){
	perform_clearing_search_suggestions(0,3);
}
function clear_extended_search_suggestions(){
	perform_clearing_search_suggestions(4,5);
}
function perform_clearing_search_suggestions(start, end){
	for(i=start; i<=end; i++)
		element('search_row_' + i).innerHTML = '';
}


//Place Text In Content Rows
function add_html(row, html){
	element('search_row_' + row).innerHTML += html;
}



/* GLOBAL LOADING VARIABLE *******************************************/

//Successful Loading
_SMART_SEARCH_LOADED = true;

//---------------------------------------- Smart Search Initialization End --------------//