﻿function TextatorUnitConverter()
{
    this.Init = init;
        
    
    function init()
    {
        $.ajaxSetup({cache : false});
        
        getJSON({'c':'gcd'}, function(data) {
            units = data;
            $.each(data, function(i, o) {
                $('#uxUnitCategories').append(createOption(o.code, o.title));
            });
            var unitCategoryCode = $('#uxUnitCategories').val();
            var unitCategory = findUnitCategory(unitCategoryCode);
            loadUnitGroups(unitCategory);
            loadAllUnitCategoryUnits($('#uxUnitCategories').val());
        });
        
        $(".actions button").click(function(){
            resetValidation();
            $("#uxResult").empty();
            
            var validationFailed = false;
            
            if ($("#uxUnitsFrom").val() == null)
            {
                $('#uxUnitsFromValidation').html(getMsg('unitRequired'));
                validationFailed = true;
            }
            
            if ($("#uxUnitsTo").val() == null)
            {
                $('#uxUnitsToValidation').html(getMsg('unitRequired'));
                validationFailed = true;
            }
            
            if (!$("#uxValue").val())
            {
                $('#uxValueValidation').html(getMsg('valueRequired'));
                validationFailed = true;
            }
            else
            {
                var numRe = /^[-]?[0-9]+([,.][0-9]+)?$/g;
                if ($("#uxValue").val().match(numRe) == null)
                {
                    $('#uxValueValidation').html(getMsg('valueNotNumeric'));
                    validationFailed = true;
                }
            }
            
            if (validationFailed == true)
            {
                return false;
            }
            
            getJSON({'c': 'ct', 'from': $("#uxUnitsFrom").val(), 'to': $("#uxUnitsTo").val(), 'v':$("#uxValue").val()}, function(data) {
                var unitTo = getUnit($("#uxUnitsTo").val());
                var displayValue = data.result;
                if (unitTo.abbrev)
                {
                    displayValue = displayValue + ' ' + unitTo.abbrev;
                }
                $("#uxResult").hide().html(displayValue).fadeIn('slow');
            });
            
            return false;
        });
        
        $('#uxUnitCategories').change(function() {
            resetValidation();
            var unitCategory = findUnitCategory($(this).val());
            loadUnitGroups(unitCategory);
            loadAllUnitCategoryUnits($(this).val());
        });
    }



    function resetValidation()
    {
        $('#uxUnitsFromValidation, #uxUnitsToValidation, #uxValueValidation').empty();
    }



    function findUnitCategory(unitCategoryCode)
    {
        var c;
        
        $.each(units, function(i, o) {
            if (o.code == unitCategoryCode)
            {
                c = o;
            }
        });
        return c;
    }



    function getUnitCategoryUnits(unitCategoryCode)
    {
        return findUnitCategory(unitCategoryCode).units;
    }



    function getUnitGroupsUnits(unitCategoryCode, unitGroupsCodes)
    {
        var result = [];
        
        var unitCategoryUnits = getUnitCategoryUnits(unitCategoryCode);
        $.each(unitCategoryUnits, function(i, o) {
            if (jQuery.inArray(o.groupCode, unitGroupsCodes) != -1)
            {
                result.push(o);
            }
        });
        
        return result;
    }
    
    
    
    function getUnit(unitCode)
    {
        var unit;
        
        $.each(units, function(i, uc) {
            $.each(uc.units, function(j, u) {
                if (u.code == unitCode)
                {
                    unit = u;
                }
            }); 
        });
        
        return unit;
    }
    
    

    function loadUnitGroups(unitCategory)
    {
      $('#uxUnitGroupsFrom, #uxUnitGroupsTo').empty();
      
      if (unitCategory.unitGroups !== null && unitCategory.unitGroups.length > 0)
      {
          $("#uxUnitFilters").show();
          
          var opts = [];
          opts.push({unitGroupsSelector : '#uxUnitGroupsFrom', unitsSelector : '#uxUnitsFrom'});
          opts.push({unitGroupsSelector : '#uxUnitGroupsTo', unitsSelector : '#uxUnitsTo'});
          
          $.each(opts, function(i, o) {
            var unitGroupsContainerId = $(o.unitGroupsSelector).attr('id');
            
            $(o.unitGroupsSelector).append(createUnitListItem(unitGroupsContainerId + '_all', getMsg('all')));
            
            $.each(unitCategory.unitGroups, function(j, unitGroup) {
                $(o.unitGroupsSelector).append(createUnitListItem(unitGroupsContainerId + '_' + unitGroup.code, unitGroup.title));
            });
            
            $(o.unitGroupsSelector + ' label:first').css('font-weight', 'bold');
          
            $(o.unitGroupsSelector + ' :checkbox:first').click(function() {
                onSelectAllGroups(o.unitGroupsSelector, o.unitsSelector);
            });
            
            $(o.unitGroupsSelector + ' :checkbox:gt(0)').click(function() {
                onSelectGroup(o.unitGroupsSelector, o.unitsSelector);
            });
          });
      }
      else
      {
        $("#uxUnitFilters").hide();
      }
    }
    
    
    
    function onSelectAllGroups(unitGroupsContainerSelector, unitsContainerSelector) 
    {
        var all_checked = $(unitGroupsContainerSelector + ' :checkbox:first').attr('checked');
        $(unitGroupsContainerSelector + ' :checkbox:gt(0)').attr('checked', all_checked);
        if (!all_checked)
        {
            $(unitsContainerSelector).empty();
        }
        else
        {
            loadUnitCategoryUnits($('#uxUnitCategories').val(), unitsContainerSelector);
        }
    }


    function onSelectGroup(unitGroupsContainerSelector, unitsContainerSelector)
    {
        var unitGroupCodes = [];
        var selectedGroupsCount = 0;
        $(unitGroupsContainerSelector + ' :checkbox:gt(0)').each(function() {
            if ($(this).attr('checked') === true)
            {
                selectedGroupsCount++;
                unitGroupCodes.push($(this).attr('id').replace($(unitGroupsContainerSelector).attr('id') + '_', ''));
            }
        });
        
        if (selectedGroupsCount == $(unitGroupsContainerSelector + ' :checkbox:gt(0)').size())
        {
            $(unitGroupsContainerSelector + ' :checkbox:first').attr('checked', true);
        }
        else
        {
            $(unitGroupsContainerSelector + ' :checkbox:first').attr('checked', false);
        }
        
        if (unitGroupCodes.length > 0)
        {
            loadUnitGroupsUnits(unitGroupCodes, unitsContainerSelector);
        }
        else
        {
            $(unitsContainerSelector).empty();
        }
    }
    
    
    
    function loadUnitCategoryUnits(unitCategoryCode, listBoxSelector)
    {
        $(listBoxSelector).empty();
        var units = getUnitCategoryUnits(unitCategoryCode);
        $.each(units, function(i, o) {
            $(listBoxSelector).append(createOption(o.code, o.title));
        });
    }
    
    
    
    function loadUnitGroupsUnits(unitGroupCodes, listBoxSelector)
    {
        var selUnit = $(listBoxSelector).val();
        
        $(listBoxSelector).empty();
        var units = getUnitGroupsUnits($('#uxUnitCategories').val(), unitGroupCodes);
        $.each(units, function(i, o) {
            $(listBoxSelector).append(createOption(o.code, o.title));
        });
        
        $(listBoxSelector).val(selUnit);
    }
    
    
    
    function loadAllUnitCategoryUnits(unitCategoryCode)
    {
        loadUnitCategoryUnits(unitCategoryCode, "#uxUnitsFrom, #uxUnitsTo");
    }
    
    
    
    function createUnitListItem(id, title)
    {
        return $('<li><input type="checkbox" id="' + id + '" class="checkbox" checked="checked"/><label for="' + id + '">' + title + '</label></li>');
    }
    
    
    
    function createOption(value, text)
    {
        return $('<option value="' + value + '">' + text + '</option>');
    }
    
    
    
    function getJSON(options, handler)
    {
        var options_all = {'h':'uc', 'l':$(':hidden[name="l"]').val()};
        jQuery.extend(options_all, options);
        $.getJSON('/ajax/handler.ashx', options_all, handler);
    }
    
    
    var msg = {
        lv : {
            all : 'Visas',
            unitRequired : 'Izvēlieties mērvienību',
            valueRequired : 'Norādiet vērtību',
            valueNotNumeric : 'Norādītā vērtība nav skaitlis'
        },
        
        en : {
            all : 'All',
            unitRequired : 'Select unit',
            valueRequired : 'Value required',
            valueNotNumeric : 'Specify numeric value'
        },
        
        ru : {
            all : 'Все',
            unitRequired : 'Выберите единицу измерения',
            valueRequired : 'Укажите значение',
            valueNotNumeric : 'Указанное значение не является числом'
        }
    };
    
    function getMsg(key)
    {
        var lang = $(':hidden[name="l"]').val().split('-')[0];
        return msg[lang][key];
    }
}


$(document).ready(function() 
{
    var converter = new TextatorUnitConverter();
    converter.Init();
});



