
var serveraddress = "request.dat";
var map;
var container;
var threshold = 4; //pixels;
var markerData = new Object ;
var markerLoading = new Object;
var promotionmarkerData = new Object ;
var promotionmarkerLoading = new Object;
var logvar="";

var categorie ="";
var tileurl="defaulttileurl.png";
var promotiontileurl="defaultpromotiontileurl.gif";
var linkimageurl="linkimage.gif";

var tooltiprb = document.getElementById("tooltiprb");
//var tooltiprb = document.createElement("div");
//tooltiprb.setAttribute("id", "tooltiprb");
var tooltipposition = new Object;
var tooltiplink;
var mouseposition = new Object;

// de 'hand'-cursor die google standaard gebruikt
var cursor = "url(http://maps.gstatic.com/intl/nl_ALL/mapfiles/openhand_8_8.cur), default";


function getXMLHttpRequest() {
    try {
        req = new XMLHttpRequest();
    }
    catch(err1) {
        try {
            req = new ActiveXObject("Msxml2.XMLHTTP");
        } catch (err2) {
            try {
                req = new ActiveXObject("Microsoft.XMLHTTP");
            } catch (err3) {
                req = false;
            }
        }
    }
    return req;
}

function retreiveData(jsparameters) {
    var http_request = getXMLHttpRequest();
    // cookies als extra check of request van eigen server is (niet waterdicht)
    var cookies="jscookies="+escape(document.cookie);
    http_request.open("POST", serveraddress, true);
    http_request.setRequestHeader("Content-Type", "application/x-www-form-urlencoded");
    http_request.onreadystatechange = function () {
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                var txt = http_request.responseText;
                var object = JSON.parse(txt);
                eval(object.returncall + '(object)');
            }
            else {
            }
            http_request = null;
        }
    };
    http_request.send("jsparameters=" + encodeURIComponent(JSON.stringify(jsparameters)) + "&" + cookies);
}

function jsLoadMarkers(javaresult, categorie, tile) {
    if (javaresult=='') {
        // request mode
        var tilecookiename = categorie + "_" + tile;
        if (markerLoading[tilecookiename]==null) {
            // als nog niet aan het laden
            markerLoading[tilecookiename]=true;
            var jsparameters = new Object();
            var tempparameters = new Object();
            tempparameters.categorie = categorie;
            tempparameters.tile = tile;
            jsparameters.parameters = tempparameters;
            jsparameters.javafunction = "getmarkers";
            jsparameters.returncall = "jsLoadMarkers";
            retreiveData(jsparameters);
            // Na timeout wordt status 'laden' uitgezet; kan eventuele nieuwe poging worden gedaan
            setTimeout("markerLoading['" + tilecookiename + "']=null;", 5000);
        }
    }
    else {
        // processresultmode
        if (javaresult.resultcode==1) {
            var tilecookiename2 = javaresult.categorie + "_" + javaresult.tile;
            markerData[tilecookiename2]=javaresult.jsonmarkers;
        }
    }
}

function jsLoadPromotionMarkers(javaresult, categorie, tile) {
    if (javaresult=='') {
        // request mode
        var tilecookiename = categorie + "_" + tile;
        if (promotionmarkerLoading[tilecookiename]==null) {
            // als nog niet aan het laden
            promotionmarkerLoading[tilecookiename]=true;
            var jsparameters = new Object();
            var tempparameters = new Object();
            tempparameters.categorie = categorie;
            tempparameters.tile = tile;
            jsparameters.parameters = tempparameters;
            jsparameters.javafunction = "getpromotionmarkers";
            jsparameters.returncall = "jsLoadPromotionMarkers";
            retreiveData(jsparameters);
            // Na timeout wordt status 'laden' uitgezet; kan eventuele nieuwe poging worden gedaan
            setTimeout("promotionmarkerLoading['" + tilecookiename + "']=null;", 5000);
        }
    }
    else {
        // processresultmode
        if (javaresult.resultcode==1) {
            var tilecookiename2 = javaresult.categorie + "_" + javaresult.tile;
            promotionmarkerData[tilecookiename2]=javaresult.jsonmarkers;
        }
    }
}

