//DOM CRAWL 
function handleDomCrawl(domObject,tagList){
    if (is.ie567 && !tagList){
        var tagList = new Array('div','span','input','select');
    }else if (!tagList){
        var tagList = new Array('*');
    }else if (tagList){
        var tagList = tagList.split(',');
    }
    if (!domObject)
        var domObject = document;

    for (var ivp=0;ivp<tagList.length;ivp++){
        var an = domObject.getElementsByTagName(tagList[ivp]);
        for (var i=0;i<an.length;i++){
            var lcNodeName = an[i].nodeName.toLowerCase();
            
            if(lcNodeName=='div'&&(an[i].id=="columnMain")){
                sniffPostPopup(an[i]);
            }
        }
    }
}
// call handleDomCrawl after 1000ms when window loaded
window.setTimeout(handleDomCrawl,1000,document,"div");
//Navigation: nextversion changed
function actionNextversionChanged(form){
    var target = document.getElementById("columnMain");
    try {
        var selectObj = form.bundlesid;
        var selectOptionValue = selectObj.options[selectObj.selectedIndex].value;  
        var path = form.action + selectOptionValue;      
        getURL(path,'',function(rdata,fvar){
            target.innerHTML = rdata;
        });
    } catch (e) { }
}
//Navigation:display class detail on main culumn
function bundlesClick(lnk){
    var target = document.getElementById('columnMain');
    try {
        removeClassName(gebi("jdoctitle"), "collapse");
        removeClassName(gebi("jdocaction"), "collapse");
        showLoading();
        getURL(lnk.name,'',function(rdata,fvar){
            target.innerHTML = rdata;
            //window.location = "#top";
            hideLoading();
            sniffPostPopup(target);
        });
    } catch (e) { }
    
}
// Navigation: project changed
function actionBundleChanged(form){
    var target = document.getElementById("content");
    var searchtarget = document.getElementById("searchoption");
    var searchBy = document.getElementById("searchBy");

    try {
        var option=searchBy.options[searchBy.selectedIndex].value;
        var selectObj = form.bundleoptions;
        var path = form.action + "/" + option + selectObj.options[selectObj.selectedIndex].value;
        hideResult();
        showLoading();

        var optionpath = document.getElementById("by").innerHTML + "/" + option + selectObj.options[selectObj.selectedIndex].value;
        getURL(optionpath, '', function(rdata, fvar){
            searchtarget.innerHTML = rdata;
        });

        getURL(path,'',function(rdata,fvar){
            target.innerHTML = rdata;
            hideLoading();
        });
    } catch (e) {hideLoading();}
}
// Navigation: search type changed
function actionSearchByChanged(form){
    var target = document.getElementById("content");
    try {
        var bundleOption=document.getElementById("bundleoptions").options[document.getElementById("bundleoptions").selectedIndex].value;
        var selectObj = form.searchBy;
        var searchByOption=selectObj.options[selectObj.selectedIndex].value;
        var path = form.action + "/" + searchByOption + bundleOption;
        var date1 = new Date();
        hideResult();
        showLoading();    
        getURL(path,'',function(rdata,fvar){
            target.innerHTML = rdata;
            var date2 = new Date();
            hideLoading();
            //alert(date2.getTime()-date1.getTime());
            sniffPostPopup(target);
        });
    } catch (e) { }
}

// Navigation: search class
function actionClassSearch(form) {
    var target = document.getElementById('classList');
    try {
        showProcessing();
        var path = form.action;
        var params = "mask="+form.mask.value;
        getURL(path,params,function(rdata,fvar){
            target.innerHTML = rdata;
            hideProcessing();
        });
    } catch (e) { }
}
// Navigation: display class detail on main column
function clzClk(lnk) {
    // NOTE: Identical div element id for both below search types: 
    // class, A to Z, package
    // So this function is shared for above search types for click class link
    var elem = document.getElementById("classList");
    var path = elem.getElementsByTagName("span")[0].innerHTML;
    var target = document.getElementById('columnMain');

    try {
        removeClassName(gebi("jdoctitle"), "collapse");
        removeClassName(gebi("jdocaction"), "collapse");
        showLoading();
        getURL(path+lnk.name,'ajax=true',function(rdata,fvar){
            target.innerHTML = rdata;
//            window.location = "#top";
            hideLoading();
            saveHistory('r', lnk.name, 'columnMain');
            sniffPostPopup(target);
            pageTracker._trackPageview("/" + lnk.name);
        });
    } catch (e) { }
}
// Navigation: display class list in right column
function actionA2ZIndexClicked(lnk) {
    var elem = document.getElementById("A2ZIndex");
    var path = elem.getElementsByTagName("span")[0].innerHTML;
    var target = document.getElementById('classList');

    try {
        getURL(path+lnk.innerHTML,'',function(rdata,fvar){
            target.innerHTML = rdata;
        });
    } catch (e) { }
}
// Navigation: search method or field
function m1(form){
    var target = document.getElementById('methodList');
    try {
        showProcessing();
        var path = form.action;
        var params = "mask="+form.mask.value;
        getURL(path,params,function(rdata,fvar){
            target.innerHTML = rdata;
            hideProcessing();
        });
    } catch(e) { }
}
// Navigation: parse method or field with more details
function m2(lnk){
    var elem = document.getElementById("methodList");
    var path = elem.getElementsByTagName("span")[0].innerHTML;
    var target = document.getElementById('resultcontents');
    try {
        showResult();
        getURL(path+lnk.innerHTML,'',function(rdata,fvar){
            target.innerHTML = rdata;
        });
    } catch (e) { }
}
// Navigation: display class details in main column and locate to specified method or field
function m3(lnk){
    var path = document.getElementById("path4methodnav").innerHTML;
    var target = document.getElementById('columnMain');

    try {
        removeClassName(gebi("jdoctitle"), "collapse");
        removeClassName(gebi("jdocaction"), "collapse");
        hideResult();
        showLoading();
        getURL(path+lnk.name,'ajax=true',function(rdata,alink){
            target.innerHTML = rdata;
            window.location = alink.href.substr(alink.href.indexOf("#"));
            hideLoading();
            sniffPostPopup(target);
            pageTracker._trackPageview("/"+lnk.name + "/"+ lnk.innerHTML);
        },lnk);
    } catch (e) { }
}
// Navigation: display class list in right column by specified package name
function actionPackageClicked(lnk) {
    var elem = document.getElementById("packageList");
    var path = elem.getElementsByTagName("span")[0].innerHTML;
    var target = document.getElementById('classList');
    try {
        getURL(path+lnk.innerHTML,'',function(rdata,fvar){
            target.innerHTML = rdata;
        });
    } catch (e) { }
}

// expand/collapse menu column
function change(tag) {
var element = document.getElementById(tag);
    element.style.display = element.style.display!="block" ? "block" : "none";     
}

// Tab Changing
function tabChange(elem) {
    var path = document.getElementById('classpath').innerHTML+document.getElementById('classname').innerHTML;
    var params = 'mode='+elem.name+'&ajax=true'
    postRequest('columnMain', path, params);
}

// Clicking link in the main column container
function linkclick(elem) {
    if(elem.name == 'null') {
        window.location = elem.href;
        return;
    }
    var path = document.getElementById('classpath').innerHTML+elem.name;
    var params = 'ajax=true';
    postRequest('columnMain', path, params);
    window.location = elem.href;
}

function help() {
    var path = document.getElementById('navpath').innerHTML + 'mainhelp';
    var params = 'ajax=true';
    postRequest('columnMain', path, params);
}

// Submit the translations
function submitTrans(id, classTag) {
    var txtAreaElem = document.getElementById(id);
    
    path = document.getElementById("transpath").innerHTML + classTag;

    var params = [];
    params.push(["action", "update"]);
    params.push(["id", id]);
    params.push(["translation", encodeURIComponent(txtAreaElem.value)]);
    params.push(["body", "t9b" + id]);
    params.push(["raw", "t9r" + id]);

    var index = id.indexOf('S');
    params.push(["txt", "t9t" + id.substring(0, index)]);

    postAction = new Action(postProc4SubmitTrans, path, params);

    getURL(path,postAction.getParams(),function(rdata,fvar){
        if(getRequestObject("jscript",rdata)) {
            showBox();
        }
        else {
            if(getRequestObject("errormsg",rdata)) {
                alert(getRequestObject("errormsg",rdata).innerHTML);
            } else {
                var txtElems;
                if(is.ie567) txtElems = getElementsByName_iefix("t9t" + id.substring(0, index), "span")
                else txtElems = document.getElementsByName("t9t" + id.substring(0, index));
                var bodyElem = document.getElementById("t9b" + id);
                var rawElem = document.getElementById("t9r" + id);

                for(var i = 0; i < txtElems.length; i++) {
                    txtElems[i].innerHTML = rdata;
                }
                bodyElem.style.display = 'none';
                rawElem.style.display = 'none';
                pageTracker._trackPageview("/translation/" + classTag);
            }
        }
    });
}

function postProc4SubmitTrans() {
    var path = this.path;
    var params = this.getParams();

    getURL(path,params,function(rdata,fvar){
            var txtElems = document.getElementsByName(postAction.getValByKey("txt"));
            var bodyElem = document.getElementById(postAction.getValByKey("body"));
            var rawElem = document.getElementById(postAction.getValByKey("raw"));

            for(var i = 0; i < txtElems.length; i++) {
                txtElems[i].innerHTML = rdata;
            }
            bodyElem.style.display = 'none';
            rawElem.style.display = 'none';
    });
}

