/////////////////////////////// constants //////////////////////////////////
// the amount of tags in cloud
var TAGS_MULTIPLIER = 0.042;
// the amount of search tags in cloud.
var SEARCH_TAGS_MULTIPLIER = 0.015;
// tips for posts
var TIP_IMAGES_PREFIX = "/images/tips/";
// the location of icons files
var ICONS_SUFFEX = "/icons/";
// last update datetime to prevent to often updates
var lastUpdateDateTime = new Date();
// ///////////////////////////// cookies ////////////////////////////////////

var SESSION_COOKIE = "JSESSIONID";
var EMAIL_COOKIE = "EMAIL_ID";
var SUBSCRIBED_COOKIE = "SUBSCRIBED";

getCookie = function(name) {
	if (document.cookie.length > 0) {
		var start = document.cookie.indexOf(name + "=");
		if (start != -1) {
			start = start + name.length + 1;
			var end = document.cookie.indexOf(";", start);
			if (end == -1)
				end = document.cookie.length;
			return unescape(document.cookie.substring(start, end));
		}
	}
	return null;
};

clearCookie = function(name) {
	document.cookie = name
			+ "=null; expires=Thu, 01-Jan-70 00:00:01 GMT; path=/;";
};

setCookie = function(name, value, expiredays) {
	if (typeof value == "undefined" || value === null) {
		clearCookie(name);
	} else {
		// set cookie
		var exdate = new Date();
		exdate.setDate(exdate.getDate() + expiredays);
		document.cookie = name
				+ "="
				+ encodeURIComponent(value)
				+ ((expiredays == null) ? "" : ";expires="
						+ exdate.toUTCString()) + "; path=/;"; // domain=newsbuild.com;";
	}
};

// ////////////////////email checker /////////////////////////////////////////
isEmail = function(string) {
	if (string == undefined)
		return false;
	if (string
			.search(/^\w+((-\w+)|(\.\w+))*\@[A-Za-z0-9]+((\.|-)[A-Za-z0-9]+)*\.[A-Za-z0-9]+$/) != -1)
		return true;
	else
		return false;
};

// ////////////////////// screen locking ///////////////////////////////

lock = function(id) {
	// close old popups	
	window.nd();
	// window size
	var v_width = '0%';
	var v_top = (((($(window).height() - $(id).height()) / 3) * 100) / $(window)
			.height()) + '%';
	var v_left = (((($(window).width() - $(id).width()) / 2) * 100) / $(window)
			.width()) + '%';
	$.blockUI( {
		message : $(id),
		css : {
			border : 'none',
			cursor : 'default',
			width : v_width,
			top : v_top,
			left : v_left,
			color : '#555555'
		},
		overlayCSS : {
			backgroundColor : '#fff',
			opacity : 0.3
		}
	});
};

lockobject = function(object) {
	// close old popups
	window.nd();
	// window size
	var v_width = '0%';
	var v_top = (((($(window).height() - object.height()) / 3) * 100) / $(
			window).height()) + '%';
	var v_left = (((($(window).width() - object.width()) / 2) * 100) / $(window)
			.width()) + '%';
	$.blockUI( {
		message : object,
		css : {
			border : 'none',
			cursor : 'default',
			width : v_width,
			top : v_top,
			left : v_left,
			color : '#555555'
		},
		overlayCSS : {
			backgroundColor : '#fff',
			opacity : 0.3
		}
	});
};

unlock = function() {
	window.nd();
	$.unblockUI();
	window.nd();	
};

// /////////////////////// window //////////////////////////////

reload = function(sufix) {
	if (sufix == undefined) {
		window.location = '';
	} else {
		window.location = sufix;
	}
};

// ///////////////////// password strength validator /////////////////////
checkPasswordStrength = function(pwd) {
	// regex
	var strongRegex = new RegExp(
			"^(?=.{8,})(?=.*[A-Z])(?=.*[a-z])(?=.*[0-9])(?=.*\W).*$", "g");
	var mediumRegex = new RegExp(
			"^(?=.{7,})(((?=.*[A-Z])(?=.*[a-z]))|((?=.*[A-Z])(?=.*[0-9]))|((?=.*[a-z])(?=.*[0-9]))).*$",
			"g");
	var enoughRegex = new RegExp("(?=.{6,}).*", "g");
	// check
	if (pwd.length == 0) {
		return false;
	} else if (false == enoughRegex.test(pwd)) {
		return false;
	} else if (strongRegex.test(pwd)) {
		return true;
	} else if (mediumRegex.test(pwd)) {
		return true;
	} else {
		return false;
	}
};

