/*---------------------------------------------------------\
|                              TWP                          |
|
|----------------------------------------------------------*/

jQuery.noConflict();  
twp_jQuery = jQuery; 


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)
		{
			jQuery('#twp_counter_' + digit_number).css('background-position','0px -' + 47*value + 'px');
		}

  }, 

	psw: {
		photos: [], 
		cache: [],
		
		
		loadpic: function(full_url, thumb_url, caption) {
	  		twp.psw.photos.push(new Array(full_url, thumb_url, caption));
		},  
		
		switchpic: function (a, frame) {
			clicked_obj = jQuery(a);
			clicked_obj.closest('img').addClass('selected');
			clicked_obj.closest('img').siblings().removeClass('selected');

			promote = a.id;
			promote = promote.replace('twp_photo_', '');

			jQuery("#" + frame).hide(); 
			
			jQuery("#" + frame).attr({
				src: twp.psw.photos[promote][0], 
				alt: twp.psw.photos[promote][2],
				title: twp.psw.photos[promote][2]
			});
			
			jQuery("#" + frame).fadeTo("fast", 1);
			//Force the frame to display (Austin)
			jQuery("#" + frame).css("display", "inline");
			
		}, 
		
		preloadpics: function() {
		  var args_len = twp.psw.photos.length;
			for (var i = args_len; i--;) {
	      var cacheImage = document.createElement('img');
	      cacheImage.src = this.photos[i][0];
	      twp.psw.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/profiles/tw_basic_image.png', 
			      new google.maps.Size(13,33),
			      new google.maps.Point(0,0),
			      new google.maps.Point(7, 33)
			);
			
			this.sdw_basic = new google.maps.MarkerImage('/images/icons/map/profiles/tw_basic_shadow.png',
				      new google.maps.Size(37, 32),
				      new google.maps.Point(0,0),
				      new google.maps.Point(7, 32));
			
			this.shp_basic = {
				      coord: [1, 1, 1, 20, 18, 20, 18 , 1],
				      type: 'poly'
			};
			
			
			//Standard Profile
			this.ico_standard = new google.maps.MarkerImage(
				'/images/icons/map/profiles/tw_normal_image.png', 
			      new google.maps.Size(18,44),
			      new google.maps.Point(0,0),
			      new google.maps.Point(9,44)
			);
			
			this.sdw_standard = new google.maps.MarkerImage('/images/icons/map/profiles/tw_normal_shadow.png',
					new google.maps.Size(40, 44),
					new google.maps.Point(0,0),
					new google.maps.Point(9, 44));
					
			this.shp_standard = {
					  coord: [1,6, 17,6, 17,31, 8,27, 1, 31],
				      type: 'poly' };			
		
					
			//Enhanced Profile
			this.ico_enhanced = new google.maps.MarkerImage(
					'/images/icons/map/profiles/tw_enhanced_image.png', 
				      new google.maps.Size(18,44),
				      new google.maps.Point(0,0),
				      new google.maps.Point(9, 44)
				);
			
			
			this.sdw_enhanced = new google.maps.MarkerImage('/images/icons/map/profiles/tw_enhanced_shadow.png',
				new google.maps.Size(51, 56),
				new google.maps.Point(0,0),
				new google.maps.Point(9, 44));
				
			this.shp_enhanced = {
					  coord: [1,6, 17,6, 17,31, 8,27, 1, 31],
					  type: 'poly' };
				      
			//Publisher
			this.ico_publisher = new google.maps.MarkerImage(
					'/images/icons/map/publisher_image.png', 
				      new google.maps.Size(35,56),
				      new google.maps.Point(0,0),
				      new google.maps.Point(16, 56)
				);
			
			
			this.sdw_publisher = new google.maps.MarkerImage('/images/icons/map/publisher_shadow.png',
				new google.maps.Size(63, 56),
				new google.maps.Point(0,0),
				new google.maps.Point(16, 56));
				
			this.shp_publisher = {
					  coord: [0,8, 31, 31],
					  type: 'rect' };
				      			
						
		
			jQuery.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("twp_map_div"), 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);
			}
			
			//Limit Zoom on National Maps
			 
			if(this.map_type === 'nominations' | this.map_type === 'surveys' | this.map_type === 'publishers' )
			{
			google.maps.event.addListener(this.map, 'zoom_changed', function() {
				  if (twp.map.map.getZoom() > 8) {
					  twp.map.map.setZoom(8);
				  }
				  if (twp.map.map.getZoom() < 4) {
					  twp.map.map.setZoom(4);
				  }
				});		
			}
			
			// Select field contents
			jQuery("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){
			if(arr.profile_type == "enhanced")
			{
				cclass=' class="twp_highlight"'; 
			}
			else
			{
				cclass = ''; 
			}
			
			return '<tr id="twp_sitelist_' + arr.sid + '" ' + cclass + '>' +
			'<td class="twp_company_logo"><a href="/index.php/company/' + arr.permalink + '"><img src="' + arr.logo + '" align="left" width="150px" height="50px" /></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; 
				
				case "nominations":
				case "publishers":
				case "surveys":
					var string = "<div class='twp_ginfowindow_dis'>" +
								 
								 "<p>" + arr.html_caption + "</p>"+  
								 "</div>";
				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) 
			{

				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')
					{
						jQuery('#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 twp.map.points_downloaded)
			{

				//console.log("Adding " + k); 
				if(!twp.map.points_on_map[k])
				{
 				
					twp.map.points_on_map[k] = this.createSimpleMarker(this.map, twp.map.points_downloaded[k][0]);
					this.count_points_on_map = this.count_points_on_map +1;
					
					markerBounds.extend(new google.maps.LatLng(twp.map.points_downloaded[k][0].lat, twp.map.points_downloaded[k][0].lng)); 
					if(this.map_type === 'search')
					{
						//Add point to list:
						jQuery('tr#twp_sitelist_' + this.last_list_id).after(twp.map.funcGenerateListString(twp.map.points_downloaded[k][0]));
					}
					this.last_list_id = k;
				}
				else if(!(isNaN(k)))
				{
					//Do not add new point (already on map), but do extend bounds: 
 					
					markerBounds.extend(new google.maps.LatLng(twp.map.points_downloaded[k][0].lat, twp.map.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;
				shadow = twp.map.sdw_enhanced; 
				shape = twp.map.shp_enhanced;
				zindex = Math.round(arr.point.lat()*-100000) + 10000;  
			}
			else if(arr.profile_type == "basic")
			{
				
				icon = twp.map.ico_standard;
				shadow = twp.map.sdw_standard; 
				shape = twp.map.shp_standard;
				zindex = Math.round(arr.point.lat()*-100000) - 10000;  
				  
			}
			else if(arr.profile_type == "normal")
			{
				icon = twp.map.ico_standard;
				shadow = twp.map.sdw_standard; 
				shape = twp.map.shp_standard; 				
				zindex = Math.round(arr.point.lat()*-100000); 	
			}
			else if(arr.profile_type == "dallas_top100")
			{

				icon = twp.map.ico_standard;
				shadow = twp.map.sdw_standard; 
				shape = twp.map.shp_standard; 				
				zindex = Math.round(arr.point.lat()*-100000) + 10000;	
				
			}
			else if(arr.profile_type == "dallas_national")
			{
				zindex = Math.round(arr.point.lat()*-100000); 
				icon = twp.map.ico_enhanced;
				shadow = twp.map.sdw_enhanced; 
				shape = twp.map.shp_enhanced;
			}	
			else if(arr.profile_type == "publisher")
			{
				icon = twp.map.ico_publisher;
				shadow = twp.map.sdw_publisher; 
				shape = twp.map.shp_publisher; 				
				zindex = null; 	
			}
			else if((arr.profile_type == "survey") | (arr.profile_type == "nomination"))
			{
				icon = twp.map.ico_standard;
				shadow = twp.map.sdw_standard; 
				shape = twp.map.shp_standard;
				zindex = null; 
			}
			
			
			else //Default
			{
				icon = twp.map.ico_standard;
				shadow = twp.map.sdw_standard; 
				shape = twp.map.shp_standard;
				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,
				shadow: shadow, 
				shape: shape, 
				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: 
				jQuery('#twp_btnsearch').attr('disabled', 'disabled'); 
				//Raise Activity Indicator: 
				jQuery('#twp_activity_indicator').show(); 
				//Boundary info:
				var bounds = twp.map.map.getBounds();
				
				//Prepare Querystring:
				var getVars = 'survey_permalink=' + survey_permalink + 
											'&keyword=' + escape(jQuery('#twp_keyword').val()) + 
											'&location=' + escape(jQuery('#twp_location').val()) + 
											'&last_location=' + escape(jQuery('#last_location').val()) + 
											'&page=' + this.load_page; 
				if(bounds)
				{
					getVars += "&bounds=" + bounds.toUrlValue(); 
				}
				
				//Write some of this to cookies: 
				jQuery.cookie(twp.map.COOKIE_NAME + '_keyword', escape(jQuery('#twp_keyword').val()), twp.map.cookie_options);	
				jQuery.cookie(twp.map.COOKIE_NAME + '_location', escape(jQuery('#twp_location').val()), twp.map.cookie_options);	
				jQuery('#last_location').val(jQuery('#twp_location').val());
				
				
				jQuery.get('/index.php/map_points_xml/surveySearch?'+getVars, function(data) {
					
					//Clear existing points_downloaded:
					twp.map.points_downloaded = null;
					twp.map.points_downloaded = [];
					if(jQuery(data).find('marker'))
						{
					jQuery(data).find('marker').each(function() {
						var marker = this;
						pk = jQuery(marker).attr("sid");
						var lat = parseFloat(jQuery(marker).attr("lat"));
						var lng = parseFloat(jQuery(marker).attr("lng"));
						var point = new google.maps.LatLng(lat,lng);
		 
						twp.map.points_downloaded[pk] = new Array({
							sid: jQuery(marker).attr("sid"),
							point: point, 
							lat: lat, 
							lng: lng,
							company_name: twp.map.urldecode(jQuery(marker).attr("company_name")),
//							photo_path: twp.map.urldecode(jQuery(marker).attr("photo_path")),
							image: jQuery(marker).attr("image"),
							awards: jQuery(marker).attr("awards"),
							site_address: jQuery(marker).attr("site_address"),
							url: jQuery(marker).attr("url"),
							employee_no: jQuery(marker).attr("employee_no"),
							surveyed_no: jQuery(marker).attr("surveyed_no"),
							sector: jQuery(marker).attr("sector"),
							company_description: twp.map.urldecode(jQuery(marker).attr("company_description")),
							profile_type: jQuery(marker).attr("profile_type"),
							permalink: jQuery(marker).attr("permalink"),
							site_score: jQuery(marker).attr("site_score"), 
							logo: jQuery(marker).attr("logo"), 
							html_caption: jQuery(marker).attr("html_caption")
						});
					}); 
						}
					twp.map.loadPointsIntoMap(true);
						
						//Disable Indicator: 
						jQuery('#twp_activity_indicator').hide();
						jQuery('#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', ' '));
		}		
	}
}; 

