﻿window.jsl = {__namespace:true,__typeName:"js",getName:function(){return "js"},__upperCaseTypes:{}};

jsl.registerNamespace = function(s) {
    var w = window;
    var l = s.split(".");
    var i;
    var o;
    var n;
    
    for (i = 0; i < l.length; i++) {
        n = l[i];
        o = w[n];
        if (o == null) {
            o = w[n] = {__namespace:true,__typeName:l.slice(0, i + 1).join(".")};
            o.getName = function() {return this.__typeName;};
        }
        w = o;
    }
}

jsl.registerEventHandler = function(element, eventName, funcObj, funcName, param3, param4, param5) {
    var eventHandler = function(e) {
		    if (e == null) {
		        e = window.event;
		    }
		    if (funcObj == null) {
		        funcObj = window;
		    }
		    return funcObj[funcName](e, element, param3, param4, param5);
		};
		
    if (element.attachEvent) {
		// MS registration model
		element.attachEvent('on' + eventName, eventHandler);
	}
	else if (element.addEventListener) {
		// NN (W4C) regisration model
		element.addEventListener(eventName, eventHandler, false);
	}
	else {
		// old regisration model as fall-back
		element[eventName] = eventHandler;
	}
}

jsl.About = {};
jsl.About.version = 0.1;
jsl.About.author = "Andy Sun";
jsl.About.releaseDay = "2009/6/1";

jsl.Browser = {};
jsl.Browser.name = navigator.appName;
jsl.Browser.version = parseFloat(navigator.appVersion);
if (navigator.userAgent.indexOf(" MSIE ") > -1) {
    if (navigator.appName.indexOf("Netscape") > -1) {
        jsl.Browser.version = parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]);
        jsl.Browser.name = "Firefox";
    }
    else {
        jsl.Browser.version = parseFloat(navigator.userAgent.match(/MSIE (\d+\.\d+)/)[1]);
        jsl.Browser.name = "MSIE";
    }
}
else if (navigator.userAgent.indexOf(" Firefox/")>-1) {
    jsl.Browser.version = parseFloat(navigator.userAgent.match(/Firefox\/(\d+\.\d+)/)[1]);
    jsl.Browser.name = "Firefox";
}
else if (navigator.userAgent.indexOf(" AppleWebKit/")>-1) {
    jsl.Browser.version = parseFloat(navigator.userAgent.match(/AppleWebKit\/(\d+(\.\d+)?)/)[1]);
    jsl.Browser.name = "Safari";
}
else if (navigator.userAgent.indexOf("Opera/")>-1) {
    jsl.Browser.name = "Opera";
}

jsl.EventHandleList = function() {
    this._objAry = new Array();
    this._funAry = new Array();
    
    this.AddHandler = function(obj, funcName) {
        var i;
        
        if (obj == null) {
            obj = window;
        }
        
        for (i = 0; i < this._objAry.length; i++) {
            if (this._objAry[i] === obj && this._funAry[i] === funcName) {
                return;
            }
        }
        this._objAry.jslAdd(obj);
        this._funAry.jslAdd(funcName);
    }
    
    this.Remove = function(obj, funcName) {
        var i;
        
        for (i = 0; i < this._objAry.length; i++) {
            if (this._objAry[i] === obj && this._funAry[i] === funcName) {
                this._objAry.splice(i, 1);
                this._funAry.splice(i, 1);
                break;
            }
        }
    }
    
    this.OnEvent = function(evt, obj) {
        var i;
        
        for (i = 0; i < this._objAry.length; i++) {
            this._objAry[i][this._funAry[i]](evt, obj);
        }
    }
}

jsl.rt = function() {};
jsl.rt._WndResizeHandler = null;
jsl.rt.AddWndResizer = function(obj, funcName) {
    if (jsl.rt._WndResizeHandler == null) {
        jsl.rt._WndResizeHandler = new jsl.EventHandleList();
        jsl.registerEventHandler(window, "resize", jsl.rt._WndResizeHandler, "OnEvent");
    }
    
    jsl.rt._WndResizeHandler.AddHandler(obj, funcName);
}
jsl.rt.RemoveWndResizer = function(obj, funcName) {
    if (jsl.rt._WndResizeHandler == null) {
        return;
    }
    jsl.rt._WndResizeHandler.Remove(obj, funcName);
}