// ///////////////////////// page utils /////////////////////////////
charsInTitle = function(persents) {
	// get the size of window and amount of chars
	return (($(window).width() * persents / 100) / 7) | 0;
};

amountOfPages = function(amount, amountOnPage) {
	// amount of pages for posts
	return (amount / amountOnPage + (amount % amountOnPage > 0 ? 1 : 0)) | 0;
};

// preloading images
preloadImages = function() {
	var args = [
			'/images/btn_arrleft_h.gif',
			'/images/btn_arrleft2_h.gif',
			'/images/btn_arrright_h.gif',
			'/images/btn_arrright2_h.gif',
			'/images/btn_refresh_h.gif',
			// tips
			'/images/tips/ico_chart.png', '/images/tips/ico_bonds.png',
			'/images/tips/ico_commodities.png',
			'/images/tips/ico_currencies.png',
			'/images/tips/ico_earnings01.png', '/images/tips/ico_equities.png',
			'/images/tips/ico_ipo.png', '/images/tips/ico_ma.png',
			'/images/tips/ico_markets.png', '/images/tips/ico_small_cap.png',
			'/images/tips/ico_top_stories.png' ];
	// load images
	for (i = 0; i < args.length; i++) {
		$("<img>").attr("src", args[i]);
	}
};

// /////////////////////// common initialization ///////////////////////
commonInit = function() {
	// preload images
	preloadImages();

	// search ENTER key
	var searchtext = $("#searchtext");
	searchtext.keyup(function(event) {
		if (event == null) { // ie
				keycode = window.event.keyCode;
			} else { // mozilla
				keycode = event.which;
			}
			if (keycode == 13) { // ENTER
				var str = this.value;
				if (str != null && str != "") {
					return searchPosts(str);
				} else {
					return clearFilters();
				}
			}
		});

	// auto-complete initiation
	searchtext.autoComplete( {
		ajax : '/services',
		delay : 500,
		width : 300,
		minChars : 1,
		postData : {
			type : 'companies'
		}
	});

	// navigation images
	$(".ctrlbtn").mouseout(function() {
		// change image
			var img = this.src;
			this.src = this.getAttribute("high");
			this.setAttribute("high", img);
		}).mouseover(function() {
		var img = this.src;
		this.src = this.getAttribute("high");
		this.setAttribute("high", img);
	});

	// close windows handler
	$('.closelabel').click(function(event) {
		unlock();
	});

	// bottom panel links handlers
	$('#contactusLink').click(function(event) {
		lock('#windowcontactus');
	});

	// dialogs initialization
	windowsignup_init();
	windowforgetpass_init();
	windowcontactus_init();

	// window resize listener
	$(window).resize(function() {
		// not often than one for 2 seconds
			if (Math.abs(new Date().getSeconds()
					- lastUpdateDateTime.getSeconds()) > 2) {
				updatePosts();
				// and tags
				updatePopularCompanies();
				updateKeywords();
				// save last date
				lastUpdateDateTime = new Date();
			}
		});

	var doc = $(document);
	// ESC handler
	doc.keydown(function(event) {
		if (event == null) { // ie
				keycode = window.event.keyCode;
			} else { // mozilla
				keycode = event.which;
			}
			if (keycode == 27) { // escape, close box, esc
				// unlock
				unlock();
			}
		});
	
	// windowid
	var windowid = $('#windowid');
	if(windowid != undefined && windowid.html() != null) {
		$('#leftTable').mousemove(function(event){
			// add marker
			if(windowid.attr("marked") == undefined) {
				// img
				windowid.append($("<img>").attr("src", "/marker.png"));
				windowid.attr("marked", "true");
			}
			windowid.css("left", (event.pageX - 2) + 'px');
			windowid.css("top", (event.pageY - 2) + 'px');
		});
		$('#rightTable').mousemove(function(event){
			// add marker
			if(windowid.attr("marked") == undefined) {
				// img
				windowid.append($("<img>").attr("src", "/marker.png"));
				windowid.attr("marked", "true"); 
			}
			windowid.css("left", (event.pageX - 2) + 'px');
			windowid.css("top", (event.pageY - 2) + 'px');
		});
	}	

	// add timers and start them
	doc.oneTime("5s", function() {
		updatePopularCompanies();
		updateKeywords();
		updatePosts();
	});

	doc.everyTime("120s", function(i) {
		updatePopularCompanies();
		updateKeywords();
		updateCategories();
		updatePosts();
	});

	/*doc.everyTime("30s", function(i) {
		updateQuotes();
	});*/
};
// /////////////////////// overlib /////////////////////////////////////
postmouseover = function(status, image, fullTitle, description, source,
		category, companies, keywords) {
	var companiesStr = "";
	if (companies != undefined && companies != '') {
		companiesStr = "<tr><td class='tipCategoryTickers'>Companies: "
				+ companies + "</td></tr>";
	}
	var keywordsStr = "";
	if (keywords != undefined && keywords != '') {
		keywordsStr = "<tr><td class='tipCategoryTickers'>Topics: " + keywords
				+ "</td></tr>";
	}
	return window
			.overlib(
					"<table class='windowpost'><tr><td class='tipHeader'><div class='tipIcon'><img border='0' src='"
							+ image
							+ "'> </div>"
							+ fullTitle
							+ "</td></tr><tr><td class='tipBody'>"
							+ description
							+ "</td></tr><tr><td class='tipSource' colSpan='3'>Source: <b>"
							+ source
							+ "</b></td></tr><tr><td class='tipCategoryTickers'>Category: <b>"
							+ category
							+ "</b></td></tr>"
							+ companiesStr
							+ keywordsStr + "</table>", window.FULLHTML,
					window.HAUTO, window.VAUTO, window.DELAY, 250);
};

