var ajaxHandler;

String.prototype.trim = function() {
	return this.replace(/^\s+|\s+$/g,"");
}

function callFunctionIfExists(funcName, noFuncReturnValue, parameter1, parameter2) {
	var js;
	var hasFunc = false;
	js = "if (typeof " + funcName + " == 'function') {hasFunc = true;} else {hasFunc = false;}";
	eval(js);
	if (!hasFunc) {
		//alert('Could not find function: ' + funcName);
		return noFuncReturnValue;
	}
	
	var ret = true;
	if (typeof parameter2 == 'undefined') {
		js = "ret = " + funcName + "(parameter1);";
	}
	else {
		js = "ret = " + funcName + "(parameter1, parameter2);";
	}
	
	eval(js);
/*console.log("Ran something: " + js);*/
	return ret;
}
var ranOnce = false;
function fieldSubmitHandler(form) {
	if ($("#" + form.id + " button[type='submit']").hasClass("dontDisable") == false) { 
		if (ranOnce && $("#" + form.id + " button[type='submit']").attr('disabled')) {
			// form is already sent ffs, don't send again
			return false;
		} else {
			$("#" + form.id + " button[type='submit']").attr('disabled', true);
			ranOnce = true;
		}
	}

	var formBaseName = form.id.substring(0, form.id.length - 4);
	// Construct generic name (i.e. name without numbers at the end)
	var formBaseNameGeneric = formBaseName;
	
	for (var i = formBaseNameGeneric.length - 1; i >= 0; i--) {
		var ch = formBaseNameGeneric.charAt(i);
		if (ch < '0' || ch > '9') {
			// Found a non-digit. Break.
			break;
		}
	}

	formBaseNameGeneric = formBaseNameGeneric.substring(0, i + 1);

	if (!callFunctionIfExists("onBeforeSubmit_" + formBaseName, true, form)) {
		// Some field valdidation failed
		return;
	}

	$('#' + formBaseName + 'FormError').hide();
	
	ranOnce = true;
	$(form).ajaxSubmit({
		dataType: 'json',
		data: {format: 'json', formId: form.id},
		beforeSubmit: function showRequest(formData, jqForm, options) {
    		var a = 2;
		},
		success: function(responseData, statusText) {
			if (responseData != null) {
				if (responseData.forceRedirectUrl != undefined) {
					location.href = responseData.forceRedirectUrl;
					return;
				}
				
				if (responseData.allGood) {
					for (var i = 0; i < (typeof responseData.fields == 'undefined' ? 0 : responseData.fields.length); i++) {
		    			var fieldValue = responseData.fields[i];
		    			var s = 'responseData.fieldsValues.' + fieldValue;
		    			$('#' + fieldValue + 'FormResult').html(eval(s));
	    			}
	
	    			$('#' + formBaseName + 'FormError').hide();
	
	    			$('#' + formBaseName + 'Form').addClass("submitSuccess");
	    			
	    			var stopChain = callFunctionIfExists("onSubmitSuccess_" + formBaseName, true, form, responseData);
	    			if (stopChain != "stopChain" && formBaseName != formBaseNameGeneric) {
		    			stopChain = callFunctionIfExists("onSubmitSuccess_" + formBaseNameGeneric, true, form, responseData);
	    			}
	
	    			if (stopChain != "stopChain") {
	    				stopChain = callFunctionIfExists("onSubmitSuccessGeneric", true, form, formBaseName);
	    			}
	    			
				}
				else {
					if (responseData.errorCode > 0 || responseData.message != "") {
						callFunctionIfExists("onSubmitError_" + formBaseName, true, responseData);
					}
					else {
		    			$('#' + formBaseName + 'FormError').html(responseData.message);
		    			$('#' + formBaseName + 'FormError').show();
					}
					
					$('#' + formBaseName + 'Form').removeClass("submitSuccess");
					
					callFunctionIfExists("onSubmitErrorGeneric", true, responseData);
					ranOnce = false;
					$("#" + form.id + " button[type='submit']").attr('disabled', false);
				}
			}
		},
		error: function (XMLHttpRequest, textStatus, errorThrown) {
			//alert('some error... textStatus=' + textStatus + ', errorThrown=' + errorThrown);
			ranOnce = false;
			$("#" + form.id + " button[type='submit']").attr('disabled', false);			
			$('#' + formBaseName + 'FormSubmit').removeAttr('disabled');
			$('#' + formBaseName + 'FormError').html('אירעה שגיאה לא ידועה. אנא נסה שוב.');
			$('#' + formBaseName + 'FormError').show();
			callFunctionIfExists("onSubmitAjaxError_" + formBaseName, true, textStatus, errorThrown);
		}
	});
}

