/*
*		This File sets the Icons for Companies, Immos, Legends, Towns, Streets, Housenumbers
*
*		jm20070412
*
*/

// global varibles
var vis_arr 			= new Array();
var icon_path 		= 'map_icons_';

// ------------------------------------- read in db and set icons on map --------------------------
// Constructor for Object Vis_Obj (Visible_Object)
function Vis_Obj (itype, mode, id, str, extra, pos_id)
{
	this.itype 			= itype;
	this.mode 			= mode;
	this.str 				= str;
	this.pos_id 		= pos_id;
	this.id	 				= id;
	this.extra 			= extra; 	// Array
	this.minus_arr 	= Array();
	this.hist_arr 	= Array();
	this.symbol 		= '';
	this.pos_type		= '';
	this.mm 				= '';
	this._x					= '';
	this._y					= '';
	
	//this.visible 	= 1; 		// Visibility ... not active
	//this.switch_object = function(){};
}

// Constructor for Object ItemCluster()
function Item_Cluster(category_id, itype, mode)
{
	this.category_id = category_id;
	this.itype = itype;
	this.mode = mode;
}

function fn_set_cat_icons(itype, mode, id, chk_bx, hist_ids)
{
	fn_loader(1);
	is_set = fn_in_vis_arr(itype, mode, id, hist_ids);
	is_minus = in_minus_array(is_set[3]);
	
	fn_set_checkboxes('hidden');
	
	fn_update_browser_ckbxs(chk_bx);
	if(!is_set[0] && getObject(chk_bx).checked == true)
	{
		fn_remove_intervented_icons(itype, mode, id);
		fn_set_icons(itype, mode, id, false, '', '', '', hist_ids);
	}
	else if(is_minus[0] && getObject(chk_bx).checked == true)
	{
		// delete found minus_str from vis_arr[#].minus_arr
		vis_arr[is_set[2]].minus_arr.fn_array_cut(is_minus[2]);
		new_minus_array = vis_arr[is_set[2]].minus_arr;
		// remove old
		fn_remove_icons(is_set[2]);
		var old_arr = is_set[4].split('_');

		fn_set_icons(old_arr[0], old_arr[1], old_arr[2], false, '', '', new_minus_array.join(','), hist_ids);
	}
	else if(getObject(chk_bx).checked == false)
	{
		if(is_set[3])
		{
			new_minus_array = vis_arr[is_set[2]].minus_arr;
			new_minus_array.push(is_set[3]);
			// remove old
			fn_remove_icons(is_set[2]);
			
			var old_arr = is_set[4].split('_');
	
			fn_set_icons(old_arr[0], old_arr[1], old_arr[2], false, '', '', new_minus_array.join(','), hist_ids);
		}
		else
		{
			fn_remove_icons(is_set[2]);
			fn_set_checkboxes('visible');
			fn_loader();
		}
	}
}

function fn_set_immo_icons(itype, mode, ids, zoom_to_icon)
{
	var url_add = '';
	if(ids && ids != '')
	{
		url_add = '&ids=' + ids;
	}

	// get icon coordinates and set them on map
	var url = '/_inc/php/get_icons.php' + fn_get_list_filter_str(2) + '&type=' + itype + '&mode=' + mode + url_add;

	// check if already set
	ids = 1;
	in_arr = fn_in_vis_arr (itype, mode, ids);

	if(in_arr[0])
	{
		fn_remove_icons(in_arr[2]);
	}
	
	if(!zoom_to_icon)
	{
		jah_back(url, 'fn_process_icons(result, false, \''+itype+'\', '+mode+', \''+ids+'\');fn_loader();');
	}
	else
	{
		jah_back(url, 'fn_zoom_to_icon(result, \''+itype+'\', '+mode+', \''+ids+'\');fn_loader();');
	}
	
}

