/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 *
 * Copyright 1997-2010 Oracle and/or its affiliates. All rights reserved.
 *
 * Oracle and Java are registered trademarks of Oracle and/or its affiliates.
 * Other names may be trademarks of their respective owners.
 *
 * The contents of this file are subject to the terms of either the GNU General
 * Public License Version 2 only ("GPL") or the Common Development and Distribution
 * License("CDDL") (collectively, the "License"). You may not use this file except in
 * compliance with the License. You can obtain a copy of the License at
 * https://netbeans.org/cddl-gplv2.html or nbbuild/licenses/CDDL-GPL-2-CP. See the
 * License for the specific language governing permissions and limitations under the
 * License.  When distributing the software, include this License Header Notice in
 * each file and include the License file at nbbuild/licenses/CDDL-GPL-2-CP.  Oracle
 * designates this particular file as subject to the "Classpath" exception as
 * provided by Oracle in the GPL Version 2 section of the License file that
 * accompanied this code. If applicable, add the following below the License Header,
 * with the fields enclosed by brackets [] replaced by your own identifying
 * information: "Portions Copyrighted [year] [name of copyright owner]"
 * 
 * Contributor(s):
 * 
 * The Original Software is NetBeans. The Initial Developer of the Original Software
 * is Sun Microsystems, Inc. Portions Copyright 1997-2007 Sun Microsystems, Inc. All
 * Rights Reserved.
 * 
 * If you wish your version of this file to be governed by only the CDDL or only the
 * GPL Version 2, indicate your decision by adding "[Contributor] elects to include
 * this software in this distribution under the [CDDL or GPL Version 2] license." If
 * you do not indicate a single choice of license, a recipient has the option to
 * distribute your version of this file under either the CDDL, the GPL Version 2 or
 * to extend the choice of license to its licensees as provided above. However, if
 * you add GPL Version 2 code and therefore, elected the GPL Version 2 license, then
 * the option applies only if the new code is made subject to such option by the
 * copyright holder.
 */

/* Languages and their ids which NetBeans is available*/
var LANGUAGES   = new Array();
var BUILD_INFO  = new Array();

var PLATFORM_IDS         = new Array();
var PLATFORM_LONG_NAMES  = new Array();
var PLATFORM_SHORT_NAMES = new Array();

var BUNDLE_IDS   = new Array();
var BUNDLE_LONG_NAMES = new Array();
var BUNDLE_SHORT_NAMES = new Array();

var FILES = new Array();

PLATFORM_IDS   	     [0] = "windows";
PLATFORM_IDS   	     [1] = "linux";
PLATFORM_IDS         [2] = "solaris-x86";
PLATFORM_IDS         [3] = "solaris-sparc";
PLATFORM_IDS         [4] = "macosx";
PLATFORM_IDS         [5] = "zip";
/*
// Commented since NBI installers are not used for now
PLATFORM_IDS         [4] = "macosx-x86";
PLATFORM_IDS         [5] = "macosx-ppc";
*/

BUNDLE_IDS [0] = "javase";
//BUNDLE_IDS [1] = "javafx";
BUNDLE_IDS [1] = "javaee";
//BUNDLE_IDS [2] = "ruby";
BUNDLE_IDS [2] = "cpp";
BUNDLE_IDS [3] = "php";
BUNDLE_IDS [4] = "all";

var DEFAULT_LANGUAGE = "DEFAULT";
var PAGELANG_SEP = "pagelang=";

var OMNITURE_CODE_JS = "https://netbeans.org/images_www/js/s_code_remote.js";
var GOOGLE_ANALYTICS_JS = "http://www.google-analytics.com/ga.js";

function getNameById(id,ids,names) {
    for(var i = 0 ; i < ids.length; i++) {
	if(ids[i] == id) {
		return names[i];
	}
    }
    return "";
}

function getPlatformShortName(id) {
    return getNameById(id, PLATFORM_IDS, PLATFORM_SHORT_NAMES);
}
function getPlatformLongName(id) {
    return getNameById(id, PLATFORM_IDS, PLATFORM_LONG_NAMES);
}

function getLanguageName(id) {
    var ids = new Array();
    var names = new Array();
    for(var i=0;i<LANGUAGES.length;i++) {
        ids.push(LANGUAGES[i].id);
        names.push(LANGUAGES[i].name);
    }
    return getNameById(id, ids, names);
}

