/** --------------------------------Global Vars--------------------------------------- **/
var optionshandle = new Object();
var total_monthly = 0;
var total_setup = 0;
var floatingcart = new Object();
var os_selected = '';
var cpu_label = '';
var hdd_label = '';
/** ---------------------------------------------------------------------------------- **/
/** --------------------------------Helper Functions---------------------------------- **/
function toggleOptions(grp, attr, val){
    for(var c in optionshandle[grp]){
	if($(optionshandle[grp][c]).attr('value')!=''){
	    if($(optionshandle[grp][c]).attr(attr)==val){
		$(optionshandle[grp][c]).parent().show();
	    }else{
		$(optionshandle[grp][c]).parent().hide();
	    }
	}
    }
}

function enable(i){
    i.removeAttr("disabled").next().removeClass("disabled").children("span").show();
}

function disable(i){
    i.attr("disabled","disabled").next().addClass("disabled").children("span").hide();
}

function toggleDisabled(grp, attr, val){
    for(var c in optionshandle[grp]){
	if($(optionshandle[grp][c]).attr('value')!=''){
	    if($(optionshandle[grp][c]).attr(attr)==val){
		disable($(optionshandle[grp][c]));
	    }else{
		enable($(optionshandle[grp][c]));
	    }
	}
    }
}
/** ---------------------------------------------------------------------------------- **/
/** ---------------------------------------------------------------------------------- **/
function setCartPrice(){
    $("#live_monthly").html(total_monthly.toFixed(2));
    $("#live_setup").html(total_setup.toFixed(2));
}

function setUpgradeCosts(grp){
    for(var o in optionshandle[grp]){
	var item = $(optionshandle[grp][o]);
	var s  = parseFloat(item.attr('scost'))-optionshandle[grp]['setup'];
	var m  = (parseFloat(item.attr('mcost'))-optionshandle[grp]['monthly']).toFixed(2);
	//XXX:currently only doing monthly, although setup was considered above.
	var txt = "[<strong class=\"";
	txt += (m=='0'?'black':(m>0?'green':'blue'))+"\">";
	if(m == 0){
	    txt += "Included in Price";
	}else{
	    txt += (m>=0?"Add $":"Subtract $").concat(m<0?m*-1:m);
	} 
	txt += "</strong>]";
    item.next('label').children('span').html(txt);
    }
}
/** ---------------------------------------------------------------------------------- **/
/** -------------------- Dependency Stuff -------------------------------------------- **/

function checkMonitoring(i){
    //no dep, just set cart update:
    var label = i.next().text();
    $("#cart-mon").html(label.split("[")[0]);
}
function checkIPCart(i){
    //no dep, just set cart update:
    var label = i.next().text();
    $("#cart-ip").html(label.split('[')[0]);
}
function checkManagement(i){
    //no dep, just set cart update:
    var label = i.next().text();
    $("#cart-man").html(label.split("[")[0]);
}

function checkBandwidth(i){
    //no dep, just set cart update:
    var bw = i.attr('bandwidth');
    var added_bw = bw?parseInt(bw):0;
    $("#cart-bw").html((bw_base+added_bw)+" GB Bandwidth");
}

function checkCPU(){
    if(phy_vir =='V'){
	//no dep, just set cart update:
	var cpu_count = $("input[name^='cpu']:checked():not([value=''])").length;
	if(cpu_label ==''){
	    cpu_label = $("label[for='cpu_0']").text();
	    cpu_label = cpu_label.split("[")[0];
	}
	$("#cart-cpu").html(cpu_count+"X "+cpu_label);
    }
}

function checkRaid(){
    var hdd = $("input[name^='hdd']:checked():not([value=''])");
    var hdd_count = hdd.length;
    var raid_five = 0;
    var raid_ten = 0;
    
    if(hdd_qty > 1){
	if(hdd_label ==''){
	    hdd_label = $("label[for='hdd0']").text();
	    hdd_label = hdd_label.split("[")[0]
	}
	$("#cart-hdd").html(hdd_count+"X "+hdd_label);
    }else{
	hdd_label = hdd.next().text();
	hdd_label = hdd_label.split("[")[0];
	$("#cart-hdd").html(hdd_label);
    }

    //figure out what raid's we need:
    if(hdd_count < 3){
	$("input[name='raid']:enabled:first").attr('checked', 'checked').trigger('click');
    }else{
	raid_five = 1;
	if(hdd_count >=4 &&(hdd_count%2)==0){
	    raid_ten = 1;
	}else{
	    $("input[name='raid']:enabled:first").attr('checked', 'checked').trigger('click');
	}
    }

    //loop through the raid options and enable/disable the right ones:
    for(var c in optionshandle['raid']){
	var item = $(optionshandle['raid'][c]);
	var raid_level = parseInt(item.attr('raid_level'));
	if((raid_level == 1) || (raid_level == 5 && raid_five) || (raid_level == 10 && raid_ten)){
	    enable(item);
	}else{
	    disable(item);
	}

    }


}

