/* vim: set expandtab sw=4 ts=4 sts=4: */
/**
 * for server_synchronize.php 
 *
 */

// Global variable row_class is set to even
var row_class = 'even';

/**
* Generates a row dynamically in the differences table displaying
* the complete statistics of difference in  table like number of
* rows to be updated, number of rows to be inserted, number of
* columns to be added, number of columns to be removed, etc.
*
* @param  index         index of matching table
* @param  update_size   number of rows/column to be updated
* @param  insert_size   number of rows/coulmns to be inserted
* @param  remove_size   number of columns to be removed
* @param  insert_index  number of indexes to be inserted
* @param  remove_index  number of indexes to be removed
* @param  img_obj       image object
* @param  table_name    name of the table
*/

function showDetails(i, update_size, insert_size, remove_size, insert_index, remove_index, img_obj, table_name)
{
    // a jQuery object
    var $img = $(img_obj);

    $img.toggleClass('selected');

    // The image source is changed when the showDetails function is called.
    if ($img.hasClass('selected')) {
        if ($img.hasClass('struct_img')) {
            $img.attr('src', pmaThemeImage + 'new_struct_selected.jpg');
        }
        if ($img.hasClass('data_img')) {
            $img.attr('src', pmaThemeImage + 'new_data_selected.jpg');
        }
    } else {
        if ($img.hasClass('struct_img')) {
            $img.attr('src', pmaThemeImage + 'new_struct.jpg');
        }
        if ($img.hasClass('data_img')) {
            $img.attr('src', pmaThemeImage + 'new_data.jpg');
        }
    }

    var div = document.getElementById("list");
    var table = div.getElementsByTagName("table")[0];
    var table_body = table.getElementsByTagName("tbody")[0];

    //Global variable row_class is being used
    if (row_class == 'even') {
        row_class = 'odd';
    } else {
        row_class = 'even';
    }
    // If the red or green button against a table name is pressed then append a new row to show the details of differences of this table.
    if ($img.hasClass('selected')) {
        var newRow = document.createElement("tr");
        newRow.setAttribute("class", row_class);
        newRow.className = row_class;
        // Id assigned to this row element is same as the index of this table name in the  matching_tables/source_tables_uncommon array
        newRow.setAttribute("id" , i);

        var table_name_cell = document.createElement("td");
        table_name_cell.align = "center";
        table_name_cell.innerHTML = table_name ;

        newRow.appendChild(table_name_cell);

        var create_table = document.createElement("td");
        create_table.align = "center";

        var add_cols = document.createElement("td");
        add_cols.align = "center";

        var remove_cols = document.createElement("td");
        remove_cols.align = "center";

        var alter_cols = document.createElement("td");
        alter_cols.align = "center";

        var add_index = document.createElement("td");
        add_index.align = "center";

        var delete_index = document.createElement("td");
        delete_index.align = "center";

        var update_rows = document.createElement("td");
        update_rows.align = "center";

        var insert_rows = document.createElement("td");
        insert_rows.align = "center";

        var tick_image = document.createElement("img");
        tick_image.src = pmaThemeImage + "s_success.png";

        if (update_size == '' && insert_size == '' && remove_size == '') {
          /**
          This is the case when the table needs to be created in target database.
          */
            create_table.appendChild(tick_image);
            add_cols.innerHTML = "--";
            remove_cols.innerHTML = "--";
            alter_cols.innerHTML = "--";
            delete_index.innerHTML = "--";
            add_index.innerHTML = "--";
            update_rows.innerHTML = "--";
            insert_rows.innerHTML = "--";

            newRow.appendChild(create_table);
            newRow.appendChild(add_cols);
            newRow.appendChild(remove_cols);
            newRow.appendChild(alter_cols);
            newRow.appendChild(delete_index);
            newRow.appendChild(add_index);
            newRow.appendChild(update_rows);
            newRow.appendChild(insert_rows);

        } else if (update_size == '' && remove_size == '') {
           /**
           This is the case when data difference is displayed in the
           table which is present in source but absent from target database
          */
            create_table.innerHTML = "--";
            add_cols.innerHTML = "--";
            remove_cols.innerHTML = "--";
            alter_cols.innerHTML = "--";
            add_index.innerHTML = "--";
            delete_index.innerHTML = "--";
            update_rows.innerHTML = "--";
            insert_rows.innerHTML = insert_size;

            newRow.appendChild(create_table);
            newRow.appendChild(add_cols);
            newRow.appendChild(remove_cols);
            newRow.appendChild(alter_cols);
            newRow.appendChild(delete_index);
            newRow.appendChild(add_index);
            newRow.appendChild(update_rows);
            newRow.appendChild(insert_rows);

        } else if (remove_size == '') {
            /**
             This is the case when data difference between matching_tables is displayed.
            */
            create_table.innerHTML = "--";
            add_cols.innerHTML = "--";
            remove_cols.innerHTML = "--";
            alter_cols.innerHTML = "--";
            add_index.innerHTML = "--";
            delete_index.innerHTML = "--";
            update_rows.innerHTML = update_size;
            insert_rows.innerHTML = insert_size;

            newRow.appendChild(create_table);
            newRow.appendChild(add_cols);
            newRow.appendChild(remove_cols);
            newRow.appendChild(alter_cols);
            newRow.appendChild(delete_index);
            newRow.appendChild(add_index);
            newRow.appendChild(update_rows);
            newRow.appendChild(insert_rows);

        } else {
            /**
            This is the case when structure difference between matching_tables id displayed
            */
            create_table.innerHTML = "--";
            add_cols.innerHTML = insert_size;
            remove_cols.innerHTML = remove_size;
            alter_cols.innerHTML = update_size;
            delete_index.innerHTML = remove_index;
            add_index.innerHTML = insert_index;
            update_rows.innerHTML = "--";
            insert_rows.innerHTML = "--";

            newRow.appendChild(create_table);
            newRow.appendChild(add_cols);
            newRow.appendChild(remove_cols);
            newRow.appendChild(alter_cols);
            newRow.appendChild(delete_index);
            newRow.appendChild(add_index);
            newRow.appendChild(update_rows);
            newRow.appendChild(insert_rows);
        }
        table_body.appendChild(newRow);

    } else {
      //The case when the row showing the details need to be removed from the table i.e. the difference button is deselected now.
        var table_rows = table_body.getElementsByTagName("tr");
        var j;
        var index = 0;
        for (j=0; j < table_rows.length; j++)
        {
            if (table_rows[j].id == i) {
                index = j;
                table_rows[j].parentNode.removeChild(table_rows[j]);
            }
        }
        //The table row css is being adjusted. Class "odd" for odd rows and "even" for even rows should be maintained.
        for(index = 0; index < table_rows.length; index++)
        {
            row_class_element = table_rows[index].getAttribute('class');
            if (row_class_element == "even") {
                table_rows[index].setAttribute("class","odd");  // for Mozilla firefox
                table_rows[index].className = "odd";            // for IE browser
            } else {
                table_rows[index].setAttribute("class","even"); // for Mozilla firefox
                table_rows[index].className = "even";           // for IE browser
            }
        }
    }
}

