// Copyright by Netzgiganten GmbH 2006
// Author: Martin Stransfeldt
// Revision: 1239

// ---------------------------------------------------------------------------
//  import other javascript files
// ---------------------------------------------------------------------------

// shopmodel.js
// HTMLGenerator.js
// CookieManager.js

// ---------------------------------------------------------------------------
//  global variables
// ---------------------------------------------------------------------------

var revNumber	= "1239";
var revDate		= "10.09.2010";
var HOST		= "../../medienshop/";

//var revNumber	= "915";
//var revDate		= "15.12.2009";
//var HOST		= "http://medienshop.bosch.netzgiganten.com/ms/";

// name of infoshop cookie
var cookieName = "BoschInfoshop";

// id of divs, dynamically changing their contents
rootDivId	= "#medienshop"
inputHTML	= "#inputForm";
outputHTML	= "#outputForm";
mediumDetailsOverlayDiv = "mediumDetails";

//amount of items shown on a searchresult page
var pagingIncrement = 20;

//the locale used to localize the user interface
var locale = "de";

// path to mailing ASP script
var mailingAspScript = "#";

var webappUrl = "";

//search form parameter values
var queryMediatype		= "0";
var queryBusinessunit	= "0";
var queryLanguage		= "0";
var queryOrdernumber	= "";

$(document).ready(function () {
	// medium details overlay DIV
	$(rootDivId).append("<div id='mediumDetails' class='divMediumDetailsOverlay'>&nbsp;</div>");
	// input form DIV
	$(rootDivId).append("<div id='inputForm' class='divInputForm'>&nbsp;</div>");
	// output form DIV
	$(rootDivId).append("<div id='outputForm' class='divOutputForm'>&nbsp;</div>");
	// version info DIV
	$(rootDivId).append("<div class='divVersionInfo'>rev" + revNumber + " (" + revDate + ")</div>");
	// hide overlay
	$("#mediumDetails").hide();
});

// ---------------------------------------------------------------------------
//  general functions
// ---------------------------------------------------------------------------

/**
 * Checks the URL for the locale. 
 * 
 * @param loc the user locale, e.g. "de", "en"
 * @param mailingAspPath the path to mailing ASP script
 * @param webappUrl the encoded web application URL
 */
function defineLocale(loc, mailingAspPath, webappUrl) {
	this.locale = loc;
	this.mailingAspScript = mailingAspPath;
	this.webappUrl = decodeURI(webappUrl);
	/*
	if(document.URL.indexOf("/en/")!==-1) { locale="en"; }
	else { locale = "de"; }
	*/
}

/**
 * Sets specified content as HTML to specified type.
 *
 * @param type - document element name
 * @param content - HTML content
 */
function insertForm(type, content) {
	 $(document).ready(function () {
		 $(type).html(content);
	 });
}


function openMediumDetailsWindow(printnorm) {
	var medium = null;
	for (var i=0; i<media.length; i++) {
		if (printnorm == media[i].printnorm) {
			medium = media[i];
			break;
		}
	}
	if (medium) {
		var detailsWindow = window.open(HOST + "logic/mediumDetails.html#"+medium.printnorm, "infoWindow", "width=450,height=300,resizable=no,scrollbars=yes,toolbar=no,status=no;");
		detailsWindow.focus();
	}
}

function contains(anArray, anElement) {
	for(var i=0; i<anArray.length; i++) {
		if (anArray[i] == anElement) { return true; }
	}
	return false;
}

function getGroupMedia(groupID) {
	var groupMedia = new Array();
	if (groupID) {
		var count = 0;
		for (var i=0; i<media.length; i++) {
			if (groupID==media[i].groupID) {
				groupMedia[count] = media[i];
				count++;
			}
		}
	}
	return groupMedia;
}

function getMediumOfGroupByLocale(groupID,locale) {
	var groupMedia = getGroupMedia(groupID);
	if (groupMedia.length==1) { return groupMedia[0]; }
	
	for (var i=0; i<groupMedia.length; i++) {
		for (var j=0; j<groupMedia[i].languages.length; j++) {
			if (locale=="de" && groupMedia[i].languages[j]=="LANGUAGE.GERMAN")	{ return groupMedia[i]; }
			if (locale=="en" && groupMedia[i].languages[j]=="LANGUAGE.ENGLISH")	{ return groupMedia[i]; }
		}
	}
	return groupMedia[0]; //no locale matching medium in group found, so return first
}

