google.load("earth", "1");

var nonce;
var geocodeInProgress;
var visitorId = null;
var visitorName = null;
var locationId = "global";
var voteMap;
var intro, iam, name_ind, name_org, iam_ind, iam_org, country, city, postcode, email, optin, submit, icon, addr, thanks, reqd, selectText;

function cmxform() {
    // Hide forms
    jQuery('form.cmxform').hide().end();

    // Processing
    jQuery('form.cmxform').find('li label').not('.nocmx').each(function(i) {
        var labelContent = this.innerHTML;
        var labelWidth = document.defaultView.getComputedStyle(this, '').getPropertyValue('width');
        var labelSpan = document.createElement('span');
        labelSpan.style.display = 'block';
        labelSpan.style.width = labelWidth;
        labelSpan.innerHTML = labelContent;
        this.style.display = '-moz-inline-box';
        this.innerHTML = null;
        this.appendChild(labelSpan);
    }).end();

    // Show forms
    jQuery('form.cmxform').show().end();
}

function performFormsGeoCode() {
    var country = jQuery('#country').val();
    if (country != null && country.replace(/^\s+|\s+$/g, '') != '') {
        // They've set their country, we can geocode something.
        setTimeout(function() {
            var streetinfo = jQuery('#streetinfo').val();
            var state = jQuery('#state').val();
            var city = jQuery('#city').val();
            var postcode = jQuery('#postcode').val();
            var geocoder = new GClientGeocoder();
            var locationString;            
            locationString = streetinfo + ", " + city + ", " + state + " " + postcode + ", " + country;
            if (!geocodeInProgress || locationString != geocodeInProgress) {
                geocoder.getLatLng(locationString, latLngHandler);
                geocodeInProgress = locationString;
            }
        }, 100);
    }
}


function generateNonce() {
    // skew it a little so that there are more numbers.. like what googles generates - http://show-your-vote.appspot.com/nonce
    var chars = "0123456789abcdefghiklmnopqrstuvwxyz01234567890123456789";
    var string_length = 40;
    var randomstring = '';
    for (var i = 0; i < string_length; i++) {
        var rnum = Math.floor(Math.random() * chars.length);
        randomstring += chars.substring(rnum, rnum + 1);
    }
    nonce = randomstring;
}

function loadNonce() {
    if (!nonce) {
        generateNonce();
        jQuery('#nonce').val(SHA1(nonce));
    }
}

function addHandlersAndPopulate()
{
    loadNonce();
    jQuery('.org').hide();
     if (geo_position_js.init()) {
        geo_position_js.getCurrentPosition(geoSuccess, geoError);
    } else {
        geoError();
    }

    // Do a geocode for any events that might fire if the form has changed.
    jQuery('#country').change(performFormsGeoCode);
    jQuery('#state').change(performFormsGeoCode);
    jQuery('#city').change(performFormsGeoCode);
    jQuery('#postcode').change(performFormsGeoCode);
    jQuery('#streetinfo').change(performFormsGeoCode);
    jQuery('#city').keypress(performFormsGeoCode);
    jQuery('#postcode').keypress(performFormsGeoCode);
    jQuery('#opt_in').change(toggleOptIns);
    
    populateCountries();
    toggleForm('person');
}

function toggleOptIns()
{    
    if($('#opt_in').attr('checked'))
    {
        jQuery('#email').rules('add', { required: true, messages: { required: reqd} });
    }
    else
    {
        jQuery('#email').rules('remove');        
    }
}

function addHandlersAndPopulateSmallWidget()
{
    loadNonce();
    
     if (geo_position_js.init()) {
        geo_position_js.getCurrentPosition(geoSuccess, geoError);
    } else {
        geoError();
    }

    // Do a geocode for any events that might fire if the form has changed.
    jQuery('#country').change(performFormsGeoCode);
    jQuery('#postcode').keypress(performFormsGeoCode);

    populateCountriesNoStates();
}

// for the voting form on the main site
function initVotingForm()
{    
    // check to see if they've previously voted, if so then don't allow it    
    if ($.cookie('EarthHour2010Voted'))
    {
        jQuery("#sign").hide();
        jQuery("#thanksMessage").hide();
        jQuery("#thanksPrevMessage").show();
    }
    else
    {
        jQuery("#thanksPrevMessage").hide();
        jQuery("#thanksMessage").hide();
    }

    jQuery('#sign').validate({
        submitHandler: function(form) {
            formHandler();
        }
    });
    
    addHandlersAndPopulate();   
}

// for the main voting widget - 400x600
function initWidgetVotingForm()
{
    jQuery('#sign').validate({
        submitHandler: function(form) {
            widgetFormHandler();
        }
    });
    
    addHandlersAndPopulate();

    // check to see if they've previously voted, if so then don't allow it    
    if ($.cookie('EarthHour2010WidgetVoted'))
    {
        jQuery("#sign_form").html('<img src="/assets/img/widget/2010/thanks.png" alt="Earth Hour - Thanks for your vote" width="446" height="108" class="thanks"/>');   

    }
}

