﻿var map = null;
var geocoder = null;
var tmpAddress = null; 
var featureDiv;  
var options = {};
var maplayers = "cottonmap_2011";
var map_canvas = null;
var leftDiv = null;
var contentDiv = null;
var manageDiv = null;
var msgDiv = null;
var overlayOpacity = 1.0;
var mapserverOverlay;
var msgTimeout;
var groupArray = new Array();
var currentGroup = 0;

pageLoad = function () {   
    if (GBrowserIsCompatible()) { 
        var lat = -25;
        var lon  = 146;
        var zoom = 5;
        var maptype = G_HYBRID_MAP;   
         
        if (GetParam("lat") != "")  lat = parseFloat(GetParam("lat"));  
        if (GetParam("lon") != "")  lon = parseFloat(GetParam("lon"));
        if (GetParam("zoom") != "")  zoom = parseFloat(GetParam("zoom"));
        if (GetParam("mt") != "") {
            switch (GetParam("mt").toLowerCase())
            {
                case "map": maptype = G_NORMAL_MAP ; break;
                case "satellite": maptype = G_SATELLITE_MAP ; break;
                case "hybrid": maptype = G_HYBRID_MAP; break;
                case "terrain": maptype = G_PHYSICAL_MAP ; break;
            }        
        }
        
        //config
        if (!map_canvas) map_canvas = $get("map_canvas");
        if (!leftDiv) leftDiv = $get("left");
        if (!contentDiv) contentDiv = $get("content"); 
        if (!manageDiv) manageDiv = $get("management");   
            
        //load google maps            
        map = new GMap2(map_canvas);  
        map.setCenter(new GLatLng(lat,lon), zoom);  
        map.setUIToDefault();
        map.setMapType(maptype);  
        //geocoder = new GClientGeocoder();  
        updateOverlay();
        featureDiv = $get("featureDiv");
        GEvent.addListener(map, "moveend", mapMoveEndHandler);   
        CheckCurrentUser();     
    }      
};

pageUnload = function () {
    //unload google maps
    GUnload();
};

mapMoveEndHandler = function () {
    hideLinkBox();
    hideSendBox();
};

getMapservUrl = function () {
    var mapservurl = $get("mapservurl");
    var mapserv;

    if (mapservurl) {
        mapserv = mapservurl.value;
        mapserv += "&layers=" + maplayers + "&";
        mapserv += "mode=tile&";
        mapserv += "tilemode=gmap&";
        mapserv += "tile={X}+{Y}+{Z}";
    }
    return mapserv;
};

getWebsiteUrl = function () {
    var websiteurl = $get("websiteurl")    
    
    if(websiteurl)
    {        
        return websiteurl.value;
    }
    else
    {
        return null;
    }
};

toggleOverlay = function (maplayer) {       
    
    //remove it
    var layers = maplayers.split(" ");
    var found = false;
    
    maplayers = "";    
    for(var i = 0; i < layers.length; i++)
    {           
        if (layers[i] != maplayer)
        {
            maplayers += layers[i] + " ";   
        }
        else
        {
            found = true;
        }
    }
    if(!found)
    {
        //does not exist, add it
        maplayers += " " + maplayer;
    } 
          
    updateOverlay();
};

reduceOpacity = function(){
    if(overlayOpacity > 0)
    {
        overlayOpacity -= 0.1;
    }
    updateOverlay();
};

increaseOpacity = function(){
    if(overlayOpacity < 1)
    {
        overlayOpacity += 0.1;
    }
    updateOverlay();
};

updateOverlay = function () {      
    if(mapserverOverlay) map.removeOverlay(mapserverOverlay);                     
    myLayer = new GTileLayer(null,null,null,
             {
              tileUrlTemplate:getMapservUrl(),
              isPng:true,
              opacity:overlayOpacity
             }
            );   
    mapserverOverlay = new GTileLayerOverlay(myLayer); 
    map.addOverlay(mapserverOverlay);
};

showDigitiseTools = function () {
    if (!leftDiv) leftDiv = $get("left");
    if (!contentDiv) contentDiv = $get("content");
    var c = map.getCenter();   
    CheckSaveLink();
    StopDrawing();
    leftDiv.style.display = "block";
    contentDiv.style.width = "800px";
    map.checkResize();
    map.panTo(c); 
    LoadCurrentUserPolygons();
    hidePopups();
};