function loadMap()
{
    if (GBrowserIsCompatible())
    {
        container = document.getElementById("map");
        map = new GMap2(container);
        map.setCenter(new GLatLng(52,5),9); // nodig om opties map te kunnen sturen?
        map.addControl(new GSmallZoomControl3D());
        map.addControl(new GMapTypeControl());
        map.enableScrollWheelZoom();
        map.enableContinuousZoom();
        map.removeMapType(G_HYBRID_MAP);
        map.addMapType(G_PHYSICAL_MAP);
        map.setMapType(G_PHYSICAL_MAP);

        // Custom tile URL function for an image generated "on the fly" by a script...
        var RegioBedrijfTileUrl=function(point,zoom)
        {
            return tileurl + "?ZOOM=" + zoom + "&X=" + point.x + "&Y=" + point.y + "&categorie=" + categorie;
        }
        var copyright = new GCopyright(1, map.getBounds(), 0, "Regiobedrijf.nl");
        var copyrightCollection = new GCopyrightCollection("© ");
        copyrightCollection.addCopyright(copyright);
        tilelayers = new GTileLayer(copyrightCollection,0,19);
        tilelayers.getTileUrl = RegioBedrijfTileUrl ;
        tileOverlay = new GTileLayerOverlay(tilelayers);
        map.addOverlay(tileOverlay);

        // Custom tile URL function for an image generated "on the fly" by a script...
        var PromotionTileUrl=function(point,zoom)
        {
            return promotiontileurl + "?ZOOM=" + zoom + "&X=" + point.x + "&Y=" + point.y + "&categorie=" + categorie;
        }
        //        var copyright = new GCopyright(1, map.getBounds(), 0, "Regiobedrijf.nl");
        //        var copyrightCollection = new GCopyrightCollection("(c) ");
        //        copyrightCollection.addCopyright(copyright);
        promotiontilelayer = new GTileLayer(copyrightCollection,0,19);
        promotiontilelayer.getTileUrl = PromotionTileUrl ;
        promotiontileOverlay = new GTileLayerOverlay(promotiontilelayer);
        map.addOverlay(promotiontileOverlay);


        //        // bug copyight not shown: http://code.google.com/p/gmaps-api-issues/issues/detail?id=663
        //        // workaround vanwege niet tonen copyright
        //        var copy = new GTileLayer();
        //        copy.getCopyright = function () {
        //            return {
        //                prefix: '© ',
        //                copyrightTexts: ['Regiobedrijf.nl']
        //            };
        //        };
        //        var types = map.getMapTypes();
        //        for (var i = 0; i < types.length; i++) {
        //            types[i].getTileLayers().splice(1, 0, copy);
        //        }

        // set tooltip
        //        map.getPane(G_MAP_FLOAT_SHADOW_PANE).appendChild(tooltiprb);
        // omdat rechtermuisklik niet optie gaf als open in nieuw tabblad, div gebonden aan hoofddocument
        // kan nu ook de kaart overlappen ;-)
        //     document.body.appendChild(tooltiprb);
        tooltiprb = document.getElementById("tooltiprb");

        tooltiprb.style.visibility="hidden";

        // Watch mouse movement to detect when over a data point...
        GEvent.addListener(map,"mousemove", mouseMove ) ;
        GEvent.addListener(map,"click", mouseClick ) ;

        // sluit de tooltipdiv als map beweegt
        // kan eigenlijk niet voordoen (moet je buiten div zijn en dan is div al weg)
        GEvent.addListener(map, "dragstart", mapMove );
        GEvent.addListener(map, "moveend", mapMove);


    }
}

