/**
 * Makes an ajax request to the server
 * Requests possible transactions
 */

function parse() {
    
    var text = $('#transaktioner').val();
    text = escape(text);
    $('#transaktioner').hide();
    $('#parseContainer').hide();
    $('#parse, #parseLabel').hide();

    var bankAccount = $('#bankaccount').val();
   
    $.ajax({
        type: "POST",
        url: "/api/parse/account/" + bankAccount + "/format/json",
        data: {
            trans: text
        },
        success: function (data) {

            if (data === '-1') {
                parseMessage("parseError");
                $('.inputPadder label').hide();
                $('#bankaccount').hide();
                
                return false;
            }

            if (data === '-2') {
                parseMessage("parseError");
                $('.inputPadder label').hide();
                $('#bankaccount').hide();
                return false;
            }
            //132
            //else display message
            handleParsedInputs(data);
            return true;
        }
    });
}

function addInput(input) {

    var row = $(input).parent().parent();

    //fetch real transaction        
    var id = row.attr("id");

    var trans = getTransaction(id);

    trans.setName(row.find('[name=name]').val());
    trans.setAmount(row.find('[name=amount]').val());
    trans.setDate(row.find('[name=date]').val());
    trans.setDescription(row.find('[name=description]').val());
    trans.setCategory(row.find('[name=category]').val());


    //make ajax request
    $.ajax({
        type: "POST",
        url: "/api/transaction/format/json",
        data: trans.getJSON(),
        dataType: "script",
        success: function (msg) {
            $(input).parent().parent().fadeOut();
            message(trans.getName() + " har lagts till", "success");
            setTimeout('manageLastInput()', 2000);
        }
    });
}

function deleteInput(input) {
    var row = $(input).parent().parent();

    //fetch real transaction        
    var id = row.attr("id");
    var trans = getTransaction(id);
    //make ajax request
    $.ajax({
        type: "POST",
        url: "/api/block/format/json",
        data: trans.getJSON(),
        dataType: "script",
        success: function (msg) {
            $(input).parent().parent().fadeOut();
            message(trans.getName() + " har tagits bort", "success");
            
            setTimeout('manageLastInput()', 2000);
        }
    });
}

function addAllCategorised() {

    var trans = $('.inputTable tbody tr');
    var categorized = Array();
    
    var haveCategorized = false;
    // find all categorized and create transaction objects 
    (trans).each(function () {
        if ($(this).find('select').val() !== 'Ingen kategori') {

            if ($(this).is(':visible')) {
                
                haveCategorized = true;
                //fetch real transaction        
                var id = $(this).attr("id");
                var temp = getTransaction(id);

                temp.setName($(this).find('[name=name]').val());
                temp.setAmount($(this).find('[name=amount]').val());
                temp.setDate($(this).find('[name=date]').val());
                temp.setDescription($(this).find('[name=description]').val());
                temp.setCategory($(this).find('[name=category]').val());

                categorized.push(temp);
            }
        }
    });

    if(!haveCategorized) {
        message("Inga transaktioner är kategoriserade.", "error");
    }

    // make ajax request for each transaction
    $(categorized).each(function () {

        var id = '#i_' + $(this)[0].getId();
        var row = $(id);
        var name = $(this)[0].getName();

        //make ajax request
        $.ajax({
            type: "POST",
            url: "/api/transaction/format/json",
            data: $(this)[0].getJSON(),
            dataType: "script",
            success: function (msg) {
                row.fadeOut();
                message(name + " har lagts till", "success");
                
                setTimeout('manageLastInput()', 2000);
            }
        });
    });
}



function manageLastInput() {
    
    var visible = false;
    $('.inputTable  tbody tr').each(function () {
        
        if ($(this).is(':visible')) {
            
        
            visible = true;
            return false;
        }
    });
    
    
    if (!visible) {
        $('.inputTable').hide();
        $('#addAll').hide();
        $('#addMore').show();
    }
    
}

function parseDropdownChange(select) {

    // select category value
    var value = $(select).val();

    // the name of the selected/changed transation
    var changedName = $(select).parent().parent().find('input[name=name]').val();

    // loop thru all transactions and see if the match name-wise    
    $('input[name=name]').each(function () {
        if ($(this).val() === changedName) {
            // if we hit we update that select
            $(this).parent().parent().find('select').val(value);
        }
    });
}