function getSortedMediumLanguages(locale,medium) {
	var en = null;
	
	//associative array... (dont add english language if locale is "en")
	var mediumLanguages = new Array();
	for (var i=0; i<medium.languages.length; i++) {
		if (locale=="en" && medium.languages[i]=="LANGUAGE.ENGLISH") {
			en = "LANGUAGE.ENGLISH";
		} else {
			mediumLanguages[medium.languages[i]] = "language";
		}
	}
	
	//...sorted via global languages array
	var sorted = new Array();
	var count = 0;
	for(var l=0; l<languages.length; l++) {
		if (mediumLanguages[languages[l].resourceKey]=="language") {
			sorted[count] = languages[l].resourceKey;
			count++;
		}
	}
	
	if (en!==null) {
		sorted.unshift("LANGUAGE.ENGLISH");
	}
	
	return sorted;
}

function getSortedMediaGroupLanguages(locale,groupMedia) {
	//Create associative array with language as key and printnorm as value from each language found in all media of group.
	//Count while creating array because associative array doesn't provide length function.
	var mediumLanguages = new Array();
	var firstLanguage = null;
	
	for (var i=0; i<groupMedia.length; i++) {
		for (var j=0; j<groupMedia[i].languages.length; j++) {
			if (locale=="en" && groupMedia[i].languages[j]=="LANGUAGE.ENGLISH") {
				firstLanguage = new Array(groupMedia[i].languages[j], groupMedia[i]);
			} else {
				mediumLanguages[groupMedia[i].languages[j]] = new Array(groupMedia[i].languages[j], groupMedia[i]);
			}
		}
	}
	
	//create array sorted (see global languages array)
	var count = 0;
	var sortedMediumLanguages = new Array();
	for (var l=0; l<languages.length; l++) {
		if (mediumLanguages[languages[l].resourceKey]) {
			sortedMediumLanguages[count] = mediumLanguages[languages[l].resourceKey];
			count++;
		}
	}
	
	//put english language on first position if locale is english
	if (firstLanguage!==null) {
		sortedMediumLanguages.unshift(firstLanguage);
	}
	
	return sortedMediumLanguages;
}

function existsMediumInLanguage(medium,language) {
	var groupMedia = getGroupMedia(medium.groupID);
	if (groupMedia.length==0) groupMedia[0] = medium;
	for (var i=0; i<groupMedia.length; i++) {
		for (var j=0; j<groupMedia[i].languages.length; j++) {
			if (language == groupMedia[i].languages[j]) { return true; }
		}
	}
	return false;
}


// ---------------------------------------------------------------------------
//  search component functions
// ---------------------------------------------------------------------------

/**
 * Function is called on first page opening and calls search function
 * depending on if theres a 'bu' parameter to set media search criteria businessunit.
 */
function urlSearch() {
	var params = document.URL.split("?")[1];
  if (params) {
		var bu = params.split("&")[0].split("bu=")[1];
		if (bu) {
			for (var i=0; i<businessunits.length; i++) {
				if (businessunits[i].paramID == bu.toLowerCase()) {
					search(0, 0, businessunits[i].shortname);
					return;
				}
			}
		}
	}
	search(0);
}

/**
 * Reads parameters of search form and resets selected values depending on search mode.
 *
 * @param	starter 	number of first searchresult item to show (pager) 
 * @param	mode			n/a = navigate through hits pages (pager usage)
 *									0 = search for mediatype, businessunit, language
 *									1 = search for ordernumber/term
 */
function search(starter, mode, buParam) {
	var searchForm = document.forms["searchForm"];
	if (buParam) {
		queryBusinessunit=buParam;
		if (searchForm) searchForm.elements["businessunit"].value=buParam;
	}
	else if (searchForm) {
		queryMediatype		= searchForm.elements["mediatype"].value;
		queryBusinessunit	= searchForm.elements["businessunit"].value;
		queryLanguage			= searchForm.elements["language"].value;
		queryOrdernumber	= searchForm.elements["number"].value;
    if (mode==0) {
			//searching for selectables, so reset ordernumber/term
			queryOrdernumber = '';	searchForm.elements["number"].value='';
		}
		else if (mode==1) {
			//searching for ordernumber, so reset selectables
			queryMediatype		= '';	searchForm.elements["mediatype"].value='0';
			queryBusinessunit	= '';	searchForm.elements["businessunit"].value='0';
			queryLanguage			= '';	searchForm.elements["language"].value='0';
      queryOrdernumber  = queryOrdernumber.replace(/\s+/g, ""); //remove whitespaces
		}
	}
  displayProductList(starter);
}

