//Registered spinners
var supertagger_spinners=new Object();

var supertagger_geocoder = null;
var supertager_map = null; // TODO rename to supertagger_map
var supertagger_default_zoom_level = 13;
var supertagger_uuid=null;
var supertagger_pos =null;
var supertagger_virgin_click =true;


//Helper to flatten query parameter array
function flattenArray(data) {
    if (!jQuery.isArray(data)) return data;
    var str = '';
    for ( var i in data) {
        str += (i + '=' + data[i] + '&');
    }
    return str;
}

//Helper to activate spinner after a grace-delay
function activateSpinner(tag,caption,timeout) {
    if(!tag)return;
    if(!caption)caption="Vennligst vent";
    if(!timeout)timeout=5000;
    var spinner;
    // Show spinner only when necessary (that is whenever it takes longer than
    // the given timeout to get a response)
    if(supertagger_spinners[tag])spinner=supertagger_spinners[tag];
    else supertagger_spinners[tag]=spinner = jQuery(tag + ' .spinner');
    spinner.st_finished=false;
    spinner.st_tag=tag;
    spinner.st_caption=caption;
    spinner.st_timeout=timeout;
    spinner.html(caption);
    setTimeout(function() {
        if (!spinner.st_finished) {
            spinner.slideDown();
        }
    }, timeout);
    //alert("activated spinner:"+spinner.st_tag+" with caption "+spinner.st_caption+" and timeout "+spinner.st_timeout);
}

//Helper to deactivate spinner
function deactivateSpinner(tag) {
    if(!tag)return;
    var spinner;
    if(supertagger_spinners[tag])spinner=supertagger_spinners[tag];
    else supertagger_spinners[tag]=spinner = jQuery(tag + ' .spinner');
    spinner.slideUp();
    spinner.st_finished=true;
    //alert("deactivated spinner:"+spinner.st_tag+" with caption "+spinner.st_caption+" and timeout "+spinner.st_timeout);
}


//function submitSupertaggerChanges(tag, in_data, action, uuid, type,out_cb) {
function transferData(action,id,uuid,type,note,in_data, out_cb) {
    var flat = "";
    
    if(!action)alert('Feil i supertaggeren: mangler action i transferData()');
    if(!type)type='ukjent';
    if(!note)note='Overfører data av type "'+type+'"';
    
    
    if(in_data)flat=flattenArray(in_data);
    activateSpinner(id,note);
    var req = {
        type : 'POST'
        ,url : base_path + "/supertagger/ajax/" + action
        ,data : flat + "uuid=" + uuid + "&type=" + type
        ,success : (function(return_data,msg) {
            if(out_cb)out_cb(return_data,msg);
            deactivateSpinner(id);
        })
        ,error : (function(request, msg, error) {
            alert('Kunne ikke overføre data for "'+type+'" ('+msg+', '+error+')');
            deactivateSpinner(id);
        })
    };
    //alert(" TYPE: "+req.type+" url: "+req.url+" data: "+req.data+" success: "+req.success+"");
    jQuery.ajax(req);
}

//Helper to clear cache with changes. Shields against missing clearCache() (when debug is not enabled)
function clearDebugCache(cb) {
    if(!cb)cb=(function(d,msg){})
    if(clearCache)clearCache(cb);
}

//Helper to transfer tags upon submit
function transferTagData(id,uuid,type) {
    return transferData(
            'get_tags'
            ,id
            ,uuid
            ,type
            ,'Henter tags for '+type
            ,undefined
            ,function (msg){$(id + ' select').html(msg);}
    );
}

//Hook changes in the lists to ajax calls
function hookChangeForAjax(id, action, uuid, type) {
    // alert("AJAX HOOK FOR: "+id+", "+action);
    // Hook events on lists
    jQuery('#' + id + ' select').change(function(i) {
        var sel = [];
        jQuery('#' + id + ' option:selected').each(function(i, selected) {
            sel[i] = jQuery(selected).val();
        });
        // Save
        //submitSupertaggerChanges('#' + id, sel, action, uuid, type);
                           transferData(action, '#' + id, uuid, type, undefined, sel);
                           clearDebugCache();
    });
}


function supertaggerMapCenterAdress(address) {
    if (undefined == address) address = "Bergen";
    if (null == supertagger_geocoder) supertagger_geocoder = new GClientGeocoder();
    supertagger_geocoder.getLatLng(address, supertaggerMapAdressFoundCallback);
    function supertaggerMapAdressFoundCallback(geopos) {
        if (!geopos) {
            alert("Kunne ikke finne adressen: '" + address + "'");
        } else {
            if (supertager_map) {
                supertaggerMapCenterGeoPos(geopos.lat(),geopos.lng(),supertagger_default_zoom_level);
                supertaggerStoreGeoPos(supertagger_uuid,geopos.lat(),geopos.lng());
            }
        }
    }
}

function supertaggerMapCenterGeoPos(lat, lng, zoom) {
    if (undefined == zoom) zoom = supertagger_default_zoom_level;
    //alert("centering('" + lat + "','" + lng + "','" + zoom + "')");
    
    if (null == supertager_map) {
        return;
    }
    
    supertager_map.setCenter(new GLatLng(lat, lng), zoom);
    supertaggerMapUpdateLongLat();
}

function supertaggerMapUpdateLongLat() {
    var p = supertager_map.getCenter();
    // Update lat/long entry fields
    var lat=p.lat();
    var lng=p.lng();
    lat=Math.round(lat*100000)/100000;
    lng=Math.round(lng*100000)/100000;
    jQuery('#supertagger-map-geopos-form input.lat').val(lat);
    jQuery('#supertagger-map-geopos-form input.long').val(lng);
    return p;
}

