jQuery.noConflict();

jQuery(document).ready(function($) {
	$("label.overlabel").overlabel();

	if ($.browser.msie && $.browser.version < 7) {
		$("ul.sf-menu").supersubs({
	            minWidth:    18,   // minimum width of sub-menus in em units
	            maxWidth:    18,   // maximum width of sub-menus in em units
	            extraWidth:  0     // extra width can ensure lines don't sometimes turn over
	                               // due to slight rounding differences and font-family
	        });  				   // call supersubs first, then superfish, so that subs are
	                         	   // not display:none when measuring. Call before initialising
	                               // containing tabs for same reason.
	} else {
		$("ul.sf-menu").supersubs({
	            minWidth:    12,   // minimum width of sub-menus in em units
	            maxWidth:    35,   // maximum width of sub-menus in em units
	            extraWidth:  0     // extra width can ensure lines don't sometimes turn over
	                               // due to slight rounding differences and font-family
	        });  				   // call supersubs first, then superfish, so that subs are
	                         	   // not display:none when measuring. Call before initialising
	                               // containing tabs for same reason.
	}

	// Superfish menu
	$("ul.sf-menu").superfish({
    	delay: 300,
        speed: "fast"
   	});

	applyInputConstraints($);
});

function initInputLabel(jElementInput, jElementLabel) {
	jQuery(jElementInput).data('onfocus', false);

	jQuery(jElementInput).blur(function(){
		jQuery(jElementInput).data('onfocus', false);
		if (this.value == "") {
			jQuery(jElementLabel).show();
		}
	});
	jQuery(jElementInput).focus(function(){
		jQuery(jElementInput).data('onfocus', true);
		jQuery(jElementLabel).hide();
	});
	jQuery(function(){
    	if (jQuery(jElementInput).val() == "" && jQuery(jElementInput).data('onfocus') == false) {
  			jQuery(jElementLabel).show();
  		}
 	});
}

function applyInputConstraints($) {
	$(".number-integer").numeric();
	$(".number-negative-integer").numeric({allow:"-"});
	$(".number-decimal").numeric({allow:"."});
	$(".number-negative-decimal").numeric({allow:".-"});
}

function accountManagement_validateMaxNumberOfLicenses(checkboxClass, maxLicenses, errorMessage) {
	var licenseCount = jQuery("input[@class*='" + checkboxClass + "']:checked").length;
	if (maxLicenses < licenseCount)	{
		alert(errorMessage);
		return false;
	} else {
		return true;
	}
}


function validateRenewalMonths() {

//var x = jQuery("input[@class*='renew']:checked").length;

	var total = jQuery("input:checked").length;

  	if ( total < 4) {
  		alert('Please check at least 4 months.');
   		return false;
  	}
   return true;
}

function userAccountEdition_validateForm(emailID, confirmationEmailID, passwordID, confirmationPasswordID, errorMsgEmail, errorMsgPassword) {
	if(!inputValuesMatch(emailID, confirmationEmailID)) {
		alert(errorMsgEmail);
		jQuery("input[@id*='" + emailID + "']").focus();
		return false;
	}
	if(!inputValuesMatch(passwordID, confirmationPasswordID)) {
		alert(errorMsgPassword);
		jQuery("input[@id*='" + passwordID + "']").focus();
		return false;
	}
	return true;
}

function adminAccountEdition_validateForm(emailID, confirmationEmailID, errorMsgEmail) {
	if(!inputValuesMatch(emailID, confirmationEmailID)) {
		alert(errorMsgEmail);
		jQuery("input[@id*='" + emailID + "']").focus();
		return false;
	}
	return true;
}

function inputValuesMatch(inputID1, inputID2) {
	var inputValue1 = jQuery("input[@id*='" + inputID1 + "']").val();
	var inputValue2 = jQuery("input[@id*='" + inputID2 + "']").val();
	return inputValue1 == inputValue2;
}

function confirmePurgeIfDowngradedNumberOfLicenses(maxUserID,oldMaxUserValue, alertMsg) {
	var inputValue= document.getElementById(maxUserID).value ;
	if(inputValue < oldMaxUserValue) {
		if (!window.confirm(alertMsg)) {
		   return false
		}
		else {
			return true;
		}
	}
   	return true;
}

function searchResultsSelectAllListings() {
	jQuery("input[@class*=selectionCheckbox]").each(function() {
		this.checked = true;
	});
}

