/**
 * 1st Domains domain search script
 * Created by Chris Noel, Net24 Ltd.
 */

// AJAX ACTIONS ------------------------------------------------------------------------

function validateSearchDomainNames(domain_names)
{
    if(!w3c){return false;}

    var enom_domains = new Array();
    var nzrs_domains = new Array();


    $.post("json_wrapper.php",
        {
            library: "domain_search_manager",
            action:  "validate_search_domain_names",
            search_domains: "'" + domain_names + "'"
        },
        function(data)
        {
            // populate the table
            if (data.response == 1  && data.search_domains.length > 0)
            {
                var results_table = '<table id="results_table" cellspacing="0" cellpadding="0" width="100%;">';
                results_table += '<thead><tr id="tablehead"><th id="col_select"><input type="checkbox" id="checkall_checkbox" disabled="disabled"/></th><th id="col_domain_name">Domain Name</th><th id="col_availability">Availability</th></tr></thead>';
                results_table += '<tbody>';

                searchable_domain_names = '';
                $.each(
                    data.search_domains,
                    function(i,row)
                    {
                        var searchable_domain_name = row.cell[0];
                        searchable_domain_names += searchable_domain_name + "\n";
                        var registry = row.cell[1];
                        var domain_id = searchable_domain_name.replace(/\./g, "_");
                        var table_row = '<tr id="' + domain_id + '"  class="' + ((i%2) ? 'odd' : 'even') + '">';
                        table_row += '<td class="row_checked_domain"><input id="check_' + domain_id + '" class="checked_domains" name="checked_domains[]" value="' + searchable_domain_name + '" type="checkbox" disabled="disabled"/></td>';
                        table_row += '<td class="row_domain_name"><div><label for="check_' + domain_id + '">' + searchable_domain_name + '</label></div></td>';
                        table_row += '<td class="row_availability"><div class="searching_cell">searching...</div></td>';
                        table_row += '</tr>';
                        results_table += table_row;

                        if(registry == 'eNom')
                        {
                            enom_domains.push(searchable_domain_name);
                        }
                        else if(registry == 'NZRS')
                        {
                            nzrs_domains.push(searchable_domain_name);
                        }
                    });
                $('#domain_names').val(searchable_domain_names);

                results_table += '</tbody></table>';

                var register_button_bar_1 = '<div style="background-color:#fff;text-align:center;padding: 3px 0px;" class="maintext"><input type="hidden" name="action" value="register" /><input name="submit" type="submit" class="formbuttons register_submit" disabled="disabled" value="Select a domain name to register" /></div>';
                var search_results_header = '<div id="search_results_header">Search Results:</div>';
                var register_button_bar_2 = '<div style="background-color:#fff;text-align:center;padding: 3px 0px;" class="maintext"><input name="submit" type="submit" class="formbuttons register_submit" disabled="disabled" value="Select a domain name to register" /></div>';
                $('#search_results_block').html(register_button_bar_1 + search_results_header + results_table + register_button_bar_2);

                // bind checkbox actions
                $('#checkall_checkbox').click(function()
                {
                        if(this.checked)
                        {
                            var unchecked_inputs = $(".checked_domains:not(:checked)", $("#results_table .available")).get();

                            for(var index in unchecked_inputs)
                            {
                                if(unchecked_inputs.hasOwnProperty(index))
                                {
                                    unchecked_inputs[index].checked = 'checked';
                                }
                            }
                            $('.register_submit').val('Register the selected domain name(s)');
                            $('.register_submit').removeAttr('disabled');
                        }
                        else
                        {
                            var checked_inputs = $(".checked_domains:checked", $("#results_table .available")).get();
                            for(var index in checked_inputs)
                            {
                                if(checked_inputs.hasOwnProperty(index))
                                {
                                    checked_inputs[index].checked = '';
                                }
                            }
                            $('.register_submit').attr('disabled', 'disabled');
                            $('.register_submit').val('Select the domain name(s) you want to register');
                        }
                });

                $('.checked_domains').click(function()
                {
                    if(this.checked && $('.register_submit:disabled'))
                    {
                        $('.register_submit').val('Register the selected domain name(s)');
                        $('.register_submit').removeAttr('disabled');
                    }
                    else
                    {
                        if($(".available .checked_domains:checked").length == 0)
                        {
                            $('.register_submit').attr('disabled', 'disabled');
                            $('.register_submit').val('Select the domain name(s) you want to register');
                            $('#checkall_checkbox').removeAttr('checked');
                        }
                    }
                });

                $('.register_submit').val('Searching, please wait...');

                // Combine and perform the NZRS checks
                // @TODO set a time out either here or at the PHP level
                if(nzrs_domains.length)
                {
                    checkAvailability(nzrs_domains);
                }

                // Combine and perform the ENOM checks
                if(enom_domains.length)
                {
                    checkAvailability(enom_domains);
                }
            }
            else
            {
                $('#tl_search_block').remove();
                $('#domain_names').val('');
            }

            if (!empty(data.errors) && data.errors.length > 0)
            {
                errors = '';
                $.each(
                    data.errors,
                    function(i,error)
                    {
                        errors += buildError(error.cell[0]);
                    });
                displayErrors(errors);
            }

            $('#please_wait').remove();
        },
    "json");
}