jsl.rt._PageClickHandler = null;
jsl.rt.AddPageClicker = function(obj, funcName) {
    if (jsl.rt._PageClickHandler == null) {
        jsl.rt._PageClickHandler = new jsl.EventHandleList();
        jsl.registerEventHandler(document.body, "click", jsl.rt._PageClickHandler, "OnEvent");
    }
    
    jsl.rt._PageClickHandler.AddHandler(obj, funcName);
}

jsl.rt.RemovePageClicker = function(obj, funcName) {
    if (jsl.rt._PageClickHandler == null) {
        return;
    }
    jsl.rt._PageClickHandler.Remove(obj, funcName);
}

jsl.XMLHttpExecutor = function(url) {
    this._url = url;
    this._xmlHttp = null;
    this._completeHandler = new Array();
    this._handlerParam = new Array();
    this._isStarted = false;
    this._responseAvailable = false;
    this._responseValid = false;
    this._responseText = "";
    this._responseStatus = 0;
    var obj = this;
    this._onReadyStateChange = function() {
        var exp = null;
        
        if (obj._xmlHttp.readyState == 4) {
            obj._responseAvailable = true;
            obj._responseStatus = obj._xmlHttp.status;
            obj._responseText = obj._xmlHttp.responseText;
            if (obj._responseStatus == 200) {
                obj._responseValid = true;
            }
            
            var i;
            
            for (i = 0; i < obj._completeHandler.length; i++) {
                try {
                    obj._completeHandler[i](obj, obj._responseStatus, obj._responseText, obj._handlerParam[i]);
                }
                catch (e0) {
                    exp = e0;
                }
            }
            obj._isStarted = false;
            obj._xmlHttp.onreadystatechange = function() {};
            obj._xmlHttp = null;
            
            if (exp != null) {
                throw exp;
            }
        }
    };
}

jsl.XMLHttpExecutor.prototype = {
    get_url : function() {
        return this._url;
    },
    set_url: function(s) {
        this._url = s;
    },
    get_isStarted : function() {
        return this._isStarted;
    },
    get_responseText : function() {
        return this._responseText;
    },
    get_responseStatus : function() {
        return this._responseStatus;
    },
    get_responseValid : function() {
        return this._responseValid;
    },
    addComplete : function(f, param) {
        var idx = this._completeHandler.length;
        this._completeHandler[idx] = f;
        this._handlerParam[idx] = param;
        
    },
    invoke : function() {
        var exp = null;
        
        if(typeof XMLHttpRequest != "undefined") {
            this._xmlHttp = new XMLHttpRequest();
        }
        else {
            var ary = new Array("Msxml2.XMLHTTP.3.0", "Msxml2.XMLHTTP", "Microsoft.XMLHTTP");
            var i;
            
            for (i = 0; i < ary.length; i++) {
                try {
                    this._xmlHttp = new ActiveXObject(ary[i]);
                    break;
                }
                catch (e0) {
                    exp = e0;
                }
            }
        }
        if (this._xmlHttp != null) {
            this._xmlHttp.onreadystatechange = this._onReadyStateChange;
            this._xmlHttp.open("GET", this._url, true);
            this._xmlHttp.send(null);
            this._isStarted = true;
            this._responseAvailable = false;
            this._responseValid = false;
        }
        
        if (exp != null) {
            throw exp;
        }
    }
};

jsl.registerNamespace("jsl.bl");