function searchResultsClearAllListings() {
	jQuery("input[@class*=selectionCheckbox]").each(function() {
		this.checked = false;
	});
}

function toggleLinecalculatorUI() {
	jQuery(".linesCalculationParam").toggle();
}

function clearNewMediaListName() {
	jQuery("input[@id*='newMediaListName']").val('');
}

function displayCardSubscriptionExpiryWarning() {
	Richfaces.showModalPanel('cardSubscriptionExpiryWarningModalPanel',{width:400, height: 150, top:200});
}

function displayNlaSubscriptionExpiryWarning() {
	Richfaces.showModalPanel('nlaSubscriptionExpiryWarningModalPanel',{width:400, height: 150, top:200});
}

function displayCardSubscriptionExpiry() {
	Richfaces.showModalPanel('cardSubscriptionExpiryModalPanel',{width:400, height: 150, top:200});
}

function displayNlaSubscriptionExpiry() {
	Richfaces.showModalPanel('nlaSubscriptionExpiryModalPanel',{width:400, height: 150, top:200});
}

function displayTermsOfUse() {
    if ( get_Cookie("termsOfUse") == null ){
		Richfaces.showModalPanel('termsOfUseModalPanel',{width:600, height: 450, top:1});
		jQuery("input[@id*='acceptTerms']").focus();
	}
}

function displayUserProfileUpdateConfirmation() {
	Richfaces.showModalPanel('userProfileUpdateConfirmationModalPanel',{width:400, height: 100, top:200});
}

function setHtml(componentId, value) {
	jQuery("[@id*='" + componentId + "']").html(value);
}

function afterAjaxRequest() {
	applyInputConstraints(jQuery);
}

function showLinkInMsg(msgErrorId,_msg) {
	var msg = _msg;
	if (msg != null && msg.indexOf('&lt;') != -1) {
		msg =  msg.replaceAll('&lt;','<').replaceAll('&gt;','>');
	}
	setHtml(msgErrorId,'<span class="error">'+msg+'</span>');
}

function get_Cookie(name) {

    var start = document.cookie.indexOf(name+"=");
    var len = start+name.length+1;
    if (!start) {
      	if (name != document.cookie.substring(0,name.length)) {
      		return null;
      	}
    }
    if (start == -1) {
        return null;
    }
    var end = document.cookie.indexOf(";",len);
    if (end == -1) {
      end = document.cookie.length;
    }
    return unescape(document.cookie.substring(len,end));
}

function set_Cookie(name, value, expiredays) {

   	var expireDate = new Date();
   	if (expireDate != null ) {
		expireDate.setDate(expireDate.getDate() + expiredays);
	}
	document.cookie = name + "=" + escape(value) + ((expiredays == null) ? ";path=/" : ";expires=" + expireDate.toGMTString() + ";path=/");
}

function prepareSectionEdition(containerId, sectionTitle) {
	//alert('containerId=' + containerId);
	//alert('sectionTitle=' + sectionTitle);
	if(containerId != '') {
		var content = jQuery("[@id='listingEditionFormId:" + containerId + "']").html();
		//alert("content=" + content);
		content = cleanHtml(content, containerId);
		jQuery("[@id*='sectionSourceContent']").val(content);
	}
	jQuery("[@id*='sectionTitle']").val(sectionTitle);
}

function completeSectionEdition(modalPanel, modalPanelWidth, modalPanelHeight, modalPanelTop, container1, container2) {
	Richfaces.showModalPanel(modalPanel,{width:modalPanelWidth, height:modalPanelHeight, top:modalPanelTop});
	if(container1 != '' && container2 != '') {
		showDiff(container1, container2);
		//hideDiffHighlight();
		showDiffHighlight()
	}
}

