/**
 * Register a function, fired after the site has loaded
 */
Event.observe(window, 'load', siteInit);

/**
 * Show whois options
 */
var showWhois = true;

/**
 * Called after DOM loaded
 */
function siteInit()
{
    // Observe key pressed in input field
    Event.observe('domainName', 'keyup',    domainTypeEvent);
    Event.observe('domainName', 'mouseup',  domainTypeEvent);
    Event.observe('domainName', 'change',   domainTypeEvent);

    // Deny form submits
    var cancelSubmit = {
        generic: function(event) {
            Event.stop(event);
        }
    };

    Event.observe('searchForm', 'submit', cancelSubmit.generic.bindAsEventListener(cancelSubmit));

    // Check for saved favorites
    appendFavorite.favorites = new Array();

    var cookieData = cookies.get('favorites');
    if (cookieData.length > 0) {
        var loadFavorites = {
            generic: function(event) {
                var cookieData = cookies.get('favorites');

                dataArray = cookieData.split(':');

                for (var i = 0; i < dataArray.length; i++) {
                    var name = dataArray[i];

                    appendFavorite(name);
                }

                saveFavorites();
                Event.stop(event);
            }
        };

        shortcut.add('Ctrl+O', loadFavorites.generic);

        Event.observe('load_favorites', 'click', loadFavorites.generic.bindAsEventListener(loadFavorites));
    }

    // Observe add to favorites
    var addToFavorites = {
        generic: function(event) {
            $('domainName').focus();

            if (checkDomainName.validDomainName) {
                var domainName = $('domainName').getValue();

                for (var i = 0; i < appendFavorite.favorites.length; i++) {
                    var name = appendFavorite.favorites[i];

                    if (name == domainName) {
                        return;
                    }
                }

                appendFavorite(domainName);
                saveFavorites();
            }
        }
    };

    shortcut.add('Ctrl+S', addToFavorites.generic);

    Event.observe('add_to_favorites', 'click', addToFavorites.generic.bindAsEventListener(addToFavorites));

    // Observe checkbox changes
    var tldChange = {
        generic: function(event) {
            var selectedTlds = getTldsToCheck();

            var tld     = Event.element(event).value;
            var checked = Event.element(event).checked;

            if (Event.element(event).effect) {
                Event.element(event).effect.cancel();
            }

            if (checked) {
                if (selectedTlds.length >= 9) {
                    Event.element(event).checked = false;
                    Event.stop(event);
                    alert(lang['max_selected']);
                    return;
                }

                Event.element(event).effect = Effect.Appear('rs_tld_' + tld);

                if (checkDomainName.validDomainName) {
                    checkDomainName(true);
                }
            } else {
                Event.element(event).effect = Effect.Fade('rs_tld_' + tld);
            }

            saveTlds();
        }
    };

    var tlds = document.getElementsByName('tld');

    for (var i = 0; i < tlds.length; i++) {
        var tld = tlds[i];

        if (typeof(tld.tagName) != 'undefined' && tld.tagName.toUpperCase() == 'INPUT') {
            if (document.all) {
                Event.observe(tld.id, 'click', tldChange.generic.bindAsEventListener(tldChange));
            } else {
                Event.observe(tld.id, 'change', tldChange.generic.bindAsEventListener(tldChange));
            }
        }
    }

    // More switch
    var moreChange = {
        generic: function(event) {
            if ($('moreButton').innerHTML == lang['more']) {
                $('moreForm').style.display = 'block';
                $('moreButton').innerHTML = lang['hide'];
            } else {
                $('moreForm').style.display = 'none';
                $('moreButton').innerHTML = lang['more'];
            }

            Event.stop(event);
        }
    };
    Event.observe('moreButton', 'click', moreChange.generic.bindAsEventListener(moreChange));

    // Set the focus to the input field
    $('domainName').focus();
    $('domainName').value = '';
}

/**
 * Append a favorite to the list
 */