hideDigitiseTools = function () {
    if (!leftDiv) leftDiv = $get("left");
    if (!contentDiv) contentDiv = $get("content");    
    ClearPolygons(); 
    var c = map.getCenter();
    leftDiv.style.display = "none";
    contentDiv.style.width = "1000px";
    map.checkResize();
    map.panTo(c);   
};

showManageTools = function () {
    if (!manageDiv) manageDiv = $get("management");
    ClearGroups();
    DrawFieldList();
    LoadManagementTable();
    manageDiv.style.display = "block";
    CheckManageLinks();
    showDigitiseTools();
    LoadFlagFieldsTable();
};

hideManageTools = function () {
    if (!manageDiv) manageDiv = $get("management");
    ClearPolygons(); 
    $get("revertDataLink").style.display = "none";
    $get("approveDataLink").style.display = "none";
    $get("denyDataLink").style.display = "none"; 
    manageDiv.style.display = "none";
    hideDigitiseTools();
};

showMessage = function (text, type) {
    var messageText = $get("messageText");
    if (!msgDiv) msgDiv = $get("messages"); 
    if (!msgDiv)  return;
       
    msgDiv.style.display = "block";   
    
    if (type==2)
    {
        messageText.style.color = "Red";
    }
    else
    {
        messageText.style.color = "Black";
    }
    
    messageText.innerHTML = text;
    clearTimeout(msgTimeout);
    msgTimeout = setTimeout("hideMessage()", 5000);
};

hideMessage = function () {
    if (!msgDiv) msgDiv = $get("messages");    
    msgDiv.style.display = "none"; 
};

getCurrentMapLink = function (page) {
    var c = map.getCenter();
    var z = map.getZoom();
    var mt = map.getCurrentMapType();   
    
    return page + "?lat=" + c.lat() + "&lon=" + c.lng() + "&zoom=" + z + "&mt=" + mt.getName(); 
};

printMap = function () {
    var c = map.getCenter();
    var z = map.getZoom();    
    window.open (getCurrentMapLink("PrintMap.aspx") ,"mywindow"); 
};

hidePopups = function () {
    hideSendBox();
    hideLinkBox();
    hideInfo();
    hideSearchHelp();
    hideFlagBox();
    hideDigitiseHelp();
    hideSaveData();
};

showInfo = function () {
     var iDiv = $get("infoPopupDiv");
     hidePopups();
     iDiv.style.display = "block"; 
};

hideInfo = function () {
     var iDiv = $get("infoPopupDiv");
     iDiv.style.display = "none";
};

showSaveData = function () {
     var iDiv = $get("saveDataPopupDiv");
     hidePopups();
     iDiv.style.display = "block"; 
 };

hideSaveData = function () {
    var iDiv = $get("saveDataPopupDiv");
    iDiv.style.display = "none";
};

showSearchHelp = function () {
     var hDiv = $get("helpPopupDiv");
     hidePopups();
     hDiv.style.display = "block";    
};

hideSearchHelp = function () {
     var hDiv = $get("helpPopupDiv");
     hDiv.style.display = "none";
};

sendMap = function () {
   
    var sDiv = $get("sendPopupDiv");
    var tb = $get("sendMsgTa");
    var sendMailCopyCb = $get("sendMailCopyCb");
    var emailToTb = $get("emailToTb");
    var emailFromTb = $get("emailFromTb");       
    var emailToError = $get("emailToError");
    var emailFromError = $get("emailFromError");
    
    hidePopups();
    sendMailCopyCb.checked = true;
    emailToError.style.display = "none";
    emailFromError.style.display = "none";
    emailToTb.value = "";
    emailFromTb.value = "";
    tb.value = "Please view this map at CottonMap. Link: " + getWebsiteUrl() + getCurrentMapLink("/Map.aspx");    
    sDiv.style.display = "block";
};

hideSendBox = function () {
    var sDiv = $get("sendPopupDiv");   
    if(sDiv) sDiv.style.display = "none";
};

