//Literals
//Найдите несколько окружающих объектов реального мира и создайте соответственные объекты Javascript. Например:

{
    const phone = {
        brand: 'Xiaomi',
        model: 'mi11',
        year: '2021',
        memory: '256'
    }
}

//Literals expand
//Дайте возможность пользователю добавить любые два свойства в эти объекты с любыми значениями. Обеспечьте ввод названия ключа и значения через prompt прямо в литерале объекта {}

{
    const yourPhone = {
        [prompt('свойство 1')]: prompt('значение  свойства 1'),
        [prompt('свойство 2')]: prompt('значение  свойства 2'),
        [prompt('свойство 3')]: prompt('значение  свойства 3'),
    }
}

//Literals copy
//Пусть пользователь введет еще одно свойство в переменную. Вставьте в новый объект эту переменную. Скопируйте объект из предыдущего задания в новый объект.

{
    const yourPhone = {
        [prompt('свойство 1')]: prompt('значение  свойства 1'),
        [prompt('свойство 2')]: prompt('значение  свойства 2'),
    }


    const property = prompt()
    const objNew = {
    [property] : 25,
    ...yourPhone
    } 
}

//Html tree
/*
<body>
        <div>
            <span>Enter a data please:</span><br/>
            <input type='text' id='name'>
            <input type='text' id='surname'>
        </div>
        <div>
            <button id='ok'>OK</button>
            <button id='cancel'>Cancel</button>
        </div>
    </body>
*/
/*Сделайте декларативную JSON-структуру для тэгов выше, в которой:
каждый тэг будет объектом
имя тэга будет полем tagName
вложенные тэги будут в поле children
набор аттрибутов тэга будет в поле attrs.*/

{
    const body = {
        tagName : 'body',
        children : [
            {
                tagName : 'div',
                children : [
                    {
                        tagName : 'span',
                        children : ['Enter a data please:']
                    },
                    {
                        tagName : 'br'
                    },
                    {
                        tagName : 'input',
                        attrs : {
                            type : 'text',
                            id : 'name'
                        }
                    },
                    {
                        tagName : 'input',
                        attrs : {
                            type : 'text',
                            id : 'surname',
                        }
                    }
                ]
            },
            {
                tagName : 'div',
                children : [
                    {
                        tagName : 'button',
                        attrs : {
                            id : 'ok'
                        },
                        children : ['OK']
                    },
                    {
                        tagName : 'button',
                        attrs : {
                            id : 'cancel'
                        },
                        children : 'Cancel'
                    },
                ]
            }
        ]
    }
// Выведите значения текста во второй кнопке, используя . и [].

console.log( body.children[1].children[1].children ) ;

//Выведите значение атрибута id во втором input, используя . и [].

console.log( body.children[0].children[3].attrs.id ) ;

}

// Parent
// Добавьте каждому объекту тэга из предыдущего задания связь с родителем, используя свойство parent и присвоение

{
    const body = {
        tagName : 'body',
        children : [
            {
                tagName : 'div',
                children : [
                    {
                        tagName : 'span',
                        children : ['Enter a data please:']
                    },
                    {
                        tagName : 'br'
                    },
                    {
                        tagName : 'input',
                        attrs : {
                            type : 'text',
                            id : 'name'
                        }
                    },
                    {
                        tagName : 'input',
                        attrs : {
                            type : 'text',
                            id : 'surname',
                        }
                    }
                ]
            },
            {
                tagName : 'div',
                children : [
                    {
                        tagName : 'button',
                        attrs : {
                            id : 'ok'
                        },
                        children : ['OK']
                    },
                    {
                        tagName : 'button',
                        attrs : {
                            id : 'cancel'
                        },
                        children : 'Cancel'
                    },
                ]
            }
        ]
    }

    body.children[0].parent = body;
    body.children[0].children[0].parent = body.children[0];
    body.children[0].children[1].parent = body.children[0];
    body.children[0].children[2].parent = body.children[0];
    body.children[0].children[3].parent = body.children[0];
    body.children[1].parent = body;
    body.children[1].children[0].parent = body.children[1];
    body.children[1].children[1].parent = body.children[1];

}

//Change OK
//Добавьте(или измените) любой введенный пользователем атрибут тэга <button id='ok'> из задания HTML Tree. Пользователь также вводит значение этого атрибута.

