/* Common Javascript used throughout system */
/* ======================================== */

/*Browser detection: http://www.quirksmode.org/js/detect.html dated Feb. 2009*/

/* Usage: BrowserDetect.browser, BrowserDetect.version, rowserDetect.OS */

var BrowserDetect = {
	init: function () {
		this.browser = this.searchString(this.dataBrowser) || "An unknown browser";
		this.version = this.searchVersion(navigator.userAgent)
			|| this.searchVersion(navigator.appVersion)
			|| "an unknown version";
		this.OS = this.searchString(this.dataOS) || "an unknown OS";
	},
	searchString: function (data) {
		for (var i=0;i<data.length;i++)	{
			var dataString = data[i].string;
			var dataProp = data[i].prop;
			this.versionSearchString = data[i].versionSearch || data[i].identity;
			if (dataString) {
				if (dataString.indexOf(data[i].subString) != -1)
					return data[i].identity;
			}
			else if (dataProp)
				return data[i].identity;
		}
	},
	searchVersion: function (dataString) {
		var index = dataString.indexOf(this.versionSearchString);
		if (index == -1) return;
		return parseFloat(dataString.substring(index+this.versionSearchString.length+1));
	},
	dataBrowser: [
		{
			string: navigator.userAgent,
			subString: "Chrome",
			identity: "Chrome"
		},
		{ 	string: navigator.userAgent,
			subString: "OmniWeb",
			versionSearch: "OmniWeb/",
			identity: "OmniWeb"
		},
		{
			string: navigator.vendor,
			subString: "Apple",
			identity: "Safari",
			versionSearch: "Version"
		},
		{
			prop: window.opera,
			identity: "Opera"
		},
		{
			string: navigator.vendor,
			subString: "iCab",
			identity: "iCab"
		},
		{
			string: navigator.vendor,
			subString: "KDE",
			identity: "Konqueror"
		},
		{
			string: navigator.userAgent,
			subString: "Firefox",
			identity: "Firefox"
		},
		{
			string: navigator.vendor,
			subString: "Camino",
			identity: "Camino"
		},
		{		// for newer Netscapes (6+)
			string: navigator.userAgent,
			subString: "Netscape",
			identity: "Netscape"
		},
		{
			string: navigator.userAgent,
			subString: "MSIE",
			identity: "Explorer",
			versionSearch: "MSIE"
		},
		{
			string: navigator.userAgent,
			subString: "Gecko",
			identity: "Mozilla",
			versionSearch: "rv"
		},
		{ 		// for older Netscapes (4-)
			string: navigator.userAgent,
			subString: "Mozilla",
			identity: "Netscape",
			versionSearch: "Mozilla"
		}
	],
	dataOS : [
		{
			string: navigator.platform,
			subString: "Win",
			identity: "Windows"
		},
		{
			string: navigator.platform,
			subString: "Mac",
			identity: "Mac"
		},
		{
			   string: navigator.userAgent,
			   subString: "iPhone",
			   identity: "iPhone/iPod"
	    },
		{
			string: navigator.platform,
			subString: "Linux",
			identity: "Linux"
		}
	]

};
BrowserDetect.init();



userAgent = window.navigator.userAgent; 
browserVers = parseInt(userAgent.charAt(userAgent.indexOf("/")+1),10);
CSIsW3CDOM = ((document.getElementById) && !(IsIE()&&browserVers<6)) ? true : false;

var gcMaxPollResponses = 8;

function PreloadNavImages() {

// onload action for 2009 new-look pages

	var aI;
	for (aI=0; aI<7; aI++) {
		MM_preloadImages("../nav/nav_0" + (aI+1) + "-on.gif");
	}	
	for (aI=1; aI<8; aI++) {
		MM_preloadImages("../nav/tnav-on_0" + (aI+1) + ".gif");
	}
}

function IsIE() { return userAgent.indexOf("MSIE") > 0;}

function IsWin() { return (typeof(navigator.platform) != "undefined"  &&  navigator.platform.substr(0,3)=="Win");}

function CSIEStyl(s) { return document.all.tags("div")[s].style; }

function CSNSStyl(s) { if (CSIsW3CDOM) return document.getElementById(s).style; else return findElement(s,0);  }

mustInitImg = true;

function initImgID() {
	di = document.images; 
	if (mustInitImg && di) { 
		for (var i=0; i<di.length; i++) { 
			if (!di[i].id) di[i].id=di[i].name; 
		} 
	mustInitImg = false;
	}
}

