views:

377

answers:

4

Okay, so I'm trying to set a variable via a javascript method call. However this is not working. I googled and ended ip going back and trying swLiveConnect, but that's outdated and it turns out my way is now the way to do it. So here's my javascript function and actionscript. I have no idea what's going on, I bow before the more skilled actionscripters.

Actionscript

//==========================================================
function decide_proposal(e:Event):void {
//==========================================================
    var address1:String = form1.project_address.text + ", " + form1.project_city.text + ", " + form1.project_state.text + ", " + form1.project_zip.text;
    var distance:Number = ExternalInterface.call("showLocation(" + address1 + ")");

    var commit:String = e.currentTarget.name;
    if (form1.stories.value >= 2.5 || form1.wood_no.selected || form1.framed_sqft.value >= 5000 || form1.roof_slope.value < 3 || form1.civil.selected || form1.cmt.selected || form1.commercial.selected || form1.c.selected || distance >= 180 || form1.bore_holes1.value >= 4) {
      send_proposal(e);
    } else if (commit == "quote") {
      perform_calculations(distance);
    } else {
      send_proposal(e);
    }
}

Javascript

var geocoder;
var location1;


function initialize() {
    geocoder = new GClientGeocoder();
}
function showLocation(address) {
    var locations = 0;
    geocoder.getLocations(address, function (response) {
     if (!response || response.Status.code != 200)
     {
      alert("There was an error");
     }
     else
     {
      location1 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0]};
     }
    });
    var glatlng1 = new GLatLng(location1.lat, location1.lon);
    var brenham = new GLatLng(30.152289,-96.384881);
    var college_station = new GLatLng(30.610584,-96.306002);
    var miledistance1 = glatlng1.distanceFrom(brenham);
    var miledistance2 = glatlng1.distanceFrom(college_station);

    if (miledistance1 <= miledistance2) {
     locations = (miledistance1 * .000621371192);
    } else {
     locations = (miledistance2 * .000621371192);
    }
    return locations;
}
window.onload=function() {initialize();}

I'm fairly certain it has something to do with return, but am not sure. At this point I have tried tracing what address is getting passed to the function, it is correct. I have traced what the distance is set to before and after the call. Before, NaN; after, 0. From Firebug I get the correct number. I just don't know.

+2  A: 

Make sure you have allowScriptAccess="always" in the HTML object/embed code.

ozke
I do and should have added that I have a few other buttons that make ExternalInterface.call()'s successfully. Thank you though.
Zach
I dove deeper into this solution, and it turns out you have to set the param AND object embed code to always. It didn't solve the problem, but I didn't know that. Figure that will be helpful for anyone that comes across this in the future. Just a good thing to know in general, allowScriptAccess I mean.
Zach
+1  A: 

I'm not really sure about that but... give it a try:

function showLocation(address) {
    var locations = geocoder.getLocations(address, function (response) {
        if (!response || response.Status.code != 200)
        {
                alert("There was an error");
        }
        else
        {
                location1 = {lat: response.Placemark[0].Point.coordinates[1], lon: response.Placemark[0].Point.coordinates[0]};
                var glatlng1 = new GLatLng(location1.lat, location1.lon);
                var brenham = new GLatLng(30.152289,-96.384881);
                var college_station = new GLatLng(30.610584,-96.306002);
                var miledistance1 = glatlng1.distanceFrom(brenham);
                var miledistance2 = glatlng1.distanceFrom(college_station);

                if (miledistance1 <= miledistance2) {
                        return (miledistance1 * .000621371192);
                } else {
                        return (miledistance2 * .000621371192);
                }
        }
    });
    return locations;
}
ozke
Okay I did this and it gave me an idea, and I've found that the variable isn't getting set to anything. I'm thinking that I need to do something other than return, but I don't know what would be appropriate.
Zach
+1  A: 

The issue appears to be that geocoder.getLocations is not returning the return value of the function you passed to it. You could try using a closure:

function showLocation(address) {
    var retval
    geocoder.getLocations(address, function (response) {
                                       ... // don't use another 'var retval' here
                                       reval = ...
                                   }
    return retval
}
Curt Sampson
Thanks Curt. That didn't do it, but I've included it in my code. What I have found it even just making the function return a number doesn't set it to the variable. I'm not sure where to look, there's a question exactly like this here on stackoverflow but the answer is exactly what I did, and Google searches turn up the same method. Frustrating to say the least.
Zach
+1  A: 

Okay the problem was simple. I was passing the parameters to the function incorrectly. Here's how you do it:

    var distance:Number = ExternalInterface.call("showLocation", address1);

Annnnd Bob's your uncle.

Zach
Please select your own answer as the 'selected answer'
Dmitri Farkov
Oh dear. "Doh!" Well my answer sounded good. :-)
Curt Sampson
Haha, I still ended up including your code Curt, it was just better that way regardless of whether it solved my problem. So who knows, even if I had solved it, I still probably would have needed to do what you said.Dmitri, they make you wait 48 hours before you can select your own answer. As of now I still can't do it. Will do when I can though!Thanks again Curt.
Zach