// zooloo framework
function ZoolooFramework() {
    var _zt = '';
    var _editorBasePath = '/js/fckeditor/';
    this.dummyImg = '/images/pixel.gif';
    this.getEditorBasePath = function() { return _editorBasePath; };
    this.setEditorBasePath = function(path) { if(typeof path == 'string') _editorBasePath = path; };
    this.setZt = function(zt) { if(typeof zt == 'string') _zt = zt; };
    this.alert = function(alertMsg,alertTitle,alertCallback) { jAlert(alertMsg,alertTitle,alertCallback); };
    this.notify = function(notificationMsg) { $.jGrowl(notificationMsg); };
    this.confirm = function(confirmMsg,confirmTitle,confirmOkCallback,confirmCancelCallback) {
        if(!confirmTitle) confirmTitle = ZMsg.DEFAULT_CONFIRM_BOX_TITLE;
        var confirmCallback = function(val) {
            if(val) {
                if(confirmOkCallback) { confirmOkCallback(); }
            }
            else {
                if(confirmCancelCallback) { confirmCancelCallback(); }
            }
        };
        jConfirm(confirmMsg,confirmTitle,confirmCallback);
    };
    this.tooltip = function(selector,additionalOptions) {
        (additionalOptions instanceof Object) ? $(selector).tooltip(additionalOptions) : $(selector).tooltip();
    };
    this.displayErrors = function(response,targetContainer,showDetailErrMsg,afterCallback) {
        var delimiter = (targetContainer) ? '<br/>' : "\n";
        showDetailErrMsg = (showDetailErrMsg!==0) ? 1 : 0;
        var errMsg = '';
        if(response.error) { errMsg+=response.error+delimiter; }
        if(response.data && showDetailErrMsg==1) {
            var errs = response.data.errors;
            if(errs) {
                for(var k in errs) {
                    if(errs[k]) {
                        errMsg+=errs[k]+delimiter;
                    }
                }
                if(afterCallback instanceof Function) { afterCallback(); }
            }
        }
        if(targetContainer) {
            targetContainer.show();
            targetContainer.html(errMsg);
            if(afterCallback instanceof Function) { afterCallback(); }
        }
        else { this.alert(errMsg,null,afterCallback); }
    };
    this.displayAd = function(adContent) {
        if(adContent) {
            $.modal.close(false);
            $(adContent).modal({onClose: function(dialog){ $.modal.close(false); }});
        }
    };
    this.zfBlockUI = function(blockMsg) {
        var options = {
            css:{padding:0,margin:0,border:0,backgroundColor:'transparent',cursor:'wait',fontSize:'40px',color:'#00abff',fontWeight:'bold'},
            overlayCSS:{backgroundColor:'#00abff',opacity:'0.1'},
            baseZ:10000,
            applyPlatformOpacityRules: false
        };
        if(blockMsg) { options.message = blockMsg; }
        else blockMsg = '<img src="/images/processing.png" />';
        $.blockUI(options);
    };
    this.zfUnblockUI = function() { $.unblockUI(); };
    this.zfAjaxPost = function(postUrl, postData, preventInteractions, postSuccessCallback, postErrorCallback, additionalOptions) {
        preventInteractions = (preventInteractions===true) ? true : false;

        if(!(postSuccessCallback instanceof Function)) {
            postSuccessCallback = function(response) {
                try {
                    if(response.status!=1) {
                        var errMsg = response.error;
                        if(errMsg) { this.alert(errMsg); }
                    }
                }
                catch(err) {}
            };
        }
        if(!(postErrorCallback instanceof Function)) { postErrorCallback = function() {}; }
        
        postUrl = _tokenizeUrl(postUrl);
        ajaxOptions = {
            type:'POST',
            url:postUrl,
            data:postData,
            timeout:30000,
            beforeSend:function() { if(preventInteractions) { ZFramework.zfBlockUI('<img src="/images/processing.png" />'); } },
            complete:function() { if(preventInteractions) { ZFramework.zfUnblockUI(); } },
            success:function(response) {
                try {
                    if(preventInteractions) { ZFramework.zfUnblockUI(); }
                    response = JSON.parse(response);
                    if(!(response instanceof Object)) { throw('JSON.parse'); }
                    if(response.status==0 && response.session==0) {
                        if(response.force==1) window.location.reload();
                        else ZFramework.alert(ZFramework.i18n(ZMsg.SESSION_EXPIRED),null,function(){ window.location.reload(); });
                    }
                    else {
                        if(!response.data) { response.data = {}; }
                        if(postSuccessCallback instanceof Function) { postSuccessCallback(response); }
                    }
                }
                catch(err) {
                    if(preventInteractions) ZFramework.alert(ZFramework.i18n(),null,function(){ if(err.message!='JSON.parse') window.location.reload(); });
                }
            },
            error:function() {
                if(preventInteractions) { ZFramework.zfUnblockUI(); }
                if(postErrorCallback instanceof Function) { postErrorCallback(); }
            }
        };

        if(additionalOptions instanceof Object) {
            for(var i in additionalOptions) {
                if(additionalOptions[i]) { ajaxOptions[i] = additionalOptions[i]; }
            }
        }

        $.ajax(ajaxOptions);
    };
    this.zfMakeDraggable = function(selector,helper,dragcallback,additionalOptions) {
        if(!dragcallback) { dragcallback = function(ev,ui) {}; }
        var dragOptions = {
            delay       : 200,
            revert        : true,
            opacity        : 0.7,
            helper        : helper,    // or a function that returns a dom element
            zIndex        : 10000,
            drag        : function(ev,ui) { dragcallback(ev,ui); }
        };
        // add additional options
        if(additionalOptions instanceof Object) {
            for(var i in additionalOptions) {
                if(additionalOptions[i]) { dragOptions[i] = additionalOptions[i]; }
            }
        }
        $(selector).draggable(dragOptions);
    };
    this.zfMakeDroppable = function(selector,acceptSelector,dropcallback,additionalOptions) {
        if(!dropcallback) { dropcallback = function(ev,ui) {}; }
        var dropOptions = {
            accept        : acceptSelector,
            drop        : function(ev,ui) { dropcallback(ev,ui); }
        };
        // add additional options
        if(additionalOptions instanceof Object) {
            for(var i in additionalOptions) {
                if(additionalOptions[i]) { dropOptions[i] = additionalOptions[i]; }
            }
        }
        $(selector).droppable(dropOptions);
    };
    this.zfMakeSortable = function(selector,acceptSelector,fromOtherSelector,updateCallback,additionalOptions) {
        // add preprocessing for stop
        var newUpdateCallback = function(ev,ui) {
            if(updateCallback instanceof Function) { updateCallback(ev,ui); }
        };
        var sortOptions = {
            delay       : 200,
            placeholder : 'fw_sortspot',
            items       : acceptSelector,
            connectWith : $(fromOtherSelector),
            update      : newUpdateCallback
        };
        // add additional options
        if(additionalOptions instanceof Object) {
            for(var i in additionalOptions) {
                if(additionalOptions[i]) { sortOptions[i] = additionalOptions[i]; }
            }
        }
        // add preprocessing for start
        var startCallback = sortOptions.start;
        var newStartCallback = function(ev,ui) {
            if(startCallback instanceof Function) { startCallback(ev,ui); }
        };
        sortOptions.start = newStartCallback;
        $(selector).sortable(sortOptions);
    };
    this.i18n = function(msg,args) {
        var defaultMsg = ZMsg.DEFAULT_MESSAGE;
        try {
            // message id must be supplied
            if(!msg || typeof msg != 'string') { return defaultMsg; }
            // argument must be json, if supplied
            if(args) {
                if(!(args instanceof Object)) { return defaultMsg; }
            }
            else return msg;

            // process message
            var k,v,re;
            for(k in args) {
                if(args[k]) {
                    v = args[k];
                    re = new RegExp('{{'+k+'}}','g');
                    msg = msg.replace(re,v);
                }
            }
            return msg;
        }
        catch(err) { return defaultMsg; }
    };
    this.setInputMaxLength = function(selector,maxlength) {
        $(selector).keypress(function(e) {
            if(e.which!=0 && e.which!=13 && e.which!=8 && $(this).val().length>=maxlength && (this.selectionStart==this.selectionEnd)) {
                return false;
            }
        }).bind('paste',function() {
            setTimeout(function(){
                var el = $(selector);
                var str = el.val();
                if(str.length>maxlength) el.val(str.substr(0,maxlength));
            },10);
        });
    };
    this.generateGUID = function() {
        var result, i, j;
        result = '';
        for(j=0; j<32; j++) {
            if( j == 8 || j == 12|| j == 16|| j == 20) { result = result + '-'; }
            i = Math.floor(Math.random()*16).toString(16).toUpperCase();
            result = result + i;
        }
        return result;
    };
    this.objectExists = function(objectName) {
        try {
            var re = /^[a-zA-Z_\x7f-\xff][a-zA-Z_\x7f-\xff]*$/;
            if(objectName.match(re)) {
                var c = eval(objectName);
                return (c instanceof Object) ? true : false;
            }
            return false;
        }
        catch(error) { return false; }
    };
    this.getHashParams = function () {
        var hashParams = {};
        var hash = window.location.hash.substr(1);
        var paramPairs = hash.split('&');
        if(paramPairs.length>0) {
            for(var k in paramPairs) {
                if(paramPairs[k] && paramPairs[k].indexOf('=')!=-1) {
                    var parts = paramPairs[k].split('=');
                    hashParams[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]).replace(/\+/g,' ');
                }
            }
        }
        return hashParams;
    };
    
    this.getQueryParams = function () {
        var queryParams = {};
        var query = window.location.search.substr(1);
        var paramPairs = query.split('&');
        if(paramPairs.length>0) {
            for(var k in paramPairs) {
                if(paramPairs[k] && paramPairs[k].indexOf('=')!=-1) {
                    var parts = paramPairs[k].split('=');
                    queryParams[decodeURIComponent(parts[0])] = decodeURIComponent(parts[1]).replace(/\+/g, ' ');
                }
            }
        }
        return queryParams;
    };

    this.openWindow = function(url, name, options, successCallback) {
        if(typeof successCallback!='function') { successCallback = function() {}; }
        var win = window.open(url, name, options);
        win.focus();
        if (typeof win == 'object') {
            win.focus();
            var interval = setInterval(function(){
                if (!win || win.closed) {
                    clearInterval(interval);
                    successCallback();
                }
            }, 500);
        }
    };


    function _tokenizeUrl(targetUrl) {
        targetUrl+=(targetUrl.indexOf('?')!=-1)?'&':'?';
        targetUrl+='_zt='+_zt;
        return targetUrl;
    }
    
}

var ZFramework = new ZoolooFramework();