String.prototype.endWith=function(suffix){
        return (this.substr(this.length - suffix.length) == suffix);
    }
String.prototype.startWith=function(prefix) {
        return (this.substr(0, prefix.length) == prefix);
    }
String.prototype.trimLeft=function() {
        return this.replace(/^\s*/, "");
    }
String.prototype.trimRight=function() {
        return this.replace(/\s*$/, "");
    }
String.prototype.trim=function() {
        return this.trimRight().trimLeft();
    }
String.prototype.isNullOrEmpty=function() {
        var sRet = this.trim();
        return (sRet == "" || sRet.length <= 0) ? true : false;
    }
String.prototype.format=function() {
        if (arguments.length == 0) return this;
        for (var s = this, i = 0; i < arguments.length; i++)
            s = s.replace(new RegExp("\\{" + i + "\\}", "g"), arguments[i]);
        return s;
    }
String.format=function(sFormat) {
    for (var i = 1; i < arguments.length; i++) {
        sFormat = sFormat.replace("{" + (i - 1) + "}", arguments[i]);
    }
    return sFormat;
}
Array.prototype.indexOf=function(item){
    for(var i=this.length-1;i>=0;i--)
        if(this[i]==item)return i;
    return -1;
}
var StringBuilder=function(){
    this.array=new Array();
}
StringBuilder.prototype.append=function(str){
    this.array.push(str);
}
StringBuilder.prototype.appendFormat=function(str){
//    for (var s = str, i = 1; i < arguments.length; i++)
//        s = s.replace(new RegExp("\\{" + i-1 + "\\}", "g"), arguments[i]);
    this.append(String.format.apply(this,arguments));
}
StringBuilder.prototype.toString=function(){
    return this.array.join(" ");
}
StringBuilder.prototype.clear=function(){
    this.array.length=0;
}
var EventUtil={
    addEventHandle:function(oTarget,sEventType,fnHandler){
        if(oTarget.addEventListener)
            oTarget.addEventListener(sEventType,fnHandler,false);
        else if(oTarget.attachEvent)
            oTarget.attachEvent("on"+sEventType,fnHandler);
        else
            oTarget["on"+sEventType]=fnHandler;
    },
    removeEventHandler:function(oTarget,sEventType,fnHandler){
        if(oTarget.addEventListener)
            oTarget.removeEventListener(sEventType,fnHandler,false);
        else if(oTarget.attachEvent)
            oTarget.detachEvent("on"+sEventType,fnHandler);
        else
            oTarget["on"+sEventType]=null;
    },
    _formatEvent:function(oEvent){
        if(IEXPLORER){
            oEvent.charCode=(oEvent.type=="keypress")?oEvent.keyCode:0;
            oEvent.isChar=oEvent.charCode>0;
            oEvent.eventPhase=2;
            oEvent.pageX=oEvent.clientX+document.body.scrollLeft;
            oEvent.pageY=oEvent.clientY+document.body.scrollTop;
            oEvent.preventDefault=function(){
                this.returnValue=false;
            }
            if(oEvent.srcElement==oEvent.toElement)
                oEvent.relateTarget=oEvent.fromElement;
            else
                oEvent.relateTarget=oEvent.toElement;
            oEvent.stopPropagation=function(){
                this.cancelBubble=true;            
            }
            oEvent.target=oEvent.srcElement;
            oEvent.time=(new Date()).getTime();
        }
        return oEvent;
    },
    getEvent:function(){
        if(window.event)
            return this._formatEvent(window.event);
        return EventUtil.getEvent.caller.arguments[0];
    }
}
var LocationUtil={
    path:location.pathname.slice(1),
    url:String.format("{0}//{1}/",location.protocol,location.host),
    hash:function(){
        var sTemp=location.hash;
        if(String.isNullOrEmpty(sTemp))
            return sTemp;
        return sTemp.slice(1);
    },
    fileName:function(){
        var index=this.path.lastIndexOf("/")+1;
        return this.path.slice(index);
    },
    queryString:function(sKey){
        var sTemp=location.search;
        if(sTemp.isNullOrEmpty())
            return sTemp;
        sTemp=sTemp.slice(1);
        var sRE=sKey+"=([^&=]*)&?";
        var oRE=new RegExp(sRE);
        if (oRE.test(sTemp))    
            return RegExp["$1"]; 
        else        
            return null;
    }
}
var CookieUtil={
    getCookie:function (sName){
        var sRE = "(?:; )?" + sName + "=([^;]*);?"; 
        var oRE = new RegExp(sRE);
        if (oRE.test(document.cookie))    
            return decodeURIComponent(RegExp["$1"]); 
        else        
            return null;
    },
    setCookie:function(sName, sValue){  
        var sCookie = sName + "=" + encodeURIComponent(sValue);
        if (arguments.length==3&&arguments[2]) sCookie += ";expires=" + arguments[2].toGMTString(); 
        if (arguments.length==4&&arguments[3]) sCookie += ";path=" + arguments[3];
        if (arguments.length==5&&arguments[4]) sCookie += ";domain=" + arguments[4];
        if (arguments.length==6&&arguments[5]) sCookie += ";secure="+ arguments[5];
        document.cookie = sCookie; 
    },
    deleteCookie:function(sName, sPath, sDomain){ 
        this.setCookie(sName, "", new Date(0), sPath, sDomain); 
    }
}

