/*global $$, GLatLng, GIcon, GEvent, GMarker, GPoint, GSize, window, Ajax, GBrowserIsCompatible, GLargeMapControl, GMap2, GScaleControl, G_GEO_BAD_REQUEST, G_GEO_MISSING_ADDRESS, G_GEO_MISSING_QUERY, G_GEO_SERVER_ERROR, G_GEO_SUCCESS, G_GEO_UNAVAILABLE_ADDRESS, G_GEO_UNKNOWN_ADDRESS, G_GEO_UNKNOWN_DIRECTIONS,  swfobject, $, G_GEO_BAD_KEY, G_GEO_TOO_MANY_QUERIES, document, GClientGeocoder, locations */


var map;

var icons = [];

var sideshow = {
    current: 0,
    slides: [],
    start: function () {
        sideshow.slides = $$("#sideshow li");
        
        for (var i=0; i < sideshow.slides.length; i++) {
            if (i !== 0) {
                sideshow.slides[i].hide();
            }
        }
        
        sideshow.next();
        
    },
    next: function () {
        for (var i=0; i < sideshow.slides.length; i++) {
            if (i === sideshow.current) {
                sideshow.slides[i].fade();
                
                if (sideshow.slides[i + 1]) {
                    sideshow.slides[i + 1].appear();
                }
                else {
                    sideshow.slides[0].appear();
                }
            }
        }
    
        if (sideshow.current < (sideshow.slides.length - 1)) {
            sideshow.current = sideshow.current + 1;
        }
        else {
            sideshow.current = 0;
        }
        
        window.setTimeout(sideshow.next, 3000);
        
    }
};