/**
 * Finds searchresult items by specified search form parameter values.
 * Returns HTML code displaying search result items by pager.
 *
 * @param starter - number of first searchresult item to show (pager)
 * @return String - HTML code 
 */
function displayProductList(starter) {
	var result = getProductHTMLSnippets(locale);
  result.sort(sortBySortorder);
	//countResult = result.length;
	var endValue = Math.min((starter+pagingIncrement), result.length);
	
  var searchResultItems = "";
	for (var i=starter; i<endValue; i++) {
		searchResultItems = searchResultItems + result[i].htmlSnippet;
	}
  
  var innerHTML = "";
	if (result.length>0) {
		innerHTML = innerHTML + generateShopcartInfobar(locale,countProducts());
		innerHTML = innerHTML + generatePager(locale, starter, pagingIncrement, result.length);
		innerHTML = innerHTML + searchResultItems;
		innerHTML = innerHTML + generatePager(locale, starter, pagingIncrement, result.length);
		if (countProducts()>0) {
			innerHTML = innerHTML + generateShopcartLinkbar(locale);
		}
	} else {
		innerHTML = innerHTML + generateEmptySearchResult(locale);
	}
	
	var inputForm		= generateSearchInputForm(locale,queryMediatype, queryBusinessunit, queryLanguage, queryOrdernumber);
	var outputForm	= generateGeneralOutputForm(locale,innerHTML);
	
	insertForm(inputHTML, inputForm);
	insertForm(outputHTML, outputForm);
}

// Ermittlung der Suchergebnisse nach Medientyp, Geschaeftsbereich & Sprache
function getProductHTMLSnippets(locale) {
	var count = 0;
	var groupID = "0";
	var color = COLOR_NORMAL;
	var resultHTML = new Array();
	
  for (var i=0; i<media.length; i++) {
    var medium = media[i];
    var match = found(medium);
    if (match && (groupID!=medium.groupID || !groupID)) {
			groupID = medium.groupID;
      if (!groupID) {
				resultHTML[count] = new HtmlMedium(medium, generateMediumSearchInfo(locale, medium, color)); //HTMLGenerator
			} else {
        if (medium.printnorm == queryOrdernumber) {
					mgl = medium; //if ordernumber is directly searched display medium with this number...
				} else {
					mgl = getMediumOfGroupByLocale(groupID,locale); //else display locale depending medium in group
				}
				resultHTML[count] = new HtmlMedium(mgl, generateMediumSearchInfo(locale, mgl, color));
			}
			count++;
		}
	}
  
  return resultHTML;
}

function found(medium) {
	var isFound = false;
	if (queryMediatype=="0" && queryBusinessunit=="0" && queryLanguage=="0" && !queryOrdernumber) {
		isFound = true;
	} else if (queryOrdernumber) {
    if (queryOrdernumber==medium.printnorm) {
			return true;
		} else {
			for (var i=0; i<medium.oldPrintnorms.length; i++) {
        if (queryOrdernumber==medium.oldPrintnorms[i]) { return true; }
			}
			var smallTerm		= queryOrdernumber.toLowerCase();
			var smallTitle	= medium.title.toLowerCase();
			var smallDescr	= medium.description.toLowerCase();
			var smallSpec		= medium.specification.toLowerCase();
			var smallTitleEn	= medium.titleEn.toLowerCase();
			var smallDescrEn	= medium.descriptionEn.toLowerCase();
			var smallSpecEn		= medium.specificationEn.toLowerCase();
			if (
					smallTitle.indexOf(smallTerm)!==-1		||
					smallDescr.indexOf(smallTerm)!==-1		||
					smallSpec.indexOf(smallTerm)!==-1		||
					smallTitleEn.indexOf(smallTerm)!==-1	||
					smallDescrEn.indexOf(smallTerm)!==-1	||
					smallSpecEn.indexOf(smallTerm)!==-1
				)
				return true;
		}
		queryMediatype		= "0";
		queryBusinessunit	= "0";
		queryLanguage		= "0";
		return false;
	}
	else {
		mt = isMediatypeFound(queryMediatype, medium.mediatype);
		bu = queryBusinessunit==medium.businessunit;
		lg = existsMediumInLanguage(medium,queryLanguage);
		
		if (queryMediatype=="0" && queryBusinessunit=="0")		{	isFound = lg; }
		else if (queryMediatype=="0" && queryLanguage=="0")     {	isFound = bu; }
		else if (queryBusinessunit=="0" && queryLanguage=="0")	{	isFound = mt; }
		
		else if (queryMediatype=="0")     { isFound = bu && lg; }
		else if (queryBusinessunit=="0")  { isFound = mt && lg; }
		else if (queryLanguage=="0")	  { isFound = mt && bu; }
		
		else { isFound = mt && bu && lg; }
	}
	return isFound;
}

