
function IMS2_PrintFrame(){
    var self = this;
    
    this.frame = null;
    this.results = null;
    this.mapctl = null;
    this.title = null;
    this.xmlReq = null;
    this.mapimg = null;
    this.legend = null;
    this.closeString = "[Close]";
    this.printString = "[Print]";
    this.pageScreen = null;
    
    function ClearFrame(){
        var f = self.frame;
        if(f){
            var p = f.parentNode;
            if(p){
                p.removeChild(f);
            }
            p = null;
        }
        f = null;
        self.frame = null;
    }
    this.ClearFrame = ClearFrame;
    
    function CreateFrame(p){
        self.ClearFrame();
        if(p){
            var doc = p.ownerDocument;
            if(doc){
                var f = doc.createElement("iframe");
                if(f){
                    if(p.childNodes.length > 0){
                        p.insertBefore(f,p.childNodes[0]);
                    }else{
                        p.appendChild(f);
                    }
                    self.frame = f;
                    return(self.frame);
                }
            }
        }
        return(null);
    }
    this.CreateFrame = CreateFrame;
    
    function GetDoc(){
        var f = self.frame;
        if(f){
            if(f.contentDocument){
                return(f.contentDocument);
            }else if(f.contentWindow){
                return(f.contentWindow.document);
            }else if(f.document){
                return(f.document);
            }
        }
        return(null);
    }
    this.GetDoc = GetDoc;
    
    function GetBody(){
        var d = self.GetDoc();
        if(d){
            var b = d.body;
            if(b){
                return(b);
            }
            else if(d.getElementsByTagName){
                b = d.getElementsByTagName("body");
                if(b){
                    if(b.length > 0){
                        return(b[0]);
                    }
                }
            }
        }
        return(null);
    }
    this.GetBody = GetBody;
    
    function GetHead(){
        var d = self.GetDoc();
        if(d){
            if(d.getElementsByTagName){
                var b = d.getElementsByTagName("head");
                if(b){
                    if(b.length > 0){
                        return(b[0]);
                    }
                }
            }
        }
        return(null);
    }
    this.GetHead = GetHead;
    
    function GetWin()
    {
        if(self.frame){
            return(self.frame.contentWindow);
        }
        return(null);
    }
    this.GetWin = GetWin;
    
    function Close()
    {
        if(self.frame)
        {
            self.frame.style["display"] = "none";
            self.ClearFrame();
        }
        if(self.pageScreen)
        {
            LightenPage();
        }
    }
    this.Close = Close;
    
    function CreatePrintSetup(r,m,t){
        self.results = r;
        self.mapctl = m;
        self.title = t;
        
        var doc = self.GetDoc();
        var b = self.GetBody();
        setTimeout(self._HandleCreatePrintSetup,100);
    }
    this.CreatePrintSetup = CreatePrintSetup;
    
    
    function _HandleCreatePrintSetup()
    {
        var doc = self.GetDoc();
        var b = self.GetBody();
        if(doc && b){
            
            doc.write("<html>");
            doc.write("<head><style type=\"text/css\" media=\"print\"> .printBar {display: none;overflow: auto;} .noPrintBorder{border: solid 0px #ffffff;} body{margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px;} #page{margin: 0px;}</style><style type=\"text/css\" media=\"screen\"> .printBar {display: normal; font-size: larger; font-weight: bold;} .noPrintBorder{border: dashed 1px #000000;overflow: auto;} body{margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px;} </style><link rel=\"Stylesheet\" type=\"text/css\" href=\"printstyle.css\" />");
            doc.write("<style type=\"text/css\">");
            doc.write(".resultsOddRow{background-color:#EEEDEA;font-family: Verdana, sans-serif;}");
            doc.write(".resultsEvenRow{background-color:#FFFFFF;font-family: Verdana, sans-serif;}");
            doc.write(".detailField{font-size: x-small;font-weight:bold;font-family: Verdana, sans-serif;padding:2px 5px 2px 5px;border-left: solid 1px #d7d5cd;border-right: solid 1px #d7d5cd;border-bottom: solid 1px #d7d5cd;cursor: default;}");
            doc.write(".detailData{font-size: x-small;font-family: Verdana, sans-serif;padding:2px 5px 2px 5px;border-left: solid 1px #d7d5cd;border-right: solid 1px #d7d5cd;border-bottom: solid 1px #d7d5cd;cursor: default;}");
            doc.write(".detailTable{border: solid 1px #d7d5cd;}");
            doc.write("body{margin: 0px 0px 0px 0px; padding: 0px 0px 0px 0px;}");
            doc.write("</style>");
            doc.write("</head>");
            doc.write("<body>"
            + "<div class=\"printBar\" style=\text-align: left;\"><span onclick=\";\" id=\"closebttn\" style=\"cursor: pointer;\">" + self.closeString + "</span></div>"
            + "<div><h1>Setup</h1><h2>" + self.title + "</h2></div>"
            + "<div>"
            + "<div><input type=\"radio\" name=\"scale\" id=\"env_cur\" value=\"env\" checked /> <label for=\"env_cur\">Print As Displayed</label></div>"
            + "<div><input type=\"radio\" name=\"scale\" id=\"scale_cur\" value=\"cur\" /> <label for=\"scale_cur\">Current Scale</label></div>"
            + "<div><input type=\"radio\" name=\"scale\" id=\"scale_spe\" value=\"spe\" /> <label for=\"scale_spe\">Custom <input type=\"text\" name=\"scale_custom\" id=\"scale_custom\" value=\"1:\" /></label></div>"
            + "<div><input type=\"button\" name=\"generate_bttn\" id=\"generate_bttn\" value=\"Generate\"></div>"
            + "</div>"
            + "</body>");
            doc.write("</html>");
            var bttn = doc.getElementById('generate_bttn');
            bttn["printObj"] = self;
            bttn["scale_cur"] = doc.getElementById('scale_cur');
            bttn["scale_spe"] = doc.getElementById('scale_spe');
            bttn["env_cur"] = doc.getElementById('env_cur');
            bttn["scale_custom"] = doc.getElementById('scale_custom');
            bttn["onclick"] = function(){this.printObj._Generate(this);};
            doc.getElementById("closebttn")["onclick"] = self.Close;
        }else{
            setTimeout(self._HandleCreatePrintSetup,100);
        }
    }
    this._HandleCreatePrintSetup = _HandleCreatePrintSetup;
    
    function _Generate(bttn)
    {
        if(bttn){
            var b = self.GetBody();
            var doMap = false;
            var doData = (self.results)?(true):(false);
            
            var scale_cur = bttn["scale_cur"];
            var scale_spe = bttn["scale_spe"];
            var env_cur = bttn["env_cur"];           
            var scale_custom = bttn["scale_custom"];
            
            var margin = 0.5;
            if(b){
                var marginAndUnit = 0 + "in";
                b.style["margin"] = marginAndUnit + " " + marginAndUnit + " " + marginAndUnit + " " + marginAndUnit;
            }
            var docw = 8.5 - (margin * (((document.all)&&(navigator.appVersion.indexOf("MSIE 7.")!=-1))?(2.0):(4.0)) );
            var doch = 11.0 - (margin * (((document.all)&&(navigator.appVersion.indexOf("MSIE 7.")!=-1))?(1.0):(3.0)) );
            
            if(self.mapctl && scale_cur && scale_spe && env_cur){
                var curScale = (scale_spe)?(true == (!scale_spe.checked)):(true);
                var scalevalpx = null;
                var curEnv = ((env_cur)?(true == env_cur.checked):(false));
                if(curEnv)
                {
                    ;// leave it as is
                }
                else
                {
                    if(curScale){
                        scalevalpx = self.mapctl.GetCurrentPxScale();
                    }else{
                        var match = scale_custom.value.match(/\s*(1\s*:)?\s*(\d*[.]?\d+)\s*/);
                        if(match && match.length > 0){
                            var val = parseFloat(match[match.length - 1]);
                            var unit = ((self.mapctl.unit && self.mapctl.unit != "")?(self.mapctl.unit):("meter"));
                            scalevalpx = IMS2_ConvertValueLengthUnit(val,"pixel",unit); 
                        }
                    }
                }
                var mapw = docw;
                var maph = doch;
                var descw = 0;
                var desch = 1.0;
                var titleh = 0.5;
                var legendw = 3.0;
                if(true){//if(!self.results){
                    var tmp = docw;
                    docw = doch;
                    doch = tmp;
                    mapw = docw - legendw;
                    maph = doch - desch - titleh;
                    descw = docw;
                }else{
                    mapw = docw;
                    maph = 4.5;
                    descw = docw;
                }
                var dpi = 96;//300.0;
                var mapxml = self.mapctl.RefreshFromServiceString(Math.floor(mapw * dpi),Math.floor(maph * dpi),scalevalpx);
                doMap = true;
            }
            var doc = self.GetDoc();
            if(b && doc){
                b.style["width"] = "" + docw + "in";
                var html = "";
                //html += "<style type=\"text/css\" media=\"print\"> .printBar {display: none;} </style>";
                //html += "<style type=\"text/css\" media=\"screen\"> .printBar {display: normal;} </style>";
                // html += "<link rel=\"Stylesheet\" type=\"text/css\" href=\"printstyle.css\" />";
                html += "<div class=\"printBar\" style=\"clear: right;\"><div style=\"text-align: right; float: right;\"><span onclick=\";\" id=\"printbttn\" style=\"cursor: pointer;\">" + self.printString + "</span></div><div style=\text-align: left;\"><span onclick=\";\" id=\"closebttn\" style=\"cursor: pointer;\">" + self.closeString + "</span></div></div>";
                html += "<div style=\"width:" + docw + "in;\">";
                // make a map
                if(doMap){
                    html += "<div><nobr><img src=\"images/county_seal.gif\" alt=\"County Seal\" align=\"ABSMIDDLE\" style=\"width: 0.5in;height: 0.5in;\"><input type=\"text\" value=\"Enter Title Here\" class=\"noPrintBorder\" style=\"font-size: 22pt; width: " + (docw-0.5) + "in;font-family:Tahoma;\" onclick=\"if(this.value='Enter Title Here'){this.value='';};\"/></nobr></div>";
                    var now = new Date();
                    html += "<div style=\"width: " + docw + "in;\" class=\"noPrintBorder\" style=\"font-family:Tahoma;font-size:smaller;font-weight:bold;\">Roanoke County, VA - " + now.toDateString() + "</div>";
                    html += "<table border=\"0\" cellspacing=\"0\" cellpadding=\"0\"><tr><td><img src=\"\" id=\"mapimg\" alt=\"Loading...\" style=\"width:" + mapw + "in;height: " + maph + "in;\"></td>" + ((false)?(""):("<td><img src=\"\" id=\"legend\" alt=\"Loading...\" style=\"width: " + legendw + "in;\"></td>")) + "</tr></table>";
                    self.xmlReq = IMS2_createXMLHTTPRequest();
                    if(self.xmlReq){
                        var reqXMLString = new String(mapxml);
                        reqXMLString = reqXMLString.replace('%', '%25');
                        var url = IMS_webserviceUrl + "/ClientMapRequest";
                        self.xmlReq.onreadystatechange = self._ProcessMapRequest;
                        self.xmlReq.open("POST", url, true);
                        self.xmlReq.setRequestHeader("Content-Type","application/x-www-form-urlencoded");
                        self.xmlReq.send("reqXMLString=" + reqXMLString);                        
                    }
                }
                
                // make the table
                if(doData){
                    if("string" == typeof(self.results)){
                        html += self.results;
                    }else{
                        var tablesHtml = "";
                        var resultSet = null;
                        if(self.results["Layer"]){
                            resultSet = new Array();
                            resultSet[0] = self.results;
                        }else{
                            resultSet = self.results;
                        }
                        if(resultSet){
                            for(var i = 0; i < resultSet.length;i++){
                                var result = resultSet[i];
                                var fields = result["Fields"];
                                var rows = result["Values"];
                                var tableHtml = "<h2>" + result["Layer"] + "</h2>";
                                var ordOid = -1;
                                if(self.mapctl){
                                    var layer = self.mapctl.layers.Get(result["Layer"]);
                                    if(layer){
                                        for(var j = 0; j < fields.length; j++){
                                            if(fields[j] == layer.idField){
                                                ordOid = j;
                                                break;
                                            }
                                        }
                                    }
                                }
                                var table = "<table border=\"1\" cellspacing=\"0\" cellpadding=\"1\" style=\"font-size: smaller;\">";
                                var tr = "";
                                for(var j = 0; j < fields.length; j++){
                                    if(j != ordOid){
                                        tr += ("<th>" + fields[j] + "</th>");
                                    }
                                }
                                table += ("<tr>" + tr + "</tr>");
                                for(var j = 0; j < rows.length; j++){
                                    var rowHtml = "";
                                    var row = rows[j];
                                    for(var k = 0; k < row.length;k++){
                                        if(k != ordOid){
                                            rowHtml += "<td>" + row[k] + "</td>";
                                        }
                                    }
                                    table += "<tr>" + rowHtml + "</tr>";
                                }
                                table += "</table>";
                                tableHtml += table;
                                tablesHtml += tableHtml;
                            }
                        }
                        html += tablesHtml;
                    }
                }
                html += "</div>";
                b.innerHTML = html;
                self.mapimg = doc.getElementById("mapimg");
                self.legend = doc.getElementById("legend");
                doc.getElementById("printbttn")["onclick"] = self.Print;
                doc.getElementById("closebttn")["onclick"] = self.Close;
            }
        }
    }
    this._Generate = _Generate;
    
    function _ProcessMapRequest()
    {
        if(self.xmlReq && self.mapimg){
            if( self.xmlReq.readyState == 4 )
		    {
			    if( self.xmlReq.status == 200 )
			    {
			        var root = self.xmlReq.responseXML.documentElement;   
			        if(root){
			            for(var childi = 0; childi < root.childNodes.length; childi++){
			                var mapnode = root.childNodes[childi];
			                
			                if("Map" == mapnode.tagName){
			                    if(self.frame){
			                        self.mapimg["src"] = mapnode.attributes.getNamedItem("imgurl").value;
			                        self.mapimg["alt"] = "Map Image";
			                        self.legend["src"] = mapnode.attributes.getNamedItem("legendurl").value;
			                        self.legend["alt"] = "Legend";
			                    }
			                }
			            }
			        }
			    }
			    try{
			        self.xmlReq.abort();
			    }catch(e){;}
			    self.xmlReq = null;
			}
        }
    }
    this._ProcessMapRequest = _ProcessMapRequest;
    
    function Print()
    {
        var win = self.GetWin();
        win.focus();
        window.print();
    }
    this.Print = Print;
};