function findElement(n,ly) {
	d = document;
	if (browserVers < 4) return d[n];
	if ((browserVers >= 6) && (d.getElementById)) {initImgID; return(d.getElementById(n))}; 
	var cd = ly ? ly.document : d;
	var elem = cd[n];
	if (!elem) {
		for (var i=0;i<cd.layers.length;i++) {
			elem = findElement(n,cd.layers[i]);
			if (elem) return elem;
		}
	}
	return elem;
}

function changeImages() {
	d = document;
	if (d.images) {
		var img;
		for (var i=0; i<changeImages.arguments.length; i+=2) {
			img = null;
			if (d.layers) {img = findElement(changeImages.arguments[i],0);}
			else {img = d.images[changeImages.arguments[i]];}
			if (img) {img.src = changeImages.arguments[i+1];}
		}
	}
}

function maillink(aUser,aDomain) {
	location = "mailto:" + aUser + "@" + aDomain;
}

function EF(pE, pF) {

// English or French version

	if (gLanguage=="E") return pE;
	else return (pF == "*F") ? "*F " + pE : pF;
}

function trim(field) {
	//trims leading and trailing spaces
	var i=0,j=field.length;
	while(field.charAt(i)==' ' && i<j) i++;
	while(field.charAt(j-1)==' ' && j>i) j--;
	return field.substring(i,j);
	}

function showPollPreview() {
	var url = "surveypreview.asp?id=" + document.frmEdit.ID.value;
	window.open(url,"preview",
		 "width=220,height=600,left=0,screenX=0,top=40,screenY=40,"
		 + "resizable=1,toolbar=0,scrollbars=1,menubar=0,status=0");
}
function validatePollData(pForm) {
	var formname = "PollForm";
	var reqdfields = new Array("PollQuestionE","Answer1E","Answer2E","PollQuestionF","Answer1F","Answer2F");
	var reqdfieldtexts = new Array("English Question","English Answer#1","English Answer#2","French Question","French Answer#1","French Answer#2");

	var f,fval,r,thisradio,radioset,isError,fielderrmess="",radioerrmess="",matcherrmess="";

	//check required text fields
	for (f=0; f<reqdfields.length;f++) {
		fval = eval("document." + formname + "." + reqdfields[f] + ".value");
		if (trim(fval) == "") {
			fielderrmess += reqdfieldtexts[f] + "; ";
		}
	}
	if (fielderrmess != "") fielderrmess = "You must fill in these fields:\n" + fielderrmess + "\n";

/*
	//check required radio fields
	for (f=0; f<reqdradios.length;f++) {
		thisradio = eval("document." + formname + "." + reqdradios[f]);
		radioset = false;
		for (r=0;r<thisradio.length;r++) {
			if (thisradio[r].checked) radioset = true;
		}
		if (!radioset) radioerrmess += reqdradiotexts[f] + "; ";
	}
	if (radioerrmess != "") radioerrmess = "You must make a selection in these fields:\n" + radioerrmess + "\n";
*/
	
	//check matching English and French answers
	for (f=0;f<gcMaxPollResponses;f++) { //
		fvalE = eval("document." + formname + ".Answer" + (f+1) + "E.value");
		fvalF = eval("document." + formname + ".Answer" + (f+1) + "F.value");
		if (  ( trim(fvalE) == "" )  !=  ( trim(fvalF) == "" ) ) {
			matcherrmess = matcherrmess + "#" + (f+1) + "; ";
		}
	}
	if (matcherrmess != "") matcherrmess = "There isn't an answer for both languages in Answer " + matcherrmess + "\n";
	
	isError = (fielderrmess != "" || radioerrmess != "" || matcherrmess != "");		
	if (isError) alert(fielderrmess + radioerrmess + matcherrmess + "Please correct and then click \"Submit\" again.\n");
	return !isError;
}
	

// CROSS-BROWSER ROUTINES TO DEAL WITH KEYBOARD INPUT
// In IE on Windows, uses default Tab action and converts Enter to Tab except in Textareas and Submits
// On other browsers/platforms, traps Tab and Enter, and uses nextFocus routine to advance
// the focus to the next focusable field in tabindex order.
// Function firstFocus sets focus to focusable field with lowest positive tabindex.