// Watch mouse movement for proximity to a data point...
function mouseMove(mouseLatLng)
{
    var zoom = map.getZoom() ;
    var mousePx = G_NORMAL_MAP.getProjection().fromLatLngToPixel(mouseLatLng, zoom) ;
    mouseposition.x = mousePx.x;
    mouseposition.y = mousePx.y;

    // als er al een tooltip is en muis zit daarin, hoeft er niets te gebeuren
    var mouseindiv=false;
    if (tooltiprb.style.visibility=="visible") {
        // kijk of mouse in 'markerbullet' is
        var d = Math.sqrt(Math.pow((mousePx.x - tooltipposition.x),2) + Math.pow((mousePx.y - tooltipposition.y),2))
        if (d < threshold) {
            // mouse in 'markerbullet'
            mouseindiv=true;
            setCursor("pointer");
        }
        if (!mouseindiv) {
            if (mousePx.x>=tooltipposition.x && mousePx.x<=(tooltipposition.x+tooltiprb.offsetWidth) && mousePx.y>=tooltipposition.y && mousePx.y<=(tooltipposition.y+tooltiprb.offsetHeight)) {
                // mouse in tooltipdiv
                mouseindiv=true;
                setCursor("url(http://maps.gstatic.com/intl/nl_ALL/mapfiles/openhand_8_8.cur), default");
            }
        }
        if (!mouseindiv) {
            // mouse niet meer bij marker of tooltip
            setCursor("url(http://maps.gstatic.com/intl/nl_ALL/mapfiles/openhand_8_8.cur), default");
            tooltiprb.style.visibility="hidden";
        }
    }
    if (!mouseindiv) {
        // als er nog geen tooltip wordt getoond kijken of er marker vlakbij mouse is
        var tile = zoom + "_" + Math.floor(mousePx.x / 256) + "_" + Math.floor(mousePx.y / 256);
        var tilecookiename = categorie + "_" + tile;
 
        if (!promotionmarkerData[tilecookiename] || !markerData[tilecookiename])
        {
            // als geen markerdata beschikbaar is, eerst inladen
            jsLoadPromotionMarkers('', categorie, tile);
            jsLoadMarkers('', categorie, tile);
            // volgende keer beter..
            return ;
        }

        // eerst kijken of er promotionmarker is
        var markersintile = promotionmarkerData[tilecookiename] ;
        for (var n = 0 ; n < markersintile.length ; n++ )
        {
            // afstand van muis tot pixel (pythagoras)
            var d2 = Math.sqrt(Math.pow((mousePx.x - markersintile[n].x),2) + Math.pow((mousePx.y - markersintile[n].y),2))
            if (d2 < threshold)
            {
                setCursor("pointer");
                activateMarker(markersintile[n]);		// Activate the hand
                return;
            }
        }
        markersintile = markerData[tilecookiename] ;
        for (var n = 0 ; n < markersintile.length ; n++ )
        {
            // afstand van muis tot pixel (pythagoras)
            var d2 = Math.sqrt(Math.pow((mousePx.x - markersintile[n].x),2) + Math.pow((mousePx.y - markersintile[n].y),2))
            if (d2 < threshold)
            {
                setCursor("pointer");
                activateMarker(markersintile[n]);		// Activate the hand
                return;
            }
        }
    }
}

function mouseClick() {
    // als in de huidige bullet wordt geklikt naar pagina over individueel bedrijf (is handig)
    if  (tooltiplink) {
        var d = Math.sqrt(Math.pow((mouseposition.x - tooltipposition.x),2) + Math.pow((mouseposition.y - tooltipposition.y),2))
        if (d < threshold) {
            document.location = tooltiplink;
        }
    }
}

function mapMove() {
    // dan de tooltip verstoppen
    tooltiprb.style.visibility="hidden";
}

// Activate a marker...
function activateMarker(markerintile)
{
    var latlng = G_NORMAL_MAP.getProjection().fromPixelToLatLng(new GPoint(markerintile.x, markerintile.y), map.getZoom());
    var markerOffset = map.fromLatLngToDivPixel(latlng);
    tooltiplink = markerintile.nameencoded + "-" + markerintile.company_id + ".html";
    //    tooltiplink = tooltiplink.replace("/"," ");
    //    tooltiplink = tooltiplink.replace(";"," ");
    //    // hier eventueel nog encoding nodig, mochten fouten optreden (op zich wordt alleen getal aan einde gebruikt)
    var tempinnerHTML = "<a href=\"" + tooltiplink + "\"><img class=\"linkimage\" src=\"" + linkimageurl + "\"/></a><div class=\"tooltiprbinside\">" + markerintile.name + "<br/>";
    if (markerintile.image_id) {
        tempinnerHTML += "<img src=\"ci-" + markerintile.image_id + "-small.png\" />";
    }
    tempinnerHTML += "<a href=\"" + encodeURIComponent(tooltiplink) + "\">meer</a>" + "</div>";
    tooltiprb.innerHTML = tempinnerHTML;
    // map verschoven oid
    var mapshift = map.getPane(G_MAP_MAP_PANE).parentNode;
    var x = markerOffset.x + parseInt(mapshift.style.left);
    var y = markerOffset.y + parseInt(mapshift.style.top);
    // showinfo("dragopb x: " + parseInt(dragObject.style.left) + " y:" +parseInt(dragObject.style.top));
    // map container relative to the page
    var container = map.getContainer();
    while(container != null){
        y += container.offsetTop;
        x += container.offsetLeft;
        container = container.offsetParent
    }

    //tooltiprb.style.top = markerOffset.y + "px";
    //    tooltiprb.style.left = markerOffset.x + "px";
    tooltiprb.style.top = y + "px";
    tooltiprb.style.left = x + "px";
    tooltiprb.style.visibility="visible";
    tooltipposition.x = markerintile.x;
    tooltipposition.y = markerintile.y;
}