function validateSearchCriteria(domain_name, search_tlds)
{
    var enom_domains = new Array();
    var nzrs_domains = new Array();
    var invalid_domains = new Array();

    response = validateDomain(domain_name);

    // then we have an error
    if(response !== true)
    {
        displayErrors(buildError(response));
        $('#search_results_block').remove();
        $('#search_notes').show();
        $('#search_query').val('');
        return false;
    }

    $.post("json_wrapper.php",
        {
            library: "domain_search_manager",
            action:  "validate_search_criteria",
            domain_name: domain_name,
            search_tlds: "'" + search_tlds + "'"
        },
        function(data)
        {
            errors = '';
            messages = '';

            // populate the table
            if (data.response == 1 && data.search_domains.length > 0)
            {
                var results_table = '<table id="results_table" cellspacing="0" cellpadding="0" width="100%;">';
                results_table += '<thead><tr id="tablehead"><th id="col_select"><input type="checkbox" id="checkall_checkbox" disabled="disabled"/></th><th id="col_domain_name">Domain Name</th><th id="col_availability">Availability</th></tr></thead>';
                results_table += '<tbody>';

                $.each(
                    data.search_domains,
                    function(i,row)
                    {
                        var searchable_domain_name = row.cell[0];
                        var registry = row.cell[1];
                        var domain_id = searchable_domain_name.replace(/\./g, "_");
                        var table_row = '<tr id="' + domain_id + '"  class="' + ((i%2) ? 'odd' : 'even') + '">';

                        if(registry == 'invalid')
                        {
                            table_row += '<td class="row_checked_domain"><div class="maintextbold" style="text-align:center;">-</div></td>';
                        }
                        else
                        {
                            table_row += '<td class="row_checked_domain"><input id="check_' + domain_id + '" class="checked_domains" name="checked_domains[]" value="' + searchable_domain_name + '" type="checkbox" disabled="disabled"/></td>';
                        }

                        table_row += '<td class="row_domain_name"><div><label for="check_' + domain_id + '">' + searchable_domain_name + '</label></div></td>';
                        if(registry == 'invalid')
                        {
                            table_row += '<td class="row_availability">Invalid Domain Name</td>';
                        }
                        else
                        {
                            table_row += '<td class="row_availability"><div class="searching_cell">searching...</div></td>';
                        }
                        table_row += '</tr>';
                        results_table += table_row;

                        if(registry == 'eNom')
                        {
                            enom_domains.push(searchable_domain_name);
                        }
                        else if(registry == 'NZRS')
                        {
                            nzrs_domains.push(searchable_domain_name);
                        }
                        else if(registry == 'invalid')
                        {
                            invalid_domains.push(searchable_domain_name);
                        }

                    });

                results_table += '</tbody></table>';
                $('#please_wait').remove();
                var register_button_bar_1 = '<div style="background-color:#fff;text-align:center;padding: 3px 0px;" class="maintext"><input type="hidden" name="action" value="register" /><input name="submit" type="submit" class="formbuttons register_submit" disabled="disabled" value="Select a domain name to register" /></div>';
                var search_results_header = '<div id="search_results_header">Search Results:</div>';
                var register_button_bar_2 = '<div style="background-color:#fff;text-align:center;padding: 3px 0px;" class="maintext"><input name="submit" type="submit" class="formbuttons register_submit" disabled="disabled" value="Select a domain name to register" /></div>';
                $('#search_results_block').html(register_button_bar_1 + search_results_header + results_table + register_button_bar_2);

                // bind checkbox actions
                $('#checkall_checkbox').click(function()
                {
                        if(this.checked)
                        {
                            var unchecked_inputs = $(".checked_domains:not(:checked)", $("#results_table .available")).get();

                            for(var index in unchecked_inputs)
                            {
                                if(unchecked_inputs.hasOwnProperty(index))
                                {
                                    unchecked_inputs[index].checked = 'checked';
                                }
                            }
                            $('.register_submit').val('Register the selected domain name(s)');
                            $('.register_submit').removeAttr('disabled');
                        }
                        else
                        {
                            var checked_inputs = $(".checked_domains:checked", $("#results_table .available")).get();
                            for(var index in checked_inputs)
                            {
                                if(checked_inputs.hasOwnProperty(index))
                                {
                                    checked_inputs[index].checked = '';
                                }
                            }
                            $('.register_submit').attr('disabled', 'disabled');
                            $('.register_submit').val('Select the domain name(s) you want to register');
                        }
                });

                $('.checked_domains').click(function()
                {
                    if(this.checked && $('.register_submit:disabled'))
                    {
                        $('.register_submit').val('Register the selected domain name(s)');
                        $('.register_submit').removeAttr('disabled');
                    }
                    else
                    {
                        if($(".available .checked_domains:checked").length == 0)
                        {
                            $('.register_submit').attr('disabled', 'disabled');
                            $('.register_submit').val('Select the domain name(s) you want to register');
                            $('#checkall_checkbox').removeAttr('checked');
                        }
                    }
                });

                $('.register_submit').val('Searching, please wait...');


                // Combine and perform the NZRS checks
                // @TODO set a time out either here or at the PHP level
                if(nzrs_domains.length)
                {
                    checkAvailability(nzrs_domains);
                }

                // Combine and perform the ENOM checks
                if(enom_domains.length)
                {
                    checkAvailability(enom_domains);
                }

                if(invalid_domains.length)
                {
                    if(!$('.searching_cell').length)
                    {
                        $('.available .checked_domains').removeAttr('disabled');
                        $('.register_submit').val('Select the domain name(s) you want to register');
                    }
                }
            }
            else
            {
                $('#search_results_block').remove();
                $('#search_notes').show();
            }

            if(data.corrected_domain_name !== undefined)
            {
                $('#search_query').val(data.corrected_domain_name);
            }

            if(!empty(data.errors) && data.errors.length > 0)
            {
                $.each(
                    data.errors,
                    function(i,error)
                    {
                        errors += buildError(error.cell[0]);
                    });
                displayErrors(errors);
            }
        },
    "json");
}