var $jslGet = jsl.bl.getElementById = function(id, obj) {
    if (obj == null) {
        return document.getElementById(id);
    }
    if (obj.getElementById != null) {
        return obj.getElementById(id);
    }
    
    var i;
    var l = obj.childNodes;
    var node;
    var ary = new Array();
    
    for (i = 0; i < l.length; i++) {
        node = l[i];
        if (node.nodeType != 1) {
            ary[ary.length] = node;
        }
    }
    
    while (ary.length > 0) {
        node = ary.shift();
        if (node.id == id) {
            return node;
        }
        l = node.childNodes;
        for (i = 0; i < l.length; i++) {
            node = l[i];
            if (node.nodeType != 1) {
                ary[ary.length] = node;
            }
        }
    }
    
    return null;
}

jsl.bl.cloneRow = function(t, sR, idx) {
    var nR;
    var sC;
    var nC;
    var i;
    var c = sR.cells.length;
    
    if (idx == null || idx < 0 || idx > t.rows.length) {
        idx = t.rows.length;
    }
    
    nR = t.insertRow(idx);
    for (i = 0; i < c; i++) {
        sC = sR.cells[i];
        nC = nR.insertCell(i);
        nC.align = sC.align;
        nC.vAlign = sC.vAlign;
        nC.className = sC.className;
        nC.colSpan = sC.colSpan;
        nC.rowSpan = sC.rowSpan;
        nC.title = sC.title;
        nC.noWrap = sC.noWrap;
        nC.innerHTML = sC.innerHTML;
    }
    nR.className = sR.className;
    
    return nR;
}

jsl.bl.setChk = function(obj, hid) {
    hid.value = obj.checked;
}

jsl.bl.clickInput = function(obj) {
    var preObj = jsl.bl.getPreInput(obj);
    
    if (preObj != null) {
        preObj.click();
    }
}

jsl.bl.getPreInput = function(obj) {
    var preObj = obj.previousSibling;
    var i;
    
    for (i = 0; i < 10; i++) {
        if (preObj == null) {
            return null;
        }
        if (preObj.tagName != null && preObj.tagName.toLowerCase() == "input") {
            return preObj;
        }
        preObj = preObj.previousSibling;
    }
    
    return null;
}

jsl.bl.getTextNode = function(obj, create) {
    var ary = obj.childNodes;
    var i;
    var node;
    
    for (i = 0; i < ary.length; i++) {
        node = ary[i];
        if (node.nodeName.toLowerCase() == "#text") {
            return node;
        }
    }
    
    if (create) {
        node = document.createTextNode("");
        obj.appendChild(node);
        return node;
    }
    
    return null;
}

jsl.bl.getText = function(obj) {
    var node = jsl.bl.getTextNode(obj, false);
    
    if (node != null) {
        return node.nodeValue;
    }
    
    return "";
}

jsl.bl.setText = function(obj, s) {
    var node = jsl.bl.getTextNode(obj, true);
    
    if (s == null || s == "") {
        node.nodeValue = String.fromCharCode(160);
    }
    else {
        node.nodeValue = s;
    }
}

jsl.bl.selectTextRange = function(obj, start, end) {
    var range;
    
    if (jsl.Browser.name == "MSIE") {
        range = obj.createTextRange();        
		range.moveStart("character", start);
		range.moveEnd("character", end - obj.value.length);
		range.select();
    }
    else {
        obj.setSelectionRange(start, end);
    }
}

jsl.bl.movetoTextEnd = function(obj) {
    var len;
    
    if (obj.value == "") {
        return;
    }
    len = obj.value.length;
    jsl.bl.selectTextRange(obj, len, len);
}

jsl.bl.captureEnter = function(evt, inputObj, func) {
    if (evt == null) {
        evt = window.event;
    }
    
    if (evt.keyCode == 13) {
        if (func == null) {
            inputObj.blur();
        }
        else {
            func(evt, inputObj);
        }
        return false;
    }
    
    return true;
}