function showDiff(containerId1, containerId2) {
	/*
	RETRIEVE SECTIONS CONTENT
	*/
	var content1 = jQuery("[@id='" + containerId1 + "']").html();
	var content2 = jQuery("[@id='" + containerId2 + "']").html();
	//document.getElementById('editSectionModalPanelForm:src2').value = content1; // Debug only

	/*
	CLEAN HTML
	*/
	content1 = cleanHtml(content1, containerId1);
	//alert(containerId1);
	//alert(content1);
	content2 = cleanHtml(content2, containerId2);
	//document.getElementById('editSectionModalPanelForm:cleanedContent1').value = content1; // Debug only
  	//document.getElementById('editSectionModalPanelForm:cleanedContent2').value = content2; // Debug only


	/*
	CHANGE TABLES MARKUPS
	*/
	content1 = getContentWithTableMarkups(content1);
	content2 = getContentWithTableMarkups(content2);
	//alert("content1 with markups " + content1 + \n\n content2 with markups " + content2);

	/*
	SPLIT CONTENT
	*/
	var content1Parts = content1.split("#table");
	var content2Parts = content2.split("#table");
	//alert("content1Parts = " + content1Parts + "\ncontent2Parts = " + content2Parts);

	/*
	BUILD HIGHLIGHT STRING
	*/
	var longestArray = null;
	if(content1Parts.length > content2Parts.length) {
		longestArray = content1Parts;
	} else {
		longestArray = content2Parts;
	}

	var changesHighlighted = "";
	var sectionHighLighted = "";
	var content1Part = "";
	var content2Part = "";
	var htmlWOValidity = ""; // Debug only
	for(var i = 0; i < longestArray.length; i++) {
		if(content1Parts.length > i && content2Parts.length > i) {
			content1Part = content1Parts[i];
			content2Part = content2Parts[i];
			//alert(content1Part);
			//alert(content2Part);
			content1Part = getContentWithoutTableMarkups(content1Part);
			content2Part = getContentWithoutTableMarkups(content2Part);
			//alert(content1Part);
			//alert(content2Part);
			sectionHighLighted = highlightChanges(content1Part, content2Part);
			sectionHighLighted = ensureHtmlIntegrity(sectionHighLighted);
			htmlWOValidity += sectionHighLighted; // Debug only
			if(isHtmlUpright(sectionHighLighted)) {
				changesHighlighted += sectionHighLighted;
			} else {
				// Append user's changes, highligth whole part
				changesHighlighted += "<div style=\"background:#FFFFCC;\">" + content2Part + "</div>";
			}
		} else {
			changesHighlighted += "<div style=\"background:#FFFFCC;\">" + getContentWithoutTableMarkups(longestArray[i]) + "</div>";
		}
	}
  	document.getElementById('sectionWithHighlight').innerHTML = changesHighlighted;
  	//document.getElementById('rawDs').value = changesHighlighted; // Debug only
  	//document.getElementById('editSectionModalPanelForm:htmlWOValidity').value = htmlWOValidity; // Debug only
}

function ensureHtmlIntegrity(string) {
	string = string.replace(/<td +</g, "<td><");
	string = string.replace(/<\/td *</g, "<\/td><");
	return string;
}

function isHtmlUpright(string) {
	if(string.indexOf("<<") > -1) {
		return false;
	}
	return true;
}

function highlightChanges(content1, content2) {
	//alert("Content1 = " + content1 + " \n\n Content2 = " + content2);
	var dmp = new diff_match_patch();
	var d = dmp.diff_main(content1, content2);
  	dmp.diff_cleanupSemantic(d);
  	var ds = dmp.diff_prettyHtml(d);
	ds = removeSpanTags(ds);
	ds = ds.replace(/&lt;/g, "<");
	ds = ds.replace(/&gt;/g, ">");
	ds = ds.replace(/&para;/g, "");
	ds = ds.replace(/&amp;nbsp;/g, " ");
	ds = removeEmptyTags(ds, 'INS');
	ds = removeEmptyTags(ds, 'DEL');
	return ds;
}

function getContentWithTableMarkups(string) {
	string = string.replace(/<table/g, "#table#startTable");
	string = string.replace(/<\/table>/g, "#endTable#table");
	return string;
}

