/*---------------------------------------------------------\
|                              TWP                          |
|
|----------------------------------------------------------*/
 
var twp = {

  ctr: {
  	
  	inc_amount: null,  
  	old_count: 0, 
  	new_count: 1, 
  	rate: null, 
  	count: null, 
  	count_str: null, 
  
    increment: function(inc_amount_passed)
		{
			if(isNaN(inc_amount_passed))
			{
				this.inc_amount = 1;
			}
			else
			{
				this.inc_amount = inc_amount_passed; 
			}
			old_count = this.count.toString(); 
	
			this.count = this.count + this.inc_amount;
			this.new_count = this.count.toString(); 

			for(i = 0; i < this.new_count.length; i++)
			{
				if(this.old_count[i] != this.new_count[i])
				{
					this.setDigit(this.new_count.length-i - 1, this.new_count[i]); 
				}
			}
	 
			setTimeout('twp.ctr.increment(1)', this.rate);
		}, 
		
		setDigit: function (digit_number, value)
		{
			$('#twp_counter_' + digit_number).css('background-position','0px -' + 47*value + 'px');
		}

  }, 

	psw: {
		photos: [], 
		cache: [],
		
		loadpic: function(full_url, thumb_url, caption) {
			this.photos.push(new Array(full_url, thumb_url, caption));
		},  
		
		switchpic: function (a, frame) {
			clicked_obj = $(a);
			clicked_obj.closest('img').addClass('selected');
			clicked_obj.closest('img').siblings().removeClass('selected');
					
			promote = a.id;
			promote = promote.replace('twp_photo_', '');
			
			$("#" + frame).hide(); 
			
			$("#" + frame).attr({
				src: twp.psw.photos[promote][0], 
				alt: twp.psw.photos[promote][2],
				title: twp.psw.photos[promote][2]
			});
			
			$("#" + frame).fadeTo("fast", 1); 
					
			
		}, 
		
		preloadpics: function() {
		  var args_len = this.photos.length;
			for (var i = args_len; i--;) {
	      var cacheImage = document.createElement('img');
	      cacheImage.src = this.photos[i][0];
	      this.cache.push(cacheImage);
    	}
		}
	}, 
	
	
	
	map: {
	

				
		map_type: null, 

		points_downloaded: [],
		points_on_map: [],

		infowindow: null, 
		zoom: null, 
		center: null, 

		count_points_on_map: 0, 

		last_icon_id: 0, 
		last_list_id: 0, 
		
		active_infowindow: null,  
		
		total_matches: 0, 
		page: 1, 
		load_page: 1, 
		pagination: 25,
		
		replace_points: true,
		pan_result: false, 

		
		COOKIE_NAME: "twg_search", 
		cookie_options: { path: '/', expires: 1 }, 

		initialize: function() {
		
				//Basic Profile
			this.ico_basic = new google.maps.MarkerImage(
				'/images/icons/map/basic.png',
				new google.maps.Size(10, 20)
			);
				
			//Standard Profile
			this.ico_standard = new google.maps.MarkerImage(
				'/images/icons/map/standard.png',
				new google.maps.Size(16, 32)
			);
					
			//Enhanced Profile
			this.ico_enhanced = new google.maps.MarkerImage(
				'/images/icons/map/enhanced.png',
				new google.maps.Size(16, 32)
			);
		
			$.ajaxSetup({cache: false});
		
			var myOptions = {
				zoom: this.zoom,
			  center: this.center,
			  mapTypeId: google.maps.MapTypeId.TERRAIN
			};
			
			if(twp.map.map_type == "survey")
			{
				twp.map.pan_and_zoom = false; 
			}
			else
			{
				twp.map.pan_and_zoom = true;
			}
			
			this.map = new google.maps.Map(document.getElementById("map"), myOptions);

			
				
			//Load initial points for search map: 
			if(this.map_type === 'search') 
			{
				//Setup Event handlers: 
				//Load Points for Search Map only
				this.loadPointsXml();
			}
			else
			{
				//Update Markers: 
				this.loadPointsIntoMap(twp.map.pan_and_zoom);
			}
			
					
			
			// Select field contents
			$("input[type=text]").focus(function(){
			   this.select();
			});
		},
	 
	
		//GENERAL METHODS: 
		
		listClick: function(i) {
			google.maps.event.trigger(this.points_on_map[i], 'click'); 
		}, 
		
		
		funcGenerateListString: function(arr){
			return '<tr id="twp_sitelist_' + arr.sid + '">' +
			'<td class="twp_company_logo"><a href="/index.php/company/' + arr.permalink + '"><img src="' + arr.logo + '" align="left" width="120px" height="84px" /></a></td>' + 
			'<td class="twp_company_name"><a href="/index.php/company/' + arr.permalink + '">' + arr.company_name + '</a></td>' + 
			'<td class="twp_site_address"><a href="javascript:twp.map.listClick(' + arr.sid + ')">' + arr.site_address + '</a></td>' + 
			'<td class="twp_employees">' + arr.employee_no + '</td>' + 
			'<td class="twp_company_sector">' + arr.sector + '</td>' + 
			'</tr>'
		},
		
		
		funcGenerateContentString: function(arr){
			switch(twp.map.map_type)
			{
				case "company": 
					var string = "<div class='twp_ginfowindow'>" +
						"<table class='twp_ginfowindow_table' border='0'>" + 
							"<tr>" + 
								"<td valign='top' style='padding-right: 5px;' rowspan='2'>" + 
									"<div class='twp_title'>" + arr.company_name + "</div>" + 
					  		"<div class='twp_address'>" + arr.site_address + "</div>" +
						  "</td>" +
						"</tr>" + 

					 "</table>"; 
				break; 
				default: 
					var string = "<div class='twp_ginfowindow'>" +
						"<table class='twp_ginfowindow_table' border='0'>" + 
							"<tr>" + 
								"<td valign='top' style='padding-right: 5px;' rowspan='2'>" + 
									"<div class='twp_title'><a href='/index.php/company/" + arr.permalink + "'>" + arr.company_name + "</a></div>" + 
					  		"<div class='twp_address'>" + arr.company_name + "</div>" + 
						  	"<div class='twp_employees'>Employees in Region: <span class='twp_answer'>" + arr.employee_no + "</span><br />" + 
						//  	 "Surveyed Employees: <span class='twp_answer'>" + arr.surveyed_no + "</span></div>" + 
						  	"<div class='twp_sector'>Sector: <span class='twp_answer'>" + arr.sector + "</span></div>" +
						  "</td>" +
								"<td valign='top'><div class='twp_image'><a href='/index.php/company/" + arr.permalink + "'><img src='" + arr.image + "' align='left' width='100px' width='70px' /></a></div>" +
								"</td>" + 
								 
						 "</tr>" + 
						 "<tr>" + 
						 	"<td>" + 
					 			"<div class='twp_link'><a href='/index.php/company/" + arr.permalink + "'>Find out more.</a>" + "</div>" + 
					 		"</td>" + 
					 	"</tr>" + 
					 "</table>";
				break; 
			}
			return string; 
		},
		
		loadPointsIntoMap: function(autozoom){
			var markerBounds = new google.maps.LatLngBounds();
			
			//Remove infowindow if open: 
			if (twp.map.active_infowindow) twp.map.active_infowindow.close();
			
 
			//Remove any existing points that are no longer on map: 
			for(k in twp.map.points_on_map) 
			{
			//console.log("Check for " + k); 
				if((!twp.map.points_downloaded[k]) && (twp.map.points_on_map[k] != 0))
				{
					//Remove Event:
					google.maps.event.clearInstanceListeners(twp.map.points_on_map[k]);
					
					//Remove Point
					twp.map.points_on_map[k].setMap(null); 
					
					this.count_points_on_map = this.count_points_on_map -1;
					
					if(this.map_type === 'search')
					{
						$('#twp_sitelist_' + k).remove();
						if(k === this.last_list_id)
						{
							this.last_list_id = 0; 
						}
						//Remove Last Icon record: 
						this.last_icon_id = 0; 
					}
					
					twp.map.points_on_map[k] = 0;
				}
			}
 			
			//Add any new points that are not on map: 	 
			for (k in this.points_downloaded)
			{
				//console.log("Adding " + k); 
				if(!twp.map.points_on_map[k])
				{
				
					twp.map.points_on_map[k] = this.createSimpleMarker(this.map, this.points_downloaded[k][0]);
					this.count_points_on_map = this.count_points_on_map +1;
					
					markerBounds.extend(new google.maps.LatLng(this.points_downloaded[k][0].lat, this.points_downloaded[k][0].lng)); 
					if(this.map_type === 'search')
					{
						//Add point to list:
						$('tr#twp_sitelist_' + this.last_list_id).after(twp.map.funcGenerateListString(this.points_downloaded[k][0]));
					}
					this.last_list_id = k;
				}
				else
				{
					//Do not add new point (already on map), but do extend bounds: 
					markerBounds.extend(new google.maps.LatLng(this.points_downloaded[k][0].lat, this.points_downloaded[k][0].lng)); 
				}
 				
			}
		 	
			if(autozoom | this.pan_result)
			{
				//If there are more than one point on the map we zoom:  
				if((this.count_points_on_map > 0) && (!markerBounds.isEmpty()))
				{
					this.map.fitBounds(markerBounds);
				} 
			}
			
		},
		
		
		
		createSimpleMarker: function(map, arr){
		 
			if(arr.profile_type == "enhanced")
			{
				icon = twp.map.ico_enhanced;
				zindex = Math.round(arr.point.lat()*-100000) + 10000;  
			}
			else if(arr.profile_type == "basic")
			{
				icon = twp.map.ico_basic;
				zindex = Math.round(arr.point.lat()*-100000) - 10000;  
			}
			else if(arr.profile_type == "enhanced")
			{
				icon = twp.map.ico_standard;
				zindex = Math.round(arr.point.lat()*-100000); 	
			}
			else //Default
			{
				icon = twp.map.ico_enhanced;
				zindex = null; 	
			}		
		
			//Prepare Info Window: 
			var infowindow = new google.maps.InfoWindow({
		        content: twp.map.funcGenerateContentString(arr), 
		        options: { noCloseOnClick: "false" }
		    });
				
			var marker = new google.maps.Marker({
				position: arr.point, 
				title: arr.company_name,
				map: this.map, 
				icon: icon, 
				zIndex: zindex
				});
			
			google.maps.event.addListener(marker, 'click', function() {
		      //Remove last window if open: 
		      if (twp.map.active_infowindow) twp.map.active_infowindow.close();
		      
		      infowindow.open(map, marker);
		
					twp.map.active_infowindow = infowindow; 
					
					
				  if(this.map_type === 'search')
					{
					  if(this.last_icon_id > 0) {
					  	document.getElementById("twp_sitelist_" + this.last_icon_id).style.background="#fff";
					  }
					  document.getElementById("twp_sitelist_" + arr.sid).style.background="#fc0";
					} 
		
					this.last_icon_id = arr.sid;	    
		    });
			
			
		
		
			
			return marker; 
		}, 
		
		removeUnwantedPointsFromMap: function(){
			//Remove points from map if they no longer exist in points_downloaded: 
			for(k in twp.map.points_on_map) {
				if(!twp.map.points_downloaded[k])
				{
					console.log(k);
				}
			}
		}, 
		
		
		loadPointsXml: function(){
			
			if(this.map_type === 'survey') 
			{
				twp.map.loadPointsIntoMap(false);
			}
			else
			{
				//Disable Search Button: 
				$('#twp_btnsearch').attr('disabled', 'disabled'); 
				//Raise Activity Indicator: 
				$('#twp_activity_indicator').show(); 
				//Boundary info:
				var bounds = twp.map.map.getBounds();
				
				//Prepare Querystring:
				var getVars = 'survey_permalink=' + survey_permalink + 
											'&keyword=' + escape($('#twp_keyword').val()) + 
											'&location=' + escape($('#twp_location').val()) + 
											'&last_location=' + escape($('#last_location').val()) + 
											'&page=' + this.load_page; 
				if(bounds)
				{
					getVars += "&bounds=" + bounds.toUrlValue(); 
				}
				
				//Write some of this to cookies: 
				$.cookie(twp.map.COOKIE_NAME + '_keyword', escape($('#twp_keyword').val()), twp.map.cookie_options);	
				$.cookie(twp.map.COOKIE_NAME + '_location', escape($('#twp_location').val()), twp.map.cookie_options);	
				$('#last_location').val($('#twp_location').val());
				
				
				$.get('/index.php/map_points_xml/surveySearch?'+getVars, function(data) {
					
					//Clear existing points_downloaded:
					twp.map.points_downloaded = null;
					twp.map.points_downloaded = [];
					if($(data).find('marker'))
						{
					$(data).find('marker').each(function() {
						var marker = this;
						pk = $(marker).attr("sid");
						var lat = parseFloat($(marker).attr("lat"));
						var lng = parseFloat($(marker).attr("lng"));
						var point = new google.maps.LatLng(lat,lng);
		 
						twp.map.points_downloaded[pk] = new Array({
							sid: $(marker).attr("sid"),
							point: point, 
							lat: lat, 
							lng: lng,
							company_name: twp.map.urldecode($(marker).attr("company_name")),
							photo_path: twp.map.urldecode($(marker).attr("photo_path")),
							image: $(marker).attr("image"),
							awards: $(marker).attr("awards"),
							site_address: $(marker).attr("site_address"),
							url: $(marker).attr("url"),
							employee_no: $(marker).attr("employee_no"),
							surveyed_no: $(marker).attr("surveyed_no"),
							sector: $(marker).attr("sector"),
							company_description: twp.map.urldecode($(marker).attr("company_description")),
							profile_type: $(marker).attr("profile_type"),
							permalink: $(marker).attr("permalink"),
							site_score: $(marker).attr("site_score"), 
							logo: $(marker).attr("logo")
						});
					}); 
						}
					twp.map.loadPointsIntoMap(true);
						
						//Disable Indicator: 
						$('#twp_activity_indicator').hide();
						$('#twp_btnsearch').attr('disabled', '');
						
						document.getElementById('twp_feedback').innerHTML=twp.map.generateLoadNextString(this.page, this.total_matches);
					return false; 	 
					});
					 
				}
		}, 
		
		generateLoadNextString: function(page, total)
		{
			var page_end = Math.min(Math.ceil(twp.map.total_matches / twp.map.pagination), 3);
			var str;
			
			if(page < page_end)
			{
				str = "<a href='#' onclick='twp.map.gotoPage(" + (page+1) + ")'>Load next " + twp.map.pagination + " Matches</a> ";
				str = "<input type='submit' name='btnload' value='Load Next " + twp.map.pagination + " Matches' id='twp_btnLoad' onclick='twp.map.gotoPage(" + (page+1) + ");'/>";
				
			}
			else
			{
				str = "&nbsp;"; 
			}
			return str; 
		},

		generatePaginationString: function(page, total)
		{
			
			var page_range = 2; 
			var page_start_record = ((page - 1)* twp.map.pagination) + 1; 
			var page_end_record = page_start_record + (twp.map.pagination -1); 
			var page_end = Math.ceil(total_matches / twp.map.pagination); 
			str = 'Matching ' + total_matches + ' Sites. Showing Records ' + page_start_record + ' to ' + Math.min(page_end_record, total) + ".";
		
			if(total > twp.map.pagination)
			{
				str += " Jump to page "; 
				if(page != 1)
				{
					str += "<a href='#' onclick='twp.map.gotoPage(1)'>&laquo;</a> "; 
				}
				for(page_link = Math.max(1, page-page_range); page_link <= Math.min( (page + page_range), page_end); page_link++)
				{
					if(page === page_link)
					{
						str += "<strong>" + page_link + "</strong> " ;		
					}
					else
					{
						str += "<a href='#' onclick='twp.map.gotoPage(" + page_link + ")'>" + page_link + "</a> " ;
					} 
				}
				if(page != page_end)
				{
					str += "<a href='#' onclick='twp.map.gotoPage(" + page_end + ")'>&raquo;</a>"; 
				}		
			}	
			return str; 
		},

		runNewSearch: function()
		{
			twp.map.replace_points = true; 
			twp.map.load_page = 1; 
			twp.map.loadPointsXml(); 
		},


		gotoPage: function(i)
		{
			twp.map.replace_points = false; 
			twp.map.load_page = i; 
			twp.map.loadPointsXml();
			twp.map.pan_result = true; 
		},

		urldecode: function(encodedString) {
			var output = unescape(encodedString);
			
		  var binVal, thisString;
		  var myregexp = /(%[^%]{2})/;
		  
		
		  while ((match = myregexp.exec(output)) != null
		             && match.length > 1
		             && match[1] != '') {
		    binVal = parseInt(match[1].substr(1),16);
		    thisString = String.fromCharCode(binVal);
		    output = output.replace(match[1], thisString);
		  }
		  return output;
		//return unescape(str.replace('/+/g', ' '));
		}		
	}
}; 