function setCursor(newcursor) {
    if (cursor!=newcursor) {
        cursor=newcursor;
        map.getDragObject().setDraggableCursor(newcursor);
    }
}

function scheduleUpdate(javaresult) {
    if (typeof javaresult  == 'number') {
        // request mode
        var jsparameters = new Object();
        jsparameters.company_id = javaresult;
        jsparameters.javafunction = "scheduleUpdate";
        jsparameters.returncall = "scheduleUpdate";
        retreiveData(jsparameters);
    //div.style.display="block";
    }
    else {
        if (javaresult.resultcode==1) {
            $('#updatelink').hide();
            $('#updatetext').html(javaresult.returnhtml);
            $('#updatetext').show();
        //        div = document.getElementById("updatetext");
        //        setTimeout("div.style.display='block';", 500);
        }
    }
}

function updateForm(id,showwarning) {
    //    alert(id  + " " + showwarning);
    var returnvalue=true;
    if (showwarning==null) {
        showwarning=true;
    }
    var value = $("#" + id).val();
    var type = $("#" + id).attr("type");
    var formid = $("#" + id).parents("form").attr("id");
    if (type=='checkbox') {
        value = $("#" + id).attr('checked');
    }
    if (formid=='editform') {
        if (id=='sbi1sl') {
            if (showwarning) {

        }
        }
        else if (id=='sbicodesl') {
            // als andere code dan huidige, disable opvalopties
            var oldcode = $("#currentsbicode").val();
            if (value!=oldcode) {
                $("select[id*=promotion_]").each(function() {
                    $(this).attr('disabled','disabled');
                    $(this).parent().children(".warning").show();
                })
            }
            else {
                $("select[id*=promotion_]").each(function() {
                    $(this).removeAttr("disabled");
                    $(this).parent().children(".warning").hide();
                })
                
            }
        }
        else if (id=='email') {
            var domain = getDomain($("#currentinternetaddress").val());
            if (domain=='example.com') {
                domain = getDomain($("#internetaddress").val());
            }
            if (emailCheck(value) && endsWith(value, domain)) {
                $("#" + id).parent().children(".warning").hide();
                if (showwarning) {
                    $("#" + id).parent().children(".serverwarning").hide();
                }
            }
            else {
                if (showwarning) {
                    returnvalue=false;
                    if (domain=='example.com') {
                        $("#" + id).parent().children(".warning").text("Geef uw website op. Uw emailadres moet behoren tot hetzelfde domein als uw website.");
                    }
                    else {
                        $("#" + id).parent().children(".warning").text("Een geldig emailadres is nodig. Uw emailadres moet eindigen op '" + domain + "'.");
                    }
                    $("#" + id).parent().children(".warning").show();
                }
            }
        }
        else if (id=='conditionscb') {
            if (value) { 
                $("#" + id).parent().children(".warning").hide();
                $("#" + id).parent().children(".serverwarning").hide();
            }
            else { 
                if (showwarning) {
                    returnvalue=false;
                    $("#" + id).parent().children(".warning").show();
                }
            }
        }
        else if (id=='internetaddress') {
            if (value.indexOf("://")>-1) {
                $("#" + id).val(value.substring(value.indexOf("://")+3));
            }  
        }
    }
    return returnvalue;
}

