var DIVIDE_ZERO_MSG = 'Division by zero is not allowed';
var MALFORMED_EXPRESSION = 'Malformed expression';
var MALFORMED_EXPRESSION_ERROR = 'unterminated regular expression literal';

var memory = 0.0;
var currency_count = 2;

$(document).ready(function(){window.justLoaded = true;});

//Clear input field
$(document).keydown(function(e){if (e.keyCode == 27) {$('#input_field').val('');}});


onClick = function() {

    window.justLoaded = false;

    if ($('#input_field').val() != DIVIDE_ZERO_MSG &&
        $('#input_field').val() != MALFORMED_EXPRESSION) {
        if ($('#input_field').val() == '0') {
            if (this.value != '.') {
                $('#input_field').val(this.value);
            }
            else {
                $('#input_field').val($('#input_field').val() + '.');
            }
            return;
        }
        var value = $('#input_field').val();
        value += this.value;
        $('#input_field').val(value);
    }
}

onResultBtnClick = function()
{
    var exp = inputCleanUp($('#input_field').val());

    if (exp.indexOf('/0') != -1){$('#input_field').val(DIVIDE_ZERO_MSG);}
    else
    {
        try {$('#input_field').val(eval(exp));}
        catch(error) {$('#input_field').val(MALFORMED_EXPRESSION);}
    }
}

onCBtnClick = function()
{
    window.justLoaded = true;
    $('#input_field').val(0);
}

onCEBtnClick = function() {
    window.justLoaded = true;
    $('#input_field').val(0);
    memory = 0;
}

onMPlusBtnClick = function()
{
    var matches = $('#input_field').val().match(/^-?\d+[\.|\,]?\d+$/);
    if (matches == null)
    {
        memory += eval($('#input_field').val());
    }
    else{memory = $('#input_field').val(); }
}

onMRBtnClick = function() {
    $('#input_field').val(memory);
}

function onKeyPressed(e) {

    var keynum;

    if (window.event) {
        keynum = e.keyCode;
    }
    else if (e.which) {
        keynum = e.which;
    }
    if (keynum == 13) {
        document.getElementById('result').click();
    }
}

bindEventsHandlers = function()
{
    $('#result').bind('click', onResultBtnClick);
    $('.printable').bind('click', onClick);
    $('.b1').bind('click', onMPlusBtnClick);
    $('.b2').bind('click', onMRBtnClick);
    $('.b3').bind('click', onCBtnClick);
    $('.b4').bind('click', onCEBtnClick);
    $('.bc1').bind('click', pi);
    $('.bc3').bind('click', epowpi);
    $('.bc4').bind('click', abs);
    $('.bc9').bind('click', div1x);
    $('.bc11').bind('click', x2);
    $('.bc12').bind('click', pow);
    $('.bc13').bind('click', log10);
    $('.bc14').bind('click', log2);
    $('.bc15').bind('click', lnE);
    $('.bc16').bind('click', exclamation);
    $('.bc20').bind('click', ctg);
    $('#sin').bind('click', tfun);
    $('#cos').bind('click', tfun);
    $('#tan').bind('click', tfun);
    $('#sinh').bind('click', tfun);
    $('#cosh').bind('click', tfun);
    $('#tanh').bind('click', tfun);
    $('.bc23').bind('click', tfun);
    $('.bc24').bind('click', rand);
    $('.bc25').bind('click', minus);
    $('.bc27').bind('click', lrb);
    $('.bc28').bind('click', rrb);
}


/*Posts form's data to the server.*/

run = function()
{

    var minAmmount = 1000;

    if (($('#ammount').val() < minAmmount || $('#ammount').val() == "") || $('#rate').val() <= 0) {
        $('.warning').css('display', 'block');
    }
    else {
        $('.warning').css('display', 'none');
        $.ajax({
            url: 'index.php',
            type: 'post',
            data: $('#actionForm').serialize(),
            dataType: 'json',
            success: processCalculatedData
        });
    }
}

/*Process server's response.*/

processCalculatedData = function(data) {

    $("#enter_block").css('display', 'none');
    $(".result_cont").slideDown('slow');
    $('#result_ammount').text('$' + $('#ammount').val());
    $('#result_rate').text($('#rate').val() + "%");

    var payments = [];
    var percents = [];
    var options = [];

    for (var i = 0; i < data.result.length; i++) {
        payments.push(Math.floor(data.result[i].payment));
        percents.push(Math.floor(data.result[i].percent));
    }

    options.push({
        name: 'Payments',
        data: payments
    });

    createPaymentsChart(options);

    options.pop();
    options.push({
        name: 'Percents',
        data: percents
    });

    createPercentsChart(options);
}