hintmouseover = function(title) {
	return window.overlib(
			"<table cellpadding=0 cellspacing=0 border=0><tr><td class='tipTag'>"
					+ title + "</td></tr></table>", window.FULLHTML,
			window.DELAY, 100, window.CENTER, window.OFFSETY, 25,
			window.OFFSETX, 20);
};

companymouseover = function(title) {
	return window.overlib(
			"<table cellpadding=0 cellspacing=0 border=0><tr><td class='tipTag'>"
					+ title + "</td></tr></table>", window.FULLHTML,
			window.HAUTO, window.DELAY, 100, window.OFFSETY, 25,
			window.OFFSETX, 20);
};

mouseout = function() {
	return window.nd();
};

// //////////////////////////// errors or dialogs ///////////////////////////
showErrorImage = function(id, title) {
	var el = $(id);
	// set title
	el.attr('title', title);
	// set visible
	el.show();
};

showMessage = function(title, message, func) {
	// set title
	$("#windowok_title").text(title);
	// set message
	$("#windowok_message").text(message);
	// set function for ok
	if (func != undefined) {
		// close button
		$("#windowok_ok_image").click(func);
	}
	// set visible
	lock("#windowok");
};

// logout links
logout = function() {
	// send JSON
	$.jsonp( {
		url : '/security',
		data : {
			type : 'logout'
		},
		callbackParameter : "callback",
		success : function(data) {
			// clear cookies
		clearCookie(SESSION_COOKIE);
		clearCookie(SUBSCRIBED_COOKIE);
		// redirect to main page
		reload();
	}
	});
};

// counts amount of tags for page
amountOfTags = function() {
	return ($(window).width() * TAGS_MULTIPLIER) | 0;
};
amountOfSearchTags = function() {
	return ($(window).width() * SEARCH_TAGS_MULTIPLIER) | 0;
};

// shows menu with user settings
showUserSettings = function() {
	return window
			.overlib(
					'<table class="windowsprymenu"><tr class="windowsprytr" onmouseover="this.className=\'windowsprytr_hv\'; return true;" onmouseout="this.className=\'windowsprytr\'; return true;"><td class="windowsprytd"><div class="sprymenuitem" onclick="window.nd(); return showWindowChangePassword();">Change Password</div></td></tr><tr class="windowsprytr" onmouseover="this.className=\'windowsprytr_hv\'; return true;" onmouseout="this.className=\'windowsprytr\'; return true;"><td class="windowsprytd"><div class="sprymenuitem" onclick="window.nd(); return showWindowSubscribe();">Subscription</div></td></tr></table>',
					window.FULLHTML, window.STICKY, /* window.TIMEOUT, 5000, */
					window.DELAY, 250);
};