/**
 * Returns true if the request media type equals the medium media type.
 * Intend to be called by isFound() method only.
 *
 * Handels special case for "Leaflet+DVD".
 *
 * @param requestedMediatype the requested media type
 * @param mediumMediatype the medium media type
 * @return boolean
 */
function isMediatypeFound(requestedMediatype, mediumMediatype) {
  var isFound = (requestedMediatype == mediumMediatype);
  if (!isFound) {
    if ((requestedMediatype=="MEDIATYPE.LEAFLET") && (mediumMediatype=="MEDIATYPE.LEAFLET_DVD")) {
      // Special case for "Leaflet+DVD" -> they will be found also for "Leaflet" mediatype.
      isFound = true;
    }
  }
  return isFound;
}

// ---------------------------------------------------------------------------
//  shopcart component functions
// ---------------------------------------------------------------------------

// Suchergebnisse Warenkorb
function displayShopcart() {
	var inputForm = generateShopcartInputForm(locale);
	
	var result = getShopcartHTMLSnippets(locale);
	countResult = result.length;
	
	var shopcartItems = "";
	for (var i=0; i<result.length; i++) {
		shopcartItems = shopcartItems + result[i];
	}
	
	var innerHTML = "";
	innerHTML = innerHTML + generateNavigationBar(locale);
	innerHTML = innerHTML + shopcartItems;
	innerHTML = innerHTML + generateNavigationBar(locale);
	innerHTML = innerHTML + generateOrderLinkbar(locale);
	
	var outputForm = generateGeneralOutputForm(locale,innerHTML);
	
	insertForm(inputHTML, inputForm);
	insertForm(outputHTML, outputForm);
}

// Ermittlung der Suchergebnisse fuer den Warenkorb
function getShopcartHTMLSnippets(locale) {
	var count = 0;
	var items = getShopcartItems();
	var color = COLOR_NORMAL;
	var resultHTML = new Array();
	for (var i=0; i<media.length; i++) {
		for (j=0; j<items.length; j++) {
			if (media[i].mediumID == items[j][0]) {
				resultHTML[count] = generateMediumShopcartInfo(locale, media[i], items[j][1], color); //HTMLGenerator
				count++;
			}
		}
	}
	return resultHTML;
}

function addShopcartItem(mediumID, amount) {
	setCookie(cookieName+"#"+mediumID, amount, "", "", "", "");
	search(0);
}

function changeShopcartItem(mediumID, amount) {
	setCookie(cookieName+"#"+mediumID, amount, "", "", "", "");
}

function removeShopcartItem(mediumID) {
	deleteCookie(cookieName+"#"+mediumID, "", "");
	if (document.cookie.indexOf(cookieName) == -1) { search(0); }
	else { displayShopcart(); }
}

function removeProducts() {
	var items = getShopcartItems();
  for (var i=0; i<items.length; i++) {
    deleteCookie(cookieName+"#"+items[i][0], "", "");
	}
	search(0);
}

function containsShopcartItem(mediumID) {
	return getCookie(cookieName+"#"+mediumID)!==null;
}

function getShopcartItemAmount(mediumID) {
	if (!containsShopcartItem(mediumID)) { return 0; }
	else { return getCookie(cookieName+"#"+mediumID); }
}

function getShopcartItems() {
	var result = new Array();
	var cookies = document.cookie.split(';');
	for (var i=0; i<cookies.length; i++) {
		if (cookies[i].indexOf(cookieName) != -1) {
			result[i] = new Array();
			result[i][0] = cookies[i].substring(cookies[i].indexOf('#')+1,cookies[i].indexOf('='));
			result[i][1] = cookies[i].substring(cookies[i].indexOf('=')+1,cookies[i].length);
		}
	}
	return result;
}

function countProducts() {
	var count = 0;
	var cookies = document.cookie.split(';');
	for (var i=0; i<cookies.length; i++) {
		if (cookies[i].indexOf(cookieName) != -1) { count++; }
	}
	return count;
}

