var displayLoadingMsg = function (el)
{
    var span = document.createElement('SPAN');
    Element.addClassName(span, 'loading');
    var img = document.createElement('IMG');
    img.src = '/images/icons/loading.gif';
    span.appendChild(img);
    var txt = document.createTextNode(' loading...');
    span.appendChild(txt);

    Element.insert(el, {after: span});
};

var hideLoadingMsg = function (el)
{
    var a = el.parentNode.getElementsByTagName('span');
    for (var i = 0; i < a.length; i++) {
        if (a[i].hasClassName('loading')) {
            Element.remove(a[i]);
        }
    }
};

var show_error_dialog = function (el) {
    //var dialog = new Dialog(Dialog.DIALOG_CONTEXTUAL).setContext(el).showMessage('Oops', 'A communication error occured. Try reloading the page.');
    alert('A communication error occured. Try reloading the page.');
};

var show_dialog = function (title, message) { 
    //var dialog = new Dialog(Dialog.DIALOG_POP).showMessage(title, message);
    alert(message);
};

var flagAsInappropriateSpot = function (spot_type, spot_hash)
{
    var field = $('inappropriate_spot');
    displayLoadingMsg(field);

    var url = app_base_url + 'ajax.php';
    var params = {'cat':'spot_flag_as_inappropriate', 't': spot_type, 'h': spot_hash};
    new Ajax.Request(url, {
        parameters: params,
        evalJSON: 'force',
        onComplete: function() {
            hideLoadingMsg(field);
            show_dialog("Success!", "Thank you for flagging inappropriate content on Placebeat.  We will review your submission shortly.");
        },
        onFailure: function() {
            hideLoadingMsg(field);
            show_error_dialog(null);      
        }
    });
};

var loadCityOptionsByCountry = function (field, country_id)
{
    displayLoadingMsg(field);
    // load the cities associated with the selected state
    var url = '/ajax.php?cat=get_city_list_by_country&c=' + country_id;
    new Ajax.Request(url, {
        onSuccess: function(t) {
            var cities = t.responseText.evalJSON();
            var sel = $('city');
            sel.options.length = 0;
            var o = new Option('Select City', '');
            sel.options[sel.options.length] = o;
            o = new Option('Add New City...', 'add-new-city');
            sel.options[sel.options.length] = o;
            $H(cities).each(function(pair) {
                var o = new Option(pair.value, pair.key);
                sel.options[sel.options.length] = o;
            });
            Element.show('city_list');
            hideLoadingMsg(field);
        }
    });
};