function isLegitIsraeliId (id) {
	if (id == 123454321) return true;
	
	var idnum1 = id.substr(0, 1) * 1;
	var idnum2 = id.substr(1, 1) * 2;
	var idnum3 = id.substr(2, 1) * 1;
	var idnum4 = id.substr(3, 1) * 2;
	var idnum5 = id.substr(4, 1) * 1;
	var idnum6 = id.substr(5, 1) * 2;
	var idnum7 = id.substr(6, 1) * 1;
	var idnum8 = id.substr(7, 1) * 2;
	var idnum9 = id.substr(8, 1) * 1;
 
	if (idnum1 > 9) idnum1 = (idnum1 % 10) + 1;
	if (idnum2 > 9) idnum2 = (idnum2 % 10) + 1;
	if (idnum3 > 9) idnum3 = (idnum3 % 10) + 1;
	if (idnum4 > 9) idnum4 = (idnum4 % 10) + 1;
	if (idnum5 > 9) idnum5 = (idnum5 % 10) + 1;
	if (idnum6 > 9) idnum6 = (idnum6 % 10) + 1;
	if (idnum7 > 9) idnum7 = (idnum7 % 10) + 1;
	if (idnum8 > 9) idnum8 = (idnum8 % 10) + 1;
	if (idnum9 > 9) idnum9 = (idnum9 % 10) + 1;
 
    var sumval = idnum1 + idnum2 + idnum3 + idnum4 + idnum5 + idnum6 + idnum7 + idnum8 + idnum9;
 
    sumval = sumval % 10;
    if (sumval > 0) {
        return false;
    }

    return true;
}

function toggleIf(test, idToToggle) {
	var objToToggle = document.getElementById(idToToggle);
	if (!objToToggle) {
		return;
	}
	
	if (test) {
		objToToggle.style.display = 'inline';
	}
	else {
		objToToggle.style.display = 'none';
	}
}

function toggleEditField(field, animate) {
	var fieldView = $('#' + field + 'View');
	var fieldEdit = $('#' + field + 'Edit');

	var speed = 0;
	if (animate) {
		speed = "slow";
	}

	fieldView.toggle();
	fieldEdit.toggle(speed);

	for (var i = 2; i <= 1000; i++) {
		fieldView = $('#' + field + 'View' + i);
		fieldEdit = $('#' + field + 'Edit' + i);

		if (fieldView == null && fieldEdit == null) {
			return;
		}

		fieldView.toggle();
		fieldEdit.toggle(speed);
	}
}

function changeItemStatus(type, id, newStatus, reloadDivId, reloadUrl) {
	var url = "/applicant/company/change-item-status?format=json&type=" + type + "&id=" + id + "&newStatus=" + newStatus;
	$.getJSON(url, 
		function(data, textStatus) {
			if (textStatus == "success") {
				if (reloadDivId != null && reloadUrl != null && reloadDivId != '' && reloadUrl != '') {
					// Re-render based on type
					$("#" + reloadDivId).load(reloadUrl);
				}
				else {
					// Refresh page
					location.reload(true);
				}
			}
			else {
				alert("An error has occurred. Please try again.");
			}
		}
	);
}

function deletePosition(positionId, reloadUrl) {
	var url = "/applicant/company/delete-position?format=json&positionId=" + positionId;
	$.getJSON(url, 
		function(responseData, textStatus) {
			if (responseData.allGood) {
				if (reloadUrl) {
					location.href = reloadUrl;
				}
				else {
					// Refresh page
					location.reload(true);
				}
			}
			else {
				alert(responseData.message);
			}
		}
	);
}

function manageRecommendation(elementId, recommendationId, action, reloadUrl) {
	var url = "/applicant/applicant/manage-recommendation?format=json&recommendationId=" + recommendationId + "&do=" + action;
	$.getJSON(url, 
		function(responseData, textStatus) {
			if (responseData.allGood) {
				if (reloadUrl) {
					location.href = reloadUrl;
				}
				else {	
					element = $("li#" + elementId);
					
					if (action == "delete") {
						element.remove();
					}
					else if (action == "toggle") {
						toggleLink = element.find("a.recommendationState");
						if (toggleLink.html() == 'הצג המלצה') {
							toggleLink.html('הסתר המלצה');
						}
						else {
							toggleLink.html('הצג המלצה');
						}
						
						recommendationText = element.find("a.textUrl");
						recommendationText.toggleClass("greyed");
					}
					else if (action == "approve") {
						toggleLink = element.find("a.recommendationState");
						toggleLink.replaceWith('המלצה אושרה!');
					}
				}
			}
			else {
				alert(responseData.message);
			}
		}
	);	
}

