﻿//variable to store hidden frame
var printingHiddenFrame;
var printTitle;
var printSubtitle;
var printNotes;

//on load, create a hidden frame for printing the map
dojo.addOnLoad(function() {
  printingHiddenFrame = document.createElement("iframe");
  printingHiddenFrame.src = "hiddenframe.html";
  dojo.style(printingHiddenFrame, "display", "none");
  dojo.body().appendChild(printingHiddenFrame);
});

function loadPrintTemplates(ctl) {
    //debugger;
    //define the print templates
    var printTemplates = new Array();
    printTemplates = [{"name":"Letter - Portrait",
                       "layout":"./PrintTemplates/LetterPortrait.aspx"
                      },
                      {"name":"Letter - Landscape",
                       "layout":"./PrintTemplates/LetterLandscape.aspx"
                      },
                      {"name":"Legal - Portrait",
                       "layout":"./PrintTemplates/LegalPortrait.aspx"
                      },
                      {"name":"Legal - Landscape",
                       "layout":"./PrintTemplates/LegalLandscape.aspx"
                      },
                      {"name":"Tabloid - Portrait",
                       "layout":"./PrintTemplates/TabloidPortrait.aspx"
                      },
                      {"name":"Tabloid - Landscape",
                       "layout":"./PrintTemplates/TabloidLandscape.aspx"
                      }
                     ];

    var lBox = document.getElementById(ctl)

    for (var i=0, il=printTemplates.length; i<il; i++) {
        var template = printTemplates[i];
        if (template != null) {
            var y = document.createElement('option');
            y.text = template.name;
            y.value = template.layout;
            lBox.add(y);
        }
    }     
}

//serialize the map's state and call layout.* through iframe
function printMap(m) {
    printTitle = dojo.byId("txtPrintTitle").value;
    printSubtitle = dojo.byId("txtPrintSubtitle").value;
    printNotes = dojo.byId("txtPrintNotes").value;    
    printTemplate = dojo.byId("selPrintTemplate").value;
        
    var state = {
        map: getMapState(m)
    }

    var iframeDocument = dojo.isIE ? printingHiddenFrame.contentWindow.document : printingHiddenFrame.contentDocument;
    iframeDocument.getElementById("appState").value = dojo.toJson(state);
    
    //iframeDocument.getElementById("form").action = "http://kgis-bml/TestJSPrint/PrintTemplates/A_Size_Portrait.aspx";

    //form action will be set dynamically based on the template selected by the user
    iframeDocument.getElementById("form").action = printTemplate;
    iframeDocument.getElementById("form").submit();
}

//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) {
    //debugger;
    var layerStates = [], graphicsState = [], graphics = m.graphics.graphics;

    //serialize each layer's state
    dojo.forEach(m.layerIds, function(layerId) {
        layerStates.push( getLayerState(m.getLayer(layerId)) );
    });

    //serialize graphics from last to first to retain graphics drawing order
    for (var i=graphics.length-1; i>=0; i--) {
        graphicsState.push(graphics[i].toJson());
    };

    //get various map properties - scale and center for calculating the required extent
    var mapScale = getMapScale();
    var xCenter = Math.round(m.extent.xmin + ((m.extent.xmax - m.extent.xmin) / 2));
    var yCenter = Math.round(m.extent.ymin + ((m.extent.ymax - m.extent.ymin) / 2));

    return {
        extent: m.extent.toJson(),
        layers: layerStates,
        graphics: graphicsState,
        scale: mapScale,
        x: xCenter,
        y: yCenter,
        title: printTitle,
        subtitle: printSubtitle,
        notes: printNotes
    };
}

function getMapScale() {   
    var mapLevel = map.getLevel();        
    var layer = map.getLayer(map.layerIds[0]);
    var mapScale = layer.tileInfo.lods[mapLevel].scale; 

    return mapScale;
}

//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
  };
}

