/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 1997-2007 Oracle and/or its affiliates. All rights reserved.
 * 
 * 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.  Sun
 * designates this particular file as subject to the "Classpath" exception as
 * provided by Sun 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.
 */

/* Top header *****************************************************************/
table.top_header {
    margin:             0px auto 0px auto;
    width:                    100%;
    height:                   57px;
    border-collapse:      collapse;
    background-image:      url('https://netbeans.org/images_www/v6/products-top-bg.gif');
    background-repeat:   no-repeat;
    background-position:     right;
}

table.top_header td {
	padding:     25px 23px 0px 23px;        
	color:			#D5D5D5;
}

table.top_header td.title {
	width:				100%;
	font-size:			1.8em;
	color:				#0e1b55;	
}

table.top_header td.menu {
	white-space:		nowrap;
	font-size:		1.2em;
}

table.subscription_selects {	
    margin:             10px auto 0px auto;
    padding-bottom:      7px;
    width:              95%;
    empty-cells:        show;
    align: left;
}

table.subscription {	
	padding: 0px 0px 0px 0px;
	width: 430px;
}

table.l_p_select_note {
	margin: 0px 0px 0px 0px;
}

/* Language/platform selection ************************************************/
table.l_p_select {
	margin:				0px 0px 0px 0px;
	padding-top: 0px;
	width:				100%;
	border-collapse:	collapse;	
}

table.l_p_select td {
	padding:			0px 0px 0px 0px;
}

table.l_p_select td.spacer {
	width:		100%;
}

table.l_p_select td.label {
	padding-left:		15px;
	padding-right:		5px;
}


/* Missing components warning ************************************************/
table.missing_components {
	width:				100%;
	border-collapse: 	 collapse;
}

table.missing_components td.label {
	text-align:         	    right;
	color:          	  #808080;
	padding-top: 5px;
}

/* Components table ***********************************************************/
table.components_table {
    margin:             0px auto 0px auto;
    width:              95%;
    border-collapse:    collapse;
    empty-cells:        show;
}

table.components_table th {
    padding:            2px 5px 2px 5px;
    text-align:         center;
    color:              #333333;
    font-family:        Arial, sans-serif;
    font-weight:        normal;
    font-size:          1.1em;
    cursor:             default;
}

table.components_table th.over {
    background:        #eeeeee;
}


table.components_table .star {
    padding:            0px 0px 0px 5px;
    text-align:         center;
    color:              #333333;
    font-family:        Arial, sans-serif;
    font-weight:        bold;
    font-size:          1.2em;
    cursor:             default;
}


table.components_table td {
    border-top:         1px solid #D5D5D5;
    border-bottom:      1px solid #D5D5D5;
    padding:            2px 5px 2px 5px;
    text-align:         center;
    font-family:        Verdana, Arial, sans-serif;
    font-size:          1em;
    cursor:             default;
}

table.components_table td.over {
    background:        #eeeeee;
}


table.components_table .header {
    border-width:       0px;
    padding:            0px 0px 5px 0px;
    font-weight:       bold;
    color:          #FF8E00;
    font-size:        1.1em;
}


table.components_table .left {
    text-align:         left;
}

table.components_table .no_border {
    border-width:       0px;
}

table.components_table .download_button {
    padding:            5px 3px 2px 3px;
}

table.components_table .no_padding {
    padding:            0px 0px 0px 0px;
}

table.components_table .left_border {
    border-left:        1px solid #D5D5D5;
}

table.components_table .right_border {
    border-right:       1px solid #D5D5D5;
}

table.components_table .bottom_border {
    border-bottom:      1px solid #D5D5D5;
}

table.components_table .wide {
    width:              100%;
}

table.components_table .bottom {
    vertical-align:     bottom;
}

table.components_table .beige {
    background-color:   #FFF4E5;
}

table.components_table .comment {
    
}

table.components_table .bold_comment {
    color:              #ff5e08;
    font-family:        Arial, sans-serif;
    font-weight:        bold;
}

table.components_table .warning {
    color:              #cc9900;
}

table.components_table .product_note {
    color:              #D5D5D5;
    font-size:          0.85em;
}

table.components_table .product_display_name {
    padding:		0px 0px 0px 8px;
    color:              #333333;
}

table.components_table .product_display_name_no {
    padding:   0px 0px 0px 8px;
    color:              #808080;    
}


table.components_table .bundle_display_name {
    color:              #333333;
}

table.components_table .bundle_display_name_no {
    color:              #808080;
}

table.components_table .community_note_number {
    color:              #FF0000;
    position:           relative;
    bottom: 		4px;
}


table.components_table .title {
    font-size:			1.3em;
	white-space:		nowrap;
}

div.files_list {
	margin-left:	8px;
}


.community_separator {
        color:          #888888;
}

.pop_up {
    color:		#333333;
    width:              250px;
    min-height:         10px;    
    margin-top:         1.2em;
    margin-left:        30px;
    padding:            5px 5px 5px 5px;
    border:             1px solid #6B6B6B;
    position:           absolute; 
    z-index:            100;
    visibility:         hidden;
    background-color:   #E6F6FE;
}

.noscript_warning {
    font-size:          1.2em;
    color:              #ff0000;
    font-weight:        bold;
    margin:             20px 40px 20px 40px;
}

.special_message_number {
	margin: 0px 0px 0px 0px;
        color:            #FF5E08; 
}
.special_message_text {
}

.bold {font-weight:bold;}

.legal_box {
     padding: 4px 5px 10px 10px;
     margin-right: 25px;
     background-color:#E6F6FE;
}

.download_tab_active {
     color: #999999;
}
