/*jslint browser: true, forin: false */
/*global bbc: true */
bbc = window.bbc || {};
bbc.weather = bbc.weather || {};
// this is global for testing
bbc.weather.extractUnitValueFromCookie = function (unitKey, weatherCookie) {
  var matches = new RegExp(':' + unitKey + '([A-Z])(?::|$)').exec(weatherCookie);
  if (matches) {
    return matches[1];
  }
  return null;
};
  
(function () {
    
    var dependentUnits = {
        'windspeed': {
            'distance': {
                'mph': 'miles',
                'kph': 'km'
            }
        }
    };

    function readCookie(key) {
        var rawValues = new RegExp('(?:^|; )' + encodeURIComponent(key) + '=([^;]*)').exec(document.cookie);
        return rawValues ? decodeURIComponent(rawValues[1]) : null;
    }
    
    function addDependentUnitStyles(measure, unit) {
        var dependentUnit, dependentMeasure;
        for (dependentMeasure in dependentUnits[measure]) {
            dependentUnit = dependentUnits[measure][dependentMeasure][unit];
            document.documentElement.className += ' stored-' + dependentMeasure + '-unit-' + dependentUnit;
        }
    }
    
    function addInitialUnitStyleOverride(measure, unit) {
        document.documentElement.className += ' stored-' + measure + '-unit-' + unit;
        addDependentUnitStyles(measure, unit);
    }

    function configureUnitsDisplay(userUnits) {
        var unitType;
        for (unitType in userUnits) {
            if (userUnits.hasOwnProperty(unitType) && userUnits[unitType]) {
                addInitialUnitStyleOverride(unitType, userUnits[unitType]);            
            }
        }
    }

    function setInitialUnitPickerState(pickerId, userUnits) {

        function setAsSelected(element) {
            var links = element.getElementsByTagName('a');
            if (links.length) {
                element.innerHTML = links[0].innerHTML;
            }
            if ((' ' + element.className + ' ').indexOf(" selected ") === -1) {
                element.className += " selected";
            }
        }

        function setAsAlternative(element) {
            var links = element.getElementsByTagName('a');
            if (!links.length) {
                element.innerHTML = '<a href="#">' + element.innerHTML  + '</a>';
            }
            if ((' ' + element.className + ' ').indexOf(" selected ") > -1) {
                element.className = element.className.replace("selected", "");
            }
        }

        var picker = document.getElementById(pickerId),
            unitTypeElements = picker.getElementsByTagName('ul'),
            unitType,
            userUnit,
            unitElement,
            units, 
            i, 
            j;
        for (i = 0; i < unitTypeElements.length; i += 1) {
            unitType = unitTypeElements[i].getAttribute('data-unit-type');
            userUnit = userUnits[unitType];
            if (userUnit) {
                units = unitTypeElements[i].getElementsByTagName('li');
                for (j = 0; j < units.length; j += 1) {
                    unitElement = units[j];
                    if (userUnit === unitElement.getAttribute('data-unit')) {
                        setAsSelected(unitElement);
                    } else {
                        setAsAlternative(unitElement);
                    }
                }
            }
        }
        picker.className += ' configured';
    }

    function configureUnitPicker(userUnits) {
        bbc.weather.setInitialUnitPickerState = function (pickerId) {
            setInitialUnitPickerState(pickerId, userUnits);
        };
    }
    
    function configureInitialUnits() {
        var cookie = readCookie('WEATHER'), 
            stored = {},
            userUnits = {},
            unitNameFromStateNameValue = {
                'C': 'c',
                'F': 'f',
                'M': 'mph',
                'K': 'kph'
            };

        document.documentElement.className += ' weather-units-js';
        stored.T = bbc.weather.extractUnitValueFromCookie('T', cookie);
        stored.W = bbc.weather.extractUnitValueFromCookie('W', cookie);
        userUnits.temperature = stored.T ? unitNameFromStateNameValue[stored.T] : null;
        userUnits.windspeed = stored.W ? unitNameFromStateNameValue[stored.W] : null;
        
        configureUnitsDisplay(userUnits);
        configureUnitPicker(userUnits);
    }

    configureInitialUnits();
}());