function parseMessage(type) {
    var messageText = "";
    var title = "";

    $('#parseContainer').show();

    if (type === "parseError") {
        title = "Oooopps!";
        messageText = "Vi hittade tyvärr inga nya transaktioner. Det kan bero på att du redan har lagt in de här transaktionerna. Eller att det var fel format på de transaktioner du klistrade in.<br/> Var vänlig <a href\"/parse\">försök igen</a>";
    }

    $('#parseMessage').html('<h3>' + title + '</h3>' + '<p>' + messageText + '</p>').show();

}



function compareAndDisplay(dataTrans) {

    //parse json only if we have a valid json response
    if (dataTrans == "-1") {

    } else {
        storage.transactions = parseJsonInput(dataTrans);
    }
    
    if(storage.transactions !== undefined) {
        handleLikelyCategories(storage.inputs, storage.transactions);
    }
    
    renderInputs(storage.inputs);
    

    renderQuickAddCategory();
    
    displayAccount();
}

function displayAccount() {
    
    var account = $('select[name=bankaccount] option:selected').html();
    
    var html = "<label>Konto: </label>"+ account;
    
    var url = "/parse/index/"+ $('#bankaccount').val();
    
    $('#addMore > a').attr('href', url)
    
    
    $('#parseContainer').before(html);
}

function renderInputs(source) {
    //sort transactions 
    var trans = $(source).sort("date", "asc");
    var html = "";

    $.each(trans, function () {
        html += getInputsTableRow(this);
    });

    header = '<table class="inputTable"><thead><th>Namn</th><th>Belopp</th><th>Datum</th><th>Beskrivning</th><th>Kategori</th><th>Action</th></thead>';
    header += '<tbody>';

    footer = '</tbody></table>';
    
    var all = '<a href="#" class="awesome button red" id="addAll" style="float:right; margin-top: 15px;">Lägg in alla kategoriserade transkationer</a><div class="clear"></div>';
    
    //211
    $("#container").append(header + html + footer + all);
}



function renderQuickAddCategory() {
    var html = '';
    var categorymodel = new Categorymodel();

    // display the form
    html += '<div style="height:20px;"><label style="padding-right: 10px;">Lägg till Kategori</label><input type="text" style="margin-right: 10px;" id="categoryName" name="categoryName"/><a href="#" class="small awesome button" id="addCategoryQuick">Lägg till</a></div><div class="clear">&nbsp;</div>';

    //Handle when user clicks the form
    $('#addCategoryQuick').live('click', function () {
        var catName = $('#categoryName').val();
        var catDesc = null;
        var callback = function (data) {
            if (parseInt(data) === 1) {

                // add went fine
                // add added category to all dropdows
                var dropdowns = $('select[name=category] option:first-child');

                var option = '<option value="' + catName + '">' + catName + '</option>';

                $(dropdowns).each(function () {
                    $(this).before(option);
                });

                $('#categoryName').val("");

                message("Kategorin: " + catName + " har lagts till.", "success");
            } else {
                message(catName + " kunde inte läggas till", "error");
            }

        };

        categorymodel.addCategory(catName, catDesc, callback);
    });

    $('#parseContainer').before(html);
}



function handleParsedInputs(data2) {
    
    var transactionmodel = new Transactionmodel();
    storage.inputs = parseJsonInput(data2);

    transactionmodel.getAllTransactions(function (data) {
        compareAndDisplay(data);
    });
}



function handleLikelyCategories(inputs, transactions) {

    $(transactions).sort("date", "desc");
    

    $.each(inputs, function () {
        var dataName = this.getDataName();

        var category = "";

        $.each(transactions, function () {

            //match against all historic transactions        
            if (dataName == this.getName()) {
                category = this.getCategory();
                return false;
            }
        });


        // No exact match
        if (category == "") {

            $.each(transactions, function () {

                //match against all historic transactions
                if (dataName !== undefined && this.getName() !== undefined) {
                    if (dataName.substring(0, 5) == this.getName().substring(0, 5)) {
                        category = this.getCategory();
                        return false;
                    }
                }
            });
        }

        if (category != "") this.setCategory(category);

    });
    
}



function parseJsonInput(json) {

    var transactions = [];
    $.each(json, function () {
        temp = new Transaction();
        temp.parseJSON(this);
        transactions.push(temp);
    });

    return transactions;
}