// receives parameters from click on object or zoom event
function fn_set_icons (itype, mode, id, zoom, extra, vis_arr_pos, minus_arr, hist_arr)
{
	var in_arr = fn_in_vis_arr(itype, mode, id);
	
	// set new icons
	if(!zoom)
	{
		if(!minus_arr)
		{
			minus_arr = '';
		}
		
		if(!in_arr[0])
		{
			// get icon coordinates and set them on map
			var action = 'fn_process_icons(result, false, \''+itype+'\', '+mode+', \''+id+'\', false, \''+extra+'\', \'' + minus_arr + '\', \'' + hist_arr + '\');';
			if(!frame_mode)
			{
				action = 'fn_set_checkboxes(\'visible\');fn_loader();' + action;
			}
			
			// ax(mode, url, target, func, loader, pstr)
			ax('POST', '/_inc/php/get_icons.php?type='+itype+'&mode='+mode+'&extra='+extra+'&minus_arr='+minus_arr+'&port_mode='+port_mode, false, action, false, 'id='+id);
			//jah_back('/_inc/php/get_icons.php?type='+itype+'&mode='+mode+'&extra='+extra+'&id='+id+'&minus_arr='+minus_arr+'&port_mode='+port_mode, action);			
		}
		else if(mode == 1)
		{
			zoomToPoint(vis_arr[0]._x + '-' + vis_arr[0]._y, zoom_level);
		}
	}
	// if zoomed
	else
	{
		var tmp = icon_path+vis_arr_pos;
		var vis_div = getObject(icon_path+vis_arr_pos);
		if(vis_div)
		{
			vis_div.innerHTML = '';
			var obj = vis_arr[fn_get_vis_arr_pos(vis_arr_pos)];
			// process icons on map
			fn_process_icons(obj.str, vis_arr_pos, obj.itype, obj.mode, obj.id, zoom, obj.extra);
		}
	}
}

