/**
 * Массив данных песен.
 * Каждый елемент представляет собой объект с аттрибутами
 * <ul>
 *   <li>string name - название песни</li>
 *   <li>int year - год</li>
 *   <li>string poetryAuthor - автор стихов</li>
 *   <li>string musicAuthor - автор музыки
 *   <li>string notesUrl - url на ноты</li>
 *   <li>string audioUrl</li>
 *   <li>string videoUrl</li>
 * </ul>
 *
 */
var data;
function loadData() {
    data=getData();
}
loadData();

/** Порядок сортировки. */
var isReverse=true;
var prevSort;

function searchMatch(rec) {
    var name=rec.name.toLowerCase();
    var nameCriteria=document.getElementById("name_search").value.toLowerCase();
    var nameMatch=name.indexOf(nameCriteria) != -1;

    var poetry=rec.poetryAuthor.toLowerCase();
    var poetryCriteria=document.getElementById("poetry_author_search").value.toLowerCase();
    var poetryMatch=poetry.indexOf(poetryCriteria) != -1;

    return nameMatch && poetryMatch;
}

function fillAndSort() {
    if(prevSort) {
        data.sort(prevSort);
    }
    fillTable();

}
function showAll() {
    loadData();
    //fillTable();
    fillAndSort();
}
function searchFilter() {
    loadData();
    var newData=[];
    var j=0;
    for(var i=0; i<data.length; i++) {
        if(searchMatch(data[i])) {
            newData[j++]=data[i];
        }
    }
    data=newData;
    //fillTable();
    fillAndSort();
}

/**
 * Сортировка массива данных. Posle sortirovki vyzyvaet fillTable().
 * @param sortFunction функция сортировки для массива data.
 * @param sortFunctionBack функция обратной сортировки для массива data.
 */
function sortTable(sortFunction, sortFunctionBack) {

    var newSortFunction=sortFunction;
    if(prevSort==newSortFunction) {
        isReverse=!isReverse;
    } else {
        isReverse=(newSortFunction==yearSort);
    }

    if(isReverse) {
        sortFunction = sortFunctionBack;
    }
    data.sort(sortFunction);

    hideArrows();
    displayArrows(sortFunction, isReverse);
    fillTable();
    prevSort=newSortFunction;
}

function compareStrings(str1, str2) {
    return str1==str2 ? 0 : (str1>str2 ? 1 : -1);
}

/**
 * Функция сортировки по году.
 */
function yearSort(item1, item2) {
    var res=item1.year-item2.year;
    res = res==0 ? compareStrings(item1.name, item2.name) : res;
    res = res==0 ? compareStrings(item1.poetryAuthor, item2.poetryAuthor) : res;
    return res;
}

/**
 * Функция обратной сортировки по году.
 */
function yearSortBack(item1, item2) {
    var res=item2.year-item1.year;
    res = res==0 ? compareStrings(item1.name, item2.name) : res;
    res = res==0 ? compareStrings(item1.poetryAuthor, item2.poetryAuthor) : res;
    return res;
}

/**
 * Функция сортировки по названию песни.
 */
function nameSort(item1, item2) {
    var res=compareStrings(item1.name, item2.name);
    return res;
}

/**
 * Функция обратной сортировки по названию песни.
 */
function nameSortBack(item1, item2) {
    var res=compareStrings(item2.name, item1.name);
    return res;
}

/**
 * Функция сортировки по автору стихов.
 */
function poetryAuthorSort(item1, item2) {
    var res=compareStrings(item1.poetryAuthor, item2.poetryAuthor);
    res = res==0 ? compareStrings(item1.name, item2.name) : res;
    return res;
}

/**
 * Функция обратной сортировки по автору стихов.
 */
function poetryAuthorSortBack(item1, item2) {
    var res=compareStrings(item2.poetryAuthor, item1.poetryAuthor);
    res = res==0 ? compareStrings(item1.name, item2.name) : res;
    return res;
}


/**
 * Убирает все сортировочные стрелочки, устанавивая стиль display: none.
 */