{
    const body = {
        tagName : 'body',
        children : [
            {
                tagName : 'div',
                children : [
                    {
                        tagName : 'span',
                        children : ['Enter a data please:']
                    },
                    {
                        tagName : 'br'
                    },
                    {
                        tagName : 'input',
                        attrs : {
                            type : 'text',
                            id : 'name'
                        }
                    },
                    {
                        tagName : 'input',
                        attrs : {
                            type : 'text',
                            id : 'surname',
                        }
                    }
                ]
            },
            {
                tagName : 'div',
                children : [
                    {
                        tagName : 'button',
                        attrs : {
                            id : 'ok'
                        },
                        children : ['OK']
                    },
                    {
                        tagName : 'button',
                        attrs : {
                            id : 'cancel'
                        },
                        children : 'Cancel'
                    },
                ]
            }
        ]
    }

    body.children[0].parent = body;
    body.children[0].children[0].parent = body.children[0];
    body.children[0].children[1].parent = body.children[0];
    body.children[0].children[2].parent = body.children[0];
    body.children[0].children[3].parent = body.children[0];
    body.children[1].parent = body;
    body.children[1].children[0].parent = body.children[1];
    body.children[1].children[1].parent = body.children[1];

    const buttonIdOk = prompt("введите атрибут <button id='ok'> кторый хотите добавить или изменить");
    const buttonIdOkValue = prompt("введите значение атрибута " + buttonIdOk);
    body.children[1].children[0].attrs[buttonIdOk] = buttonIdOkValue
    

//Destructure
//Используя деструктуризацию структуры из задания HTML Tree, Выведите значения текста в тэге span, Выведите значения текста во второй кнопке и Выведите значение атрибута id во втором input.


    const {children : [
        {children : [
            {children:[span]},
            {},
            {},
            {attrs :{id:id}}
        ]},
        {children : [
            {},
            {children : button2}
        ]}
    ]} = body
    console.log(span, button2, id)

}

//Destruct array
/*let arr = [1,2,3,4,5, "a", "b", "c"]
напишите код, который используя деструктуризацию положит:
четные числа в переменные even1, even2,
нечетные в odd1, odd2, odd3,
буквы в отдельный массив */

{
    let arr = [1,2,3,4,5, "a", "b", "c"];
    const [odd1, even1, odd2, even2, odd3, ...Literals] = arr
}

//Destruct string
/*let arr = [1, "abc"]
напишите код, который используя деструктуризацию положит:
число в переменную number
букву a в переменную s1
букву b в переменную s2
букву c в переменную s3*/

{
    let arr = [1, "abc"]
    const [number, [s1, s2, s3]] = arr
}

/*Destruct 2
let obj = {name: 'Ivan',
           surname: 'Petrov',
           children: [{name: 'Maria'}, {name: 'Nikolay'}]}
извлеките используя деструктуризацию имена детей в переменные name1 и name2*/
{
    let obj = {name: 'Ivan',
        surname: 'Petrov',
        children: [{name: 'Maria'}, {name: 'Nikolay'}]}

    let {children:[{name: name1},{name: name2}]} = obj
}

/*Destruct 3
let arr = [1,2,3,4, 5,6,7,10]
извлеките используя деструктуризацию объектов два первых элемента и длину массива в переменные a, b и length*/

{
    let arr = [1,2,3,4, 5,6,7,10];
    let {1 : a,
         2 : b,
         length : length} = arr;
}

/*Copy delete
Сделайте копию одного из объектов из задания Literals без ключа, который введет пользователь.*/

{
    const phone = {
        brand: 'Xiaomi',
        model: 'mi11',
        year: '2021',
        memory: '256'
    }

    const newObj = {...phone}
}

/*Currency real rate
Ниже приведен код, который скачивает актуальную информацию о курсах валют. Скопируйте ссылку из него вставьте в браузер интереса ради. Реализуйте калькулятор обмена валют следующим образом:
Пользователь вводит исходную валюту
Пользователь вводит валюту, в которую происходит конвертация
Пользователь вводит сумму в исходной валюте
Пользовател видит результат конвертации*/
{
    let currencyStart = prompt('Пользователь вводит исходную валюту').toUpperCase();
        let currencyFinish = prompt('Пользователь вводит валюту, в которую происходит конвертация').toUpperCase();
        let summStart = +prompt('Пользователь вводит сумму в исходной валюте');
        let rateStart
        let rateFinish

fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
            .then(data => {
                    //эта функция запускается когда данные скачиваются.
                    //остальной код работает РАНЬШЕ.
                    //только ТУТ есть переменная data со скачанными данными
                    console.log(data) //изучите структуру, получаемую с сервера в консоли
                    rateStart = data.rates[currencyStart];
                    console.log('rateStart' + rateStart);
                    rateFinish = data.rates[currencyFinish];
                    console.log('rateFinish' + rateFinish);
                    summStart / rateStart * rateFinish ? alert(summStart / rateStart * rateFinish) : alert('вы ввели какую -то дичь!')
                })
}
/*Учтите, что пользователь может ввести какую-то дичь или название валют в неверном регистре*/

//Currency drop down
//Сделайте выпадающий список с названиями всех валют, используя код из прошлого задания и накопление HTML-тэгов в строковой переменной. Для выпадающих списков в HTML предусмотрены тэги <select> и <option>

{
    fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
    .then(data => {

        console.log(data)
        let select = '<select>'
        for (let currency in data.rates){
            select += '<option>' + currency + '</option>'
        }
        select += '</select>'
        document.write(select)
       })

}

/*Currency table
Сделайте двумерную таблицу с курсами между всеми возможными парами валют по типу таблицы Пифагора, используя заготовку из задания Currency real rate:

Используйте только один запрос на сервер. Используйте расчет кросскурса для вычисления курса между любой парой валют*/

