function Google_Map_UI(){

    this.map;
    this.marker=new Array();        
    this.count = 0 ;
    this.v;
    this.p;
    this.tab1;
    this.tab2;
    var gridc;
    var mn;
    
    this.init = function(set,gridf){
    this.v=set.v;
    this.p=set.p;
    mn=this.v.mn;
    
    gridc=gridf;
    this.tab1 = document.getElementById("p"+this.v.pid+"_tab1_content").innerHTML;
    this.tab2 = document.getElementById("p"+this.v.pid+"_tab2_content").innerHTML;
    this.initialize();
    }
    
    this.initialize = function () { 
    if (GBrowserIsCompatible()) {
        document.getElementById("p"+this.v.pid+"_map").style.height = this.v.dh+'px';
        this.map = new GMap2(document.getElementById("p"+this.v.pid+"_map"));
        if(this.v.Search_Control) {
        var csoptions = {searchFormHint : this.p.searchFormHint}
        this.map.addControl(new google.maps.LocalSearch(csoptions));
        }
        this.map.setCenter(new GLatLng(this.v.dlat, this.v.dlon), this.v.dzoom);
        if(this.v.maptype=="standard"){this.map.setMapType(G_NORMAL_MAP);}
        else if(this.v.maptype=="satellite"){this.map.setMapType(G_SATELLITE_MAP);}
        else if(this.v.maptype=="hybrid"){this.map.setMapType(G_HYBRID_MAP);}
        else {this.map.setMapType(G_NORMAL_MAP);}
        
        if(this.v.Map_Controls)
        {
        if(this.v.Map_Controls=="LargeMapControl") {this.map.addControl(new GLargeMapControl());}
        else if(this.v.Map_Controls=="SmallMapControl") {this.map.addControl(new GSmallMapControl());}
        else if(this.v.Map_Controls=="SmallZoomControl") {this.map.addControl(new GSmallZoomControl());}
        else if(this.v.Map_Controls=="ScaleControl") {this.map.addControl(new GScaleControl());}
        }
        if(this.v.mtc){this.map.addControl(new GMapTypeControl());}
        if(this.v.omc){this.map.addControl(new GOverviewMapControl());}
        this.map.enableContinuousZoom();
        this.map.enableDoubleClickZoom();
        this.map.enableScrollWheelZoom();
        GEvent.addListener(this.map, "moveend", function(){
        
        eval(mn+".get_vals()");
        });
        this.get_vals();
        }
        
       
        
      if(typeof window.onunload == "function") {
        
        var prevonu= onunload;
        window.onunload = function() {
            prevonu();
            GUnload();  
        }} else{window.onunload = GUnload;}        
        
      }
      
      this.get_vals = function(){
        var point = this.map.getCenter();
        document.getElementById("p"+this.v.pid+"_lat").value= point.y;
        document.getElementById("p"+this.v.pid+"_lon").value= point.x;
        document.getElementById("p"+this.v.pid+"_zoom").value= this.map.getZoom();

      }
      
      this.set_marker = function(markers) {
      if(!this.marker[markers.mid]) {
      this.count += 1;
      var micon = new GIcon();
      var isize=new Array(); 
      var ssize=new Array(); 
      micon.image = this.v.url+"plugins/p"+this.v.pid+"_googlemap_directory/icons/"+markers.iname;
      micon.shadow = this.v.url+"plugins/p"+this.v.pid+"_googlemap_directory/icons/shadow/"+markers.sname;
      var isize = markers.isize.split(','); 
      micon.iconSize = new GSize(isize[0],isize[1]);
      var ssize = markers.ssize.split(','); 
      micon.shadowSize = new GSize(ssize[0],ssize[1]);
      isize[0]=isize[0]/2
      micon.iconAnchor = new GPoint(isize[0], isize[1]);
      micon.infoWindowAnchor = new GPoint(isize[0], 0);;
      var point = new GLatLng(markers.lat, markers.lon); 
      this.map.addOverlay(this.createMarker(point,micon,markers));
      document.getElementById("p"+this.v.pid+"_mr").innerHTML=this.count;
      }

      }
      
      creat_tab = function(arg,cont){
      for(x in arg) {
      cont = cont.replace("--"+x+"--",arg[x]);
      }
      return cont;
      }
      
      this.createMarker = function(point,micon,data) {
      
      var vv = eval(mn+".v");
      var pp = eval(mn+".p");
      var image= (data.image == "") ? vv.url+"plugins/p"+vv.pid+"_googlemap_directory/noimage.png" : data.image;
      var murl = (data.url == "") ? pp.NoWebAddress : '<a href="'+data.url+'" target="_blank">'+pp.WebAddress+'</a>';
      var arg = {
      "title" : data.title,
      "username" : data.username ,
      "catname" : data.catname ,
      "descr" : data.descr,
      "murl" : murl,
      "url" : data.url,
      "cdate": data.cdate,
      "imgurl" : image
      }; 
      var ctab1 = creat_tab(arg, eval(mn+".tab1"));
      var ctab2 = creat_tab(arg, eval(mn+".tab2"));
      var num = data.mid
      this.marker[num] = new GMarker(point,{icon:micon});
      if(vv.maintab && vv.imagetab){
      var tabs = [
          new GInfoWindowTab(pp.tabmain, ctab1),
          new GInfoWindowTab(pp.tabimage, ctab2)
            ];
      } else if(vv.maintab) {
      var tabs = [
          new GInfoWindowTab(pp.tabmain, ctab1)
            ];
      } else if(vv.imagetab) {
      var tabs = [
          new GInfoWindowTab(pp.tabimage, ctab2)
            ];      
      }
      GEvent.addListener(eval(mn+".marker["+num+"]"),vv.mevent, function() {
        if(vv.maintab || vv.imagetab) {
        var mm = eval(mn+".map");
        mm.openInfoWindowTabsHtml(point,tabs,{maxWidth:vv.baldw});
        }
        if(!gridc.m_s) {gridc.sel_m(num);}
        gridc.m_s = false;
      });
      return eval(mn+".marker["+num+"]");
    }
    
    this.go_to = function (lat,lon,zoom,i){
    this.map.setCenter(new GLatLng(lat, lon),zoom);
    javascript:GEvent.trigger(this.marker[i], this.v.mevent)
    document.location.hash="p"+this.v.pid+"_top";
    }
    
    this.clearmap = function(){
    this.map.clearOverlays();
    this.marker = new Array();
    this.count = 0;
    document.getElementById("p"+this.v.pid+"_mr").innerHTML=this.count;
    
    }
    

}