// for the small (300x250) widget
function initSmallWidgetVotingForm()
{    
    jQuery('#sign').validate({
        submitHandler: function(form) {
            smallWidgetFormHandler();
        }
    });
    
     addHandlersAndPopulateSmallWidget();

    // check to see if they've previously voted, if so then don't allow it    
    if ($.cookie('EarthHour2010SmallWidgetVoted'))
    {
        jQuery('#sign_form').hide();
        jQuery('#result1').html('<img src="/assets/img/widget/thanks.png" width="300" height="250" alt="Thanks for voting Earth!" />')  
    }
}

function formHandler() 
{
        var opt_in = "0";        
        if (jQuery('#opt_in').attr('checked') == true)
            opt_in = "1";
        
        var postcode="";
        if (jQuery('#postcode').val())
            postcode = jQuery('#postcode').val();


        //first post to TigerSpike handler to register the vote
        jQuery.post("/handlers/Vote.ashx", {form_toggle: jQuery('#form_toggle').val(), person_name: jQuery('#person_name').val(), org_name: jQuery('#org_name').val(), email: jQuery('#email').val(), org_icon: jQuery('#org_icon').val(), country: jQuery('#country').val(), state: jQuery('#state').val(), streetinfo: jQuery('#streetinfo').val(), city: jQuery('#city').val(), postcode: postcode, optin: opt_in, lang: '', skin: '', mobile: jQuery('#phone').val()});

        //next open Google app in a hidden iframe to register vote
        var getVars = "?lng=" + jQuery('#lng').val() + "&lat=" + jQuery('#lat').val() + "&country=" + jQuery('#country').val() + "&postcode=" + postcode + "&state=" + jQuery('#state').val();

//test        
//     jQuery("#googler").html('<iframe id="googleVote" src="http://syv-test.appspot.com/add/signer' + getVars + '" style="display:none;" />');

//live
      jQuery("#googler").html('<iframe id="googleVote" src="http://show-your-vote.appspot.com/add/signer' + getVars + '" style="display:none;" />');

        // send them a 45 day cookie
        $.cookie('EarthHour2010Voted', 'true', { expires: 45, path: '/' });        

        // re-direct to the thanks page
        window.location = "/thanks.aspx";    
        return false;
}


function widgetFormHandler() {

        var opt_in = "0";        
        if (jQuery('#opt_in').attr('checked') == true)
            opt_in = "1";

        var postcode="";
        if (jQuery('#postcode').val())
            postcode = jQuery('#postcode').val();

        var language = jQuery.query.get('lang');
        var skin = jQuery.query.get('skin');

        jQuery.post("/handlers/Vote.ashx", { form_toggle: jQuery('#form_toggle').val(), person_name: jQuery('#person_name').val(), org_name: jQuery('#org_name').val(), email: jQuery('#email').val(), org_icon: jQuery('#org_icon').val(), country: jQuery('#country').val(), state: jQuery('#state').val(), streetinfo: jQuery('#streetinfo').val(), city: jQuery('#city').val(), postcode: postcode, optin: opt_in, lang: language, skin: skin, mobile: jQuery('#phone').val()});
        
        //next open Google app in a hidden iframe to register vote
        var getVars = "?lng=" + jQuery('#lng').val() + "&lat=" + jQuery('#lat').val() + "&country=" + jQuery('#country').val() + "&postcode=" + postcode + "&state=" + jQuery('#state').val();
                      
        jQuery("#result2").html('<iframe id="googleVote" src="http://show-your-vote.appspot.com/add/signer' + getVars + '" style="display:none;" />');

        // show the thanks message
        jQuery("#sign_form").html('<img src="/assets/img/widget/2010/thanks.png" alt="Earth Hour - Thanks for your vote" width="446" height="108" class="thanks"/>');   
        
        $.cookie('EarthHour2010WidgetVoted', 'true', { expires: 45, path: '/' });        
        return false;
}


function smallWidgetFormHandler() {

        var postcode="";
        if (jQuery('#postcode').val())
            postcode = jQuery('#postcode').val();
        
        var opt_in = "0";        
        if (jQuery('#opt_in').attr('checked') == true)
            opt_in = "1";


   var language = jQuery.query.get('lang');
   var skin = jQuery.query.get('skin');

        jQuery.post("/handlers/Vote.ashx", { form_toggle: 'person', person_name: jQuery('#person_name').val(), org_name: '', email: jQuery('#email').val(), org_icon: '', country: jQuery('#country').val(), state: '', streetinfo: '', city: '', postcode: postcode, optin: opt_in, lang: '', skin: ''});
                
        //Open a Google app in a hidden iframe to register vote
        var getVars = "?lng=" + jQuery('#lng').val() + "&lat=" + jQuery('#lat').val() + "&country=" + jQuery('#country').val() + "&postcode=" + postcode + "&state=";
                      
        //live
        jQuery("#result2").html('<iframe id="googleVote" src="http://show-your-vote.appspot.com/add/signer' + getVars + '" style="display:none;" />');
        
        jQuery('#sign_form').hide();
        jQuery('#result1').html('<img src="/assets/img/widget/thanks.png" width="300" height="250" alt="Thanks for voting Earth!" />')        

        $.cookie('EarthHour2010SmallWidgetVoted', 'true', { expires: 45, path: '/' });        
        return false;
}

