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 (null == devices){
        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 onOptionalCSOChange(deviceKey, groupId, currentCombo){
    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);
    }

// Sets attribute of 'Terms and conditions' checkbox depending on selected value of insurance combobox.
function onInsuranceChange(deviceKey) {
    if (null == deviceKey){
        return;
    }
    var device = devicesToCSOs[deviceKey];
    if (null == device){
        return;
        }
    if (device.insuranceNode == null) {
        return;
        }
    if (device.insuranceComboBoxNode.value == 0) {
        device.insuranceNode.checked = false;
        device.insuranceNode.disabled = true;
        decMRC(device.insuranceMrc);
        hideNode(device.insuranceMrcNode);
    } else {
        device.insuranceNode.disabled = false;
        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.value == 1 && !device.insuranceNode.checked) {
        alert(msg);
        return false;
    }
    return true;
}

// Sets specified element invisible.
function hideNode(element) {
    element.style.display = 'none';
}

// Sets specified element visible.
function showNode(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-----------------------------------------------