isDocumentReady = false;
$(document).ready(function(){
	isDocumentReady = true;
	
	var mouseMoveEvent;
	$().mousemove(function(e){
		mouseMoveEvent = e;
	}); 
   
	$('#ajaxLoadingIndicator').ajaxStart(function(){
		var offsetLeft = 20;
		//var offsetTop = $(this).height();
		var offsetTop = 0;
		var indicator = this;
		var handler = function(e){
			if (typeof(e) == "undefined") {
				return;
			}
			$(indicator).css({
				top: (offsetTop + e.pageY) + 'px',
				left: (offsetLeft + e.pageX) + 'px'
			});
		};
		$(document).bind('mousemove.ajaxLoadingIndicator', handler);
		handler(mouseMoveEvent);
		$(this).show();
	});
	
	$('#ajaxLoadingIndicator').ajaxStop(function(){
		$(this).hide();
		$(document).unbind('mousemove.ajaxLoadingIndicator');
	});	
	
	$(".disableEnter").keyup(function(e){
		if (e.keyCode == 13) {
			$(this).val($(this).val().substr(0, $(this).val().length-1));
		}
		return true;
	});
	
	$("span.feed_filters a").live("click", function() {
		if (!$(this).hasClass("selected")) {
			// only process if the filter wasn't previously selected
			// update feed content according to selection
			var filter = $(this).attr("filter");
			var mode = $(this).parent().attr("mode");
			var feedContainer = $(this).parent().parent().next("ul");
			var dummyContainer = $("div#dummy");
			dummyContainer.load("/applicant/homepage/reload-feed?mode=" + mode + "&filter=" + filter, null, function() {
				feedContainer.fadeOut("slow", function() {
					feedContainer.html(dummyContainer.html());
					feedContainer.fadeIn("slow");
				});
			});
			
			$(this).siblings(".selected").removeClass("selected");
			$(this).addClass("selected");
		}
	});
	
	$("a[popup], div[popup]").live("click", function() {
		eval("popupShow_" + $(this).attr("popup") + "();");
	});
	
	$("input[placeholder]").each(function(index) {
		$(this).val($(this).attr("placeholder"));
		$(this).css("color", "gray");
	});
	$("input[placeholder]").live("focus", function() {
		if ($(this).val() == $(this).attr("placeholder")) {
			$(this).val("");
			$(this).css("color", "black");
			$(this).unbind("focus", false);
		}
	});
	
    $(".no-event-bubble-up").each(function() {
        $(this).click(function(e) {
          e.stopPropagation();
        });
    });	
    
    if (getInternetExplorerVersion() == -1) {
	    var photoZoomTooltip = $("div.photozoom-tooltip");
	    $("img[src$='48x48.jpg'],img[src$='140x109.jpg']").live("mouseenter", function() {
	    	var fullsizePhotoSrc = $(this).attr("src").replace("48x48", "0x0").replace("140x109", "0x0");
	    	var fullsizePhoto = $("<img/>").attr("src", fullsizePhotoSrc);
	    	photoZoomTooltip.html('');
	    	photoZoomTooltip.append(fullsizePhoto);
	    	photoZoomTooltip.show();
	    });
	    $("img[src$='48x48.jpg'],img[src$='140x109.jpg']").live("mouseleave", function() {
	    	photoZoomTooltip.hide();
	    });
    }
    
	$(".tabinate").tabinate();
	
	$("#companiesIndexLink").mouseover(function(e){
		if ($("#companiesIndexContainer").css("display") == "none") {
			$("#companiesIndexContainer").show();
			$("#companiesIndexContainer").css("top", (e.clientY) + "px");
			$("#companiesIndexContainer").css("left", (e.clientX-100) + "px");
		}
	});	
	$("#companiesIndexContainer").mouseleave(function(e){
		$("#companiesIndexContainer").hide();
	}); 
	
	$.extend($.tools.overlay.conf, {
		mask: {
   			color: "#000000", 
   			opacity: 0.7,
   			closeSpeed:0 //this is REQUIRED for the next overlay to work   			
		},		
		fixed: false,
		speed: "fast",
		closeOnClick: false,
		top: "15%",
		left: "center",
		zIndex: 100,
		api: true	
	});
});

function checkField(element) {
	if (element.value == "") {
		if (!$(element).hasClass("error-text") && $("#" + element.id + "Error").css("display") == "none") {
			$("#" + element.id + "Error").show();
			$(element).addClass("error-text");
		}
	} else {
		$("#" + element.id + "Error").hide();
		$(element).removeClass("error-text");
	}
}


function getInternetExplorerVersion()
// Returns the version of Internet Explorer or a -1
// (indicating the use of another browser).
{
  var rv = -1; // Return value assumes failure.
  if (navigator.appName == 'Microsoft Internet Explorer')
  {
    var ua = navigator.userAgent;
    var re  = new RegExp("MSIE ([0-9]{1,}[\.0-9]{0,})");
    if (re.exec(ua) != null)
      rv = parseFloat( RegExp.$1 );
  }
  return rv;
}

// Returns if the browser is running in compatability mode or not. NOTE: IE7 & IE8(comp mode) sends the same user agent regardless of the mode! 
function isCompatibilityMode() {
	var ua = navigator.userAgent;
	var re = new RegExp("compatible;");
	if (re.exec(ua) != null) {
		return true;
	}
	return false;
}

/*
* jQuery Disable On Submit Plugin
* http://www.evanbot.com/article/jquery-disable-on-submit-plugin/13
*
* Copyright (c) 2009 Evan Byrne (http://www.evanbot.com)     
*/
$.fn.disableOnSubmit = function(disableList){
	
	if(disableList == null){var $list = 'input[type=submit],input[type=button],input[type=reset],button';}
	else{var $list = disableList;}
	
	// Makes sure button is enabled at start
	$(this).find($list).removeAttr('disabled');
	
	$('input[type=submit],input[type=button],input[type=reset],button').submit(function(){alert('hi'); $(this).find($list).attr('disabled','disabled');});
	return this;
};

