// ------------------------------1--------------------------------------
// Напишите функцию, которая в объекте меняет местами ключи и значения:

var obj = {
    'name': 'John',
    'email': 'john@mail.com'
};

function reverse(val) {
	obj = val;
	for (var key in obj) {
    	obj[obj[key]] = key;
    	delete obj[key] ;
	}
	return obj;
}
reverse(obj);
console.log(obj); // {'John': 'name', 'john@mail.com': 'email'}

// ------------------------------2--------------------------------------
// Напишите функцию-аналог splice, не используя никакие методы массива:
// var arr = [1, 2, 4, 3];
// arr = splice(arr, 2, 1);
// console.log(arr); // [1, 2, 3]
// arr = splice(arr, 2, 0, 100, 200, 300);
// console.log(arr); // [1, 2, 100, 200, 300, 3]

var arr = [1, 2, 4, 3, 6, 7, 9, 8];
function splice(arr) {

	var arrArguments = [];
	for (i=0; i < arguments.length; i++) {
		arrArguments[i] = arguments[i];
	}
	// debugger;
if (arrArguments[2] >= 1) {
	for (var i = 0, j = 0, nwarr = []; j < (arr.length - arrArguments[2]) + (arrArguments.length - 3); i++, j++) {
    	nwarr[j] = arr[i];
    	if ( (i == arrArguments[1]) && (arrArguments.length > 3) ) {
    		nwarr[j] = arrArguments[3];
    		for (a = 4, b = 0; b < arrArguments.length - 3;a++, b++) {
    			j++;
    			nwarr[j] = arrArguments[a];
    		}
    	}
    	if (i == arrArguments[1]) {
    		nwarr[j] = arr[i+(arr.length - (arr.length - arrArguments[2]) )];
    		i= i + (arr.length - (arr.length - arrArguments[2]) );
    		
   	 	}
	}
}else if (arrArguments[2] == 0) {
	for (var i = 0, j = 0, nwarr = []; j < (arr.length - arrArguments[2]) + (arrArguments.length - 4); i++, j++) {
		nwarr[j] = arr[i];
		if (i == arrArguments[1]) {
			nwarr[j] = arrArguments[3];
 			for (var a=4; a < arrArguments.length; a++) {
				j++;
				nwarr[j] = arrArguments[a];
			}
		}
	}
}
arr = nwarr;
return console.log(arr);
}
splice(arr, 2, 4);
splice(arr, 2, 4, 599, 377, 5, 7777);
splice(arr, 2, 0, 100, 200, 300); 

// ------------------------------3--------------------------------------
// Напишите функцию, которая возвращает сумму всех чисел, переданных в качестве аргументов, 
// число которых не ограничено. Функция работает только с числами (включая строковые). 
// Если какой-то из параметров - массив, то к сумме добавляется также сумма значений этого массива 
// (если какое-либо из значений этого массива также является массивом, то к результату добавляется 
// также и сумма его значений, и так далее).
// var sum = getSum(1, '1', 'one', [2, '2', 'two']);
// console.log( sum ); // 6

function sum() {
	var summ = 0;
	for(var i=0; i < arguments.length; i++){
		if (isFinite(arguments[i])) {
  			summ+= +arguments[i];
  		}else if (arguments[i] instanceof Array ) {
			summ += sum.apply(null, arguments[i])
		}
	}
	return summ;
}
console.log( sum(1, '1', 'one', [2, '2', [2, '2', 'two'], 'two'], 1, 4, [2, '2', 'two'], 7) );

// ------------------------------4--------------------------------------
// Напишите функцию, которая отрисовывает древовидный список ul li из предоставленной структуры любой глубины вложенности. 
// Где рисовать меню определяется в параметрах функции, если DOM-элемент не был передан, то дерево рисуется в body:
// var data = [1, [21, 22, 23], 3, [41, [421, 422]], 5];
// recursiveTree(data);                              <--------самое злое задание, время выполнения 100500 часов

var data = [1, [21, 22, 23], 3, [41, [421, 422]], 5];
var $item = $('<div>').prependTo('body');

function recursiveTree(arr, place) {
	place = place || 'body';

	var $ul =$('<ul>').appendTo(place);

	for(var i=0; i < arr.length; i++){
		if ( typeof arr[i] !== "object") {
			$('<li>').text(arr[i]).appendTo($ul);
		}else {
  			recursiveTree(arr[i], $ul);
		}
	}
}

recursiveTree(data, $item);	

// ------------------------------5--------------------------------------
// Напишите функцию, которая изображает в теге HTML картинку по данным, представляющим из себя двумерный массив закрашенных точек.

var cat = [
    [2, 3, 4],
    [1, 2, 8, 15],
    [0, 1, 8, 9, 14, 15],
    [0, 1, 4, 5, 8, 9, 10, 11, 12, 13, 14, 15],
    [0, 1, 3, 4, 5, 6, 8, 11, 12, 15],
    [0, 1, 2, 3, 4, 5, 6, 7, 8, 11, 12, 15],
    [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 13, 14, 15],
    [1, 2, 3, 4, 5, 6, 7, 9, 10, 11, 12, 13, 14],
    [1, 2, 3, 6, 7, 11, 12],
    [1, 2, 6, 7],
    [1, 2, 3, 4, 6, 7, 8],
    [1, 2, 3, 4, 6, 7, 8]
];

var $item = $('<table>').css({'margin' : 'auto', 'background' : '#fff', 'border-collapse' : 'collapse', 'border-spacing' : 0}).prependTo('body');

for (var i = 0; i < cat.length; i++) {
	var $tr = $('<tr>').appendTo($item);

	for (var j = 0, k=0; (j < 16) || (k < cat[i].length); j++) {
		if (j == cat[i][k]) {
			k++;
			$('<td>').css({'background' : '#000', 'height' : '40px', 'width' : '40px'}).appendTo($tr);
		}else
		$('<td>').css({'border' : '1px solid #000', 'height' : '40px', 'width' : '40px'}).appendTo($tr);

	}
}