/*
 * Author: Daniel Skantze, MRM Starsky
 * Date: 2009-06-08
 */
var feedcontrol = new FeedControl();
function FeedControl() {
	this.classname = "FeedControl";
	this.integrateOntology = true;
	
	this.init = function() {
		var scope = this;
		jQuery(".feedcontrols .edit").click(function(caller) {return scope.onExpand.call(scope, this, caller);});
		jQuery(".feedcontrols .save").click(function(caller) {return scope.onCollapse.call(scope, this, caller);});
		jQuery(".feedContainer .feed .deletelink").click(function(caller) {return scope.onRemove.call(scope, this, caller);});
		jQuery('input[name=provide_me_with_a_blog]').focus(function(){
			var noProvideBlog = jQuery('#addnewfeed .feed_url .noprovideblog');
			var provideBlog = jQuery('#addnewfeed .feed_url .provideblog'); 
			
			if(this.checked) {
				noProvideBlog.addClass("hide");
				provideBlog.removeClass("hide");
				noProvideBlog.next(".clearNull").addClass("hide");
				provideBlog.next(".clearNull").removeClass("hide");
				jQuery('input[name=meta_feed_0_provide_blog]').attr("checked", "checked");
			}else{
				noProvideBlog.removeClass("hide");
				provideBlog.addClass("hide");
				noProvideBlog.next(".clearNull").removeClass("hide");
				provideBlog.next(".clearNull").addClass("hide");				
				jQuery('input[name=meta_feed_0_provide_blog]').removeAttr("checked");
			}
		});	
		jQuery('#add_feed_button').click(function() {
			if (jQuery('input[name=provide_me_with_a_blog]').attr("checked")) {
				jQuery(".row.provideblog").hide();
			}
		});			
	}
	
	/**
	 * Clones the stickers under the add new feed section. Removes some layout, including selected
	 * stickers etc, then the feeds stickers are propagated to the expanded feed.  
	 * @param wrapper The element that contains the collapsed feed (.feedContainer)
	 * @param insertAfterNode The node inside the collapsed feed after which to insert the expanded section (.feed)
	 * @return the container of the inserted expanded section
	 */
	
	this.createEditStickers = function(wrapper, insertAfterNode) {
		var expandedFeedNode;
		var inp;
		var nameSticker;
		var stickers;
		var scope = this;
		var feedStickers = this.getCollapsedFeedStickers(wrapper);
		expandedFeedNode = jQuery("#addnewfeed").clone(true);
		expandedFeedNode.removeAttr("id");
		expandedFeedNode.addClass("editfeed");
		expandedFeedNode.removeClass("feed");
		jQuery('.about', expandedFeedNode).removeClass("shadowborder");
		insertAfterNode.after(expandedFeedNode);
		inp = jQuery("input.url", expandedFeedNode).closest(".sticker");
		inp.empty();
		inp.removeClass("sticker");
		nameSticker = jQuery(".sticker", wrapper)[0];
		inp.append(jQuery(nameSticker).clone());
		stickers = jQuery(".sticker", expandedFeedNode);
		// remove all selections from add new feed area
		stickers.each(function(i) { 
			scope.clearStickerSelection(this);
			// we need to re-init the stickers for some reason
			jQuery(this).unbind("click");
			stickerfields.initSticker(this);
		});
		// now propagate currently selected stickers to
		this.setExpandedFeedStickers(expandedFeedNode, 
				feedStickers.feedNo,
				feedStickers.language, 
				feedStickers.category, 
				feedStickers.country, 
				feedStickers.stickers);
		return expandedFeedNode;
	}
	
	this.clearStickerSelection = function(sticker) {
		jQuery("a", sticker).removeClass("selected");
		jQuery("input", sticker).removeAttr("checked"); 		
	}
	
	this.setStickerSelection = function(sticker) {
		jQuery("a", sticker).addClass("selected");
		jQuery("input", sticker).attr("checked", "checked"); 		
	}	
	
	this.clearDropDownSticker = function(sticker) {
		var st = jQuery(sticker);
		st.find('li:eq(0)').click();
	}
	
	this.renameStickerInputs = function(container, feedId) {
		var c = jQuery(container);
		c.find("input").each(function(i) {
			var a = jQuery(this).attr("name").replace(/^meta_feed_0_/, 'meta_feed_' + feedId + "_");
			jQuery(this).attr("name", a);
			
		});
		c.find("select").each(function(i) {
			var a = jQuery(this).attr("name").replace(/^meta_feed_0_/, 'meta_feed_' + feedId + "_");
			jQuery(this).attr("name", a);
		});	
	}
	
	this.getFeedId = function(wrapper) {
		return jQuery("input", wrapper).eq(0).attr("name").replace(/meta_feed_(\d+).*?$/, "$1");		
	}
	
	this.setStickerData = function(sticker, label, value, selected) {
		jQuery("input", sticker).attr("value", value);
		jQuery("span.label", sticker).html(label);
		if (selected === null) {
			return;
		}		
		if (selected) {
			jQuery("a", sticker).addClass("selected");
			jQuery("input", sticker).attr("checked", "checked");
		} else {
			jQuery("a", sticker).removeClass("selected");
			jQuery("input", sticker).removeAttr("checked"); 					
		}
		stickerfields.initSticker(sticker); 					
	}	
	
	/**
	 * Extracts stickers from a collapsed feed (under existing feeds)
	 * @param wrapper The element that contains the collapsed feed, typically an element with
	 * 			the feedContainer class 
	 * @return an object with the following fields: 
	 * 			language - The value of the language sticker [id]   
	 * 			category - The value of the category ['blog' | 'image' | 'video']
	 *			country  - The value of the country sticker [id]  			                                      
	 * 			stickers - An array with stickers [ids]
	 * 			feedNo   - The index of the existing feed (0-based)
	 */
	
	this.getCollapsedFeedStickers = function(wrapper) {
		var category = [];
		var language = null;
		var country = null;
		var feedNo = -1;
		var stickers = [];
		var inputs = jQuery(".feed input", wrapper);
		inputs.each(function(i) {
			var input = jQuery(this);
			var name = input.attr("name");
			var value = input.attr("value");
			if (name.indexOf("_category") > 0) {
				category = value;
			} else if (name.indexOf("_language") > 0) {
				language = value;
			} else if (name.indexOf("_country") > 0) {
				country = value;
			} else if (name.indexOf("_stickers[]") > 0) {
			  stickers.push(input.attr("value"));
			}
			if ((feedNo == -1) && (name.indexOf("meta_feed_") == 0)) {
				feedNo = name.replace(new RegExp("meta_feed_(.*?)_.*$"), "$1");
			}
		});
		return {language: language, category: category, country: country, stickers: stickers, feedNo: feedNo};
	}
	 
	 /**
	  * Adds the selected stickers to the collapsed feed layout. Does this by clearing the affected
	  * content and inserting the supplied stickers. 
	  * 
	  * @param collapsedFeedNode
	  * @param language
	  * @param category
	  * @param selStickers
	  * @return nothing
	  */
	 this.setCollapsedFeedStickers = function(collapsedFeedNode, language, category, country, selStickers) {
		 var container;
		// first set category
		 if (category != undefined) {
			 container = jQuery(".category", collapsedFeedNode);
			 jQuery("label", container).html(category.label + ":");
			 jQuery("input", container).attr("value", category.value);
		 }
		 if (language != undefined) {
			 container = jQuery(".language", collapsedFeedNode);
			 container.empty();
			 container.append('<label class="middle">&nbsp;in&nbsp;</label>');
			 container.append(language.sticker);
		 }
		 container = jQuery(".about", collapsedFeedNode);
		 container.empty();
		 if (country != undefined) {
			 container.append(country.sticker);
		 }
		 if (selStickers.length > 0) {
			 for (var i = 0; i < selStickers.length; i++) {
				 var obj = selStickers[i];
				 container.append(obj.sticker);
			 }
		 }
	 }
	
	/**
	 * Sets stickers on an expanded feed. See getCollapsedFeedStickers for more info. 
	 * @param expandedFeedNode
	 * @param feedNo
	 * @param language
	 * @param category
	 * @param selStickers
	 * @return
	 */
	this.setExpandedFeedStickers = function(expandedFeedNode, feedNo, language, category, country, selStickers) {
		var stickers; 
		stickers = jQuery(".sticker", expandedFeedNode);
		stickers.each(function(i) {
			var anchor = jQuery("a", this);
			var input = jQuery("input", this);
			var name = input.attr("name");
			name = name.replace("meta_addnewfeed", "meta_feed_" + feedNo);
			input.attr("name", name);
			var value = parseInt(input.attr("value"));
			if ((name.indexOf("_language") > 0) && (value == language)) {
				input.attr("checked", "checked");
				anchor.addClass("selected");				
				stickerfields.initSticker(this); 
			} else if ((name.indexOf("_stickers[]") > 0)) {
				for (var i = 0; i < selStickers.length; i++) {
					if (value == selStickers[i]) {
						input.attr("checked", "checked");
						anchor.addClass("selected");				
						stickerfields.initSticker(this); 
						break;
					}
				}
			}
		});
		stickers = jQuery(".dropdownsticker", expandedFeedNode);
		stickers.each(function(i) {
			var select = jQuery("select", this);
			var name = select.attr("name");
			name = name.replace("meta_addnewfeed", "meta_feed_" + feedNo);
			select.attr("name", name);
			if ((name.indexOf("_category") > 0) && (category != null)){
				var label = jQuery('.label', this)[0];
				var opt = jQuery('option[value=' + category.toLowerCase() + "]", select)[0];
				jQuery(label).html(jQuery(opt).html());
				select.selectedIndex = select.find("option").index(opt);
				jQuery("option", select).removeAttr("selected");
				jQuery("option[value=" + category.toLowerCase() + "]", select).attr("selected", "selected");				
			}
			if ((name.indexOf("_country") > 0) && (country != null)) {
				var label = jQuery('.label', this)[0];
				var opt = jQuery('option[value=' + country + "]", select)[0];
				jQuery(label).html(jQuery(opt).html());
				select.selectedIndex = select.find("option").index(opt);
				jQuery("option", select).removeAttr("selected");
				jQuery("option[value=" + country + "]", select).attr("selected", "selected");
			}
		});
	}
	
	 /**
	  * Gets selected stickers from expanded feed. Note, each returned sticker element is cloned
	  * Example: To get the sticker node for language:
	  * var obj =  this.getExpandedFeedStickers(expandedFeedNode);
	  * alert(obj.language.sticker.innerHTML);
	  * 
	  * @param expandedFeedNode
	  * @return object with the following fields
	  * 		language - {label: [sticker text], value: [id], sticker: [the sticker container element]}
	  * 		category - obj with same fields as language
	  * 		stickers - array of obj with same fields as language
	  */
	 
	this.getExpandedFeedStickers = function(expandedFeedNode) {
		var stickers; 
		stickers = jQuery(".sticker", expandedFeedNode);
		var language = {};
		var country = {};
		var category = {};
		var scope = this;
		var selStickers = new Array();
		stickers.each(function(i) {
			var anchor = jQuery("a", this);
			var input = jQuery("input", this);
			var name = input.attr("name");
			var label = jQuery(".label", anchor).html();
			var value = parseInt(input.attr("value"));
			if (anchor.hasClass("selected")) {
				var sticker = jQuery(this).clone();
				scope.clearStickerSelection(sticker);
				if (name.indexOf("_language") > 0) {
					language = {label: label, value: value, sticker: sticker};
				} else if (name.indexOf("_stickers") > 0) {
					selStickers.push({label: label, value: value, sticker: sticker});
				}
			}
		});
		stickers = jQuery(".dropdownsticker", expandedFeedNode);
		stickers.each(function(i) {
			var select = jQuery("select", this);
			var name = select.attr("name");
			if (name.indexOf("_category") > 0) {
				category["label"] = jQuery('.label', this).html();
				category["value"] = jQuery('option:selected', select).eq(0).attr("value");
				category["sticker"] = null;
			}
			if (name.indexOf("_country") > 0) {
					// get first available sticker
					country["value"] = jQuery('option:selected', select).eq(0).attr("value");
					if (country["value"] > 0) {
					country["label"] = jQuery('.label', this).html();
					var sticker = jQuery('.about .sticker', expandedFeedNode).eq(0).clone();
					var name = sticker.find("input").attr("name");
					sticker.find("input").attr("name", name.replace(/stickers\[\]/, "country"));
					scope.clearStickerSelection(sticker);
					scope.setStickerData(sticker, country["label"], country["value"], false);
					country["sticker"] = sticker;
				} else {
					country = null;
				}
			}			
		});		
		return {language: language, category: category, country: country, stickers: selStickers};
	}
	
	this.createExpandedFeedStickers = function(wrapper) {
		var expandedFeedNode = jQuery(".editfeed", wrapper);
		if (expandedFeedNode.length == 0) {
			var feedNode = jQuery(".feed", wrapper);
			var saveNode = jQuery(".feedcontrols .save", wrapper);
			var categoryNode;
			var feedId = this.getFeedId(wrapper);
			expandedFeedNode = this.createEditStickers(wrapper, feedNode);
			this.renameStickerInputs(expandedFeedNode, feedId);
			categoryNode = jQuery("div.category", expandedFeedNode).eq(0);
			categoryNode.removeClass("row");
			categoryNode.after(saveNode);
			saveNode.removeClass("hide");
		}		
	}
	  
	this.onExpand = function(caller, event) {
		var wrapper = jQuery(caller).closest(".feedContainer");
		var expandedFeedNode = jQuery(".editfeed", wrapper);
		var editNode = jQuery(".feedcontrols .edit", wrapper); 	
		var feedNode = jQuery(".feed", wrapper);
		var saveNode = jQuery(".feedcontrols .save", wrapper);		
		var title = jQuery(".title", wrapper);
		this.hideRemoveConfirm(wrapper);
		this.createExpandedFeedStickers(wrapper);
		feedNode.addClass("hide");
		editNode.addClass("hide");
		expandedFeedNode.removeClass("hide");
		saveNode.removeClass("hide");	
		jQuery('.title .label', wrapper).html(jQuery('.title .longtitle', wrapper).html());
	}
	
	this.onCollapse = function(caller, event) {
		var wrapper = jQuery(caller).closest(".feedContainer");
		var feedNode = jQuery(".feed", wrapper);
		var editNode = jQuery(".feedcontrols .edit", wrapper); 
		var saveNode = jQuery(".feedcontrols .save", wrapper);
		var title = jQuery(".title", wrapper);
		var expandedFeedNode = jQuery(".editfeed", wrapper);
		var stickers;
		this.hideRemoveConfirm(wrapper);
		feedNode.removeClass("hide");
		editNode.removeClass("hide");
		saveNode.addClass("hide");
		expandedFeedNode.addClass("hide");
		stickers = this.getExpandedFeedStickers(expandedFeedNode);
		this.setCollapsedFeedStickers(feedNode, stickers.language, stickers.category, stickers.country, stickers.stickers);
		jQuery('.title .label', wrapper).html(jQuery('.title .shorttitle', wrapper).html());
	}
	
	this.addCollapsedFeed = function(feedId) {
		var scope = this;
		var addnewfeed = jQuery("#addnewfeed");
		jQuery(".feed_error", addnewfeed).remove();
		var source = jQuery(".feedContainer.cloneable");
		var clone = source.clone(true);
		var provideBlog = addnewfeed.find("input[name=meta_feed_0_provide_blog]").attr("checked");
		var tmpTitle = (provideBlog) ? "Your blog at theworldlog" : "New feed";
		var url = addnewfeed.find("input[name=meta_feed_0_feed_url]").attr("value");
		
		clone.removeClass("hide");
		clone.removeClass("cloneable");
		clone.insertBefore(source);
		clone.find(".title span.label").html(tmpTitle);
		clone.find(".title span.longtitle").html(tmpTitle);
		clone.find(".title span.shorttitle").html(tmpTitle);
		clone.append('<input type="hidden" name="meta_feed_0_url" value="' + url + '" />');
		if (provideBlog) {
			clone.append('<input type="hidden" name="meta_feed_' + feedId + '_provide_blog" value="1" />');
		}
		var stickers = scope.getExpandedFeedStickers(addnewfeed);
		scope.setCollapsedFeedStickers(clone, stickers.language, stickers.category, stickers.country, stickers.stickers);
		scope.renameStickerInputs(clone, feedId);		
		return clone;
	}
	
	this.getNextCollapsedFeedId = function() {
		return jQuery(".feedContainer:not(.cloneable)").length + 1;
	}
	
	this.clearAddNewFeedSelection = function() {
		var scope = this;
		jQuery('#addnewfeed input[name=meta_feed_0_feed_url]').attr("value", "");
		jQuery('#addnewfeed .sticker').each(function(i) {
			scope.clearStickerSelection(this);
		});
		//mmkay, not too pretty. Here we set the second language sticker which happens to be English
		jQuery('#addnewfeed .language .sticker:eq(1)').each(function(i) {
			scope.setStickerSelection(this);
		});
		jQuery('#addnewfeed .dropdownsticker').each(function(i) {
			scope.clearDropDownSticker(this);
		});		
		jQuery('#addnewfeed .feed_url .noprovideblog').removeClass("hide");
		jQuery('#addnewfeed .feed_url .provideblog').addClass("hide");
	}
	
	this.resetProvideBlogState = function(wrapper, feedId, willShow) {
		var name = "meta_feed_" + feedId + "_provide_blog";
		if (wrapper.find('input[name=' + name + ']').length > 0) {
			jQuery('#addnewfeed .feed_url .noprovideblog').removeClass("hide");
			jQuery('#addnewfeed .feed_url .provideblog').addClass("hide");
			jQuery('input[name=meta_feed_0_provide_blog]').removeAttr("checked")
			if (jQuery('input[name=provide_me_with_a_blog]').attr("checked")) {
				jQuery('input[name=provide_me_with_a_blog]').removeAttr("checked").closest('.wrapper').removeClass("selected");
			}
			if (willShow) {
				jQuery(".row.provideblog").show();
			} else {
				jQuery(".row.provideblog").hide();				
			}
		}				
	}	
	
	this.onAddNewFeed = function(caller, event) {
		var scope = this;
		var url = jQuery('#addnewfeed input[name=meta_feed_0_feed_url]').attr("value");
		var provideBlog = false;
		var data = {meta_commit_feed: true, url: url};
		if (!url) {
			if (jQuery('input[name=provide_me_with_a_blog]').attr("checked")) {				
				data["provideBlog"] = "1";
				provideBlog = true;
			}
		}
		var addnewfeed = jQuery("#addnewfeed");
		jQuery(".feed_error", addnewfeed).remove();
		
		if (this.integrateOntology) {
			jQuery('.ajax_loader1', jQuery(caller).parent()).remove();
			jQuery(caller).after('<div class="ajax_loader1"></div>');			
			jQuery.post(jQuery(caller).closest("form")[0].action, data, function(data, textStatus) {
				var status = jQuery(data).find("status");
				if (status.attr('successful') == 'true') {
					var feedId = status.attr('inserted_feed_id');
					var wrapper = scope.addCollapsedFeed(feedId);
					scope.clearAddNewFeedSelection();
					if (provideBlog) {
						scope.resetProvideBlogState(wrapper, feedId, false);
					}
				} else {
					var error = jQuery(data).find("error").text();
					jQuery(addnewfeed).append('<div class="feed_error"><br />' + error + '</div>');
				}
				jQuery('.ajax_loader1', jQuery(caller).parent()).remove();
			}, "xml");
		} else {
			var nextId = this.getNextCollapsedFeedId();
			var wrapper = this.addCollapsedFeed(nextId);
			this.createExpandedFeedStickers(wrapper);
			var stickers = this.getCollapsedFeedStickers(wrapper);
			wrapper.find(".editfeed").addClass("hide");
			scope.clearAddNewFeedSelection();
			if (provideBlog) {
				scope.resetProvideBlogState(wrapper, nextId, false);
			}			
		}
	}
	
	this.onRemove = function(caller) {
		if (this.integrateOntology) {
			var wrapper = jQuery(caller).closest('.feedContainer'); 
			wrapper.children('.removeConfirm').removeClass("hide");
			return false;
		} else {
			return this.onCommitRemoveFeed(caller);
		}
	}
	
	this.onCancelRemoveFeed = function(caller) {
		this.hideRemoveConfirm(jQuery(caller).closest('.feedContainer'));
	}
	
	this.hideRemoveConfirm = function(wrapper) {
		wrapper.children('.removeConfirm').addClass("hide");
	}
	
	this.onCommitRemoveFeed = function(caller) {
		var wrapper = jQuery(caller).closest(".feedContainer");
		var feedId = this.getFeedId(wrapper);
		var scope = this;
		var isProvidedBlog = (jQuery('input[name*=_provide_blog]').length > 0);
		if (this.integrateOntology) {
			var data = {meta_remove_feed: true, feed_id: feedId};
			jQuery.post(jQuery(caller).closest("form")[0].action, data, function(data, textStatus){
				var status = jQuery(data).find("status");
				if (status.attr('successful') == 'true') {
					if ((isProvidedBlog) || (status.attr('removed_feed'))) {
						scope.resetProvideBlogState(wrapper, feedId, true);
					}
					wrapper.remove();	
				}
			}, "xml");
		} else {
			if (isProvidedBlog) {
				scope.resetProvideBlogState(wrapper, feedId, true);
			}
			// delete
			wrapper.remove();
		}
		return false;
	}
}