/** 
 * textarea counter plugin.
 * author: @sagish
 */
/*$.fn.textareaCounter = function(){
	return this.each(function(){
		var counter = $(this).find(".counter");
		var limit = parseInt(counter.text());
		var textarea = $(this).find("textarea");
		textarea.keypress(function(e){
			var code = (e.keyCode ? e.keyCode : e.which);
			var length = $(this).val().length;
			if (code != 8 && length > limit) {
				return false;
			}
			counter.text((limit-length));
		});
	});
};
*/

// Tooltip event
$(".tooltip_holder").live("mouseenter", function(){
	$(this).find(".tooltip").fadeIn("fast");
}).live("mouseleave", function(){
	$(this).find(".tooltip").fadeOut("fast");
});

$.fn.tabinate = function() {
	return this.each(function(){
		var self = this;
		var $this = $(this);
		var tabs = $(this).find(".tabs > li");
		var holder = $(this).find(".holder > li");
		var current = 0;
		var count = 1;
		var amountOfChildren = holder.size();
		
		this.show = function(index) {
			if (current != index) {
				tabs.removeClass("selected");
				if (tabs.eq(index).attr("rel")) {
					holder.eq(index).load( tabs.eq(index).attr("rel") );
				}
					tabs.eq(index).addClass("selected").show();
					
					holder.eq(index).hide();
					holder.eq(current).slideToggle("normal", function(){
						holder.eq(current).removeClass("selected");
						holder.eq(index).addClass("selected");
						holder.eq(index).slideToggle("normal", function(index){
							
						});
					});
					
				current = index;
			} else {
				reloadCurrentTab();
			}
		}
		
		this.init = function() {
			holder.hide();
			$this.css({overflow: "hidden"});
			if ($this.css("min-height") == undefined) {
				$this.css({"min-height": $this.height()+20+"px"});
			}
			
			var preSelected = false;
			for (var i = 0; i < amountOfChildren; i++) {
				if (tabs.eq(i).hasClass("selected")) {
					preSelected = true;
					if (tabs.eq(i).attr("rel") && !tabs.eq(i).hasClass("loaded")) {
						holder.eq(i).load( tabs.eq(i).attr("rel") );
						holder.eq(i).addClass("loaded");
					}
					current = i;
					holder.eq(i).show();
					break;
				}
			}
			
			if (!preSelected) {
				tabs.eq(0).addClass("selected");
				if (tabs.eq(0).attr("rel")) {
					if (tabs.eq(0).hasClass("loaded")) {
						holder.eq(0).show();
					}
					else {
						holder.eq(0).load( tabs.eq(0).attr("rel") , holder.eq(0).show());
						holder.eq(0).addClass("loaded");
					}
				} else {
					holder.eq(0).show();
				}
			}
	
		}
		
		tabs.click(function(){
			self.show($(this).index());
		});
		
		self.init();
		
	});
};

function getCurrentTabUrl () {
	var url = $(".selected").attr("rel");
	return url;
}

function isCurrentTabComponent (component) {
	var url = $(".selected").attr("rel");
	if (url.indexOf("c=" + component) != -1) {
		return true;
	} else { 
		return false;
	}
}

function changeCurrentTabUrl (url) {
	var tab = $(".selected").index();
	var holder = $(".holder li:nth-child("+(tab+1)+")");
	
	holder.load( url );
}

function reloadCurrentTab () {
	var tab = $(".selected").index();
	var holder = $(".holder li:nth-child("+(tab+1)+")");
	
	holder.load( $(".selected").attr("rel") );	
}

/* profile page functions */

// ###### ALL OF THESE FUNCTIONS SHOULD BE REMOVED ONCE EVERYTHING USES toggleField(div, option) #####
//function profileAddItem(div) {
//	$("#" + div).show();
//}

function profileToggleItem(div) {
	$("#" + div).slideToggle();
}

function profileHideItem(div) {
	$("#" + div).hide();
}

function profileShowItemInline(div) {
	$("#" + div).css('display', 'inline');
}
//###### ALL OF THESE FUNCTIONS SHOULD BE REMOVED ONCE EVERYTHING USES toggleField(div, option) #####

// takes two parameters: div, option.
// div: the div to affect.
// option: "inline" / "noSlide" 
// "inline" -> normal behaviour of show() and hide() are to set the element to "block". this will set it to inline.
// "table-row" -> normal behaviour of show() and hide() are to set the element to "block". this will set it to table-row.
// "noSlide" -> default behaviour will be slideToggle, so this allows to show/hide items without the animation.
function toggleField(div, option) {
	var element = $("#" + div);
	if (option) {
		if (option == "inline") {
			if (element.css("display") == "none") {
				element.css("display", "inline");
			} else {
				element.hide();
			}
		} else if (option == "table-row") {
			if (element.css("display") == "none") {
				element.css("display", "table-row");
			} else {
				element.hide();
			}			
		} else if (option == "noSlide") {
			element.toggle();
		}
	} else {
		element.slideToggle();
	}
}