function keyCode(pEvent) {

// cross-browser keycode for keyboard event

   if (IsIE()) return event.keyCode;
   var aKeyCode = pEvent.keyCode;
   if (aKeyCode == 0) aKeyCode = pEvent.which;	//Mozilla
   return aKeyCode;
}
	
function keyTarget(pEvent) {

// cross-browser target of keyboard event

   return IsIE() ? event.srcElement : pEvent.target;
}

function tabIndex(pElement) {

// Return signed tabIndex (Safari forces tabIndex to be positive)

	return (pElement.tabIndex < 16384) ? pElement.tabIndex : pElement.tabIndex - 32768;
}

function IsFocusable(pElement) {

// Returns true if pElement is a form element that can be given the focus and is not disabled or readonly

   if (pElement.disabled || pElement.readOnly) return false;
   var aType = pElement.type;
   return (aType == "text" ||  aType == "textarea" || aType == "password" 
      || aType == "submit" ||  aType.substr(0,6) == "select");
}

function trapEnter(pEvent) {

// onkeydown="return trapEnter(event);" convert enter to tab in IE Windows; call nextFocus on tab,enter in IE Mac

   return IEtrapEnter();
}

function IEtrapEnter() {

// onkeydown="return IEtrapEnter();" convert enter to tab in IE Windows; call nextFocus on tab,enter in IE Mac

   if (IsIE()) {
      var aTarget = event.srcElement;
      if (IsWin()) {
         if (event.keyCode == 13  &&  aTarget.type != "textarea"  &&  aTarget.type != "submit") event.keyCode = 9;
         return true;
      } else {
         if ( event.keyCode == 9  ||  (event.keyCode == 13  &&  aTarget.type != "textarea"  &&  aTarget.type != "submit") ) {
            nextFocus(aTarget);
            return false;
         }
      }
   }
   return true;
}

function trapTabEnter(pEvent) {

// onkeydown="return trapTabEnter(pEvent);" convert enter to tab in IE Windows; call nextFocus on tab,enter for other browsers; 
// if neither tab or enter, return keycode (treated as true)

   var aKeyCode = keyCode(pEvent);
   var aTarget = keyTarget(pEvent);
   if (aKeyCode == 9  ||  (aKeyCode == 13  &&  aTarget.type != "textarea"  &&  aTarget.type != "submit") ) {
      if (IsIE()  &&  IsWin()) {
         event.keyCode = 9; 
         return true;
      }
      nextFocus(aTarget);
      return false;
   }
   return aKeyCode;
}

// Checks for valid data entry

function trapInvalid(pEvent,pValidChars) {

// cross-browser; traps tab/enter moving focus, traps and suppresses invalid char

   var aResult = trapTabEnter(pEvent);
   switch (aResult) {
      case true:
         return aResult;
      case false:
         return aResult;
      default:
         return (pValidChars.indexOf(String.fromCharCode(aResult)) >= 0);
   }
}

function trapInvalidCurrency(pEvent) {

   return trapInvalid(pEvent,"0123456789,-");
}

function trapInvalidDigit(pEvent) {

   return trapInvalid(pEvent,"0123456789");
}

function trapInvalidInteger(pEvent) {

   return trapInvalid(pEvent,"0123456789,");
}

function trapInvalidDecimal(pEvent) {

   return trapInvalid(pEvent,"0123456789.,-");
}