var loadCityOptions = function (field, state_id)
{
    displayLoadingMsg(field);
    // load the cities associated with the selected state
    var url = '/ajax.php?cat=get_city_list&s=' + state_id;
    new Ajax.Request(url, {
        onSuccess: function(t) {
            var cities = t.responseText.evalJSON();
            var sel = $('city');
            sel.options.length = 0;
            var o = new Option('Select City', '');
            sel.options[sel.options.length] = o;
            o = new Option('Add New City...', 'add-new-city');
            sel.options[sel.options.length] = o;
            $H(cities).each(function(pair) {
                var o = new Option(pair.value, pair.key);
                sel.options[sel.options.length] = o;
            });
            Element.show('city_list');
            hideLoadingMsg(field);
        }
    });
};
var closeFacebookLoginLayer = function() {
    Element.hide('facebook_login_layer');
    
    // move it back into the body tag
    var body = document.body;
    body.appendChild($('facebook_login_layer'));
    
    removeOverlay();
};
var addToFaveSpots = function (form_id) {
    // first check if this visitor is already logged to facebook
    var api = FB.Facebook.apiClient;
    var fb_session = api.get_session();
    if (fb_session == null) {
        createOverlay($('facebook_login_layer'));
        Element.show('facebook_login_layer');
        return;
    }
    
    var become_fan_id = 'become_fan';
    var is_fan_id = 'is_fan';
    var add_fave_form_id = 'add_to_fave_spots_form';
    if (form_id != null) {
        become_fan_id += '_' + form_id;
        is_fan_id += '_' + form_id;
        add_fave_form_id += '_' + form_id; 
    }
    
    becomeFanLink = $(become_fan_id).firstDescendant();
    displayLoadingMsg(becomeFanLink);
    var url = app_base_url + 'ajax.php';
    var form = $(add_fave_form_id);
    new Ajax.Request(url, {
        parameters: form.serialize(),
        evalJSON: 'force',
        onComplete: function(req) {
            var data = req.responseJSON;
            hideLoadingMsg(becomeFanLink);
            if (data !== null && data.status) {
                Element.show(is_fan_id);
                Element.hide(become_fan_id);
                FB.Connect.streamPublish('', data.attachment, data.action_links);
            } else {
                show_dialog("Error!", "Failed to like this place.");
            }
        },
        onFailure: function() {
            hideLoadingMsg(becomeFanLink);
            show_error_dialog(null);      
        }
    });
};
var removeFromFaveSpots = function (form_id) {
    var become_fan_id = 'become_fan';
    var is_fan_id = 'is_fan';
    var remove_fave_form_id = 'remove_from_fave_spots_form';
    if (form_id != null) {
        become_fan_id += '_' + form_id;
        is_fan_id += '_' + form_id;
        remove_fave_form_id += '_' + form_id; 
    }
    
    var children = Element.childElements(is_fan_id);
    isFanLink = children[children.length - 1];

    displayLoadingMsg(isFanLink);
    var url = app_base_url + 'ajax.php';
    var form = $(remove_fave_form_id);
    new Ajax.Request(url, {
        parameters: form.serialize(),
        evalJSON: 'force',
        onComplete: function(req) {
            var data = req.responseJSON;
            hideLoadingMsg(isFanLink);
            if(data !== null && data.status){
                show_dialog("Success!", "You  no longer like this place.");
                Element.show(become_fan_id);
                Element.hide(is_fan_id);
            } else {
                show_dialog("Error!", "Failed to un-like this place.");
            }
        },
        onFailure: function() {
            hideLoadingMsg(isFanLink);
            show_error_dialog(null);      
        }
    });
};

var closeReviewLayer = function() {
    Element.hide('add_review_layer');
    
    // move it back into the body tag
    var body = document.body;
    body.appendChild($('add_review_layer'));
    
    removeOverlay();
};
var removeOverlay = function() {
    // remove the overlay stuff
    $$('div.overlay').each(function(el) {
       Element.remove(el); 
    });
    $$('div.form_overlay').each(function(el) {
       Element.remove(el); 
    });
};
var createOverlay = function(content_div) {
    var content = document.body;
    var overlay = document.createElement("div");
    Element.addClassName(overlay, "overlay")
    content.appendChild(overlay);
    var loading = document.createElement("div");
    Element.addClassName(loading, "form_overlay")
    loading.appendChild(content_div);
    content.appendChild(loading);
    
    // calculate the center of the browser window
    var dim = document.viewport.getDimensions();
    var offset_dim = document.viewport.getScrollOffsets();
    var layer_dim = Element.getDimensions(content_div);
    
    var new_left = ((dim.width - layer_dim.width) / 2) + offset_dim.left;
    var new_top = ((dim.height - layer_dim.height) / 2) + offset_dim.top;
    Element.setStyle(loading, {
        'top': new_top + 'px',
        'left': new_left + 'px'
    });
};
var addReview = function(sectionId) {
    createOverlay($('add_review_layer'));

    Form.Element.setValue('add_review_sectionid', sectionId);
    Form.Element.setValue('add_review_msg', '');
    $('add_review_lang').options.selectedIndex = 0;

    Element.show('add_review_layer');
};
var submitNewReview = function(f) {
    var sectionId = Form.Element.getValue('add_review_sectionid');
    
    var msg = "Are you sure you would like to add this review?";
    if (confirm(msg)) {
        var url = app_base_url + 'ajax.php';
        new Ajax.Request(url, {
            parameters: Form.serialize(f),
            method: 'post',
            evalJSON: 'force',
            onComplete: function(req) {
                closeReviewLayer();
                
                var data = req.responseJSON;
                if (data !== null && data.status) {
                    updateDisplay({page: 0}, sectionId);
    	        	FB.Connect.streamPublish('', data.attachment, data.action_links, null, null, afterReviewFeedDialog);
                } else {
                    show_dialog("Error!", "Failed to add review.");
                }
            },
            onFailure: function() {
                closeReviewLayer();
                show_error_dialog(null);      
            }
        });
    }
    
    return false;
};
var afterReviewFeedDialog = function () {
    return false;
};