// receives icons and coordinates from php file
function fn_process_icons(str, vis_arr_pos, itype, mode, id, zoom, extra, minus_arr, hist_arr)
{
	if(!fn_is_empty(str))
	{
		if(!zoom)
		{
			// insert into vis_arr
			var pos_id = fn_get_free_pos_id();
			vis_arr.push(new Vis_Obj(itype, mode, id, false, extra, pos_id));
			vis_arr_pos = pos_id;
			if(minus_arr && minus_arr != '')
			{
				vis_arr[pos_id].minus_arr = minus_arr.split(',');
			}
			if(hist_arr && hist_arr != '')
			{
				vis_arr[pos_id].hist_arr = hist_arr.split(',');
			}
			// set new cluster object
			
		}	
		var item_clus 		= new Array();
		var single_items 	=	new Object();
		
		
		item_clus[vis_arr_pos] = new Array();
		//show_vis_arr();
		// set container on map
		var map_c = getObject('map_c_items');
		var new_div = document.createElement('div');
		new_div.id = icon_path+vis_arr_pos;
		if(!getObject(new_div.id))
		{
			map_c.appendChild(new_div);
		}

		var arr 			= str.split('--');
		var icns_str 	= arr[0];
		var icns 			= icns_str.split('!!');
		
		var category 	= arr[1];
		var symbol 		= arr[2];
		
		var frame_logo= arr[4];
		
		if(frame_logo === undefined)
		{
			var frame_logo = '';			
		}
		
		if(vis_arr[pos_id])
		{
			vis_arr[pos_id].mm = main_mode;
			
			// SAVE XY coordinates
			if (mode == 1)
			{
				//vis_arr[pos_id]._x = main_mode;
				var icon_raw = icns[0];
				var tmp_arr = icon_raw.split('_');
				vis_arr[pos_id]._x = tmp_arr[0];
				vis_arr[pos_id]._y = tmp_arr[1];
			}
			
			if(symbol != '')
			{
				vis_arr[pos_id].symbol = symbol;
			}
			
			
			
		}
		
		
		// ------ Update display of visible items ------------
		vis_arr[fn_get_vis_arr_pos(vis_arr_pos)].str = str;
				
		fn_update_vis_items_display();
		// ---------------------------------------------------
		
		
		// ------ process icons ------
		for(var i = 0; i < icns.length; i++)
		{
			// ------ split string in metainfo ------
			var arr = icns[i].split('_');
			var x = arr[0];
			var y = arr[1];
			
			if(mode == 1 || (mode == 2 && id.match(',')))
			{
				if(!zoom)
				{		
					if(mode == 2 && id.match(','))
					{
						var min_x = (min_x === undefined || arr[0] < min_x) ? arr[0] : min_x;
						var max_x = (max_x === undefined || arr[0] > max_x) ? arr[0] : max_x;

						var min_y = (min_y === undefined || arr[1] < min_y) ? arr[1] : min_y;
						var max_y = (max_y === undefined || arr[1] > max_y) ? arr[1] : max_y;
					}
				}
				if(itype == 1 || itype == 2)
				{
					fn_set_pos_type_info(arr[4], arr[0], arr[1], itype);
				}
			}
			
			// set new cluster object
			//item_clus.push(new Item_Cluster(id, itype, mode));

			// ------ set coordinates to viaah ------
			var c = lurefToViaah(x,y);
			
			// ------ later get offset from pictogram ------
			var offset = 0;
			var x = c[0] - offset;
			var y = c[1] - offset;

			// ------ if icon is in view / in screen area ------
			if(fn_icon_in_view(x, y) || mode == 1 || (mode == 2 && id.match(',')))
			{
				var d = fn_get_cluster(x,y);
			
				var clu_x = d[0];
				var clu_y = d[1];
			
				
				// ------ if cluster exists ------
				if(item_clus[vis_arr_pos][clu_x+'_'+clu_y])
				{
					// ------ get length of cluster ------
					var cluster_length = fn_get_obj_length(item_clus[vis_arr_pos][clu_x+'_'+clu_y]);
				
					if(cluster_length == 2)
					{
						old_item_arr = item_clus[vis_arr_pos][clu_x+'_'+clu_y][1].split('_');
						if(single_items[old_item_arr[0]])
						{
							// delete from object
							delete single_items[old_item_arr[0]];
						}
					}
				
					// push item into cluster				
					item_clus[vis_arr_pos][clu_x+'_'+clu_y].push(arr[2] + '_' + arr[3]);
				

				}
				else
				{
					// ------ insert into single items ------
					single_items[arr[2]] = icns[i];
					
					// ------ set net item cluster ------
					item_clus[vis_arr_pos][clu_x+'_'+clu_y] = new Array();

					// ------ conf array for cluster at position[0] ------
					var cluster_conf = new Array();
					cluster_conf = [clu_x, clu_y, 0];
					item_clus[vis_arr_pos][clu_x+'_'+clu_y][0] = cluster_conf;

					// ------ put value in new cluster ------
					item_clus[vis_arr_pos][clu_x+'_'+clu_y].push(arr[2] + '_' + arr[3]);
				}
			} 
		}
		
		if(!zoom && (mode == 1 || (mode == 2 && id.match(','))))
		{		
			if(pre_zoom_level >= 1)
			{
				setZoomLevel(pre_zoom_level);
			}
			else
			{
				//if town zoom out
				if(itype == 4)
				{
					setZoomLevel(10);
				}
				else
				{
					setZoomLevel(90);
				}
			}						
		
			if(mode == 1 && arr[0] && arr[1])
			{
				center_map(arr[0],arr[1]);					
			}
			else if(mode == 2 && min_x != undefined)
			{	
				var c_x = Math.floor((parseInt(min_x) + parseInt(max_x))/2);
				var c_y = Math.floor((parseInt(min_y) + parseInt(max_y))/2);

				center_map(c_x, c_y);
			}
		}
		

		// process single items into cluster
		for(var item in single_items)
		{
			// only icons, not overloaded, leaved functions like "fn_array...()"
			if(item.indexOf('fn_') == '-1')
			{
				item_placed = false;
				var arr = single_items[item].split('_');
				var x = arr[0];
				var y = arr[1];
				
				var c = lurefToViaah(x,y);
				x = c[0];
				y = c[1];
				
				var roll_array = new Array(8);
				roll_array[0] = [-1, -1];
				roll_array[1] = [ 0, -1];
				roll_array[2] = [ 1, -1];
				roll_array[3] = [ 1,  0];
				roll_array[4] = [ 1,  1];
				roll_array[5] = [ 0,  1];
				roll_array[6] = [-1,  1];
				roll_array[7] = [-1,  0];
				
				for(var oset = 1; oset <= 10; oset++)
				{
					for(var ri = 0; ri <= 7; ri++)
					{
						var new_x = x + (oset * roll_array[ri][0]);
						var new_y = y + (oset * roll_array[ri][1]);
													
						var c = fn_get_cluster(new_x,new_y);

						var clu_x = c[0];
						var clu_y = c[1];
						
						if(item_clus[vis_arr_pos][clu_x+'_'+clu_y] && item_clus[vis_arr_pos][clu_x+'_'+clu_y].length > 2)
						{
							// push item into cluster				
							item_clus[vis_arr_pos][clu_x+'_'+clu_y].push(arr[2] + '_' + arr[3]);
							// delete from object
							delete single_items[item];
							item_placed = true;
							break;
						}
					}
					if(item_placed)
					{
						break;
					}
				}
			}
		}
		
		// -------- delete single item clusters -------------------------------
		for(i in item_clus[vis_arr_pos])
		{
			if(item_clus[vis_arr_pos][i].length == 2)
			{
				delete item_clus[vis_arr_pos][i];
			}
		}
		// --------------------------------------------------------------------
		
		
		
		
		// -------------- build mega clusters ---------------------------------
		for(i in item_clus[vis_arr_pos])
		{
			if(i.indexOf('fn_') == '-1')
			{
				var pos = i.split('_');
				x = parseInt(pos[0]);
				y = parseInt(pos[1]);
			
				var nxt_pos = new Array();
				nxt_pos[0] = (x + 10) + '_' + y; 
				nxt_pos[1] =  x + 			'_' + (y + 10); 
				nxt_pos[2] = (x + 10) + '_' + (y + 10); 
				nxt_pos[3] = (x + 20) + '_' + y; 
				nxt_pos[4] = (x + 20) + '_' + (y + 10); 
				nxt_pos[5] =  x + 			'_' + (y + 20);
				nxt_pos[6] = (x + 10) + '_' + (y + 20); 
				nxt_pos[7] = (x + 20) + '_' + (y + 20); 
			 
				//var found = new Array(); 
				//next = false;
				if(item_clus[vis_arr_pos][nxt_pos[0]])
				{
					item_clus[vis_arr_pos][nxt_pos[0]].shift();
					item_clus[vis_arr_pos][i] = item_clus[vis_arr_pos][i].concat(item_clus[vis_arr_pos][nxt_pos[0]]);
					delete item_clus[vis_arr_pos][nxt_pos[0]];
					item_clus[vis_arr_pos][i][0][0] = item_clus[vis_arr_pos][i][0][0] + 4;
					item_clus[vis_arr_pos][i][0][1] = item_clus[vis_arr_pos][i][0][1] - 2;
					item_clus[vis_arr_pos][i][0][2] = 4;
					//found[0] = true;
				}
			}
		}
		// --------------------------------------------------------------------

		
		for(i in item_clus[vis_arr_pos])
		{
			if(i.indexOf('fn_') == '-1')
			{
				var pos = i.split('_');
				x = parseInt(pos[0]);
				y = parseInt(pos[1]);
				
				fn_set_cluster(item_clus[vis_arr_pos][i], vis_arr_pos, id, category, symbol, itype, mode, frame_logo);
			}
		}
		
		
		for(i in single_items)
		{
			if(i.indexOf('fn_') == '-1')
			{
				fn_set_icon(single_items[i], vis_arr_pos, id, category, symbol, itype, mode, frame_logo);
			}
		}
		
	}	
}

