var devicesToCSOs = new Array();
var totalDueMonthly = 0;
var totalDueMonthlyNode = null;
var termsAndCondCheckbox = null;

var productFormName = 'ProductDetailsForm';
var dataAllowanceActionName = 'data-allowances.do';

function DeviceCSOs(deviceInfo){
    this.deviceKey = deviceInfo.key;
    this.deviceDisplayName = deviceInfo.displayName;
    this.mandatoryCSOs = new Array();
    this.optionalCSOs = new Array();
    this.insuranceNode = null;
    this.insuranceComboBoxNode = null;
    this.insuranceMrcNode = null;
    this.insuranceId = null;
    this.insuranceMrc = 0;
}

function CsoGroup(id){
    this.id = id;
    this.csoList = new Array();
    this.selectedCsoId = -1;
}

function Cso(node, id, mrc){
    this.node = node;
    this.id = id;
    this.mrc = mrc;
}

(function onLoad() {
    if (devices == null){
        return;
    }
    totalDueMonthlyNode = document.getElementById("totalDueMonthly");
    var spans = document.getElementsByTagName('span');
    var csoIds;
    var END = ')';
    for (var deviceIndex = 0; deviceIndex < devices.length; deviceIndex++){
        var device = devices[deviceIndex];
        var deviceToCso = new DeviceCSOs(device);
        devicesToCSOs[device.key] = deviceToCso;

        var groupPrefix = 'device(' + device.key + ')-OptionalGroup(';
        var insurancePrefix = 'device(' + device.key + ')-insurance(';
        var mCSOPrefix = 'device(' + device.key + ')-mandatoryCSO(';
        for (var j = 0; j < spans.length; j++){
            var spanNode = spans[j];
            if (spanNode.id == undefined || spanNode.id == null || spanNode.id.length == 0){
                continue;
            }
            if (spanNode.id.indexOf(groupPrefix) != -1){
                var groupEndBracketIndex = spanNode.id.indexOf(END, groupPrefix.length);
                if (groupEndBracketIndex != -1){
                    var groupId = spanNode.id.substring(groupPrefix.length, groupEndBracketIndex);
                    var csoGroup = deviceToCso.optionalCSOs[groupId];
                    if (null == csoGroup){
                        csoGroup = new CsoGroup(groupId);
                        deviceToCso.optionalCSOs[groupId] = csoGroup;
                    }
                    var csoPrefix = 'device(' + device.key + ')-OptionalGroup(' + csoGroup.id + ')-optionalCSO(';
                    if (spanNode.id.indexOf(csoPrefix) != -1){
                        var csoEndBracketIndex = spanNode.id.indexOf(END, csoPrefix.length);
                        if (csoEndBracketIndex != -1){
                            var csoId = spanNode.id.substring(csoPrefix.length, csoEndBracketIndex);
                            var mrcPrefix = 'device(' + device.key + ')-OptionalGroup(' + csoGroup.id + ')-optionalCSO(' + csoId +')-mrc=';
                            if (spanNode.id.indexOf(mrcPrefix) != -1) {
                                var mrc = spanNode.id.substring(mrcPrefix.length);
                                csoGroup.csoList[csoId] = new Cso(spanNode, csoId, mrc);
                            }
                        }
                    }
                }
            }

            if (spanNode.id.indexOf(insurancePrefix) != -1){
                var insuranceEndBracketIndex = spanNode.id.indexOf(END, insurancePrefix.length);
                if (insuranceEndBracketIndex != -1){
                    var insuranceId = spanNode.id.substring(insurancePrefix.length, insuranceEndBracketIndex);
                    var insuranceMRCPrefix = 'device(' + device.key + ')-insurance('+ insuranceId + ')-mrc=';
                    if (spanNode.id.indexOf(insuranceMRCPrefix) != -1){
                        var insuranceMRC = spanNode.id.substring(insuranceMRCPrefix.length);
                        deviceToCso.insuranceMrcNode = spanNode;
                        deviceToCso.insuranceId = insuranceId;
                        deviceToCso.insuranceMrc = insuranceMRC;
        }
    }
}

            if (spanNode.id.indexOf(mCSOPrefix) != -1){
                var mCSOEndBracketIndex = spanNode.id.indexOf(END, mCSOPrefix.length);
                if (mCSOEndBracketIndex != -1){
                    var mCSOId = spanNode.id.substring(mCSOPrefix.length, mCSOEndBracketIndex);
                    var mCSOMrcPrefix = 'device(' + device.key + ')-mandatoryCSO(' + mCSOId + ')-mrc=';
                    if (spanNode.id.indexOf(mCSOMrcPrefix) != -1){
                        var mCSOMRC = spanNode.id.substring(mCSOMrcPrefix.length);
                        deviceToCso.mandatoryCSOs[mCSOId] = new Cso(spanNode, mCSOId, mCSOMRC);
                        addMRC(eval(mCSOMRC));
                    }
                }
            }
        }
        var colonIndex = device.key.indexOf(':');

        var devIndex = device.key.substring(colonIndex+1);
        csoIds = document.getElementsByName('productInfo[' + devIndex + '].optionalCSOs');
        for (var i = 0; i < csoIds.length; i++){
            var csoNode = csoIds[i];

            var selectedCSOid = csoNode.value;
            if (csoNode.type == 'checkbox') {
				
                deviceToCso.insuranceNode = csoNode;
                var insuranceComboIdName = 'device(' + device.key + ')-insuranceCombobox';
                var insuranceComboBox = document.getElementById(insuranceComboIdName);

                if (null != insuranceComboBox){
                    deviceToCso.insuranceComboBoxNode = insuranceComboBox;

					if (csoNode.checked){
                        csoNode.disabled = false;
                        insuranceComboBox.value = 1;
						
                    }
                    if (insuranceComboBox.value == 1){
                        addMrc(deviceToCso.insuranceMrc);
                        showNode(deviceToCso.insuranceMrcNode);
                    }
                }
                continue;
            }
            if (selectedCSOid == '') continue;
			
			
			
           /* for (var currentGroup in deviceToCso.optionalCSOs){
                if (currentGroup.csoList[selectedCSOid] != null){
                    addMRC(currentGroup.csoList[selectedCSOid].mrc);
                    showNode(currentGroup.csoList[selectedCSOid].node);
                }
            }*/
        }
    }
})();