jsl.bl.addChild = function(container, tagName, idx) {
    var childObj = document.createElement(tagName);
    var count;
    var isObj = idx == null ? false : isNaN(0 + idx);
    
    if (container.tagName.toLowerCase() == "select" && jsl.Browser.name == "MSIE") {
        if (idx != null) {
            count = container.options.length;
            if (isObj) {   // be a option object
                var i;                
                
                for (i = 0; i < count; i++) {
                    if (idx === container.options[i]) {
                        idx = i;
                        break;
                    }
                }
                if (i == count) {
                    idx = count;
                }
            }
            
            if (idx < 0) {
                idx = 0;
            }
            if (idx > count) {
                idx = count;
            }
            container.add(childObj, idx);
        }
        else {
            container.add(childObj);
        }
    }
    else {        
        if (idx == null || container.childNodes.length == 0 || (!isObj && idx >= container.childNodes.length)) {
            container.appendChild(childObj);
        }
        else {
            if (isObj) {
                if (container.hasChildNodes(idx)) {
                    container.insertBefore(childObj, idx);
                }
                else {
                    container.appendChild(childObj);
                }
            }
            else {            
                if (idx < 0) {
                    idx = 0;                
                }
                container.insertBefore(childObj, container.childNodes[idx]);
            }
        }
    }
    
    return childObj;
}

jsl.bl.Position = function(left, top) {
    this.x = left == null ? 0 : left;
    this.y = top == null ? 0 : top;
}

jsl.bl.getAbsolutePos = function(obj) {
    var i;
    var pos = new jsl.bl.Position(obj.offsetLeft, obj.offsetTop);
    
    while (obj.offsetParent != null) {
        obj = obj.offsetParent;
        pos.x += obj.offsetLeft;
        pos.y += obj.offsetTop;
        if (obj != document.body && obj != document.documentElement) {
            if (obj.scrollLeft != null && obj.scrollLeft != 0) {
                pos.x -= obj.scrollLeft;
            }
            if (obj.scrollTop != null && obj.scrollTop != 0) {
                pos.y -= obj.scrollTop;
            }
        }
    }
    
    return pos;
}

jsl.bl.getPanelPos = function(obj, pal, inBottom) {
    var pos = jsl.bl.getAbsolutePos(obj);
    
    if (pos.x + pal.offsetWidth + 20 > document.body.clientWidth) {
        pos.x -= pal.offsetWidth - obj.offsetWidth;
        if (pos.y < 2) {
            pos.y = 2;
        } 
    }
    
    if (inBottom != null && inBottom) {
        pos.y -= pal.offsetHeight;
    }
    else {
        pos.y += obj.offsetHeight;
    }
    
    return pos;
}

String.prototype.jslTrimStart = function() {
    return this.replace(/^\s+/, "");
};

String.prototype.jslTrimEnd = function() {
    return this.replace(/\s+$/, "");
};

String.prototype.jslTrim = function() {
    return this.replace(/^\s+|\s+$/g, "");
};

String.prototype.jslStartWith = function(s) {
    return this.substring(0, s.length) === s;
}

String.prototype.jslEndWith = function(s) {
    return this.substring(this.length - s.length, this.length) === s;
}

String.prototype.jslIsEmpty = function() {    
    if (this.search(/\S/g) > -1) {
        return false;
    }
    
    return true;
}

Array.prototype.jslIndexOf = function(v, d) {
    var i;
    var c = this.length;
    
    if (v == null) {
        return -1;
    }
    
    if (c > 0) {
        d = d - 0;
        if (isNaN(d)) {
            d = 0;
        }
        if (d == null || d < 0) {
            d = 0;
        }
        for (i = d; i < c; i++) {
            if (this[i] === v) {
                return i;
            }
        }
    }
    
    return -1;
}

Array.prototype.jslContains = function(v) {
    return this.jslIndexOf(v) >= 0;
}

Array.prototype.jslAdd = function(v) {
    this[this.length] = v;
}

Array.prototype.jslAddRange = function(a) {
    this.push(a);
}

Array.prototype.jslInsert = function(idx, v) {
    this.splice(idx, 0, v);
}

Array.prototype.jslRemove = function(v) {
    var idx = this.jslIndexOf(v);
    
    if (idx > -1) {
        this.splice(idx, 1);
    }
}

Array.prototype.jslRemoveAt = function(idx) {
    this.splice(idx, 1);
}

Array.prototype.jslClone = function() {
    var ary = new Array();
    
    return this.concat(ary);
}