/**
 * Generates the URL containing the list of selected table ids for synchronization and
 * a variable checked for confirmation of deleting previous rows from target tables
 *
 * @param   token   the token generated for each PMA form
 *
 */
function ApplySelectedChanges(token)
{
    var div =  document.getElementById("list");
    var table = div.getElementsByTagName('table')[0];
    var table_body = table.getElementsByTagName('tbody')[0];
    // Get all the rows from the details table
    var table_rows = table_body.getElementsByTagName('tr');
    var x = table_rows.length;
    var i;
    /**
     Append the token at the beginning of the query string followed by
    Table_ids that shows that "Apply Selected Changes" button is pressed
    */
    var append_string = "?token="+token+"&Table_ids="+1;
    for(i=0; i<x; i++){
           append_string += "&";
           append_string += i+"="+table_rows[i].id;
    }

    // Getting the value of checkbox delete_rows
    var checkbox = document.getElementById("delete_rows");
    if (checkbox.checked){
        append_string += "&checked=true";
    } else {
         append_string += "&checked=false";
    }
    //Appending the token and list of table ids in the URL
    location.href += token;
    location.href += append_string;
}


/**
 * Validates a partial form (source part or target part) 
 *
 * @param   which   'src' or 'trg' 
 * @return  boolean  whether the partial form is valid 
 *
 */