/**
 *  Calculate credit again
 */

runAgain = function() {
    $('.result_cont').slideUp();
    $("#enter_block").css('display', 'block');
    $('#enter_block').slideDown();
}

/*Calculations*/

x2 = function() {
    var value = eval(inputCleanUp($('#input_field').val()));
    $('#input_field').val(Math.pow(value, 2));
}

sqrt = function(x) {
    $('#input_field').val(Math.sqrt(x));
}

tfun = function(operation)
{
    var value = $('#input_field').val();
    var exp = operation.currentTarget.id;
    if (window.justLoaded)
    {
        //$('#input_field').val(operation.currentTarget.id);
        //var value = $('#input_field').val();
        //var exp = operation.currentTarget.id;
        //alert(exp);
        switch(true)
        {
            case exp == 'cosh': answ = cosh(value); break;
            case exp == 'sinh':answ = sinh(value); break;
            case exp == 'tanh':answ = tanh(value); break;
            default:answ = Math[exp](value); break;
        }
        $("#input_field").val(answ);
        window.justLoaded = false


        /*
         if(exp == 'sinh'){answ = sinh(value);}
         if(exp == 'cosh'){answ = cosh(value);}
         if(exp == 'tanh'){answ = tanh(value);}
         else {answ = Math[exp](value);}
         $("#input_field").val(answ);*/
        //window.justLoaded = false;
    }
    else
    {
        //var value = $('#input_field').val();
        //$('#input_field').val($('#input_field').val() + operation.currentTarget.id);
        //var exp = operation.currentTarget.id;
        //if(exp == 'sinh'){answ = sinh(value);}
        //if(exp == 'cosh'){answ = cosh(value);}
        //if(exp == 'tanh'){answ = tanh(value);}
        //else {answ = Math[exp](value);}
        //var answ = Math[exp](value);
        // console.log(a);
        //$("#input_field").val(answ);
        switch(true)
        {
            case exp == 'cosh': answ = cosh(value); break;
            case exp == 'sinh':answ = sinh(value); break;
            case exp == 'tanh':answ = tanh(value);  break;
            case exp == 'lg2':answ = lg2(value); break;
            default:answ = Math[exp](value); break;
        }
        $("#input_field").val(answ);
    }
}

bodyMassIndex = function(height, weight, result_container)
{
    //var index = parseFloat(weight) / Math.pow(parseFloat(height) / 100, 2);
    //$(result_container).html(index.toFixed(1));
    //$('.result').css('display', 'block');

    if($("input[name='measuresystem']:checked").val() == 'measure_si')
    {
        var index = parseFloat(weight) / Math.pow(parseFloat(height) / 100, 2);
        $(result_container).html(index.toFixed(1));
        $('.result').css('display', 'block');
    }
    else
    {
        var index = parseFloat(weight * 453.59237 / 1000) / Math.pow(parseFloat(height * 30.48) / 100, 2);
        $(result_container).html(index.toFixed(1));
        $('.result').css('display', 'block');
    }


    //console.log($("input[name='measuresystem']:checked").val());

}

minus = function() {$('#input_field').val('–(' + $('#input_field').val() + ')');}
sinh = function(x) {return (Math.pow(Math.E, x) - Math.pow(Math.E, -x)) / 2;}
cosh = function(x) {return (Math.pow(Math.E, x) + Math.pow(Math.E, -x)) / 2;}
tanh = function(x) {return sinh(x) / cosh(x);}

log = function(x)
{
    /*    $('#input_field').val('log');

     var res = 0;
     var exp = 'log';
     var answ = Math[exp](res);
     $("#input_field").val(answ);

     */


    return Math.log(x) / Math.log(10);
}

ln = function(x)
{
    return Math.log(x);
}

log10 = function()
{
    if (window.justLoaded)
    {
        //$('#input_field').val('log');

        var x = $('#input_field').val();
        var answ = Math.log(x) / Math.log(10);
        $("#input_field").val(answ);

        window.justLoaded = false;

    }
    else
    {
        var value = $('#input_field').val();
        var answ = Math.log(value) / Math.log(10);
        $("#input_field").val(answ);
        // $('#input_field').val(value + 'log');
    }
}