function onUnload(){
    //TODO:
}

/*function submitExtras(csoId) {
//    alert(csoId);
    window.parent.reloadIframeWithReplace('submitCsoId', csoId);
}*/

function onOptionalCSOChange(deviceKey, groupId){
    var currentCombo = document.getElementById(groupId);

    if(null == currentCombo || !currentCombo.options) {
        return;
    }

    if (null == deviceKey || null == groupId || null == currentCombo || currentCombo.options[currentCombo.selectedIndex].disabled){
        return;
        }
    var device = devicesToCSOs[deviceKey];
    if (null == device){
        return;
                }
    var group = device.optionalCSOs[groupId];
    if (null == group){
        return;
            }
//    var csoId = eval(currentCombo.value);
    var csoId = getProductId(currentCombo);
    if (group.selectedCsoId != -1 && group.selectedCsoId != "" && group.selectedCsoId != undefined && group.csoList[group.selectedCsoId] != null){
        hideNode(group.csoList[group.selectedCsoId].node);
        decMRC(group.csoList[group.selectedCsoId].mrc);
    }
    group.selectedCsoId = csoId;
    var cso = group.csoList[csoId];
    if (null == cso){
        return;
        }
    showNode(cso.node);
    addMRC(cso.mrc);
    }

function changeSelectedIndex(jsonOptionalCSOs, deviceKey, groupId) {
//    alert('changeSelectedIndex ' + jsonOptionalCSOs + ', ' + deviceKey + ', ' + groupId);

		var currentCombo = $(groupId);
//    alert('currentCombo = ' + currentCombo);
    if(null == currentCombo) {
        return false;
    }

    var optionalCSO = JSON.decode(jsonOptionalCSOs);
//    alert('optionalCSO = ' + optionalCSO);

	
	
    if(null == optionalCSO) {
        return false;
    }

    for (var k = 0; k < optionalCSO.length; k++) {

        if(groupId.match("\\d+-\\d+") && !groupId.match(".*-insuranceCombobox")) {
            groupId = groupId.substring(0, groupId.indexOf("-"));
        }

        var value = groupId + '-' + optionalCSO[k];
	      //alert('value = ' + value + " \n " + currentCombo.value );
		
		
		  
        if (currentCombo.options) {
            for (var i = 0; i < currentCombo.options.length; i++) {
//                alert('[i] = ' + currentCombo.options[i].value);
				
                if (currentCombo.options[i].value == value) {
                    currentCombo.selectedIndex = i;
                    return true;
					} else{
						currentCombo.getNext('label').removeClass('highlight');						
                }
            }
        } else if (currentCombo.value == value) {
		
			currentCombo.getNext('label').addClass('highlight');
            currentCombo.checked = true;
            return true;
		} else{
			currentCombo.getNext('label').removeClass('highlight');
        }
    }
	
	
    return false;
}