function validateSourceOrTarget(which) 
{
    var partial_form_is_ok = true;

    if ($("#" + which + "_type").val() != 'cur') {
        // did not choose "current connection"
        if ($("input[name='" + which + "_username']").val() == ''
            || $("input[name='" + which + "_pass']").val() == ''
            || $("input[name='" + which + "_db']").val() == ''
            // must have at least a host or a socket
            || ($("input[name='" + which + "_host']").val() == ''
                && $("input[name='" + which + "_socket']").val() == '')    
            // port can be empty
                ) {
            partial_form_is_ok = false; 
        }
    }
    return partial_form_is_ok;
} 
/**
* Displays an error message if any text field
* is left empty other than the port field, unless
* we are dealing with the "current connection" choice
*
* @return  boolean  whether the form is valid 
*/
function validateConnectionParams()
{
    var form_is_ok = true;

    if (! validateSourceOrTarget('src') || ! validateSourceOrTarget('trg')) {
        form_is_ok = false;
    }
    if (! form_is_ok) {
        alert(PMA_messages['strFormEmpty']);
    }
    return form_is_ok;
}

/**
 * Handles the dynamic display of form fields related to a server selector
 */

function hideOrDisplayServerFields($server_selector, selected_option)
{
    $tbody = $server_selector.closest('tbody');
    if (selected_option == 'cur') {
        $tbody.children('.current-server').css('display', '');
        $tbody.children('.remote-server').css('display', 'none');
    } else if (selected_option == 'rmt') {
        $tbody.children('.current-server').css('display', 'none');
        $tbody.children('.remote-server').css('display', '');
    } else {
        $tbody.children('.current-server').css('display', 'none');
        $tbody.children('.remote-server').css('display', '');
        var parts = selected_option.split('||||');
        $tbody.find('.server-host').val(parts[0]);
        $tbody.find('.server-port').val(parts[1]);
        $tbody.find('.server-socket').val(parts[2]);
        $tbody.find('.server-user').val(parts[3]);
        $tbody.find('.server-pass').val('');
        $tbody.find('.server-db').val(parts[4])
    }
}

$(document).ready(function() {
    $('.server_selector').change(function(evt) {
        var selected_option = $(evt.target).val();
        hideOrDisplayServerFields($(evt.target), selected_option);
    });

    // initial display of the selectors
    $('.server_selector').each(function() {
        var selected_option = $(this).val();
        hideOrDisplayServerFields($(this), selected_option);
    });

    $('.struct_img').hover( 
        // pmaThemeImage comes from js/messages.php
        function() {
            // mouse enters the element
            var $img = $(this);
            $img.addClass('hover');
            if ($img.hasClass('selected')) {
                $img.attr('src', pmaThemeImage + 'new_struct_selected_hovered.jpg');
            } else {
                $img.attr('src', pmaThemeImage + 'new_struct_hovered.jpg');
            }
        },
        function() {
            // mouse leaves the element
            var $img = $(this);
            $img.removeClass('hover');
            if ($img.hasClass('selected')) {
                $img.attr('src', pmaThemeImage + 'new_struct_selected.jpg');
            } else {
                $img.attr('src', pmaThemeImage + 'new_struct.jpg');
            }
        }
    );

    $('.data_img').hover( 
        function() {
            // mouse enters the element
            var $img = $(this);
            $img.addClass('hover');
            if ($img.hasClass('selected')) {
                $img.attr('src', pmaThemeImage + 'new_data_selected_hovered.jpg');
            } else {
                $img.attr('src', pmaThemeImage + 'new_data_hovered.jpg');
            }
        },
        function() {
            // mouse leaves the element
            var $img = $(this);
            $img.removeClass('hover');
            if ($img.hasClass('selected')) {
                $img.attr('src', pmaThemeImage + 'new_data_selected.jpg');
            } else {
                $img.attr('src', pmaThemeImage + 'new_data.jpg');
            }
        }
    );

    $('#buttonGo').click(function(event) {
        if (! validateConnectionParams()) {
            event.preventDefault();
        }
    });
});
