/*
 * 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
 * http://www.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('http://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;
}
