var tags_editor_expanded = false
var tags_ctype = null
var tags_oid = null
var tags_changed = false
var tags_hide_on_finish = false
var tags_in_operation = false

function reparent_tag(tag_element) {
    var selected = $('tags-selected')
    var available = $('tags-available')
    var tag_span = $(tag_element).getParent()
   
    // change parent element of the tag
    if (tag_span.getParent() == available) {
        selected.adopt(tag_span.remove())
    }
    else {
        available.adopt(tag_span.remove())
    }

    tags_changed = true
    toggle_elements_state()
}

/* Hides/display no tags available/selected as required */
function toggle_elements_state() {
    var selected = $('tags-selected')
    var available = $('tags-available')

    var selected_count = selected.getElements('a').length
    var available_count = available.getElements('a').length

    $('no-tags-available').setStyle('display', ( available_count>0 ? 'none' : 'block' ))

    $('no-tags-selected').setStyle('visibility', ( selected_count>0 ? 'hidden' : 'visible' ))
    
    $('update_tags_submit').setProperty('disabled', !tags_changed)
}

/** 
 * if in edit mode, move the tags, otherwise return true, 
 * and the tag click will continue as usual
 */
function route_tag(tag_element) {
    var editor_container = $('tags-editor-container')

    if (editor_container.getStyle('display') == 'block') {
        reparent_tag(tag_element)
        return false
    }
    else {
        return true
    }
}

/* updates the tag elements ('tags-available' or 'tags-selected') */
function update_tags_element(elemet_id, tags) {
    var the_dir = document.body.getStyle('direction') == 'rtl' ? '&rlm;' : '&lrm;'
    var tags_str = ''

    tags.each( function(tag) {
        tags_str += '<span>'+the_dir+'&nbsp;<a id="tag_' + tag[0] +'" href="'+tag[3]+'" onclick="return route_tag(this)">' + tag[2] +'</a>&nbsp;</span>'
    })

    $(elemet_id).setHTML(tags_str)
}

/* get the tags list and updates the tag lists and ui elements */
function update_tags_elements(tags) {
    update_tags_element( 'tags-available', tags['available'])
    update_tags_element( 'tags-selected', tags['selected'])
    toggle_elements_state()
}

/* show/hide the spinner and the inner tags editor */
function set_tags_spinner(state, message) {
    var spinner = $('tags_spinner')
    var inner = $('tags_editor_inner')

    if (state) {
        spinner.setStyle('display','block')
        messages = ['tags_spinner_loading_tags','tags_spinner_cancel','tags_spinner_update', 'tags_spinner_create']
        messages.each(function(item,idx) {
            $(item).setStyle('display', ( item == message ? 'inline' : 'none'))
        })

        // if spinner is visible, editor should be hidden
        inner.setStyle('display', 'none')
    }
    else {
        spinner.setStyle('display','none')
        // if spinner is hidden, editor should be visible
        inner.setStyle('display','block')
        set_tag_create_state()
    }
}

// Hide/shows the containter editing functionality
function set_tags_editor(state) {
    var editor_container = $('tags-editor-container')
    var toggle_img = $('img_tags_toggle')
    var container = $('tags-container')

    if (state) {
        toggle_img.setProperty('src','/media/img/arrow_down.gif')
        container.addClass('dotted')
        
        editor_container.setStyle('display','block')
    }
    else {
        toggle_img.setProperty('src','/media/img/arrow_up.gif')
        container.removeClass('dotted')
        editor_container.setStyle('display','none')
    }

    tags_editor_expanded = state
}

// get's the updated object tags
function get_object_tags(content_type, object_id) {
    if (tags_in_operation) return

    if ( content_type && object_id ) {
        tags_ctype = content_type
        tags_oid = object_id
    }
    if (!tags_ctype || !tags_oid ) { return }
    
    tags_hide_on_finish = tags_editor_expanded
    if (!tags_editor_expanded) {
        set_tags_editor(true)
    }
    else {
        if (!tags_changed) {
            set_tags_editor(false)
            return
        }
    }

    var url ='/tags/meta/object_tags/'+tags_ctype+'/'+tags_oid+'/?rid='+Math.random() 
    var json_req = new Json.Remote(url, {
        method : 'get',
        onRequest: function() {set_tags_spinner( true, 'tags_spinner_loading_tags'); tags_in_operation = true},
        onComplete: function(tags) { 
            update_tags_elements(tags);
            set_tags_spinner(false);
            tags_in_operation = false;
            if (tags_hide_on_finish) {set_tags_editor(false) }
        },
        onFailure: function() {
            set_tags_spinner(false);
            tags_in_operation = false;
            if (tags_hide_on_finish) {set_tags_editor(false) }
        }
    }).send({});
}


function update_tags(content_type, object_id) {
    if (tags_in_operation) return

    // build an tags id array

    var selected_tags = $('tags-selected').getElements('a').map(function(item){
        return parseInt(item.getProperty('id').substring(4))
    });

    var update_url = '/tags/meta/update_tags/'+content_type+'/'+object_id+'/'
    var update_json_req = new Json.Remote(update_url, {
        onRequest: function() {
            tags_in_operation = true
            set_tags_spinner(true, 'tags_spinner_update')
        },
        onComplete: function(tags) {
            update_tags_elements(tags)
            set_tags_spinner(false)
            set_tags_editor(false)
            tags_in_operation = false
        },
        onFailure: function() {
            set_tags_spinner(false)
            set_tags_editor(false)
            tags_in_operation = false
        }
    }).send({'tags_ids':selected_tags});

    return false
}

/* reset tag creation form */
function reset_tag_create() {
    $('id_name').setProperty('value','')
    $('id_slug').setProperty('value','')
    set_tag_create_state()
    
}

// enables/disables create form
function set_tag_create_state() {
    name_val = $('id_name').getValue()
    slug_val = $('id_slug').getValue()
    $('id_create_tag').setProperty('disabled', !(name_val.length * slug_val.length ))
}

function create_tag() {
    if (tags_in_operation) return

    var create_tag_url = '/tags/meta/json_create_tag/'

    var create_tag_req = new Json.Remote(create_tag_url, {
        onRequest: function() {
            set_tags_spinner( true, 'tags_spinner_create')
            tags_in_operation = true
        },
        onComplete: function(resp) {
            tags_in_operation = false
            set_tags_spinner(false)
            if (!resp['errors']) {
                set_tags_editor(false)
                reset_tag_create()
                window.setTimeout( 'get_object_tags()', 20)
            }
            else {
                errors_str = ""
                for (i in resp['errors']) {
                    errors_str += i + ':' + resp['errors'][i] + '\n'
                }
                alert(errors_str)
            }
        },
        onFailure: function() {
            tags_in_operation = false
            set_tags_spinner(false)
            set_tags_editor(false)
        }
    }).send({'slug':$('id_slug').getValue(), 'name':$('id_name').getValue()});

    return false

}