function postRequest(elemId, path, params) {
    var target = document.getElementById(elemId);
    if(target == null) return;
    target.setBody=function(txt){target.innerHTML=txt;};
    try {
        getURL(path,params,function(rdata,fvar){
            target.setBody(rdata);
            if(path.indexOf("mainhelp") > 0) {
                saveHistory('f', 'help', 'columnMain');
                document.title = "DocWeb-Help";
            }
            hideLoading();
            sniffPostPopup(target);
        });
    } catch (e) { }
}

// Get the Print-friendly Page
function printRequest(elem) {
    if(document.getElementById('classpath') == null) return;
    if(document.getElementById('classname') == null) return;
    var path = document.getElementById('classpath').innerHTML+document.getElementById('classname').innerHTML;
    var params = 'mode=Print';
    elem.href = path + '?' + params;
}
function actionCancel(elem) {
    elem.href = '#';
}

function actionClick(action, elem) {
    var path = "";
    var params = "";
    if(action == 'print') {
        if(document.getElementById('classpath') == null || document.getElementById('classname') == null) {
            alert('Please select a class before getting print-friendly page!');
            return false;
        }
    }
    else if(action == 'export') {
        if(document.getElementById('classpath') == null || document.getElementById('classname') == null) {
            alert('Please select a class before export!');
            return false;
        }
    }
    else if(action == 'import') {
        path = elem.name + '/nav/import';
        postRequest('columnMain', path, '');
    }
    else if(action == 'stockphrases') {
        path = elem.name + '/stockphrases.jsp';
        params = [];
        params.push(["action", "stockphrases"]);

        postAction = new Action(postProc4StockPhrases, path, params);
        getURL(path,postAction.getParams(),function(rdata,fvar){
            if(getRequestObject("jscript",rdata)) {
                showBox();
            }
            else {
                var columnMain = document.getElementById("columnMain");
                columnMain.innerHTML = rdata;
            }
            });
    }
    else if(action == 'bundles') {
        path = elem.name + '/bundles.jsp';
        params = [];
        params.push(["action", "bundles"]);

        postAction = new Action(postProc4StockPhrases, path, params);
        getURL(path,postAction.getParams(),function(rdata,fvar){
            if(getRequestObject("jscript",rdata)) {
                showBox();
            }
            else {
                var columnMain = document.getElementById("columnMain");
                columnMain.innerHTML = rdata;
            }
            });
    }
    else if(action == 'poststockphrases') {
        // For this action, variable elem is a form element
        path = elem.action;
        params = [];
        params.push(["action", "poststockphrases"]);
        var elems = elem.getElementsByTagName("textarea");
        for (var ivp=0;ivp<elems.length;ivp++){
            params.push([elems[ivp].name, elems[ivp].value]);
        }

        postAction = new Action(postProc4StockPhrases, path, params);
        getURL(path,postAction.getParams(),function(rdata,fvar){
            if(getRequestObject("jscript",rdata)) {
                showBox();
            }
            else {
                var columnMain = document.getElementById("columnMain");
                columnMain.innerHTML = rdata;
            }
        });
    }
    else if(action == 'pretop10') {
        if(elem.nodeName != 'A') return true;
        path = elem.name + '/top10.jsp';
        params = [];
        postAction = new Action(postProc4PreTop10, path, params);
        getURL(path,postAction.getParams(),function(rdata,fvar){
            if(getRequestObject("jscript",rdata))
                showBox();
            else
                gebi("columnMain").innerHTML = rdata;
        });        
    }
    else if(action == 'top10') {
        path = elem.name + '/top10.jsp';
        params = '';
        var elems = elem.getElementsByTagName('input');
        if(elems.length > 0) path = elem.action;
        for (var ivp=0;ivp<elems.length;ivp++){
            if(elems[ivp].type == 'checkbox' && !elems[ivp].checked) continue;
            if(params.length > 0)
                params += '&';
            params += elems[ivp].name + '=' + elems[ivp].value;
        }
        elems = elem.getElementsByTagName('select');
        for (var ivp=0;ivp<elems.length;ivp++){
            for (var j=0;j<elems[ivp].options.length;j++){
                if(!elems[ivp].options[j].selected)
                    continue;
                if(params.length > 0)
                    params += '&';
                params += elems[ivp].name + '=' + elems[ivp].options[j].value;
            }
        }
        if(params != '' && !checkDate()) return false;
        postRequest('columnMain', path, params);
    }
    else if(action == 'register') {
        // Need to hidden JavaDocTitleBar and JavaDocCommonActionsComponent
        addClassName(gebi("jdoctitle"), "collapse");
        addClassName(gebi("jdocaction"), "collapse");
        
        path = elem.name + '/useraccount.jsp';
        postRequest('columnMain', path, 'pageaction=registrationPage');
    }
     else if(action == 'update') {
        // Need to hidden JavaDocTitleBar and JavaDocCommonActionsComponent
        addClassName(gebi("jdoctitle"), "collapse");
        addClassName(gebi("jdocaction"), "collapse");
        
        path = elem.name + '/useraccount.jsp';
        postRequest('columnMain', path, 'pageaction=updatePage');
    }
     else if(action == 'New password') {
        // Need to hidden JavaDocTitleBar and JavaDocCommonActionsComponent
        addClassName(gebi("jdoctitle"), "collapse");
        addClassName(gebi("jdocaction"), "collapse");
        
        path = elem.name + '/useraccount.jsp';
        postRequest('columnMain', path, 'pageaction=NewPasswordPage');
    }
    else if(action == 'regpage4migration') {
        // Need to hidden JavaDocTitleBar and JavaDocCommonActionsComponent
        addClassName(gebi("jdoctitle"), "collapse");
        addClassName(gebi("jdocaction"), "collapse");
        hideMigration();
        //path = elem.name + '/useraccount.jsp';
        path = gebi("authpath").innerHTML;
        postRequest('columnMain', path, 'pageaction=regpage4migration');
    }
    else if(action == 'verifypage4migration') {
        // Need to hidden JavaDocTitleBar and JavaDocCommonActionsComponent
        addClassName(gebi("jdoctitle"), "collapse");
        addClassName(gebi("jdocaction"), "collapse");

        //path = elem.name + '/useraccount.jsp';
        path = gebi("authpath").innerHTML;
        postRequest('columnMain', path, 'pageaction=verifypage4migration');
    }
    else if(action == 'statistics') {
        path = elem.name + '/statistics.jsp';
        postRequest('columnMain', path, '');
    }
    else if(action == 'toimport') {
        // For this action, variable elem is a form element
        if(elem.english.value == '' || elem.english.value.indexOf('.zip') == -1) {
            alert('Please select a .zip file containning original english cmnt files!');
            return false;
        }
        if(elem.translation.value == '' || elem.translation.value.indexOf('.zip') == -1) {
            alert('Please select a .zip file containning translated cmnt files!');
            return false;
        }
        elem.submit();
    }
    else if(action=='displaypreference'){
        // For this action, return the display preference form   
        path=elem.name+'/PreferServlet';
        params=[];
        params.push(["action", "displaypreference"]);
        postAction = new Action(postProc4StockPhrases, path, params);
        getURL(path,postAction.getParams(),function(rdata,fvar){
            if(getRequestObject("jscript",rdata)) {
                showBox();
            }
            else {
                var columnMain = document.getElementById("columnMain");
                columnMain.innerHTML = rdata;
            }
        });   
    }
    return true;
}
    
function submitPref(elem){
    path=elem.action;
    params = '';
        var elems = elem.getElementsByTagName('input');
        if(elems.length < 0) path = elem.name;
        for (var ivp=0;ivp<elems.length;ivp++){
            if(elems[ivp].type == 'radio' && !elems[ivp].checked) continue;
            if(params.length > 0)
                params += '&';
            params += elems[ivp].name + '=' + elems[ivp].value;
        }
        elems = elem.getElementsByTagName('select');
        for (var ivp=0;ivp<elems.length;ivp++){
            for (var j=0;j<elems[ivp].options.length;j++){
                if(!elems[ivp].options[j].selected)
                    continue;
                if(params.length > 0)
                    params += '&';
                params += elems[ivp].name + '=' + elems[ivp].options[j].value;
            }
        }
        postRequest('columnMain', path, params);
}

function postProc4StockPhrases() {
    var path = this.path;
    var params = this.getParams();
   // alert(path + '?' + params);

    getURL(path,params,function(rdata,fvar){
        var columnMain = document.getElementById("columnMain");
        columnMain.innerHTML = rdata;
    });

    return true;
}
function postProc4PreTop10() {
    var path = this.path;
    var params = this.getParams();

    getURL(path,params,function(rdata,fvar){
        gebi("columnMain").innerHTML = rdata;
    });
    return true;
}

