/*
 * 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('/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:              #FF8E00;
    font-family:        Arial, sans-serif;
    font-weight:        bold;
    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:              #FF8E00;
    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 6px 2px 6px;
}

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 .title {
    font-size:			1.3em;
	white-space:		nowrap;
}

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

.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;
}