function checkIP(i){
    var ipcount = parseInt(i.attr('ipcount'));
    
    if(ipcount < 8){
	disable($("input[type='radio'][name='ip'][ipcount='4']"));
	$("input[type='radio'][name='ip'][ipcount='8']").attr("checked", "checked").trigger('click');
	return true;
    }else{
	return false;
    }
}

function checkFirewall(i){
    var val = parseInt(i.attr('value'));
    if(!isNaN(val)){
	var ip_selected = $("input[type='radio'][name='ip']:checked");
	if(checkIP(ip_selected)){
	    $("#ip-warn").show();
	    $("#firewall-warn").show();
	}
    }else{
	$("#ip-warn").hide();
	$("#firewall-warn").hide();
	enable($("input[type='radio'][name='ip'][ipcount='4']"));
    }

    // vpn only available with dedicated Cisco firewalls
    if (jQuery.inArray(val, [6, 19, 105, 170]) > -1) {
        enable($('input[type="radio"][name="vpn"]'));
    } else {
        // select None
        $('#vpn').click();
        disable($('input[type="radio"][name="vpn"]'));
    }
}

function checkMemOS(i){
    var memsize = parseInt(i.attr('sizegb'));
    $("#cart-mem").html(memsize+" GB RAM");

    //XXX:this needs to be changed so its not hardcoded to 4
    if(memsize > 2){
	$("#os-warn").show();
	for(var c in optionshandle['os']){
	    if(parseInt($(optionshandle['os'][c]).attr('maxmem')) < memsize){
		disable($(optionshandle['os'][c]));
	    }else{
		enable($(optionshandle['os'][c]));
	    }
	}
    }else{
	$("#os-warn").hide();
	//Make sure everything is not disabled?
	for(var c in optionshandle['os']){
	    enable($(optionshandle['os'][c]));

	}
    }

}

function checkOSMem(i){
    var maxmem = parseInt(i.attr('maxmem'));
    
    //XXX:this may need to be changed so its not hardcoded to 4
    if(maxmem <= 4 && phy_vir=='P'){
	$("#mem-warn").show();
    }else{
	$("#mem-warn").hide();
    }
}

function checkControlPanel(i) {
    var val = parseInt(i.attr('value'));

    var billing_software_selected =
	parseInt($('input[name="billing_software"]:radio:checked').val());
    // if they have select None and Plesk bundle has not been selected in
    // billing, disable Plesk pack
    if (isNaN(val) && billing_software_selected != 129) {
	$('#plesk_pack_none').click();
        disable($('input[name="plesk_pack"]:radio'));
    } else {
        enable($('input[name="plesk_pack"]:radio'));
    }

    // if they have selected Plesk bundle, disable billing software group
    // because it is already included
    if (val == 130) {
        // select None
	$('#billing_software_none').click();
        disable($('input[name="billing_software"]:radio'));
        $('#billing_included_billing').show();
    } else {
        enable($('input[name="billing_software"]:radio'));
        $('#billing_included_billing').hide();
    }
}

function checkBillingSoftware(i) {
    var val = parseInt(i.attr('value'));

    // if they have selecte Plesk bundle, disable control panel group because
    // it is already included
    if (val == 129) {
        // select None
	$('#cp').click();
        disable($('input[name="control_panel"]:radio'));
        $('#billing_included_control_panel').show();
    } else {
        enable($('input[name="control_panel"]:radio'));
	$('#billing_included_control_panel').hide();

	// if they have not selected Plesk bundle and no control panel is
        // selected, disable Plesk pack
	var control_panel_selected =
	    $('input[name="control_panel"]:radio:checked').val();
	if (control_panel_selected == '') {
            $('#plesk_pack_none').click();
            disable($('input[name="plesk_pack"]:radio'));
	}
    }
}

function checkDB(i){
    var support_db = parseInt(i.attr('support_db'));
    if(support_db == 0){
	$('#db-warn').show();
	toggleDisabled('db', os_selected, '1');
	$('#db').attr('checked', 'checked').trigger('click');
    }else{
	$('#db-warn').hide();
	toggleDisabled('db', os_selected, '0');
	
    }
}

function checkDepend(i){
    var grp_name = i.attr('name');
    if(grp_name == 'memory'){
	checkMemOS(i);
    }else if(grp_name =='os'){
	//Check DB group:
	checkDB(i);
	//Check Mem:
	checkOSMem(i);
    } else if (grp_name== 'control_panel') {
        checkControlPanel(i);
    } else if (grp_name== 'billing_software') {
        checkBillingSoftware(i);
    }else if(grp_name =='firewall'){
	checkFirewall(i);
    }else if(grp_name =='bandwidth'){
	checkBandwidth(i);
    }else if(grp_name =='monitoring'){
	checkMonitoring(i);
    }else if(grp_name =='ip'){
	checkIPCart(i);
    }else if(grp_name =='management'){
	checkManagement(i);
    }else{
	var n = grp_name.substring(0,3);
	if(n == 'hdd'){
	    checkRaid();
	}else if(n == 'cpu'){
	    checkCPU();
	}
	    
    }

}

