(function () {
    var E = Allthat.namespace('Allthat.Entity');
    /**
     * This class aimed to work with query results and items
     * @class Item
     * @module Entity
     */
    E.ItemClass = new Class({
        Implements : [Events, Options],
        
        options : {
            itemCount : 0,
            totalPages : 0
        },
        
        update : function (queryId, sort, page) {
            //$('inline_results_' + queryId).set('html', '<h1>loading...</h1>');
            if (!sort) {
                sort = Allthat.Entity.Item.sortOrder[queryId];
            }
            if (!page) {
                page = 1;
            }
            
            var url = '/items?query_id=' + queryId + '&sort=' + sort + '&page=' + page;
            
            if (Allthat.isIE7) {
                url = url + '&UUID=' + Allthat.generateUUID();
            }

            new Request.HTML({
                url : url,
                method : 'get',
                update : 'inline_results_' + queryId,
                onSuccess : function () {
                    Allthat.Entity.Item.setCountAndBindListeners();
                }
            }).send();
        },
        
        setCountAndBindListeners : function (count, pages) {
            this.itemCount = $('item_count').get('html');
            this.totalPages = $('total_pages').get('html');

            this.bindEventListeners();
    	    
            this.fireEvent('countSetted');
        },
    	
        bindEventListeners : function () {
            //            var queryId = parseInt($('results_query_id').get('html'), 0),

            var queryId;
            jQuery('.results_query_id').each(
                function(i){
                    if (jQuery(this).parent().css('display') == "block"){
                        queryId = jQuery(this).html();
                    }
                })
            queryId = parseInt(queryId, 0),
            getItemIdRegex = /^item_(\d+)$/;
            $('result_sort_' + queryId).getElements('a').addEvent('click',
                function(e) {
                    Allthat.Entity.Item.sortOrder[queryId] = this.id;
                    Allthat.Entity.Item.update(queryId, this.id);
				
                    // Fix the sort order
                    $('result_sort_' + queryId).getElements('a').removeClass('selected');
                    jQuery(this).addClass('selected');
                    if (e.preventDefault) e.preventDefault();
                    return false;
                });
            
            // initialize items list
            $A($$('.result_content .result_row')).each(function (res) {
                var result = new Element(res),
                regexResult = getItemIdRegex.exec(result.getProperty('id'));
                    
                if (regexResult) {
                    var itemId = regexResult[1];
                    // bind delete link to the item
                    if (Allthat.authorized) {
                        var result_actions = result.getElement('.result_actions');
                        var deleteLink = result_actions.getElement('a.link_delete');

                        if (deleteLink) {
//                            alert('found');
                            deleteLink.addEvent('click', function (e) {
                                Allthat.Entity.Item.destroy(queryId, itemId); 
                                if (e.preventDefault) e.preventDefault();
                                return false;
                            });
                        }
                    }
                }
            });
                   
            // if there is no items, initialize other functionality:
            var nextPageLink = $$('#no_more_results a')[0];
            
            if (nextPageLink) {
                nextPageLink.addEvent('click', function (e) {
                    Allthat.Entity.Item.update(queryId, $('sort_order').get('value'));
                    if (e.preventDefault) e.preventDefault();
                    return false;
                });
            }
            
            var refreshLink = $$('#in_progress a')[0];
            if (refreshLink) {
                refreshLink.addEvent('click', function (e) {
                    Allthat.Entity.Item.update(queryId, $('sort_order').get('value'));
                    if (e.preventDefault) e.preventDefault();
                    return false;
                });
            }
            
            if (!this.sortOrder) {
                this.sortOrder = new Array();
            }
            if (!this.sortOrder[queryId]) {
                this.sortOrder[queryId] = 'relevance';
            }
            // bind event listeners to the pagination links

            jQuery(".pagination :visible").each(function(indx){
                var splitted = jQuery(this).attr('class').split("_");
                var page = parseInt(splitted.pop(), 0);
                var query = parseInt(splitted.pop(), 0);
                jQuery(this).bind('click', function(e){
                    Allthat.Entity.Item.update(query, Allthat.Entity.Item.sortOrder[query], page);
                    if (e.preventDefault) e.preventDefault();
                    return false;
                });
            });
            //            $A($$('.pagination a')).each(function (p) {
            //                if (p.parentNode.parentNode.style.display != "none"){
            //                    (new Element(p)).addEvent('click', function (e) {
            //                        Allthat.Entity.Item.update(queryId, Allthat.Entity.Item.sortOrder[queryId], parseInt(this.className.trim(), 0));
            //                        if (e.preventDefault) e.preventDefault();
            //                        return false;
            //                    });
            //                }
            //            });
            
            this.fireEvent('eventListenersBind');
        },
    	
        /**
    	 * This method toggles display of the query results for the specified
         * element.
    	 */
        toggle : function (queryId, toggleElement) {
            // determine whether the results are loaded or not. If not, load them.
            if (toggleStatus[queryId] == 'unloaded') {
		
                var sort = 'relevance',
                page = 1;
                $('result_container').set('html', '<h1>loading...</h1>');
            
                var url = '/items?query_id=' + queryId + '&sort=' + sort + '&page=' + page;
            
                if (Allthat.isIE7) {
                    url = url + '&UUID=' + Allthat.generateUUID();
                }

                toggleElement.addClass('loading');
                toggleElement.removeClass('collapsed');
                new Request.HTML({
                    url : url,
                    method : 'get',
                    update : 'inline_results_' + queryId,
                    onSuccess : function () {
                        Allthat.Entity.Item.collapseOthers(queryId);
                        Allthat.Entity.Item.setCountAndBindListeners();
                        jQuery("#status_query_" + queryId).hide();
                        //$('new_items_' + queryId).setStyle('display', 'none');
                        toggleStatus[queryId] = 'loaded';
                        toggleElement.removeClass('loading');
                        toggleElement.addClass('expanded');
                        $('result_sort_' + queryId).setStyle('display','block');
                    }
                }).send();
            // If the results are loaded, toggle them.
            } else if (toggleStatus[queryId] == 'loaded') {
                $('inline_results_' + queryId).setStyle('display', 'none');
                toggleStatus[queryId] = 'collapsed';
                toggleElement.removeClass('expanded');
                toggleElement.addClass('collapsed');
                $('result_sort_' + queryId).setStyle('display','none');
            } else if (toggleStatus[queryId] == 'collapsed') {
                Allthat.Entity.Item.collapseOthers(queryId);
                $('inline_results_' + queryId).setStyle('display', 'block');
                toggleStatus[queryId] = 'loaded';
                toggleElement.removeClass('collapsed');
                toggleElement.addClass('expanded');
                $('result_sort_' + queryId).setStyle('display','block');
            }
        },
        /**
         * Expand the specified resultset
         * @method expandResults
         */
        expandResults: function(queryId) {
            $('inline_results_' + queryId).setStyle('display', 'block');
            var toggleElement =
            $("query_" + queryId).getElement(".results_info .results_toggle");
            toggleElement.removeClass('collapsed');
            toggleElement.addClass('expanded');
        },
    	
        /**
         * Collapse the specified resultset
         * @method collapseResults
         */
        collapseResults: function(queryId) {
            $('inline_results_' + queryId).setStyle('display', 'none');
            var toggleElement =
            $("query_" + queryId).getElement(".results_info .results_toggle");
            toggleElement.removeClass('expanded');
            toggleElement.addClass('collapsed');
        },

        /**
         * Collapse all of the other results that are displayed
         * @method collapseOthers
         */
        collapseOthers: function(queryId) {
            for (var index in toggleStatus) {
                if ((index != queryId) && (toggleStatus[index] == 'loaded')) {
                    $('inline_results_' + index).setStyle('display', 'none');
                    toggleStatus[index] = 'collapsed';
                    var toggleElement =
                    $("query_" + index).getElement(".results_info .results_toggle");
                    toggleElement.removeClass('expanded');
                    toggleElement.addClass('collapsed');
                    $('result_sort_' + index).setStyle('display','none');
                }
            }
        },
    	
        /**
    	 * Delete item and hide appropriate DOM container
    	 * @method destroy
    	 */
        destroy : function (queryId, itemId, wishlistId) {
//            $('delete_x_' + itemId).setStyle('display', 'none');
            $('delete_spinner_' + itemId).setStyle('display', 'block');

            new Request({
                url : '/queries/' + queryId + '/delete_item?item_id=' + itemId,
                method:'delete',
                onSuccess: function(transport){

                    $('item_' + itemId).setStyle('display', 'none');
                    // change main pic if item was first
                    if (Allthat.Entity.Item.sortOrder[queryId] == 'relevance'){
                        var deleted_item = jQuery('#inline_results_' + queryId + ' .result_content .result_row:visible').first();
                        if (deleted_item.attr('id') == 'item_' + itemId){
                            var img = deleted_item.find('.leftpic');
//                            var img = jQuery('#inline_results_' + queryId + ' .result_content .result_row:visible').first().find('.leftpic');
                            var img_main = jQuery('#query_' + queryId + ' .results_image');
                            img_main.html(img.html());
                            img_main.find('img').attr('id', '#query_img_' + queryId);

                        }
                    }
                    //                    Allthat.Entity.Query.updateStatus(queryId);
                    regexp = /^(\d+)\ results$/;
                    var count = jQuery('#new_items_' + queryId).html().trim();
                    countResult = regexp.exec(count);
                    if (countResult){
                        countResult[1]--;
                        jQuery('#new_items_' + queryId).html(" " + countResult[1] + " results");
                    }


                },
                onFailure: function(transport){ 
                    $('delete_x_' + itemId).setStyle('display', 'block');
                    $('delete_spinner_' + itemId).setStyle('display', 'none');

                    alert('Could not delete query.');
                }
            }).send();
        }
    });
})();