function getBundleShortName(id) {
    return getNameById(id, BUNDLE_IDS, BUNDLE_SHORT_NAMES);
}
function getBundleLongName(id) {
    return getNameById(id, BUNDLE_IDS, BUNDLE_LONG_NAMES);
}

function get_overridden_language() {
    var url = "" + window.location;
    var idx = url.indexOf(PAGELANG_SEP);
    var langcode = DEFAULT_LANGUAGE;
    if(idx != -1) {
	langcode = url.substring(idx + PAGELANG_SEP.length, url.length);
    }
    return langcode;
    
}


function get_language_id() {
    return get_language(0);
}

function get_language_suffix() {
    return get_language(1);
}

function get_language_location() {
    var lang_suffix = get_language_suffix();
    for(var i = 0; i < LANGUAGES.length; i++) {
       if(lang_suffix == LANGUAGES[i].suffix) {
           return LANGUAGES[i].location;
       }
    }
}

function is_suitable_location(lang_id, location) {
    for(var i = 0; i < LANGUAGES.length; i++) {
       if(lang_id == LANGUAGES[i].id) {
           return LANGUAGES[i].location == location;
       }
    }
    return false;
}

function get_language(option) {
    var variants = LANGUAGES;
    var resultLanguage = "";
    if(variants) {
        var lang = (option == 0 ) ? variants[0].id : variants[0].suffix;
        var override = get_overridden_language();

        if (override != DEFAULT_LANGUAGE) lang = override;
        else if(navigator.userLanguage)  lang = navigator.userLanguage;
        else if(navigator.language) lang = navigator.language;
        lang = lang.replace("-", "_");        
        for(var i=0; i < variants.length; i++ ) {
            var value = (option == 0 ) ? variants[i].id : variants[i].suffix;
            if(value && lang.toLowerCase().indexOf(value.toLowerCase())!=-1) {
                if(value.length > resultLanguage.length) {
                    resultLanguage = value;
                }
            }
        }    
    }

    //no language (for id) selected - fallback to en if it is available
    if (resultLanguage == "" && option == 0) {
        for(var i=0; i < variants.length; i++ ) {
            if(variants[i].id == "en") {
                return "en";
            }
        }
    }

    return resultLanguage;
}


function load_js(script_filename) {
    document.write('<script language="javascript" type="text/javascript" src="' + script_filename + '"></script>');
} 

function load_page_js_locale(name,ext) {
    load_js_locale(name, ext);
}

function useAnotherLocation() {
    var loc = get_language_location();
    return loc != getPageArtifactsLocation(false);
}

function isMainLanguage(language) {
    for(var i=0; i < LANGUAGES.length; i++ ) {
        if(LANGUAGES[i].id == language) {
            return LANGUAGES[i].location == getPageArtifactsLocation(false);
        }
    }
    return false;
}

function load_js_locale(script_filename, extension) {  
    var suffix = "";
    var locale_suffix = "";
    locale_suffix = get_language_suffix();
    if(locale_suffix!="") {
	suffix = "_" + locale_suffix;
    }
    var a = useAnotherLocation();
    load_page_js(script_filename + suffix + extension,  a);
}

function load_page_img(img,add) {
    if(add) {
        document.write('<img src="' + getImagesLocation() + img + '" ' + add + '/>');
    } else {
        document.write('<img src="' + getImagesLocation() + img + '"/>');
    }
}
function load_page_css(css) {
    document.write('<link rel="stylesheet" type="text/css" href="' + getCSSLocation() + css + '" media="screen"/>');
}

function other_webpage_langs_available() {
    for(var i=0 ; i < LANGUAGES.length; i++) {
        if ( LANGUAGES[i].suffix && LANGUAGES[i].suffix.length > 0) {
            return true;
        }
    }    
    return false;
}

function page_languages_sort_function(a, b){
    if (a.webpagename && b.webpagename) { 
       return a.webpagename > b.webpagename ? 1 : (a.webpagename ==  b.webpagename ? 0 : -1);
    } else {
       return a.suffix > b.suffix ? 1 : (a.suffix ==  b.suffix ? 0 : -1);
    }
}