function hideArrows() {
    var ids=["year", "name", "poetry_author"];
    for(var i=0; i<ids.length; i++) {
        document.getElementById(ids[i]+"_up").style.display='none';
        document.getElementById(ids[i]+"_down").style.display='none';
    }
}
/**
 * В зависимости от функции сортировки и направления сортировки делает видимой соответствующую стрелочку.
 */
function displayArrows(sortFunct, reverse) {
    var arrowId='';
    if(sortFunct==yearSort || sortFunct==yearSortBack) {
        arrowId="year";
    } else if(sortFunct==nameSort || sortFunct==nameSortBack) {
        arrowId="name";
    } else if(sortFunct==poetryAuthorSort || sortFunct==poetryAuthorSortBack) {
        arrowId="poetry_author";
    }

    var arrowUpId=arrowId+'_up';
    var arrowDownId=arrowId+'_down';
    if(reverse) {
        document.getElementById(arrowDownId).style.display='';
    } else {
        document.getElementById(arrowUpId).style.display='';
    }

}

/**
 * Udaljaet child jelementy iz 'song_table_tbody' jelementa i zapolnjaet ego
 * informaciej iz massiva data.
 */
function fillTable() {
    var tbodyEl=document.getElementById('song_table_tbody');
    removeChildrenFromNode(tbodyEl);
    for(var i=0; i<data.length; i++) {
        var trEl=buildTrEl(data[i], i%2+1);
        tbodyEl.appendChild(trEl);
    }
}

function buildTrEl(item, rowClass) {
    var tr=document.createElement('tr');
    tr.className='row'+rowClass;

    var yearTd=document.createElement('td');
    yearTd.className="year_col";
    tr.appendChild(yearTd);
    var yearText=document.createTextNode(item.year);
    yearTd.appendChild(yearText);

    var nameTd=document.createElement('td');
    nameTd.className="name_col";
    tr.appendChild(nameTd);
    //nameTd.appendChild(document.createTextNode(insertBR(item.name)));
    nameTd.innerHTML=item.name;

    var poetryAuthorTd=document.createElement('td');
    poetryAuthorTd.className="poetry_author_col";
    tr.appendChild(poetryAuthorTd);
    //poetryAuthorTd.appendChild(document.createTextNode(insertBR2(item.poetryAuthor)));
    poetryAuthorTd.innerHTML=item.poetryAuthor;

    tr.appendChild(buildVideoTdEl(item));

    return tr;
}
function buildIconTdEl(href, img, tdClass, imgClass) {
    var tdEl=document.createElement('td');
    tdEl.className=tdClass;
    if(href!=undefined && href!='') {
        var aEl=document.createElement('a');
        aEl.setAttribute('href', href);
        var imgEl=document.createElement('img');
        imgEl.setAttribute('src', img);
        imgEl.className=imgClass;
        aEl.appendChild(imgEl);
        tdEl.appendChild(aEl);
    }
    return tdEl;

}
function buildVideoIconTdEl(href, img, tdClass, imgClass) {
    var tdEl=document.createElement('td');
    tdEl.className=tdClass;
    if(href!=undefined && href!='') {
        var aEl=document.createElement('a');
        aEl.setAttribute('href', href);
        aEl.setAttribute('rel', 'shadowbox;width=877;height=525');
        var imgEl=document.createElement('img');
        imgEl.setAttribute('src', img);
        imgEl.className=imgClass;
        aEl.appendChild(imgEl);
        tdEl.appendChild(aEl);
    }
    return tdEl;

}

function buildVideoTdEl(item) {
    return buildVideoIconTdEl(item.videoUrl, 'http://www.nikitin.tv/video/images/video.gif', 'video_col', 'video_img');
}

function openVideo(url) {
    window.open(url,"Video3","left=400,top=235,width=690,height=572,menubar=no,status=no,scrollbars=no,toolbar=no,location=no,directories=no,resizable=no,fullscreen=no");
}

function removeChildrenFromNode(node) {
    if(node != undefined && node != null) {
        while (node.hasChildNodes()) {
            node.removeChild(node.firstChild);
        }
    }
}