// updates tables with posts
updateTable = function(data, prefix) {
	// if no posts
	if (data.amount > 0) {
		// show block
		$("tr[hider='" + prefix + "TablePanel']").show();
	} else {
		// show block
		$("tr[hider='" + prefix + "TablePanel']").hide();
	}

	// set amount
	$("#" + prefix + "Amount").text("(" + data.amount + ")");

	// clear table
	$("#" + prefix + "TableBody > tr").remove();
	var tbody = $("#" + prefix + "TableBody");
	// add new posts
	$.each(data.posts, function(i, post) {
		var tr = $("<tr>").addClass("dtln" + post.marketStatus);
		// event
		tr.mouseover(function() {
			var image = TIP_IMAGES_PREFIX
					+ post.feed.feedCategory.iconFileName;
			this.className = "dtln" + post.marketStatus + "_hv";
			// array with companies
			var companies = '';
			for ( var k = 0; post.companies != undefined
					&& k < post.companies.length; k++) {
				companies += "<b>"
						+ post.companies[k].title
						+ "</b>"
						+ ((k + 1) < post.companies.length ? ' | '
								: '');
			}
			// array with keywords
			var keywords = '';
			for ( var k = 0; post.keywords != undefined
					&& k < post.keywords.length; k++) {
				keywords += "<b>"
						+ post.keywords[k].word
						+ "</b>"
						+ ((k + 1) < post.keywords.length ? ', '
								: '');
			}
			return postmouseover(post.marketStatus, image,
					post.title, post.description, post.feed.title,
					post.feed.feedCategory.description, companies,
					keywords);
		});
		// event
		tr.mouseout(function() {
			this.className = "dtln" + post.marketStatus;
			return mouseout();
		});
		// tds
		tr.append($("<td>").addClass("dtln-icon").html(
			"<img src='" + ICONS_SUFFEX + post.feed.iconFileName
				+ "'>"));
		tr.append($("<td>").addClass("dtln-time").text(post.shortPublishDate));
		tr.append($("<td>").addClass("dtln-title" + post.marketStatus).html(post.shortTitle).click(function(event) {
			return showPost(post.id);
		}));
		tbody.append(tr);
	});
};

// click on ticker with index
showIndexChart = function(suffix, exchangeTicker, title) {
	// title
	$('#indexTitle').text(title);
	// set chart
	$('#indexChart').attr(
			'src',
			'http://finviz.com/image.ashx?' + suffix + '&rev='
					+ Math.floor(Math.random() * 100000000));
	// handle click on filer
	$('#filterByIndex').click(function(event) {
		unlock();
		searchPosts(title);
	});
	// links
	$('#openIndexInGoogleLink').attr('href',
			'http://www.google.com/finance?q=' + exchangeTicker).attr('rel', 'nofollow');
	// show window
	lock('#windowindex');
};

// click on ticker
showCompany = function(companyId, ticker, exchangeTicker, title) {
	// title
	$('#companyTitle').text(title);
	// set chart
	$('#companyChart').attr(
			'src',
			'http://finviz.com/chart.ashx?ty=c&ta=1&p=d&s=m&t=' + ticker
					+ '&rev=' + Math.floor(Math.random() * 100000000));
	// handle click on filer
	$('#filterByCompany').click(function(event) {
		unlock();
		filterPostsByCompany(companyId);
	});
	// links
	$('#openInGoogleLink').attr('href',
			'http://www.google.com/finance?q=' + exchangeTicker).attr('rel', 'nofollow');
	$('#openInFinvizLink').attr('href',
			'http://finviz.com/quote.ashx?t=' + ticker).attr('rel', 'nofollow');
	// show window
	lock('#windowcompany');
	// load related articles
	$.jsonp( {
		url : '/services',
		data : {
			type : 'relatedPosts',
			companyId : companyId
		},
		callbackParameter : "callback",
		success : function(data) {
			// if no posts
		if (data.length > 0) {
			// show block
		$("#relatedPostsTitle").show();
		$("#relatedPosts").show();
	} else {
		// show block
		$("#relatedPostsTitle").hide();
		$("#relatedPosts").hide();
	}

	// clear table
		$("#relatedPostsBody > tr").remove();
		var tbody = $("#relatedPostsBody");
		// add new posts
		$.each(data, function(i, post) {
			var tr = $("<tr>").addClass("dtln" + post.marketStatus);
			tr.mouseover(function() {
				this.className = "dtln" + post.marketStatus + "_hv";
				return true;
			}).mouseout(function() {
				this.className = "dtln" + post.marketStatus;
				return true;
			});
			// tds
			tr.append($("<td>").addClass("dtln-icon").html(
				"<img src='" + ICONS_SUFFEX + post.feed.iconFileName
					+ "'>"));
			tr.append($("<td>").addClass("dtln-time").text(post.shortPublishDate));
			tr.append($("<td>").addClass("dtln-title" + post.marketStatus).html(post.shortTitle).click(function(event) {
				return showPost(post.id);
			}));
			tbody.append(tr);
			});
	}
	});
};