function trapInvalidUserChar(pEvent) {

   return trapInvalid(pEvent,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-");
}

function trapInvalidPWChar(pEvent) {

   return trapInvalid(pEvent,"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789-#&?!@$%");
}

function firstFocus() {

// Move focus to focusable field of form with smallest positive tabIndex

   var form0 = document.frmEdit;
   if (!form0) {
//      alert("No form called frmEdit on page");
      return;
   }

   var numElements = form0.elements.length;
   if (numElements == 0) return;

   var elTabIndexSmallest;
   var tabIndexSmallest=99999;
   
   for (var i = 0; i<numElements; i++) {

      var elCur = form0.elements[i];

      if (IsFocusable(elCur)) {
         var tabIndexCur = tabIndex(elCur);
         if (tabIndexCur > 0  &&  tabIndexCur < tabIndexSmallest) {
            elTabIndexSmallest = elCur;
            tabIndexSmallest = tabIndexCur;
            //alert("Smallest tabindex is " + tabIndexCur + " for " + elCur.name);
         }
      }
   }
   if(tabIndexSmallest<99999) {
      elTabIndexSmallest.focus();
      elTabIndexSmallest.select();
   }
}

function nextFocus(pElement) {

// Move focus to later focusable field of form with tabIndex same as this;
// or to first tabindex next larger than this, or to field with smallest positive tabIndex

   var form0 = document.frmEdit;
   if (!form0) {
      alert("No form called frmEdit on page");
      return;
   }
   var numElements = form0.elements.length;
   if (numElements == 0) return;

   var elTabIndexSmallest,elTabIndexNextLarger;
   var tabIndexSmallest=99999,tabIndexNextLarger=99999;
   
   var tabIndexBase = tabIndex(pElement);
   var aBaseElFound = false;
   var elNext=pElement;
   
   for (var i=0; i<numElements; i++) {

      var elCur = form0.elements[i];

      if (elCur===pElement) {
         aBaseElFound = true;
         for (var j=0; j<numElements; j++) {
            elNext = form0.elements[(i+j+1)%numElements];
            if (IsFocusable(elNext)) break;
         }
         continue;
      }
      
      if (IsFocusable(elCur)) {
         var tabIndexCur = tabIndex(elCur);
         if ( (tabIndexCur > tabIndexBase || (aBaseElFound  &&  tabIndexCur == tabIndexBase) )    &&  tabIndexCur < tabIndexNextLarger) {
            elTabIndexNextLarger = elCur;
            tabIndexNextLarger = tabIndexCur;
         }
         if (tabIndexCur > 0  &&  tabIndexCur < tabIndexSmallest) {
            elTabIndexSmallest = elCur;
            tabIndexSmallest = tabIndexCur;
         }
      }
   }
   elTarget = elNext;
   if (tabIndexBase > 0) {
      if (tabIndexNextLarger<99999) elTarget = elTabIndexNextLarger;
      else if (tabIndexSmallest<99999) elTarget = elTabIndexSmallest;
   }
   elTarget.focus();
   elTarget.select();
}

function sFormatDate(pDate) {

// Formats a date in standard dd mon yyyy format

	if(!pDate || pDate == "") return String(pDate);
	if(isNaN(pDate)) return String(pDate);

	var aMonths = (gLanguage == "F") ? 
	   new Array("janv","fév","mars","avr","mai","juin","juil","aožt","sept","oct","nov","déc")
	   : new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec");
	
	return pDate.getDate() + " " + aMonths[pDate.getMonth()] + " " + pDate.getFullYear();
	
}

function surveyTypeAction(pRadio) {

// sets default responses for member surveys based on Survey Type selection (survey.edit.asp)

	if (pRadio.value == 'Home page') {
		for (aI=1; aI<=gcMaxPollResponses; aI++) {
			document.frmEdit.elements["PollResponseAnswerE@" + aI].value = "";
			document.frmEdit.elements["PollResponseAnswerF@" + aI].value = "";
		}
	} else {
		document.frmEdit.elements["PollResponseAnswerE@1"].value = "Yes";
		document.frmEdit.elements["PollResponseAnswerF@1"].value = "Oui";
		document.frmEdit.elements["PollResponseAnswerE@2"].value = "No";
		document.frmEdit.elements["PollResponseAnswerF@2"].value = "Non";
		for (aI=3; aI<=gcMaxPollResponses; aI++) {
			document.frmEdit.elements["PollResponseAnswerE@" + aI].value = "--Not available--";
			document.frmEdit.elements["PollResponseAnswerF@" + aI].value = "--Pas disponsible--";
		}
	}
}

function showZoomHelp() {

   var aHelpPage = "zoomhelp.asp?a=" + encodeURIComponent(BrowserDetect.browser) 
   	+ "&v=" + encodeURIComponent(BrowserDetect.version) 
   	+ "&os=" + encodeURIComponent(BrowserDetect.OS);
   	
   var aX = 300, aY = 200, aW = 500, aH = 400;
   
   var aOptions = "resizable=yes, toolbar=no, menubar=no, status=no, "
   
   var zoomWindow = window.open(aHelpPage, "ZoomHelp", 
   	aOptions + "left=" + aX + ", screenX=" + aX + ", top=" + aY + ", screenY=" + aY + ", width=" + aW +', height=' + aH);
   	
   if (window.focus) zoomWindow.focus();

}

