var CSV = {
    escTk : function(str) {
        return (str.indexOf('"') >= 0 || str.indexOf(',') >= 0) ? ('"' + str.replace(/"/g, '""') + '"') : str;
    },

    prsIts : function(str, nrItems, idx) {
        var result = new Array();
        var i = 2;
        var strlen = str.length;
        nrItems += 2;
        while (i < nrItems) {
            var startIdx = idx;
            var ghiliOK = 1;
            while (1) {
                if (strlen <= idx) break;
                var chr = str.charAt(idx);
                if (chr == '"') ghiliOK = ghiliOK ? 0 : 1;
                if ((chr == ',') && ghiliOK) break;
                idx++;
            }
            if (ghiliOK) {
                var item = (startIdx != idx) ? str.substring(startIdx, idx) : "";
                if (item.charAt(0) == '"') item = this.uescTk(item);
                result[i++] = item;
                idx++;
                if (idx >= strlen) break;
            } else {
                alert('Incorrect CSV String');
                break;
            }
        }
        result[1] = idx;
        result[0] = i - 2;
        return result;
    },

    uescTk : function (str) {
        if (str.charAt(0) == '"') {
            str = str.substring(1, str.length - 1);
        }
        str = str.replace(/""/g, '"');
        return str;
    },

    decode : function (s) {
        if (!s) return null;
        var slen = s.length;
        var result = new Array();
        var i = 0;
        while (1) {
            if (slen <= i) break;
            var item = this.prsIts(s, 1, i);
            if (item[0] != 1) break;
            i = item[1];
            result[result.length] = item[2];
        }
        return result;
    },

    encode : function(ar) {
        if (!ar) return null;
        var rez = "";
        for (var i = 0; i < ar.length; i++) rez = rez + ((i > 0) ? ',' : '') + this.escTk(ar[i]);
        return rez;
    }
}

var Popup = {
    open: function(tg, url, w, h) {
        var args = "HEIGHT=" + h + ",WIDTH=" + w +
                   ",SCROLLBARS=YES,STATUS=YES,RESIZABLE=YES,LOCATION=NO,LEFT=" +
                   (window.screen.availWidth - w) / 2 +
                   ",TOP=" + (window.screen.availHeight - h) / 2;
        var r = window.open(url, tg, args);
        r.focus();
        return r;
    }
}

var Stylez = {
    activate : function(p, sf) { // p=preffix, sf=suffix
        var sz = document.styleSheets;
        if (!sz) return;
        for (var i = 0; i < sz.length; i++) {
            var s = sz[i], t = s.title;
            if (t.indexOf(p) == 0) {
                s.disabled = true;
                if (t.indexOf(sf) != -1) s.disabled = false;
            }
        }
    },

    getCurrent:function (p) { // p=preffix
        var sz = document.styleSheets;
        if (!sz) return;
        for (var i = 0; i < sz.length; i++) {
            var s = sz[i], t = s.title;
            if (t.indexOf(p) == 0) {
                if (s.disabled) continue;
                return t;
            }
        }
        return null;
    }
}

var Cuki = {
    create:function (name, value, days)
    {
        var expires = "";
        if (days) {
            var date = new Date();
            date.setTime(date.getTime() + (days * 24 * 60 * 60 * 1000));
            expires = "; expires=" + date.toGMTString();
        }
        document.cookie = name + "=" + value + expires + "; path=/";
    },

    read:function(name) {
        var nameEQ = name + "=";
        var ca = document.cookie.split(';');
        for (var i = 0; i < ca.length; i++) {
            var c = ca[i];
            while (c.charAt(0) == ' ') c = c.substring(1, c.length);
            if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length, c.length);
        }
        return null;
    }
}

var SCR = {
    pageSize : function() {
        var d = document.documentElement, b = document.body, s = self, w = window;
        return [w.innerWidth || s.innerWidth || (d && d.clientWidth) || b.clientWidth,
                w.innerHeight || s.innerHeight || (d && d.clientHeight) || b.clientHeight];
    },

    pageScroll : function() {
        var t, l, d = document.documentElement, b = document.body, s = self;
        return [s.pageYOffset || (d ? d.scrollTop : null) || (b ? b.scrollTop : null) || 0,
                s.pageXOffset || (d ? d.scrollLeft : null) || (b ? b.scrollLeft : null) || 0];
    }
}

var SelectableList = {
    reg : new Array(),
    init : function(ulId, multiple, ovrClass, selClass, oc) {
        var u = $('ul.selectable-list#' + ulId);
        this.reg[ulId] = [u, multiple, ovrClass, selClass, oc];
        u.find('li').each(function() {
            this.onclick = function() {
                SelectableList.toggle(this);
                oc(this);
            }
            if (ovrClass)
                $(this).hover(
                        function() {
                            $(this).addClass(ovrClass);
                        },
                        function() {
                            $(this).removeClass(ovrClass);
                        });
        });
    },
    toggle : function(li) {
        var el = $(li);
        var ul = SelectableList.reg[el.parent("ul.selectable-list")[0].id];
        if (el.attr('sel')) SelectableList.unSelect(el, ul[3]);
        else {
            if (!ul[1]) {
                //                alert('multiple:' + ul[0].attr('id'));
                $('ul.selectable-list#' + ul[0].attr('id')).find('li[@sel]').each(function() {
                    SelectableList.unSelect($(this), ul[3]);
                });
            }
            SelectableList.doSelect(el, ul[3]);
        }
    },
    doSelect : function(jq, cl) {
        jq.addClass(cl);
        jq.attr("sel", 'true');
    },
    unSelect : function(jq, cl) {
        jq.removeClass(cl);
        jq.removeAttr("sel");
    },
    getSelection : function(ulId) {
        var res = new Array();
        $('ul.selectable-list#' + ulId).find('li[@sel]').each(function() {
            res[res.length] = this.id;
        });
        return res;
    }
}

var StrConst = {
    jsv : "javascript:void(null)"
}

var IsrcToolbar = {
    ver : "1.0",
    reg : new Array(),
    init: function(id, eventHandler, cssClass, arr_items, busyImg) {
        this.reg[id] = {
            'id': id,
            'eh': eventHandler,
            'cssClass': cssClass,
            'busyImg': busyImg,
            'busy':0
        };
        var items = new Array();
        // id, img
        for (var i = 0; i < arr_items.length; i++) {
            items[items.length] = {'id' : arr_items[i][0], 'img':arr_items[i][1], 'txt': arr_items[i][2]};
            // preload icons
            var im = new Image();
            im.src = arr_items[i][1];
            items[items.length - 1].d_img = im;
        }
        this.reg[id]['items'] = items;
        this._rebuild(id);
        return {
            getId : function() {
                return id;
            },
            rebuild: function() {
                return IsrcToolbar._rebuild(id);
            },
            disable: function(it_id) {
                IsrcToolbar._disable(id, it_id);
            },
            enableAll: function() {
                IsrcToolbar._enableAll(id);
            },
            beBusy: function() {
                IsrcToolbar._beBusy(id);
            },
            stopBusy: function() {
                IsrcToolbar._stopBusy(id);
            }
        };
    },
    _beBusy: function(id) {
        var t = this.reg[id];
        if (!t['busy']) {
            t['busy'] = 1;
            $('#' + id + " td.loading").html('<img border="0" src="' + t['busyImg'] + '"/>');
        }
    },
    _stopBusy: function(id) {
        var t = this.reg[id];
        if (t['busy']) $('#' + id + " td.loading img").remove();
    },
    _enableAll: function(id) {
        var itz = this.reg[id]['items'];
        for (var i = 0; i < itz.length; i++) {
            itz[i]['on'] = 1;
        }
    },
    _disable: function(id, it_id) {
        var itz = this.reg[id]['items'];
        for (var i = 0; i < itz.length; i++) if (itz[i]['id'] == it_id) {
            itz[i]['on'] = null;
            break;
        }
    },
    _click: function(id, it_id) {
        var t = this.reg[id];
        //        alert('clicked:' + t['busy'] + ":" + t['eh'] + ":" + it_id);
        if (!t['busy'] && t['eh']) t['eh'](it_id);
    },
    _rebuild: function(id) {
        var t = this.reg[id];
        var itz = t['items'];
        var r = "<table cellpadding='0' cellspacing='0' border='0' id='" + id + "' class='" + t['cssClass'] + "' style='display:none;'><tr>"
        r += "<td class='loading'></td>";
        for (var i = 0; i < itz.length; i++) {
            if (!itz[i]['on']) continue;
            // id, pic, text,
            r += "<td align='center'><a title='" + (itz[i]['txt'] ? itz[i]['txt'] : "") +
                 "' href='javascript:void(null);' onclick='IsrcToolbar._click(\"" + id +
                 "\",\"" + itz[i]['id'] + "\");' class='ti'>";
            r += "<img border='0' class='im' src='" + itz[i]['img'] + "'/>";
            r += "</td>";
        }
        $(r + "</table>");
        var ex = $('#' + id);
        if (ex) ex.remove();
        //        alert(r);
        $('body').append(r);
    }
}

var Misc = {
    redirect: function(url) {
        setTimeout("window.location.href='" + url + "';", 0);
    }
}


var Tabs = {
    reg : new Array(),
    init: function(id, tabClass, trigClass, selTab) {
        this.reg[id] = {
            'tabClass' : tabClass, // tab class (placeholder for tab)
            'trigClass': trigClass, // trigger class (ex: li/a/td... etc), triggers have id: trig_{tab_id}
            'selected': selTab
        };

        $('#' + id).find("[@class=" + tabClass + "]").each(function(i) {
            var trig = document.getElementById('trig_' + this.id);
            var tab_id = this.id;
            if (trig) trig.onclick = function() {
                Tabs.selectTab(id, tab_id);
            }
        });
    },
    selectTab: function(id, tab_id) {
        var t = this.reg[id];
        var s = t['selected'];
        var trigClass = t['trigClass'];

        if (s) {
            $('#' + s).hide();
            $('#trig_' + s).removeClass(trigClass[0]);
            $('#trig_' + s).addClass(trigClass[1]);
        }

        t['selected'] = tab_id;
        $('#' + tab_id).show();
        $('#trig_' + tab_id).removeClass(trigClass[1]);
        $('#trig_' + tab_id).addClass(trigClass[0]);
    }
}