// updates indexes from server
updateQuotes = function() {
	// update indices
	$.jsonp( {
		url : '/services',
		data : {
			type : 'quotes'
		},
		callbackParameter : "callback",
		success : function(data) {
			if (data != undefined) {
				// dow
				$("#dowValue").text(data.dow.price);
				$("#dowPercent").addClass(data.dow.change < 0 ? 'R' : 'G')
						.text(data.dow.percent);
				// sp500
				$("#sp500Value").text(data.sp500.price);
				$("#sp500Percent").addClass(data.sp500.change < 0 ? 'R' : 'G')
						.text(data.sp500.percent);
				// nasdaq
				$("#nasdaqValue").text(data.nasdaq.price);
				$("#nasdaqPercent")
						.addClass(data.nasdaq.change < 0 ? 'R' : 'G').text(
								data.nasdaq.percent);
			}
		}
	});
};

// update the categories menu
updateCategories = function() {
	// update categories
	$.jsonp( {
		url : '/services',
		data : {
			type : 'categories',
			feedType : feedTypeId
		},
		callbackParameter : "callback",
		success : function(data) {
			// clear old
		$("#categoryMenu > div").remove();
		var mainMenu = $("#categoryMenu");
		// add new posts
		var amount = data.length;
		$.each(data, function(i, menu) {
			var div = $("<div>").addClass("submenu");
			if (i == 0) {
				div.click(function() {
					return clearFilters();
				});
			} else {
				div.click(function() {
					return filterPostsByCategory(menu.id);
				});
			}
			// set tooltip
				div.mouseover(function() {
					return hintmouseover(menu.description);
				}).mouseout(function() {
					return mouseout();
				});
				div.text(menu.name).appendTo(mainMenu);
				// div2
				$("<div>").addClass("submenunum").text(
						" [" + menu.amount + "] ").appendTo(mainMenu);
				// div 3
				if (i < amount - 1) {
					// splitter
					$("<div>").addClass("submenudiv").text(" | ").appendTo(
							mainMenu);
				}
			});
	}
	});
};

// update the cloud of popular companies
updatePopularCompanies = function() {
	// update popular companies
	$.jsonp( {
		url : '/services',
		data : {
			type : 'popularCompanies',
			amountOfTags : amountOfTags(),
			feedType : feedTypeId
		},
		callbackParameter : "callback",
		success : function(data) {
			// clear old
		$("#tagsCloud > div").remove();
		var cloud = $("#tagsCloud");
		// add new posts
		$.each(data, function(i, company) {
			var div = $("<div>");
			div.addClass("tc-size" + company.styleSize).click(
					function() {
						return showCompany(company.id, company.ticker,
								company.exchangeTicker, company.title);
					}).text(company.ticker + " ");
			// set tooltip
				div.mouseover(
						function() {
							return companymouseover(company.title
									+ ' - articles (' + company.amount + ')');
						}).mouseout(function() {
					return mouseout();
				});
				div.appendTo(cloud);
			});
	}
	});
};

// updates the cloud of keywords
updateKeywords = function() {
	// update keywords
	$.jsonp( {
		url : '/services',
		data : {
			type : 'keywords',
			amountOfTags : amountOfSearchTags(),
			feedType : feedTypeId
		},
		callbackParameter : "callback",
		success : function(data) {
			// clear old
		$("#tagsSearchCloud > div").remove();
		var cloud = $("#tagsSearchCloud");
		// add new posts
		$.each(data, function(i, keyword) {
			var div = $("<div>");
			div.addClass("tc-size" + keyword.styleSize).click(function() {
				// set search value
					$('#searchtext').attr('value', keyword.word);
					// search
					return filterPostsByKeyword(keyword.id);
				}).text(keyword.word + " ");
			// set tooltip
				div.mouseover(function() {
					return hintmouseover('Articles (' + keyword.amount + ')');
				}).mouseout(function() {
					return mouseout();
				});
				div.appendTo(cloud);
			});
	}
	});
};

// search posts
searchPosts = function(query) {
	if (query == undefined || jQuery.trim(query) == "") {
		return false;
	}
	// set search value
	$('#searchtext').attr('value', query);
	// save state
	searchQuery = query;
	companyId = 0;
	categoryId = 0;
	keywordId = 0;
	// update
	updatePosts(1);
};

// filter by category
filterPostsByCategory = function(byCategoryId) {
	// save state
	searchQuery = null;
	companyId = 0;
	categoryId = byCategoryId;
	keywordId = 0;
	// update
	updatePosts(1);
};

// filter by company
filterPostsByCompany = function(byCompanyId) {
	// save state
	searchQuery = null;
	companyId = byCompanyId;
	categoryId = 0;
	keywordId = 0;
	// update
	updatePosts(1);
};

