jxp.ready(function(){

	map={
		movieClip:document.map,								// reference to the flash map
		empty:true,
		clear:function(){									// removes all markers from the map
			if (!this.empty) this.movieClip.clearMarkers();
			},
		markers:{											// stores data relating to the received marker data
			active:null,
			all:{}
			},
		query:{
			autoload:false,
			delay:false,
			delayDuration:600,
			busy:false,
			cache:{},										// to reuse received marker data
			dispatch:function(){
				if (map.query.busy) map.query.delay=setTimeout(map.query.dispatch,map.query.delayDuration);	// one query at a time
				else{
					map.query.busy=true;					// fetch marker data, or use existing from cache
					var filter=map.getFilters(filters);
					if (!map.query.cache[filter]) (new jxp.XHTTP('http://www.forestheritagescotland.com/query.php',{
					//if (!map.query.cache[filter]) (new jxp.XHTTP('http://test.forestheritagescotland.com/query.php',{
					//if (!map.query.cache[filter]) (new jxp.XHTTP('http://192.168.1.23/fcs/query.php',{
						data:(preview ? 'preview=1&' : '')+'mode=search&'+filter,
						onComplete:map.query.display
						})).send();
					else map.query.display(map.query.cache[filter]);
					}
				},
			display:function(json){							// pass marker data to flash, then store it
				if (json.totalMarkers){
					map.movieClip.addMarkers(json);
					map.empty=false;
					}
				else{
					map.empty=true;
					map.query.busy=false;
					}
				map.query.cache[json.query]=json;
				map.markers.all=json.markers;
				if (map.autoload){	// if autoloading specific data, do it now
					map.overlay.dispatch(map.autoload.id,map.autoload.type);
					delete map.autoload;
					}
				}
			},
		getFilters:function(){								// build a querystring from filter object
			var f=[];
			for (var g in filters){
				var n=[];
				if (g.all) n.push('all');
				else{
					for (var x in filters[g]){
						if (filters[g][x]) n.push(x); 
						}
					}
				f.push(g+'='+n.join(','));
				}
			return f.join('&');
			},
		notify:{											// these are called from Flash to notify JS of operations that have completed
			clear:function(){
				map.empty=true;
				},
				query:function(){
				map.query.busy=false;
				}
			},
		overlay:{
			activeType:null,
			activeID:null,
			cache:{											// cache specific data too
				'Event':{},
				'Site':{},
				'User':{},
				'Topic':{}
				},
			dispatch:function(id,type,userdetail){						// show the overlay, then fetch specific data or grab from cache
				jxp.$('overlay').show();
				if (userdetail) map.lastStoryID=id;
 				if (!map.overlay.cache[type][id] || (type=="User")) (new jxp.XHTTP('http://www.forestheritagescotland.com/query.php',{
				//if (!map.overlay.cache[type][id] || (type=="User")) (new jxp.XHTTP('http://test.forestheritagescotland.com/query.php',{
				//if (!map.overlay.cache[type][id] || (type=="User")) (new jxp.XHTTP('http://192.168.1.23/fcs/query.php',{
					data:(preview ? 'preview=1&' : '')+'mode=detail&id='+id+'&type='+type+"&userdetail="+(userdetail ? 1 : 0),
					onComplete:map.overlay.display
					})).send();
				else{
					map.overlay.display(map.overlay.cache[type][id]);
					//console.log('cache');
					}
				},
			display:function(json){							// add the specific data via the DOM - this is the slow bit.
				if (json && ('id' in json)){
				
					if (json.type=='Event'){
					
						jxp.$('event_data_title').setHTML(json.title);
						jxp.$('event_data_startDate').setHTML(json.startDate || 'n/a');
						jxp.$('event_data_endDate').setHTML(json.endDate || 'n/a');
						jxp.$('event_data_startTime').setHTML(json.startTime || 'n/a');
						jxp.$('event_data_endTime').setHTML(json.endTime || 'n/a');
						jxp.$('event_data_bookingReq').setHTML(json.bookingReq ? 'booking required' : '');
						jxp.$('event_data_location').setHTML(json.location);
						jxp.$('event_data_description').setHTML(json.description);
						jxp.$('event_data_contactname').setHTML(json.contactName);
						jxp.$('event_data_contactemail').setHTML(json.contactEmail);
						jxp.$('event_data_contactphone').setHTML(json.contactPhone);
						
						}
						
					else if (json.type=='Site'){
					
						jxp.$('site_data_name').setHTML(json.name);
						jxp.$('site_data_altNames').setHTML(json.altNames);
						jxp.$('site_data_intro').setHTML("<h6>"+json.introTitle+"</h6>"+json.introduction);
						jxp.$('site_data_people').setHTML(json.stories.people.text ? "<h6>"+json.stories.people.title+"</h6>"+json.stories.people.text : "");
						jxp.$('site_data_evidence').setHTML(json.stories.evidence.text ? "<h6>"+json.stories.evidence.title+"</h6>"+json.stories.evidence.text : "");
						
						jxp.$('site_people_link')[(json.stories.people.text ? 'remove' : 'add')+'Class']('hide');
						jxp.$('site_evidence_link')[(json.stories.evidence.text ? 'remove' : 'add')+'Class']('hide');
						
						jxp.$('site_data_gridRef').setHTML(json.gridRef);
						jxp.$('site_data_parish').setHTML(json.parish);
						jxp.$('site_data_linklist').setHTML(json.links);
						
						var tbl=jxp.$('site_location_data_table')[0], l=tbl.rows.length;
						while (l--) tbl.deleteRow(l);
						
						var locationData={
							forestName:'Forest Name',
							forestDistrict:'Forest District',
							carPark:'Car Park',
							directions:'Directions',
							accessibility:'Accessibility',
							officialTrail:'Official Trail',
							activities:'Activities',
							facilities:'Facilities',
							locationAddress:'Address',
							locationPhone:'Phone',
							locationEmail:'Email'
							};
							
						var i=0;
						for (var x in locationData){
							if (json[x]){
								var row=tbl.insertRow(i);
								var cell=row.insertCell(0);
								cell.className='col1';
								cell.innerHTML=locationData[x];
								var cell=row.insertCell(1);
								cell.innerHTML=(x=='locationEmail' ? "<a href='mailto:"+json[x]+"'>"+json[x]+"</a>" : json[x]);
								i++;
								}
							}
						jxp.$('site_visit_link')[(i ? 'remove' : 'add')+'Class']('hide');
						
						}
						
					else if (json.type=='Topic'){
						jxp.$('other_data_title').setHTML(json.title);
						jxp.$('other_data_text').setHTML(json.text);
						jxp.$('other_overlay_list')[0].style.display='none';
						jxp.$('other_overlay_previous')[0].innerHTML="&lt; previous topic";
						jxp.$('other_overlay_next')[0].innerHTML="next topic &gt;";
						}
						
					else if (json.type=='User'){
					
						jxp.$('other_data_title').setHTML('Your stories'+(json.siteName ? " - "+json.siteName : ""));
						if (json.list){
							
							var list=[];
							map.storyIDs=[];
							list.push("<li><p style='font-weight:bold;padding-bottom:20px'>Click on any of the links below to read more.</p></li>");
							json.list.forEach(function(o){
								map.storyIDs.push(o.id*1);
								list.push("<li><a href='javascript:map.overlay.dispatch("+o.id+",\"User\",true);'>&raquo; <b>STORY:</b> "+o.title+"</a></li>");
								});
							
							jxp.$('other_data_text').setHTML('');
							jxp.$('other_media').hide();
							jxp.$('other_data_list').show();
							jxp.$('other_overlay_list')[0].style.visibility='hidden';
							jxp.$('other_data_list')[0].innerHTML="<ul style='padding-left:17px'>"+list.join('')+"</ul>";
							jxp.$('other_overlay_previous')[0].style.visibility='hidden';
							jxp.$('other_overlay_next')[0].style.visibility='hidden';
							map.lastStoryList=json;
							}
						else{
							jxp.$('other_data_list').hide();
							jxp.$('other_data_list')[0].innerHTML='';
							jxp.$('other_data_text').setHTML(json.text);
							jxp.$('other_media').show();
							jxp.$('other_overlay_list')[0].style.visibility='visible';

							jxp.$('other_overlay_list')[0].style.display='block';							
							jxp.$('other_overlay_previous')[0].innerHTML="&lt; previous story";
							jxp.$('other_overlay_next')[0].innerHTML="next story &gt;";
							
							if (map.storyIDs.length>1) jxp.$('other_overlay_previous')[0].style.visibility='visible';
							if (map.storyIDs.length>1) jxp.$('other_overlay_next')[0].style.visibility='visible';
							}
						}
						
					map.overlay.activeType=json.type;
					map.overlay.activeID=json.id;
					map.overlay.cache[json.type][json.id]=json;
					
					// store the active marker details
					
					if (map.markers.all[json.type]){
						for (var i=0;i<map.markers.all[json.type].length;i++){
							if (map.markers.all[json.type][i].uid==json.id){
								map.markers.active=map.markers.all[json.type][i];
								break;
								}
							}
						}
						
					// set the available media links as needed
						
					var type=(json.type=='Topic' || json.type=='User') ? 'other' : json.type.toLowerCase();
						
					map.media.reset(type,json.media);
					jxp.$(type+'_overlay').show();
						
					}
				},
			hide:function(){
				jxp.$('overlay').hide();
				}
			},
		media:{
			activeType:null,
			activeIndex:null,
			reset:function(type,mediaData){
				
				var activated=false;	// loop through the available media and display the first one we come to, otherwise make sure we don't display anything
				['image','video','audio'].forEach(function(t){
					if (mediaData[t]){
						jxp.$CSS('#'+type+'_media a.'+t).addClass('active');
						if (!activated){
							activated=true;
							map.media.move(0,t);
							}
						}
					else jxp.$CSS('#'+type+'_media a.'+t).removeClass('active');
					});
				if (!activated) map.media.move(0,'empty');
				
				},
			move:function(n,mediaType){
				var markerType=map.overlay.activeType.toLowerCase();
				var omitMediaDesc=markerType=='user';
				if (markerType=='topic' || markerType=='user') markerType='other';
				var mediaData=map.overlay.cache[map.overlay.activeType][map.overlay.activeID].media;
				this.activeIndex=n;
				
				if (mediaType=='empty'){	// clear everything if no media available
					jxp.$(markerType+'_media_image').setHTML();
					jxp.$(markerType+'_media_swf').remove();
					jxp.$(markerType+'_media_content').insertChild("<div id='"+markerType+"_media_swf'></div>");
					jxp.$(markerType+'_data_media_description').setHTML();
					
					var controls=jxp.$CSS('#'+markerType+'_media ul.media_controls');
					if (controls.length) controls[0].style.display='none';
					
					}
				else{
					this.activeType=mediaType || this.activeType;
					if (this.activeType=='image'){
						jxp.$(markerType+'_media_image').setHTML((mediaData.image[n].large ? "<a href='"+mediaData.image[n].large+"' style='cursor:pointer !important' target='_blank' title='Click to view large version'>" : "")+"<img src='"+mediaData.image[n].url+"' />"+(mediaData.image[n].large ? "</a>" : ""));
						jxp.$(markerType+'_media_swf').remove();	// because swfobject replaces the container, the only way we can hide an embedded SWF is to remove it, and add a new container ready for the next embed call.
						jxp.$(markerType+'_media_content').insertChild("<div id='"+markerType+"_media_swf'></div>");
						
						jxp.$(markerType+'_data_media_description').setHTML(omitMediaDesc ? '' : mediaData[this.activeType][n].caption+mediaData[this.activeType][n].copyright);
						
						}
					else if (this.activeType=='video'){
						if (mediaData.video[n].url.match(/youtube/)){
							swfobject.embedSWF('http://www.youtube.com/v/'+mediaData.video[n].url.match(/v=([^&]+)(&|$)/)[1]+'&hl=en&fs=1&rel=0', markerType+'_media_swf', "320", "265", "9.0.0");
							}
						else{
							swfobject.embedSWF('http://www.dailymotion.com/swf/'+mediaData.video[n].url.match(/video\/([^&]+)(&|$)/)[1]+'&related=0', markerType+'_media_swf', "320", "265", "9.0.0");
							}
						jxp.$(markerType+'_media_image').setHTML();
						jxp.$(markerType+'_data_media_description').setHTML(omitMediaDesc ? '' : mediaData[this.activeType][n].caption+mediaData[this.activeType][n].copyright);
						
						}
					else if (this.activeType=='audio'){
						swfobject.embedSWF('http://www.forestheritagescotland.com/FLAs/soundPlayer.swf', markerType+'_media_swf', '385', '265', '9.0.0', false, {src:mediaData.audio[n].url,assoc_image:mediaData.audio[n].assoc_image || 'http://www.forestheritagescotland.com/assets/images/audio.jpg'},{wmode:'transparent'});
						jxp.$(markerType+'_media_image').setHTML();
						
						jxp.$(markerType+'_data_media_description').setHTML(omitMediaDesc ? '' : mediaData[this.activeType][n].caption+mediaData[this.activeType][n].copyright+"<p>Download <a href='http://www.forestheritagescotland.com/assets/sounds/download.php?file="+(mediaData.audio[n].url.replace(/^.+\//,""))+"'>MP3</a>"+(mediaData.audio[n].assoc_file ? " / <a href='"+mediaData.audio[n].assoc_file+"'>transcript</a>" : "")+"</p>");
						//jxp.$(markerType+'_data_media_description').setHTML(omitMediaDesc ? '' : mediaData[this.activeType][n].caption+mediaData[this.activeType][n].copyright+"<p><a href='http://www.forestheritagescotland.com/assets/sounds/download.php?file="+(mediaData.audio[n].url.replace(/^.+\//,""))+"'>Download MP3</a></p>");
						//jxp.$(markerType+'_data_media_description').setHTML(mediaData[this.activeType][n].caption+mediaData[this.activeType][n].copyright);
						
						}
						
					var controls=jxp.$CSS('#'+markerType+'_media ul.media_controls');
					if (controls.length) controls[0].style.display= mediaData[this.activeType].length>1 ? 'block' : 'none';
						
					}
				}
			},
		storyIDs:[],
		lastStoryID:null,
		lastStoryList:null
		};
		
		
	// set listeners for switching between paragraphs on sites
	jxp.$('site_data_paraType').click(function(e){
		var target=jxp.Event.target(e);
		if (target[0].tagName.toLowerCase()=='a'){
			jxp.Event.cancel(e);
			jxp.$CSS('#site_data_paras div').removeClass('active');
			jxp.$('site_data_'+target[0].name).addClass('active');
			}
		});
		
	// set listeners for closing the overlay
	jxp.$('event_overlay_close').click(function(){
		jxp.$('event_overlay','overlay').hide();
		});
	jxp.$('site_overlay_close').click(function(){
		jxp.$('site_overlay','overlay').hide();
		});
	jxp.$('other_overlay_close').click(function(){
		jxp.$('other_overlay','overlay').hide();
		});
	jxp.$('other_overlay_list').click(function(){
		map.overlay.display(map.lastStoryList);
		});
	
	
	// set listeners for prev / next buttons on overlay
	var move=function(){
		var direction=this[0].id.match('next') ? 1 : -1	//, type=this[0].id.split('_')[0];
		var type=map.overlay.activeType;
		if (type=='Topic'){	// topics don't have marker data so calculate next / prev ID seperately
			var n=topics[map.overlay.activeID]+direction;
			var max=topics.total;
			if (n<0) n=max;
			else if (n>max) n=0;
			for (var x in topics){
				if (x!='total' && topics[x]==n){
					map.overlay.dispatch(x,type, type=='User');
					break;
					}
				}
			}
		else if (type=="User"){	// user works differently now also
			var index=map.storyIDs.indexOf(map.lastStoryID*1);
			if (n<0) index--;
			else index++;
			if (index<0) index=map.storyIDs[map.storyIDs.length]-1;
			else if (index==map.storyIDs.length) index=map.storyIDs[0];
			else index=map.storyIDs[index];
			map.overlay.dispatch(index,"User",true);
			}
		else{	// otherwise use marker data to calc ID
			var n=map.markers.active.order+direction;
			var max=map.markers.all[type].length-1;
			if (n<0) n=max;
			else if (n>max) n=0;
			map.overlay.dispatch(map.markers.all[type][n].uid,type, type=='User');
			}
		};
	
	jxp.$('Event_overlay_previous','Event_overlay_next','Site_overlay_previous','Site_overlay_next','other_overlay_previous','other_overlay_next').click(move);


	// set listeners for switching between media types
	jxp.$CSS('.media_switcher').click(function(e){
		var target=jxp.Event.target(e);
		if (target[0].tagName.toLowerCase()=='a'){
			jxp.Event.cancel(e);
			map.media.move(0,target[0].name);
			}
		});

	// set listeners for switching between media entries
	jxp.$CSS('.media_controls').click(function(e){
		var target=jxp.Event.target(e);
		if (target[0].tagName.toLowerCase()=='a'){
			var dir=target.hasClass('left')[0] ? -1 : 1;
			var mediaType=map.media.activeType;
			var max=map.overlay.cache[map.overlay.activeType][map.overlay.activeID].media[mediaType].length-1;
			var n=map.media.activeIndex+dir;
			if (n<0) n=max;
			else if (n>max) n=0;
			if (n!=map.media.activeIndex) map.media.move(n);
			}
		});


	// set listener for controlling the filter menus. Looks complex but is mostly controlling behaviour of the 'all' option,
	// before building  / dispatching the filter query.
	jxp.$CSS('#controls').click(function(e){	// event delegation on the menu links
		jxp.Event.cancel(e);
		var target=jxp.Event.target(e);
		if (target[0].tagName.toLowerCase()!='a') return;
		
		if (target.hasClass('heading')[0]){
			var submenu=jxp.$(target[0].name+'_submenu');
			if (submenu.hasClass('hide')[0]) submenu.removeClass('hide');
			else submenu.addClass('hide');
			}
		else{
		
			// control the filter states
			var tmp=target[0].id.split('-'), t=tmp[0], n=tmp[1], g=filters[t], c='active';
			if (!n) return;	// just cancel for the 'discover more' link
			if (g[n]){
				if (t=='eventType'){
					var only=false;
					for (var x in g){
						if (x!=n && g[x]){
							only=true;
							target.removeClass(c);
							g[n]=false;
							break;
							}
						}
					if (!only) return;
					}
				else{
					if (n!='all'){
						var only=true;
						for (var x in g){
							if (x!=n && g[x]){
								only=false;
								break;
								}
							}
						if (only){
							g.all=true;
							jxp.$(t+'-all').addClass(c);
							}
						target.removeClass(c);
						g[n]=false;
						}
					else return;
					}
				}
			else{
				if (n=='all'){
					for (var x in g){
						if (x!='all'){
							g[x]=false;
							jxp.$(t+'-'+x).removeClass(c);
							}
						}
					}
				else if (g.all){
					g.all=false;
					jxp.$(t+'-all').removeClass(c);
					}
				g[n]=true;
				target.addClass(c);
				}
			
			map.clear();
			if (map.query.delay) clearTimeout(map.query.delay);
			map.query.delay=setTimeout(map.query.dispatch,map.query.delayDuration);
			
			}
			
		});
	
	// add listeners to the 'discover more' menu as its not handled by flash
	
	jxp.$('discovermore_submenu').click(function(e){
		var t=jxp.Event.target(e)[0];
		if (t.tagName.toLowerCase()!='a') return;
		var topicID=t.href.replace(/.+#/,'');
		map.overlay.dispatch(topicID,'Topic');
		});
		
	/* 'your story' stuff */
	
	// show upload overlay
	
	jxp.$('site_your_story').click(function(){
		jxp.$('upload_relateTo')[0].value=map.markers.active.uid;
		jxp.$('upload_data_title').setHTML('Tell us your story about '+jxp.$('site_data_name')[0].innerHTML);
		jxp.$('site_overlay').hide();
		jxp.$('upload_overlay').show();
		
		});
		
	// revent back to site
	
	function revertToSite(e){
		jxp.Event.cancel(e);
		jxp.$('upload_msg').setHTML('');
		jxp.$('upload_overlay').hide();
		jxp.$('site_overlay').show();
		};
		
	// when user cancels	
	jxp.$('upload_cancel').click(revertToSite);
	
	// when user closes success box
	jxp.$('upload_success_confirm').click(function(e){
		revertToSite(e);
		jxp.$('upload_form').removeClass('hide');
		jxp.$('upload_success').hide();
		});
		
	jxp.$CSS('#upload_overlay input[type=radio]').click(function(){
		var v=this[0].value;
		if (v=='video'){
			jxp.$('upload_youtube')[0].disabled=false;
			jxp.$('upload_img')[0].disabled=true;
			}
		else if (v=='image'){
			jxp.$('upload_youtube')[0].disabled=true;
			jxp.$('upload_img')[0].disabled=false;
			}
		else {
			jxp.$('upload_youtube')[0].disabled=true;
			jxp.$('upload_img')[0].disabled=true;
			}
		});
		
		
		
		
	
	});
	
// global as accessed by iframe
function userContentResponse(msg){
jxp.$('upload_msg').setHTML(msg);
if (!msg){	// no error message means success
	jxp.$('upload_form').addClass('hide');
	jxp.$('upload_success').show();
	}
}