function checkAvailability(search_domains)
{
    $.post("json_wrapper.php",
        {
            library: "domain_search_manager",
            action:  "check_availability",
            search_domains: "'" + search_domains + "'"
        },
        function(data)
        {
            if (data.domain_results.length > 0)
            {
                $.each(
                    data.domain_results,
                    function(i,row)
                    {
                        var domain_name = row.cell[0];
                        var availability = row.cell[1];
                        var domain_id = domain_name.replace(/\./g, "_");

                        switch(availability)
                        {
                            case 'available':
                                $('#' + domain_id + ' .row_availability').html('<div><label for="check_' + domain_id + '">Available</label></div>');
                                $('#' + domain_id).addClass('available');
                                break;
                            case 'unavailable':
                                var whois_link = '/info/whois_query.php?domain='+domain_name;
                                $('#' + domain_id + ' .row_availability').html('<div><span>Unavailable</span>&#160;&#160;<a class="whois_query" href="' + whois_link + '" style="font-weight:bold;">whois</a></div>');
                                break;
                            case 'pending_release':
                                var backorder_link = 'http://www.expireddomains.co.nz/' + domain_name;
                                $('#' + domain_id + ' .row_availability').html('<div><span>Pending Release</span>&#160;&#160;<a class="whois_query" href="' + backorder_link + '" style="font-weight:bold;">backorder</a></div>');
                                break;
                            /*
                            case 'transfer':
                                var transfer_link = '/transfer/index.php?domain=' + domain_name + '&action=transfer';
                                $('#' + domain_id + ' .row_availability').html('<div><a href="' + transfer_link + '" target="_blank" style="font-weight:bold;">Transfer to 1st Domains</a></div>');
                                break;
                            */
                            default:
                                $('#' + domain_id + ' .row_availability').html('<div>Possibly Taken</div>');
                                break;
                        }
                    });
            }

            if(!$('.searching_cell').length)
            {
                $('.available .checked_domains').removeAttr('disabled');
                $('.register_submit').val('Select the domain name(s) you want to register');
            }

            // Once we are finished
            if($('.checked_domains:not(:disabled)').length && $('#checkall_checkbox:disabled'))
            {
                $('#checkall_checkbox').removeAttr('disabled');
            }


            // pop up window for whois queries
            $('.whois_query').click(function(e)
            {
                e.preventDefault();
                window.open($(this).attr('href'),'new','width=600,height=600,menubar=no,location=no,resizable=no,scrollbars=yes');
                return false;
            });

        },
        "json");
}

