var Piano = {

    Ajax: {},

    // set a default message template (this gets overwritten on the front end)
    message_template: "<div style=\"display: none;\" id=\"{{divid}}\" class=\"{{type}}\" >{{text}}</div>",
    // incremental message identifier
    message_id: 0,

    current_timestamp: 0,

    init: function() {
        var now = new Date();
        this.current_timestamp = Math.floor(now.getTime() / 1000);
    },

    // set a message to the message box
    message_update: function(message, message_status, wait) {
        var message_div_id = "message_" + this.message_id;
        this.message_id++;
        var messagebox = $('message');
        var message_tpl = this.message_template;
        if(message_status == null){
            message_status = 'neutral';
        }
        if(wait == null){
            wait = 4000;
        }
        var message_html = message_tpl.replace('{{text}}', message).replace('{{type}}', message_status).replace('{{divid}}', message_div_id);
        messagebox.insert(message_html);
        $(message_div_id).appear({duration: .5});
        setTimeout('$("'+message_div_id+'").fade();', wait);
        setTimeout('$("'+message_div_id+'").remove();', wait + 2000);
    },
    
    // register a mouseover effect on an image, with optional preloading
    registerImageMouseOver: function(imageid, overurl, preload) {
        var image = $(imageid);
        var original_url = image.src;
        image.onmouseover = function() { this.src=overurl; };
        image.onmouseout = function() { this.src = original_url; };
        if (preload == true) {
            var dummyimage = new Image();
            dummyimage.src = overurl;
        }
    },

    // get a fuzzy text representation of when the given timestamp was
    // for example: 1 hour ago, 1 week ago, 1 year ago
    fuzzyTimeDifference: function(timestamp) {
        var difference = this.current_timestamp - timestamp;
        if (difference < 0) {
            return 'in the future';
        } else if (difference == 0) {
            return 'now';
        } else if (difference < 60) {
            return difference + " seconds ago";
        } else if (difference < 3600) {
            var minutes_ago = Math.floor(difference / 60);
            return minutes_ago > 1 ? minutes_ago + " minutes ago" : minutes_ago + " minute ago";
        } else if (difference < 86400) {
            var hours_ago = Math.floor(difference / 3600);
            return hours_ago > 1 ? hours_ago + " hours ago" : hours_ago + " hour ago";
        } else if (difference < 604800) {
            var days_ago = Math.floor(difference / 86400);
            return days_ago > 1 ? days_ago + " days ago" : days_ago + " day ago";
        } else if (difference < 2419200) {
            var weeks_ago = Math.floor(difference / 604800);
            return weeks_ago > 1 ? weeks_ago + " weeks ago" : weeks_ago + " week ago";
        } else if (difference < 29030400) {
            var months_ago = Math.round(difference/2419200);
//            var days_ago = Math.floor((difference - (months_ago * 2419200)) / 604800);
//            if (days_ago > 0) {
//                return months_ago + " months, " + days_ago + " days ago";
//            } else {
                return months_ago + " months ago";
//            }
        } else {
            var years_ago = Math.round(difference / 31536000);
           // var months_ago = Math.floor((difference - (years_ago * 31536000)) / 2419200);
           // if(months_ago > 0) {
           //     return years_ago + " years, " + months_ago  + " months ago";
           // } else {
                return years_ago + " years ago";
           // }
        }
    },

    getWindowHeight: function() {
        if(window.innerHeight){
            return window.innerHeight;
        } else if (document.documentElement && document.documentElement.clientHeight){
            return document.documentElement.clientHeight;
        } else if (document.body) {
            return document.body.clientHeight;
        } else {
            return null;
        }
    },

    getWindowWidth: function() {
        if(window.innerWidth){
            return window.innerWidth;
        } else if (document.documentElement && document.documentElement.clientWidth){
            return document.documentElement.clientWidth;
        } else if (document.body) {
            return document.body.clientWidth;
        } else {
            return null;
        }
    }
}

Piano.Ajax = {
    addTag: function(tagname, parent_type, parent_id, to_update, form_id, template) {
        var form = $(form_id);
        form.disable();
        var url = 'ajax/tagadd.php';
        new Ajax.Request(url, {
            method: 'post',
            parameters: { name: tagname, type: parent_type, id: parent_id, tpl: template },
            onSuccess: function (response) {
                var result = JSON.parse(response.responseText);
                if (result.new_tag_id > -1) {
                    $(to_update).update(result.new_tag_display);
                    form.reset();
                }
                form.enable();
                message_update(result.message, result.message_code);
            },
            onFailure: function (response) { 
                message_update('An unknown error occurred!', 'bad'); form.enable();
            }
        });
    },

    addComment: function(poster_name, comment_body, comment_type, parent_id, to_update, form_id) {
        var form = $(form_id);
        form.disable();
        var url = 'ajax/commentadd.php';
        new Ajax.Request(url, {
            method: 'post',
            parameters: {
                poster_name: poster_name,
                comment_body: comment_body,
                parent_id: parent_id,
                comment_type: comment_type },
            onSuccess: function(response, json) {
                var result = JSON.parse(response.responseText);
                if (result.new_comment_id > 0){
                    $(to_update).update(result.new_comment_display);
                    form.reset();
                }
                form.enable();
                Piano.message_update(result.message, result.message_code);
            },
            onFailure: function(response) {
                Piano.message_update('An unknown error occurred.', 'bad');
                form.enable();
            }});
    },

    getImageOneView: function(image_code, div_id) {
        parent.location.hash = image_code;
        var url = 'ajax/getimageoneview.php';
        new Ajax.Request(url, {
            method: 'post',
            parameters: {
                image: image_code
            },
            onSuccess: function(response, json) {
                var result = JSON.parse(response.responseText);
                if(result.message == '') {
                    $(div_id).replace(result.html);
                } else {
                    Piano.message_update(result.message, result.message_code);
                }
            }, 
            onFailure: function(response, json) {
                Piano.message_update('An unknown error occurred', 'bad');
            }
        });
    },

    pollVote: function (id, poll_div_id, option_number, template_name) {
        var poll = $(poll_div_id);
        var url = 'ajax/pollvote.php';
        new Ajax.Request(url, {
            method: 'post',
            parameters: {
                poll_id: id,
                vote_option: option_number,
                template: template_name
            },
            onSuccess: function(response, json) {
                var result = JSON.parse(response.responseText);
                if(result.message_code == 'good') {
                    poll.replace(result.poll_display);
                }
                Piano.message_update(result.message, result.message_code);
            },
            onFailure: function(response, json) {
                Piano.message_update('An unkown error ocurred', 'bad');
            }
        });
    }
}

/////////////////////////////
// deprecated functions - only an idiot would use them
/////////////////////////////
function message_update(message, message_status, wait){
    return Piano.message_update(message, message_status, wait);
}

function ajax_addTag(tagname, parent_type, parent_id, to_update, form_id, template){
    return Piano.Ajax.addTag(tagname, parent_type, parent_id, to_update, form_id, template);
}

function registerImageMouseOver(imageid, overurl) {
    return Piano.registerImageMouseOver(imageid, overurl);
}

function $RF(form, radio_name) {
    var elements = form.getInputs('radio', radio_name);
    return elements.find(function(radio) { return radio.checked; }).value;
}