var switchTab = function(tabId) {
    var tab = $(tabId + "_tab");
    Element.addClassName(tab, "selected");
    var tabset = tab.parentNode;
    var tabs = tabset.childNodes;
    for (var i = 0; i < tabs.length; i++) {
        if ((tabs[i].tagName == 'A') && (tabs[i] != tab)) {
            Element.removeClassName(tabs[i], "selected");
        }
    }
    
    var content = $(tabId + "_content");
    var contents = content.parentNode.childNodes;
    for (var i = 0; i < contents.length; i++) {
        if ((contents[i].tagName == 'DIV') && (contents[i] != content)) {
            Element.addClassName(contents[i], "hidden");
        }
    }
    Element.removeClassName(content, "hidden");
    
    return false;
};

var gotoPage = function(page, sectionId) {
    var params = {
        'page': page
    };

    var valid_filters = ['type', 'location', 'lang', 'subcat'];
    for (var i = 0; i < valid_filters.length; i++) {
        var select = $("filter_form_" + valid_filters[i] + "_" + sectionId);
        if (select != null) {
            var selectedFilter = select.options[select.options.selectedIndex];
            params[valid_filters[i] + '_filter'] = selectedFilter.value;
        }
    }

    updateDisplay(params, sectionId);
};

var filterChange = function(filterName, sectionId) {
    var meta = metadata[sectionId];
    var params = {
        'page': 0
    };

    var valid_filters = ['type', 'location', 'lang', 'subcat'];
    for (var i = 0; i < valid_filters.length; i++) {
        var select = $("filter_form_" + valid_filters[i] + "_" + sectionId);
        if (select != null) {
            var selectedFilter = select.options[select.options.selectedIndex];
            params[valid_filters[i] + '_filter'] = selectedFilter.value;
        }
    }
    
    updateDisplay(params, sectionId);
};

var updateDisplay = function(params, sectionId) {
    var section = $("display_" + sectionId);
    if (typeof section == "undefined" || section == null) {
        return;
    }
    var content = $("display_content_" + sectionId);
    var overlay = document.createElement("div");
    Element.addClassName(overlay, "overlay")
    Element.addClassName(overlay, "small")
    content.appendChild(overlay);
    var loading = document.createElement("div");
    Element.addClassName(loading, "loading_overlay")
    content.appendChild(loading);
    Element.update(loading, loading_msg);

    var meta = metadata[sectionId];
    var src = meta[1]['source'];
    var url = app_base_url + 'display.php';
    var query = {};
    for (var key in src) {
        query[key] = src[key];
    }
    query["title"] = meta[0];
    query["nav"] = meta[1]["nav"];
    query["page"] = meta[1]["current_page"];
    for (var key in params) {
        query[key] = params[key];
    }

    new Ajax.Request(url, {
        parameters: query,
        onComplete: function(req) {
            Element.update(section, req.responseText);

            // required so we render xfbml tags again
            if (FB.XFBML.Host.parseDomTree) {
                setTimeout(FB.XFBML.Host.parseDomTree, 0);
            }
        },
        onFailure: function() {
            show_error_dialog(null);
        }
    });
};

var deleteItem = function(itemId, sectionId) {
    var msg = "Are you sure you want to delete this item?";
    if (confirm(msg)) {
        var meta = metadata[sectionId];
        var src = meta[1]['source'];
        var url = app_base_url + 'ajax.php';
        var query = {};
        for (var key in src) {
            query[key] = src[key];
        }
        query['cat'] = 'deleteItem';
        query['item_id'] = itemId;

        new Ajax.Request(url, {
            parameters: query,
            evalJSON: 'force',
            onComplete: function(req) {
                var data = req.responseJSON;
                if(data !== null && data.status){
                    // refresh the section
                    updateDisplay({}, sectionId);
                    show_dialog("Success!", data.msg);
                } else {
                    var msg = "Delete failed.";
                    if (data !== null && data.msg) {
                        msg = data.msg;
                    }
                    show_dialog("Error!", msg);
                }
            },
            onFailure: function() {
                show_dialog("Error!", "AJAX request failed");
            }
        });
    }
};

var facebook_onlogin = function() {
   window.location.href = window.location.href; 
};


