//variable to store hidden frame
var printingHiddenFrame;
var g_Print_AtrribList = "";
var g_Print_AtrribList2 = "";

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

//serialize the map's state and call layout.* through iframe
function printMap(m) {
  var state = {
    map: getMapState(m)
  }
  //alert(dojo.toJson(state));
  var iframeDocument = dojo.isIE ? printingHiddenFrame.contentWindow.document : printingHiddenFrame.contentDocument;
  iframeDocument.getElementById("appState").value = dojo.toJson(state);
  iframeDocument.getElementById("txtAttribs").value = g_Print_AtrribList;
  iframeDocument.getElementById("txtAttribs2").value = g_Print_AtrribList2;
  //iframeDocument.getElementById("legendImg").value = vLegendList;
  iframeDocument.getElementById("Printform").submit();

  g_Print_AtrribList = "";
  g_Print_AtrribList2 = "";
  iframeDocument.getElementById("txtAttribs").value = "";
  iframeDocument.getElementById("txtAttribs2").value = "";  
}

//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 = [], 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());
  };
  
  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
  };
}