{
    fetch('https://open.er-api.com/v6/latest/USD').then(res => res.json())
    .then(data => {

        let table = '<table>'
            table += '<tr><td></td>'
            for (let currency in data.rates){
            table += '<td>' + currency + '</td>'
        }
        table += '</tr>'
        

        for (let currencyStart in data.rates){
            table += '<tr><td>' + currencyStart + '</td>';

            
                for (let currencyFinish in data.rates) {
                
                    table += `<td>${data.rates[currencyFinish] / data.rates[currencyStart]}</td>`
                
                }
                
        }
        table += '</table>'
        document.write(table)
    
    })
}

/*Form
Напишите код, который их любого объекта создает форму HTML. Например для такого объекта:
const car = {
      "Name":"chevrolet chevelle malibu",
      "Cylinders":8,
      "Displacement":307,
      "Horsepower":130,
      "Weight_in_lbs":3504,
      "Origin":"USA",
      "in_production": false
}
На экране должна появиться форма из 7 строк, с названиями полей, взятыми из ключей и полями ввода соответствующих типов. Значениями полей ввода должны быть значения из объекта.
<form>
    <label>Name: <input type="text" value="chevrolet chevelle malibu"/></label>
    <label>Cylinders: <input type="number" value="8"/></label>
    <label>Displacement: <input type="number" value="307"/></label>
    <label>Horsepower: <input type="number" value="130"/></label>
    <label>Weight_in_lbs: <input type="number" value="3504"/></label>
    <label>Origin: <input type="text" value="USA"/></label>
    <label>in_production: <input type="checkbox" /></label>
</form>
Для создания правильного типа тэга input используйте оператор typeof Javascript:
console.log(typeof 5)//number
console.log(typeof "5") //string
console.log(typeof (5 > 2)) //boolean

Соответствие типов
JS        HTML
number  number
string  text
boolean checkbox*/

{
    const car = {
        "Name":"chevrolet chevelle malibu",
        "Cylinders":8,
        "Displacement":307,
        "Horsepower":130,
        "Weight_in_lbs":3504,
        "Origin":"USA",
        "in_production": false
  }

    let form = '<form>'

    for (let label in car){
        form += '<label>' + label +':';
        let type = typeof car[label];
        let typeHtml
        if (type === "number") typeHtml = "number";
        if (type === "string") typeHtml = "text";
        if (type === "boolean") typeHtml = "checkbox";

        form += `<input type="${typeHtml}" value="${car[label]}"/>`
        
        form += '</label>';
    }
    document.write(form)
}

//Table
/*
Даден любой массив с объектами

const persons = [
        {
            name: 'Мария',
            fatherName: 'Ивановна',
            surname: 'Иванова',
            sex: 'female'
        },
        {
            name: 'Николай',
            fatherName: 'Иванович',
            surname: 'Иванов',
            age: 15
        },
        {
            name: 'Петр',
            fatherName: 'Иванович',
            surname: 'Иванов',
            married: true
        },
]

Сформировать таблицу (используя накопление тэгов HTML в строке):

name     fatherName      surname     sex     age     married
Мария    Ивановна       Иванова     female
Николай  Иванович       Иванов               15
Петр     Иванович       Иванов                          true

Алгоритм решения
Перед непосредственно формированием строк таблицы надо знать все колонки. Для этого нужно предварительно перебрать все объекты и извлечь из них все ключи, что бы сформировать общее множество ключей.
Первый проход - поиск колонок
Перебираем массив объектов, перебираем ключи каждого объекта и добавляем в массив колонок, если этого ключа еще там нет. Для примера выше массив получится в шесть элементов. На этом этапе строку HTML создавать еще рано.
Заголовок
Начинаем создание таблицы. Используя массив колонок формируем одну строку таблицы с заголовками
Второй проход - отображение таблицы
Перебираем массив объектов, перебираем массив колонок для каждого объекта, и используем название колонки как ключ*/

{
    const persons = [
        {
            name: 'Мария',
            fatherName: 'Ивановна',
            surname: 'Иванова',
            sex: 'female'
        },
        {
            name: 'Николай',
            fatherName: 'Иванович',
            surname: 'Иванов',
            age: 15
        },
        {
            name: 'Петр',
            fatherName: 'Иванович',
            surname: 'Иванов',
            married: true
        },
    ]

    let arrColumn = [];
    for ( let obj of persons){

        for (let key in obj ){
            if ( !(arrColumn.includes(key)) ) {arrColumn.push(key)}
        }
    }

    let table = '<table>';
    
    table += '<tr>'
        for (let th of arrColumn){
            table += '<th>' + th + '</th>'
        }
    table += '</tr>'

    for ( let obj of persons) {
        table += '<tr>';

        for (column of arrColumn){
            table += '<td>'
                if (obj[column]) { table += obj[column] }
            table += '</td>'
        }
        table += '</tr>';
    }

    table += '</table>'
    document.write(table)
}