Date.jslMonthNames = new Array("January","February","March","April","May","June","July","August","September","October","November","December");
Date.jslShortMonthNames = new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
Date.jslDayNames = new Array("Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday");
Date.jslShortDayNames = new Array("Sun","Mon","Tue","Wed","Thu","Fri","Sat");
Date.jslAMText = "AM";
Date.jslPMText = "PM";
Date.jslParse = function(s, f) {
    var sAry;
    var fAry;
    var datePart = new Array(7);
    var reg = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f/g;
    var i;
    var matchItem;
    var sItem;
    var j;
    
    if (f == null || f == "") {
        f = "yyyy-MM-dd";
    }
    s = (s + "").jslTrim().replace(/ *, */gi, "/").replace(/ *- */gi, "/").replace(/ *: */gi, "/").replace(/ +/gi, "/");
    f = (f + "").jslTrim().replace(/ *, */gi, "/").replace(/ *- */gi, "/").replace(/ *: */gi, "/").replace(/ +/gi, "/");
    
    sAry = s.split("/");
    fAry = f.split("/");
    if (sAry.length != fAry.length) {
        return null;
    }
    
    for (i = 0; i < fAry.length; i++) {
        if (fAry[i] == "") {
            continue;
        }
        matchItem = fAry[i].match(reg);
        if (matchItem.length != 1 || matchItem[0] == null || matchItem[0] == undefined) {
            continue;
        }
        sItem = sAry[i].toLowerCase();
        if (sItem == "") {
            return null;
        }
        switch (matchItem[0]) {
           case "MMMM":
                for (j = 0; j < Date.jslMonthNames.length; j++) {
                    if (Date.jslMonthNames[j].toLowerCase() == sItem) {
                        datePart[1] = j + 1;
                        break;
                    }
                }
                if (j == Date.jslMonthNames.length) {
                    return null;
                }
                break;
           case "MMM":
                for (j = 0; j < Date.jslShortMonthNames.length; j++) {
                    if (Date.jslShortMonthNames[j].toLowerCase() == sItem) {
                        datePart[1] = j + 1;
                        break;
                    }
                }
                if (j == Date.jslShortMonthNames.length) {
                    return null;
                }
                break;
           case "tt":
                if (sItem == Date.jslPMText.toLowerCase()) {
                    if (datePart[3] != null) {
                        datePart[3] += 12;
                    }
                    else {
                        datePart[3] = 12;
                    }
                }
                else {
                    if (sItem != Date.jslAMText.toLowerCase()) {
                        return null;
                    }
                }
                break;
           case "t":
                if (sItem == "p") {
                    if (datePart[3] != null) {
                        datePart[3] += 12;
                    }
                    else {
                        datePart[3] = 12;
                    }
                }
                else {
                    if (sItem != "a") {
                        return null;
                    }
                }
                break;
            default:
                switch (matchItem[0]) {
                    case "yy":
                        sItem = "20" + sItem;
                        break;
                    case "ff":
                        sItem = sItem + "0";
                        break;
                    case "f":
                        sItem = sItem + "00";
                        break;
                }
                
                sItem = sItem.replace(/^0+/gi, "");
                if (sItem == "") {
                    sItem = "0";
                }
                
                if (!Number.jslIsValid(sItem, 0, true)) {
                    return null;
                }
                switch (matchItem[0]) {
                    case "yyyy":
                        datePart[0] = eval(sItem);
                        break;
                    case "yy":
                        datePart[0] = eval(sItem);
                        break;
                   case "MM":
                   case "M":
                        datePart[1] = eval(sItem);
                        break;
                   case "dd":
                   case "d":
                        datePart[2] = eval(sItem);
                        break;
                   case "HH":
                   case "H":
                        if (datePart[3] == null) {
                            datePart[3] = eval(sItem);
                        }
                        else {
                            datePart[3] += eval(sItem);
                        }
                        break;
                   case "hh":
                   case "h":
                        datePart[3] = eval(sItem);
                        break;
                   case "mm":
                   case "m":
                        datePart[4] = eval(sItem);
                        break;
                   case "ss":
                   case "s":
                        datePart[5] = eval(sItem);
                        break;
                   case "fff":
                        datePart[6] = eval(sItem);
                        break;
                   case "ff":
                        datePart[6] = eval(sItem);
                        break;
                   case "f":
                        datePart[6] = eval(sItem);
                        break;
                   default:
                        return null;
                }
                break;
            }
    }
    
    if (datePart[0] == null || datePart[0] > 9999
        || datePart[1] == null || datePart[1] < 1 || datePart[1] > 12
        || datePart[2] == null || datePart[2] < 1 || datePart[2] > 31) {
        return null;
    }
    
    datePart[1] = datePart[1] - 1;
    for (i = 3; i < 7; i++) {
        if (datePart[i] == null) {
            datePart[i] = 0;
        }
    }
    
    if (datePart[3] > 23 || datePart[4] > 59 || datePart[5] > 59 || datePart[6] > 999) {
        return null;
    }
    
    try {
        sItem = new Date(datePart[0], datePart[1], datePart[2], datePart[3], datePart[4], datePart[5], datePart[6]);
        if (sItem.getFullYear() == datePart[0] && sItem.getMonth() == datePart[1] && sItem.getDate() == datePart[2]) {
            return sItem;
        }
    }
    catch (exp) {
    }
    
    return null;
}
Date.jslIsValid = function(s) {
    var d = Date.jslParse(s, "yyyy-MM-dd");
    
    if (d == null) {
        d = Date.jslParse(s, "yy-MM-dd");
    }
    
    return d;
}
Date.prototype.jslClone = function() {
    return new Date(this.getFullYear(), this.getMonth(), this.getDate(), this.getHours(), this.getMinutes(), this.getSeconds(), this.getMilliseconds());
}
Date.prototype.jslToString = function(f) {
    var reg = /dddd|ddd|dd|d|MMMM|MMM|MM|M|yyyy|yy|y|hh|h|HH|H|mm|m|ss|s|tt|t|fff|ff|f/g;
    var idx;
    var seg;
    var ary = new Array();
    var start = reg.lastIndex;
    var item = "";
    var temp;
    
    for (; ;) {
        seg = reg.exec(f);
        if (seg != null) {
            item = seg[0];
            if (item.length < reg.lastIndex - start) {
                ary[ary.length] = f.substring(start, reg.lastIndex - item.length);
            }
            switch (item) {
                case "yyyy":
                    ary[ary.length] = "" + this.getFullYear();
                    break;
                case "yy":
                case "y":
                    ary[ary.length] = "" + (this.getFullYear() % 100);
                    break;
                case "MMMM":
                    ary[ary.length] = Date.jslMonthNames[this.getMonth()];
                    break;
                case "MMM":
                    ary[ary.length] = Date.jslShortMonthNames[this.getMonth()];
                    break;
                case "MM":
                    temp = this.getMonth() + 1;
                    ary[ary.length] = temp < 10 ? "0" + temp : "" + temp;
                    break;
                case "M":
                    ary[ary.length] = "" + (this.getMonth() + 1);
                    break;
                case "dddd":
                    ary[ary.length] = Date.jslDayNames[this.getDay()];
                    break;
                case "ddd":
                    ary[ary.length] = Date.jslShortDayNames[this.getDay()];
                    break;
                case "dd":
                    temp = this.getDate();
                    ary[ary.length] = temp < 10 ? "0" + temp : "" + temp;
                    break;
                case "d":
                    ary[ary.length] = "" + this.getDate();
                    break;
                case "HH":
                    temp = this.getHours();
                    ary[ary.length] = temp < 10 ? "0" + temp : "" + temp;
                    break;
                case "H":
                    ary[ary.length] = "" + this.getHours();
                    break;
                case "hh":
                    temp = this.getHours() % 12;
                    ary[ary.length] = temp < 10 ? "0" + temp : "" + temp;
                    break;
                case "h":
                    ary[ary.length] = "" + (this.getHours() % 12);
                    break;
                case "mm":
                    temp = this.getMinutes();
                    ary[ary.length] = temp < 10 ? "0" + temp : "" + temp;
                    break;
                case "m":
                    ary[ary.length] = "" + this.getMinutes();
                    break;
                case "ss":
                    temp = this.getSeconds();
                    ary[ary.length] = temp < 10 ? "0" + temp : "" + temp;
                    break;
                case "s":
                    ary[ary.length] = "" + this.getSeconds();
                    break;
                case "tt":
                    ary[ary.length] = this.getHours() >= 12 ? Date.jslPMText : Date.jslAMText;
                    break;
                case "t":
                    ary[ary.length] = (this.getHours() >= 12 ? Date.jslPMText : Date.jslAMText).substring(0, 1);
                    break;
                case "fff":
                    temp = this.getMilliseconds();
                    if (temp < 10) {                        
                        ary[ary.length] = "00" + temp;
                    }
                    else if (temp < 100) {
                        ary[ary.length] = "0" + temp;
                    }
                    else {
                        ary[ary.length] = "" + temp;
                    }
                    break;
                case "ff":
                    temp = this.getMilliseconds() / 10;
                    ary[ary.length] = temp < 10 ? "0" + temp : "" + temp;
                    break;
                case "f":
                    ary[ary.length] = "" + (this.getMilliseconds() / 100);
                    break;
            }
        }
        else {
            if (f.length - 1 > start) {
                ary[ary.length] = f.substring(start, f.length - 1);
            }
            break;
        }
        start = reg.lastIndex;
    }
    
    return ary.join("");
}

