//variable to store hidden frame
var printingHiddenFrame;

//on load, create a hidden frame for printing the map
dojo.addOnLoad(function() {
    console.debug("creating the printing stuff");
    printingHiddenFrame = document.createElement("iframe");
    printingHiddenFrame.src = "hiddenframe.html";
    dojo.style(printingHiddenFrame, "display", "none");
    dojo.body().appendChild(printingHiddenFrame);
    console.debug("finished creating the printing stuff");
});

//serialize the map's state and call layout.* through iframe
function printQuickReport(pid) {

 
    var state = {
        map: getMapState(map),
        height: 440,
        width: 660,
        pid: pid,
        scale: getMapScale(map.extent),
        searchURL: parcelSearchLayerURL
    }


    var iframeDocument = dojo.isIE ? printingHiddenFrame.contentWindow.document : printingHiddenFrame.contentDocument;
    iframeDocument.getElementById("appState").value = dojo.toJson(state);
    iframeDocument.getElementById("form").submit();
}

//serialize the map's state and call layout.* through iframe
function printMap() {


    var state = {
        map: getMapState(map),
        height: 600,
        width: 900,
        pid: -1,
        scale: getMapScale(map.extent)
    }

    var pidwrapper = "<div></div>"

    var iframeDocument = dojo.isIE ? printingHiddenFrame.contentWindow.document : printingHiddenFrame.contentDocument;
    iframeDocument.getElementById("appState").value = dojo.toJson(state);
    iframeDocument.getElementById("form").submit();
}

//serialize the map's state and call layout.* through iframe
function exportMap() {

    var showAdjoinersPoints = adjoinerPointGraphics.visible;

    if (showAdjoinersPoints)
        adjoinerPointGraphics.hide();

    bulletGraphics.hide();
    parcelGraphics.hide();

    var mapState = getMapState(map)

    var state = {
        layers: dojo.toJson(mapState.layers),
        extent: map.extent.toJson(),
        graphics: dojo.toJson(mapState.graphics),
        height: 600,
        width: 800,
        scale: getMapScale(map.extent) * 12
    }

    var iframeDocument = dojo.isIE ? printingHiddenFrame.contentWindow.document : printingHiddenFrame.contentDocument;
    iframeDocument.getElementById("mapState").value = dojo.toJson(state);
    iframeDocument.getElementById("exportImage").submit();

    bulletGraphics.show();
    parcelGraphics.show();

    if (showAdjoinersPoints)
        adjoinerPointGraphics.show();
    
}

function printMeasureReport() {


    var text = dojo.byId("measure-results").innerHTML;
    var state = {
        map: getMapState(map),
        pid: -1
    }

    var iframeDocument = dojo.isIE ? printingHiddenFrame.contentWindow.document : printingHiddenFrame.contentDocument;
    iframeDocument.getElementById("appState").value = dojo.toJson(state);
    iframeDocument.getElementById("form").submit();


}


function getMapScale(extent) {

    var xmin = extent.xmin;
    var ymin = extent.ymin;
    var xmax = extent.xmax;
    var ymax = extent.ymax;

    var dpi = 96;
    var w = map.width / dpi;
    var h = map.height / dpi;

    var mapH = map.extent.getHeight();
    var mapW = map.extent.getWidth();

    var distanceOnMap = Math.sqrt((w * w) + (h * h));
    var distanceOnGround = Math.sqrt((mapH * mapH) + (mapW * mapW));
    var scale = distanceOnGround / distanceOnMap;
    return scale.toFixed(0);

}