log2 = function()
{
    if (window.justLoaded)
    {
        //$('#input_field').val('lg2');
        var value = $('#input_field').val();
        var answ = lg2(value);
        $("#input_field").val(answ);
        window.justLoaded = false;
    }
    else
    {
        //var value = $('#input_field').val();
        //$('#input_field').val(value + 'lg2');
        var value = $('#input_field').val();
        var answ = lg2(value);
        $("#input_field").val(answ);
    }
}

lg2 = function(x){return Math.log(x) / Math.log(2);}

lnE = function()
{
    if (window.justLoaded)
    {
        //$('#input_field').val('ln');
        var value = $('#input_field').val();
        var answ = ln(value);
        $("#input_field").val(answ);
    }
    else
    {
        //var value = $('#input_field').val();
        //$('#input_field').val(value + 'ln');
        var value = $('#input_field').val();
        var answ = ln(value);
        $("#input_field").val(answ);
    }
}

abs = function()
{
    if (window.justLoaded)
    {
        //$('#input_field').val('abs');
        var value = $('#input_field').val();
        value = addbits(value);
        var answ = Math.abs(value);
        $("#input_field").val(answ);
    }
    else
    {
        //$('#input_field').val(value + 'abs');
        var value = $('#input_field').val();
        value = addbits(value);
        var answ = Math.abs(value);
        $("#input_field").val(answ);
    }
}

ctg = function()
{
    if (window.justLoaded)
    {
        //$('#input_field').val('ctg');
        var value = $('#input_field').val();
        var answ = Math.cos(value)/Math.sin(value)
        $("#input_field").val(answ);
    }
    else
    {
        //var value = $('#input_field').val();
        //$('#input_field').val(value + 'ctg');
        var value = $('#input_field').val();
        var answ = Math.cos(value)/Math.sin(value)
        $("#input_field").val(answ);
    }
}

div1x = function()
{
    if (window.justLoaded) {
        $('#input_field').val('1/()');
    }
    else
    {
        var value = $('#input_field').val();
        $('#input_field').val('1/(' + value + ')');
    }
}

rand = function()
{
    if (window.justLoaded)
    {
        //$('#input_field').val('rand');
        var value = $('#input_field').val();
        var answ = Math.random();
        $("#input_field").val(answ);
    }
    else
    {
        //var value = $('#input_field').val();
        //$('#input_field').val(value + 'rand');
        var value = $('#input_field').val();
        var answ = Math.random();
        $("#input_field").val(answ);
    }
}

exponenta = function() {
    if (window.justLoaded) {
        $('#input_field').val(Math.E.toFixed(9));
    }
    else {
        var value = $('#input_field').val();
        $('#input_field').val(value + Math.E.toFixed(9));
    }
}

pow = function() {
    $('#input_field').val($('#input_field').val() + '^');
}

epowpi = function() {
    if (window.justLoaded) {
        $('#input_field').val(Math.pow(Math.E, Math.PI));
    }
    else {
        var value = $('#input_field').val();
        $('#input_field').val(value + Math.pow(Math.E, Math.PI));
    }
}

pi = function() {
    if (window.justLoaded) {
        $('#input_field').val(Math.PI);
    }
    else {
        var value = $('#input_field').val();
        $('#input_field').val(value + Math.PI);
    }
}

lrb = function() {
    $('#input_field').val($('#input_field').val() + '(');
}

rrb = function() {
    $('#input_field').val($('#input_field').val() + ')');
}

exclamation = function()
{
    //$('#input_field').val($('#input_field').val() + '!');
    var value = $('#input_field').val();
    var answ = factorial(value)
    $("#input_field").val(answ);
}


factorial = function(n)
{
    if (n == 0 || n == 1) return 1;
    return n * factorial(n - 1);
}






addkline = function() {
    var klines = $('.kline');
    var selects = $('select');
    var line = $(klines[klines.length - 1]).clone();

    /*$(line).children()[0].children[0].value = selects[selects.length - 1].value;
     $($(line).children()[0].children[0]).attr('id', ++currency_count);
     $($(line).children()[1].children).attr('id', 'inpt' + currency_count);*/

    line.insertBefore('.add');

    /*$.each($('select'), function() {
     $(this).bind('change', function() {
     getRates($('#from').val(), $('#' + this.id).val(), $('#fc').val(), '#inpt' + this.id);
     });
     });*/
}

