/* Provides functionality for the Entrecard campaign page */

card_map = [];
rss_request = null;

function ss(s, size) {
    if (!size) {
        size = 36;
    }
    /* Shorten string */
    if (s.length < size) {
        return s;
    }
    s = s.substr(0,size-3) + '...';
    return s;
    
}

function buy_ad(blog_id, signed_price) {
    var status = new Element('div', {'id': 'buy_link_' + blog_id}).setText('Working..');
    $('buy_link_' + blog_id).replaceWith(status);
    var request = new Json.Remote("json_buy_ad", {
        onSuccess: function (result) {
            result = Json.evaluate(result);
            status.setText(result['message']);
            if (result['message'] == "Purchased") {
                status.getParent().getParent().addClass('queued');
            }
            update_balance();
        },
        onFailure: function (result) {
            status.setText('Failed');
        }
    }).send({'blog_id': blog_id, 'signed_price': signed_price});
}

function show_card_render_rss(card_id, rss) {
    var old_rss = $('rss_spinner_' + card_id);
    var new_rss = new Element('div', {'class': 'sidebar_rss'});
    
    new_rss.adopt(
        new Element('b').setText('Most recent posts')
    )
    if (rss.length == 0) {
        new_rss.adopt(
            new Element('p').adopt(
                new Element('i').setText('Entrecard could not find any RSS for this blog')
            )
        )
    }
    
    for (var i=0; i<rss.length; i++) {
        new_rss.adopt(
            new Element('div', {'class': 'entry'}).adopt(
                new Element('span', {'class': 'date'}).setText(rss[i].date),
                new Element('a', {'href': rss[i].link}).setText(ss(rss[i].title, 40))
            )
        )
    }
    old_rss.replaceWith(new_rss);
    
}

rss_cache = [];

function show_card_rss(card_id) {
    var card = card_map[card_id];
    
    if (rss_request) {
        rss_request.cancel();
    }
    
    if (rss_cache[card_id]) {
        show_card_render_rss(card_id, rss_cache[card_id]);
    } else {
        
        rss_request = new Json.Remote("/details/" + card['entrecard_id'] + "/rss",
            {
                method: 'get',
                onComplete: function(data) {
                    var rss = data['rss'];
                    show_card_render_rss(card_id, rss);
                    rss_cache[card_id] = rss;
                }
            }).send();
    }
}

function show_card_details(card_id) {
    $('overlay_blog_' + card_id).setOpacity(1);
    var old_del = $('card_detail_section');
    var del = new Element('div', {'id': 'card_detail_section'});
    var card = card_map[card_id];
    
    rss = card['entries'];
    
    var new_rss = new Element('div', {'class': 'sidebar_rss'});
    
    new_rss.adopt(
        new Element('b').setText('Most recent posts')
    )
    
    if (rss.length == 0) {
        new_rss.adopt(
            new Element('p').adopt(
                new Element('i').setText('Entrecard could not find any RSS for this blog')
            )
        )
    }
    
    for (var i=0; i<rss.length; i++) {
        new_rss.adopt(
            new Element('div', {'class': 'entry'}).adopt(
                new Element('span', {'class': 'date'}).setText(rss[i].date),
                new Element('a', {'href': rss[i].url}).setText(ss(rss[i].title, 40))
            )
        )
    }
    
    del.adopt(
        new Element('div', {'class': 'title'}).setText(ss(card['title'], 28)),
        new Element('div', {'class': 'tagline'}).setText(card['tagline']),
        new Element('div', {'class': 'description'}).setText(ss(card['description'], 120)),
        new Element('div').adopt(
            new Element('a', {'href': card['url']}).setText(ss(card['url']))
        ),
        new Element('div').setText(card['price'] + "ec per day to advertise"),
        new Element('div').setText("Popularity rating of " + card['rating']),
        card['is_subscribed'] ? new Element('div').setText("Entrecard sponsor") : new Element('div'),
        new_rss
    );
    
    old_del.replaceWith(del);
}

function hide_card_details(card_id) {
    $('overlay_blog_' + card_id).setOpacity(0);
}