function write_page_languages() {    
    var locale_suffix = get_language_suffix();

    if(other_webpage_langs_available()) {
        document.getElementById("pagelanguagesbox").style.visibility = 'visible';
    }
    var url = "" + window.location;
    var qIndex = url.indexOf("?")!=-1 ? url.indexOf("?") : url.length;
    var aIndex = url.indexOf("&")!=-1 ? url.indexOf("&") : url.length;
    var page = url.substring(0, Math.min(qIndex, aIndex));
    var get_request = url.substring(url.indexOf(page) + page.length, url.length);
    if(get_request.indexOf(PAGELANG_SEP)==-1) { 
        if(get_request.indexOf("?")==-1) {
            get_request += "?";
        } else if(get_request.indexOf("&")) {
            get_request += "&";
        } 
        get_request += PAGELANG_SEP;
    } else {
        var regexp =  new RegExp(PAGELANG_SEP + "[a-zA-Z]+(_[a-zA-Z]+){0,2}","g");
	get_request = get_request.replace(regexp, PAGELANG_SEP);
    }
    var languages_sorted = LANGUAGES.slice().sort(page_languages_sort_function);

    for(var i=0;i<languages_sorted.length;i++) {
	if(languages_sorted[i].webpagename && locale_suffix!=languages_sorted[i].suffix) {
            document.write('<li><a href="' + page + get_request.replace(PAGELANG_SEP, PAGELANG_SEP + languages_sorted[i].suffix) + '">' + languages_sorted[i].webpagename + '</a></li>');
        }
    }
}

function startList() {
    // source: https://netbeans.org/branding/scripts/lang-pulldown.js
    if (document.all&&document.getElementById) {
        navRoot = document.getElementById("nav");
        if (navRoot!=null) { //if the language panel is active
            for (i=0; i<navRoot.childNodes.length; i++) {
                node = navRoot.childNodes[i];
                if (node.nodeName=="LI") {
                    node.onmouseover=function() {
                        this.className+=" over";
                    }
                    node.onmouseout=function() {
                        this.className=this.className.replace(" over", "");
                    }
                }	
	    }
	}
    }
}

function get_file_list(dir,lang_id) {	
	lst = new Array();
	if(FILES.length > 0) {
            for (var i = 0; i < FILES.length; i++) {		
		if(FILES[i].name.indexOf(dir)==0 && languageCompatible(FILES[i].locales, lang_id) && is_suitable_location(lang_id, FILES[i].location)) {
			var stripped = FILES[i].name.substring(dir.length, FILES[i].name.length);
			if(stripped.indexOf('/')==-1) {
			    lst[lst.length] = stripped;
			}
		}
            }
	}
	return lst;
}

function languageCompatible(language_list, lang_id) {
    for(var i = 0; i < language_list.length; i++) {
       if(language_list[i]==lang_id) return true;
    }
    return false;
}

function get_file_info(filename,lang_id) {
        var file = null;
	if(FILES.length > 0) {
            for (var i = 0; i < FILES.length; i++) {		
		if(FILES[i].name == filename && languageCompatible(FILES[i].locales, lang_id)) {		
			file = FILES[i];
			break;
		}
            }
	}
	return file;
}

function getSize(filename, lang_id) {
        var file = get_file_info(filename, lang_id);
	return file!=null ? file.size : "";
}

function getMD5(filename, lang_id) {
        var file = get_file_info(filename, lang_id);
	return file!=null ? file.md5 : "";
}


function get_file_name(platform, option, language) {
    var fn = "";
    if(platform=="zip") {
        fn += "zip/";
    } else {
        fn += "bundles/";
    }
    return fn + get_file_name_short(platform, option, language);
}

function is_file_available(platform, option, language) {
    return get_file_info(get_file_name(platform, option, language), language) != null;
}

function get_build_location(lang_id) {
    var mainLanguage = isMainLanguage(lang_id);
    var location = get_build_info(mainLanguage).BUILD_LOCATION;
    if(!mainLanguage && location == "") {
       location = get_build_info(true).ADDITIONAL_BUILD_LOCATION;
    }
    return location;
}

function get_zip_files_prefix(lang_id) {
    return get_build_info(isMainLanguage(lang_id)).ZIP_FILES_PREFIX;
}