deleteline = function(e) {
    var selects = $('select');
    if (selects.length > 2) {
        $(e.currentTarget).parent().remove();
    }
}

convert = function(notation)
{

    var value;

    if ($('#dec').attr('checked') == true) {
        value = eval($('#input_field').val());
        $('#input_field').val(value.toString(notation));
    }
    else if ($('#oct').attr('checked') == true)
    {
        value =  eval('0' + $('#input_field').val());
        $('#input_field').val(value.toString(notation));
    }
    else if ($('#hex').attr('checked') == true)
    {
        value =  eval('0x' + $('#input_field').val());
        $('#input_field').val(value.toString(notation));
    }
    else if ($('#bin').attr('checked') == true)
    {
        value =  parseInt(eval($('#input_field').val()), 2);
        $('#input_field').val(value.toString(notation));
    }

    checkNumeralSystem(notation);
}

checkNumeralSystem = function(system) {
    if (system == 2) {
        $('#bin').attr('checked', 'true');
    }
    else if (system == 8) {
        $('#oct').attr('checked', 'true');
    }
    else if (system == 10) {
        $('#dec').attr('checked', 'true');
    }
    else if (system == 16) {
        $('#hex').attr('checked', 'true');
    }
}

inputCleanUp = function(inputString) {
    var exp = inputString;

    exp = exp.replace(/x/gi, '*');
    exp = exp.replace(/÷/gi, '/');
    exp = exp.replace(/–/gi, '-');

    exp = exp.replace(/cos\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'Math.cos($1)');
    exp = exp.replace(/sin\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'Math.sin($1)');
    exp = exp.replace(/tan\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'Math.tan($1)');
    exp = exp.replace(/sinh\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'sinh($1)');
    exp = exp.replace(/cosh\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'cosh($1)');
    exp = exp.replace(/tanh\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'tanh($1)');
    exp = exp.replace(/rand/gi, 'Math.random()');
    exp = exp.replace(/(-?\d+\.{0,1}\d*)\^(-?\d+\.{0,1}\d*)+/gi, 'Math.pow(eval($1), eval($2))');
    exp = exp.replace(/(\d)!/, 'factorial($1)');
    exp = exp.replace(/log\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'log($1)');
    exp = exp.replace(/ln\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'ln($1)');
    exp = exp.replace(/lg2\(?(-?\d+\.{0,1}\d*)+\)?/gi, 'lg2($1)');
    exp = exp.replace(/abs\(?(-?\d+\.{0,1}\d*)+\)?/g, 'Math.abs($1)');
    exp = exp.replace(/ctg\(?(-?\d+\.{0,1}\d*)+\)?/g, 'Math.cos($1)/Math.sin($1)');

    return exp;
}



function addbits(s){
    var total= 0, s= s.match(/[+\-]*(\.\d+|\d+(\.\d+)?)/g) || [];
    while(s.length){
        total+= parseFloat(s.shift());
    }
    return total;
}


function sendMail()
{
    $.ajax(
        {
            url: '/makeMail.php',
            data: $('#sendmsg').serialize(),
            type:'POST',
            success:onSuccess,
            dataType:'json'
        });
}
function onSuccess(data)
{
    if (data.result.result)
    {
        //$('#sendmsg .title').hide().html('Message sent').fadeIn();
		$("#output").html('');
		$('.send')[0].reset();
		$(".mark").html('<h2>Message was sent. Thank you.<h2>');
        $('#cpt').attr('src','/capt.php?rnd'+Math.random());
        return false;
    }
    else
    {
        //alert('Some error occurred\n' + data.result.msg);
        $('#output').html('Some error occurred. ' + data.result.msg);
        $('#sendmsg')[0].reset();
        $('#cpt').attr('src','/capt.php?rnd'+Math.random());
        return false;
    }
}


//Image preload
jQuery.preloadImages = function () {
    if (typeof arguments[arguments.length - 1] == 'function') {
        var callback = arguments[arguments.length - 1];
    } else {
        var callback = false;
    }
    if (typeof arguments[0] == 'object') {
        var images = arguments[0];
        var n = images.length;
    } else {
        var images = arguments;
        var n = images.length - 1;
    }
    var not_loaded = n;
    for (var i = 0; i < n; i++) {
        jQuery(new Image()).attr('src', images[i]).load(function() {
            if (--not_loaded < 1 && typeof callback == 'function') {
                callback();
            }
        });
    }
}