// checks if a string is numeric (e.g float, int, etc..)

function isNumeric(strString)
//  check for valid numeric strings	
{
var strValidChars = "0123456789.-";
var strChar;
var blnResult = true;

if (strString.length == 0) return false;

//  test strString consists of valid characters listed above
for (i = 0; i < strString.length && blnResult == true; i++)
   {
   strChar = strString.charAt(i);
   if (strValidChars.indexOf(strChar) == -1)
      {
      blnResult = false;
      }
   }
return blnResult;
}

String.prototype.count=function(s1) { 
	return (this.length - this.replace(new RegExp(s1,"g"), '').length) / s1.length;
}

$.validator.addMethod("isLegitIsraeliId", function(value, element, param) {
	return this.optional(element) || (param && isLegitIsraeliId(value));
 }, "This has to be different...");

$.validator.addMethod("notEqualTo", function(value, element, param) {
	return this.optional(element) || value != param;
 }, "This has to be different...");

$.validator.addMethod("float", function(value, element, param) {
	return this.optional(element) || isNumeric(value);
 }, "This has to be different...");

$.validator.addMethod("maxElements", function(value, element, param) {
	var elementValue = String($("#" + element.id).val());
	var elementCount = elementValue.split(",").length;
	return this.optional(element) || elementCount <= param;
 }, "This has to be different...");

$.validator.addMethod("alnum", function(value, element, param) {
	var alNumRegex = /^([a-zA-Z0-9]+)$/;
    return this.optional(element) || alNumRegex.test(value);
}, "Username must contain only letters, numbers, or dashes.");

function jumpProfile() {
	var url = "/applicant/profile/jump-profile?format=json";
	$.getJSON(url, 
		function(data, textStatus) {
			if (textStatus == "success") {
				$("#jumpProfileDiv").html("<p>הפרופיל הוקפץ!</p>");
			}
			else {
				alert("An error has occurred. Please try again.");
			}
		}
	);
}

function jumpPosition(positionId, positionUrl) {
	var url = "/applicant/company/jump-position?format=json&p=" + positionId;
	$.getJSON(url, 
		function(data, textStatus) {
			if (data.allGood) {
				$("#jumpPosition").html('<span class="small">המשרה הוקפצה!</span>');
				//$("#companyPositionsSummaryList").load("/applicant/company/view-component/?c=companyPositionsSummaryList #companyPositionsSummaryList");
			}
			else {
				alert("An error has occurred. Please try again.");
			}
		}
	);
}

function jumpAllPositions() {
	var url = "/applicant/company/jump-all-positions?format=json";
	$.getJSON(url, 
		function(data, textStatus) {
			if (data.allGood) {
				$("#jumpAllPositions").html('<span class="bold">כל המשרות הקופצו!</span>');
			}
			else {
				alert("An error has occurred. Please try again.");
			}
		}
	);
}

function updateMatchedApplicantsCounter(positionId, divToUpdate) {
	var url = "/applicant/company/get-matched-applicants-for-position?format=json&p=" + positionId;
	$.getJSON(url, 
		function(data, textStatus) {
			if (data.allGood) {
				$("#" + divToUpdate).html(data.matchedApplicantsAmount);
			}
			else {
				alert(data.message);
			}
		}
	);
}

function isFirefox() {
	if (navigator.userAgent.indexOf("Firefox") == -1 ) {
		return false;
	}
	else {
		return true;
	}
}

function copyToClipboard(text) {
	if (isFirefox()) {
		var flashcopier = 'flashcopier';
		if(!document.getElementById(flashcopier)) {
			var divholder = document.createElement('div');
			divholder.id = flashcopier;
			document.body.appendChild(divholder);
		}
		document.getElementById(flashcopier).innerHTML = '';
		var divinfo = '<embed src="/static/common/clipboard.swf" FlashVars="clipboard=' + encodeURIComponent(text) + '" width="0" height="0" type="application/x-shockwave-flash"></embed>';
		document.getElementById(flashcopier).innerHTML = divinfo;
	}
	else {
		clipboardData.setData("Text", text);
	}
}

function reloadProfileFillingStatus(userId) {
	var userIdString = "";
	if (userId) {
		userIdString = "?u=" + userId;
	}
	$("#profileFillingStatus").load("/applicant/applicant/view-profile-filling-status" + userIdString + " #profileFillingStatus");
}

function setDivHtml (div, html) {
	$("#" + div).html(html);
}

$("a .edit").click(function(event) {
	  event.preventDefault();
	  // your actions
});

function profileAddItem (newContainer, renderFormUrl) { 
	var i = 'new'+ Math.random()*323; 
	$('#dummy').load(renderFormUrl, function (responseText, textStatus, XMLHttpRequest) { $('#' + newContainer).append(responseText); } );
}


function eventToField(event) {
	if (event.target) {
		return event.target;
	}
	else {
		return event.srcElement;
	}
}

function checkLengthEvent(event, maxLength, countDown) {
	field = eventToField(event);
	return checkLengthField(field, maxLength, countDown);
}

