﻿$(function () {
	var jobList = null,
		jobPager = null,
		activeRow = null,
		jobs = [],
		mc = $("#main-content"),
		jobSearch = mc.find("div.jobsearch"),
		titleTextBox = mc.find("input.title-textbox"),
		locationTextBox = mc.find("input.location-textbox"),
		searchButton = mc.find("div.jobsearch input.search-button"),
		hasHashChangeEvent = "onhashchange" in window;

	// Actions for job search result table
	mc.find("table.result-table tr.job-info").live("hover", function (e) {
		if (e.type === "mouseenter") {
			$(this).addClass("hover").prevAll("tr:visible:first").addClass("prev-hover");
		} else {
			$(this).toggleClass("hover").prevAll("tr:visible:first").removeClass("prev-hover");
		}
	})
	.live("click", showJobDetails);

	// Actions for category list
	mc.find("div.category-list li").live("hover", function (e) {
		if (e.type === "mouseenter") {
			$(this).addClass("hover").prev().addClass("prev-hover");
		} else {
			$(this).remove("hover").prev().removeClass("prev-hover");
		}
	})
	.live("click", function (e) {
		categorySearch.call(this, 0, this.id);
		e.preventDefault();
	});

	// Search button actions
	searchButton.click(function (e) {
		var topPos = $(document).scrollTop();
		Proffice.Utils.clearHashTag();
		searchJobs.call(this, 0, function () {
			scrollToPosition(topPos);
		});
		e.preventDefault();
	});

	// Setup textboxes to submit on enter
	titleTextBox.keypress(handleEnter);
	locationTextBox.keypress(handleEnter);

	// Pager actions
	mc.find("div.jobsearch div.result-pager span").live("click", function () {
		var page = Number($(this).text()) - 1;
		var htv = Proffice.Utils.getHashTagValues();

		if (htv && htv["category"]) {
			categorySearch.call(this, page, htv["category"]);
		} else {
			searchJobs.call(this, page, null);
		}
	});

	// reset search when search tab is clicked
	if ($("#jobSearchRequestOnLoadFlag").val() == "True") {
		mc.find("ul.start-tabs li:first-child a").click(resetRequestOnLoadSearch);
	}
	else {
		mc.find("ul.start-tabs li:first-child a").click(resetSearch);
	}

	// Do a search when page has loaded if hash tag values are defined
	var htv = Proffice.Utils.getHashTagValues();
	if (htv["category"]) {
		var page = htv["page"] ? htv["page"] : 0;

		categorySearch(page, htv["category"]);
	} else if (htv["title"] || htv["location"] || htv["page"] || $("#jobSearchRequestOnLoadFlag").val() == "True") {
		var page = htv["page"] ? htv["page"] : 0;

		if (htv["title"]) {
			titleTextBox.val(htv["title"]);
		}
		if (htv["location"]) {
			locationTextBox.val(htv["location"]);
		}

		searchJobs(page);
	}

	//	if (hasHashChangeEvent) {
	//		$(window).bind("hashchange", function () {

	//		});
	//	}

	// Cancels enter press in textboxes
	function handleEnter(e) {
		if (e.which === 13) {
			searchButton.trigger("click");
			e.preventDefault();
			e.stopPropagation();
		}
	}

	// Search job by category
	function categorySearch(page, category) {
		var pageId = $('#pageId').length === 1 ? $('#pageId').val() : 0;

		$.ajax({
			url: "/Templates/Proffice2011/Pages/Start/Start.aspx/SearchJobsByCategory?startPageId=" + pageId + "&category=" + category + "&page=" + page,
			data: "{ id: " + pageId + ", category: '" + category + "', page: " + page + ", lang: '" + dateLang + "' }",
			beforeSend: function () {
				AjaxLoader.show(JobSearchLabels.loadingMsg);
			},
			success: function (data) {
				jobs = data.Jobs;
				jobSearch.find("div.category-list").hide();
				listJobs(jobSearch, data, "", "", page, category);
				updateHashTag("", "", page, category);
				AjaxLoader.hide();
			},
			error: function () {
				AjaxLoader.hide();
			}
		});
	}

	// Search job by title or location
	function searchJobs(page, callback) {
		var title = "",
			location = "",
			jobSearch = mc.find("div.jobsearch");

		if (titleTextBox.val() !== titleTextBox.attr("wmtext")) {
			title = titleTextBox.val();
		}

		if (locationTextBox.val() !== locationTextBox.attr("wmtext")) {
			location = locationTextBox.val();
		}

		var pageId = $('#pageId').length === 1 ? $('#pageId').val() : 0;

		$.ajax({
			url: "/Templates/Proffice2011/Pages/Start/Start.aspx/SearchJobs?startPageId=" + pageId + "&title=" + title + "&location=" + location + "&page=" + page,
			data: "{ id: " + pageId + ", titleDescriptionCategory: '" + title + "', cityLocation: '" + location + "', page: " + page + ", lang: '" + dateLang + "' }",
			beforeSend: function () {
				AjaxLoader.show(JobSearchLabels.loadingMsg);
			},
			success: function (data) {
				jobs = data.Jobs;
				jobSearch.find("div.category-list").hide();
				listJobs(jobSearch, data, title, location, page, "");
				updateHashTag(title, location, page, "");
				AjaxLoader.hide();

				if (callback) {
					callback();
				}
			},
			error: function () {
				AjaxLoader.hide();
			}
		});
	}

	function updateHashTag(title, location, page, category) {
		var values = Proffice.Utils.getHashTagValues();

		values["page"] = page;
		values["title"] = title;
		values["location"] = location;
		values["category"] = category;
		values["job"] = null;

		Proffice.Utils.setHashTagValues(values);
	}

	function listJobs(jobSearch, data, title, location, page, category) {
		var resultHtml = "";

		if (jobList === null) {
			jobList = jobSearch.find("table.result-table tbody");
		}

		if (jobPager === null) {
			jobPager = jobSearch.find("div.result-pager");
		}

		resultHtml = Proffice.Utils.stringConcat(JobSearchLabels.found, " ", data.Total, " ", JobSearchLabels.jobs);

		if (title !== "") {
			resultHtml += " " + JobSearchLabels.width + "\"" + title + "\"";
		}
		if (location !== "") {
			resultHtml += " " + JobSearchLabels.inLocation + "\"" + location + "\"";
		}
		if (category !== "") {
			var categoryFullName = $(".category-list li#" + category).attr("fullname");
			if (categoryFullName != null && categoryFullName != "undefined")
				resultHtml += " " + JobSearchLabels.inLocation + "\"" + categoryFullName + "\"";
			else
				resultHtml += " " + JobSearchLabels.inLocation + "\"" + category + "\"";
		}

		jobSearch.find("span.result-label").html(resultHtml);

		if (data.Jobs != null && data.Jobs.length > 0) {
			var listHtml = "";
			for (var i = 0, l = data.Jobs.length; i < l; i++) {
				listHtml += appendRow(data.Jobs[i]);
			}

			jobList.html(listHtml);
			jobList.closest("table").show();
			jobPager.html(buildPager(data.Pages)).show().children(":eq(" + page + ")").addClass("active");

			// Check if there is an id in hash tags and display job description
			if (htv && htv["job"]) {
				jobList.find("#" + htv["job"]).trigger("click");
			}
		} else {
			jobList.closest("table").hide();
			jobPager.hide();
		}

		jobList.closest(".result-list").show();
	}

	function resetSearch() {
		var ttbWatermark = titleTextBox.attr("wmtext"),
			ltbWatermark = locationTextBox.attr("wmtext");
		mc.find("div.result-list").hide();
		mc.find("div.category-list").show();
		titleTextBox.val(ttbWatermark).addClass("watermark");
		locationTextBox.val(ltbWatermark).addClass("watermark"); ;
		Proffice.Utils.clearHashTag();
	}

	function resetRequestOnLoadSearch() {
		var ttbWatermark = titleTextBox.attr("wmtext"),
			ltbWatermark = locationTextBox.attr("wmtext");
		mc.find("div.result-list").hide();
		mc.find("div.category-list").show();
		titleTextBox.val(ttbWatermark).addClass("watermark");
		locationTextBox.val(ltbWatermark).addClass("watermark"); ;
		Proffice.Utils.clearHashTag();
		searchJobs(page);
	}

	function buildPager(pages) {
		var html = "";

		if (pages > 1) {
			for (var i = 0; i < pages; i++) {
				html += "<span>" + (i + 1) + "</span>";
			}
		}

		return html;
	}

	function showJobDetails() {
		var _this = $(this),
			jobDetails = _this.next(".job-details"),
			jobId = _this.attr("id"),
			job = getJob(jobId);

		if (activeRow != null) {
			closeRow(activeRow);
		}

		if (jobDetails.length === 0) {
			var jobDetailsHtml = Proffice.Utils.stringConcat("<tr class=\"job-details hidden\"><td colspan=\"4\">", buildDetailsBody(job), "</td></tr>");
			jobDetails = $(jobDetailsHtml);
			_this.after(jobDetails);
			jobDetails.find("div.close-button").click(function () {
				closeRow(_this);
			});
		}
		_this.toggleClass("expanded").prevAll("tr:visible:first").toggleClass("prev-expanded");
		jobDetails.slideToggle();

		activeRow = _this;

		var htv = Proffice.Utils.getHashTagValues();
		htv["job"] = jobId;
		Proffice.Utils.setHashTagValues(htv);

		scrollTo(_this);
	}

	function appendRow(job) {
		return Proffice.Utils.stringConcat("<tr id=\"", job.Id, "\" class=\"job-info\">",
				appendCell(job.Location),
				appendCell(job.Title, 40),
				appendCell(job.CompanyName),
				appendCell(job.PublishDate),
				"</tr>");
	}

	function appendCell(text, length) {
		if (typeof length !== "undefined" && text.length > length) {
			text = text.substring(0, length - 3) + "...";
		}
		return Proffice.Utils.stringConcat("<td>", text, "</td>");
	}

	function buildDetailsBody(job) {
		var db = Proffice.Utils.stringConcat("<div class=\"close-button\" title=\"", JobSearchLabels.close, "\">x</div><h2>", job.Title, "</h2>");

		if (job.LogoUrl !== null && job.LogoUrl !== "") {
			db += "<img src=\"" + job.LogoUrl + "\" class=\"logo\" alt=\"\" />";
		} else {
			db += "<span class=\"company\">" + job.CompanyName + "</span>";
		}

		db += Proffice.Utils.stringConcat("<h3>", JobSearchLabels.serviceDescription, "</h3>",
				"<p>", job.Description, "</p>");

		if (job.LastApplicationDate !== null && job.LastApplicationDate !== "") {
			db += Proffice.Utils.stringConcat("<span class=\"apply-date\">", JobSearchLabels.lastApplicationDate, ": ", job.LastApplicationDate, "</span>");
		}

		if (job.SourceSystemId == "3") {
			db += Proffice.Utils.stringConcat("<div class=\"button-block apply-button\"><a href=\"#\" class=\"css-button\" onclick=\"openapplywindow('", job.ApplyLink, "');return false;\"><span><span>", JobSearchLabels.apply, "</span></span></a>",
			"<a href=\"", job.Link, "\" class=\"css-button read-more-button\"><span><span>", JobSearchLabels.readMore, "</span></span></a></div>");
		} else {
			db += Proffice.Utils.stringConcat("<div class=\"button-block apply-button\"><a href=\"", job.ApplyLink, "\" class=\"css-button\" target=\"blank\"><span><span>", JobSearchLabels.apply, "</span></span></a>",
				"<a href=\"", job.Link, "\" class=\"css-button read-more-button\"><span><span>", JobSearchLabels.readMore, "</span></span></a></div>");
		}

		return db;
	}

	function getJob(id) {
		return Proffice.Utils.findInArray(jobs, "Id", id);
	}

	function closeRow(row) {
		row.removeClass("expanded").prevAll(".prev-expanded:first").removeClass("prev-expanded").end().next(".job-details").hide();
	}

	function scrollTo(element) {
		$('html, body').animate({
			scrollTop: element.offset().top
		}, 500);
	}

	function scrollToPosition(pos) {
		$(document).scrollTop(pos);
	}
});
