//variable to store hidden frame
//var printingHiddenFrame;
var mS, mPID

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

//serialize the map's state and call layout.* through iframe
function printMapHTML(m, pID) {
  var state = {
    map: getMapState(m)
  }
  if (pID == null) pID = "";
  mS = state;
  mPID = pID;
  
  var printingHiddenFrame = document.getElementById('iframePrintMap');
  printingHiddenFrame.src = "Dialogs/_blank.htm";
  printingHiddenFrame.src = "printing/hiddenframe.html";
}

function submitPrint()
{  
  var printingHiddenFrame = document.getElementById('iframePrintMap');
  var iframeDocument = dojo.isIE ? printingHiddenFrame.contentWindow.document : printingHiddenFrame.contentDocument;
  iframeDocument.getElementById("appState").value = dojo.toJson(mS);
  iframeDocument.getElementById("propID").value = mPID;
  mS = "";
  mPID = "";
  
  var frm = iframeDocument.getElementById("printForm");
  frm.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) {
  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
  };
}