var app = {
	iconCounter: 0,
    createMarker: function (location) {
    	if (app.iconCounter > 4) {
    		app.iconCounter = 0;
    	}
    
        location.point = new GLatLng(location.lat, location.long); 

        location.marker = new GMarker(location.point, { zIndexProcess: app.mZindex, icon: icons[app.iconCounter], title: location.name});

        map.addOverlay(location.marker);

        GEvent.addListener(location.marker, "click", function () {
            app.showInfo(location);
            pageTracker._trackPageview("/showinfo?name=" + location.name + "&lat=" + location.lat + "&long=" + location.long);
        });
                
        app.iconCounter = app.iconCounter + 1;
    },
    
    get: function (variable) {
        var query, varArray, i, pair;
        
        query = window.location.search.substring(1);
        varArray = query.split("&");
        
        for (i = 0; i < varArray.length; i++) {
        
            pair = varArray[i].split("=");
        
            if (pair[0] === variable) {
                return pair[1];
            }
        }
        
        return false;
    },
    
    getPoints: function () {
        // Create unique URL to avoid caching issues
        var jsonFile, i, request;
        
        jsonFile = "_api/locations.php?" + new Date().getTime();
        
        request = new Ajax.Request(jsonFile, {
            onSuccess: function (transport) {
                eval(transport.responseText);

                // Loop through the JSON locations and create markers
                for (i = 0; i < locations.length; i++) {
                    app.createMarker(locations[i]);
                }
            }
        });
    },
            
    load: function () {
        sideshow.start();
        
        // get the ticker flash
        swfobject.embedSWF("_swf/ezticker_nest_0808_v1.swf", "savings", "303", "156", "8.0.0", "/_js/swfobject/expressInstall.swf", '', {wmode: "transparent"} );
        
        var baseIcon = new GIcon();
		baseIcon.iconSize = new GSize(47, 26);
		baseIcon.iconAnchor = new GPoint(15, 25);
		baseIcon.infoWindowAnchor = baseIcon.iconAnchor;
		//baseIcon.image = "http://cdn0.redirectstats.com/cdn/markiv/ez_map-icon_02.png";
		baseIcon.image = "_img/ez_map-icon_02.png";
		icons.push(baseIcon);
		
		//var baseIcon = new GIcon();
		/*baseIcon.iconSize = new GSize(47, 26);
		baseIcon.iconAnchor = new GPoint(15, 25);
		baseIcon.infoWindowAnchor = baseIcon.iconAnchor;*/
		//baseIcon.image = "http://cdn1.redirectstats.com/cdn/markiv/ez_map-icon_02.png";
		baseIcon.image = "_img/ez_map-icon_02.png";
		icons.push(baseIcon);
		
		//baseIcon = new GIcon();
		/*baseIcon.iconSize = new GSize(47, 26);
		baseIcon.iconAnchor = new GPoint(15, 25);
		baseIcon.infoWindowAnchor = baseIcon.iconAnchor;*/
		//baseIcon.image = "http://cdn2.redirectstats.com/cdn/markiv/ez_map-icon_02.png";
		baseIcon.image = "_img/ez_map-icon_02.png";
		icons.push(baseIcon);
		
		//baseIcon = new GIcon();
		/*baseIcon.iconSize = new GSize(47, 26);
		baseIcon.iconAnchor = new GPoint(15, 25);
		baseIcon.infoWindowAnchor = baseIcon.iconAnchor;*/
		//baseIcon.image = "http://cdn3.redirectstats.com/cdn/markiv/ez_map-icon_02.png";
		baseIcon.image = "_img/ez_map-icon_02.png";
		icons.push(baseIcon);
		
		//baseIcon = new GIcon();
		/*baseIcon.iconSize = new GSize(47, 26);
		baseIcon.iconAnchor = new GPoint(15, 25);
		baseIcon.infoWindowAnchor = baseIcon.iconAnchor;*/
		//baseIcon.image = "http://cdn4.redirectstats.com/cdn/markiv/ez_map-icon_02.png";
		baseIcon.image = "_img/ez_map-icon_02.png";
		icons.push(baseIcon);
        
        // Check if the browser can handle google maps, if so setup our map
        if (GBrowserIsCompatible()) {
            map = new GMap2($("map"));

            map.addControl(new GLargeMapControl());  //Add small zoom mapdir control
            map.addControl(new GScaleControl());     //Add mapdir Scale   
            map.enableDoubleClickZoom();             //Enable a Double click zoom in and out
            map.enableContinuousZoom();
            
            // Is this a search?
            if (app.get("saddr")) {
                
                app.getPoints();
                app.search(app.get("saddr"), 50);
            }
            else {
                // this isn't a search, auto center
                new Ajax.Request("_api/getstate.php", {
                    onSuccess: function (transport) {
                        
                        switch (transport.responseText) {
                        	case "IN":
                        		map.setCenter(new GLatLng(41.716343,-86.187621), 10);
                        	break;
                        	case "NY":
                        		map.setCenter(new GLatLng(40.755061,-73.991364), 12);
                        	break;
                        	case "NJ":
                        		map.setCenter(new GLatLng(40.476707,-74.408264), 10);
                        	break;
                        	case "UT":
                        	default:
                        		map.setCenter(new GLatLng(40.678063, -73.958898), 12);
                        	break;
                        }
                        //map.setCenter(new GLatLng(autolocate.lat, autolocate.long), 13);
                        //app.getPoints();
                    }
                });
                
                
                app.getPoints();
            }
            
            // Get the user's state
             new Ajax.Request("_api/getstate.php", {
                    onSuccess: function (transport) {
                        map.state = transport.responseText;
                    }
                });
            
        }
    },
    
    mapError: function (errCode) {
        var errMsg;
        switch (errCode) {
            case G_GEO_SUCCESS:
                errMsg = "Success";  //200
                break;
            case G_GEO_BAD_REQUEST:
                errMsg = "A directions request could not be successfully parsed."; //400
                break;
            case G_GEO_SERVER_ERROR:
                errMsg = "Server error: The geocoding request could not be successfully processed.";  //500 
                break;
            case G_GEO_MISSING_QUERY:
                errMsg = "No query was specified in the input."; //601
                break;
            case G_GEO_MISSING_ADDRESS:
                errMsg = "Missing Address: The address was either missing or had no value."; //601
                break;
            case G_GEO_UNKNOWN_ADDRESS:
                errMsg = "Unknown Address:  No corresponding geographic location could be found for the specified address."; // 602
                break;
            case G_GEO_UNAVAILABLE_ADDRESS:
                errMsg = "Unavailable Address:  The geocode for the given address cannot be returned due to legal or contractual reasons."; //603
                break;
            case G_GEO_UNKNOWN_DIRECTIONS:
                errMsg = "The GDirections object could not compute directions between the points."; //604
                break;
            case G_GEO_BAD_KEY:
                errMsg = "Bad Key: The API key is either invalid or does not match the domain for which it was given."; //610
                break;
            case G_GEO_TOO_MANY_QUERIES:
                errMsg = "Too Many Queries: The daily geocoding quota for this site has been exceeded."; //620
                break;
            default:
                errMsg = "Code: " + errCode + ".";
                break;
        }
        
        return errMsg;
    },
    
    mzIndex: 60000,
    
    search: function (address) {
        var leftNavInfo = "";
        var reasonText = null; 

        if (!address) {
            window.alert("Please enter an Address");
            document.forms['mapnav'].saddr.focus;
        }
        else {

            var geocoder = new GClientGeocoder();
    
            geocoder.getLocations(address, function (geoLatLng) {
                if ((geoLatLng) && (geoLatLng.Status.code === 200)) {
                    var i;
                    
                    var place = geoLatLng.Placemark[0];
                    startAddrPoint = new GLatLng(place.Point.coordinates[1],
                    place.Point.coordinates[0]);
                    formattedStartAddr= place.address;
                    
                    var tmpPoint=null;
                    var tmpDistance=null;
                    var x=0;
                    // find the ezpotg location that is closest to the starting address
                    for (i = 0; i < locations.length; i++) {
                    
                    var point = new GLatLng(locations[i].lat, locations[i].long);
                    
                    var metersFromStart = startAddrPoint.distanceFrom(point);
                    
                    locations[i].milesFromStart =  Math.round((metersFromStart * 0.000621371192) * 100)/100 ;
                    
                      if (i === 0) {
                        tmpPoint = point;
                        tmpDistance = metersFromStart;
                      } 
                      else {
                        if (metersFromStart < tmpDistance) {
                          tmpPoint = point;
                          tmpDistance = metersFromStart;
                          x = i;
                          
                        }
                      } // end if i==0
                    } // end of for
                    
                    
                    if (locations[x].milesFromStart > 50) {
                    	//styled examples use the window factory for a shared set of behavior  
						var window_factory = function(container,options){  
						 var window_header = new Element('div',{  
							 className: 'window_header'  
						 });  
						 var window_title = new Element('div',{  
							 className: 'window_title'  
						 });  
						 var window_close = new Element('div',{  
							 className: 'window_close'  
						 });  
						 
						 
						 var window_contents = "<div class='window_contents'>There are no E-ZPass On the Go Retail Location near you.";
						 
						 if (map.state == "NJ") {
						 	window_contents = window_contents + " <a href='http://www.ezpassnj.com/static/signup/index.shtml'>Click here to purchase a tag online</a>.</div>";
						 }
						 else if (map.state == "NY") {
						 	window_contents = window_contents + " <a href='http://ezpassny.com/static/signup/ind_plans.html'>Click here to purchase a tag online</a>.</div>";
						 }
						 else if (map.state == "IN") {
						 	window_contents = window_contents + " <a href='https://www.getizoom.com/index.jsp'>Click here to purchase a tag online</a>.</div>";
						 }
						 else if (map.state == "RI") {
						 	window_contents = window_contents + " <a href='https://www.ezpassritba.com/'>Click here to purchase a tag online</a>.</div>";
						 }
						 else {
						 	window_contents = window_contents + " <a href='http://ezpassonthego.com/links-to-more-iag-members.php'>Click here to purchase a tag online</a>.</div>";
						 }


						 var w = new Control.Window(container,Object.extend({  
							 className: 'window',  
							 closeOnClick: window_close,  
							 draggable: window_header,  
							 insertRemoteContentAt: window_contents,  
							 afterOpen: function(){  
								 window_title.update("E-ZPass")  
							 }  
						 },options || {}));  
						 w.container.insert(window_header);  
						 window_header.insert(window_title);  
						 window_header.insert(window_close);  
						 w.container.insert(window_contents);  
						 return w;  
					 };  
					   
					 var styled_window_one = window_factory($('styled_window_one'));  
					 styled_window_one.open();
                    }
                  	app.showInfo(locations[x]);
                    app.showSorted();
                    
                    // Call google analytics
                    pageTracker._trackPageview("/search?saddr=" + address);
                	                      
                                        
                } 
                else {
                    
                    var errMsg = app.mapError(geoLatLng.Status.code);
                    window.alert("We were unable to locate '" +address+ "'.\n\n" +errMsg+"\n\nPlease check and re-enter the address.");
                }
            });
        }
    }, 
    
    showInfo: function (location) {            
        
        if (map.getZoom() !== 13) {
        	map.setZoom(13);
        }
                        
		map.panSpeed= 5;
		map.animatePan = true;
		map.panTo(new GLatLng(location.lat + 1,location.long +1), false);
        
        var tab1 = "<div id='tab1'>" +
		"<p><strong>" + location.name + "</strong>" +
		"<br />" + location.address + "<br /> " + location.city + ", " + location.state + ", " + location.zip;

		if(location.phone) {
			tab1 = tab1 + "<br />"  + location.phone;
		}
	
		tab1 = tab1  + "</p></div>";
        
        //open info window
        location.marker.openInfoWindowHtml(tab1);

    },
    
    showSortedInfo: function (i) {
            app.showInfo(app.sorted[i]);
    },
    showSorted: function () {
        app.sorted = locations.objSort("milesFromStart");
        
        var sortedLocations = "";
        for (var i=0; i < 10; i++) {
        
        sortedLocations = sortedLocations+ "<p><strong><a href='#' onClick='app.showSortedInfo("+i+"); return false;'>" + app.sorted[i].name + "</a></strong>" +
                                
                                "<br />" + app.sorted[i].address + "<br /> " + app.sorted[i].city + ", " + app.sorted[i].state + ", " + app.sorted[i].zip + "<br />";
                                
                                
		if(app.sorted[i].phone) {
			sortedLocations = sortedLocations + app.sorted[i].phone + "<br />";
		}
                                
                                sortedLocations = sortedLocations + app.sorted[i].milesFromStart  + " Miles Away <br />" + "<a href='http://maps.google.com/maps?f=d&saddr=" + document.forms['mapnav'].saddr.value +"&daddr=" + 

                                app.sorted[i].name +
                                "%40"+  app.sorted[i].lat+"," + 
                                app.sorted[i].long 
                                +"' target='blank'>Get Directions</a>" +
                            "</p>";            
        }
        
        $("directions").innerHTML = sortedLocations;
    },
    
    startAddress: "",
    
    unload: function () {
        GUnload();
    }
};

