// $Id: webapp.js 1397 2008-06-12 00:48:37Z 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.listfilter = "";
    this.dialog = null;

    this.pagenum = 0;
    this.curpage = 1;    
    this.allnum = 0;
}
webapp.prototype = {
    init: function() {
        if($('#target').length) { // for toppage
            $('#target').fold({side: 'right',
                               turnImage: '/css/common/fold-sw.png',
                               autoCurl: true,
                               directory: '.'});
        }
        if($('#aboutmetab').length) { // for about me
            $('#aboutmetab').tabs();
            $('#aboutmetab').tabs('select', 0);
        }
    },
    
    getList: function(classname,page,funcname,mergedata) {
        this.resetMCE("contents");
        this.startLoading();
        var ownobj = this;

        if(page==0) {
            page=this.curpage;
        }

        var data = {
            classname: classname,
            method: "getList",
            page: page,
            filter: this.listfilter,
            token: this.token    
        };
        
        if(this.js_framework=="jquery") {
            if(mergedata != undefined) {
                $.extend(data,mergedata);
            } 
            $.ajax({url: this.wwwpath+this.ajaxpath+"/",
                    data: data,
                    type: "POST",
                    dataType: "json",
                    success: function(data, textStatus) {
                        ownobj.finishLoading();
                        ownobj.token = data.token;
                        if(data.success) {
                            $("#content").html(data.contents);
                            $.tablesorter.defaults.widgets = ['zebra'];
                            $("#list").tablesorter();
                            ownobj.curpage = page;
                            ownobj.pagenum = data.pagenum;
                            ownobj.allnum = data.allnum;
                            ownobj.displayPageNavi(funcname);
                        } else {
                            ownobj.displayAlert(data.errormsg);
                        }
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrow) {
                        ownobj.finishLoading();
                        ownobj.displayAlert(textStatus+"<br />"+webappobj._("please reload the page"));
                    }
                });
        } else if(this.js_framework=="Ext") {
            if(mergedata != undefined) {
                date = Ext.apply(data,mergedata);
            } 
            Ext.Ajax.request({
                    url: this.wwwpath+this.ajaxpath+"/",
                    params: data,
                    method: "POST",
                    success: function(response) {
                        ownobj.finishLoading();
                        var data = eval("("+response.responseText+")");
                        if(data.success) {
                            Ext.get("content").dom.innerHTML = data.contents;
                            var grid = new Ext.grid.TableGrid("list",{stripeRows: true});
                            grid.render();
                            ownobj.curpage = page;
                            ownobj.pagenum = data.pagenum;
                            ownobj.allnum = data.allnum;
                            ownobj.displayPageNavi(funcname);
                        } else {
                            ownobj.displayAlert(data.errormsg);
                        }
                    },
                    failure: function(response) {
                        ownobj.finishLoading();
                        ownobj.displayAlert(response.statusText+"<br />"+webappobj._("please reload the page"));
                    }
                });
        }
    },
    
    getForm: function(classname,id) {
        this.resetMCE("contents");

        this.startLoading();
        var ownobj = this;
        if(this.js_framework=="jquery") {
            $.ajax({
                    url: this.wwwpath+this.ajaxpath+"/",
                    data: {
                        classname: classname,
                        method: "getForm",
                        itemid: id,
                        token: this.token
                    },
                    type: "POST",
                    dataType: "json",
                    success: function(data, textStatus) {
                        ownobj.finishLoading();
                        ownobj.token = data.token;
                        if(data.success) {
                            $("#content").html(data.contents);
                            if(data.mce && tinyMCE != undefined) {
                                eval("tinyMCE.init("+data.mce+");");
                            }
                        } else {
                            ownobj.displayAlert(data.errormsg);
                        }
                    },
                    error: function(XMLHttpRequest, textStatus, errorThrow) {
                        ownobj.finishLoading();
                        ownobj.displayAlert(textStatus+"<br />"+webappobj._("please reload the page"));
                    }
                });
        } else if(this.js_framework=="Ext") {
            Ext.Ajax.request({
                    url: this.wwwpath+this.ajaxpath+"/",
                    params: {
                        classname: classname,
                        method: "getForm",
                        itemid: id,
                        token: this.token
                    },
                    method: "POST",
                    success: function(response) {
                        ownobj.finishLoading();
                        var data = eval("("+response.responseText+")");
                        if(data.success) {
                            Ext.get("content").dom.innerHTML = data.contents;
                            if(data.mce && tinyMCE != null) {
                                eval("tinyMCE.init("+data.mce+");");
                            }
                        } else {
                            ownobj.displayAlert(data.errormsg);
                        }
                    },
                    failure: function(response) {
                        ownobj.finishLoading();
                        ownobj.displayAlert(response.statusText+"<br />"+webappobj._("please reload the page"));
                    }
                });
        }            
    },

    resetMCE: function(target) {
        if(tinyMCE == null) {
            return;
        }
        if(this.js_framework=="jquery") {
            if(tinyMCE.activeEditor!=undefined) {
                if($("#"+target).length!=0) {
                    tinyMCE.execCommand('mceRemoveControl', true, target);
                } else {
                    tinyMCE.remove(tinyMCE.activeEditor);
                }
            }
        } else if(this.js_framework=="Ext") {
            if(tinyMCE.activeEditor!=undefined) {
                if(Ext.get(target)!=null) {
                    tinyMCE.execCommand('mceRemoveControl', true, target);
                } else {
                    tinyMCE.remove(tinyMCE.activeEditor);
                }
            }
        }
    },
    

    startLoading: function(target) {
        if(this.js_framework=="jquery") {
            if($("#mask").length==0) {
                if(target == undefined) {
                    var el = "body";
                } 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.getBody();
            } 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
                });
        }
    },

    displayPageNavi: function(funcname) {
        if(funcname=="") {
            return;
        }
        
        if(this.js_framework=="jquery") {
            var naviobj = $(".navi");
        } else if(this.js_framework=="Ext") {
            var naviobj = Ext.query(".navi");
        }
        var navistr = "";
        navistr += "<span class='pagenaviall'>"+webappobj._("total : ")+this.allnum+webappobj._("items")+"</span>";
        if(naviobj.length != 0 && this.pagenum > 1) {
            navistr += "<span class='pagenavinum'>";
            navistr += "<a href='javascript: "+funcname+"(1)'>&lt;&lt;</a>";
            navistr += "</span>";
            for(i=1;i<=this.pagenum;i++) {
                if(i!=this.curpage) {
                    navistr += "<span class='pagenavinum'>";
                    navistr += "<a href='javascript: "+funcname+"("+i+")'>"+i+"</a>";
                } else {
                    navistr += "<span class='pagenavinum curpage'>";
                    navistr += i;
                }
                navistr += "</span>";
            }
            navistr += "<span class='pagenavinum'>";
            navistr += "<a href='javascript: "+funcname+"("+this.pagenum+")'>&gt;&gt;</a>";
            navistr += "</span>";
        }
        if(this.js_framework=="jquery") {
            naviobj.html(navistr);
        } else if(this.js_framework=="Ext") {
            for(var i=0;i<naviobj.length;i++) {
                naviobj[i].innerHTML = navistr;
            }
        }
    },

    resetPaging: function() {
        this.pagenum = 0;
        this.curpage = 1;
        this.allnum = 0;
        this.listfilter = "";
    },
    
    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;
var objlist = ["webappobj"];
    
/** 
 * decode strings as JavaScript code.
 * see includes/Utiliti.class.php Utility::jsEncode().
 */
function jsdecode(str) {
    eval(decodeURIComponent(unescape(str)));
}