// filter by keyword
filterPostsByKeyword = function(byKeywordId) {
	// save state
	searchQuery = null;
	companyId = 0;
	categoryId = 0;
	keywordId = byKeywordId;
	// update
	updatePosts(1);
};

// resets all filters
clearFilters = function() {
	// clear state
	searchQuery = null;
	categoryId = 0;
	companyId = 0;
	keywordId = 0;
	// update
	updatePosts(1);
};

// ////////////////////////////////////// frames and dialogs
// /////////////////////////////////////

// creates frame
createFrame = function(title, url, windowclass, frameclass) {
	var div = $("#hiddenDiv").empty();
	// frame
	var frame = $("<iframe>").addClass(frameclass != undefined ? frameclass : "windowoverflow").attr("src", url).attr("scrolling", "auto").attr("frameborder", "0").attr("marginwidth", "0").attr("marginheight", "0");
	// title
	var titleDiv = $("<div>").text(title);
	// close
	var closeImg = $("<img>").addClass("closelabel").attr("src", "/images/closelabel.png").attr("border", "0").click(function(event) {
		unlock();
	});
	var closeTd = $("<td>").addClass("closelabeltd").append(closeImg);
	// inner table
	var innertable2 = $("<table>").addClass("wintitletable").append($("<tbody>").append($("<tr>").append($("<td>").addClass("windowtitle").append(titleDiv)).append(closeTd)));	
	// inner table
	var innertable = $("<table>").addClass("braker").append($("<tbody>").append($("<tr>").append($("<td>").addClass("braker").append(innertable2))).append($("<tr>").append($("<td>").addClass("braker").append(frame))));
	// main table
	div.append($("<table>").addClass(windowclass != undefined ? windowclass : "window").append($("<tbody>").append($("<tr>").append($("<td>").addClass("windowtd").append(innertable)))));	
	return div;
};

// creates dialog window
createDialog = function(title, windowclass, dialog) {
	var div = $("#hiddenDiv").empty();
	// title
	var titleDiv = $("<div>").text(title);
	// close
	var closeImg = $("<img>").addClass("closelabel").attr("src", "/images/closelabel.png").attr("border", "0").click(function(event) {
		unlock();
	});
	var closeTd = $("<td>").addClass("closelabeltd").append(closeImg);
	// inner table
	var innertable2 = $("<table>").addClass("wintitletable").append($("<tbody>").append($("<tr>").append($("<td>").addClass("windowtitle").append(titleDiv)).append(closeTd)));	
	// inner table
	var innertable = $("<table>").addClass("braker").append($("<tbody>").append($("<tr>").append($("<td>").addClass("braker").append(innertable2))).append($("<tr>").append($("<td>").addClass("braker").append(dialog))));
	// main table
	div.append($("<table>").addClass(windowclass).append($("<tbody>").append($("<tr>").append($("<td>").addClass("windowtd").append(innertable)))));	
	return div;
};

// on fagLink click handler
faqLinkClick = function() {
	// create frame
	var div = createFrame('How does it work?', '/static/faq');	
	lockobject(div);
};

// on privacyLink click handler
privacyLinkClick = function() {
	// create frame
	var div = createFrame('Privacy Notice', '/static/privacy');	
	lockobject(div);
};

// on conditionsLink click handler
conditionsLinkClick = function() {
	// create frame
	var div = createFrame('Conditions of Use', '/static/conditions');	
	lockobject(div);
};

// on rssLink click handler
rssLinkClick = function() {
	// create frame
	var div = createFrame('RSS (Atom) feeds', '/static/rss', 'windowrss', 'windowrssoverflow');	
	lockobject(div);
};