window.addEvent('domready', function(){	
	if($('loading') && $$('.boosters-table input')){								 
				$$('.boosters-table input, .boosters-table label').addEvent('click', function(e){
								var cell =	this.getParent()														  
							if(cell.getChildren('input').get('checked')){
								cell.getChildren('label').removeClass('highlight');
							}
							
							var loader = $('loading');
							loader.set('tween',{'link':'chain'}).setStyles({'display':'block', 'opacity':0});
							loader.tween('opacity',1).tween('opacity',0);	
						});
	};						
});		

// Sets attribute of 'Terms and conditions' checkbox depending on selected value of insurance combobox.

function onInsuranceChange(deviceKey, load) {
    if (null == deviceKey){
        return;
    }
    var device = devicesToCSOs[deviceKey];
	
	device.insuranceNode = document.getElementById('fonesafe_ins');
	
    if (null == device){
        return;
        }
    if (device.insuranceNode == null) {
        return;
        }
    if (device.insuranceComboBoxNode.value == 0) {
        var checked = device.insuranceNode.checked;

		if($$('p.lb-insurance')){
			$$('p.lb-insurance').hide();
			}
        device.insuranceNode.checked = false;
        device.insuranceNode.disabled = true;
        decMRC(device.insuranceMrc);
        hideNode(device.insuranceMrcNode);
        if(checked) {
            submitExtras();
        }
    } else {
        device.insuranceNode.disabled = false;
        device.insuranceNode.checked = load;
		if($$('p.lb-insurance')){
			$$('p.lb-insurance').show();
		}
        addMRC(device.insuranceMrc);
        showNode(device.insuranceMrcNode);
    }
}

// Checks the validity of necessary fields and submits form.
function onSubmit(msg) {
    for (var deviceIndex in devicesToCSOs){
        var device = devicesToCSOs[deviceIndex]; 
        if (!validateInsurance(device, msg)) {
            return false;
        }
    }
    document.getElementsByName('actionName')[0].value = 'ProceedToCheckout';
    return true;
}

// Checks simultaneously selecting (or deselecting) of insurance combobox and 'Terms and conditions' checkbox.
function validateInsurance(device, msg) {
    if (null == device.insuranceNode){
        return true;
    }
    if (devices.length > 1){
        msg = '(' + device.deviceDisplayName + '): ' + msg;
}

if(device.insuranceComboBoxNode){
    if (device.insuranceComboBoxNode.value != 0 && !device.insuranceNode.checked) {
			var modalOptions = {
				text: "<p>"+ msg + "</p>",
				title: 'Please accept',
				confirm: 'OK',
				onConfirm: function(){},
				setFocus:"Confirm"
				}
				window.parent.openModal(modalOptions);	
		       
        return false;
    }
		}
    return true;
	
}
// Sets specified element invisible.
function hideNode(element) {
    if(element) element.style.display = 'none';
}

// Sets specified element visible.
function showNode(element) {
    if(element) element.style.display = '';
}

function addMRC(mrc){
    totalDueMonthly = eval(totalDueMonthly) + eval(mrc);
    totalDueMonthly = totalDueMonthly.toFixed(2);
    showTotals()
}

function decMRC(mrc){
    totalDueMonthly = eval(totalDueMonthly) - eval(mrc);
    totalDueMonthly = totalDueMonthly.toFixed(2);
    showTotals()
}

function showTotals(){
    if (null != totalDueMonthlyNode && undefined != totalDueMonthlyNode){
        if (totalDueMonthly != 0){
            totalDueMonthlyNode.innerHTML = '£' + totalDueMonthly;
        } else {
            totalDueMonthlyNode.innerHTML = '';
        }
    }
}

// Forwards user to 'Data Allowance' page.
function moreDetails(groupId) {
    document.forms[productFormName].action = dataAllowanceActionName;
    document.forms[productFormName].provisionableServiceGroupId.value = groupId;
    document.forms[productFormName].submit();
}

// Set visible all nested 'input' elements in specified element.
function setVisibleNestedInputElements(element) {
    var inputElements = element.getElementsByTagName('input');
    for (j=0; j<inputElements.length; j++) {
        showNode(inputElements[j]);
    }
}