function getContentWithoutTableMarkups(string) {
	string = string.replace(/#startTable/g, "<table");
	string = string.replace(/#endTable/g, "<\/table>");
	return string;
}

function cleanHtml(string, sectionId) {
	if(string == null) {
		return "";
	}
	string = reverseCharactersEscaping(string);
	string = removeComments(string);
	string = htmlTagsToLowerCase(string);
	string = string.replace(/\t|\r|\n|\r\n/g, "");
	string = string.replace(/> +</g, "><");
	string = removeSpanTags(string);
	if(sectionId.indexOf('generalInformationSectionId') > -1 || sectionId.indexOf('mediaRepsSectionId') > -1) {
		string = removeLinksForGeneralInformationSection(string);
	} else {
		string = removeLinks(string);
	}
	string = removeIds(string);
	string = removeExtraSpaces(string);
	string = removeEmptyTags(string, 'div');
	string = removeEmptyTags(string, 'span');
	//string = string.replace(/\"/g, "&#34;");
	string = addQuotes(string);
	string = removeClasses(string);
	string = standardiseTables(string);
	string = string.replace(/\n/g, "");
	string = standardiseBrTags(string);
	string = string.replace(/ style="pad.*?"/g, "");
	string = string.replace(/ id=\">/g, ">");
	string = string.replace(/<div>/g, "");
	string = string.replace(/<\/div>/g, "<br\/>");
	string = string.replace(/<p>/g, "");
	string = string.replace(/<\/p>/g, "<br\/>");
	string = string.replace(/ +valign=\"top\"/g, "");
	string = string.replace(/<img .*?>/g, "");
	return string;
}

function reverseCharactersEscaping(string) {
	if (string == '') {
		return string;
	}
	string = string.replace(/&lt;/g, "<");
	string = string.replace(/&gt;/g, ">");
	string = string.replace(/&amp;amp;/g, "&");
	string = string.replace(/&amp;/g, "&");
	string = string.replace(/&quot;/g, "\"");
	string = string.replace(/&apos;/g, "\'");
	string = string.replace(/&nbsp;/g, " ");
	return string;
}

function removeComments(string) {
	if (string == '') {
		return string;
	}
	var commentRemoved = string; // usefull if string contains no comment
	var start = string.indexOf("<!--");
	var end = -1;
	while(start != -1) {
		commentRemoved = "";
		end = string.indexOf("-->") + 3;
		commentRemoved += string.substring(0, start);
		commentRemoved += string.substring(end, string.length) ;
		string = commentRemoved;
		start = string.indexOf("<!--");
	}
	return commentRemoved;
}

function removeClasses(string) {
	if (string == '') {
		return string;
	}
	string = string.replace(/ class=".*?"/g, "");
	return string;
}

function removeSpanTags(string) {
	if (string == '') {
		return string;
	}
	string = string.replace(/<span.*?>/g, "");
	string = string.replace(/<SPAN.*?>/g, "");
	string = string.replace(/<\/span>/g, "");
	string = string.replace(/<\/SPAN>/g, "");
	return string;
}

function htmlTagsToLowerCase(string) {
	if (string == '') {
		return string;
	}
	var start = -1;
	var end = -1;
	var caseLowered = "";
	var lastCharProcessed = 0;
	for(var i = 0; i < string.length;  i++) {
		if (string.charAt(i) == '<') {
			start = i;
		}
		if (string.charAt(i) == '>') {
			end = i;
		}
		if (start != -1 && end != -1) {
			caseLowered += string.substring(lastCharProcessed, start);
			caseLowered += string.substring(start, end).toLowerCase();
			lastCharProcessed = end;
			start = -1;
			end = -1;
		}
	}
	caseLowered += string.substring(lastCharProcessed, string.length);
	return caseLowered;
}

function removeLinks(string) {
	if (string == '') {
		return string;
	}
	var start1 = -1;
	var end1 = -1;
	var start2 = -1;
	var end2 = -1;
	var linksRemoved = string;
	var link = "";
	start1 = string.indexOf("<a");
	while(start1 != -1) {
		end1 = string.indexOf("</a>");
		link = string.substring(start1, end1);
		start2 = link.indexOf("href=");
		link = link.substring(start2 + 6, link.length);
		end2 = link.indexOf("\"");
		if (start2 != -1 && end2 != -1) {
			link = link.substring(0, end2);
			if(link == "#") {
				// This is a VCard link - to ignore.
				link = "";
			}
		} else {
			link = "";
		}
		linksRemoved = string.substring(0, start1);
		linksRemoved += link;
		linksRemoved += string.substring(end1 + 4, string.length);
		string = linksRemoved;
		start1 = string.indexOf("<a");
	}
	linksRemoved = linksRemoved.replace(/mailto:/g, "");
	return linksRemoved;
}

function removeLinksForGeneralInformationSection(string) {
	if (string == '') {
		return string;
	}
	var linksRemoved = string;
	linksRemoved = linksRemoved.replace(/<a.[^>]*>/g, "");
	linksRemoved = linksRemoved.replace(/<\/a>/g, "");
	return linksRemoved;
}

function removeIds(string) {
	if (string == '') {
		return string;
	}
	// Remove ids on div tags
	string = string.replace(/ id=.*?>/g, ">");
	return string;
}

function removeExtraSpaces(string) {
	if (string == '') {
		return string;
	}
	string = string.replace(/(&nbsp;)+<br\/>/g, "<br/>");
	string = string.replace(/(&nbsp;)+<\/div>/g, "</div>");
	string = string.replace(/ +<\/div>/g, "</div>");
	string = string.replace(/ +<br\/>/g, "<br/>");
	string = string.replace(/ +<\/td>/g, "</td>");
	return string;
}

function removeEmptyTags(string, tagToRemove) {
	if (string == '' || tagToRemove == '') {
		return string;
	}
	tagToRemove = "<" + tagToRemove;
	var tagsRemoved = "";
	var tagStart = 0;
	var tagEnd = 0;
	var endingTagStart = 0;
	var endingTagEnd = 0;
	var tagContent = "";
	while(string.length > 0) {
		tagStart = string.indexOf(tagToRemove);
		if(tagStart == -1) {
			// No more tag to remove
			tagsRemoved += string;
			break;
		}
		tagEnd = string.indexOf(">", tagStart);
		endingTagStart = string.indexOf("</", tagEnd);
		endingTagEnd = string.indexOf(">", endingTagStart);
		tagsRemoved += string.substring(0, tagStart);
		tagContent = string.substring(tagEnd + 1, endingTagStart)
		if(endingTagStart - tagEnd > 1 && tagContent.replace(/^\s+|\s+$/g, "").length > 0) {
			tagsRemoved += string.substring(tagStart, endingTagEnd + 1);
		}
		string = string.substring(endingTagEnd + 1, string.length);
	}
	return tagsRemoved;
}

function addQuotes(string) {
	if (string == '') {
		return string;
	}
    var openBracket = false;
    var openQuote = false;
    var colonMet = false;
    var quotesAdded = "";
    var character;
    for(var i = 0; i < string.length; i++) {
        character = string.charAt(i);
        if ('<' == character) {
        	openBracket = true;
            quotesAdded += character;
        } else if ('>' == character) {
        	openBracket = false;
            if(openQuote) {
                quotesAdded += '"';
                openQuote = false;
            }
            quotesAdded += character;
        } else if ('=' == character) {
            quotesAdded += character;
            if("\"" != string.charAt(i + 1) && openBracket){
                quotesAdded += '"';
                openQuote = true;
            }
        } else if('"' == character) {
            quotesAdded += character;
            openQuote = !openQuote;
        } else {
        	if(':' == character) {
		        colonMet = true;
		 	} else if(' ' == character && !colonMet) {
		        colonMet = false;
        		if(openQuote && openBracket) {
           			quotesAdded += '"';
           			openQuote = false;
           		}
           	}
            quotesAdded += character;
        }
    }
    // TODO Find why this happens </td><td>10-1/4"" x 14"</td"></tr>
    // and remove those lines:
    quotesAdded = quotesAdded.replace(/\"\"/g, "\"");
    quotesAdded = quotesAdded.replace(/<\/td\">/g, "</td>");
    return quotesAdded;
}

function standardiseTables(string) {
	if (string == '') {
		return '';
	}
	string = string.replace(/ border=\"?[\w-]*\"?/g, "");
	string = string.replace(/ cellspacing=\"?[\w-]*\"?/g, "");
	string = string.replace(/ cellpadding=\"?[\w-]*\"?/g, "");
	string = string.replace(/<table>/g, "<table cellspacing=\"0\" cellpadding=\"3\" border=\"1\">");
	string = string.replace(/<\/td>.*<\/INS>/g, "<\/td>");
	return string;
}

function standardiseBrTags(string) {
	if (string == '') {
		return '';
	}
	string = string.replace(/<br>/g, "<br/>");
	string = string.replace(/<br \/>/g, "<br/>");
	return string;
}

function validateFeedback() {
	var feedback = jQuery("[@id*='listingfeedbackModalPanelForm:feedbackTextArea']").val();
	jQuery("[@id*='listingfeedbackModalPanelForm:btSendFeedback']").attr("disabled", feedback == '');
}

function showDiffHighlight() {
	jQuery('#sectionWithHighlight').show();
	jQuery('#btHideDiffHighlight').show();
	jQuery('#sectionWithoutHighlight').hide();
	jQuery('#btShowDiffHighlight').hide();
}

function hideDiffHighlight() {
	jQuery('#sectionWithHighlight').hide();
	jQuery('#btHideDiffHighlight').hide();
	jQuery('#sectionWithoutHighlight').show();
	jQuery('#btShowDiffHighlight').show();
}