///////////////////////////////////////// login window /////////////////////////////////////////////// 
// on login click handler
loginLinkClick = function() {
	// login label
	var loginLabelDiv = $("<div>").addClass("winfieldlable").text("Login/Email");
	var loginImg = $("<img>").attr("id", "windowlogin_error_email").addClass("winfieldimage-err").attr("border", "0").attr("style", "display: none;").attr("src", "/images/errorhint.gif");		
	var loginLabel = $("<table>").attr("cellspacing", "0").attr("cellpadding", "0").append($("<tbody>").append($("<tr>").append($("<td>").attr("align", "left").attr("style", "vertical-align: top;").append(loginLabelDiv)).append($("<td>").attr("align", "left").attr("style", "vertical-align: top;").append(loginImg))));

	// login
	var loginInput = $("<input>").attr("id", "windowlogin_email").addClass("logininput").attr("type", "text").attr("tabindex", "0").keyup(loginKeyUp);
	// set with values
	var email = getCookie(EMAIL_COOKIE);
	if(email != undefined && email != "") {
		loginInput.attr('value', email);
	}

	// password label
	var passwordLabelDiv = $("<div>").addClass("winfieldlable").text("Password");
	var passwordImg = $("<img>").attr("id", "windowlogin_error_password").addClass("winfieldimage-err").attr("border", "0").attr("style", "display: none;").attr("src", "/images/errorhint.gif");		
	var passwordLabel = $("<table>").attr("cellspacing", "0").attr("cellpadding", "0").append($("<tbody>").append($("<tr>").append($("<td>").attr("align", "left").attr("style", "vertical-align: top;").append(passwordLabelDiv)).append($("<td>").attr("align", "left").attr("style", "vertical-align: top;").append(passwordImg))));	
		
	// password
	var passwordInput = $("<input>").attr("id", "windowlogin_password").addClass("logininput").attr("type", "password").attr("tabindex", "0").keyup(loginKeyUp);

	// submit
	var submitImg = $("<img>").attr("id", "windowlogin_submit").addClass("btn_login").attr("border", "0").attr("src", "/images/btn_login.gif").click(login);
	
	// footer
	var subscribeDiv = $("<div>").addClass("loginlinkdiv").text("Subscribe").click(function(event){
	     lock('#windowsignup');
	});
	var forgotPasswordDiv = $("<div>").addClass("loginlinkdiv").text("Forgot password?").click(function(event){
	     lock('#windowforgetpass');
	});
	var footerDiv = $("<div>").append(subscribeDiv).append($("<div>").addClass("splitterdiv").text("|")).append(forgotPasswordDiv);
	
	// body
	var dialog = $("<table>").addClass("braker").append(
			$("<tbody>")
				.append($("<tr>").append($("<td>").addClass("braker").append(loginLabel)))				
				.append($("<tr>").append($("<td>").addClass("braker").append(loginInput)))
				.append($("<tr>").append($("<td>").addClass("braker").append(passwordLabel)))				
				.append($("<tr>").append($("<td>").addClass("braker").append(passwordInput)))
				.append($("<tr>").append($("<td>").addClass("braker").append(submitImg)))
				.append($("<tr>").append($("<td>").addClass("braker").append($("<div>").html("&nbsp;"))))
				.append($("<tr>").append($("<td>").addClass("brakerc").append(footerDiv)))
	);
	
	// create dialog
	var div = createDialog('User Login', 'windowlogin', dialog);	
	lockobject(div);
};

// handler for ENTER key handlers
loginKeyUp = function(event) {
	if (event == null) { // ie
		keycode = window.event.keyCode;
	} else { // mozilla
		keycode = event.which;
	}			
	if(keycode == 13){ // ENTER
		return login();		
	}
};

//login
login = function() {
	// validate
	var email = jQuery.trim($("#windowlogin_email").attr('value'));
	if(email == "") {
		showErrorImage("#windowlogin_error_email", "Required value");
		return false;
	}
	if(!isEmail(email)) {
		showErrorImage("#windowlogin_error_email", "Wrong email");
		return false;
	}
	
	var password = jQuery.trim($("#windowlogin_password").attr('value'));
	if(password == "") {
		showErrorImage("#windowlogin_error_password", "Required value");
		return false;
	}
	
	// send JSON
	$.jsonp({
		url: '/security',
		data: { type: 'login', email: email, password: password },
		callbackParameter: "callback",
		success: function(data) {
    		// clear cookies
    		setCookie(SESSION_COOKIE, data.sessionId);
    		setCookie(EMAIL_COOKIE, email);
    		setCookie(SUBSCRIBED_COOKIE, data.user.isSubscribed);   		
    		// redirect to main page
    		reload();
    	},
    	error: function(d, msg) {
		    // marks wrong fields
			showErrorImage("#windowlogin_error_email", "Incorrect email or password");
			showErrorImage("#windowlogin_error_password", "Incorrect email or password");
		}
	});
};