function checkLengthField(field, maxLength, countDown) {
	var fieldId = field.id;
	var fieldValue = field.value;
	
	var fieldValueWithoutNewlines = fieldValue.replace("\n", "");
	
	var fieldLength = fieldValueWithoutNewlines.length;
	
	if (countDown) {
		var length = maxLength - fieldLength;
	} else {
		var length = fieldLength;
	}
	var remainingLength = maxLength - length;
	
	if (remainingLength < 0) {
		remainingLength = 0;
	}
	
	$('#' + fieldId + 'Counter').html(length);

	if (length > maxLength) {  											    	
		field.value = fieldValue.substring(0, maxLength - 1);
		return false;
	}

	return true;
}

function deleteItem(type, id, div, reloadPage) {
	var url = "/applicant/applicant/delete-item?format=json&type=" + type + "&id=" + id;
	$.getJSON(url, 
		function(data, textStatus) {
			if (textStatus == "success") {
				if (reloadPage) {
					window.location.reload();
					return;
				}
				
				if (div != null) {
					$('#' + div).remove();
				}

				reloadProfileFillingStatus();
			}
			else {
				alert("An error has occurred. Please try again.");
			}
		}
	);
}

/* JavaScript related to Company Applicants Management page */

function deleteApplicant(positionId, userId, reloadPage, currentTab, fromQuickView) {
	var div = "row_user_id_" + userId;
	var url = "/applicant/company/manage-applicants?format=json&listAction=delete&positionId=" + positionId + "&usersIds=" + userId;
	$.getJSON(url, 
		function(data) {
			if (data.allGood) {
				if (fromQuickView) {
					$("#deleteApplicant").html('<span class="icon delete_marked">&nbsp;&nbsp;&nbsp;</span> <a href="javascript:void(0);" class="bold">סומן כלא מתאים, שחזר</a>');
					$("#deleteApplicant").unbind("click", false);
					$("#deleteApplicant").live("click", function () { restoreApplicant(positionId, userId, false, false, true); });
				}
				else {
					// change tabs counts according to action. (this is done because the lists change while page doesn't reload)
					$("#Deleted_tab_count").html(parseInt($("#Deleted_tab_count").html()) + 1);
					$("#" + currentTab + "_tab_count").html(parseInt($("#" + currentTab + "_tab_count").html()) - 1);
					
					if (reloadPage) {
						window.location.reload();
						return;
					}
					
					if (div != null) {
						$('#' + div).remove();
					}
				}
			}
			else {
				alert(data.message);
			}
		}
	);
}

function inviteApplicant(positionId, userId, reloadPage, fromQuickView) {
	var div = "row_user_id_" + userId;
	var url = "/applicant/company/manage-applicants?format=json&listAction=invite&positionId=" + positionId + "&usersIds=" + userId;
	$.getJSON(url, 
		function(data) {
			if (data.allGood) {	
				if (fromQuickView) {
					$("#inviteApplicant").html('<span class="icon invite_marked blackened">&nbsp;&nbsp;&nbsp;</span> <font class="blackened bold">הוזמן למשרה</font>');
				}
				else {
					if (reloadPage) {
						window.location.reload();
						return;
					}
					
					var inviteLinkObject = $("#" + div).find(".invite_icon");
					inviteLinkObject.replaceWith('<span class="invite_icon_greyed"></span>');	
				}
			}
			else {
				alert(data.message);
			}
		}
	);
}

function favoriteApplicant(positionId, userId, reloadPage, fromQuickView) {
	var div = "row_user_id_" + userId;
	var url = "/applicant/company/manage-applicants?format=json&listAction=favorite&positionId=" + positionId + "&usersIds=" + userId;
	$.getJSON(url, 
		function(data) {
			if (data.allGood) {
				if (fromQuickView) {
					$("#favoriteApplicant").html('<span class="icon mark_favorite blackened">&nbsp;&nbsp;&nbsp;</span> <font class="blackened bold">הועבר לנבחרת</font>');
				}
				else {
					$("#Favorite_tab_count").html(parseInt($("#Favorite_tab_count").html()) + 1);					
					$("#Applied_tab_count").html(parseInt($("#Applied_tab_count").html()) - 1);	
					
					if (reloadPage) {
						window.location.reload();
						return;
					}
					
					if (div != null) {
						$('#' + div).remove();
					}
				}
			}
			else {
				alert(data.message);
			}
		}
	);
}

function restoreApplicant(positionId, userId, reloadPage, oldTab, fromQuickView) {
	var div = "row_user_id_" + userId;
	var url = "/applicant/company/manage-applicants?format=json&listAction=restore&positionId=" + positionId + "&usersIds=" + userId;
	$.getJSON(url, 
		function(data) {
			if (data.allGood) {
				if (fromQuickView) {
					$("#deleteApplicant").html('<span class="icon delete_marked">&nbsp;&nbsp;&nbsp;</span> <a href="javascript:void(0);" class="bold">סמן כלא מתאים</a>');
					$("#deleteApplicant").unbind("click", false);
					$("#deleteApplicant").live("click", function () { deleteApplicant(positionId, userId, false, false, true); });
				}
				else {				
					$("#" + oldTab + "_tab_count").html(parseInt($("#" + oldTab + "_tab_count").html()) + 1);					
					$("#Deleted_tab_count").html(parseInt($("#Deleted_tab_count").html()) - 1);					
					
					if (reloadPage) {
						window.location.reload();
						return;
					}
					
					if (div != null) {
						$('#' + div).remove();
					}
				}
			}
			else {
				alert(data.message);
			}
		}
	);
}