//serialize map state into JSON
// {
//   extent: <Object, { xmin, ymin, xmax, ymax, spatialReference }>,
//   layers: <Object[], layer JSON>,
//   graphics: <Object[], { geometry, symbol, attributes, template }>
// }
function getMapState(m) {
    var layerStates = [], graphicsState = []
    //serialize each layer's state
    dojo.forEach(m.layerIds, function(layerId) {
	var gl = m.getLayer(layerId);
        if (gl.visible) 
            layerStates.push(getLayerState(gl)); 
    });

    // first add the main graphic layer to the map...
    graphics = m.graphics.graphics;
    for (var i = graphics.length - 1; i >= 0; i--) {

        try {
            var g = graphics[i];
            if (g.geometry != null) {
                var gclone = new esri.Graphic(g.geometry, g.symbol);
                graphicsState.push(gclone.toJson());
            }
        } catch (Error) {
            console.warn("error serializing graphic...", Error);
        }    
        
    };


    var graphicLayers = map.graphicsLayerIds;
    console.debug(graphicLayers);
    dojo.forEach(graphicLayers, function(layerId) {
        var gl = map.getLayer(layerId);
        console.debug(layerId);
        if (gl != null) {
            //serialize graphics from last to first to retain graphics drawing order
            graphics = gl.graphics;

            if (gl.visible) {
                for (var i = graphics.length - 1; i >= 0; i--) {

                    try {
                        var g = graphics[i];
                        console.debug(g);
                        if (g.geometry != null) {
                            var gclone = new esri.Graphic(g.geometry, g.symbol);
                            graphicsState.push(gclone.toJson());
                        }
                    } catch (Error) {
                        console.warn("error serializing graphic...", Error);
                    }
                };
            }
        }
    });

    return {
        extent: m.extent.toJson(),
        layers: layerStates,
        graphics: graphicsState
    };
}

//return layer state as JSON
// {
//   id: <String>,
//   type: <String, class name>,
//   url: <String>,
//   visible: <Boolean>,
//   opacity: <Number>,
//   layerDefs: <String[], id:def>,
//   layers: <Number[]>
// }
function getLayerState(layer) {
    return {
        id: layer.id,
        type: layer.declaredClass,
        url: layer.url,
        visible: layer.visible,
        opacity: layer.opacity,
        layerDefs: layer.layerDefinitions,
        layers: layer.visibleLayers
    };
}


function printFeatureMap(pid, templateName) {

    showTaskProcessing();

    dojo.xhrGet({
        url: "./WebService.asmx/printFeatureMap?pid='" + pid + "'&template='" + templateName + "'",
        handleAs: "json",
        contentType: "application/json; charset=utf-8",
        load: function(data, args) {
            dismissTaskProcessing();
            console.debug(data);
            var url = data.d;
            console.debug(url);
            searchWin = window.open(url, "PrintMap");
            if (searchWin.opener == null)
                searchWin.opener = self;
        },
        error: function(error, args) {
            console.debug(error);
            showTaskResults("<p style='color:red'>error! " + error.message + "</p>");
        }
    });

}

//function showPrintableMapProducts(pid) {
//    hideTaskProcessing();
//    var s = [];
//    s.push("<div class=\"gray\" style=\"width:200px;height:200px;\">");
//    s.push("<table width=\"90%\" cellspacing=\"2\" cellpadding=\"2\"><tbody><tr>");

//    s.push(createPrintNode(pid, "landscape_bw", "Landscape - Black & White", "Parcel lines w/ dimensions", false, false));
//    s.push(createPrintNode(pid, "landscape_ap", "Landscape w/ Aerial Photos", "Parcel lines w/ dimensions", true, true));

//    // end the main table
//    s.push("</tbody></table>");

//    dojo.style(dojo.byId("taskResults"), { "display": "block" });
//    dojo.byId("taskResults").innerHTML = s.join("");
//    dijit.byId("taskProcessing").show();
//}

//function createPrintNode(pid, layoutName, title, description, color, photos) {
//    try {
//        var p = [];
//        cmd = "printFeatureMap('" + pid + "','" + layoutName + "');";
//        p.push("<tr><td width=\"100%\">");
//        p.push("<div style=\"background-color:white;margin:5px\" onmousedown=\"" + cmd + "\" onmouseover=\"this.style.borderStyle='inset'\" onmouseout=\"this.style.borderStyle='none'\">");
//        p.push("<table width=\"100%\"><tbody><tr><td align=\"top\"><img src=\"images/details2/layout.png\"></td>");
//        p.push("<td><b>" + title + "</b></td></tr>");
//        p.push("<tr><td colspan=\"2\" class=\"description\">" + description + "</td></tr>");
//        p.push("<tr><td colspan=\"2\" class=\"description\">In Color: " + (color == true ? "Yes" : "No") + "</td></tr>");
//        p.push("<tr><td colspan=\"2\" class=\"description\">Aerial Photos: " + (photos == true ? "Yes" : "No") + "</td></tr>");
//        p.push("</td></tr></tbody></table></div></td></tr>");

//        return p.join("");
//    } catch (Error) {
//        return "<tr><td>Error creating printing option node: " + Error.message + "</td></tr>";
//    }
//}