// /////////////////////////////////// post //////////////////////////
showPost = function(postId) {
	// load post by id
	$.jsonp({
		url: '/services',
		data: { type: 'post', post: postId },
		callbackParameter: "callback",
		success: function(data) {
			var post = data;
			// show popup
			var div = $("#hiddenDiv").empty();

			// close
			var closeImg = $("<img>").addClass("closelabel").attr("src", "/images/closelabel.png").attr("border", "0").click(function(event) {
				unlock();
			});
			
			// title
			var iconDiv = $("<div>").addClass("tipIcon").append($("<img>").attr("src", TIP_IMAGES_PREFIX + post.feed.feedCategory.iconFileName).attr("border", "0"));
			var titleDiv = $("<div>").attr("style","float: left;").append(iconDiv).append(' ' + post.feed.type.description);
			var closeDiv = $("<div>").addClass("popClose").append(closeImg);
			var titleTr = $("<tr>").append($("<td>").addClass("tipHeader").append(titleDiv).append(closeDiv));
			
			// content
			var contentTr = $("<tr>").append($("<td>").addClass("tipContent").append($("<b>").html(post.title)).append($("<br />")).append(post.description).append($("<br />")).append($("<a>").attr("href", post.link).attr('rel', 'nofollow').attr("target", "_blank").text("Full Version")));		
			
			// published
			var publishedTr = $("<tr>").append($("<td>").addClass("tipSource").append('Published: ').append($("<b>").text(post.fullPublishDate)));

			// source
			var sourceTr = $("<tr>").append($("<td>").addClass("tipSource").append('Source: ').append($("<a>").attr("href", post.feed.url).attr('rel', 'nofollow').attr("target", "_blank").text(post.feed.title)));
			
			// body
			var body = $("<tbody>").append(titleTr).append(contentTr).append(sourceTr).append(publishedTr);
			
			// keywords
			if(post.keywords != undefined && post.keywords.length > 0) {
				var keywordsTd = $("<td>").addClass("tipSource").append('Topics: ');
				for(var i = 0; i < post.keywords.length; i++) {
					var keyword = post.keywords[i];
					var span = $("<span>").addClass("companylink").text(keyword.word).click(function(event) {
						unlock();
						return filterPostsByKeyword(keyword.id);
					});
					keywordsTd.append(span);
					if(i + 1 < post.keywords.length) {
						keywordsTd.append(", ");
					}
				}
				// add to panel
				body.append($("<tr>").append(keywordsTd));
			}
			
			// category
			var categoryTr = $("<tr>").append($("<td>").addClass("tipSource").append('Category: ').append($("<b>").text(post.feed.feedCategory.description)));
			body.append(categoryTr);
			
			// companies
			if(post.companies != undefined && post.companies.length > 0) {
				var companiesTd = $("<td>").addClass("tipSource").append('Companies: ');
				for(var i = 0; i < post.companies.length; i++) {
					var company = post.companies[i];
					var span = $("<span>").addClass("companylink").html(company.title).click(function(event) {
						return showCompany(company.id, company.ticker, company.exchangeTicker, company.title);
					});
					companiesTd.append(span);
					if(i + 1 < post.companies.length) {
						companiesTd.append(" | ");
					}
				}
				// add to panel
				body.append($("<tr>").append(companiesTd));
			}
			
			// frame with adsense			
			var frame = $("<iframe>").addClass("adsenseframe").attr("src", '/static/adsense').attr("scrolling", "no").attr("frameborder", "0").attr("marginwidth", "0").attr("marginheight", "0");
			body.append($("<tr>").append($("<td>").addClass("tipBody").append(frame)));
			
			// related posts
			if(post.relatedPosts != undefined && post.relatedPosts.length > 0) {
				body.append($("<tr>").append($("<td>").addClass("tipBody").append($("<b>").text("Related Articles:"))));
				// posts
				var postsBody = $("<body>");
				for(var i = 0; i < post.relatedPosts.length; i++) {
					var relatedPost = post.relatedPosts[i];
					var tr = $("<tr>").addClass("dtln" + relatedPost.marketStatus);
					tr.mouseover(function() {
						this.className = "dtln" + relatedPost.marketStatus + "_hv";
						return true;
					}).mouseout(function() {
						this.className = "dtln" + relatedPost.marketStatus;
						return true;
					});
					// tds
					tr.append($("<td>").addClass("dtln-icon").html(
						"<img src='" + ICONS_SUFFEX + relatedPost.feed.iconFileName
							+ "'>"));
					tr.append($("<td>").addClass("dtln-time").text(relatedPost.shortPublishDate));
					tr.append($("<td>").addClass("dtln-title" + relatedPost.marketStatus).html(relatedPost.shortTitle).click(function(event) {
						return showPost(relatedPost.id);
					}));
					postsBody.append(tr);
				}
				// add to panel
				body.append($("<tr>").append($("<td>").addClass("tipBody").append($("<table>").addClass("newstable").append(postsBody))));
			}
						
			// main table
			div.append($("<table>").addClass("windowpopuppost").append(body));
			lockobject(div);
			return true;
    	}
	});
};