function markAllApplicants(element, amount, limit, salt) {
	var checkedAmount = 0;
	var i = 0;
	$('.applicant_position_checkbox' + salt).each(function() {
		var currentElement = $('.applicant_position_checkbox' + salt + ':eq('+i+')');
		if (currentElement.parent().parent().css("display") != "none") {
			if ($("#check_all").is(":checked")) {
				currentElement.attr("checked", "checked");
			} else {
				currentElement.attr("checked", false);
			}
		}
		i++;
	}); 

	updateAmountMarkedApplicants(); 
	if ($(element).attr('checked') && amount > limit) { 
		alert('שים לב - לא ניתן לבחור יותר מ-' + limit + ' מועמדים בו זמנית'); 
	}	
}

function getMarkedApplicants(salt, markAll, returnAmount) {
	var div_base = "row_user_id_";
	var checkboxes=new Array();
	var i = 0;
	$(".applicant_position_checkbox" + salt).each(function(index) {
		if ($(this).attr("checked") || markAll) {
			checkboxes[i] = $(this).attr("id");
			i++;
		}
	});
	if (returnAmount) {
		return i;
	}
	return checkboxes;
}

function deleteMarkedApplicants(positionId, currentTab, salt, reloadPage) {
	var div_base = "row_user_id_";
	var usersIds = getMarkedApplicants(salt);
	var affectedUsersIds = new Array();
	var countUsersIds = usersIds.length;
	var usersIdsString = "";
	var j = 0;
	for (i = 0; i < countUsersIds; i++) {
		if (usersIds[i] != undefined) {
			affectedUsersIds[j] = usersIds[i];
			j++;
			usersIdsString = usersIdsString + usersIds[i];
			if (i+1 < countUsersIds && usersIds[i+1] != undefined) {
				usersIdsString = usersIdsString + ",";
			}
		}
	}
	var countAffectedUsersIds = affectedUsersIds.length;
	
	if (usersIdsString == "") {
		alert('לא בחרת מועמדים להעביר לרשימת הלא מתאימים.');
		return false;
	}
	
	var url = "/applicant/company/manage-applicants?format=json&listAction=delete";
	$.getJSON(url, { positionId: positionId, usersIds: usersIdsString }, 
		function(data) {
			if (data.allGood) {
				// change tabs counts according to action. (this is done because the lists change while page doesn't reload)
				$("#Deleted_tab_count").html(parseInt($("#Deleted_tab_count").html()) + data.affectedAmount);
				$("#" + currentTab + "_tab_count").html(parseInt($("#" + currentTab + "_tab_count").html()) - data.affectedAmount);
				
				if (reloadPage) {
					window.location.reload();
					return;
				}

				for (i = 0; i < countAffectedUsersIds; i++) {
					div = div_base + affectedUsersIds[i];
					$("#" + div).remove();
				}
			}
			else {
				alert(data.message);
			}
		}
	);
}

function inviteMarkedApplicants(positionId, salt, reloadPage, markAll) {
	if (markAll == undefined) {
		markAll = false;
	}
	var div_base = "row_user_id_";
	var usersIds = getMarkedApplicants(salt, markAll);
	var affectedUsersIds = new Array();
	var countUsersIds = usersIds.length;
	var usersIdsString = "";
	var j = 0;
	for (i = 0; i < countUsersIds; i++) {
		if (usersIds[i] != undefined) {
			affectedUsersIds[j] = usersIds[i];
			j++;
			usersIdsString = usersIdsString + usersIds[i];
			if (i+1 < countUsersIds && usersIds[i+1] != undefined) {
				usersIdsString = usersIdsString + ",";
			}
		}
	}
	var countAffectedUsersIds = affectedUsersIds.length;
	
	if (usersIdsString == "") {
		alert('לא בחרת מועמדים לזמן למשרה.');
		return false;
	}
	
	var url = "/applicant/company/manage-applicants?format=json&listAction=invite&positionId=" + positionId + "&usersIds=" + usersIdsString;
	$.getJSON(url, 
		function(data) {
			if (data.allGood) {
				if (reloadPage) {
					window.location.reload();
					return;
				}
				
				reloadCurrentTab();
				if (markAll) {
					$(".newPositionSuccessExplanationMessage").hide();
				}
			}
			else {
				alert(data.message);
			}
		}
	);
}

function exportList(list, positionId) {
	location.href = "/applicant/company/export-list?list=" + list + "&positionId=" + positionId;
}