function populateCountriesNoStates() {
    jQuery('.state').hide();
    var countrySelect = jQuery('#country');
    for (var countryCode in countriesInfo) {
        var countryOption = jQuery(document.createElement('option'));
        countryOption.val(countryCode);
        countryOption.text(countryCode + " - " + countriesInfo[countryCode].name);
        countrySelect.append(countryOption);
    }
}

function populateCountries() {
    jQuery('.state').hide();
    var countrySelect = jQuery('#country');
    countrySelect.change(populateStates);   
    for (var countryCode in countriesInfo) {
        var countryOption = jQuery(document.createElement('option'));
        countryOption.val(countryCode);
        countryOption.text(countryCode + " - " + countriesInfo[countryCode].name);
        countrySelect.append(countryOption);
    }
}

function populateStates() {
    var countryCode = jQuery('#country').val();
    if (countriesInfo[countryCode].hasStates) {
        jQuery('.state').show();
        var states = countriesInfo[countryCode].states;
        jQuery('#state').rules('add', { required: true, messages: { required: reqd} });
        jQuery('#state').html('');
        for (var i = 0; i < states.length; i++) {
            var stateOption = jQuery(document.createElement('option'));
            stateOption.val(states[i]);
            stateOption.text(states[i]);
            jQuery('#state').append(stateOption);
        }
    } else {
        jQuery('.state').hide();
        jQuery('#state').rules('remove');
    }

    var postcodeInput = jQuery('#postcode');
    if (countriesInfo[countryCode].hasPostcodes) {
        jQuery('.postcode').show();
        jQuery('#postcode').rules('add', { required: true, messages: { required: reqd} });
    } else {
        jQuery('.postcode').hide();
        jQuery('#postcode').rules('remove');
    }
}

function geoSuccess(p) {
    // We have a lat/lon point, do a reverse lookup
    var point = new GLatLng(p.coords.latitude, p.coords.longitude);
    var geocoder = new GClientGeocoder();
    geocoder.getLocations(point, addressHandler);
}

function locationString(country, state, city, postcode) {
    if (state) {
        return city + ", " + state + " " + postcode + ", " + country;
    } else {
        return city + ", " + postcode + ", " + country;
    }
}

function addressHandler(response) {
    if (!response || response.Status.code != 200) {
        geoError();
    } else {
        var place = response.Placemark[0];
        var country = place.AddressDetails.Country.CountryNameCode;
        var state = place.AddressDetails.Country.AdministrativeArea.AdministrativeAreaName;
        // Sometimes Maps gives us an AdministrativeArea, and sometimes it gives a SubAdministrativeArea
        if (place.AddressDetails.Country.AdministrativeArea.Locality) {
            var city = place.AddressDetails.Country.AdministrativeArea.Locality.LocalityName;
            var postcode = place.AddressDetails.Country.AdministrativeArea.Locality.PostalCode.PostalCodeNumber;
        } else if (place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality) {
            var city = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.LocalityName;
            var postcode = place.AddressDetails.Country.AdministrativeArea.SubAdministrativeArea.Locality.PostalCode.PostalCodeNumber;
        } else {
            return geoError();
        }
        jQuery('#country').val(country).change();
        jQuery('#state').val(state);
        jQuery('#city').val(city);
        jQuery('#postcode').val(postcode);
        var geocoder = new GClientGeocoder();
        geocoder.getLatLng(locationString(country, state, city, postcode), latLngHandler);
    }
}

function latLngHandler(point) {
    
    if (!point) {  
        // get the southwest bound from the countrybound.js and use that        
        var country = jQuery('#country').val()
        jQuery('#lat').val(countriesInfo[country].bounds.southWest[0]);
        jQuery('#lng').val(countriesInfo[country].bounds.southWest[1]);
        jQuery('#submit').removeAttr('disabled');                
        //geoError();
    
    } else {
        jQuery('#lat').val(point.lat());
        jQuery('#lng').val(point.lng());
        jQuery('#submit').removeAttr('disabled');
    }
}

function geoError() { }

function toggleForm(formValue) {

    if (formValue == 'org') {
        jQuery('#streetinfo').rules('add', { required: true, messages: { required: reqd} });
        jQuery('#org_name').rules('add', { required: true, messages: { required: reqd} });
        jQuery('#person_name').rules('remove');
        jQuery('.person').hide();
        jQuery('.org').show();
    } else {
        jQuery('.org').hide();
        jQuery('#streetinfo').rules('remove');
        jQuery('#org_name').rules('remove');
        jQuery('#person_name').rules('add', { required: true, messages: { required: reqd} });
        jQuery('.person').show();
    }

}

function Left(str, n) {
    if (n <= 0)
        return "";
    else if (n > String(str).length)
        return str;
    else
        return String(str).substring(0, n);
}
