﻿var Bookmarks = function()
{
	var obj_list = null;
	var obj_btn = null;

	var heading = "<h3>Bokmärken</h3>";
	var lnk_add_text = "Lägg till sida som bokmärke";
	var lnk_remove_text = "Ta bort";
	var strip_title = "";
	var subTitle_split = ", ";
	var max_bookmarks = 0;
	var on_add_text = "";
	var on_remove_text = "";
	var on_full_text = "";
	var on_exists_text = "";
	var show_only_last_part = false;
	var lnk_divider = "/";
	var cookie_path = "/";
	var cs_allowed_hdr_classes = "pSNSHeader,SES_header"; // Used when extracting subtitle for a bookmark to a specific news or event

	return {
		add: function(url, title)
		{
			var u = url || this.getCurrentURL(url);
			var t = title || this.getCurrentTitle(document.title, u);

			var bkmrks = this.get();
			if (max_bookmarks > 0 && bkmrks.length >= max_bookmarks)
			{
				if (on_full_text.length > 0)
					alert(on_full_text);

				return false;
			}
			for (var i = 0; i < bkmrks.length; i++)
			{
				if (bkmrks[i][0] == u)
				{
					if (on_exists_text.length > 0)
						alert(on_exists_text);

					return false;
				}
			}			
			bkmrks[bkmrks.length] = [u, t];
			if (on_add_text.length > 0)
				alert(on_add_text);
			return this.save(bkmrks);
		},

		remove: function(url)
		{
			var bkmrks = this.get();
			for (var i = 0; i < bkmrks.length; i++)
			{
				if (bkmrks[i][0] == url)
				{
					bkmrks.splice(i, 1);
					break;
				}
			}
			if (on_remove_text.length > 0)
				alert(on_remove_text);
			return this.save(bkmrks);
		},

		get: function()
		{
			var res = [];
			if (document.cookie.length > 0)
			{
				var begin = document.cookie.indexOf("art_bookmarks=");
				if (begin != -1)
				{
					begin += "art_bookmarks=".length;
					end = document.cookie.indexOf(";", begin);
					if (end == -1)
						end = document.cookie.length;
					var cs = String(unescape(document.cookie.substring(begin, end)));
					var csArr = cs.split("¤ARTBKMRPGS¤");
					for (var i = 0; i < csArr.length; i++)
					{
						var vp = csArr[i].split("¤ARTBKMR¤");
						if (vp.length == 2)
							res[res.length] = [vp[0], vp[1]];
					}
				}
			}
			return res;
		},

		init: function(objBookmarks, objBtnBookmarks)
		{
			obj_list = document.getElementById(objBookmarks);
			obj_btn = document.getElementById(objBtnBookmarks);
			if (obj_btn)
				obj_btn.innerHTML = "<a href=\"#\" onclick=\"Bookmarks.add(); return false;\">" + lnk_add_text + "</a>";

			this.load();
		},

		load: function(bookmarkList)
		{
			if (!obj_list)
				return false;

			var c = heading;

			var bkmrks = bookmarkList || this.get();
			if (bkmrks.length > 0)
			{
				c += "<ul>\n";

				for (var i = 0; i < bkmrks.length; i++)
				{
					c += "<li><a href=\"" + bkmrks[i][0] + "\" title=\"" + bkmrks[i][1] + "\">" + this.getDisplayText(bkmrks[i][1]) + "</a> <span><a href=\"#\" onclick=\"Bookmarks.remove('" + bkmrks[i][0] + "'); return false;\">" + lnk_remove_text + "</a></span></li>\n";
				}

				c += "</ul>\n";
			}

			obj_list.innerHTML = c;

			return true;
		},

		save: function(bookmarkList)
		{
			document.cookie = "art_bookmarks=; expires=Fri, 27 Jul 2001 02:47:11 UTC; path=" + cookie_path + ";";
			var bookmarkArr = [];
			for (var i = 0; i < bookmarkList.length && (i < max_bookmarks || max_bookmarks == 0); i++)
			{
				bookmarkArr[bookmarkArr.length] = bookmarkList[i].join("¤ARTBKMR¤");
			}
			var expireDate = new Date();
			expireDate.setFullYear(expireDate.getFullYear() + 5);
			document.cookie = "art_bookmarks=" + escape(bookmarkArr.join("¤ARTBKMRPGS¤")) + "; expires=" + expireDate.toGMTString() + "; path=" + cookie_path + ";";
			return this.load(bookmarkList);
		},

		getDisplayText: function(str)
		{
			if (!show_only_last_part)
				return str;

			var a = str.split(lnk_divider);
			if (a.length > 0)
				return a[a.length - 1];

			return "-";
		},
		
		getWP4Iframe: function() 
		{
			return document.getElementById("mainPlaceHolderIFrame");
		},
		
		getCurrentURL: function(p_url)
		{
		    var currentURL = p_url || location.href;
            var wp4Iframe = this.getWP4Iframe();
		    if(null != wp4Iframe && typeof(wp4Iframe) != "undefined")
		    {
				var baseUrlArr = currentURL.split("#");
				var baseUrl = baseUrlArr[0];
				var baseAnchorName = 1 < baseUrlArr.length ? baseUrlArr[1] : "";
				
				var iQstr = wp4Iframe.contentWindow.document.location.search;
				// Check if parameters already exists in the baseUrl
				if(-1 != baseUrl.indexOf("?"))
				{
					iQstr = iQstr.substr(iQstr.indexOf("?") + 1);
					var iParamsArr = iQstr.split("&");
					var bArr = baseUrl.split("?");
					var bUrlParams =  "?" + bArr[1];
					var paramName = "";
					var paramValue = "";
					for(var i = 0; i < iParamsArr.length; i++)
					{
						paramName = iParamsArr[i].split("=")[0];
						paramValue = this.getURLParam(bUrlParams, paramName); //Does the parameter already exist and have a value?
						if(1 > paramValue.length)
							bUrlParams += "&" + iParamsArr[i];
					}
					currentURL = bArr[0] + bUrlParams + baseAnchorName;
				}
				else //If no parameters exist in the baseUrl
				{
					currentURL = baseUrl + iQstr + baseAnchorName;
				}
		    }		    
		    return currentURL;
		},
		
		getURLParam: function( p_urlStr, p_strParamName)
		{
			var strReturn = "";
		  	var strHref = p_urlStr;

		  	if ( strHref.indexOf("?") > -1 )
		  	{
		    	var strQueryString = strHref.substr(strHref.indexOf("?")).toLowerCase();
		    	var aQueryString = strQueryString.split("&");
		    	for ( var iParam = 0; iParam < aQueryString.length; iParam++ )
		    	{
		    		if ( aQueryString[iParam].indexOf(p_strParamName.toLowerCase() + "=") > -1 )
		    		{
		        		var aParam = aQueryString[iParam].split("=");
		       			strReturn = aParam[1];
		        		break;
		     		}
		    	}
		  }
		  return strReturn;
		},
		
		getCurrentTitle: function(p_title, p_url)
		{	
			var t = p_title;
			var wp4Iframe = this.getWP4Iframe();
			var subTitle = "";
			if(null != wp4Iframe && typeof(wp4Iframe) != "undefined")
		    {
				subTitle = wp4Iframe.contentWindow.document.title;
				iTtl = subTitle.toLowerCase();
				// Quick & Dirty for Forum- and Linkbank-template that have a static title value for page that
				// presents a single "Link" or forum-thread.
				if(iTtl == "forum") 
				{
					var hdrArr = wp4Iframe.contentWindow.document.getElementsByTagName("h1");
					if(0 < hdrArr.length)
						subTitle = this.getInnerText(hdrArr[0]);
				}
				else if(iTtl == "untitled page") // Presentation of a Linkbank-page
					subTitle = "";
			}
			else
			{
				var hdrArr = document.getElementsByTagName("h1");
				var pNode = null;
				for(var i = 0; i < hdrArr.length; i++)
				{
					pNode = hdrArr[i].parentNode;
					if(null != pNode && typeof(pNode.className) != "undefined")
					{
						if(0 < pNode.className.length && -1 != cs_allowed_hdr_classes.indexOf(pNode.className))
						{
							subTitle = this.getInnerText(hdrArr[i]);
							break;
						}
					}
				}
			}
			if(0 < subTitle.length)
				subTitle = subTitle_split + subTitle
			t = t + subTitle;
			
			return t.replace(strip_title, "");
		},
		
		getInnerText: function(p_element) 
		{
			if(null == p_element)
				return "";
				
		    var innerText;
			if (typeof(p_element.innerText) == 'undefined') 
		  		innerText = p_element.innerHTML.replace(/<[^>]+>/g,"");
			else
				innerText = p_element.innerText
				
			return innerText;
		},

		setHeading: function(h) { heading = h; },
		setAddText: function(text) { lnk_add_text = text; },
		setRemoveText: function(text) { lnk_remove_text = text; },
		setStripFromTitle: function(text) { strip_title = text; },
		setSubTitleSplit: function(text) { subTitle_split = text; },
		setMaxBookmarks: function(nItems) { max_bookmarks = nItems; },
		setOnAddText: function(text) { on_add_text = text; },
		setOnRemoveText: function(text) { on_remove_text = text; },
		setOnFullText: function(text) { on_full_text = text; },
		setOnExistsText: function(text) { on_exists_text = text; },
		showOnlyLastPart: function(p, divider) { show_only_last_part = p; if (divider) lnk_divider = divider; },
		setCookiePath: function(path) { cookie_path = path; },
		setAllowedHdrParentClasses: function(cs_text) { cs_allowed_hdr_classes = cs_text; }
	};
}();