// $Id: webapp.js 1916 2009-03-09 01:33:10Z keisuke $

/** 
 * class webapp
 */
var webapp = function() {
    this.appname = "";
    this.token = "";
    this.wwwpath = "/";
    this.ajaxpath = "ajax";
    this.sidname = "";
    this.js_framework = "";

    this.username = "";
    this.userid = 0;
    this.role_mode = "";
    this.userroles = null;

    this.dialog = null;

    this.map = null;

    // current values
    this.photoid = [];
    this.photourl = [];
    this.point = null;
    this.marker = null;

    // archive values
    this.markers = [];
}
webapp.prototype = {
    init: function() {
        if(GBrowserIsCompatible()) {
            var selfobj = this;
            this.map = new GMap2(document.getElementById("map"));
            this.map.addControl(new GLargeMapControl());
            this.map.addControl(new GMapTypeControl());
            this.map.addControl(new GOverviewMapControl());
            geocoder = new GClientGeocoderWithGeodosu("case-k");
            var address = getCookie("address");
            var zoom = parseInt(getCookie("zoom"));
            if(address=="") {
                address = "東京都";
            }
            if(isNaN(zoom)) {
                zoom = 3;
            }
            geocoder.getLatLng(address, function(point) {
                if (!point) {
                    alert(address + " not found");
                } else {
                    selfobj.map.setCenter(point, zoom);
                }
            });

            GEvent.addListener(this.map, 'click', function(overlay, point) {
                if(point) {
                    selfobj.addMarker(point);
                }
            });

            GEvent.addListener(this.map, 'zoomend', function(oldlevel, newlevel) {
                setCookie("zoom",newlevel,90);
            });
        } else {
            this.displayAlert(this._("Your browser is not comatible for Google Maps..."));
        }
    },

    addMarker: function(point) {
        var icon = new GIcon();
        icon.image = "/images/pushpin.png";
        icon.iconSize = new GSize(20, 34);
        icon.iconAnchor = new GPoint(10, 34);
        var markeropts = {
            icon: icon,
            draggable: true
        }
        this.marker = new GMarker(new GLatLng(point.y,point.x),markeropts);
        this.map.addOverlay(this.marker);
        this.point = point;
        this.photoid = [];
        this.photourl = [];
        this.getPhotoList(1);
    },

    getPhotoList: function(page) {
        var ownobj = this;
        this.startLoading();
        $.ajax({url: this.wwwpath+this.ajaxpath+"/",
            data: {
                classname: "GeotagAjax",
                method: "getFlickrList",
                page: page,
                token: this.token
            },
            type: "POST",
            dataType: "json",
            success: function(data, textStatus) {
                ownobj.finishLoading();
                ownobj.token = data.token;
                if(data.success) {
                    ownobj.closeDialog();
                    ownobj.displayDialog({
                        title: ownobj._("Flickr Image Chooser"),
                        width: 500,
                        height: 420,
                        modal: true,
                        resize: ownobj.sizingDialogContents,
                        buttons: {
                            'OK': function() {
                                 if(!ownobj.photoid.length) {
                                     alert(ownobj._("Please selecte target photo."));
                                     return;
                                 }
                                 ownobj.closeDialog();
                                 ownobj.setPoint();
                            },
                            'cancel': function() {
                                 ownobj.closeDialog();
                                 ownobj.map.removeOverlay(ownobj.marker);
                            }
                        },
                        close: function() {
                            ownobj.map.removeOverlay(ownobj.marker);
                        }
                    });
                    ownobj.setDialogContents(data.contents);
                    var nav = "<span id='navibox'>";
                    if(page==1) {
                        nav += "prev";
                    } else {
                        nav += "<a href='javascript: webappobj.getPhotoList("+(page-1)+");'>prev</a>";
                    }
                    nav += "&nbsp;"+page+"/"+data.pagenum+"&nbsp;(all:"+data.photonum+"photos)&nbsp;";
                    if(page==data.pagenum) {
                        nav += "next";
                    } else {
                        nav += "<a href='javascript: webappobj.getPhotoList("+(page+1)+");'>next</a>";
                    }

                    nav += "&nbsp;|&nbsp;<a href='javascript: webappobj.clearPhotoId();'>clear selection</a>"
                    nav += "</span>";
                    $(".ui-dialog-buttonpane").append(nav);

                    for(var i=0;i<ownobj.photoid.length;i++) {
                        $("#photo"+ownobj.photoid[i]).addClass("selected");
                    }
                    
                    $("#message").html(data.message);
                } else {
                    ownobj.displayAlert(data.errormsg);
                    $("#message").html("");
                    ownobj.map.removeOverlay(ownobj.marker);
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrow) {
                ownobj.finishLoading();
                $("#message").html("");
                ownobj.map.removeOverlay(ownobj.marker);
                ownobj.displayAlert(textStatus+"<br />"+ownobj._("please reload the page"));
            }
        });
    },
    
    setPoint: function() {
        var ownobj = webappobj;

        if(!ownobj.photoid) {
            $("#message").html(ownobj._("invalid parameter"));
            return;
        }
        
        ownobj.startLoading();

        var params = "classname=GeotagAjax&method=addGeoTag";
        for(var i=0;i<ownobj.photoid.length;i++) {
            params += "&photoid[]="+ownobj.photoid[i];
        }
        params += "&lat="+ownobj.point.y;
        params += "&lon="+ownobj.point.x;
        params += "&token="+this.token;
        
        $.ajax({url: ownobj.wwwpath+ownobj.ajaxpath+"/",
            data: params,
            type: "POST",
            dataType: "json",
            success: function(data, textStatus) {
                ownobj.finishLoading();
                ownobj.token = data.token;
                if(data.success) {
                    $("#message").html(data.message);
                    ownobj.markers.push([ownobj.marker,ownobj.photoid,ownobj.photourl]);
                    GEvent.addListener(ownobj.marker, 'click', function() {
                        webappobj.showMarkerPhoto(this);
                    });

                    GEvent.addListener(ownobj.marker, 'dragend', function() {
                        webappobj.resetPoint(this);
                    });
                    
                } else {
                    $("#message").html("");
                    ownobj.displayAlert(data.errormsg);
                    ownobj.map.removeOverlay(ownobj.marker);
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrow) {
                ownobj.finishLoading();
                $("#message").html("");
                ownobj.map.removeOverlay(ownobj.marker);
                ownobj.displayAlert(textStatus+"<br />"+ownobj._("please reload the page"));
            }
        });
    },

    resetPoint: function(overlay) {
        var p = overlay.getPoint();
        for(var i=0;i<this.markers.length;i++) {
            if(this.markers[i][0].getPoint() == p) {
                break;
            }
        }
        var marker = this.markers[i][0];
        var photoid = this.markers[i][1];


        var params = "classname=GeotagAjax&method=addGeoTag";
        for(var i=0;i<photoid.length;i++) {
            params += "&photoid[]="+photoid[i];
        }
        params += "&lat="+p.y;
        params += "&lon="+p.x;
        params += "&token="+this.token;

        
        var ownobj = this;
        ownobj.startLoading();
        $.ajax({url: ownobj.wwwpath+ownobj.ajaxpath+"/",
            data: params,
            type: "POST",
            dataType: "json",
            success: function(data, textStatus) {
                ownobj.finishLoading();
                ownobj.token = data.token;
                if(data.success) {
                    $("#message").html(data.message);
                } else {
                    $("#message").html("");
                    ownobj.displayAlert(data.errormsg);
                }
            },
            error: function(XMLHttpRequest, textStatus, errorThrow) {
                ownobj.finishLoading();
                $("#message").html("");
                ownobj.displayAlert(textStatus+"<br />"+ownobj._("please reload the page"));
            }
        });        
    },
    
    showMarkerPhoto: function(overlay) {
        var p = overlay.getPoint();
        for(var i=0;i<this.markers.length;i++) {
            if(this.markers[i][0].getPoint() == p) {
                break;
            }
        }
        var marker = this.markers[i][0];
        var str = "";
        for(var j=0;j<this.markers[i][1].length;j++) {
            str += "<div style='text-align: center; margin-bottom: 5px;'>";
            str += "<img src='http://"+this.markers[i][2][j]+"' />";
            str += "</div>";
        }
        
        this.map.openInfoWindowHtml(p,str);
    },

    setPhotoId: function(id,url) {
        $("#photo"+id).addClass("selected");
        this.photoid.push(id);
        this.photourl.push(url);
    },

    clearPhotoId: function() {
        $(".flickr-photo").removeClass("selected");
        this.photoid = [];
        this.photourl = [];
    },
    
    setAddress: function() {
        var address = $("#address").val();
        geocoder.getLatLng(address, function(point) {
            if (!point) {
                alert("["+address + "] is not found");
            } else {
                setCookie("address",address,90);
                var zoom = parseInt(getCookie("zoom"));
                if(isNaN(zoom)) {
                    zoom = 3;
                }
                webappobj.map.setCenter(point, zoom);
            }
        });
    },
    
    startLoading: function(target) {
        if(this.js_framework=="jquery") {
            if($("#mask").length==0) {
                if(target == undefined) {
                    var el = "#wrapper";
                } else {
                    var el = target;
                }
                $(el).append("<div id='mask'><div id='maskmsg'>"+webappobj._("Loading...")+"</div></div>");            
            }
        } else if(this.js_framework=="Ext") {
            if(target == undefined) {
                var el = Ext.getBody();
            } else {
                var el = Ext.get(target);
            }
            if(!el.isMasked()) {
                el.mask(webappobj._("Loading..."),"mskmsg");
            }
        }
    },

    finishLoading: function(target) {
        if(this.js_framework=="jquery") {
            if($("#mask").length!=0) {
                $("#mask").remove();
            }
        } else if(this.js_framework=="Ext") {
            if(target == undefined) {
                var el = Ext.get("#wrapper");
            } else {
                var el = Ext.get(target);
            }
            if(el.isMasked()) {
                el.unmask();
            }
        }
    },

    displayDialog: function(options) {
        if(this.js_framework=="jquery") {
            if($("#dialogbox").length==0) {
                $("body").append("<div id='dialogbox' class='flora'></div>");
            }
            $("#dialogbox").dialog(options);
            this.sizingDialogContents();
        } else if(this.js_framework=="Ext") {
            if(this.dialog!=null) {
                this.dialog.destroy();
                this.dialog = null;
            }
            this.dialog = new Ext.Window(options);
            this.dialog.show(Ext.getBody());
        } 
    },

    setDialogContents: function(contents) {
        if(this.js_framework=="jquery") {
            $("#dialogbox").html(contents);
            if($("#dialogbox").css("display")=="none") {
                $("#dialogbox").css("display","block");
            }
        } else if(this.js_framework=="Ext") {
            if(this.dialog!=null) {
                this.dialog.body.dom.innerHTML = contents;
            }
        } 
    },

    sizingDialogContents: function() {
        if(this.js_framework=="jquery") {
            dh = $(".ui-dialog").height();
            th = $(".ui-dialog-titlebar").height();
            bh = $(".ui-dialog-buttonpane").height();
            $("#dialogbox").css("height",dh-th-bh-25);
        }
    },

    closeDialog: function() {
        if(this.js_framework=="jquery") {
            if($("#dialogbox").length) {
                $("#dialogbox").dialog("destroy");
            }
        } else if(this.js_framework=="Ext") {
            if(this.dialog!=null) {
                this.dialog.destroy();
                this.dialog = null;
            }
        } 
    },
    
    displayConfirm: function(okfunc,confirm) {
        if(this.js_framework=="jquery") {
            this.displayDialog({
                    title: webappobj._("confirm"),
                    width: 400,
                    height: 120,
                    modal: true,
                    resizable: false,
                    buttons: {
                        "OK": okfunc,
                        "cancel": function() {
                            webappobj.closeDialog();
                        }
                    }
                });
            this.setDialogContents(confirm);
        } else if(this.js_framework=="Ext") {
            Ext.MessageBox.confirm(webappobj._("confirm"), confirm, function(btn) {
                    if(btn=="yes") {
                        okfunc();
                    }
                },this);
        }
    },

    displayAlert: function(alert, icon) {
        if(this.js_framework=="jquery") {
            this.displayDialog({
                    title: webappobj._("alert"),
                    width: 400,
                    height: 120,
                    modal: true,
                    resizable: false,
                    buttons: {
                        "OK": function() {
                            webappobj.closeDialog();
                        }
                    }
                });
            this.setDialogContents(alert);
        } else if(this.js_framework=="Ext") {
            if(icon == undefined) {
                icon = Ext.MessageBox.WARNING;
            }
            
            Ext.MessageBox.show({
                    title: webappobj._("alert"),
                    msg: alert,
                    buttons: Ext.MessageBox.OK,
                    icon: icon
                });
        }
    },

    checkRole: function(target,type,obj) {
        if(obj == undefined) {
            obj = this;
        }
        for(var i=0;i<obj.userroles.length;i++) {
            var item = obj.userroles[i];
            if(item.target==target && item.type==type) {
                return (obj.role_mode=="blacklist")?false:true;
            }
        }
        return (obj.role_mode=="blacklist")?true:false;
    },

    _: function(str) {
        var ret = str;
        if(this.appname && this.appRes != undefined) {
            eval("var res = this.appRes."+this.appname+";");
            for(var key in res) {
                if(key==str) {
                    value = res[key];
                    if(value!="") {
                        ret = decodeURIComponent(value);
                    }
                    break;
                }
            }
        }
        return ret;
    }
}

var tinyMCE = null;
    
/** 
 * decode strings as JavaScript code.
 * see includes/Utiliti.class.php Utility::jsEncode().
 */
function jsdecode(str) {
    eval(decodeURIComponent(unescape(str)));
}

function getCookie(name) {
  var search = name + "=";
  if (document.cookie.length > 0) { // if there are any cookies
    offset = document.cookie.indexOf(search);
    if (offset != -1) { // if cookie exists
      offset += search.length;
      // set index of beginning of value
      end = document.cookie.indexOf(";", offset);
      // set index of end of cookie value
      if (end == -1) {
        end = document.cookie.length;
      }
      return decodeURIComponent(document.cookie.substring(offset, end));
    }
  }
  return "";
}
function setCookie(name, value, expire) {
    if(expire!=undefined) {
        var d = new Date();
        d.setTime(d.getTime()+(60*60*24*expire*1000));
    }
    document.cookie = name + "=" + encodeURIComponent(value) + "; path=/"+ ((expire==undefined)?"":("; expires="+d.toGMTString()));
}