function Google_Grid_UI (){   
    

    this.v;
    this.p;
    this.f;
    this.ds; 
    this.grid; 
    this.columnModel;
    this.filters;
    this.dw;
    var mr;
    var url;
    this.s;
    this.filterset = false;
    this.cbw;
    var mapc;
    this.s_m = false;
    var gn;
    
 
    this.init = function(set,v1,v2) { 
            this.v = set.v;
            this.p = set.p;
            this.f = set.f;
            this.dw = this.v.dw;
            mr = this.v.mr;
            url = this.v.url;
            this.s = this.v.s;
            gn = this.v.ui_name;
            mapc = v1;
            this.filterset = false;
            this.initialize(); 
        
        }
        
    this.initialize = function(){
            Ext.QuickTips.init();
            this.filters = this.buildfilter();
            this.ds = this.setupDataSource();
            this.columnModel = this.getColumnModel();
            this.cbw = this.get_combo_size();
            this.buildGrid();
            this.set_filter_values();  
    }
        
        
    this.ma_url = function(row,col,href) {
         this.url_msg(row,col,href);
        }
        
 
    this.sel_m = function(s){
        s += "";               
        var row = this.grid.getStore().indexOfId(s);
        this.grid.getSelectionModel().selectRow(row);
        this.grid.view.focusRow(row);
        }
    
    this.setupDataSource = function() {
    
    if(!this.ds) {
    this.ds = new Ext.data.Store({
        url: "plugins/p"+this.v.pid+"_googlemap_directory/markers.php",
        baseParams : {catid: this.v.cid},
         reader: new Ext.data.XmlReader({
                record: 'row',
               id: 'mid'
           }, [
               {name: 'mid', mapping: 'mid', type: 'int'},
               {name: 'date', type: 'date', dateFormat: 'Y-m-d'},
               'title', 'catname', 'username', 'iname', 'descr', 'lat', 'lon', 'zoom', 'url', 'image', 'isize', 'sname', 'ssize', 'edit'
           ])
    });
    this.ds.setDefaultSort('mid', 'asc');
    }
    return this.ds;
    }
    
    
    this.getColumnModel = function() {
        if(!this.columnModel) {
                 var w1 = (this.dw-170)-40;
                 var w2 = Math.round((w1/100)*40);
                 var w3 = Math.round((w1/100)*20);
            this.columnModel = new Ext.grid.ColumnModel(
                [   
                    new Ext.grid.RowNumberer(), 
                    {header: this.p.ID, width: 40, dataIndex: 'mid', sortable: true, tooltip: this.p.cts},
                    {id:'cc',header: this.p.Title, width: w2, dataIndex: 'title', sortable: true, renderer: this.render_cell , tooltip: this.p.cts},
                    {
                    header: this.p.DateCreated, 
                    width: w3, 
                    dataIndex: 'date', 
                    sortable: true,
                    align: 'center',
                    renderer: Ext.util.Format.dateRenderer('m/d/Y')
                    , tooltip: this.p.cts
                     },
                    {header: this.p.Category, width: w3, dataIndex: 'catname', align: 'center', sortable: true, renderer: this.render_cell, tooltip: this.p.cts},
                    {header: this.p.Marker, width: 60, dataIndex: 'iname', align: 'center', sortable: true, tooltip: this.p.cts,
                    renderer: this.miconurl
                    },
                    {header: this.p.Creator, width: w3, dataIndex: 'username', align: 'center', sortable: true, renderer: this.render_cell, tooltip: this.p.cts},
                    {header: this.p.Edit, width: 40, dataIndex: 'edit', align: 'center', hidden : this.v.mguest, sortable: false, renderer: this.retedit, menuDisabled : true},
                    {header: this.p.URL, width: 40, dataIndex: 'mid', align: 'center', sortable: false, renderer: this.m_url, menuDisabled : true}
                ]
            );
        }
        return this.columnModel;
    }
    
    this.render_cell = function(val,rowobj, rec, row, col, store){
    var str=val.replace(/\"/g,'&#34;');
    rowobj.attr = 'ext:qtip="'+str+'"';
    return val;
    }
 
    this.buildfilter = function(){
    if(!this.filters) {
    this.filters = new Ext.ux.grid.GridFilters({
    local: true,
    filters:[
        {type: 'numeric',  dataIndex: 'mid'},
        {type: 'string',  dataIndex: 'title'},
        {type: 'string',  dataIndex: 'catname'},
        {type: 'date',  dataIndex: 'date'},
        {type: 'string',  dataIndex: 'username'}
        ]}); 
    }   
    return this.filters;
  }
  
  this.set_mark = function(rec) {

  }
  
    this.m_url = function(val,rowobj, rec, row, col, store){
    var a = (mr ? '/' : '&');
    var b = (mr ? '/' : '=');
    return '<div class="controlBtn"><a href="'+ url + (mr ? eval(gn+".v.cname") : 'index.php?categoryid='+eval(gn+".v.ccid")) + a + 'p'+eval(gn+".v.pid")+'_mid' + b + val + '" onclick="'+eval(gn+".v.ui_name")+'.ma_url(' + row + ',' + col + ',this.href);return false;"><img src="plugins/p'+eval(gn+".v.pid")+'_googlemap_directory/images/shared/icons/fam/connect.png" width="16" height="16" class="control_edit"></a></div>';
    }
    
    this.miconurl = function(val,row, rec){

          mapc.set_marker({
        lat:rec.get('lat'),
        lon:rec.get('lon'),
        iname:rec.get('iname'),
        sname:rec.get('sname'),
        isize:rec.get('isize'),
        ssize:rec.get('ssize'),
        mid:rec.get('mid'),
        image:rec.get('image'),
        url:rec.get('url'),
        title:rec.get('title'),
        catname:rec.get('catname'),
        cdate: datefo(rec.get('date'),'m/d/Y'),
        username:rec.get('username'),
        zoom:rec.get('zoom'),
        descr:rec.get('descr')
        });                                
    return '<img width="16" height="16" src="plugins/p'+eval(gn+".v.pid")+'_googlemap_directory/icons/'+val+'">';
    }
    
    this.retedit = function(val,row,rec){
    if(val){
    var a = (mr ? '/' : '&');
    var b = (mr ? '/' : '=');
    return '<div class="controlBtn"><a href="'+ url + (mr ? eval(gn+".v.cname") : 'index.php?categoryid='+eval(gn+".v.ccid")) + a + 'p'+eval(gn+".v.pid")+'_mid' + b + rec.get('mid') + a + 'p'+eval(gn+".v.pid")+'_action' + b + 'edit"><img src="plugins/p'+eval(gn+".v.pid")+'_googlemap_directory/images/shared/cog_edit.png" width="16" height="16" class="control_edit"></a></div>';
    }}
    
    datefo = function (dd,format){
    if(!dd) {
    return '';
    } else {
    return dd.dateFormat(format)
    }}
    
    
    ce = function(vall) {if(vall && vall != false && vall != null && vall != 'undefined' && vall != '') {return true;} else {return false;}}
    
    this.build_page_link = function(){
    var a = (mr ? '/' : '&');
    var b = (mr ? '/' : '=');
    var ret = ((ce(this.v.cid) && this.v.cid != 'all') ? (a + 'p'+this.v.pid+'_catid' + b + this.v.cid) : '');
    if(this.grid.getSelectionModel().hasSelection()){
    rec = this.grid.getSelectionModel().getSelected();
    ret += a + 'p'+this.v.pid+'_mid' + b + rec.get('mid');
    }
    
    var sort = this.ds.getSortState();
    
    if(sort.field  != 'mid' || sort.direction.toLowerCase() != 'asc') {ret += a + 'p'+this.v.pid+'_sf' + b + sort.field + a + 'p'+this.v.pid+'_sd' + b + sort.direction;}
    
    if(this.grid.filters.getFilter('mid').active == true) {
    var id = this.grid.filters.getFilter('mid').getValue();
    if(ce(id.eq)) {ret += a + 'p'+this.v.pid+'_fideq' + b + escape(id.eq);}
    else{
    if(ce(id.gt)) {ret += a + 'p'+this.v.pid+'_fidgt' + b + escape(id.gt);} 
    if(ce(id.lt)) {ret += a + 'p'+this.v.pid+'_fidlt' + b + escape(id.lt);}     
    }}
    
    if(this.grid.filters.getFilter('title').active == true) {
    var title = this.grid.filters.getFilter('title').getValue();
    if(ce(title)) {ret += a + 'p'+this.v.pid+'_ftitle' + b + escape(title);}
    }
        
    if(this.grid.filters.getFilter('date').active == true) {
    var d = this.grid.filters.getFilter('date').getValue();
    if(ce(d.on)) {ret += a + 'p'+this.v.pid+'_fdon' + b + escape(d.on.dateFormat('m-d-Y'));}
    else{
    if(ce(d.before)) {ret += a + 'p'+this.v.pid+'_fdbe' + b + escape(d.before.dateFormat('m-d-Y'));} 
    if(ce(d.after)) {ret += a + 'p'+this.v.pid+'_fdaf' + b + escape(d.after.dateFormat('m-d-Y'));}     
    }}
    
    if(this.grid.filters.getFilter('catname').active == true) {
    var catname = this.grid.filters.getFilter('catname').getValue();
    if(ce(catname)) {ret += a + 'p'+this.v.pid+'_fcat' + b + escape(catname);}
    }
    
    if(this.grid.filters.getFilter('username').active == true) {
    var usern = this.grid.filters.getFilter('username').getValue();
    if(ce(usern)) {ret += a + 'p'+this.v.pid+'_fuser' + b + escape(usern);}
    }
    
    return ret;
    }
    
    
    
    this.getpagelink = function(){
   
    var fi = this.build_page_link();
    var pagelink = url + (mr ? this.v.cname : 'index.php?categoryid='+this.v.ccid) + fi
    return pagelink;
    }
    
    this.url_msg = function(row,col,href) {
    
    var record = this.grid.getStore().getAt(row);    
    Ext.MessageBox.show({
           title: eval(gn+".p.AddressforMarker") + record.get('mid'),
           msg: eval(gn+".p.MarkerWin"),
           width:300,
           cls: 'Google_Grid_Win_Class',
           buttons: Ext.MessageBox.OK,
           multiline: true,
           value: href
            });
            
                Ext.MessageBox.getDialog().on('show', function(d) {
                var div = Ext.get(d.el);
                var text = div.select('.ext-mb-textarea', true);
                if (text.item(0)) {
                text.item(0).dom.select();
                text.item(0).dom.readOnly = true;
                text.item(0).dom.onclick= function(){this.select()};
                }
                });
    }
    
     
   this.set_filter_values = function(){
   if(!this.filterset) {
   this.filterset=true;
   this.ds.setDefaultSort(this.f.sf, this.f.sd);
   if(ce(this.f.mideq)) {this.grid.filters.getFilter('mid').setValue({eq:this.f.mideq});this.grid.filters.getFilter('mid').setActive(true);
   } else {
   if(ce(this.f.midgt)) {this.grid.filters.getFilter('mid').setValue({gt:this.f.midgt});this.grid.filters.getFilter('mid').setActive(true);}
   if(ce(this.f.midlt)) {this.grid.filters.getFilter('mid').setValue({lt:this.f.midlt});this.grid.filters.getFilter('mid').setActive(true);}
   } 
   if(ce(this.f.title)) {this.grid.filters.getFilter('title').setValue(this.f.title);this.grid.filters.getFilter('title').setActive(true);}

   if(ce(this.f.dateon)) {this.grid.filters.getFilter('date').setValue({on:this.f.dateon});this.grid.filters.getFilter('date').setActive(true);
   } else {
   if(ce(this.f.datebe)) {this.grid.filters.getFilter('date').setValue({before:this.f.datebe});this.grid.filters.getFilter('date').setActive(true);}
   if(ce(this.f.dateaf)) {this.grid.filters.getFilter('date').setValue({after:this.f.dateaf});this.grid.filters.getFilter('date').setActive(true);}
   }
   if(ce(this.f.catname)) {this.grid.filters.getFilter('catname').setValue(this.f.catname);this.grid.filters.getFilter('catname').setActive(true);}
   if(ce(this.f.username)) {this.grid.filters.getFilter('username').setValue(this.f.username);this.grid.filters.getFilter('username').setActive(true);}   
   }
   }     
   
   
   this.get_combo_size = function(){
   if(!this.cbw) {
   if(navigator.appName!='Microsoft Internet Explorer'){ 
   var w = 0;
   for(var i in this.v.cda){
   if(ce(this.v.cda[i][1])) {
   var d = document.createElement('div');
   var w1 = Ext.util.TextMetrics.measure(d, this.v.cda[i][1]).width;
   if(w < w1) {w = w1;}                                 
   }}
   this.cbw = ( (w > 0) ? (w < this.dw ? (w < 60 ? 80 : (w+20)) : (this.dw - 100) ) : 'auto');
   }}
   return this.cbw;
   }
   
   this.set_ds_par = function(par) {
   this.ds.baseParams.catid = par;
   this.v.cid = par;
   this.s = false;
   }
    
    this.imgp  = function(imgs) {
            if(imgs.length>0) {
            var image_object = new Array();
            for(i=0; i < imgs.length; i++) {
            image_object[i] = new Image();
            image_object[i].src = url + "plugins/p"+this.v.pid+"_googlemap_directory/images/" + imgs[i];
            }
            }
    }
    
      
    this.buildGrid = function() {
        Ext.BLANK_IMAGE_URL = 'plugins/p'+this.v.pid+'_googlemap_directory/images/s.gif';
        document.getElementById(this.v.grid_name).innerHTML='';
        this.grid = new Ext.grid.GridPanel({
        loadMask: true, 
        ds: this.ds, 
        title: this.p.MarkerList,
        cm: this.columnModel,
        renderTo : this.v.grid_name,
        plugins: this.filters,
        autoSizeColumns: true,
        autoHeight: this.v.autoheight,
        stripeRows: true,
        sm: new Ext.grid.RowSelectionModel({singleSelect: true}),
        listeners: {
        cellclick: function(grid, rowIndex, columnIndex, e) {
        var rec = grid.getStore().getAt(rowIndex);
        m_s = true;
        mapc.go_to(rec.get('lat'),rec.get('lon'),rec.get('zoom'),rec.get('mid')); 
        }},
        
        autoWidth:true,
        width:this.dw,
        height: this.v.height,
        collapsible: true,
        animCollapse: false,
        autoExpandColumn : 'cc',
        enableColumnHide : false,
        viewConfig: {
        forceFit: true,
        emptyText: this.p.NoRecords
        },
        tbar: [
        this.p.Categories+': ',  
            new Ext.form.ComboBox({
            store: new Ext.data.SimpleStore({
            fields: ['value', 'text'],
            data:   this.v.cda
            }),
            
            valueField: 'value',
            title: this.p.Categories,
            disableKeyFilter: true,
            forceSelection: true,
            editable: false,
            loadingText: this.p.LCategories,
            lazyInit : false,
            displayField:'text',
            triggerAction: 'all',
            mode: 'local',
            emptyText:'-SELECT-',
            readOnly: true,
            value : this.v.cid,
            width : this.cbw,
            listeners : {
                select: function(e,vv,g){
                eval(gn+".set_ds_par(\""+vv.data.value+"\")");
                mapc.clearmap();
                var gg = eval(gn+".grid");
                gg.getSelectionModel().clearSelections();
                eval(gn+".ds.load()");
                }
            }
            }), '-' , {
            tooltip: {title: this.p.ShowAddress,text:this.p.cto},
            iconCls:'p_link',
            text: this.p.ShowAddress,
            handler : function(e){
                Ext.MessageBox.show({
                title: eval(gn+".p.PageAddress"),
                msg: eval(gn+".p.PageWin"),
                width:300,
                cls: 'Google_Grid_Win_Class',
                buttons: Ext.MessageBox.OK,
                multiline: true,
                value: eval(gn+".getpagelink()")
                });
            
                Ext.MessageBox.getDialog().on('show', function(d) {
                var div = Ext.get(d.el);
                var text = div.select('.ext-mb-textarea', true);
                if (text.item(0)) {
                text.item(0).dom.select();
                text.item(0).dom.readOnly = true;
                text.item(0).dom.onclick= function(){this.select()};
                }
                });

            }
        }, '->', {
            tooltip: {title: this.p.SubmitLocations,text:this.p.SubmitNew},
            iconCls:'p_add',
            id : 'b2',
            text: this.p.SubmitLocations,
            handler : function(e){
                var a = (mr ? '/' : '&');
                var b = (mr ? '/' : '=');
                var addurl = url + (mr ? eval(gn+".v.cname") : 'index.php?categoryid='+eval(gn+".v.ccid")) + a + 'p'+eval(gn+".v.pid")+'_action' + b + 'add';
                location.href = addurl;
            }
        }
         
        ],
        
        iconCls:'icon-grid'

        

    });
    this.grid.render();
    this.ds.load({callback: function( r, options, success){
                if(ce(eval(gn+".s"))){
                var s = eval(gn+".s");
                s += "";
                var gg = eval(gn+".grid");              
                var row = gg.getStore().indexOfId(s);
                var rec = gg.getStore().getAt(row);
                gg.getSelectionModel().selectRow(row);
                gg.view.focusRow(row);
                m_s = true;
                mapc.go_to(rec.get('lat'),rec.get('lon'),rec.get('zoom'),rec.get('mid'));                 
                }
            }});
    }
    
    
}