function sendMessageToApplicant(positionId, userId, dontLoad) {
	if (dontLoad == undefined) {
		dontLoad = false;
	}
	popupShow_sendMassMessage("positionId=" + positionId + "&usersIds=" + userId, dontLoad);	
}


function sendMessageToMarkedApplicants(positionId, salt, reloadPage) {
	var div_base = "row_user_id_";
	var usersIds = getMarkedApplicants(salt);
	var affectedUsersIds = new Array();
	var countUsersIds = usersIds.length;
	var usersIdsString = "";
	var j = 0;
	for (i = 0; i < countUsersIds; i++) {
		if (usersIds[i] != undefined) {
			affectedUsersIds[j] = usersIds[i];
			j++;
			usersIdsString = usersIdsString + usersIds[i];
			if (i+1 < countUsersIds && usersIds[i+1] != undefined) {
				usersIdsString = usersIdsString + ",";
			}
		}
	}
	var countAffectedUsersIds = affectedUsersIds.length;
	
	if (usersIdsString == "") {
		alert('לא בחרת נמענים להודעה.');
		return false;
	}

	popupShow_sendMassMessage("positionId=" + positionId + "&usersIds=" + usersIdsString);
}

function deleteCookie(name, path) {
	document.cookie = name + "=" +
	( ( path ) ? ";path=" + path : "") +
	";expires=Thu, 01-Jan-1970 00:00:01 GMT";
}

function getCounterHtml(matchedAmount, divToUpdate, noEffect) {
	matchedAmount = String(matchedAmount);
	var counterNumbers = new Array();
	counterNumbers = matchedAmount.split("");
	counterNumbers.reverse();
	if (noEffect == undefined || !noEffect) {
		$("#" + divToUpdate).fadeOut("normal", function() { 
			$("#" + divToUpdate).html('<div class="number">' + counterNumbers.join('</div><div class="number">') + '</div>');
			$("#" + divToUpdate).fadeIn("slow");
		});		
	}
	else {
		$("#" + divToUpdate).html('<div class="number">' + counterNumbers.join('</div><div class="number">') + '</div>');
	}
}

function cancelSubscription(reloadPage) {
	var url = "/applicant/applicant/cancel-subscription";
	$.getJSON(url, 
		function(data) {
			if (data.allGood) {
				if (reloadPage) {
					window.location.reload();
					return;
				}
				
				reloadCurrentTab();
			}
			else {
				alert(data.message);
			}
		}
	);	
}

function widgetCreateFilterChange(tabIndex, filter) {
	$("#filterExtraCompanyData_" + tabIndex).hide();
	$("#filterExtraCompaniesData_" + tabIndex).hide();
	$("#filterExtraPositionsData_" + tabIndex).show();
	
	if (filter == "companies") {
		$("#filterExtraPositionsData_" + tabIndex).hide();
		$("#filterExtraCompaniesData_" + tabIndex).show();
	}
	else if (filter == "company") {
		$("#filterExtraPositionsData_" + tabIndex).hide();
		$("#filterExtraCompanyData_" + tabIndex).show();
	}
}

function deletePromotion(promotionId, reloadUrl) {
	var url = "/applicant/promotions/delete?format=json&promotionId=" + promotionId;
	$.getJSON(url, 
		function(responseData, textStatus) {
			if (responseData.allGood) {
				if (reloadUrl) {
					location.href = reloadUrl;
				}
				else {
					// remove promotion from table
					$("#promotion_" + promotionId + "_view").remove();
					$("#promotion_" + promotionId + "_edit").remove();
				}
			}
			else {
				alert(responseData.message);
			}
		}
	);
}

function deleteWidget(widgetId, reloadUrl) {
	var url = "/applicant/api/widget-delete?format=json&id=" + widgetId;
	$.getJSON(url, 
		function(responseData, textStatus) {
			if (responseData.allGood) {
				if (reloadUrl) {
					location.href = reloadUrl;
				}
				else {
					// remove widget from table
					$("#widget_" + widgetId).remove();
				}
			}
			else {
				alert(responseData.message);
			}
		}
	);
}

function quickContactUs(updateDivId) {
	var url = "/applicant/company/quick-contact-us";
	$.getJSON(url, 
		function(responseData, textStatus) {
			if (responseData.allGood) {
				if (updateDivId) {
					$("#" + updateDivId).html('תודה רבה, צוות זרם יצור איתך קשר בהקדם');
				}
			}
			else {
				alert(responseData.message);
			}
		}
	);	
}

function requestRecommendations(fieldId) {
	if (fieldId) {
		popupShow_requestRecommendation("emails=" + document.getElementById(fieldId).value);
	}
	else {
		popupShow_requestRecommendation();
	}
}

var pageLoaded = false;
function isPageLoaded(loadDone) {
	if (loadDone) {
		pageLoaded = true;
	}
	
	if (pageLoaded) {
		return true;
	}
	else {
		return false;
	}
}
$(window).load(function() { isPageLoaded(true); });


// generalized popupShow and popupClose functions.
function popupShow (name, param1, param2) {
	callFunctionIfExists("popupShow_" + name, null, param1, param2);
}

function popupClose() {
	$("div[class='close']").click();
}	