Number.jslIsValid = function(s, d, positive) {
    var	re;

	if (d == null) {
		d = 0;
	}
	if (positive == null) {
	    positive = true;
	}
	
	if (positive) {
	    if (d == 0) {
	        re = new RegExp("^(\\+|)([123456789]\\d*|0)$", "ig");
	    }
	    else {
        	re = new RegExp("^(\\+|)([123456789]\\d*|0)(.\\d{1," + d + "}|)$", "ig");
        }
    }
    else {
        if (d == 0) {
            re = new RegExp("^(\\+|-|)([123456789]\\d*|0)$", "ig");
        }
        else {
            re = new RegExp("^(\\+|-|)([123456789]\\d*|0)(.\\d{1," + d + "}|)$", "ig");
        }
    }
	
	if(s == null) {
		return false;
    }

	if(s.search(re)>-1) {
		return true;
	}

	return false;
}


jsl.Dictionary = function() {
    this._keyAry = new Array();
    this._valAry = new Array();
}

jsl.Dictionary.prototype.Add = function(k, v) {
    var idx;
    
    idx = this._keyAry.jslIndexOf(k);
    
    if (idx < 0) {
        this._keyAry.jslAdd(k);
        this._valAry.jslAdd(v);
    }
}

jsl.Dictionary.prototype.Exists = function(k) {
    return this._keyAry.jslContains(k);
}

jsl.Dictionary.prototype.Items = function() {
    return this._valAry;
}

jsl.Dictionary.prototype.Keys = function() {
    return this._keyAry;
}

jsl.Dictionary.prototype.Remove = function(k) {
    var idx = this._keyAry.jslIndexOf(k);
    
    if (idx > -1) {
        this._keyAry.splice(idx, 1);
        this._valAry.splice(idx, 1);
    }
}

jsl.Dictionary.prototype.RemoveAll = function() {
    this._keyAry = new Array();
    this._valAry = new Array();
}

jsl.Dictionary.prototype.Count = function() {
    return this._keyAry.length;
}

jsl.Dictionary.prototype.GetItem = function(k) {
    var idx = this._keyAry.jslIndexOf(k);
    
    if (idx > -1) {
        return this._valAry[idx];
    }
    
    return null;
}

jsl.Dictionary.prototype.SetItem = function(k, v) {
    var idx = this._keyAry.jslIndexOf(k);
    
    if (idx > -1) {
        this._valAry[idx] = v;
    }
}