function toolvalidate(action, elem) {
    var path = '';
    var params = '';

    if(action == 'import') {
    }
    else if(action == 'export') {
        if(document.getElementById('classpath') == null || document.getElementById('classname') == null) {
            return;
        }
        path = document.getElementById("navpath").innerHTML + "/lang/tag";
        params = '';
        getURL(path,params,function(rdata,fvar){
            elem.href = elem.name + '/export.jsp?mode=single' + '&' + 'language=' + rdata;
        });
    }
    else if(action == 'exportall') {
        path = document.getElementById("navpath").innerHTML + "/lang/tag";
        params = '';
        getURL(path,params,function(rdata,fvar){
            elem.href = elem.name + '/export.jsp?mode=all' + '&' + 'language=' + rdata;
        });
    }
    else if(action == 'stockphrases') {
    }
      else if(action == 'bundles') {
    }
    else if(action == 'top10') {
    }
    else if(action == 'statistics') {
    } else if(action == 'about') {
        path = document.getElementById("navpath").innerHTML + "about";
        params = '';
        getURL(path,params,function(rdata,fvar){
          gebi("columnMain").innerHTML = rdata;
        });        
    }
}

// GENERIC HTTP REQUEST WITH POST METHOD
function getURL(filepath,params,ftodo,fvar,ferr){
    var http_request = false;
    if (window.XMLHttpRequest) {
        http_request = new XMLHttpRequest();
        if (http_request.overrideMimeType && filepath.indexOf('\.xml') > -1 && filepath.indexOf('.xml') == (filepath.length-4)){
            http_request.overrideMimeType('text/xml');
        }
    } else if (window.ActiveXObject) { // IE
        try { http_request = new ActiveXObject("Msxml2.XMLHTTP");
        }catch(e){
            try{
                http_request = new ActiveXObject("Microsoft.XMLHTTP");
            }catch(e){}
        }
    }
    if (!http_request) {
        return false;
    }
    http_request.onreadystatechange = function() {
        if (http_request.readyState == 4) {
            if (http_request.status == 200) {
                if (filepath.indexOf('.xml') > -1 && filepath.indexOf('.xml') == (filepath.length-4)){
                    rdata = http_request.responseXML.documentElement;
                }
                else if (http_request.getResponseHeader("content-type").indexOf('xml') > -1){
                    rdata = http_request.responseXML.documentElement;
                }
                else {
                    rdata = http_request.responseText;
                }
                ftodo(rdata,fvar); // SUCCESS
            } else {
                if (ferr) { ferr(fvar,filepath,http_request.status,http_request.statusText); } // FAIL
                //alert("http_request.status="+http_request.status+" http_request.statusText="+http_request.statusText);
            }
        }
    };
    http_request.open("POST", filepath, true);

    // Send the proper header information along with the request
    if(params.indexOf('content-type=multipart/form-data') > -1) {
        http_request.setRequestHeader("content-type", "multipart/form-data");
    }
    else {
        http_request.setRequestHeader("content-type", "application/x-www-form-urlencoded");
    }
    http_request.setRequestHeader("content-length", params.length);
    http_request.setRequestHeader("connection", "close");
    http_request.send(params);
}


// -------------------------------
// Toggle button functions
// -------------------------------
function toggle(tag, hideStr, detailsStr) {
    var element = document.getElementById(tag);
    var v = element.style.display!="block";
    element.style.display = v ? "block" : "none";
    document.getElementById(tag+"Button").firstChild.nodeValue = v ? hideStr : detailsStr;
}


// -------------------------------
// Statistics Report Script
// -------------------------------
function validateInput() {
    var path = "statistics.jsp";
    var params = "ajax=true";

    // find the DOM element that contains the first name input
    packages = document.getElementById("package");
    for(var i = 0; i < packages.options.length; i++) {
        if (packages.options[i].selected)
            params += "&package=" + packages.options[i].value;
    }

    langs = document.getElementById("lang");
    for(var i = 0; i < langs.options.length; i++) {
        if (langs.options[i].selected)
            params += "&lang=" + langs.options[i].value;
    }
    showoption = document.getElementById("showoption0");
    if (showoption.checked)
        params += "&showoption=" + showoption.value;
    showoption = document.getElementById("showoption1");
    if (showoption.checked)
        params += "&showoption=" + showoption.value;

    getURL(path,params,function(rdata,fvar){
        target = document.getElementById("report");
        target.innerHTML = rdata;
    });
}

//----------------------------------------
// Functions to get data for form
// Copied from sniff.js but with correction
// for handling checkbox type
//----------------------------------------
function getFormData(thisform) {
    var fargs = [];
    var inps = reg.getElementsBySelector("input, select, textarea",thisform);
    for (var a=0; a<inps.length; a++){
        var inp = inps[a];
        if (inp.type == "text" || inp.type == "hidden" || inp.type == "password"){
            fargs.push(encodeURIComponent(inp.name) + "=" + encodeURIComponent(inp.value));
        }
        if (inp.type == "checkbox"){
            fargs.push(encodeURIComponent(inp.name) + "=" + encodeURIComponent(inp.checked));
        }
        if (inp.type == "radio" && inp.checked){
            fargs.push(encodeURIComponent(inp.name) + "=" + encodeURIComponent(inp.value));
        }
        if (inp.nodeName.toLowerCase()=='select'){
            fargs.push(encodeURIComponent(inp.name) + "=" + encodeURIComponent(inp.options[inp.selectedIndex].value));
        }
        if (inp.nodeName.toLowerCase()=='textarea'){
            fargs.push(encodeURIComponent(inp.name) + "=" + encodeURIComponent(inp.value));
        }
    }
    return fargs.join('&');
}

//----------------------------------------
// Functions to validate user information
// and display error messages.
//----------------------------------------

function submitUserInformation(form){
    var path = form.contextroot.value + "/useraccount.jsp";
    // Set the ajax variable.
    var params = "ajax=true&pageaction=register" + "&" + getFormData(form);
    showProcessing();
    getURL(path,params,function displayError(rdata,fvar){
        if(rdata.getElementsByTagName('*')[0].nodeName == "error"){
            hideProcessing();
            document.getElementById("error").style.display='block';                 
            document.getElementById("errormsg").innerHTML = '<p>' + rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue + '</p>';
        }
        else if(rdata.getElementsByTagName('*')[0].nodeName == "redirect"){
            setTimeout("window.location='"+rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue +"'",0);
        }
    });
}
//------------------------------------------
// Functions to validate update information
// and display error messages.
//------------------------------------------

function submitUpdateInformation(form){
    var path = form.contextroot.value + "/useraccount.jsp";
    // Set the ajax variable.
    var params = "ajax=true&pageaction=update" + "&" + getFormData(form);
    showProcessing();
    getURL(path,params,function displayError(rdata,fvar){
        if(rdata.getElementsByTagName('*')[0].nodeName == "error"){
            hideProcessing();
            document.getElementById("error").style.display='block';                 
            document.getElementById("errormsg").innerHTML = '<p>' + rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue + '</p>';
        }
        else if(rdata.getElementsByTagName('*')[0].nodeName == "redirect"){
            setTimeout("window.location='"+rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue +"'",0);
        }
    });
}

//----------------------------------------
// Functions to validate user password information
// and display error messages.
//----------------------------------------

function submitForgotPasswordInformation(form){
    var path = form.contextroot.value + "/useraccount.jsp";
    // Set the ajax variable.
    var params = "ajax=true&pageaction=New password&userid="+document.getElementById("userid").value;
    showProcessing();
    getURL(path,params,function displayError(rdata,fvar){
        hideProcessing();
        if(rdata.getElementsByTagName('*')[0].nodeName == "passworderror"){
            removeClassName(gebi("act.result"), "collapse");
            removeClassName(gebi("act.result.style"), "g29v3");
            addClassName(gebi("act.result.style"), "g29v0");
        }
        else if(rdata.getElementsByTagName('*')[0].nodeName == "passwordok"){
            removeClassName(gebi("act.result"), "collapse");
            removeClassName(gebi("act.result.style"), "g29v0");
            addClassName(gebi("act.result.style"), "g29v3");
        }
        gebi("act.result.msg").innerHTML = '<p>' + rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue + '</p>';
    });
}
function refreshpasswdinfo() {
    addClassName(gebi("act.result"), "collapse");
}
//----------------------------------------
// Function to validate login information
// and display error messages.
//----------------------------------------
  
function submitLoginInformation(license,form){
    var path = form.contextroot.value + "/useraccount.jsp";
    // Set the ajax variable.
    var params = "ajax=true&pageaction=login&uid="+form.usrname.value+"&password1="+ encodeURIComponent(form.usrpassword.value)+"&license="+form.license.checked;
    getURL(path,params,function displayError(rdata,fvar){
        if(rdata.getElementsByTagName('*')[0].nodeName == "error"){
            alert(rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue );
        }
        else if(rdata.getElementsByTagName('*')[0].nodeName == "redirect"){
            if(!form.popup)
                setTimeout("window.location='"+rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue +"'",0);
            else {
                hideBox();
                // Refresh the login component
                getURL(path,"action=loginpage",function(logincomp,fvar){
                    setInnerHTML(gebi("login"), logincomp);
                });
                postAction.perform();
            }
                
        }
    });
}

//----------------------------------------
// Function to check whether user has 
// accepted license or not.
//----------------------------------------

function checkLicense(license,elem){
    var path = getFormObj(elem).contextroot.value + "/useraccount.jsp";
    var params = "ajax=true&pageaction=licensecheck&uid="+elem.value;
    getURL(path,params,function displayError(rdata,fvar)    {
        if(rdata.getElementsByTagName('*')[0].nodeName == "displaylicense"){
            if(rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue == "true"){
                document.getElementById(license).className="display";
            }
            else {
                document.getElementById(license).className="collapse";
            }
        }
    });
} 

//----------------------------------------
// Function to logout a user.
//----------------------------------------