// ---------------------------------------------------------------------------
//  order component functions
// ---------------------------------------------------------------------------

function displayOrder() {
	var count = 0;
	var items = getShopcartItems();
	var shopcartMedia = new Array();
	for (var i=0; i<media.length; i++) {
		for (var j=0; j<items.length; j++) {
			if (media[i].mediumID == items[j][0]) {
				shopcartMedia[count] = new ShopcartMedium(media[i],items[j][1]);
				count++;
			}
		}
	}

	var inputForm = generateOrderInputForm(locale);
	
	var innerHTML = "";
	innerHTML = innerHTML + generateOrderNavigationBar(locale);
	innerHTML = innerHTML + generateOrderOutputForm(locale,shopcartMedia);
	innerHTML = innerHTML + generateOrderNavigationBar(locale);
	
	var outputForm = generateGeneralOutputForm(locale,innerHTML);
	
	insertForm(inputHTML, inputForm);
	insertForm(outputHTML, outputForm);
}

// Bestellung abschicken
function submitForm(formName) {
	var f = document.forms[formName];
	//f.action = HOST + "scripts/mailing.asp";
	f.action = mailingAspScript;
	f.method = "post";
	replaceChars(f);
	if (checkFormular(f)) {
		window.open(HOST + "logic/confirmOrder.html#"+locale,"popup","width=400,height=270,resizable=no,scrollbars=no,toolbar=no,status=no;");
		f.submit();
		removeProducts();
		window.location.href = "broschrenundmedien.asp";
	}
}

// Plausibilitaetspruefung Bestellformular
function checkFormular(f) {
	if (!isFilledIn (f, "lastname",  resources[locale]["error.order.lastname"])) return false;
	if (!isFilledIn (f, "street",    resources[locale]["error.order.street"]))   return false;
	if (!isFilledIn (f, "zipcode",   resources[locale]["error.order.zip"]))      return false;
	if (!isFilledIn (f, "city",      resources[locale]["error.order.city"]))     return false;
	if (!isFilledIn (f, "phone",     resources[locale]["error.order.phone"]))    return false;
	if (!isFilledIn (f, "email",     resources[locale]["error.order.email"]))    return false;
	if (f["email"].value.indexOf('@') == -1) {
		alert(resources[locale]["error.order.email2"]);
		f["email"].focus();
		return false;
	}
	return true;
}

// Hilfsroutine zur Kontrolle der Eingabefelder im Bestellformular
function isFilledIn (f, formfield, message) {
	if (f[formfield].value) return true;
	alert(message);
	f[formfield].focus();
	return false;
}

//replaces all ';' in form parameters values
function replaceChars(f) {
	f["lastname"].value		= f["lastname"].value.replace(/;/gi,"");
	f["firstname"].value	= f["firstname"].value.replace(/;/gi,"");
	f["company"].value		= f["company"].value.replace(/;/gi,"");
	f["street"].value		= f["street"].value.replace(/;/gi,"");
	f["zipcode"].value		= f["zipcode"].value.replace(/;/gi,"");
	f["country"].value		= f["country"].value.replace(/;/gi,"");
	f["phone"].value		= f["phone"].value.replace(/;/gi,"");
	f["email"].value		= f["email"].value.replace(/;/gi,"");
}

function sortBySortorder(medium1, medium2) {
  var result;
  
  if(!medium1.medium.sortorder && !medium2.medium.sortorder) {
    // both media have no sortorder, sort by printnorm
    result = (medium1.medium.printnorm < medium2.medium.printnorm) - (medium2.medium.printnorm < medium1.medium.printnorm);
  } else if(medium1.medium.sortorder && !medium2.medium.sortorder) {
    // one medium has a sortorder and the other not, the one with sortorder is always greater
    result = -1;
  } else if(!medium1.medium.sortorder && medium2.medium.sortorder) {
    result = 1
  } else if(medium1.medium.sortorder && medium2.medium.sortorder) {
    // both media have sortorder, sort by it if it is the same sort by printnorm
    if(medium1.medium.sortorder === medium2.medium.sortorder) {
      result = (medium1.medium.printnorm < medium2.medium.printnorm) - (medium2.medium.printnorm < medium1.medium.printnorm);
    } else {
      result = medium1.medium.sortorder - medium2.medium.sortorder;
    }
  }
  
  return result;
}