function fn_set_cluster(item_arr, vis_arr_pos, id, category, symbol, itype, mode)
{
	var target = getObject(icon_path+vis_arr_pos);
	var conf = item_arr.shift();
	var cluster = document.createElement('div');
	cluster.innerHTML = item_arr.length;
	
	var icon_pos = parseInt(vis_arr_pos % conf_num_icons) + 1;
	
	switch(vis_arr[vis_arr_pos].mm)
	{
		case 2 : icon_pos = 'i'; break;
		case 4 : icon_pos = 'r'; break;
		case 5 : icon_pos = 'a'; break;
		default: break;
	}
	
	if(item_arr.length <= 9 || itype == 3)
	{
		var bg_src = comp_icon_path + icon_pos + '1' + '.png';
		var clu_width 	= 20;
		var clu_height 	= 20;
		if(itype == 3)
		{
			cluster.innerHTML = '';
			bg_src = hobo_icon_path + symbol;
			var clu_width 	= 16;
			var clu_height 	= 16;
		}
	}
	else if(item_arr.length > 9)
	{
		var bg_src = comp_icon_path + icon_pos + '2' + '.png';
		var clu_width 	= 22;
		var clu_height 	= 22;
	}
	else if(item_arr.length > 99)
	{
		var bg_src = comp_icon_path + icon_pos + '3' + '.png';
		var clu_width 	= 24;
		var clu_height 	= 24;
	}
	
	cluster.style.width = clu_width + 'px';
	cluster.style.height = clu_height + 'px';
	cluster.style.backgroundImage = 'url("' + bg_src +'")';
	cluster.style.left = (conf[0] - (clu_width / 2)) + 'px';
	cluster.style.top = (conf[1] - (clu_height / 2)) + 'px';
	cluster.style.lineHeight = (clu_height - 1) + 'px';
	cluster.className = "cluster";
	cluster.item_list = item_arr;
	//cluster.id = icn_id;
	
	var id_str = '';
	for(i in item_arr)
	{
		if(i.indexOf('fn_') == '-1')
		{
			var tmp_arr = item_arr[i].split('_') ;
			id_str += tmp_arr[0] + ',';
		}
	}
	id_str = id_str.substr(0, id_str.length - 1);
	cluster.id_str = id_str;
	
	
	
	// Modification for Immo $*%&
	if(itype == 2)
	{
		cluster.item_list = new Array();
	}
	
	
	// hover actions
	cluster.onmouseover 	= function(event){this.style.zIndex = '99';	fn_set_hover_list(event, false, this.item_list, category);};
	cluster.onmousemove 	= function(event){fn_set_hover_list(event, true, this.item_list, category);};
	cluster.onmouseout 		= function(){this.style.zIndex = '5';	fn_remove_obj('mp_lst');};
	cluster.main_mode			= main_mode;
	cluster.itype					= itype;
	
	if(!frame_mode)
	{
		if(itype == 1)
		{
			if(main_mode == 4 || main_mode == 5)
			{
				cluster.onclick		= function(){fn_sw_mm(this.main_mode, false);fn_set_list_filter(this.main_mode, 2, this.id_str);};
			}
			else
			{
				cluster.onclick 	= function(){fn_sw_mm(this.itype);fn_set_active(false, this.itype, 1, this.id_str);fn_load_browser();};			
			}
		}
		else if(itype == 2)
		{
			cluster.onclick			= function(){fn_set_mm(2);fn_set_list_filter(2, 8, this.id_str);};
		}		
	}
	else
	{
		cluster.onclick			= function()
		{
			try
			{
				var loc = parent.location.href.replace(/#$/, '') + '&cids=' + this.id_str;
				loc += '&frame_referer=' + frame_referer;
				
				parent.location.href = loc;	
			}
			catch(err){}
		};
	}
		
	cluster.ondblclick 	= zoomInDblClick;
	

	// set list on map
	if(target)
	{
		target.appendChild(cluster);
	}			
}

function fn_set_hover_list(event, move_cont, item_list, category, itype)
{	
	if(!move_cont)
	{
		var list = document.createElement('div');
		var target = getObject('map_c_infos');
		var list_content = '';
		var list_count = '';
		var z = 0;
		// shuffle array with companies
		item_list.fn_array_shuffle();

		if(item_list.length > 1)
		{
			list_count = fn_get_obj_length(item_list);
			
			// process list
			for(i in item_list)
			{
				if(i.indexOf('fn_') == '-1')
				{
					var tmp_arr = item_list[i].split('_') ;
					var val = tmp_arr[1];
			
					z++;
					if(val.length)
					{
						if(z <= 5)
						{
							list_content += val + '<br />';									
						}
						else
						{
							list_content += '<span>etc.</span>';		
							break;
						}
					}
				}
			}
		}
		else
		{
			if(item_list[0])
			{
				list_content = item_list[0];	
				if(item_list[0].match(/!!/))
				{
					var tmp_arr = item_list[0].split('!!');
					var content = tmp_arr[0];
					tmp_arr[2] = tmp_arr[2].replace('-', '_');
					
					if(itype == 1)
					{
						// if photo found			
						if(tmp_arr[2].match(/^1/))
						{
							var img_path = '/_img/company_photos/' + tmp_arr[1] + '/';
							content += '<br /><img src="' + img_path + '11.jpg" />';
						}
					}
					if(itype == 2)
					{
						// if photo found			
						if(tmp_arr[2] != '')
						{
							var img_path = '/_img/advert_photos/medium/';
							content = '<img src="' + img_path + tmp_arr[2] + '" />';							
						}
					}
					list_content = content;	
				}
			}
		}
	}
	
	// calc. best cont. position in relation to mouse position
	var best_pos = fn_get_best_popup_pos(event);
	var off_x = 10;
	var off_y = 10;
	
	var c = fn_get_cursor_position(event, 'map_b');
	var x = c[0];
	var y = c[1];
	var child_align_x = 'if(getObject(\'mp_list_child\'))getObject(\'mp_list_child\').style.left="0";fn_remove_style_att(\'right\', \'mp_list_child\');';
	if(best_pos > 2)
	{
		off_x = -512;
		child_align_x = 'if(getObject(\'mp_list_child\'))getObject(\'mp_list_child\').style.right="0";fn_remove_style_att(\'left\', \'mp_list_child\');';
		 
	}
	var child_align_y = 'if(getObject(\'mp_list_child\'))getObject(\'mp_list_child\').style.top="0";fn_remove_style_att(\'bottom\', \'mp_list_child\');';
	if(best_pos < 2 || best_pos > 3)
	{
		off_y = -200;
		child_align_y = 'fn_remove_style_att(\'top\', \'mp_list_child\');if(getObject(\'mp_list_child\'))getObject(\'mp_list_child\').style.bottom="0";';
	}

	if(move_cont)
	{
		// move hover list
		var list = getObject('mp_lst');
		if(list)
		{
			list.style.left = x + off_x + 'px';
			list.style.top = y + off_y + 'px';
		}
	}
	else
	{
		// build hover list
		var t_body = '<tr><td class="mp_lst_top_l"></td><td class="mp_lst_top_r">&nbsp;</td></tr>';

		if(category != '')
		{
			list_content = '<p class="list_header">' + list_count + ' ' + category +'</p>'+ list_content;
		}
		
		if(list_content != '')
		{
			t_body += '<tr><td class="mp_lst_mid_l">' + list_content + '</td><td class="mp_lst_mid_r"></td></tr>';
		}
		t_body += '<tr><td class="mp_lst_bot_l"></td><td class="mp_lst_bot_r">&nbsp;</td></tr>';
		list.innerHTML  = '<table id="mp_list_child" style="visibility:hidden;"><tbody>' + t_body + '</tbody></table>';
		list.style.left = x + off_x + 'px';
		list.style.top = y + off_y + 'px';
		list.id = 'mp_lst';
		
		if(!getObject('mp_lst'))
		{
			target.appendChild(list);
		}
		else
		{
			getObject('mp_lst').innerHTML = list.innerHTML;
			getObject('mp_lst').style.left = list.style.left;
			getObject('mp_lst').style.top = list.style.top; 
		}
		
	}
	
	eval(child_align_x);
	eval(child_align_y);
	if(getObject('mp_list_child'))
	{
		if(getObject('mp_list_child').scrollWidth > 250)
		{
			getObject('mp_list_child').style.width = '250px';
		}
		getObject('mp_list_child').style.visibility = 'visible';
	}
}

// set icon on map
function fn_set_icon (icn_str, vis_arr_pos, id, category, symbol, itype, mode, frame_logo)
{
	if(!fn_is_empty(icn_str))
	{
		var target = getObject(icon_path+vis_arr_pos);
		// split string in metainfo
		var arr = icn_str.split('_');

		var x = arr[0];
		var y = arr[1];
		var c = lurefToViaah(x,y);
		x = c[0];
		y = c[1];
		
		var icn_id = arr[2]+'_'+mode+'_'+itype;
		var label = arr[3];
		
		if(!fn_is_empty(symbol))
		{
			// create icon
			var icon = document.createElement('img');
			icon.src = host+'/_img/' + fn_get_symbol_path(parseInt(itype)) + symbol;
		}
		else
		{
			var icon_pos = parseInt(vis_arr_pos % conf_num_icons) + 1;
			switch(vis_arr[vis_arr_pos].mm)
			{
				case 2 : icon_pos = 'i'; break;
				case 4 : icon_pos = 'r'; break;
				case 5 : icon_pos = 'a'; break;
				default: break;
			}
		
			var icon = document.createElement('img');
			icon.style.width = '16px';
			icon.style.height = '16px';
			icon.src = host+ comp_icon_path + icon_pos + '0.png';
		}
		icon.style.position = "absolute";
		icon.style.left = (x - 8) + 'px';
		icon.style.top = (y - 8) + 'px';
		icon.style.zIndex = 5;
		icon.className = "map_item";
		icon.item = new Array(label+'!!'+arr[2]+'!!'+arr[5]); 
		icon.id = arr[2];
		icon.itype = itype;
		icon.map_url = arr[6].replace(/USCR/g, '_');
		
		if(frame_logo != '' && frame_mode)
		{
			var logo = document.createElement('img');
			
			var size_arr = frame_logo.split('.');
			var size_arr = size_arr[0].split('_');
			
			var lw = size_arr[1];
			var lh = size_arr[2];
			
			logo.style.position = "absolute";
			logo.style.left = (x - (lw/2)) + 'px';
			logo.style.top = (y - lh - 15) + 'px';
			logo.style.zIndex = 5;
			logo.style.width = lw + 'px';
			logo.style.height = lh + 'px';
			logo.src = '/_img/company_logos_small/' + frame_logo;
			
			// set icon on map
			if(target)
			{
				target.appendChild(logo);
			}
		}		

		// hover/click actions
		icon.onmouseover 	= function(event){this.style.zIndex = '99'; fn_set_hover_list(event, false, this.item, category, this.itype);};
		icon.onmousemove	= function(event){fn_set_hover_list(event, true);};
		icon.onmouseout 	= function(){this.style.zIndex = '5';fn_remove_obj('mp_lst');};
		icon.main_mode 		= main_mode;
		
		
		if(!frame_mode)
		{
			if(itype == 1)
			{
				if(main_mode == 4 || main_mode == 5)
				{
					icon.onclick		= function(){fn_sw_mm(this.main_mode, false);list_det(this.id, this.main_mode);};
				}
				else
				{
					icon.onclick		= function(){fn_set_active(this.id, this.itype, 1);fn_load_item_details();};
				}				
			}
			else if(itype == 2)
			{
				icon.onclick	= function(){fn_sw_mm(2);list_det(this.id, 2);};
			}
		}
		else
		{
			icon.onclick = function()
			{				
				if(this.map_url != undefined && this.map_url != '')
				{
					var mu = this.map_url.replace(/http:\/\//, '');
					
					if(mu.match(frame_referer))
					{
						try
						{
							parent.parent.location.href = 'http:\/\/' + this.map_url;
						}
						catch(err){}						
					}					
				}
				else
				{
					try
					{
						var loc = parent.location.href.replace(/#$/, '') + '&cid=' + this.id;
						parent.location.href = loc;	
					}
					catch(err){}
				}				
			};
		}
		
		icon.ondblclick 	= zoomInDblClick;
	
		// set icon on map
		if(target)
		{
			target.appendChild(icon);
		}
	}
}


function fn_zoom_to_icon(icn_str, itype, mode, id)
{
	if(!fn_is_empty(icn_str))
	{
		var arr = icn_str.split('--');
		if(arr[0].match(/_/))
		{
			var icn_arr = arr[0].split('_');

			setZoomLevel(50, icn_arr[0], icn_arr[1]);
			fn_set_pos_type_info(icn_arr[4], icn_arr[0], icn_arr[1], itype);
		}	
	}
}

function fn_set_pos_type_info(pos_type, x, y, type)
{
	if(pos_type == 4 || pos_type == 5)
	{
		var co = lurefToViaah(x, y);
		
		if(pos_type == 4)
		{
			var output = 'dans cette localité';
		}
		else if(pos_type == 5)
		{
			var output = 'dans cette rue';
		}
		
		if(type == 1)
		{
			output = 'Société(s) ' + output;
		}
		if(type == 2)
		{
			output = 'Objet(s) ' + output;
		}
		
		x = parseInt(co[0]) + 12;
		y = parseInt(co[1]) - 5;
		
		if(getObject('icon_pos_type'))
		{
			getObject('map_c_infos').removeChild(getObject('icon_pos_type'));
		}
		
		var div = document.createElement('div');
		div.id 							= 'icon_pos_type';
		div.style.left 			= x + 'px';
		div.style.top 			= y + 'px';
		div.innerHTML				= output;
		
		getObject('map_c_infos').appendChild(div);
	}
}

// ------------------------------------- read in db and set icons on map --------------------------
// remove icons from map
function fn_remove_icons(vis_arr_pos)
{
	map_div = getObject(icon_path+vis_arr_pos);
	if(map_div)
	{
		getObject('map_c_items').removeChild(map_div);
	}
	if(vis_arr[fn_get_vis_arr_pos(vis_arr_pos)])
	{
		vis_arr.fn_array_cut(fn_get_vis_arr_pos(vis_arr_pos));
		//show_vis_arr();
		fn_update_vis_items_display();
	}
}
// remove icons of lower leveled categories if top category is switched on
function fn_remove_intervented_icons(itype, mode, id)
{
	var tmp_arr = vis_arr.concat();
	
	for(var i=0; i<tmp_arr.length; i++)
	{
		for(var k=0; k<tmp_arr[i].hist_arr.length; k++)
		{
			if(itype == tmp_arr[i].itype && mode == tmp_arr[i].mode && id == tmp_arr[i].hist_arr[k])
			{
				fn_remove_icons(i);
				break;
			}
		}
	}
}

// ------------------------------------- hoverin and labeling ------------------------------------- 
// icon hover
function fn_icon_hover (icn_id, itype, mode, label, x, y, hover)
{
	icon = getObject(icn_id);
	if(hover)
	{
		icon.style.zIndex = 99;
	}
	else
	{
		icon.style.zIndex = 5;
	}
	fn_show_label (icn_id, itype, mode, label, x, y, hover);	
}

// set icon label
function fn_show_label (icn_id, itype, mode, label, x, y, hover)
{
	if(hover)
	{
		var x_offset = 20; 
		var y_offset = -1;
		
		x = parseInt(x) + x_offset;
		y = parseInt(y) + y_offset;
		var map_c_items = getObject('map_c_items');
		var div = document.createElement('div');
		div.style.position = "absolute";
		div.style.left = x + 'px';
		div.style.top = y + 'px';
		div.style.zIndex = 99;
		div.id = 'map_item_label';
		div.innerHTML = label;		
		div.className = 'map_item_label';
		map_c_items.appendChild(div);
	}
	else
	{
		var map_c_items = getObject('map_c_items');
		var map_item_label = getObject('map_item_label');
		map_c_items.removeChild(map_item_label);
	}
}

// ------------------------------------- additional functions ------------------------------------- 
// check if id with mode and itype is in "vis_arr"
function fn_in_vis_arr (itype, mode, id, hist_ids)
{
	var pos = new Array(false, false, false, false, false);

	for(var i = 0; i < vis_arr.length; i++)
	{
		if(vis_arr[i].itype == itype && vis_arr[i].mode == mode && vis_arr[i].id == id)
		{
			pos[0] = true;
			pos[1] = i;
			pos[2] = vis_arr[i].pos_id;
		}
		if(hist_ids && hist_ids != '')
		{
			if(vis_arr[i].itype == itype)
			{
				var hist_ids_arr = hist_ids.split(',');
				for(var k = 0; k < hist_ids_arr.length; k++)
				{
					if(vis_arr[i].id == hist_ids_arr[k])
					{
						pos[0] = true;
						pos[1] = i;
						pos[2] = vis_arr[i].pos_id;
						pos[3] = itype + '_' + mode + '_' + id;
						pos[4] = vis_arr[i].itype + '_' + vis_arr[i].mode + '_' + vis_arr[i].id;
					}
				}
			}
		}
	}
	return pos;
}
// check if id is in "minus_arr" in "vis_array"
function in_minus_array(id)
{
	var pos = new Array(false, false, false);
	for(var i = 0; i < vis_arr.length; i++)
	{
		var minus_pos = vis_arr[i].minus_arr.fn_array_search(id);
		if(parseInt(minus_pos) >= 0)
		{
			pos[0] = true;
			pos[1] = vis_arr[i].pos_id;
			pos[2] = minus_pos;
		}
	}
	return pos;
}

// return symbol path for icon in exception of itype
function fn_get_symbol_path (itype)
{
	switch(itype)
	{
		case 1: var ret = 'categories/'; 	break; 
		case 2: var ret = 'immo/'; 				break; 
		case 3: var ret = 'hobotypes/'; 	break; 
		case 4: var ret = ''; 						break; 
		case 5: var ret = ''; 						break; 
		case 6: var ret = ''; 						break; 
		default: var ret = '';
	}
	return ret;
}

// delete element from array using prototype on Object Array
Array.prototype.fn_array_cut = function(n)
{
	if(n>=0 && n<this.length) {
		if(n<this.length) {
			var x = -1;
			while((++x)<this.length) {
				if(x>=n) {
					this[x] = this[x+1];
				}
			}
		}
		this.pop();
	}
};

Array.prototype.fn_array_search = function(str)
{
	for(var i = 0; i < this.length; i++)
	{
		if(this[i] == str)
		{
			return i;
		}
	}
	return -1;
};

Array.prototype.fn_array_shuffle = function()
{
	var tmp, rand;
  for(var i =0; i < this.length; i++){
    rand = Math.floor(Math.random() * this.length);
    tmp = this[i]; 
    this[i] = this[rand]; 
    this[rand] = tmp;
  }
};

function fn_get_obj_length(obj)
{
	var k = 0;
	for(var i in obj)
	{
		if(i.indexOf('fn_') == '-1')
		{
			k++;
		}
	}
	return k;
}

function fn_get_cluster(x,y)
{
	var cluster_size = 10;
	
	// set item cluster value	
	var x_mod = x % cluster_size;
	var y_mod = y % cluster_size; 

	// set clu_x
	if(x_mod < 5){	clu_x = x - x_mod;}
	else{						clu_x = x - x_mod + cluster_size;}
	// set_clu_y
	if(y_mod < 5){	clu_y = y - y_mod;}
	else{						clu_y = y - y_mod + cluster_size;}
	
	var c = new Array(); 
	c[0] = clu_x; 
	c[1] = clu_y; 
	
	return c; 
}

function fn_get_free_pos_id()
{
	var tmp_arr = new Array();
	for(var i = 0; i < vis_arr.length; i++)
	{
		if(vis_arr[i])
		{
			tmp_arr[i] = vis_arr[i].pos_id;
		}
	}
	tmp_arr.sort(fn_numsort);
	for(var i = 0; i <= tmp_arr.length; i++)
	{
		if(tmp_arr[i] != i)
		{
			return i;
		}
	}
	return false;
}

// get position in vis_arr
function fn_get_vis_arr_pos(pos_id)
{
	for(var i = 0; i < vis_arr.length; i++)
	{
		if(vis_arr[i].pos_id == pos_id)
		{
			return i;
		}
	}
	return false;
}

// function to sort array numeric....
function fn_numsort(a, b) {
  return a - b;
}