function submitLogout(elem){
    var path = elem.name + "/useraccount.jsp";
    // Set the ajax variable.
    var params = "ajax=true&pageaction=logout";
    getURL(path,params,function displayError(rdata,fvar){
        if(rdata.getElementsByTagName('*')[0].nodeName == "redirect"){
            setTimeout("window.location='"+rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue +"'",0);
        }
    });
}

//-------------------------------------------------------
// Functions to migrate account
//-------------------------------------------------------
function regUser4Migration(form){
    var path = gebi("authpath").innerHTML;
    // Set the ajax variable.
    var params = "ajax=true&pageaction=register4migration" + "&" + getFormData(form);
    showProcessing();
    getURL(path,params,function displayError(rdata,fvar){
        hideProcessing();
        if(rdata.getElementsByTagName('*')[0].nodeName == "error"){
            removeClassName(gebi("act.result"), "collapse");
            removeClassName(gebi("act.result.style"), "g29v3");
            addClassName(gebi("act.result.style"), "g29v0");
        }
        else if(rdata.getElementsByTagName('*')[0].nodeName == "success"){
            removeClassName(gebi("act.result"), "collapse");
            removeClassName(gebi("act.result.style"), "g29v0");
            addClassName(gebi("act.result.style"), "g29v3");
        }
        gebi("act.result.msg").innerHTML = '<p>' + rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue + '</p>';
    });
}
function toMigrateAccount(form){
    var path = gebi("authpath").innerHTML;
    // Set the ajax variable.
    var params = "ajax=true&pageaction=tomigrate" + "&" + getFormData(form);
    showProcessing();
    getURL(path,params,function displayError(rdata,fvar){
        hideProcessing();
        if(rdata.getElementsByTagName('*')[0].nodeName == "error"){
            removeClassName(gebi("act.result"), "collapse");
            removeClassName(gebi("act.result.style"), "g29v3");
            addClassName(gebi("act.result.style"), "g29v0");
        }
        else if(rdata.getElementsByTagName('*')[0].nodeName == "success"){
            removeClassName(gebi("act.result"), "collapse");
            removeClassName(gebi("act.result.style"), "g29v0");
            addClassName(gebi("act.result.style"), "g29v3");
            setTimeout("window.location='"+rdata.getElementsByTagName('redirect')[0].childNodes[0].nodeValue +"'",rdata.getElementsByTagName('timeout')[0].childNodes[0].nodeValue);
        }
        gebi("act.result.msg").innerHTML = '<p>' + rdata.getElementsByTagName('*')[0].childNodes[0].nodeValue + '</p>';
    });
}

function validateAuth(action) {
    var path = gebi("authpath").innerHTML;
    var params = "action=" + action;
    
    if(action == "loginpage") {
        getURL(path, params, function (rdata, fvar) {
            setInnerHTML(gebi("login"), rdata);
            validateAuth('migrationcheck');
        })
    } else if (action == "login") {
        
    } else if (action == "logout") {
        
    } else if (action == "update") {
        
    } else if (action == "updatepage") {
        
    } else if (action == "reg") {
        
    } else if (action == "regpage") {
        
    } else if (action == "licensecheck") {

    } else if (action == "acceptlicense") {
        params += "&license" + document.getElementById("license").value;
        getURL(path, params, function (rdata, fvar) {
            document.getElementById("loginlicense_main").style.display="none";
        })
    } else if (action == "reset") {
        
    } else if (action == "resetpage") {
        
    } else if (action == "migrationcheck") {
        getURL(path, params, function (rdata, fvar) {
            if(rdata == "true") {
                showMigration();
            }
        });
    } else {
        
    }      
}

function getFormObj(elem){
    var parent = elem.parentNode;
    while(parent.nodeName.toLowerCase() != "form")
        parent = parent.parentNode;
    return parent;
}

// -------------------------------
// Functions for checking date
// -------------------------------

var dateField;
function setVar(obj) {
    if (obj)
        dateField = obj;
    //alert(dateField.type);
}
function setDate() {
    if (dateField != null && dateField.type == "text")
        dateField.value = document.calendar.getDate();
}

function checkDate() {
    withdate = document.getElementById("withdate");
    if (!withdate.checked)
        return true;
    dateStart = document.getElementById("dateStart");
    dateEnd = document.getElementById("dateEnd");

    date = new Date();

    y = date.getFullYear();
    m = date.getMonth() + 1;
    d = date.getDate();
    if (m < 10)
        m = "0" + m;
    if (d < 10)
        d = "0" + d;
    today = y + "-" + m + "-" + d;

    from = dateStart.value;
    to = dateEnd.value;

    if (from.length==10 && to.length==10) {
        if (to < from) {
            alert("You put the end-date before the start-date, please correct it!");
            dateStart.value = today.substring(0,8);
            dateEnd.value = today.substring(0,8);
            dateStart.focus();
            return false;
        }
        return true;
    }
    else {
        alert("Please input the start-date and end-date correctly!\nClick the date input box first, then click a day from right side Calendar.");
        dateStart.value = today.substring(0,8);
        dateEnd.value = today.substring(0,8);
        if (from.length < 10)
            dateStart.focus();
        else
            dateEnd.focus();
        return false;
    }
}

function setInnerHTML(el, htmlCode) {
    var el_next = el.nextSibling;
    var el_parent = el.parentNode;
    el_parent.removeChild(el);
    el.innerHTML = htmlCode;
    if (el_next) {
        el_parent.insertBefore(el, el_next)

    } else {
        el_parent.appendChild(el);
    }
}

function replaceHtml(el, html) {
	var oldEl = typeof el === "string" ? document.getElementById(el) : el;
	/*@cc_on // Pure innerHTML is slightly faster in IE
		oldEl.innerHTML = html;
		return oldEl;
	@*/
	var newEl = oldEl.cloneNode(false);
	newEl.innerHTML = html;
	oldEl.parentNode.replaceChild(newEl, oldEl);
	/* Since we just removed the old element from the DOM, return a reference
	to the new element, which can be used to restore variable references. */
	return newEl;
};


//-----------------------------------------------
// Post process after login
//-----------------------------------------------

var postAction = {};
/**
 * Action Object
 * @param fAction   the function which will be invoked
 * @param sPath     the path which will be AJAXed
 * @param aArgs     the arguments which will be used AJAX
 *                  it should be an array with the format as
 *                  [[field1,value1],[field2,value2],...[fieldn,valuen]]
 */
function Action(fAction, sPath, aArgs) {
    this.perform = fAction;
    this.path = sPath;
    this.args = aArgs;
    this.getParams = function() {
        if(!this.args) return null;
        var keyvals = [];
        for (var i=0;i<this.args.length;i++) {
            keyvals.push(this.args[i].join("="));
        }
        return keyvals.join("&");
    }
    this.getValByKey = function(key) {
        if(!this.args) return null;
        for (var i=0;i<this.args.length;i++) {
            var array = this.args[i];
            if(array[0] == key)
                return array[1];
        }
        return null;
    }
}

function postProc4MemberPost() {
    var path = this.path;
    var params = this.getParams();
    //alert(path + '?' + params);

    getURL(path,params,function(rdata,fvar){
        // Something special need to do for member post actions like:
        //     add/translate/edit/ratingup/ratingdown
        // All rating images should be refreshed, since user logged in
        refreshRatingInformation(path);

        if(getRequestObject("errormsg",rdata)) {
            alert(getRequestObject("errormsg",rdata).innerHTML);
        }
        else if(postAction.getValByKey("action")=="delete") {
            // If getting "delete" action
            // Update the popup menu items at first
            // Then make it visible for the popup menu
            // No other components need to be re-ajax
            updatePostPopupMenu(postAction.getValByKey("classTag"),postAction.getValByKey("id"),"preDel");
            var popupmenu = gebi("postpopup");
            popupmenu.style.visibility = "visible";
            popupmenu.style.top = (parseInt(popupmenu.style.top)-5)+"px";
        }
        else {
            // If the target div component specified, update the contents
            // otherwise, nothing to do
            var divid = postAction.getValByKey("divid");
            if(getRequestObject("divid",rdata)) // Exception that the id value being changed
                divid = getRequestObject("divid",rdata).innerHTML;
            setInnerHTML(gebi(divid), rdata);
        }
    });
    return true;
}
function refreshRatingInformation(path) {
    var columnMain = gebi("columnMain");
    var an = gebtn("div", columnMain);
    var params;
    for(var i=0;i<an.length;i++){
        var tagflags = an[i].id.split('.');
        if(tagflags.length != 4) continue;
        if(tagflags[1]!="rating" || tagflags[2]!="no") continue;
        if(tagflags[3]==postAction.getValByKey("id") && postAction.getValByKey("action").indexOf("rating")>-1) {
            sniffPostPopup(an[i]);
            continue;
        }
        params = "action=" + "rating";
        params += "&type=" + tagflags[0];
        params += "&id=" + tagflags[3];
        getURL(path,params,function(data,target){
            setInnerHTML(target, data);
            sniffPostPopup(target);
        },an[i]);
    }
}
function sniffPostPopup(elem) {
    var target = document.getElementById(elem);
    if(!target)
        target = elem;
    var lnks = target.getElementsByTagName('a');
    for (var a=0; a<lnks.length; a++) {
        var lnk = lnks[a];
        if(lnk.className.indexOf("k2over") > -1)
            sniffK2(lnk);
    }
} 

