/**
 * @author vpavlyuk
 *
 * Depends on JQuery 1.4.2
 */


SF.ns('EventsWebinars.List', function(){

    var data,
        TS = '_et',
        ES = '_ev',
        selectedType = 'f',
        historyReady = SF.History.ready;

    /**
     * Initialization of event list client logic.
     */
    function init() {
        // init confirmation page on registration page

        if(!(SF.ns('EventsWebinars.List')).ready) return;

        //On page with list plugin SF.EventsWebinars.List.data contains event, tag, type and region lists.
        //If this object isn't defined we can't start with initialization.
        data = SF.EventsWebinars.List.data;

        data.tagsByType = {};

        $('ul.el-tabs a').click(function(e){
            var t = $(this),
                id = this.id;
            if(!$(this).hasClass('act')) {
                $('ul.el-tabs a.act').removeClass('act');
                $(this).addClass('act').blur();

                setSelectedType(id.split('_')[0]);

                updateList();
            }

            e.preventDefault();
            return false;
        });

        // if default region defined - set this value
        if (data.regionID != null) {
        	$('#event_region').val(data.regionID);
        }

        $('#event_tag').change(updateList);
        $('#event_region').change(updateList);

		$('div.el-item a.el-learnmore').click(function(e){
			var item = $(this).attr('id').replace('_learnmore','');
			var lng = $('#'+item+'_ev_long');
			var sht = $('#'+item+'_ev_short');
			if(lng.hasClass('hidden')){
				sht.addClass('hidden');
				lng.removeClass('hidden');
				$(this).addClass('learnless');
			}else{
				lng.addClass('hidden');
				sht.removeClass('hidden');
				$(this).removeClass('learnless');
			}
		});


/*
        $('div.el-item').click(function(e){
            document.location.href = $(this).find('a.reg-btn').attr('href');
        });
*/
        //updateList(true);

        if(historyReady) {
            SF.History.addCallback('event', historyCallback);
        }

        setTimeout(function() {if ($('#event_region').val()==null) {$('#event_region').val('all')} ;updateList(true); },500);

    }

    /**
     * Updates list of events according to the current state of filters
     *
     * @param {Boolean} flag - if set to true URL hash isn't updated.
     *                         We need this to prevent unlimited recursion
     *                         when this method is called from hash changed callback.
     */
    function updateList(flag) {
        hideBusy();

        if(selectedType == 'f') {
            resetAndHideTopics();
        } else {
            showTopics();
        }

        var selector = [];
        var f_conf = getFiltersState();
        var itemsToShow = getVisible(f_conf);

        for(var i = 0; i < itemsToShow.length; i++) {
            selector.push('#' + itemsToShow[i] + ES);
        }

        $('div.el-item').addClass('hidden-h0');
        for (var i = 0; i < selector.length; i++) {
            $(selector[i]).removeClass('hidden-h0');
        }


        // $('div.el-item').not(selector.join(',')).addClass('hidden-h0');
        if(selector.length > 0) {
            hideNoItems();
            $(selector.join(',')).removeClass('hidden-h0').removeClass('even').filter(':odd').addClass('even');
        } else {
            showNoItems(f_conf);
        }

        //console.log(getTagsByType(f_conf.type));

        //Update URL
        if(historyReady && flag !== true) {
            var hObj = {};
            if(data.types[f_conf.type]) {
                hObj.type = f_conf.type + ',' + data.types[f_conf.type];
            }
            if(data.tags[f_conf.tag]) {
                hObj.tag = f_conf.tag + ',' + data.tags[f_conf.tag];
            }
            if(data.regions[f_conf.reg]) {
                hObj.region = f_conf.reg + ',' + data.regions[f_conf.reg];
            }

            SF.History.load({event:hObj});
        }
    }


    /**
     * Update list of tags in drop-down, show only tags for selected type.
     *
     * @param {Array} type - Type ID
     */
    function renderTagList(type) {
        var tags = getTagsByType(type),
            sel;

        //Render tags
        sel = document.getElementById('event_tag');
        sel.options.length = 0;

        sel.options[0] = new Option(data.tags['all'], 'all');

        var sortedTags = new Array();
        var keysTags = new Array();
        for(var i = 0; i < tags.length; i++) {
        	sortedTags[i] = data.tags[tags[i]];
        	keysTags[sortedTags[i]] = tags[i];
        }

        sortedTags.sort();
        for(var i = 0; i < sortedTags.length; i++) {
        	sel.options[i + 1] = new Option(sortedTags[i], keysTags[sortedTags[i]]);
        }
    }

    /**
     * Return list of tags for the events of given type.
     *
     * @param {STring} type - Type ID
     */
    function getTagsByType(type) {
        var result = [],
            e = data.events;

        if(data.tagsByType.hasOwnProperty(type)) {
            result = data.tagsByType[type];
        } else {
            //iterate through the events list and aggregate tags fo all events of given type
            for (var i in e) {
                if(e[i].type == type) {
                    result = SF.util.array_merge(true, result, e[i].tags);
                }
            }
            data.tagsByType[type] = result;
        }

        return result;
    }


    /**
     * Set selectedType variable is selected event type is changed.
     *
     * @param {String} type - Type ID
     */
    function setSelectedType(type) {
        if(selectedType != type) {
            renderTagList(type);
        }
        selectedType = type;
    }

    /**
     * Returns array of IDs of visible events.
     *
     * @param {Object} f_conf - current state of filters
     */
    function getVisible(f_conf) {
        var result = [],
            e = data.events;

        for(var i in e) {
            if(((parseInt(e[i]['featured']) > 0 && f_conf['type'] == 'f') || e[i]['type'] == f_conf['type'])
                && (f_conf['reg'] == 'all' || e[i]['reg'] == f_conf['reg'])
                && (f_conf['tag'] == 'all' || $.inArray(f_conf['tag'], e[i]['tags']) > -1)) {
                result.push(e[i]['id']);
            }
        }//alert (result);

        return result;
    }

    /**
     * Rerutns values of all filters
     */
    function getFiltersState() {
        return {
            type: selectedType,
            tag: $('#event_tag').val(),
            reg: $('#event_region').val()
        }
    }

    /**
     * Show busy state indicator
     */
    function showBusy() {
        $('.el-progress:hidden').slideDown('fast');
    }

    /**
     * Hide busy state indicator
     */
    function hideBusy() {
        $('.el-progress:visible').slideUp('fast');
    }

    /**
     * Show "No items found" message
     *
     * @param {Object} f_conf - current filters state
     */
    function showNoItems(f_conf) {
        var text;
        if(!data.regions[f_conf.reg]) {
            text = data.strings['no_items_noreg'].replace('${type}', data.types[f_conf.type]);
        } else {
            text = data.strings['no_items'].replace('${type}', data.types[f_conf.type]).replace('${region}', data.regions[f_conf.reg])
        }
        $('.el-zero').text(text).slideDown('fast');
    }

    /**
     * Hide "No items found" message
     */
    function hideNoItems() {
        $('.el-zero:visible').slideUp('fast');
    }

    /**
     * Is called when URL hash is changed
     *
     * @param {Object} hashObj
     * @param {String} hashStr
     */
    function historyCallback(hashObj, hashStr) {
        //console.log(hashObj);

        if(hashObj.hasOwnProperty('type')) {
            setSelectedType(hashObj.type.split(',')[0]);
            //Set active tab
            $('ul.el-tabs a.act').removeClass('act');
            $('#' + selectedType + TS).addClass('act');
        }
        if(hashObj.hasOwnProperty('tag')) {
            $('#event_tag').val(hashObj.tag.split(',')[0]);
        } else {
            $('#event_tag').val('all')
        }
        if(hashObj.hasOwnProperty('region')) {
            $('#event_region').val(hashObj.region.split(',')[0]);
        } else {
            $('#event_region').val('all');
        }

        updateList(true);
    }

    /**
     * Select "All Topics" and hide this filters
     */
    function resetAndHideTopics() {
        $('#event_tag').val('all').css('visibility', 'hidden').prev('label').css('visibility', 'hidden');
    }

    /**
     * Show Topic filters
     */
    function showTopics() {
        $('#event_tag').css('visibility', 'visible').prev('label').css('visibility', 'visible');
    }

    SF.addToDOMReady(init);

});