function get_bundles_files_prefix(lang_id) {
    return get_build_info(isMainLanguage(lang_id)).BUNDLE_FILES_PREFIX;
}

function get_file_name_short(platform, option, language) {
    var file_name = "";
    if(platform=="zip") {
        if(option == "javadoc" || option == "platform-src" || option == "src") {
            file_name += get_zip_files_prefix(language).replace("-ml","");
        } else {
            file_name += get_zip_files_prefix(language);
        }
    } else {
        file_name += get_bundles_files_prefix(language);
    }
    if (option != "all") {
    	file_name += "-" + option;
    }

    if ( platform != "zip" ) {
   	file_name += "-" + platform;
    }
    if (platform == "windows") {
        file_name += ".exe";
    } else if ((platform == "macosx-x86") || (platform == "macosx-ppc")) {
        file_name += ".tgz";
    } else if (platform == "macosx") {
	file_name += ".dmg";
    } else if(platform == "zip"){
	file_name += ".zip"        
    } else {
        file_name += ".sh";
    }
    return file_name;
}

function get_file_url(filename, lang_id) {
    var url  = get_build_location(lang_id);
    url += filename;    
    return url;
}


function get_file_bouncer_url(platform, option, language) {
    var url = get_build_info(isMainLanguage(language)).BOUNCER_URL;
    url += "?" + "product=" + get_build_info(isMainLanguage(language)).BOUNCER_PRODUCT_PREFIX;
    if(option != "all") {
        url += "-" + option;
    }
    url += "&" + "os=" + platform;
    return url;
}

function message(msg) {
    document.write(msg);
}
function writeUrl(url,msg) {
    document.write('<a href="' + url + '">' + msg + '</a>');
}
function set_page_title(title) {
    document.title = title;
    var titleElement = document.getElementsByTagName("title");
    if(titleElement.length == 1) {
        titleElement[0].text = title;       
    } else {
        document.write('<title>' + title + '</title>');
    }
}

function set_page_description(desc) {
    document.write('<meta name="description" content="' + desc + '"/>');
}

function add_file(name, size, md5, locales) {
    var index = FILES.length;
    FILES[index] = new Object;
    FILES[index].name = name;
    FILES[index].size = size;
    FILES[index].md5  = md5;
    FILES[index].locales = locales.split(",");
    FILES[index].location = currentLocation;
}

function load_files_information(additional) {
    if(!additional) {
        load_page_js("files.js", false);
    } else if(get_build_info(true).SHOW_ADDITIONAL_LANGUAGES == 1) {
        load_page_js("files.js", true);
    }
}

function add_language(id, name, suffix, webpagename) {    
    var index = LANGUAGES.length;
    for(var i=0;i<index;i++) {
       if(LANGUAGES[i].id == id) {
           if(id == "en" && isCommunityBuild()) {
               var newLanguages = new Array();
               for(var j=0;j<index;j++) {
                   if(j!=i) {
                       newLanguages[newLanguages.length] = LANGUAGES[j];
                   }
               }
               LANGUAGES = newLanguages;
               index--;
           } else {
               return;
           }
       }
    }
    LANGUAGES[index] = new Object;
    LANGUAGES[index].name        = name;
    LANGUAGES[index].id          = id;
    if(suffix || webpagename) {
       LANGUAGES[index].suffix      = suffix;
       LANGUAGES[index].webpagename = webpagename;
    }
    LANGUAGES[index].location = currentLocation;
}


function load_languages(additional) {
     if(!additional) {
          load_page_js("languages.js", false);
     } else if(get_build_info(true).SHOW_ADDITIONAL_LANGUAGES == 1) {
         load_page_js("languages.js", true);
     }
}
function add_build_info(build_info) {
     var index = BUILD_INFO.length;
     BUILD_INFO[index]=build_info;
}
function get_build_info(mainLanguage) {
     var index = (!mainLanguage && BUILD_INFO.length == 2) ? 1 : 0;
     return BUILD_INFO[index];
}
function isCommunityBuild() {
     return get_build_info(true).COMMUNITY_BUILD == 1;
}

function load_build_info(additional) {
     if(!additional) {
          load_page_js("build_info.js", false);
     } else if(get_build_info(true).SHOW_ADDITIONAL_LANGUAGES == 1) {
         load_page_js("build_info.js", true);
     }
}