sendEmail = function () {
    
    var emailToTb = $get("emailToTb");
    var emailFromTb = $get("emailFromTb");
    var sendMsgTa = $get("sendMsgTa");
    var sendMailCopyCb = $get("sendMailCopyCb");    
    var emailToError = $get("emailToError");
    var emailFromError = $get("emailFromError");
    
    //check required fields
    if (emailToTb.value == "") emailToError.style.display = "inline";
    if (emailFromTb.value == "") emailFromError.style.display = "inline";
    
    //quit function if values incorrect
    if ((emailToTb.value == "") || (emailFromTb.value == "")) return;
    
    //email command
    CommonService.EmailMapLink(emailToTb.value, emailFromTb.value, sendMsgTa.value, sendMailCopyCb.checked, emailMapLinkCallback);
};

emailMapLinkCallback = function () {
    hideSendBox();
};

linkMap = function () {  
    var lDiv = $get("linkPopupDiv");
    var tb = $get("mapLinkTb");    
    hidePopups();    
    tb.value = getWebsiteUrl() + getCurrentMapLink("/Map.aspx");    
    lDiv.style.display = "block";
    tb.select();
};

hideLinkBox = function () {
    var lDiv = $get("linkPopupDiv");   
    if(lDiv) lDiv.style.display = "none";
};

showDigitiseHelp = function () {
    var digitiseHelpPopupDiv = $get("digitiseHelpPopupDiv");
    hidePopups();
    if (digitiseHelpPopupDiv) digitiseHelpPopupDiv.style.display = "block";
};

hideDigitiseHelp = function () {
  
    var digitiseHelpPopupDiv = $get("digitiseHelpPopupDiv");
    if (digitiseHelpPopupDiv) digitiseHelpPopupDiv.style.display = "none";
};

flagMode = function () {
    var fDiv = $get("flagPopupDiv");
    hidePopups();   
    FlagModeOn();
    if (fDiv) fDiv.style.display = "block";
};

hideFlagBox = function () {
    var fDiv = $get("flagPopupDiv");
    if (fDiv) fDiv.style.display = "none";
    FlagModeOff();

    var ffContactEmailInput = $get("ffContactEmailInput");
    var ffRelationshipInput = $get("ffRelationshipInput");
    var ffDescriptionInput = $get("ffDescriptionInput");
    var ffContactEmailError = $get("ffContactEmailError");
    var ffRelationshipError = $get("ffRelationshipError");
    var ffDescriptionError = $get("ffDescriptionError");
    var ffFieldsError = $get("ffFieldsError");

    ffContactEmailInput.value = "";
    ffRelationshipInput.value = "";
    ffDescriptionInput.value = "";
    ffContactEmailError.style.display = "none";
    ffRelationshipError.style.display = "none";
    ffDescriptionError.style.display = "none";
    ffFieldsError.style.display = "none";
};

completeFlagFields = function () {
    var ffContactEmailInput = $get("ffContactEmailInput");
    var ffRelationshipInput = $get("ffRelationshipInput");
    var ffDescriptionInput = $get("ffDescriptionInput");
    var ffContactEmailError = $get("ffContactEmailError");
    var ffRelationshipError = $get("ffRelationshipError");
    var ffDescriptionError = $get("ffDescriptionError");
    var ffFieldsError = $get("ffFieldsError");

    ffContactEmailError.style.display = "none";
    ffRelationshipError.style.display = "none";
    ffDescriptionError.style.display = "none";
    ffFieldsError.style.display = "none";
    
    //check required fields
    if (ffContactEmailInput.value == "") ffContactEmailError.style.display = "inline";
    if (ffRelationshipInput.value == "") ffRelationshipError.style.display = "inline";
    if (ffDescriptionInput.value == "") ffDescriptionError.style.display = "inline";
    if (flagArray.length == 0) ffFieldsError.style.display = "inline";

    //quit function if values incorrect
    if ((ffContactEmailInput.value == "") || (ffRelationshipInput.value == "") || (ffDescriptionInput.value == "") || (flagArray.length == 0)) return;

    CommonService.FlagFields(ffContactEmailInput.value, ffRelationshipInput.value, ffDescriptionInput.value, flagArray[0].getLatLng().lat(), flagArray[0].getLatLng().lng(), FlagFieldsCallback);               
    
};

FlagFieldsCallback = function (success) {
    if (success) {
        hideFlagBox();
        showMessage("Flag mistake request has been sent.");
    }
    else {
        showMessage("Error occurred when sending flagged fields information.",2);
    }
};

ClearGroups = function () {
    groupArray = new Array();
    currentGroup = 0;
};

