// x
function ZoolooFeeds() {
	this.configCache = {};
   	this.urlRegex = /(http|feed|rss|news):\/\/(\w+:{0,1}\w*@)?(\S+)(:[0-9]+)?(\/|\/([\w#!:.?+=&%@!\-\/]))?/;

   	this.setup = function(widgetId, widgetConf, elementAltId) { 
    	var selector = $("#zfeeds_content_" + widgetId + " .zfeeds_feed");
      	
      	ZFeeds.zFeedsSetupVisuals(selector);
      	ZFeeds.zFeedsCacheConfig(widgetId, widgetConf);

      	if (widgetConf && widgetConf.hasOwnProperty('filter') && widgetConf.filter.length === 0 && widgetConf.read !== 1) {
        	ZFeeds.zFeedsToggleConfig(widgetId, 1);
	  	}
   	};

   	this.zFeedsSetupVisuals = function(selector) {
    	$(".zfeeds_feed_header", selector).click(function() { 
    		$(this).parent().find(".zfeeds_feed_items").slideToggle();
    	}).hover(function() {
    		$(this).addClass("zfeeds_feed_hover");
    	}, function() {
    		$(this).removeClass("zfeeds_feed_hover");
    	});
   	};

   	this.toggleOptions = function(id) {
    	var conf = ZFeeds.zFeedsGetCachedConfig(id);

      	if (conf === null) {
        	return;
      	}

      	ZFeeds.zFeedsToggleConfig(id);
   	};

    this.refresh = function (elementId, altId)
    {
        ZFeeds.zFeedsRefreshFeeds(elementId);
    };

   	this.getConf = function (domId) {
    	var feedTest = /zc_template_widget_feed_(.+)/;
      	var categoryId, matches, config = {};

      	if (feedTest.test(domId)) {
         	matches = feedTest.exec(domId);
         	categoryId = matches[1];
      	} else {
        	categoryId = '';
      	}

      	switch(domId) {
         	case 'zc_template_widget_feed_zoftheday_interestingthings':
         	case 'zc_template_widget_feed_zoftheday_jokeoftheday':
         	case 'zc_template_widget_feed_zoftheday_quoteoftheday':
         	case 'zc_template_widget_feed_zoftheday_simplyrecipes':
         	case 'zc_template_widget_feed_zoftheday_wordoftheday':
         	case 'zc_template_widget_feed_parenting_babynameoftheday':
            	config = {'max_items': 1, 'show_description': true, 'category_id': categoryId};
            break;

         	case 'zc_template_widget_tools_rss':
            	categoryId = 'custom';
         	case 'zc_template_widget_feed_sports_nfl':
         	case 'zc_template_widget_feed_sports_mlb':
            	config = {'category_id': categoryId, 'filter': []};
            break;
            
         	case 'zc_template_widget_feed_news_local':
         	case 'zc_template_widget_feed_sports_nba':
         	case 'zc_template_widget_feed_sports_nhl':
            	config = {'category_id': categoryId, 'filter': [], 'use_summary': true};
            break;
            
         	case 'zc_template_widget_feed_zoftheday_horoscopes':
            	config = {'category_id': categoryId, 'filter': [], 'show_description': true, 'max_items': 1, 'use_summary': true, 'suppress_count_option': true};
            break;
            
         	default:
            	config = {'category_id': categoryId};
            break;
      	}

      	return config;
   	};
   
   	this.zFeedsRefreshFeeds = function (widgetId) {
      	var widgetConf = ZFeeds.zFeedsGetCachedConfig(widgetId);
      	
      	if (widgetConf === null) {
         	return;
      	}

      	$('#zfeeds_content_' + widgetId).html('<div class="zrefreshingfeeds">'+ ZMsg.ZFEEDS_REFRESHING_FEEDS +'</div>');

		ZFramework.zfAjaxPost('/zFeeds/getFeeds', {
			'id': widgetId,
			'conf': JSON.stringify(widgetConf)
		}, false, function(response) { 
        	if (response.status === 1) {
            	var selector = $('#zfeeds_content_' + widgetId);
               
               	$(selector).html(response.data);
               	
               	if ($('.zfeeds_category_name', selector).length > 0) {
                	var newTitle = $('.zfeeds_category_name', selector).html();
                  
                  	ZContainer.updateElementContainerTitle(widgetId, newTitle);
               	}
            }
		}, function() {
			$('#zfeeds_content_' + widgetId).html('<i>' + ZMsg.ZFEEDS_UNABLE_TO_RETRIEVE + '</i>');
		});
   	};

    // forceDirection is an optional parameter which allows you to guarantee
    // hiding or showing the config dialog. 
    //
    // -1: Always Close
    // 1: Always Open
    // default: Toggle
    
   	this.zFeedsToggleConfig = function(id, forceDirection) {
    	var conf = ZFeeds.zFeedsGetCachedConfig(id);
      
      	if (conf === null) {
       		return;
      	}

      	var configElement = $('#zfeeds_config_' + id);
      	var contentElement = $('#zfeeds_content_' + id);
        var settingElement = $('#setting_' + id);

        if (forceDirection === -1)
        {
            settingElement.slideUp('medium');
        }
        else if (forceDirection === 1)
        {
            settingElement.slideDown('medium');
        }
        else
        {
            settingElement.slideToggle('medium');
        }

      	if ($(configElement).css('display') !== 'none' && $('I', configElement).length > 0) {
         	var postOptions = {'category_id': conf.category_id, 'widget_id': id};
         
         	if (conf.hasOwnProperty('use_summary')) {
            	postOptions.use_summary = conf.use_summary;
         	}
         
         	if (conf.hasOwnProperty('suppress_count_option')) {
             	postOptions.suppress_count_option = conf.suppress_count_option;
         	}
         
         	if (conf.hasOwnProperty('filter')) {
             	postOptions.filter = JSON.stringify(conf.filter);
         	}
         
         	if (conf.hasOwnProperty('read')) {
             	postOptions.read = conf.read;
         	} else {
             	postOptions.read = 0;
         	}

         	ZFramework.zfAjaxPost('/zFeeds/getConfigDialog',
            	postOptions,
            	false, function(response) {
               		if (response.status === 1) {
                  		var responseElement = $(response.data);
                  
                  		$(configElement).html(responseElement);

	                  	if ($('select[name=feeds]', responseElement).length > 0) {
	                      	if (conf.hasOwnProperty('filter')) {
	                          	$('select', responseElement).selectOptions(conf.filter[0]);
	                      	}
	
	                      	$('select[name=feeds]', responseElement).change(function () {
	                          	var newFeedId = parseInt($('option:selected', this).val(), 10);
	                          
	                          	ZFeeds.zFeedsUpdateConfig(id, {'filter': [newFeedId]}, true); 
                                ZFeeds.zFeedsToggleConfig(id, -1);
	                      	}, true);
	                  	} else {
	                     	var selector = $('#zfeeds_config_form_' + id);
	                     
	                     	$(selector).submit(function () {
	                     		return ZFeeds.zFeedsHandleConfigSubmit(id);
	                     	});
	                  	}
	
	                  	if ($('select[name=feedcount]', responseElement).length > 0) {
	                      	$('select[name=feedcount]', responseElement).change(function () {
								ZFeeds.zFeedsUpdateConfig(id, {
									'max_items': parseInt($('option:selected', this).val(), 10)
								}, true);
                                ZFeeds.zFeedsToggleConfig(id, -1);
							}).selectOptions(conf.hasOwnProperty('max_items') ? String(conf.max_items) : '5');
	                  	}
	               	} else {
	                	ZFramework.alert('Unable to get config dialog: ' . response.error);
	               	}
	            }, function() {
	            	ZFramework.alert(ZMsg.ZFEEDS_CANT_GET_CONFIG);
	            }
         	);
      	}
   	};

    this.zFeedsUpdateConfig = function(id, newConfOptions, reloadWidget, destroyConfDialog) {
        var conf = ZFeeds.zFeedsGetCachedConfig(id);
        var index, configElement, contentElement, successCallback = function() {};

        if (conf === null || id < 1) {
            return;
        }

        for (index in newConfOptions) {
            if (newConfOptions.hasOwnProperty(index)) {
                conf[index] = newConfOptions[index];
            }
        }

        if (reloadWidget === true) {
            successCallback = function () {
                var configElement = $('#zfeeds_config_' + id);
                var contentElement = $('#zfeeds_content_' + id);

                ZFeeds.zFeedsToggleConfig(id, -1);

                ZFeeds.zFeedsRefreshFeeds(id);

                if (destroyConfDialog === true) {
                    configElement.html('<i>&nbsp;</i>');
                }
            };
        }

        ZFeeds.zFeedsCacheConfig(id, conf);
        ZContainer.updateElement(id, conf, successCallback, function() {
        	ZFramework.alert(ZMsg.ZFEEDS_FAILED_CONFIG_SAVE);
        });
    };

   	this.zFeedsHandleConfigSubmit = function(id) {
      	var formElement = $('#zfeeds_config_form_' + id);
      	var customUrl = $('input[name="url"]', formElement).val();
      	var customDescription = $('input[name="description"]', formElement).val();

      	if (!ZFeeds.urlRegex.test(customUrl)) {
          	ZFramework.alert('The feed addresss you entered is not a valid URL!\nPlease enter a valid address.');
          	return false;
      	} else if (customDescription.length < 1) {
          	ZFramework.alert('You must enter a title for your feed!');
          	return false;
      	}

      	$('input', formElement).attr('disabled', true);

      ZFramework.zfAjaxPost(
         '/zFeeds/addCustomFeed',
         {'url': customUrl},
         true,
         function (response)
         {
            if (response.status === 1)
            {
               var data = response.data;
               if (data.hasOwnProperty('zooloo_site'))
               {
                   var isBlog;
                   if (data.hasOwnProperty('is_blog'))
                       isBlog = true;
                   else if (data.hasOwnProperty('is_graffiti'))
                       isBlog = false;

                   ZFeeds.zFeedsUpdateConfig(id, {'filter': [1], 'feed_title': customDescription, 'zooloo_site': data.zooloo_site, 'is_blog': isBlog}, true, true);
               }
               else if (data.hasOwnProperty('feed_id') || data.hasOwnProperty('ok'))
               {
                  var newFeedId = data.hasOwnProperty('feed_id') ? data.feed_id : data.ok;
                  ZFeeds.zFeedsUpdateConfig(id, {'filter': [newFeedId], 'feed_title': customDescription}, true, true);
               }
               else if (data.hasOwnProperty('dialog'))
               {
                   var dialog = $(data.dialog);
                   dialog
                       .find('.zfeeds_feed_choice')
                           .click(function(e) 
                           { 
                               var href = $(this).attr('href');
                               $('input[name="url"]', formElement).val(href);
                               $.modal.close(false);
                               ZFeeds.zFeedsHandleConfigSubmit(id);
                               e.preventDefault(); 
                               return false; 
                           })
                       .end()
                       .modal();
               }
               else
               {
                  if (data.hasOwnProperty('failed'))
                  {
                     ZFramework.alert(ZFramework.i18n(ZMsg.ZFEEDS_FAILED_CUSTOM_FEED, {'reason': data.failed}));
                  }
               }
            }
            
            $('input', formElement).attr('disabled', false);
		}, function() { 
        	$('input', formElement).attr('disabled', false);
            ZFramework.alert(ZMsg.ZFEEDS_CUSTOM_SERVER_ERR);
        });
	  
      	return false;
	};

   	this.zFeedsCacheConfig = function(widgetId, config) {
      	ZFeeds.configCache[widgetId] = config;
   	};

   	this.zFeedsGetCachedConfig = function(widgetId) {
      	return ZFeeds.configCache.hasOwnProperty(widgetId) ? ZFeeds.configCache[widgetId] : null;
   	}; 
}
ZoolooFeeds.prototype = new ZoolooElement();
var ZFeeds = new ZoolooFeeds();