function toggle1(tag, hideurl, detailsurl) {
    var element = document.getElementById(tag);
    var v = element.style.display!="none";
    element.style.display = v ? "none" : "block";
    document.getElementById(tag+"Button").firstChild.src = v ? hideurl :detailsurl ;
    document.getElementById(tag+"Button").firstChild.title = v ? "Expand" : "Collapse";
}


// -------------------------------
// Member Posts Scripts
// -------------------------------
function togglePosts(tag) {
    var element = document.getElementById(tag);
    toggleClassName(element, "collapse");
}
function toggleSection(type, flag, classTag) {
    var clztag = classTag.replace(/\//g, ".");
    var tag = type + flag + clztag;
    var element = document.getElementById(tag);
    toggleClassName(element, "collapse");

    var image = document.getElementById("img."+tag);
    if (tag.indexOf("list") > -1) {
        image.src = hasClassName(element, "collapse") ? "/im/arrow_orange_closed.gif" : "/im/arrow_orange_open.gif";
    } else {
        image.src = hasClassName(element, "collapse") ? "/im/arrow_black_closed.gif" : "/im/arrow_black_open.gif";
        // Enable/Disable to display the Add link
        var addlink = document.getElementById(type + ".addlink." + clztag);
        hasClassName(element, "collapse")?addlink.style.visibility="visible":addlink.style.visibility="hidden";
    }
}

function validatePosts(action, type, classTag, postID) {
    if(document.getElementById('postspath') == null) return;
    var sniffNeeded = "true";
    var path = document.getElementById('postspath').innerHTML + classTag;
    var params = [];
    params.push(["action", action]);
    params.push(["type", type]);
    
    var clztag = classTag.replace(/\//g, ".");
    isEditFormOpened = false;
    if (action == "add") {
        elemID = type + ".add." + clztag;
        sniffNeeded = "false";
        // Enable to display the section
        removeClassName(document.getElementById(type + "." + clztag), "collapse");
        // Disable to display the Add link
        if(document.getElementById(type + ".list." + clztag).getElementsByTagName("div").length>0)
            document.getElementById(type + ".addlink." + clztag).style.visibility="hidden";
    }
    else if (action == "cancelnew") {
        elemID = type + ".add." + clztag;
        newPostComponent = document.getElementById(elemID);
        setInnerHTML(newPostComponent, "");
        // If no new post added, re-hidden the posts flag and its contents
        var temp = document.getElementById("posts.count."+clztag);
        if(elemText(temp) == "0") {
            temp = document.getElementById("posts.flag."+clztag);
            temp.style.visibility="hidden";
            temp = document.getElementById("posts."+clztag);
            addClassName(temp, "collapse");
            setInnerHTML(temp, "");
        }
        return;
    }
    else if (action == "savenew") {
        content = document.forms[type + ".form.new." + clztag].content;
        if (content.value == "") {
            if(type == "bug")
                alert("Please input the bug number!");
            else
                alert("Your input is empty, please add your comments again!");
            content.focus();
            return;
        }
        else if(type == "bug") {
            bugnum = document.getElementById(type + ".chkbugid." + clztag);
            if(bugnum.firstChild.title == "error") {
                alert("Invalid Bug Number!")
                content.select();
                content.focus();
                return;
            }
        }
        params.push(["content", content.value]);
        elemID = type + ".section." + clztag;
        if(!hasClassName(document.getElementById(elemID),"collapse"))
            params.push(["bexpanded", "true"]);
    }
    else if (action == "edit") {
        params.push(["id", postID]);
        
        noteoriginal = document.getElementById("note.original.no." + postID);
        if(noteoriginal && !hasClassName(noteoriginal, "collapse"))
            params.push(["vieworiginal", "true"]);

        elemID = type + ".edit.no." + postID;
        sniffNeeded = "false";
    }
    else if (action == "canceledit") {
        elemID = type + ".edit.no." + postID;
        newPostComponent = document.getElementById(elemID);
        setInnerHTML(newPostComponent, "");

        closeoriginal = document.getElementById("note.closeoriginal.no."+postID);
        if(closeoriginal && hasClassName(closeoriginal, "collapse"))
            removeClassName(closeoriginal, "collapse");
        return;
    }
    else if (action == "saveedit") {
        params.push(["id", postID]);
        content = document.forms[type + ".form.edit.no." + postID].content;
        if (content.value == "") {
            if(type == "bug")
                alert("Please input the bug number!");
            else
                alert("Your input is empty, please add your comments again!");
            content.focus();
            return;
        }
        else if(type == "bug") {
            bugnum = document.getElementById(type + ".chkbugid.no." + postID);
            alert(bugnum.firstChild.title);
            if(bugnum.firstChild.title == "error") {
                alert("Invalid Bug Number!")
                content.select();
                content.focus();
                return;
            }
        }
        params.push(["content", content.value]);

        elemID = type + ".content.no." + postID;
    }
    else if (action == "checkbugid") {
        // Getting user input from the form of newing member post
        // if no post id specified, otherwise from the form of editing 
        // memeber post
        if(postID == null)
            content = document.forms[type + ".form.new." + clztag].content;
        else
            content = document.forms[type + ".form.edit.no." + postID].content;
        if(content.value == "")
            return;
        if(!isNumber(content.value)) {
            alert("Please input digit (0~9) for the bug number!");
            content.focus();
            content.select();
            return;
        }
        params.push(["content", content.value]);
        if(postID == null)
            elemID = type + ".chkbugid." + clztag;
        else
            elemID = type + ".chkbugid.no." + postID;
        sniffNeeded = "false";
    }
    else if (action == "t9n") {
        params.push(["id", postID]);
        
        noteoriginal = document.getElementById("note.original.no." + postID);
        if(noteoriginal && !hasClassName(noteoriginal, "collapse"))
            params.push(["vieworiginal", "true"]);
        elemID = type + ".t9n.no." + postID;
        sniffNeeded = "false";
    }
    else if (action == "cancelt9n") {
        elemID = type + ".t9n.no." + postID;
        newPostComponent = document.getElementById(elemID);
        setInnerHTML(newPostComponent, "");

        closeoriginal = document.getElementById("note.closeoriginal.no."+postID);
        if(closeoriginal && hasClassName(closeoriginal, "collapse"))
            removeClassName(closeoriginal, "collapse");

        return;
    }
    else if (action == "savet9n") {
        params.push(["id", postID]);
        content = document.forms[type + ".form.t9n.no." + postID].content;
        if (content.value == "") {
            alert("Your input is empty, please add your translation again!");
            content.focus();
            return;
        }
        params.push(["content", content.value]);

        elemID = type + ".content.no." + postID;
    }
    else if (action == "ratingup") {
        params.push(["id", postID]);
        elemID = type + ".rating.no." + postID;
    }        
    else if (action == "ratingdown") {
        params.push(["id", postID]);
        elemID = type + ".rating.no." + postID;
    }
    else if (action == "delete") {
        // This is only be invoked by guest while processing delete action
        params.push(["id", postID]);
        elemID = type + ".section." + clztag;
    }
    params.push(["classTag",classTag]);
    params.push(["divid",elemID]);
    postAction = new Action(postProc4MemberPost, path, params);
    
    var target = document.getElementById(elemID);
    getURL(path,postAction.getParams(),function(rdata,fvar){
        if(getRequestObject("jscript",rdata)) {
            showBox();
        }
        else {
            setInnerHTML(target, rdata);
            // Post progress
            if(sniffNeeded == "true") sniffPostPopup(target);
            if (action == "savenew") {
                // Refresh the member post amount
                getURL(path,"action=count",function(rdata,fvar){
                    temp = document.getElementById("posts.amount."+clztag);
                    setInnerHTML(temp, rdata);
                    temp = document.getElementById("posts.count."+clztag);
                    setInnerHTML(temp, rdata);
                    temp = document.getElementById("posts.flag."+clztag);
                    temp.style.visibility="visible";
                    temp = document.getElementById("posts."+clztag);
                    removeClassName(temp, "collapse");
                });
            }
            pageTracker._trackPageview("/post/" + action + "type/" + classTag);
        }
    });    
}

function addPost(action, type, classTag) {
    if(document.getElementById('postspath') == null) return;
    var path = document.getElementById('postspath').innerHTML + classTag;
    var clztag = classTag.replace(/\//g, ".");
    var target = document.getElementById("posts."+clztag);
    removeClassName(target, "collapse");

    var amount = document.getElementById("posts.count."+clztag);
    //var params = "action=construct";
    var params = [];
    params.push(["action", "construct"]);
    params.push(["type", type]);
    params.push(["classTag",classTag]);
    params.push(["divid","posts."+clztag]);
    params.push(["nextaction",action]);
    postAction = new Action(postProc4AddMPost, path, params);
    if(elemText(amount) == "0") {
        getURL(path,postAction.getParams(),function(rdata,fvar){
            if(getRequestObject("jscript",rdata)) {
                showBox();
            }
            else {
                setInnerHTML(target, rdata);
                // Delegate the adding action
                validatePosts(action, type, classTag, 0);
            }
        });
    }
    else {
        validatePosts(action, type, classTag, 0);
    }
}
function postProc4AddMPost() {
    var path = this.path;
    var params = this.getParams();
    //alert(path + '?' + params);
    var clztag = postAction.getValByKey("classTag").replace(/\//g, ".");
    var target = document.getElementById("posts."+clztag);

    getURL(path,params,function(rdata,fvar){
        setInnerHTML(target, rdata);
        // Delegate the adding action
        validatePosts(postAction.getValByKey("nextaction"), postAction.getValByKey("type"), postAction.getValByKey("classTag"), 0);
    });
}

function isNumber(name) {
    if(name.length == 0)
        return false;
    for(i = 0; i < name.length; i++) {
        if(name.charAt(i) < "0" || name.charAt(i) > "9")
            return false;
    }
    return true;
} 

function updatePostPopupMenu(classTag, postID, preDel) {
    if(document.getElementById('postspath') == null) return;
    // Clear menu content at first.
    var target = document.getElementById("postpopupcontents");
    target.innerHTML = "";
    
    var action = "updatemenu";
    var path = document.getElementById('postspath').innerHTML + classTag;
    var params = "action="+action;
    params += "&id=" + postID;
    getURL(path,params,function(rdata,fvar){
        setInnerHTML(target, rdata);
        sniffPostPopup(target);
        if(preDel)
            deleteConfirm();
    });
}

function updateSortByMenu(classTag, type) {
    if(document.getElementById('postspath') == null) return;
    // Clear menu content at first.
    var target = document.getElementById("sortbymenuitems");
    target.innerHTML = "";
    
    var action = "updatesortbymenu";
    var path = document.getElementById('postspath').innerHTML + classTag;
    var params = "action="+action;
    params += "&type=" + type;
    getURL(path,params,function(rdata,fvar){
        setInnerHTML(target, rdata);
    });
}

function updateOriginalDetail(classTag, postID) {
    if(document.getElementById('postspath') == null) return;
    // Clear menu content at first.
    var target = document.getElementById("oringaldetailcontents");
    target.innerHTML = "";
    
    var action = "updateorginaldetails";
    var path = document.getElementById('postspath').innerHTML + classTag;
    var params = "action="+action;
    params += "&id=" + postID;
    getURL(path,params,function(rdata,fvar){
        setInnerHTML(target, rdata);
    });    
}

function updateRatingDetail(classTag, postID) {
    if(document.getElementById('postspath') == null) return;
    // Clear content at first.
    var target = document.getElementById("ratingdetailcontents");
    target.innerHTML = "";
    
    var action = "updateratingdetail";
    var path = document.getElementById('postspath').innerHTML + classTag;
    var params = "action="+action;
    params += "&id=" + postID;
    getURL(path,params,function(rdata,fvar){
        setInnerHTML(target, rdata);
    });    
}

function preparePopupMenu() {
    postPopupMenu();
    sortByMenu();
    oringalDetail();
    ratingDetail();
    transPopupMenu();
}

function postPopupMenu() {
    var k2c = document.getElementById("postpopup");
    if (k2c == null) {
        k2c = document.createElement('div');
        k2c.className = "k2c";
        k2c.id = "postpopup";
        
        var k2pop = document.createElement('div');
        k2pop.className = "k2pop";
        var contents = document.createElement('div');
        contents.id = "postpopupcontents";

        k2pop.appendChild(contents);
        k2c.appendChild(k2pop);
        document.body.appendChild(k2c);
    }
}

function sortByMenu() {
    var k2c = document.getElementById("sortbymenu");
    if (k2c == null) {
        k2c = document.createElement('div');
        k2c.className = "k2c";
        k2c.id = "sortbymenu";
        
        var k2pop = document.createElement('div');
        k2pop.className = "k2pop";
        var contents = document.createElement('div');
        contents.id = "sortbymenuitems";

        k2pop.appendChild(contents);
        k2c.appendChild(k2pop);
        document.body.appendChild(k2c);
    }
}

function oringalDetail() {
    var k2c = document.getElementById("oringaldetail");
    if (k2c == null) {
        k2c = document.createElement('div');
        k2c.className = "k2c";
        k2c.id = "oringaldetail";
        
        var k2pop = document.createElement('div');
        k2pop.className = "k2pop";
        var contents = document.createElement('div');
        contents.id = "oringaldetailcontents";

        k2pop.appendChild(contents);
        k2c.appendChild(k2pop);
        document.body.appendChild(k2c);
    }
}

function ratingDetail() {
    var k2c = document.getElementById("ratingdetail");
    if (k2c == null) {
        k2c = document.createElement('div');
        k2c.className = "k2shadow";
        k2c.id = "ratingdetail";
        
        var k2pop = document.createElement('div');
        k2pop.className = "k2main";
        var contents = document.createElement('div');
        contents.id = "ratingdetailcontents";

        k2pop.appendChild(contents);
        k2c.appendChild(k2pop);
        document.body.appendChild(k2c);
    }
}

function sortMemberPosts(type, classTag, sortval) {
    if(document.getElementById('postspath') == null) return;
    // Disable the sort memu item
    var k2c = document.getElementById("sortbymenu");
    k2c.style.visibility = "hidden";
    
    var target = document.getElementById(type+"."+classTag.replace(/\//g, "."));
    var action = "sort";
    var path = document.getElementById('postspath').innerHTML + classTag;
    var params = "action="+action;
    params += "&type=" + type;
    params += "&sortval=" + sortval;

    getURL(path,params,function(rdata,fvar){
        setInnerHTML(target, rdata);
        sniffPostPopup(target);
    });    
}

function hiddenPostMenu() {
    var k2c = document.getElementById("postpopup");
    k2c.style.visibility = "hidden";
}

function viewOriginal(classTag, postID, viewlink, closelink) {
    var tag = "note.original.no." + postID;
    var element = document.getElementById(tag);
    var closeoriginal = document.getElementById("note.closeoriginal.no."+postID);

    if(!viewlink) {
        hiddenPostMenu();
        removeClassName(element, "collapse");
        if(document.getElementById("note.t9n.no."+postID).innerHTML) {
            addClassName(closeoriginal, "collapse");
            // Need to refresh the translation form
            validatePosts('t9n','note', classTag, postID);
        }
        else if(document.getElementById("note.edit.no."+postID).innerHTML) {
            addClassName(closeoriginal, "collapse");
            // Need to refresh the edit form
            validatePosts('edit','note', classTag, postID);
        }
        else
            removeClassName(closeoriginal, "collapse");
    }
    else {
        toggleClassName(element, "collapse");
        var originallink = document.getElementById("note.orginal.link.no."+postID);
        if(hasClassName(element, "collapse"))
            originallink.innerHTML = viewlink;
        else
            originallink.innerHTML = closelink;
        addClassName(closeoriginal, "collapse");
    }
}

function transPopupMenu() {
    var k2w160 = document.getElementById("transpopup");
    if (k2w160 == null) {
        k2w160 = document.createElement('div');
        k2w160.className = "k2w160";
        k2w160.id = "transpopup";

        var k2pop = document.createElement('div');
        k2pop.className = "k2pop";
        var contents = document.createElement('div');
        contents.id = "transpopupcontents";

        k2pop.appendChild(contents);
        k2w160.appendChild(k2pop);
        document.body.appendChild(k2w160);
    }
}

function hiddenTransPopupMenu() {
    var k2w160 = document.getElementById("transpopup");
    k2w160.style.visibility = "hidden";
}

function updateTransPopupMenu(classTag, transID) {
    if(document.getElementById('transpath') == null) return;
    // Clear menu content at first.
    var target = document.getElementById("transpopupcontents");
    target.innerHTML = "";

    var action = "updatemenu";
    var path = document.getElementById('transpath').innerHTML + classTag;
    var params = "action="+action;
    params += "&classTag=" + classTag;
    params += "&divid=" + target.id;
    params += "&id=" + transID;
    getURL(path,params,function(rdata,fvar){
        setInnerHTML(target, rdata);
        var id = transID.substring(1, transID.length)
        var closeOriginalLinkElem = document.getElementById("t9co" + id);
        var originalElem = document.getElementById("t9o" + id);
        var bodyElem = document.getElementById("t9b" + id);

        closeOriginalMenuElem = document.getElementById("t9mc" + id)
        viewOriginalMenuElem = document.getElementById("t9mv" + id)
        if(originalElem == null) {
            if(viewOriginalMenuElem != null)viewOriginalMenuElem.style.display = "block";
            if(closeOriginalMenuElem != null)closeOriginalMenuElem.style.display = "none";
        }else if(closeOriginalLinkElem == null && originalElem.style.display != "none") {
            viewOriginalMenuElem.style.display = "none";
            closeOriginalMenuElem.style.display = "block";
        } else if(closeOriginalLinkElem != null && closeOriginalLinkElem.style.display != "none" && bodyElem.style.display != "none") {
            viewOriginalMenuElem.style.display = "none";
            closeOriginalMenuElem.style.display = "block";
        } else if(originalElem != null && originalElem.style.display == "block") {
            viewOriginalMenuElem.style.display = "none";
            closeOriginalMenuElem.style.display = "block";
        }else {
            viewOriginalMenuElem.style.display = "block";
            closeOriginalMenuElem.style.display = "none";
        }
        sniffPostPopup(target);
    });
}

function closeOriginal(divtag) {
    var element = document.getElementById(divtag);
    addClassName(element, "collapse");
}

function translateOriginal(classTag, postID) {
    hiddenPostMenu();
    validatePosts('t9n','note', classTag, postID);
}

function editPost(action, type, classTag, postID) {
    hiddenPostMenu();
    // 
    var elem = document.getElementById("note.closeoriginal.no."+postID);
    if(elem)
        addClassName(elem, "collapse");
    validatePosts(action, type, classTag, postID);
}

function deleteConfirm(form, postID) {
    var confirmform = document.getElementById("delconfirmform");
    if(!form) {
        removeClassName(confirmform, "collapse");
    }
    else if(!postID) {
        addClassName(confirmform, "collapse");
    }
    else {
        hiddenPostMenu();
        var action = "delpost";
        var type = form.type.value;
        var classTag = form.docTag.value;
        // Send request to server to delete the post or translation
        if(document.getElementById('postspath') == null) return;
        var path = document.getElementById('postspath').innerHTML + classTag;
        var clztag = classTag.replace(/\//g, ".");
        var elemTag = type + ".section." + clztag;
        var target = document.getElementById(elemTag);
        var params = "action=" + action;
        params += "&type=" + type;
        params += "&id=" + postID;
        params += "&delt9n=" + form.delt9n.value;
    
        getURL(path,params,function(rdata,fvar){
            setInnerHTML(target, rdata);
            sniffPostPopup(target);
            // Refresh the member post amount
            getURL(path,"action=count",function(rdata,fvar){
                temp = document.getElementById("posts.amount."+clztag);
                setInnerHTML(temp, rdata);
                temp = document.getElementById("posts.count."+clztag);
                setInnerHTML(temp, rdata);
            });
        });
    }
}

/*****************************************************\
* popup window to display search result wiht details
\*****************************************************/
function showResult(){
    //var overlay = document.getElementById('docweboverlay');
    var box = document.getElementById('searchresultbox');
    //overlay.style.display='block';
    box.style.display='block'
    //overlayReload(overlay);
    centerbox(box);
}
function hideResult(){
    //var overlay = document.getElementById('docweboverlay');
    var box = document.getElementById('searchresultbox');
    //overlay.style.display='none';
    box.style.display='none'
}

/*****************************************************\
* popup window to display account migration
\*****************************************************/
function showMigration(){
    var overlay = document.getElementById('docweboverlay');
    var box = document.getElementById('migrationbox');
    overlay.style.display='block';
    box.style.display='block'
    overlayReload(overlay);
    centerbox(box);
}
function hideMigration(){
    var overlay = document.getElementById('docweboverlay');
    var box = document.getElementById('migrationbox');
    overlay.style.display='none';
    box.style.display='none'
}

/****************************************\
* popup login dialog script start
\****************************************/
function hideBox(){
    var overlay = document.getElementById('popup_loginoverlay');
    var box = document.getElementById('popup_loginbox');
    overlay.style.display='none';
    box.style.display='none'
    if(is.ff){
        document.body.style.overflowY='auto';
        document.body.style.overflowX='auto';
    }
    return false;
}
/****************************************\
* Show Overlay and box
\****************************************/
function showBox(){
    var overlay = document.getElementById('popup_loginoverlay');
    var box = document.getElementById('popup_loginbox');
    overlay.style.display='block';
    box.style.display='block'
    overlayReload(overlay);
    centerbox(box);
    //return false;
}
/****************************************\
* popup login dialog script end
\****************************************/

function toggleRaw(id, flag) {
    var mainElem = document.getElementById("t9m" + id);
    var rawElem = document.getElementById("t9r" + id);
	var bodyElem = document.getElementById("t9b" + id);
    var originalElem = document.getElementById("t9o" + id);
    var viewOriginalLinkElem = document.getElementById("t9vo" + id);
    var closeOriginalLinkElem = document.getElementById("t9co" + id);
    
    if( flag && rawElem == null) {
        var path = document.getElementById("transpath").innerHTML;
        var doctag = document.getElementById("t9d" + id).value;
        var params = "action=vieworiginal&id=" + id + "&doctag=" + doctag;
        getURL(path,params,function(rdata,fvar){
            mainElem.innerHTML = rdata;
        });
        hiddenTransPopupMenu();

        return;
    }

    if(!flag && rawElem == null) {
        originalElem.style.display='none'
        hiddenTransPopupMenu();
        return;
    }

    hiddenTransPopupMenu();
    if(flag) {
        viewOriginalLinkElem.style.display = 'none'
        closeOriginalLinkElem.style.display = 'block'

        if(bodyElem.style.display == "block") {
            rawElem.style.display='block'
            originalElem.style.display='none'
        } else {
            rawElem.style.display='none'
            originalElem.style.display='block'
        }
    } else {
        rawElem.style.display='none'
        originalElem.style.display='none'
        viewOriginalLinkElem.style.display = 'block'
        closeOriginalLinkElem.style.display = 'none'
    }
}

function validateTrans() {
    var id = postAction.getValByKey("id");

    var bodyElem = document.getElementById("t9b" + id);
    var rawElem = document.getElementById("t9r" + id);
    var originalElem = document.getElementById("t9o" + id);
    var viewOriginalLinkElem = document.getElementById("t9vo" + id);
    var closeOriginalLinkElem = document.getElementById("t9co" + id);


    hiddenTransPopupMenu();
    bodyElem.style.display = 'block'
    rawElem.style.display = 'block'
    originalElem.style.display = 'none'
//need update translation message according to new in editor

    return true;
}

function postProc4ToggleTrans() {
    var path = this.path;
    var params = this.getParams();
    var id = postAction.getValByKey("id");

    getURL(path,params,function(rdata,fvar){
        var mainElem = document.getElementById("t9m" + id);
        mainElem.innerHTML = rdata;
        validateTrans();
    });
}

function toggleTrans(id, flag) {
    if(!flag) {
        var bodyElem = document.getElementById("t9b" + id);
        var rawElem = document.getElementById("t9r" + id);
        var originalElem = document.getElementById("t9o" + id);
        var viewOriginalLinkElem = document.getElementById("t9vo" + id);
        var closeOriginalLinkElem = document.getElementById("t9co" + id);

        bodyElem.style.display = 'none'
        rawElem.style.display = 'none'
        closeOriginalLinkElem.style.display = 'none'
        viewOriginalLinkElem.style.display = 'block'
        return;
    }

    var path = document.getElementById("transpath").innerHTML + document.getElementById("t9d" + id).value;

    var params = [];
    params.push(["action", "translate"]);
    params.push(["id", id]);
    params.push(["flag", flag]);

    postAction = new Action(postProc4ToggleTrans, path, params);

    getURL(path,postAction.getParams(),function(rdata,fvar){
        if(getRequestObject("jscript",rdata)) {
            showBox();
        }
        else {
            var mainElem = document.getElementById("t9m" + id);
            mainElem.innerHTML = rdata;

            validateTrans();
        }
    });
}
// This function handles the translation post-deletion activity
function postProc4ToggleDelete() {
    var id = postAction.getValByKey("id");

    var index = id.indexOf('S');

    var txtElems = document.getElementsByName("t9t" + id.substring(0, index));
    var bodyElem = document.getElementById("t9b" + id);
    var rawElem = document.getElementById("t9r" + id);
    var txtAreaElem = document.getElementById(id);
    // Set the doc text to the new translated version.
    for(var i = 0; i< txtElems.length; i++) {
        txtElems[i].innerHTML = rdata;
    }
    // Set the textarea value to the new translated version.
    txtAreaElem.value = rdata;
    bodyElem.style.display = 'none';
    rawElem.style.display = 'none'; 
}
// This function handles the deleteion of a translation.
function toggleTransDelete(form, id) {
    var confirmform = document.getElementById("deltransconfirmform");
    // Show or collapse the delete confirmation form.
    if(!form) {
        removeClassName(confirmform, "collapse");
    }
    else if(!id) {
        addClassName(confirmform, "collapse");
    }
    else {
      // Once the author confirms deletion, hide the popup menu.
        hiddenTransPopupMenu();
        var path = document.getElementById("transpath").innerHTML;
        var params = [];
        params.push(["action", "delete"]);
        params.push(["id", id]);

        postAction = new Action(postProc4ToggleDelete, path, params);

        getURL(path,postAction.getParams(),function(rdata,fvar){
            if(getRequestObject("jscript",rdata)) {
                showBox();
            }
            else {
                postAction.perform();
            }
        });
    }
}

var defaultLang='en';

function changepic(id,src) {
    var elem = document.getElementById(id);
    elem.src = src;
}

function langMouseout(event, pName) {
    var tag = document.getElementById(pName);
    //var x = event.clientX + document.body.scrollLeft;
    //var y = event.clientY + document.body.scrollTop;
    var x = event.clientX + document.documentElement.scrollLeft;
    var y = event.clientY + document.documentElement.scrollTop;
    var left = tag.offsetLeft
    var top = tag.offsetTop
    var w = tag.offsetWidth
    var h = tag.offsetHeight
    while(tag = tag.offsetParent) {
        left += tag.offsetLeft;
        top += tag.offsetTop;
    }

    var elem = document.getElementById("langdropdown");
    if(elem.style.display != 'none') {
        h += elem.offsetHeight;
    }

    if(y < top || y > (h + top) || x >left +w || x < left) {
        changepic('langdropdownpic','/im/dropdownnormal.gif');				
        elem.style.display = 'none';		
    }		
}

function langClick() {
    changepic('langdropdownpic','/im/dropdown.gif');
    var elem = document.getElementById("langdropdown");
    elem.style.display = 'block';
}

function langChosen(path, id1, id2, id3, lang) {
    var elem1 = document.getElementById(id1);
    var elem2 = document.getElementById(id2);
    var elem3 = document.getElementById(id3);
    var elem21 = document.getElementById("langdropsigncol1");
    var elem22 = document.getElementById("langdropsigncol2");
    var elem23 = document.getElementById("langdropsigncol3");
    elem21.innerHTML=elem1.innerHTML;
    elem22.innerHTML=elem2.innerHTML;
    elem22.value = elem2.value;
    elem23.innerHTML=elem3.innerHTML;
    var elem = document.getElementById("langdropdown");
    elem.style.display = 'none';
    changepic('langdropdownpic','/im/dropdownnormal.gif');
    defaultLang = lang;

    var params = "lang=" + lang;

    getURL(path,params,function(rdata,fvar){
        // refresh the main column
        if(document.getElementById('classpath') == null) return;
        if(document.getElementById('classname') == null) return;
        path = document.getElementById('classpath').innerHTML+document.getElementById('classname').innerHTML;
        params = 'ajax=true';
        showLoading();
        postRequest('columnMain', path, params);
    });
}

function langSelectValue() {
    var elem = document.getElementById("result");
    elem.innerHTML = defaultLang;
}

//tool tips function
var tooltipforns = document.layers;
var tooltipforff = document.getElementById && !document.all;
var tooltipforie = document.all;

var toolTipSTYLE="";
function initToolTips()
{
  if(tooltipforns||tooltipforff||tooltipforie)
  {
    if(tooltipforns) toolTipSTYLE = document.toolTipLayer;
    else if(tooltipforff) toolTipSTYLE = document.getElementById("toolTipLayer").style;
    else if(tooltipforie) toolTipSTYLE = document.all.toolTipLayer.style;
    if(tooltipforns) document.captureEvents(Event.MOUSEMOVE);
    else
    {
      toolTipSTYLE.visibility = "visible";
      toolTipSTYLE.display = "none";
    }
  document.onmousemove = moveToMouseLoc;
}
}
function toolTip(msg, fg, bg,fc,tw)
{
 if(toolTip.arguments.length < 1) // hide
  {
    if(tooltipforns) 
    {
    toolTipSTYLE.visibility = "hidden";
    }
    else 
    {
      toolTipSTYLE.display = "none";
      //----------------------
    }
  }
  else // show
  {
    if(!fg) fg = "#777777";
    if(!bg) bg = "#FFFFFF";
    if(!fc) fc = "#777777";
    var content =
    '<table border="0" cellspacing="0" cellpadding="1" bgcolor="' + fg + '" class="trans_msg"><td>' +
    '<table border="0" cellspacing="0" cellpadding="3" bgcolor="' + bg + 
    '"><td width=' + tw + '><font face="Arial" color="' + fc +
    '" size="-2">' + msg +
    '&nbsp\;</font></td></table></td></table>';

    if(tooltipforns)
    {
      toolTipSTYLE.document.write(content);
      toolTipSTYLE.document.close();
      toolTipSTYLE.visibility = "visible";
    }
    if(tooltipforff)
    {
      document.getElementById("toolTipLayer").innerHTML = content;
      toolTipSTYLE.display='block'
    }
    if(tooltipforie)
    {
      document.all("toolTipLayer").innerHTML=content;
      toolTipSTYLE.display='block'
    }
  }
}

function moveToMouseLoc(e)
{
  offsetX = 0;
  offsetY = 20;
  if(tooltipforns||tooltipforff)
  {
    x = e.layerX + document.body.scrollLeft;
    y = e.layerY + document.body.scrollTop;
  }
  else
  {
    x = event.x + document.body.scrollLeft;
    y = event.y + document.body.scrollTop;
  }
  toolTipSTYLE.left = x + offsetX+'px';
  toolTipSTYLE.top = y + offsetY+'px';
  return true;
}

function getRSSPath(){
    window.location.href= document.getElementById('loginpopup').contextroot.value + "/rss/all.xml";
}

function setTimeDuration(elem) {
    var calendar = document.getElementById('calendar');
    var timeduration = document.getElementById("timeduration");
    if(elem.checked) {
        calendar.style.display='block'
        timeduration.style.display='block'
    } else {
        calendar.style.display='none'
        timeduration.style.display='none'
    }
}

function getElementsByName_iefix(name, tag) {
     if(!tag){
        tag = '*';
     }
     var elem = document.getElementsByTagName(tag);
     var arr = new Array();
     for(i = 0,iarr = 0; i < elem.length; i++) {
          att = elem[i].getAttribute("name");
          if(att == name) {
               arr[iarr] = elem[i];
               iarr++;
          }
     }
     return arr;
}

var ajax_list = new Array();
var hash_list = new Array();
var lastHash = "";

//Use timer to check hash value
var timeId = setInterval(historyCheck, 200);

function getIframeHash() {
    var iframe = document.getElementById("historyFrame")
    if(iframe == null) return (location.hash)

    return (iframe.contentWindow.document.location.hash);
}

function historyCheck() {
    //User already click forward or back if hash is different
    var myHash = location.hash;
    if (is.ie567) {
	myHash = getIframeHash();
    }
    if (lastHash != myHash) {
        if (is.ie567) {
            location.hash = myHash;
        }
        var flag = false;
        for ( var i = 0; i < hash_list.length; i++) {
            if (myHash.replace(/^#/, '') == hash_list[i].replace(/^#/, '')) {
                getHistory(i);
                flag = true;
		break;
            }
	}

        //We will get it from server if there is no cache
        if(!flag) {
            if(myHash.indexOf("#r") == 0) {
                var path = document.getElementById("classpath").innerHTML + myHash.slice(2, myHash.lastIndexOf("/"));
                getURL(path,'ajax=true',function(rdata,fvar){
                    var target = document.getElementById("columnMain");
                    target.innerHTML = rdata;
                    sniffPostPopup(target);
                });
            } else if(myHash.indexOf("#f/help") == 0) {
                help();
            }
        }

        lastHash = myHash;
    }
}

window.onload = function() {
    //init
   var firsthash = location.hash;
   if (is.ie567) {
        createIFrame();
        document.getElementById("historyFrame").contentWindow.document.location.hash = firsthash;
    }
    lastHash = firsthash;
    if(lastHash != "" && lastHash != "#") {
        if(lastHash.indexOf("#r") == 0) {
            var path = document.getElementById("classpath").innerHTML + lastHash.slice(2, lastHash.lastIndexOf("/"));
            getURL(path,'ajax=true',function(rdata,fvar){
                var target = document.getElementById("columnMain");
                target.innerHTML = rdata;
                sniffPostPopup(target);
                ajax_list.push(rdata);
            });
        } else if(lastHash.indexOf("#f/help") == 0) {
            help();
        }
    } else {
        ajax_list.push(document.getElementById("columnMain").innerHTML);
    }
    hash_list.push(firsthash);
}

function createIFrame() {
    var helperIFrame = document.createElement("iframe");
    helperIFrame.style.display = "none";
    helperIFrame.id = "historyFrame";
    helperIFrame.height="0px";
    helperIFrame.frameborder="no";
    helperIFrame.src=document.getElementById("contextpath").innerHTML + "/ajaxhistory.html" + location.hash;
    document.body.appendChild(helperIFrame);
//    helperIFrame.contentWindow.location.hash = location.hash;
}

function getHistory(id) {
    if (ajax_list[id] != null) {
        var action = hash_list[id].substring(1, hash_list[id].indexOf("/"));
        var viewid = hash_list[id].substr(hash_list[id].lastIndexOf("/") + 1);
        if(viewid == "") viewid = 'columnMain';

        if(action == 'f')  {
            var item = hash_list[id].substr(hash_list[id].indexOf("/")).substring(1, hash_list[id].lastIndexOf("/") - 2);
            document.title = "DocWeb-" + item;
        } else {
            document.title = "DocWeb" + hash_list[id].slice(2, hash_list[id].lastIndexOf("/")).replace(new RegExp("/","gm"),"-");
        }

        var target = document.getElementById(viewid);
	target.innerHTML = ajax_list[id];
        sniffPostPopup(target);
    }
}

function saveHistory(action, item, viewid) {
    //ajax_callback save the data
    var ajax_callback = document.getElementById(viewid).innerHTML;
    if(ajax_callback == null) return;

	// "_list" + hash_list.length 是为了每次的锚点都不相同
    var selectObj = document.getElementById('bundleoptions')
    var changeHash = lastHash;
    if(action == 'r') {
        changeHash = '#' + action + '/' + selectObj.options[selectObj.selectedIndex].value +  '/'+ item + '/' + viewid;
        document.title = "DocWeb-" + selectObj.options[selectObj.selectedIndex].value + "-" + item;
    }
    if(action == 'f') {
        changeHash = "#" + action + '/' + item + "/" + viewid;
        document.title = "DocWeb-" + item;
    }
    //IE won't activate back/forward if the anchor don't exist on page if you click that anchor
    if (is.ie567) {
        var iframe = document.getElementById("historyFrame").contentWindow.document;
	iframe.open();
	iframe.close();
	iframe.location.hash = changeHash;
	location.hash = changeHash;
    } else {
	location.hash = changeHash;
    }

    ajax_list.push(ajax_callback);
    hash_list.push(changeHash);
    if(ajax_list.length > 10) {
        ajax_list.shift();
        hash_list.shift();
    }
    lastHash = changeHash;
}
