/*
 * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS HEADER.
 * 
 * Copyright 1997-2007 Sun Microsystems, Inc. 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;
}