/*
objSort v 1.1
copyright 2006 Thomas Frank

This program is free software under the terms of the 
GNU General Public License version 2 as published by the Free 
Software Foundation. It is distributed without any warranty.
*/

tfObjSort={
    init:function (){
        Array.prototype.objSort=function (){
            tfObjSort.setThings(this);
            var a=arguments;
            var x=tfObjSort;
            x.a=[];x.d=[];
            for(var i=0;i<a.length;i++){
                if(typeof a[i]==="string"){x.a.push(a[i]);x.d.push(1)};
                if(a[i]===-1){x.d[x.d.length-1]=-1}
            }
            return this.sort(tfObjSort.sorter);
        };
        Array.prototype.strSort=function (){
            tfObjSort.setThings(this);
            return this.sort(tfObjSort.charSorter)
        }
    },
    sorter:function (x,y){
        var a=tfObjSort.a
        var d=tfObjSort.d
        var r=0
        for(var i=0;i<a.length;i++){
            if(typeof x+typeof y!="objectobject"){return typeof x==="object"?-1:1};
            var m=x[a[i]]; var n=y[a[i]];
            var t=typeof m+typeof n;
            if(t==="booleanboolean"){m*=-1;n*=-1}
            else if(t.split("string").join("").split("number").join("")!=""){continue};
            r=m-n;
            if(isNaN(r)){r=tfObjSort.charSorter(m,n)};
            if(r!=0){return r*d[i]}
        }
        return r
    },
    charSorter:function (x,y){
        if(tfObjSort.ignoreCase){x=x.toLowerCase();y=y.toLowerCase()};
        var s=tfObjSort.chars;
        if(!s){return x>y?1:x<y?-1:0};
        x=x.split("");y=y.split("");l=x.length>y.length?y.length:x.length;
        var p=0;
        for(var i=0;i<l;i++){
            p=s.indexOf(x[i])-s.indexOf(y[i]);
            if(p!=0){break};
        };
        if(p===0){p=x.length-y.length};
        return p
    },
    setThings:function (x){
        this.ignoreCase=x.sortIgnoreCase;
        var s=x.sortCharOrder;
        if(!s){this.chars=false;return true};
        if(!s.sort){s=s.split(",")};
        var a="";
        for(var i=1;i<1024;i++){a+=String.fromCharCode(i)};
        for(var i=0;i<s.length;i++){
            z=s[i].split("");
            var m=z[0]; var n=z[1]; var o="";
            if(z[2]==="_"){o=n+m} else {o=m+n};
            a=a.split(m).join("").split(n).join(o);
        };
        this.chars=a
    }
};
tfObjSort.init();




