function number_format (number, decimals, dec_point, thousands_sep) {
    number = (number + '').replace(',', '').replace(' ', '');
    var n = !isFinite(+number) ? 0 : +number,
        prec = !isFinite(+decimals) ? 0 : Math.abs(decimals),
        sep = (typeof thousands_sep === 'undefined') ? ',' : thousands_sep,
        dec = (typeof dec_point === 'undefined') ? '.' : dec_point,
        s = '',
        toFixedFix = function (n, prec) {
            var k = Math.pow(10, prec);
            return '' + Math.round(n * k) / k;
        };
    // Fix for IE parseFloat(0.55).toFixed(0) = 0;
    s = (prec ? toFixedFix(n, prec) : '' + Math.round(n)).split('.');
    if (s[0].length > 3) {
        s[0] = s[0].replace(/\B(?=(?:\d{3})+(?!\d))/g, sep);
    }
    if ((s[1] || '').length < prec) {
        s[1] = s[1] || '';
        s[1] += new Array(prec - s[1].length + 1).join('0');
    }
    return s.join(dec);
}


$(function() {
    var new_word = '<li class="ui-state-default"><span class="ui-icon ui-icon-arrowthick-2-n-s"></span>word</li>';
    var word, wordlists, dt, est, options, tlds, use_english, use_hypens, template, loading, denied, avg=1;

    dt = $('#domaintable');
    est = $('#est');
    word = $('#word');
    wordlists = $('#word_groups ul');
    options = $('#options');
    tlds = $('#tlds input');
    use_english = $('#use_english input');
    use_hypens = $('#use_hypens input');
    
    template = '<table cellspacing="0" cellpadding="0" class="max">\
          <thead><tr>\
              <th class="left">Kifejezés</th>\
              {th}\
          </tr></thead>\
          <tfoot><tr class="strong">\
              <td class="left">Összeg<sup>*</sup></td>\
              <td id="price" colspan="{colspan}">0 Ft</td>\
          </tr></tfoot>\
          <tbody>\
              {tbody}\
          </tbody>\
      </table>';
    loading = '<p class="loading"><img src="/images/domain/ajax-loader.gif"></p>';
    denied = '<p class="loading">A szerver megtagadta a kiszolgálást, valószínűleg túl sok domain variációt próbált ki a közelmúltban. Kérjük, térjen vissza később!</p>';


    function addWord() {
        var w = word;
        var val = word.val();

        if (val) {
            var arr = val.toLowerCase().split(' ');
            for (x in arr) {
                var li = new_word.replace(/word/, arr[x]);
                wordlists.eq(0).append(li);
            }
            w.val('');
        }
        estimate();

        return false;
    }

    function searchDomains() {
        var post = {};

        if (!estimate(true)) {
            return false;
        }
        
        dt.html(loading);

        wordlists.each(function(i){
            var k = 'group'+i;
            post[k] = new Array();
            $(this).children().each(function(j){
                post[k][j] = $(this).text();
            })
        });

        post['use_english'] = use_english.filter(':checked').val();
        post['use_hypens'] = use_hypens.filter(':checked').val();
        post['tlds'] = [];
        tlds.filter(':checked').each(function(){
            post['tlds'].push($(this).val());
        });

        $.post(site_url + 'domain/ajax', post, recieveDomains, 'json');

        return false;
    }

    function estimate(check) {
        var template = 'Várható betöltési idő {x}-{y} másodperc.', x = 0, ch = (check == true);

        wordlists.each(function(i){
            var children = $(this).children().length;
            if (children > 0) {
                if (x==0 ) {
                    x = children;
                } else {
                    x *= children;
                }
            }
        });

        if (x==0) {
            est.html( 'Nincs domain megadvat.' );
            if (ch) return false;
        }

        x *= use_english.filter(':checked').val()=="2" ? 2 : 1;
        x *= use_hypens.filter(':checked').val()=="2" ? 2 : 1;
        x *= tlds.filter(':checked').length;

        if (x>250) {
            est.html( 'Túl sok variáció van kijelölve, kérem csökkentse a lehetőségek számát.' );
            if (ch) return false;
        } else {
            x = avg * x;
            est.html( template.replace('{x}', Math.floor(x*0.7)).replace('{y}', Math.ceil(x*1.6)) );
            if (ch) return true;
        }
    }

    function fastSearch() {

        wordlists.empty();
        dt.html(loading);
        addWord();
        searchDomains();
        word.val('');

        return false;
    }

    function deleteSearch() {
        clearSearch();

        return false;
    }

    function clearSearch() {
        word.val('');
        wordlists.empty();
        dt.empty();
    }

    function recieveDomains(data) {
        var table, tbody = '', th = '', inp, domains, tlds, base, tld, ch;

        if (data==false) {
            dt.html(denied);
            return;
        }

        domains = data[0];
        tlds = data[1];

        for (base in domains) {
            tbody += '<tr><td class="left">' + base + '</td>';
            for (tld in domains[base]) {
                if (domains[base][tld][0]==true) {
                    inp = '<span class="input"></span><input type="checkbox" name="domain[]" value="' + base + tld + '" data-price="'+domains[base][tld][1]+'" />';
                } else {
                    //inp = '<img src="/images/domain/dst_x.jpg" />';
                    inp = tld=='.hu'
                        ?'<a href="http://www.domain.hu/domain/domainsearch/whois.html?domain=' + domains[base][tld][2] + '&ekes=' + base + tld + '" target="_blank">whois?</a>'
                        :'<a href="http://www.whois.net/whois/' + domains[base][tld][2] + '" target="_blank">whois?</a>';
                }

                tbody += '<td class="center">' + inp + '</td>';
            }
            tbody += '</tr>';
        }
        for (var i=0; i<tlds.length; i++) {
            th += '<th>' + tlds[i].toUpperCase() + '</th>';
        }

        table = template
            .replace('{tbody}', tbody)
            .replace('{th}', th)
            .replace('{run}', data[2])
            .replace('{avg}', data[3])
            .replace(/{colspan}/g, tlds.length);
        
        dt.html(table);
        ch = $('.input', dt).each(function(){
            var $this = $(this);
            var $next = $this.next();
            $this
                .data('next', $next)
                .data('price', parseInt($next.attr('data-price')))
                .data('sel', false);
        });

        $('#price').html('0 Ft + Áfa').data('price', 0);

        avg = data[3];

        ch.data('ch', ch).click(calcPrice);

        est.html( '' );
    }

    function calcPrice(){
        var $price = $('#price'), $this = $(this), sel = !$this.data('sel'), price = $price.data('price');

        if (sel) {
            price += $this.data('price');
        } else {
            price -= $this.data('price');
        }
        $this.data('sel', sel);
        $this.toggleClass('checked', sel);
        $this.data('next').click();

        $('#price').html(number_format(price, 0, ',', '.') + ' Ft + ÁFA').data('price', price);
    }

    wordlists
        .sortable({
            connectWith: wordlists,
            stop: estimate
        })
        .disableSelection();

    $('#add').click(addWord);
    $('#search').click(searchDomains);
    $('#fastsearch').click(fastSearch);
    $('#delete').click(deleteSearch);

    use_hypens.change(estimate);
    use_english.change(estimate);
    tlds.change(estimate);

    $('h2', options).click(function(){$('.fieldsets', options).toggle()});
});