CreateGroup = function () {
    var groupDiv = $get("groupDiv");

    if (groupArray.length > 4) {
        showMessage("Error: You have reached the maximum amount of groups.", 2);
    }
    else {
        var groupBehaviour = $find("groupBehaviour");
        var groupPopupCloseLink = $get("groupPopupCloseLink");
        var groupNameInput = $get("groupNameInput");
        var groupPopupCancelLink = $get("groupPopupCancelLink");

        $clearHandlers(groupPopupCloseLink);
        $addHandler(groupPopupCloseLink, 'click', function () { CreateGroupPopupClose(-1); });

        $clearHandlers(groupPopupCancelLink);
        $addHandler(groupPopupCancelLink, 'click', function () { GroupPopupCancel(); });

        $clearHandlers(groupNameInput);
        $addHandler(groupNameInput, 'keypress', function (e) { GroupPopupKeyPress(e, -1) });

        groupBehaviour.show();       
    }
};

EditGroup = function (index) {
    var groupNameInput = $get("groupNameInput");
    var groupBehaviour = $find("groupBehaviour");
    var labelGroupNameError = $get("labelGroupNameError");
    var groupPopupCloseLink = $get("groupPopupCloseLink");
    var groupPopupCancelLink = $get("groupPopupCancelLink");

    groupNameInput.value = groupArray[index];

    $clearHandlers(groupPopupCloseLink);
    $addHandler(groupPopupCloseLink, 'click', function () { CreateGroupPopupClose(index); });

    $clearHandlers(groupPopupCancelLink);
    $addHandler(groupPopupCancelLink, 'click', function () { GroupPopupCancel(); });

    $clearHandlers(groupNameInput);
    $addHandler(groupNameInput, 'keypress', function (e) { GroupPopupKeyPress(e, index) });

    groupBehaviour.show();    
};

GroupPopupKeyPress = function (e, index) {
    if (e) {
        if (e.charCode == 13) CreateGroupPopupClose(index);
    } else {
        if (event.keyCode == 13) CreateGroupPopupClose(index);
    }
};

CreateGroupPopupClose = function (index) {
    var groupNameInput = $get("groupNameInput");
    var groupBehaviour = $find("groupBehaviour");
    var labelGroupNameError = $get("labelGroupNameError");

    if (groupNameInput.value != "") {
        if (index > -1) {
            groupArray[index] = groupNameInput.value;
            SelectGroup(index);
        }
        else {
            groupArray.push(groupNameInput.value);
            SelectGroup(groupArray.length - 1);
        }
        groupBehaviour.hide();
        labelGroupNameError.style.display = "none";
        groupNameInput.value = "";
    }
    else {
        labelGroupNameError.style.display = "";
    }

};

GroupPopupCancel = function () {
    var groupNameInput = $get("groupNameInput");
    var groupBehaviour = $find("groupBehaviour");
    var labelGroupNameError = $get("labelGroupNameError");


    groupBehaviour.hide();
    labelGroupNameError.style.display = "none";
    groupNameInput.value = "";
};

SelectGroup = function (index) {
    if (index >= 0 && index < groupArray.length) {
        currentGroup = index;
        DrawFieldList();
        ZoomToGroup(index);
    }
};

DeleteGroup = function (index) {
    if (confirm("Really delete group and all fields it contains?")) {
        groupArray.splice(index, 1);

        //update fields if in that group
        for (var i = 0; i < curPolygons.length; i++) {
            if (curPolygons[i].group == index) {
                DeletePolygon(i);
            }
            else {
                if (curPolygons[i].group > index) {
                    curPolygons[i].group -= 1;
                }
            }
        }
        if (index > 0) {
            index -= 1;
        }
        else {
            index = 0;
        }
        SelectGroup(index);
    }
};

ZoomToGroup = function (group) {
    var bounds = new GLatLngBounds();
    var empty = true;

    for (var i = 0; i < curPolygons.length; i++) {
        if (curPolygons[i].group == group) {
            empty = false;
            for (var j = 0; j < curPolygons[i].poly.getVertexCount(); j++) {
                bounds.extend(curPolygons[i].poly.getVertex(j));
            }             
        }
    }
    if (!empty) {
        map.setZoom(map.getBoundsZoomLevel(bounds));
        map.setCenter(bounds.getCenter());
    }
};