function appendFavorite(domainName)
{
    var fc = $('favorites_contents');

    if (appendFavorite.favorites.length == 0) {
        cookies.del('favorites');
        shortcut.remove('Ctrl+O');

        fc.innerHTML = '';

        var ul = document.createElement('ul');
        ul.id  = 'favoritesList';
        fc.appendChild(ul);
    } else {
        var ul = $('favoritesList');
    }

    appendFavorite.favorites.push(domainName);

    var li = document.createElement('li');

    var a  = document.createElement('a');
    a.href      = '#none';
    a.title     = domainName;
    a.className = 'delete';

    a.onclick   = function () {
        for (var i = 0; i < appendFavorite.favorites.length; i++) {
            var name = appendFavorite.favorites[i];

            if (name == this.title) {
                appendFavorite.favorites.splice(i, 1);
                break;
            }
        }

        this.parentNode.parentNode.removeChild(this.parentNode);

        saveFavorites();

        return false;
    }

    var img = document.createElement('img');
    img.src       = 'media/images/gui/delete.png';
    a.appendChild(img);

    li.appendChild(a);

    var a  = document.createElement('a');
    a.href      = '#none';
    a.title     = domainName;

    if (domainName.length < 23) {
        a.innerHTML = domainName;
    } else {
        a.innerHTML = domainName.substr(0, 20) + '...';
    }

    a.onclick   = function () {
        $('domainName').value = this.title;
        checkDomainName();
        return false;
    }

    li.appendChild(a);
    ul.appendChild(li);
}

/**
 * Save favorites into a cookie
 */
function saveFavorites()
{
    var cookieData = new Array();
    for (var i = 0; i < appendFavorite.favorites.length; i++) {
        var name = appendFavorite.favorites[i];

        cookieData.push(name);
    }

    var data = cookieData.join(':');
    cookies.set('favorites', data, 3600 * 48, '/', '.snailo.com');
}

/**
 * Save seleccted Tlds into a cookie
 */
function saveTlds()
{
    var cookieData = new Array();

    var tlds = document.getElementsByName('tld');

    for (var i = 0; i < tlds.length; i++) {
        var tld = tlds[i];

        if (typeof(tld.tagName) != 'undefined' && tld.tagName.toUpperCase() == 'INPUT') {
            if (tld.checked) {
                cookieData.push(tld.value);
            }
        }
    }

    var data = cookieData.join(':');
    cookies.set('selectedTlds', data, 3600 * 48);
}

/**
 * Execute whois
 */
function whois(domainName)
{
    if (typeof(whois.request) == 'undefined') {
        whois.request = null;
    }

    if (whois.request != null) {
        whois.request.transport.abort();
        whois.request = null
    }

    whois.domainName = domainName;

    var data = {name: domainName};

    var jsonRequest = Object.toJSON(data);

    whois.request = new Ajax.Request(
        'index/whois',
        {
            method:     'post',
            parameters: {'request': jsonRequest},
            onSuccess:  renderWhois
        }
    );

    $('whois').innerHTML = '<div style="text-align: right;">'
                         + '<a href="#none" onclick="whois.request.transport.abort(); $(\'whois\').style.display = \'none\'; return false;">'
                         + lang['closewindow']
                         + '</a></div><br /><br />'
                         + '<img src="media/images/loader.gif" alt="' + lang['checking'] + '" id="loading" />';
    $('whois').style.display = 'block';
}

/**
 * Called by AJAX response
 */
function renderWhois(transport)
{
    var data = transport.responseText.evalJSON();

    if (data.name != whois.domainName) {
        return;
    }

    if (data.whois.length == 0) {
        data.whois = lang['no_whois_data'];
    }

    $('whois').innerHTML = '<div style="text-align: right;">'
                         + '<a href="#none" onclick="$(\'whois\').style.display = \'none\'; return false;">'
                         + lang['closewindow']
                         + '</a></div><br /><br />'
                         + data.whois;
}

/**
 * Get a list of TLDs to check
 */
function getTldsToCheck()
{
    var tldElements = document.getElementsByName('tld');
    var tlds = new Array();

    for (var i = 0; i < tldElements.length; i++) {
        var tld = tldElements[i];

        if (typeof(tld.tagName) != 'undefined' && tld.tagName.toUpperCase() == 'INPUT' && tld.checked) {
            tlds.push(tld.value);
        }
    }

    return tlds;
}