//Todo--------remove this after testing exclusivity_processing.js----------------
// lock tables for exclusive groups
var lockList = new Object();
var lockStorage = new Object();


// add reference to control to lock (group, object to lock)
function addLockedElem (group, elemetId) {
    var testObj = document.getElementById(elemetId);
    if ((testObj != null) && (testObj != null)) {
        addLockedElemImpl(group, testObj, "");
    }
}

// add reference to control to lock (control, object to lock)
function addLockedByControlElem (elemName, elemetId) {
    var testObj = document.getElementById(elemetId);
    if ((testObj != null) && (testObj != undefined)) {
        addLockedElemImpl(elemName, testObj, "e");
    }
}

function addLockedElemImpl(group, testObj, aliasPrefix) {

//adding element to object list table
  if((lockList['list' + aliasPrefix + group] == undefined) || (lockList['list' + aliasPrefix + group] == null)) {
     lockList['list' + aliasPrefix + group] = new Array();
  }
  lockList['list' + aliasPrefix + group].push(testObj);

//adding element to lock list table
  var lockItemId = getLockItemId(testObj);
  if((lockStorage[lockItemId] == undefined) || (lockStorage[lockItemId] == null)) {
     lockStorage[lockItemId] = new Array();
  }
}

// set(or clear in depence of control value) locks from group - to all linked groups and elems.
//    Item - lock cause control
function lockGroup (group, item) {
    if (!(item.disabled)) {
        var index = 'list' + group;
        var localLockList = lockList[index];
        var checkValue = getItemValue(item);

        if ((localLockList != null) && (localLockList != undefined)) {
            for (var i = 0; i < localLockList.length; i ++) {

                if (localLockList[i] == item) continue;

                if ((checkValue != undefined) && (checkValue != null) && (checkValue != "")) {
                    lockElem(localLockList[i], group, item);
                } else {
                    unLockElem(localLockList[i], group);
                }
            }
        }
    }
}

// set to item lock by group and control (lockInitiator)
function lockElem (item, group, selectedItem) {
// to prevent double locks from select input elemants
   if (!isLockExists(item, group) && item != selectedItem) {
       lockStorage[getLockItemId(item)].push(group);
       if (item.tagName == 'OPTION') {
           disableOption(item);
       } else {
           item.disabled = true;
       }
   }
}

// check lock existance on element item
function isLockExists (item, group) {
   for (var k = 0; k < lockStorage[getLockItemId(item)].length; k ++) {
       if (lockStorage[getLockItemId(item)][k] == group) return true;
   }
   return false;
}

// Clear one lock record from single element of lock table.
// if no more locks - unlock element
function unLockElem (item, group) {
    clearOneLock(item, group);
    if (lockStorage[getLockItemId(item)].length == 0) {
        if (item.tagName ==  'OPTION') {
            enableOption(item);
        } else {
            item.disabled = false;
        }
    }
}

// cleares one group lock from item
function clearOneLock (item, group) {

   var oldLockArray = lockStorage[getLockItemId(item)];
   var newLockArray = new Array();
   var lockArrayLength = oldLockArray.length;

   var updated = false;
   for (var j = 0; j < lockArrayLength; j ++) {
       var lockElem = oldLockArray.pop();

       if (lockElem == group && !updated) {
           updated = true;
       } else {
           newLockArray.push(lockElem);

       }
   }
   lockStorage[getLockItemId(item)] = newLockArray;
}

// get item id or item name
function getLockItemId (lockItem) {
   if ((lockItem.id == null) || (lockItem.id == undefined) || (lockItem.id == ""))
      return("item" + lockItem.name);
   else
      return("item" + lockItem.id);
}

// get control value
function getItemValue (item) {
    if (item == null) {
        return null;
    }

    if (item == undefined) {
        return undefined;
    }

    if (item.type == 'checkbox') {
        if (item.checked) {
            return item.value;
        } else {
            return "";
        }
    }

    return item.value;
}
//Todo----remove-----------------------------------------------


// Update Flexibl booster
window.addEvent('domready', function(){
	if($('flexibleBoosterSelect')){
	$('flexibleBoosterSelect').addEvent('change', function(){
					var updateButton = $('updateBooster');
					if(updateButton.hasClass('btn-disabled')){
						updateButton.removeClass('btn-disabled');
	
						updateButton.addClass('btn-white');
						} 
													 
				});
	}
 });