/** ----------------------------- **/
$().ready(function() {
	//-------------------------------- initial setup: -------------------------------------------       
        total_monthly = parseFloat($("input[name='c_monthly']").attr('value'));
        total_setup = parseFloat($("input[name='c_setup']").attr('value'));
        $('#terminal_server').hide();

        //Build optionshandle:
	$("input[type='radio'][name!='os_choice']").each(function(){
		var name = $(this).attr('name');
		var id = $(this).attr('id');

		if(!optionshandle.hasOwnProperty(name)){
		    optionshandle[name] = new Array();
		    optionshandle[name]['monthly'] = 0;
		    optionshandle[name]['setup'] = 0;
		}
		optionshandle[name][id] = this;
		if($(this).attr('checked')){
		    optionshandle[name]['monthly'] = parseFloat($(this).attr('mcost'));
		    optionshandle[name]['setup'] = parseFloat($(this).attr('scost'));
		    total_monthly += optionshandle[name]['monthly'];
		    total_setup += optionshandle[name]['setup'];
		}
	    });

	// ------------------------------- Event Listeners ------------------------------------------
	//Add onClick for components....
	$("input[type='radio'][name!='os_choice']").click(function(){
		var item = $(this);
		var group = item.attr('name');
		//back old prices out of totals
		total_setup -= optionshandle[group]['setup'];
		total_monthly -= optionshandle[group]['monthly'];
		//get new prices
		optionshandle[group]['setup'] = parseFloat(item.attr('scost'));
		optionshandle[group]['monthly'] = parseFloat(item.attr('mcost'));
		//add new prices back into totals
		total_setup += optionshandle[group]['setup'];
		total_monthly += optionshandle[group]['monthly'];

		setUpgradeCosts(group);
		setCartPrice();
		checkDepend(item);
        });

	//Shows the correct os according to what os_choice was selected
	$("input[type='radio'][name='os_choice']").click(function(){
		if(this.value=='Linux'){
		    os_selected = 'linux';
		    toggleOptions('os', 'linux', '1');
		    toggleOptions('db', 'linux', '1');
		    $("#database-toggle").hide();
		    $("#checkSumLogo").attr("src","/dedicated-static/images/bg-checkout-summary-lin.jpg");
		}else{
		    os_selected = 'windows';
		    toggleOptions('os', 'windows', '1');
		    toggleOptions('db', 'windows', '1');
		    $("#database-toggle").show();
		    $("#checkSumLogo").attr("src","/dedicated-static/images/bg-checkout-summary-win.jpg");
		}

        });

	// ----- Terminal Server Users Setup -----
	$("input[name='os']").click(function() {
		if($(this).attr('windows')=='1') {
			if($(this).attr('edition')!='web') {
				$('#terminal_server').show();
			}
			else {
				if(parseInt(this.version)<2003 || parseInt(this.version)>2008) {
					$('#terminal_server').show();
				}
				else {
					$('#terminal_server').hide();
				}
			}
		}
		else {
			$('#terminal_server').hide();
		}
	});
	$('#ts_users').change(function () {
		if($(this).val() > 30) {
			$(this).val('30');
		}
		else if($(this).val() < 0) {
			$(this).val('0');
		}
	});

	// ----- Scrolling Cart Widget ------
	//Does the scrolling of the total
	var orig = parseInt($('div.checkout-summary').position().top);
	var maxPos = parseInt($('#option-backup').position().top)-80;
	$(window).scroll(function(){
		var c = parseInt($(this).scrollTop());
		if(c < (maxPos) && c > orig){
		    $('div.checkout-summary').css('top',(c-orig)+'px');
		}else if(c < orig){
		    $('div.checkout-summary').css('top','0px');
		}
	    });
	//Does the hover text.
	$('img.info-icon').hover(function(){
		$(this).parent().next('div.info-box:first').show();
	    },
	    function(){
		$(this).parent().next('div.info-box:first').hide();
	    }
	);

	//------------------------ initial pricing ------------------------------------ 
	//Setup sliding cart price:
	setCartPrice();

	//Set initial item prices:
	for(var g in optionshandle){
	    setUpgradeCosts(g);
	}
	//------------------------ initial dep check ------------------------------------ 
	//Do initial DEP check:

	//if os_choice was passed in....show the right stuff...
	os_comp = $("input[type='radio'][name='os']:checked");
	if(os_comp.length > 0){
	    if(os_comp.attr('linux') == '1'){
		$("#Linux").attr('checked','checked').trigger('click');
	    }else{
		$("#Windows").attr('checked','checked').trigger('click');
	    }

	}else{
	    delete os_comp;
	}

	$("input[type='radio'][name!='os_choice']:not([name^='hdd']):not([name^='cpu']):checked").each(function(){
		checkDepend($(this));
	});
	//Call raid and cpu only once....
	checkRaid();
	checkCPU();

    });
