$(document).ready(function(){

    var browser_is_ie = jQuery.browser.msie;
    var browser_version = jQuery.browser.version;
    var browser_is_supported = true;

    if (browser_is_ie===true) {
        if (browser_version < 7) {
            browser_is_supported = false;
        }
    }


    if (browser_is_supported===true) {
        /***************
         *
         *GLOBAL vars + functions
         *
         **************/
        var map = null;
        if (GBrowserIsCompatible()) {
            map = new GMap2(document.getElementById("tempmap"));
            map.setCenter(new GLatLng(38.6025, -95.677068), 4);
            map.setMapType(G_NORMAL_MAP);
            map.disableScrollWheelZoom();
            map.disableDoubleClickZoom();
            
            var topRight = new GControlPosition(G_ANCHOR_TOP_LEFT, new GSize(10,10));
    
            var ovcontrol = new GSmallMapControl();
            map.addControl(ovcontrol, topRight);
        }
    
        var logo_icon = new GIcon();
        logo_icon.image = "../../assets/images/icons/maplogo.gif";
        logo_icon.shadow = "";
        logo_icon.iconSize = new GSize(130, 28);
        logo_icon.iconAnchor = new GPoint(130, 28);
        
        var markers_array = [];
    
        var logo_marker = new GMarker(new GPoint(-67, 27.5), { icon: logo_icon });
        logo_marker.shadow = "";
        logo_marker.infoShadowAnchor = "";
        
        var mgr = new MarkerManager(map);
    
        markers_array.push(logo_marker);
        
        function setupMarkers() {
            mgr.addMarkers(markers_array, 4);
            mgr.refresh();
        }
        
        setupMarkers();
        
        
        var now = new Date();
        var date = now.format("yyyymmdd");
        
        var zip_codes = [];
        var temp_points = [];
		var hot_dark_color = "#AB3A29";
		var hot_light_color = "#EBCAAF";
		var norm_dark_color = "#3C9410";
		var norm_light_color = "#7CEB45";
		var cold_dark_color = "#2D5699";
		var cold_light_color = "#A1BAE3";		
      
        var chart = $("table#chart");
        var plot = $("#plot");
        var zip_to_add = $("#zipadd").val();



        /***************
         *
         *Clear Table
         *
         **************/
		function clearTable() {
			chart.empty();
			//chart.append("<tr><td>Zip Code: <input type=\"text\" name=\"zipadd\" id=\"zipadd\" maxlength=\"5\" maxsize=\"5\"></tdr><td></td><td><input type=\"submit\" value=\"Plot\" name=\"plot\" id=\"plot\"></td></tr>");
			chart.append("<tr height=\"1\" style=\"background-color: #fff\"><td></td><td></td><td></td></tr>");
			zip_to_add = $("#zipadd").val();
			plot = $("#plot");
			bindPlotButton();
		}

    

        /***************
         *
         *Custom overlay object
         *
         **************/
        function TempBox(latlong, temp, color, op) {
            this.latlong_ = latlong;
            this.temp_ = temp;
            this.color_=color;
            this.op_ = op
        }
        TempBox.prototype = new GOverlay();
        TempBox.prototype.initialize = function(map) {
            var div = document.createElement("div");
            div.style.position = "absolute";         
            div.style.backgroundColor = this.color_;
            
            if (jQuery.browser.msie === true) {
                div.style.filter = 'alpha(opacity=' + this.op_ + ')';
            } else {
                div.style.opacity = "0." + this.op_;
            }
    
            map.getPane(G_MAP_MAP_PANE).appendChild(div);
            
            this.map_ = map;
            this.div_ = div;
        }
        
        TempBox.prototype.remove = function() {
            this.div_.parentNode.removeChild(this.div_);
        }
        
        TempBox.prototype.copy = function() {
            return new Rectangle(this.latlong_, this.temp_, this.op_);
        }
        
        TempBox.prototype.redraw = function(force) {
            if (!force) return;
        
            var c1 = this.map_.fromLatLngToDivPixel(this.latlong_.getSouthWest());
            var c2 = this.map_.fromLatLngToDivPixel(this.latlong_.getNorthEast());
        
            this.div_.style.height = Math.abs(c2.y - c1.y) + "px";
            this.div_.style.width = Math.abs(c2.x - c1.x) + "px";
            this.div_.style.left = (Math.min(c2.x, c1.x)) + "px";
            this.div_.style.top = (Math.min(c2.y, c1.y)) + "px";
        }
    
    

        /***************
         *
         *Temp Node Map
         *
         **************/
        function TempMarker(latlong, temp, zip, dark_color, light_color) {
            this.latlong_ = latlong;
            this.temp_ = temp;
            this.dark_color_=dark_color;
            this.light_color_ = light_color;
            this.zip_=zip;
        }
        TempMarker.prototype = new GOverlay();
        TempMarker.prototype.initialize = function(map) {
            var div = document.createElement("div");
        
            div.style.position = "absolute";
            div.style.borderLeft = "2px solid " + this.dark_color_;
            div.style.height = "40px";
            div.style.width = "40px";
            
            var para = document.createElement("p")
            para.style.position = "absolute";
            para.style.margin = "0";
            para.style.top = "2px";
            para.style.left = "0";
            para.style.backgroundColor = this.light_color_;
            para.style.border = "1px solid " + this.dark_color_;
            para.style.borderLeft = "0";
            
            var span1 = document.createElement("span");
            (span1.setAttribute("class","mzip")) ? (span1.setAttribute("class","mzip")) : (span1.setAttribute("className","mzip"));
            span1.appendChild(document.createTextNode(this.zip_));
            
            var span2 = document.createElement("span");
            (span2.setAttribute("class","mtmp")) ? (span2.setAttribute("class","mtmp")) : (span2.setAttribute("className","mtmp"));
            span2.style.color = this.dark_color_;
            span2.appendChild(document.createTextNode(this.temp_+"\u00B0")); 
            
            para.appendChild(span1);
            para.appendChild(span2);
            
            div.appendChild(para);           
            
            map.getPane(G_MAP_MAP_PANE).appendChild(div);
            
            this.map_ = map;
            this.div_ = div;
        }
        
        TempMarker.prototype.remove = function() {
            this.div_.parentNode.removeChild(this.div_);
        }
        
        TempMarker.prototype.copy = function() {
            return new Rectangle(this.latlong_, this.temp_, this.color_);
        }
        
        TempMarker.prototype.redraw = function(force) {
            if (!force) return;
        
            var c1 = this.map_.fromLatLngToDivPixel(this.latlong_.getSouthWest());
            var c2 = this.map_.fromLatLngToDivPixel(this.latlong_.getNorthEast());

            this.div_.style.left = (Math.min(c2.x, c1.x)) + "px";
            this.div_.style.top = (Math.min(c2.y, c1.y)-40) + "px";
        }




        /***************
         *
         *Ajax Loader
         *
         **************/
        var loader = $("ul#tempmapmenu > .thinking");
        function ShowLoader() {
            loader.show();
        }
        function HideLoader() {
            loader.hide();
        }



        /***************
         *
         *Check array membership
         *
         **************/
        function checkArrayValue(arr, val) {
			var ret = false;
			for (var i=0; i<arr.length; i++) {
				if (arr[i]==val) {
					ret = true;
					break;
				}
			}
			return ret;			
        }  
    
    
    
        /***************
         *
         *Set points on map. Takes JSON object.
         *
         **************/
        function SetPointsOnMap(p) {
        

            var htemp = $("#htemp").val();
            var ltemp = $("#ltemp").val();
    
            map.clearOverlays();
            
            for (var i=0; i<p.points.length; i++) {
    
                if (p.points[i].ht > htemp) {
                
                    (function(){
                        var this_point = p.points[i];
    
                        var diff = Math.abs(this_point.ht - htemp);
                        var color = "#990000";
 
                        var op = 10 + Math.floor(Math.min(diff, 20)/20*50);

                        var rectBounds = new GLatLngBounds(
                            new GLatLng(this_point.lat-(this_point.dlat/2), this_point.lng-(this_point.dlng/2)),
                            new GLatLng(this_point.lat+(this_point.dlat/2), this_point.lng+(this_point.dlng/2))
                        );
                        
                        map.addOverlay(new TempBox(rectBounds, this_point.ht, color, op));
                        
                    })();
                    
                } else if (p.points[i].lt < ltemp) {
                
                    (function(){
                        var this_point = p.points[i];
    
                        var diff = Math.abs(this_point.lt - ltemp);
                        var color = "#244C60";
 
                        var op = 10 + Math.floor(Math.min(diff, 20)/20*50);

                        var rectBounds = new GLatLngBounds(
                            new GLatLng(this_point.lat-(this_point.dlat/2), this_point.lng-(this_point.dlng/2)),
                            new GLatLng(this_point.lat+(this_point.dlat/2), this_point.lng+(this_point.dlng/2))
                        );
                        
                        map.addOverlay(new TempBox(rectBounds, this_point.lt, color, op));
                        
                    })();					
                }               
                
            }
            setupMarkers();
            
            populateTempMapAndPointList();
        }
    



        /***************
         *
         *Add Temp Node to Map.
         *
         **************/
         function addTempPointOnMap(info_object, focus) {

			var light_col;
			var dark_col;

			var set_temp = $("#htemp").val();
			var set_low_temp = $("#ltemp").val();
			var temp_to_show;
			
			if (info_object.hightemp > set_temp) {
				dark_col = hot_dark_color;
				light_col = hot_light_color;
				temp_to_show = info_object.hightemp;
			} else if (info_object.lowtemp < set_low_temp){
				dark_col = cold_dark_color;	
				light_col = cold_light_color;
				temp_to_show = info_object.lowtemp;			
			} else {
				dark_col = norm_dark_color;	
				light_col = norm_light_color;
				temp_to_show = info_object.hightemp;
			}
         
			var rectBounds = new GLatLngBounds(
				new GLatLng(info_object.lat, info_object.lng),
				new GLatLng(info_object.lat, info_object.lat)
			);
			
			map.addOverlay(new TempMarker(rectBounds, temp_to_show, info_object.zip, dark_col, light_col));
			
			if (focus == true) {
				map.panTo(new GLatLng(info_object.lat, info_object.lng));
			}
			$("#zipadd").val("");
			$("#zipadd").focus();
         }




        /***************
         *
         *Add Temp to list
         *
         **************/
         function addTempPointToList(info_object) {
         
				var set_temp = $("#htemp").val();
				var set_low_temp = $("#ltemp").val();				
				
				//Class for list
				//var classs;
				var ship_stat;
				
				//Temp colors
				var light_col;
				var dark_col;
				var temp_to_show;
				
				//97201
				//alert("info_object.lowtemp: " + info_object.lowtemp);
				//alert("set_low_temp: " + set_low_temp);
				
				if (info_object.hightemp > set_temp) {
					ship_stat = "No Ship";
					dark_col = hot_dark_color;
					light_col = hot_light_color;
					temp_to_show = info_object.hightemp;
				} else if (info_object.lowtemp < set_low_temp){
					ship_stat = "No Ship";
					dark_col = cold_dark_color;	
					light_col = cold_light_color;				
					temp_to_show = info_object.lowtemp;
				} else {
					ship_stat = "Ship";
					dark_col = norm_dark_color;	
					light_col = norm_light_color;
					temp_to_show = info_object.hightemp;
				}				

				var node = [];
				node.push("<tr><td>");
				node.push(info_object.zip);
				node.push("</td><td>");
				node.push(temp_to_show);
				node.push("\u00B0</td><td><span style=\"color:");
				node.push(dark_col);
				node.push("\">");
				node.push(ship_stat);
				node.push("</span></td></tr>");

				chart.append(node.join(""));
			
         }




        /***************
         *
         *Populate Temp Node List And Map
         *
         **************/
		function populateTempMapAndPointList() {
			//Clear list
			clearTable();
		
			for (var i=0; i<temp_points.length; i++) {
				//Pop list
				addTempPointToList(temp_points[i]);
				
				//Add to map.
				addTempPointOnMap(temp_points[i]);
			}
		}




        /***************
         *
         *Populate Temp Node List Only
         *
         **************/
		function populateTempMapToList() {
			//Clear list
			clearTable();
			
			for (var i=0; i<temp_points.length; i++) {
				//Pop list
				addTempPointToList(temp_points[i]);
			}
		}





        /***************
         *
         *Populate Temp Node Map Only
         *
         **************/
		function populateTempMap() {
			//Clear list
			clearTable();
			
			for (var i=0; i<temp_points.length; i++) {
				//Pop list
				addTempPointOnMap(temp_points[i]);
			}
		}
         
    
    
    
    
        /***************
         *
         *Takes care of AJAX call.
         *
         **************/
        function doAjaxCallAndUpdatePoints(zisdate) {
            $.ajax({
                url: "call/call.aspx",
                data: "date=" + zisdate,
                cache: false,
                beforeSend: ShowLoader,
                success: function(data){
                    var data_points = eval(data);
                    SetPointsOnMap(data_points);
                },
                complete: HideLoader
            });
        }
        
        
        
        
        
        
		function doTempNodeAjaxCall() {
 			if ($("#zipadd").val().match(/^\d{5}$/)) {

				ShowLoader();
				$.get("call/zip.aspx", {zip:$("#zipadd").val(),date:date },
					function(data) {
						var zip_info = eval(data);
						if ((!data) || zip_info.zip == "") {
							$("#notfound").text("Sorry, but no data was found for zip code " + $("#zipadd").val());
							$("#zipadd").val("");
							$("#zipadd").focus();								
							return false;
						} else {
							$("#notfound").text("");
						}

						if (checkArrayValue(zip_codes, zip_info.zip)) {
							$("#zipadd").val("");
							$("#zipadd").focus();							
							return false;
						} else {
							zip_codes.push(zip_info.zip);
						}		
						
						temp_points.unshift(zip_info);
						populateTempMapToList();
						addTempPointOnMap(zip_info, true);
					});
				HideLoader();
				$("#zipadd").focus();
			} else {
				$("#notfound").text("Please enter a valid 5-digit zip code.");
			}

		}

          
   
        
        /***************
         *
         *Bind Events
         *
         **************/
        $("#htemp").change(function() {
            doAjaxCallAndUpdatePoints(date);
            return false;
        })

        $("#ltemp").change(function() {
            doAjaxCallAndUpdatePoints(date);
            return false;
        })
        
        $("#htemp").val(85);
        $("#ltemp").val(35);
        
        var tabs = $("ul#tempmapmenu > li > a");
        tabs.bind("click", function(e) {
            tabs.removeClass("this");
            
            var d = date;
            date = $(this).attr("class");
            if (d!=date) {
				temp_points = [];
				zip_codes = [];
            }
            
            doAjaxCallAndUpdatePoints(date);
    
            $(this).addClass("this");
            return false;
        });
        
        doAjaxCallAndUpdatePoints(date);
         
        function bindPlotButton() {
			plot.bind("click", function(e) {
				doTempNodeAjaxCall();
				return false;
			});
        }
        
        bindPlotButton();

        
		$("#zipadd").bind("keydown", function(e) {
			e = e || window.event;
			if(e.keyCode == 13){
				doTempNodeAjaxCall();
				return false;
			}
		});
        
    }//((browser_is_ie===true) && (browser_version < 7))

});
