/*
    Document   : lbgm.popup
    Created on : 01-Oct-2009, 16:33:55
    Author     : Andreas Hadjigeorgiou
    Description:
        Purpose of the stylesheet follows.
*/

lbgm.popup = {

    activepopup: null,
    activepopupid: null,
    popupfeature: null,

    showPopup: function(feature) {
        if(this.activepopupid == feature.id) {
            this.hideLoadingPopup(feature);
            this.hidePopup(feature.id);
            return;
        }

        if(this.activepopup!=null)
            this.hidePopup(this.activepopupid);

        this.showLoadingPopup(feature);
        this.loadPopupCont(feature);
    },

    showAddPopup: function(lon, lat, feature) {

        if(this.activepopup!=null)
            this.hidePopup(this.activepopupid);

        this.showLoadingPopup(feature);
        this.loadAddPopupCont(lon, lat, feature);
    },

    showEditPopup: function(feature) {
        if(this.activepopup!=null) {
            var lonlat = this.activepopup.lonlat;
            this.hidePopup(feature.id);
        }

        this.showLoadingPopup(feature);
        this.loadEditPopupCont(feature);
    },

    showLoadingPopup: function(feature) {
        var popup = new OpenLayers.Popup.Lbgmpopup2('loadin_popup',
                        feature.geometry.getBounds().getCenterLonLat(),
                        null, "<div style='width: 60px;text-align: center;height: 10px;padding: 5px;'><img src = 'src/images/popup_loader.gif' /></div>", null, false);
        feature.popup = popup;

        lbgm.maplets.mapobject.map.addPopup(feature.popup);
        feature.popup.show();
    },

    hideLoadingPopup: function(feature) {
        lbgm.maplets.mapobject.map.removePopup(feature.popup);
        delete feature.popup;
    },

    hidePopup: function(id) {
        //alert(this.activepopupid + "    "  +id);
        if(this.activepopupid == null) return;

        if(this.activepopupid == id) {
            //this.activepopup.hide();
            lbgm.maplets.mapobject.map.removePopup(this.activepopup);
            this.activepopupid = null;
            delete this.activepopup;
            this.activepopup = null;

            if(lbgm.point != null && lbgm.point.feature != null) {
                delete lbgm.point.feature.popup;
                lbgm.point.feature.popup = null;
                //lbgm.point.feature = null;
            }
        }
        else {
            if(lbgm.maplets.mapobject.map.popups.length > 0) {
                lbgm.maplets.mapobject.map.removePopup(id);
                this.activepopupid = null;
            }
        }

        if(id == 'identification') {
            var feat = lbgm.point.pointslayer.getFeatureById('identification');
            if(feat) {
                lbgm.point.pointslayer.removeFeatures([feat], null);
                //lbgm.maplets.mapobject.map.removeLayer(layer);
            }
        }
    },

    loadPopupCont: function(feature) {
        var req = "displayPoint";
        
        switch(feature.attributes.type) {
            case "point":
                req = 'displayPoint';
                break;
            case "lonlat":
                req = "displayLonlat";
                break;
            case "address":
                req = "displayAddress";
                break;
            case "startNavi":
                req = "displayNaviStart";
                break;
            case "endNavi":
                req = "displayNaviEnd";
                break;
            case "instr":
                req = "displayInstr";
                break;
            default:
                req = 'displayPoint';
                break;
        }

        var lonlat = feature.geometry.getBounds().getCenterLonLat().clone();
        lonlat.transform(lbgm.maplets.mapobject.map.getProjectionObject(), lbgm.maplets.mapobject.map.displayProjection);

        var conn = new Ext.data.Connection();
        conn.request({
            url: 'src/php/conn/poimarkers.conn.php',
            method: 'POST',
            params: {
                request: req,
                point: feature.attributes.id,
                lon: String(lonlat.lon),
                lat: String(lonlat.lat),
                img: feature.attributes.instrimage,
                txt: feature.attributes.name,
                address:  feature.attributes.address,
                postcode: feature.attributes.postcode,
                area: feature.attributes.area,
                district: feature.attributes.district,
                appid: lbgm.layout.appid,
                ispoi: feature.attributes.ispoi,
                allowNavi: lbgm.layout.enablenavigation,
                allowShare: lbgm.layout.enableshare,
                key: lbgm.layout.key
            },
            success: function(responseObject) {
                //eval(responseObject.responseText);

                this.setJSonHead(responseObject.responseText);
                this.setCSSonHead(responseObject.responseText);

                var data = responseObject.responseText; //lbgm.popup.clearPopupDesign(responseObject.responseText);
                //alert(data);

                if (lbgm.point.feature || lbgm.point.feature.popup == null) {
                    /*
                    var realSize = OpenLayers.Util.getRenderedDimensions(
                        responseObject.responseText, null, null
                    );

                    feature.popup.contentDiv.style.padding = '0px';
                    var updSize = new OpenLayers.Size(realSize.w, realSize.h);
                    //alert(realSize.w);
                    feature.popup.setSize(updSize);
                    feature.popup.setContentHTML(responseObject.responseText);

                    lbgm.maplets.mapobject.map.addPopup(feature.popup);
                    feature.popup.setSize(updSize);
                    feature.popup.updatePos();
                    */


                    this.hideLoadingPopup(feature);

                    var popup = new OpenLayers.Popup.Lbgmpopup2(feature.id,
                        feature.geometry.getBounds().getCenterLonLat(),
                        null, data, null, true);
                    feature.popup = popup;
                    //feature.popup = feature.createPopup(false);

                    feature.popup.id = "popup_" + feature.id;

                    lbgm.maplets.mapobject.map.addPopup(feature.popup);

/*
                    var realSize = OpenLayers.Util.getRenderedDimensions(
                        responseObject.responseText, null, null
                    );

                    feature.popup.contentDiv.style.padding = '0px';
                    var updSize = new OpenLayers.Size(realSize.w, realSize.h);
                    //alert(realSize.w);
                    feature.popup.setSize(updSize);
                    feature.popup.setContentHTML(responseObject.responseText);

                    lbgm.maplets.mapobject.map.addPopup(feature.popup);
                    feature.popup.setSize(updSize);

                    feature.popup.show();
*/
                    lbgm.point.feature.popup = feature.popup;
                    this.popupfeature = feature;
                    //feature.popup.updatePosition();


                }

                this.activepopup = feature.popup;
                this.activepopupid = feature.id;
            },
            failure: function() {
                //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            scope: this
        });

                                    
    },

    loadAddPopupCont: function(lon, lat, feature) {
        var conn = new Ext.data.Connection();
        conn.request({
            url: 'src/php/conn/poimarkers.conn.php',
            method: 'POST',
            params: {"request": "displayAddPoint", appid: lbgm.layout.appid, lon: lon, lat: lat, key: lbgm.layout.key},
            success: function(responseObject) {
                //eval(responseObject.responseText);

                this.setJSonHead(responseObject.responseText);
                this.setCSSonHead(responseObject.responseText);

                if (lbgm.point.feature || lbgm.point.feature.popup == null) {
                    //feature.data.popupContentHTML = responseObject.responseText;
                    this.hideLoadingPopup(feature);

                    var popup = new OpenLayers.Popup.Lbgmpopup2("addpopup",
                        feature.geometry.getBounds().getCenterLonLat(),
                        null, responseObject.responseText, null, true);
                    feature.popup = popup;
                    //feature.popup = feature.createPopup(false);

                    feature.popup.id = "popup_0";
                    lbgm.maplets.mapobject.map.addPopup(feature.popup);

                    /*var realSize = OpenLayers.Util.getRenderedDimensions(
                        responseObject.responseText, null, { displayClass: feature.popup.displayClass }
                    );

                    feature.popup.contentDiv.style.padding = '0px';
                    var updSize = new OpenLayers.Size(realSize.w, realSize.h);
                    //alert(realSize.w);
                    feature.popup.setSize(updSize);
                    feature.popup.setContentHTML(responseObject.responseText);

                    lbgm.maplets.mapobject.map.addPopup(feature.popup);
                    feature.popup.setSize(updSize);

                    feature.popup.show();*/
                    lbgm.point.feature.popup = feature.popup;
                    //feature.popup.updatePosition();
                    this.popupfeature = feature;
                }

                this.activepopup = feature.popup;
                this.activepopupid = 0;
            },
            failure: function() {
                //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            scope: this
        });
    },

    loadEditPopupCont: function(feature) {
        var conn = new Ext.data.Connection();
        conn.request({
            url: 'src/php/conn/poimarkers.conn.php',
            method: 'POST',
            params: {"request": "displayEditPoint", "appid": lbgm.layout.appid, "pointid": feature.attributes.id, key: lbgm.layout.key},
            success: function(responseObject) {
                //eval(responseObject.responseText);

                this.setJSonHead(responseObject.responseText);
                this.setCSSonHead(responseObject.responseText);

                if (this.popupfeature != null) {
                    //var feature = this.popupfeature;

                    this.hideLoadingPopup(feature);
                    
                    //feature.data.popupContentHTML = responseObject.responseText;
                    var popup = new OpenLayers.Popup.Lbgmpopup2("addpopup",
                        feature.geometry.getBounds().getCenterLonLat(),
                        null, responseObject.responseText, null, true);
                    feature.popup = popup;
                    //feature.popup = feature.createPopup(false);

                    feature.popup.id = "popup_" + feature.attributes.id;
                    lbgm.maplets.mapobject.map.addPopup(feature.popup);
                    /*
                    var realSize = OpenLayers.Util.getRenderedDimensions(
                        responseObject.responseText, null, { displayClass: feature.popup.displayClass }
                    );

                    feature.popup.contentDiv.style.padding = '0px';
                    var updSize = new OpenLayers.Size(realSize.w, realSize.h);
                    //alert(realSize.w);
                    feature.popup.setSize(updSize);
                    feature.popup.setContentHTML(responseObject.responseText);

                    lbgm.maplets.mapobject.map.addPopup(feature.popup);
                    feature.popup.setSize(updSize);

                    feature.popup.show();
                    */
                    //lbgm.point.feature.popup = feature.popup;
                    //feature.popup.updatePosition();
                }

                this.activepopup = lbgm.point.feature.popup;
                this.activepopupid = feature.id;
            },
            failure: function() {
                //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            scope: this
        });
    },

    displayGenericPopup: function(feature, data) {

        if(this.activepopupid == feature.id) {
            this.hideLoadingPopup(feature);
            this.hidePopup(feature.id);
            return;
        }

        if(this.activepopup!=null)
            this.hidePopup(this.activepopupid);
        
        this.showLoadingPopup(feature);

        var conn = new Ext.data.Connection();
        conn.request({
            url: 'src/php/conn/poimarkers.conn.php',
            method: 'POST',
            params: {
                request: "displayGeneric",
                appid: lbgm.layout.appid,
                data : data,
                id: feature.id,
                allowNavi: lbgm.layout.enablenavigation,
                allowShare: lbgm.layout.enableshare,
                key: lbgm.layout.key,
                popupTitle: feature.attributes.popuptitle
            },
            success: function(responseObject) {
                //eval(responseObject.responseText);

                this.setJSonHead(responseObject.responseText);
                this.setCSSonHead(responseObject.responseText);

                if (lbgm.point.feature || lbgm.point.feature.popup == null) {
                    this.hideLoadingPopup(feature);

                    var popup = new OpenLayers.Popup.Lbgmpopup2(feature.id,
                        feature.geometry.getBounds().getCenterLonLat(),
                        null, responseObject.responseText, null, true);

                    feature.popup = popup;
                    //feature.popup = feature.createPopup(false);

                    feature.popup.id = "popup_" + feature.id;
                    lbgm.maplets.mapobject.map.addPopup(feature.popup);

                    /*
                    var realSize = OpenLayers.Util.getRenderedDimensions(
                        responseObject.responseText, null, null
                    );

                    feature.popup.contentDiv.style.padding = '0px';
                    var updSize = new OpenLayers.Size(realSize.w, realSize.h);
                    //alert(realSize.w);
                    feature.popup.setSize(updSize);
                    feature.popup.setContentHTML(responseObject.responseText);

                    lbgm.maplets.mapobject.map.addPopup(feature.popup);
                    feature.popup.setSize(updSize);

                    feature.popup.show();
                    */
                    lbgm.point.feature.popup = feature.popup;
                    this.popupfeature = feature;
                    //feature.popup.updatePosition();
                }

                this.activepopup = feature.popup;
                this.activepopupid = feature.id;
            },
            failure: function() {
                //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            scope: this
        });
    },

    displayPopup: function(feature, title, data) {

        if(this.activepopupid == feature.id) {
            this.hideLoadingPopup(feature);
            this.hidePopup(feature.id);
            return;
        }

        if(this.activepopup!=null)
            this.hidePopup(this.activepopupid);

        this.showLoadingPopup(feature);

        var pp = '<div id="gn_popup_cont" style="">\n\
                    <div id="gn_popup_header">\n\
                        <div id="gn_popup_header_title">{title}</div>\n\
                        <div id="gn_popup_header_close"><a href="javascript:lbgm.popup.hidePopup(\'{id}\');"><img src="src/images/navigation/remove.png" /></a></div>\n\
                    </div>\n\
                    <div id="gn_popup_body">\n\
                        <div id="gn_popup_body_contents">\n\
                            {contents}\n\
                            <div id="gn_popup_body_links">{navfrom} {navto} {share}</div>\n\
                        </div>\n\
                    </div>\n\
                </div>';

        pp = pp.replace('{id}', feature.id);
        pp = pp.replace('{title}', title);
        pp = pp.replace('{contents}', data);
        pp = pp.replace(/{(.*?)}/g, "");

        if (feature || feature.popup == null) {
            this.hideLoadingPopup(feature);

            var popup = new OpenLayers.Popup.Lbgmpopup2(feature.id,
                feature.geometry.getBounds().getCenterLonLat(),
                null, pp, null, true);

            feature.popup = popup;
            //feature.popup = feature.createPopup(false);

            feature.popup.id = "popup_" + feature.id;
            lbgm.maplets.mapobject.map.addPopup(feature.popup);

            /*
            var realSize = OpenLayers.Util.getRenderedDimensions(
                pp, null, null
            );

            feature.popup.contentDiv.style.padding = '0px';
            var updSize = new OpenLayers.Size(realSize.w, realSize.h);
            //alert(realSize.w);
            feature.popup.setSize(updSize);
            feature.popup.setContentHTML(pp);

            lbgm.maplets.mapobject.map.addPopup(feature.popup);
            feature.popup.setSize(updSize);

            feature.popup.show();
            */
            //lbgm.point.feature.popup = feature.popup;
            this.popupfeature = feature;
            //feature.popup.updatePosition();

            this.activepopup = feature.popup;
            this.activepopupid = feature.id;
        }
        
    },


    /**
     *  Helper Functions
     */
    setJSonHead: function (content) {
        var search = content;
        var script;
        
        while( script = search.match(/(<script[^>]+javascript[^>]+>\s*(<!--)?)/i))
        {
          search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length);

          if (!(endscript = search.match(/((-->)?\s*<\/script>)/))) break;

          block = search.substr(0, search.indexOf(RegExp.$1));
          search = search.substring(block.length + RegExp.$1.length);

          var oScript = document.createElement('script');
          oScript.text = block;
          document.getElementsByTagName("head").item(0).appendChild(oScript);
        }

        //document.getElementById(div).innerHTML=content;
    },

    setCSSonHead: function (content) {
        var search = content;
        var script;

        while( script = search.match(/(<style[^>]+css[^>]+>\s*(<!--)?)/i))
        {
          search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length);

          if (!(endscript = search.match(/((-->)?\s*<\/style>)/))) break;

          block = search.substr(0, search.indexOf(RegExp.$1));
          search = search.substring(block.length + RegExp.$1.length);

          var styles = document.createElement('style');
          styles.setAttribute('type', 'text/css');
          //var newStyle = document.createTextNode(block);

          //alert(block);
          //oScript.text = block;
          if(styles.styleSheet != undefined)
            styles.styleSheet.cssText = block;
          else
            styles.style.cssText = block;

          document.getElementsByTagName("head").item(0).appendChild(styles);
        }

        //document.getElementById(div).innerHTML=content;
    },


    clearPopupDesign: function (content) {
        var search = content;
        var script;

        while( script = search.match(/(<script[^>]+javascript[^>]+>\s*(<!--)?)/i))
        {
          search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length);
          if (!(endscript = search.match(/((-->)?\s*<\/script>)/))) break;
          content = content.replace(search, '');
        }

        search = content;
        while( script = search.match(/(<style[^>]+css[^>]+>\s*(<!--)?)/i))
        {
          search = search.substr(search.indexOf(RegExp.$1) + RegExp.$1.length);

          if (!(endscript = search.match(/((-->)?\s*<\/style>)/))) break;

          block = search.substr(0, search.indexOf(RegExp.$1));
          search = search.substring(block.length + RegExp.$1.length);

          content = content.replace(block, '');
        }

        return content;
    },

    showAddPMPopup: function(lon, lat, feature) {

        if(this.activepopup!=null)
            this.hidePopup(this.activepopupid);

        this.showLoadingPopup(feature);
        this.loadAddPMPopupCont(lon, lat, feature);
    },
    loadAddPMPopupCont: function(lon, lat, feature) {
        var conn = new Ext.data.Connection();
        conn.request({
            url: 'src/php/conn/poimarkers.conn.php',
            method: 'POST',
            params: {"request": "displayAddPlacemark", appid: lbgm.layout.appid, lon: lon, lat: lat, key: lbgm.layout.key},
            success: function(responseObject) {
                this.setJSonHead(responseObject.responseText);
                this.setCSSonHead(responseObject.responseText);

                //alert(responseObject.responseText);

                if (lbgm.point.feature || lbgm.point.feature.popup == null) {
                    this.hideLoadingPopup(feature);

                    var popup = new OpenLayers.Popup.Lbgmpopup2("addPMpopup",
                        feature.geometry.getBounds().getCenterLonLat(),
                        null, responseObject.responseText, null, true);
                    feature.popup = popup;
                    feature.popup.id = "popup_pm_0";
                    lbgm.maplets.mapobject.map.addPopup(feature.popup);
                    lbgm.point.feature.popup = feature.popup;
                    this.popupfeature = feature;
                }

                this.activepopup = feature.popup;
                this.activepopupid = 0;
            },
            failure: function() {
                //Ext.Msg.alert(lbgm.options.appname, 'Unable to load layout.');
            },
            scope: this
        });
    }

};