// Function for validating the domain portion of a domain name [this_bit].co.nz
function validateDomain(domain_name)
{
    // check the domain name for bad characters and length
    var allowed_chars = 'a-zA-Z0-9\.\-';
    var min_length = 1;
    var max_length = 100;

    // clean up the form if the error block is present
    var error = '';

    if(min_length && (domain_name.length < min_length))
    {
        error = 'Your desired domain name must be at least ' + min_length + ' chars long.';
    }
    else if(max_length && (domain_name.length > max_length))
    {
        error = 'Your desired domain name must be less than ' + max_lengh + ' chars long.';
    }
    else if(domain_name.charAt(0) == '-')
    {
        error = 'Your desired domain name cannot begin with a <span class="bold">-</span> character.';
    }
    else if(domain_name.charAt(-1) == '-')
    {
        error = 'Your desired domain name cannot end with a <span class="bold">-</span> character.';
    }
    else
    {
        // Report back any characters that are NOT allowed
        var check = new RegExp("[^" + regexEscape(allowed_chars) + "]", "gi");
        var matches = domain_name.match(check);

        if (matches && matches.length)
        {
            var match_string = '';
            var start = true;

            for (var match in matches)
            {
                if(is_numeric(match))
                {
                    if(matches.hasOwnProperty(match))
                    {
                        if (match_string.indexOf(matches[match]) == -1)
                        {
                            if(start) start = false;
                            else match_string += ' or ';

                            var bad_char = (matches[match] == ' ') ? 'space' : matches[match];

                            match_string += '<span class="bold">' + bad_char + '</span>';
                        }
                    }
                }
            }
            error = 'Your desired domain name cannot contain ' + match_string + ' characters.';
        }
    }

    if(error)
    {
        return error;
    }
    else
    {
        return true;
    }
}