function emailCheck (emailStr) {
    // based upon http://javascript.internet.com/
    var emailPat=/^(.+)@(.+)$/
    var specialChars="\\(\\)<>@,;:\\\\\\\"\\.\\[\\]"
    var validChars="\[^\\s" + specialChars + "\]"
    var quotedUser="(\"[^\"]*\")"
    var atom=validChars + '+'
    var word="(" + atom + "|" + quotedUser + ")"
    var userPat=new RegExp("^" + word + "(\\." + word + ")*$")
    var domainPat=new RegExp("^" + atom + "(\\." + atom +")*$")

    var matchArray=emailStr.match(emailPat)
    if (matchArray==null) {
        return false
    }
    var user=matchArray[1]
    var domain=matchArray[2]
    if (user.match(userPat)==null) {
        return false
    }
    var domainArray=domain.match(domainPat)
    if (domainArray==null) {
        return false
    }
    var atomPat=new RegExp(atom,"g")
    var domArr=domain.match(atomPat)
    var len=domArr.length
    if (domArr[domArr.length-1].length<2 ||
        domArr[domArr.length-1].length>4) {
        return false
    }
    if (len<2) {
        return false
    }
    return true;
}
function initForms() {
    // voor elk input
    $("input, select").each(function(i){
        var inputid= $(this).attr("id");
        if (inputid.length>0) {
            updateForm(inputid,false);
        }
        if (inputid=='sbi1sl') {
            $(this).unbind('change').bind('change', function() {
                // ververs sbicodesl
                var jsparameters = new Object();
                jsparameters.sbicodestart = $("#sbi1sl").val();
                jsparameters.currentsbicode = $("#currentsbicode").val();
                jsparameters.javafunction = "selectSBIUpdate";
                jsparameters.returncall = "selectSBIUpdate";
                retreiveData(jsparameters);
                updateForm(this.id,true); // geeft niet direct foutmeldingen
            });
        }
        else {

            $(this).unbind('change').bind('change', function() {
                var inputid= $(this).attr("id");
                if (inputid.length>0) {
                    updateForm(inputid,false); // geeft niet direct foutmeldingen
                }
            });
        }
    });

    // voor elk fomulier bind aan submit functie
    $("form").each(function(i){
        var formid= $(this).attr("id");
        if (formid.length>0) {
            $("#" + formid).unbind('submit').submit(function(event){
                // Do something when the form is submitted.    });
                submitForm(formid, event);
            });
        }
    });
}

function submitForm(id, event) {
    
    //    var temp = "";
    //    var url = "http://www.boekenliefde.nl/sdfsdf/help.html";
    //temp = temp + url + " - " + getDomain(url) + "\n";    
    //    url = "https://www.boekenliefde.nl/sdfsdf/help.html";
    //temp = temp + url + " - " + getDomain(url) + "\n";    
    //    url = "www.boekenliefde.nl/sdfsdf/help.html";
    //temp = temp + url + " - " + getDomain(url) + "\n";    
    //    url = "boekenliefde.nl/sdfsdf/help.html";
    //temp = temp + url + " - " + getDomain(url) + "\n";    
    //    url = "boekeefde.uk/sdfsdf/help.html";
    //temp = temp + url + " - " + getDomain(url) + "\n";    
    //    url = "boekeefde.co.uk/sdfsdf/help.html";
    //temp = temp + url + " - " + getDomain(url) + "\n";    
    //    url = "boekeefdeuk/sdfsdf/help.html";
    //temp = temp + url + " - " + getDomain(url) + "\n";    
    //alert(temp);
    //   alert("submitform " + id + " - " + event);
    var submitok=true;
    $("#" + id).find("input, select").each(function(i){
        var inputid= $(this).attr("id");
        if (inputid.length>0) {
            var inputok= updateForm(inputid,true);
            if (!inputok) {
                //                                alert(inputid);
                submitok=false;
            }
        }
    });
    if (!submitok) {
        event.preventDefault();
    }
}

function selectSBIUpdate(javaresult) {
    // processresultmode
    if (javaresult.resultcode==1) {
        $("#sbicodesl").replaceWith(javaresult.newsbicodesl);
        updateForm("sbicodesl", false); 
    }
}

function getDomain(url) {
    var domain='example.com';
    var result = url;
    if (result.indexOf("://")>-1) {
        result = result.substring(result.indexOf("://")+3);
    }
    if (result.indexOf("/")>-1) {
        result = result.substring(0, result.indexOf("/"));
    }
    var domainparts = result.split(".");
    var parts = domainparts.length;
    if (parts>1) {
        if (domainparts[parts-1]=='uk') {
            if (parts>2) {
                domain = domainparts[parts-3]+"."+domainparts[parts-2]+"."+domainparts[parts-1];
            }
        }
        else {
            domain = domainparts[parts-2]+"."+domainparts[parts-1];
        }
    }
    return domain;
}

function endsWith(str, suffix) {
    return str.indexOf(suffix, str.length - suffix.length) !== -1;
}