DrawFieldList = function () {

    //clear current listing
    while (featureDiv.childNodes[0]) {
        featureDiv.removeChild(featureDiv.childNodes[0]);
    }

    if (currentGroup >= groupArray.length) {
        currentGroup = groupArray.length - 1;
    }

    for (var i = 0; i < groupArray.length; i++) {
        if (groupArray.length > 1) DrawGroup(groupArray[i], i);

        if (currentGroup == i) {
            for (var j = 0; j < curPolygons.length; j++) {
                if ((curPolygons[j].group == currentGroup) && (!curPolygons[j].deleted)) {

                    curPolygons[j].info = DrawField(curPolygons[j]);
                    AddHandlers(j);
                    AddPolygonToMap(curPolygons[j].poly);
                }
                else {
                    RemovePolygonFromMap(curPolygons[j].poly);
                }
            }
        }
    }

};

AddHandlers = function (index) {
    $addHandler(curPolygons[index].info.name, 'click', function () { ShowPolygonPopup(index) });
    $addHandler(curPolygons[index].info.color, 'click', function () { ChangePolygonColor(index) });
    $addHandler(curPolygons[index].info.rem, 'click', function () { DeletePolygon(index) });
};

DrawGroup = function (group, index) {
    var groupDiv = document.createElement("div");
    groupDiv.className = "groupDiv";
    featureDiv.appendChild(groupDiv);

    var groupCell = document.createElement("div");
    groupDiv.appendChild(groupCell);
    groupCell.innerHTML = group;

    if (currentGroup == index) {
        groupCell.className = "groupSelectedCell";
        groupCell.title = "Click to edit properties";
        $addHandler(groupCell, 'click', function () { EditGroup(index); });

        var removeCell = document.createElement("div");
        groupDiv.appendChild(removeCell);
        removeCell.className = "removeDiv";
        removeCell.title = "Click to delete item";
        $addHandler(removeCell, 'click', function () { DeleteGroup(index); });
    }
    else {
        groupCell.className = "groupCell";
        groupCell.title = "Click to select group";
        $addHandler(groupCell, 'click', function () { showMessage(groupCell.innerHTML + " selected ..."); SelectGroup(index); });
    }   

};

DrawField = function (pClass) {    
    var infoDiv = document.createElement("div");
    infoDiv.className = "infoDiv";

    var colorCell = document.createElement("div");
    infoDiv.appendChild(colorCell);
    colorCell.style.backgroundColor = pClass.color;
    colorCell.className = "colorDiv";
    colorCell.innerHTML = "&nbsp;";
    colorCell.title = "Click to change colour";

    var nameCell = document.createElement("div");
    infoDiv.appendChild(nameCell);
    nameCell.className = "nameDiv";
    nameCell.title = "Click to edit properties";
    nameCell.innerHTML = pClass.name;

    var removeCell = document.createElement("div");
    infoDiv.appendChild(removeCell);
    removeCell.className = "removeDiv";
    removeCell.title = "Click to delete item";

    var descriptionCell = document.createElement("div");
    infoDiv.appendChild(descriptionCell);
    descriptionCell.className = "descDiv";
    descriptionCell.innerHTML = "Area:&nbsp;" + Math.round(pClass.poly.getArea() / 10000) + "ha";

    featureDiv.appendChild(infoDiv);
    featureDiv.scrollTop = featureDiv.scrollHeight;
    
    return { div: infoDiv, color: colorCell, name: nameCell, rem: removeCell, desc: descriptionCell };
};

SearchFieldUser = function () {
    GEvent.addListener(map, "click", function (overlay, latlng) {
        SearchUserOfFieldAtLocation(overlay, latlng);
    });
    map.getDragObject().setDraggableCursor("help");
};

SearchUserOfFieldAtLocation = function (overlay, latlng) {
    GEvent.clearListeners(map, "click");
    map.getDragObject().setDraggableCursor("url(http://maps.gstatic.com/intl/en_us/mapfiles/openhand_8_8.cur)");
    CommonService.SearchUserOfFieldAtLocation(latlng.lat(), latlng.lng(), SearchUserOfFieldAtLocationCallback);
};

SearchUserOfFieldAtLocationCallback = function (result) {
    if (result) {
        showMessage("Account that created field was " + result);
    }
    else {
        showMessage("No user found", 2);
    }
};