function supertaggerStoreGeoPos(uuid,lat,lng) {
    var data = [];
    data['lat']=lat;
    data['lng']=lng;
    // Save new position with ajax
    //submitSupertaggerChanges('#admin-kart', data, 'store_geopos', uuid, "point");
    transferData('store_geopos','#admin-kart',uuid,"point","Lagrer geoposisjon",data);
    clearDebugCache();
}


function setUpSupertaggerMap(uuid) {
    supertagger_uuid=uuid;
    // Prepare map
    if (GBrowserIsCompatible()) {
        // Add support for crosshair
        GMap2.prototype.addCrosshairs = function(crosshairsSize) {
            var container = this.getContainer();
            if (this.crosshairs) this.removeCrosshairs();
            var crosshairs = document.createElement("img");
            crosshairs.src = base_path + '/gfx/ikoner/kart/crosshairs.gif';
            crosshairs.style.width = crosshairsSize + 'px';
            crosshairs.style.height = crosshairsSize + 'px';
            crosshairs.style.border = '0';
            crosshairs.style.position = 'relative';
            crosshairs.style.top = ((container.clientHeight - crosshairsSize) / 2) + 'px';
            crosshairs.style.left = ((container.clientWidth - crosshairsSize) / 2) + 'px';
            crosshairs.style.zIndex = '500';
            container.appendChild(crosshairs);
            this.crosshairs = crosshairs;
            return crosshairs;
        };
        // Initialize map
        supertager_map = new GMap2(document.getElementById("admin-kart-google"));
        supertager_map.setUIToDefault();
        supertager_map.addCrosshairs(60);

        // Listen for drag event
        GEvent.addListener(supertager_map, 'dragend', function() {
            // Get and store geopos
            var p=supertaggerMapUpdateLongLat();
            supertaggerStoreGeoPos(supertagger_uuid,p.lat(),p.lng());
        });
        // Handle geopos submit
        jQuery('#supertagger-map-geopos-form').submit(function() {
            var tlat=jQuery('#supertagger-map-geopos-form input.lat').val();
            var tlng=jQuery('#supertagger-map-geopos-form input.long').val();
            supertaggerMapCenterGeoPos(tlat,tlng,supertagger_default_zoom_level);
            supertaggerStoreGeoPos(supertagger_uuid,tlat,tlng);
            return false;
        });
        // Handle search submit
        jQuery("#supertagger-map-search-form").submit(function() {
            supertaggerMapCenterAdress(jQuery('#supertagger-map-search-form input.address').val());
            return false;
        });
        // Handle remove submit
        jQuery("#supertagger-map-remove-form").submit(function() {
            //submitSupertaggerChanges('#supertagger-map-remove-form', "", "remove_geopos", uuid, "");
            transferData("remove_geopos",'#supertagger-map-remove-form', uuid,'','Fjerner geoposisjon');
            clearDebugCache();
            return false;
        });
    }
}

function supertaggerInternalInit(id,uuid,settings) {
    if(settings['edit_seasons']) {
        transferTagData("#admin-tagger-season",uuid,"season");
        hookChangeForAjax('admin-tagger-season', 'store_relations', uuid, "season");
        jQuery('.supertagger .seasons.list').addClass('active');
    }
    if(settings['edit_activities']) {
        transferTagData("#admin-tagger-activity",uuid,"activity");
        hookChangeForAjax('admin-tagger-activity', 'store_relations', uuid, "activity");
        jQuery('.supertagger .topics.list').addClass('active');
    }
    if(settings['edit_locations']) {
        transferTagData("#admin-tagger-location",uuid,"location");
        hookChangeForAjax('admin-tagger-location', 'store_relations', uuid, "location");
        jQuery('.supertagger .locations.list').addClass('active');
    }
    if(settings['edit_map']) {
        jQuery('.supertagger .map').addClass('active');
        transferData("get_geopos","#admin-kart",uuid,"geopos","Henter geoposisjon",undefined,
            function(return_data,msg){
                //Remember position
                supertagger_pos=eval("("+return_data+")");
                supertaggerMapCenterGeoPos(supertagger_pos.lat,supertagger_pos.lng,supertagger_default_zoom_level);
            }
        );
    }
}

function setUpSupertagger(id, uuid) {
    transferData('get_settings','.supertagger',uuid,'settings','Henter instillinger',undefined,
            function(return_data,msg){
                var settings=eval("("+return_data+")");
                //alert("edit_map:"+settings['edit_map']+", edit_seasons:"+settings['edit_seasons']+", edit_locations:"+settings['edit_locations']+", edit_activities:"+settings['edit_activities']+", ");
                supertaggerInternalInit(id,uuid,settings);
            }
    );
    //UGLY HACK: To avoid the map looking all scruffy, this sorry looking code was unfortunately needed :(
    //The original problem probably arrises because we have more than one google map on the same page
    //Rendering the google map in a hidden element also makes it impossible for the map client to figure out its size
    //This hack just wats for one second after the menu is opened before loading the map assuming it will be fully visible then.
    jQuery('#ADMIN').click(
        function(){
            if(!supertagger_virgin_click)return;
            else supertagger_virgin_click=false;
            setTimeout(
                function(){
                    //Init the map now that we need it
                    setUpSupertaggerMap(uuid);
                    
                    if (null != supertagger_pos) {
                        supertaggerMapCenterGeoPos(supertagger_pos.lat,supertagger_pos.lng,supertagger_default_zoom_level);
                    }
                },1000);
        }
    );
}