var $=function() {
    for (var i=0, a=[]; i<arguments.length; i++) {
        var e=arguments[i];
        a[i]= null;
        if ("object"== typeof(e)&&e.tagName&&e!=window)
            a[i] = e;
        if ("string"==typeof(e)&&(e=document.getElementById(e)))
            a[i] = e;
    }
    return a.length<2?a[0]:a;
}
function getNextSiblingElementNode(oNode){
    var oSiblingEle = oNode.nextSibling;
    while (oSiblingEle && oSiblingEle.nodeType != 1)
    {
        oSiblingEle = oSiblingEle.nextSibling;
    }
    return oSiblingEle;
}
function getPreviousSiblingElementNode(oNode){
    var oPreviousEle = oNode.previousSibling;
    while (oPreviousEle && oPreviousEle.nodeType != 1)
    {
        oPreviousEle = oPreviousEle.previousSibling;
    }
    return oPreviousEle;
}
function SetWinHeight(oWindow){
    if (document.getElementById&&oWindow&&!window.opera){
       //firefox
       if (oWindow.contentDocument&&!IEXPLORER) {
           if(oWindow.contentDocument.body.offsetHeight)
                oWindow.height = oWindow.contentDocument.body.offsetHeight;
            else
                oWindow.height=oWindow.contentWindow.document.documentElement.scrollHeight;
        }
        //iexplorer
        else{
            if(oWindow.Document && oWindow.Document.body.scrollHeight)
                oWindow.height = oWindow.Document.body.scrollHeight;
        }
    }
}
function LayerShield(){
    var width,height;
    if(document.body.offsetHeight){
        width=document.body.offsetWidth;
        height=document.body.offsetHeight;
        if(!IEXPLORER&&document.documentElement)
            height=document.documentElement.offsetHeight;
    }
    else{
        width=document.body.scrollWidth;
        height=document.body.scrollHeight;
    }
    var div = document.createElement("div");
    div.setAttribute("id","divShieldLayer");
    div.style.position="absolute";
    div.style.top="0px";
    div.style.left="0px";
    div.style.width=width+"px";
    div.style.height=height+"px";
    div.style.zIndex=1;
    div.style.backgroundColor = "#afafaf";
    div.style.opacity="0.4";
    div.style.filter="progid:DXImageTransform.Microsoft.Alpha(style=3,opacity=25,finishOpacity=75)";
    document.body.appendChild(div);
    return div;
}
function LayerTable(sTitle,sBody){
    var oDiv=document.createElement("div");
    oDiv.style.backgroundColor="#ffffff";
    oDiv.style.border="solid 1px #0361c5";
    oDiv.style.position="absolute";
    oDiv.style.top="0px";
    oDiv.style.left="0px";
    oDiv.style.zIndex=2;
    document.body.appendChild(oDiv);
    
    //head
    var oTitle=document.createElement("div");
    oTitle.style.backgroundColor="#1187c6";
    oTitle.style.color="#ffffff";
    oTitle.style.fontWeight="bold";
    oTitle.style.fontSize="14px";
    oTitle.style.padding="5px 10px";
    oTitle.style.position="relative";
    if(IEXPLORER)oTitle.style.filter="progid:DXImageTransform.Microsoft.Gradient(startColorStr=#0361c500,endColorStr=#8aacd800)";
    oTitle.innerHTML=sTitle;
    oDiv.appendChild(oTitle);
    
    var img=document.createElement("img");
    img.setAttribute("src",String.format("{0}images/re/close.jpg",LIBRARYURL));
    img.style.position="absolute";
    img.style.top="5px";
    img.style.right="5px";
    img.style.cursor="pointer";
    img.onclick=function(){
        document.body.removeChild(oDiv);
        document.body.removeChild($("divShieldLayer"));
    }
    oTitle.appendChild(img);
    
    //body
    var oBody=document.createElement("div");
    oBody.style.padding="5px 10px";
    oBody.innerHTML=sBody;
    oDiv.appendChild(oBody);
    
    return oDiv;
}

var IEXPLORER=navigator.userAgent.toLowerCase().indexOf("msie") >= 0;
var LIBRARYURL=location.protocol+"//image.builderelements.com/";
var SITEURL=LocationUtil.url;