function append_ecard(el, card) {
    var ecard = new Element('div', {'class': 'browse_ecard'});
    
    card_map[card['id']] = card;
    
    var container_class = "";
    if (card['featured'] || card['is_subscribed']) {
        container_class += " featured";
    }
    if (card['favorite']) {
        container_class += " favorite";
    }
    if (card['dropped_on']) {
        container_class += " dropped_on";
    }
    if (card['already_queued']) {
        container_class += " queued";
    }
    if (card['recently_rejected']) {
        container_class += " rejected";
    }
    
    
    var container = new Element('div', {'class': container_class});
    var card_link = new Element('a', {'class': 'entrecard_only ecard_' + card['style'], 'onmouseover': 'show_card_details(' + card['id'] + ');', 'onmouseout': 'hide_card_details(' + card['id'] + ');'});
    
    var subscribed = new Element('div', {'id': 'subscribed_blog_' + card['id'], 'class': 'subscribed_overlay'})
    
    if (card['is_subscribed']) {
        subscribed.adopt(
            new Element('img', {'class': 'subscribed_star', 'src': '/static/images/icons/Star.png' })
        );
    }
    
    if (card['style'] == 'image') {
        /* Image card */
        var overlay = new Element('div', {'id': 'overlay_blog_' + card['id'], 'style': 'visibility: hidden', 'class': 'card_overlay'})
        overlay.adopt(
            new Element('div', {'class': 'overlay_zone'}).setText(card['rating']),
            new Element('a', {'href': '/t/oc/' + card['user_id'], 'class': 'overlay_zone'}).setText('Site'),
            new Element('a', {'href': '/details/' + card['entrecard_id'], 'class': 'overlay_zone'}).setText('Profile')
        );
        card_link.adopt(
            new Element('img', {'src': card['image'], 'alt': card['title'] + ' : ' + card['tagline']}),
            overlay,
            subscribed
        );
    } else {
        /* Text card */
        var overlay = new Element('div', {'id': 'overlay_blog_' + card['id'], 'style': 'visibility: hidden', 'class': 'card_overlay'});
        overlay.adopt(
            new Element('div', {'class': 'overlay_zone'}).setText(card['rating']),
            new Element('a', {'href': '/t/oc/' + card['user_id'], 'class': 'overlay_zone'}).setText('Site'),
            new Element('a', {'href': '/details/' + card['entrecard_id'], 'class': 'overlay_zone'}).setText('Profile')
        );
        card_link.adopt(
            new Element('span', {'class': 'title'}).setText(card['title']),
            new Element('span', {'class': 'tagline'}).setText(card['tagline']),
            overlay,
            subscribed
        );
    }
    
    var card_detail = new Element('div', {'class': 'advertise'});
    var wait_time = '< 1 day';
    if (card['queue_length'] > 0) {
        wait_time = card['queue_length'] + ' day(s)';
    }
    
    var buy_link = new Element('a', {'id': 'buy_link_' + card['id'], 'href': 'javascript: buy_ad(' + card['id'] + ', "' + card['signed_price'] + '")'}).setText('Advertise');

    if (card['already_queued']) {    
        buy_link = new Element('div').setText('Purchased');
    } else if (!card['accepting_adverts']) {
        buy_link = new Element('div').setText('Ads disabled');
    } else if (!card['has_widget']) {
        buy_link = new Element('div').setText('No widget');
    } else if (entrecard_user_balance == null) {
        buy_link = new Element('div').setText('Login to buy');
    } else if (card['price'] > entrecard_user_balance) {
        buy_link = new Element('div').setText('Too expensive');
    }    
    card_detail.adopt(
        new Element('div').setText('Wait: ' + wait_time),
        new Element('div').setText('Price: ' + card['price'] + 'ec/day'),
        buy_link
    );
    
    
    container.adopt(card_link, card_detail);
    
    ecard.adopt(container);
    el.adopt(ecard);
}

    
function display_result(result) {
    var old_results_el = $('cat_results');
    var results_el = new Element('div', {'id': 'cat_results'});
    var rows_per_page = $('cat_rows_per_page').getValue();
    for (var i=0; i<rows_per_page*5; i++) {
        if (i < result['results'].length) {
            append_ecard(results_el, result['results'][i]);
        }
    }
    if (result['results'].length == 0) {
        results_el.innerHTML="<p><center><i>No results matched your search</i></center></p>";
    }
    if (result['results'].length > (rows_per_page*5-1)) {
        more_available = true;
    } else {
        more_available = false;
    }
    old_results_el.replaceWith(results_el);
    old_results_el.empty();
    $('ajax-loader').setOpacity(0);
}

search_timer = null;
more_available = false;

function run_search() {
    /* Get form information */
    var form = $('cat_form');
    $('ajax-loader').setOpacity(1);
    Cookie.set('entrecard_rows_per_page', $('cat_rows_per_page').getValue())
    form.send({
        method: "get",
        onSuccess: function (result) { display_result(Json.evaluate(result)); },
        onFailure: function (e) { $('cat_results').innerHTML = "<center><i>Error retrieving results, please contact support</i></center>"; }
    });
}

function run_timed_search() {
    clearTimeout(search_timer);
    
    run_search();
    
    search_timer = setTimeout(run_timed_search, 60000);
}

function move_offset(v) {
    var current = $('category_offset').value;
    var rows_per_page = $('cat_rows_per_page').getValue()
    if (current <= 0 && v < 0) {
        return;
    }
    if (v > 0 && more_available == false) {
        return;
    }
    
    $('category_offset').value = current.toInt() + v.toInt()*5*rows_per_page;
    run_timed_search();
}

function force_search() {
    $('category_offset').value = 0;
    run_timed_search();
}

function campaign_init() {
    var rows_per_page = Cookie.get('entrecard_rows_per_page');
    if (!rows_per_page) {
        rows_per_page = 3;
    } else {
        rows_per_page = rows_per_page.toInt();
    }
    $('cat_rows_per_page').value = rows_per_page;
    window.addEvent('domready', function() { run_timed_search(); });
}