String.prototype.endsWith = function(str) {return (this.match(str+"$")==str)}

var historicCsvWindow = null;
var maxShareClassSelectionNumber=5;
var maxYearsSelectionNumber=1;

var days_en_GB = ['Su', 'Mo', 'Tu', 'We', 'Th', 'Fr', 'Sa'];
var days_es_ES = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sa'];
var days_fr_FR = ['Di', 'Lu', 'Ma', 'Me', 'Je', 'Ve', 'Sa'];
var days_de_DE = ['So', 'Mo', 'Di', 'Mi', 'Do', 'Fr', 'Sa'];
var days_it_IT = ['Do', 'Lu', 'Ma', 'Me', 'Gi', 'Ve', 'Sa'];
var months_en_GB = ['January', 'February', 'March', 'April', 'May', 'June', 'July','August','September','October','November','December'];
var months_es_ES = ['Enero', 'Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio','Agosto','Septiembre','Octubre','Noviembre','Diciembre'];
var months_fr_FR = ['Janvier', 'Fevrier', 'Mars', 'Avril', 'Mai', 'Juin', 'Juillet','Aout','Septembre','Octobre','Novembre','Decembre'];
var months_de_DE = ['Januar', 'Februar', 'M&auml;rz', 'April', 'Mai', 'Juni', 'Juli','August','September','Oktober','November','Dezember'];
var months_it_IT = ['Gennaio', 'Febbraio', 'Marzo', 'Aprile', 'Maggio', 'Giugno', 'Luglio','Agosto','Settembre','Ottobre','Novembre','Dicembre'];
var textBundles = new Object();

//Text bundles for internationalisation
//English
var text_en_GB=new Object();
text_en_GB.alertselectashareclass="Please select a share class";
text_en_GB.alertmaximumselection="Please select a maximum of "+maxShareClassSelectionNumber+" share classes";
text_en_GB.alertmaximumdaterange="Please select a date range of less than "+maxYearsSelectionNumber+" years";
text_en_GB.labelfromDate="From&nbsp;date (dd/mm/yyyy)";
text_en_GB.labeltoDate="To&nbsp;date (dd/mm/yyyy)";
text_en_GB.dateFormatMessage="Date format (dd/mm/yyyy)";
text_en_GB.labellastXmonths="Or select the previous";
text_en_GB.labelmonth="month";
text_en_GB.labelmonths="months";
text_en_GB.labelcancel="Cancel";
text_en_GB.labelclose="Close";
text_en_GB.labelsearching="Searching";
text_en_GB.labelSearch="Search";
text_en_GB.maxDateRangeMessage1="Please note:";
text_en_GB.maxDateRangeMessage2="Searching for a date range that is greater than 365 days will only allow the retrieval of data within a CSV file, and will not produce results in a web page format.";
text_en_GB.minDateMessage="Please select a date after ";
text_en_GB.fromDateAfterToDateError="From date must be before the to date";
text_en_GB.dateCannotBeInFuture="Date cannot be in the future";
text_en_GB.invalidDate="Invalid date";
textBundles["en_GB"]=text_en_GB;
//Spanish
var text_es_ES=new Object();
text_es_ES.alertselectashareclass="Seleccione una clase de acci&oacute;n"; 
text_es_ES.alertmaximumselection="Seleccione un m&aacute;ximo de "+maxShareClassSelectionNumber+" clases de acci&oacute;n";
text_es_ES.alertmaximumdaterange="Seleccione un periodo inferior a "+maxYearsSelectionNumber+" a&ntilde;os";
text_es_ES.labelfromDate="Desde&nbsp;la&nbsp;fecha (dd/mm/aaaa)";
text_es_ES.labeltoDate="Hasta&nbsp;la&nbsp;fecha (dd/mm/aaaa)";
text_es_ES.dateFormatMessage="Formato de fecha(dd/mm/aaaa)";
text_es_ES.labellastXmonths="O seleccione el anterior";
text_es_ES.labelmonth="Mes";
text_es_ES.labelmonths="Meses";
text_es_ES.labelcancel="Cancelar";
text_es_ES.labelclose="Cerrar";
text_es_ES.labelsearching="Buscando ";
text_es_ES.labelSearch="B\u00FAsqueda";
text_es_ES.maxDateRangeMessage1="Nota: ";
text_es_ES.maxDateRangeMessage2="La extracci\u00F3n de informaci\u00F3n de precios superior a un periodo de 365 d\u00EDas no podr\u00E1 ser descargada en un archivo CSV y tampoco pemitir\u00E1 extraer resultados en formato web.";
text_es_ES.minDateMessage="Escoja despues ";
text_es_ES.fromDateAfterToDateError="Desde&nbsp;la&nbsp;fecha > hasta&nbsp;la&nbsp;fecha";
text_es_ES.dateCannotBeInFuture="No puede proporcionarse informaci&oacute;n sobre una fecha en el futuro";
text_es_ES.invalidDate="Fecha inv&aacute;lida";
textBundles["es_ES"]=text_es_ES;
//French
var text_fr_FR=new Object(); 
text_fr_FR.alertselectashareclass="S&eacute;lectionner une cat&eacute;gorie de parts";
text_fr_FR.alertmaximumselection="S&eacute;lectionner "+maxShareClassSelectionNumber+" cat&eacute;gories de parts maximum";
text_fr_FR.alertmaximumdaterange="S&eacute;lectionner une p&eacute;riode de moins de "+maxYearsSelectionNumber+" ans";
text_fr_FR.labelfromDate="A partir de la date&nbsp;(jj/mm/aaaa)";
text_fr_FR.labeltoDate="Jusqu'&agrave; la date&nbsp;(jj/mm/aaaa)";
text_fr_FR.dateFormatMessage="Format de  la date (jj/mm/aaaa)";
text_fr_FR.labellastXmonths="Ou s&eacute;lectionner la page pr&eacute;cedente";
text_fr_FR.labelmonth="Mois";
text_fr_FR.labelmonths="Mois";
text_fr_FR.labelcancel="Annuler";
text_fr_FR.labelclose="Fermer";
text_fr_FR.labelsearching="Chercher";
text_fr_FR.labelSearch="Recherche";
text_fr_FR.maxDateRangeMessage1="Note:";
text_fr_FR.maxDateRangeMessage2="L'extraction d'information sur les prix \u00E9 une date sup\u00E9rieur \u00E9 365 jours ne pourra pas \u00EAtre t\u00E9l\u00E9charg\u00E9s dans un fichier CSV et ne permettra pas \u00E9galement l'extraction des r\u00E9sultats dans un format Web.";
text_fr_FR.minDateMessage="Choisir apres ";
text_fr_FR.fromDateAfterToDateError="A partir de la date > jusqu'&agrave; la date";
text_fr_FR.dateCannotBeInFuture="Date future";
text_fr_FR.invalidDate="Date nulle";
textBundles["fr_FR"]=text_fr_FR;

//German
var text_de_DE=new Object(); 
text_de_DE.alertselectashareclass="W&auml;hlen Sie eine Anteilsklasse aus.";
text_de_DE.alertmaximumselection="W&auml;hlen Sie maximal "+maxShareClassSelectionNumber+" Anteilsklassen aus";
text_de_DE.alertmaximumdaterange="W&auml;hlen Sie einen Zeitraum von weniger als "+maxYearsSelectionNumber+" Jahren";
text_de_DE.labelfromDate="Von Datum&nbsp;(TT/MM/JJJJ)";
text_de_DE.labeltoDate="Bis Datum&nbsp;(TT/MM/JJJJ)";
text_de_DE.dateFormatMessage="Format Datum (TT/MM/JJJJ)";
text_de_DE.labellastXmonths="Oder w&auml;hlen Sie vorhergehende(n)";
text_de_DE.labelmonth="Monat";
text_de_DE.labelmonths="Monate";
text_de_DE.labelcancel="Abbrechen";
text_de_DE.labelclose="Schlie&szlig;en";
text_de_DE.labelsearching="Ihre Anfrage wird bearbeitet";
text_de_DE.labelSearch="Suche";
text_de_DE.maxDateRangeMessage1="Bitte beachten:";
text_de_DE.maxDateRangeMessage2="Wenn Sie nach Daten suchen, die mehr als 365 Tage alt sind, werden diese in eine CSV Datei exportiert und nicht in einem HTML format.";
text_de_DE.minDateMessage="Keine Aufzeichnungen gefunden vor ";
text_de_DE.fromDateAfterToDateError="Von Datum > Bis Datum ";
text_de_DE.dateCannotBeInFuture="Bitte geben Sie einen g&uuml;ltigen Zeitraum ein.";
text_de_DE.invalidDate="Datum inkorrekt";
textBundles["de_DE"]=text_de_DE;
//Italian
var text_it_IT=new Object();
text_it_IT.alertselectashareclass="Seleziona una classe di azioni";
text_it_IT.alertmaximumselection="Seleziona "+maxShareClassSelectionNumber+" classi di azioni al massimo";
text_it_IT.alertmaximumdaterange="Seleziona un intervallo di date inferiore a "+maxYearsSelectionNumber+" anni";
text_it_IT.labelfromDate="Dalla data (gg-mm-aaaa)";
text_it_IT.labeltoDate="Alla data (gg-mm-aaaa)";
text_it_IT.dateFormatMessage="Formato data (gg-mm-aaaa)";
text_it_IT.labellastXmonths="Oppure seleziona il precedente";
text_it_IT.labelmonth="mese";
text_it_IT.labelmonths="mesi";
text_it_IT.labelcancel="Annulla";
text_it_IT.labelclose="Chiudi";
text_it_IT.labelsearching="Ricerca in corso";
text_it_IT.labelSearch="Ricerca";
text_it_IT.maxDateRangeMessage1="Nota:";
text_it_IT.maxDateRangeMessage2="L'estrazione dei dati di una ricerca in un intervallo superiore a 365 giorni sar\u00E0 possibile solo con un file CSV e non produrr\u00E0 risultati nel formato di una pagina Web.";
text_it_IT.minDateMessage="Scegliere dopo ";
text_it_IT.fromDateAfterToDateError="Dalla data > Alla data";
text_it_IT.dateCannotBeInFuture="La data non pu&ograve; essere nel futuro"; 
text_it_IT.invalidDate="Data non valida";
textBundles["it_IT"]=text_it_IT;

//Default calendar, alert, and label text to English
var dayStrings = days_en_GB;
var monthStrings = months_en_GB;
var language = "en_GB";
var currentLanguageText = textBundles["en_GB"];

// Given a language code (en_GB, it_IT, de_DE, fr_FR, es_ES) change some labels and alerts etc
function toggleLanguage(lang){
	currentLanguageText = textBundles[lang];
	$("input#language").val(lang);
	dayStrings = eval("days_"+lang);
	monthStrings = eval("months_"+lang);
	$(".datepicker").datepicker({ 
	    dateFormat: 'dd/mm/yy',
	    beforeShow: function(input, inst)
	    {
	        inst.dpDiv.css({marginTop: -input.offsetHeight + 'px', marginLeft: input.offsetWidth + 'px'});
	    }	    
	});
	$(".datepicker").datepicker('option', 'dayNamesMin', dayStrings);	
	$(".datepicker").datepicker('option', 'monthNames', monthStrings);
	$(".datepicker").datepicker('option', 'closeText', 'X');
	$(".datepicker").datepicker('option', 'showAnim', 'fold');
	$(".datepicker").datepicker('option', 'maxDate', '+0d');
	if(lang=="de_DE"){ // German sites cannot select before 01/01/2010
		$('.datepicker').datepicker('option', 'minDate', new Date(2010, 1 - 1, 1));
	}
	
	$("#fromDateTd").html(currentLanguageText.labelfromDate);
	$("#toDateTd").html(currentLanguageText.labeltoDate);
	$("#orSelectTd").html(currentLanguageText.labellastXmonths);	
	$("label[for='1month']").html("1 "+currentLanguageText.labelmonth);
	$("label[for='3month']").html("3 "+currentLanguageText.labelmonths);
	$("label[for='12month']").html("12 "+currentLanguageText.labelmonths);	
	$("#viewAsWeb").attr("value",currentLanguageText.labelSearch);
	$("#cancelHistory").html(currentLanguageText.labelcancel);
	$("#spinnerText").html(currentLanguageText.labelsearching+"...");
	
	//Fix to not show the maxDateRangeMessage until 2011
	var cutOverDate = parseDate("01/01/2011");
	var dateNow = new Date();
	if(lang=="de_DE" && dateNow<cutOverDate){
		currentLanguageText.maxDateRangeMessage1="";
		currentLanguageText.maxDateRangeMessage2="";
		$("input#12month").hide();
		$("label[for='12month']").hide();
	}	
	$("#maxDateMsg").html("<strong>"+currentLanguageText.maxDateRangeMessage1+"</strong>&nbsp;"+currentLanguageText.maxDateRangeMessage2);
}


function showMessage(message){
	$("p[class='alert']").html(message); $(".alert").corner("round 5px"); $("p[class='alert']").show();
}

function validateDateRange(){
	//build up todays date
	var d=new Date();
	var todayDayStr = ""+d.getDate();
	if (todayDayStr.length==1){todayDayStr="0"+todayDayStr;}
	var todayMonthStr = ""+(d.getMonth()+1);
	if (todayMonthStr.length==1){todayMonthStr="0"+todayMonthStr;}
	var todayYearStr = ""+d.getYear();
	var todayFullDateStr = (todayDayStr+"/"+todayMonthStr+"/"+todayYearStr);
	
	var fromStr = $("#fromDate").val();
	var toStr = $("#toDate").val();
	var minDateStr = null;//There may or may not be a minimum search date set
	try {minDateStr = minimumDate;} catch(e){}
	
	//Default the "to date" to today if it is blank and the "from date" is populated
	if (fromStr!=null && fromStr!='' && (toStr==null || toStr=='') ){
		toStr = todayFullDateStr;
		$("#toDate").val(todayFullDateStr);	
	}
	
	try{
		if( (toStr==undefined && fromStr==undefined) || (toStr=="" && fromStr=="")){
			return true;
		}
		else{
			var fromDate = parseDate(fromStr);
			var toDate = parseDate(toStr);	
			var isAfterMinDate = true;
			
			//Check the strings are length 10 i.e. dd/mm/yyyy
			if(fromStr.length!=10 || toStr.length!=10){
				showMessage(currentLanguageText.dateFormatMessage);
				return false;
			}
			//Check that the dates are valid dates
			if(!isDate(fromStr) || !isDate(toStr)){
				return false;			
			}
			//If there is a min date check that the from date isnt before it
			if(minDateStr!=null && minDateStr!=""){
				var minDate = parseDate(minDateStr);
				if (fromDate<minDate){
					isAfterMinDate=false;
					showMessage(currentLanguageText.minDateMessage+minDateStr);
					return false;
				}
			}
			//Check that the toDate is before the fromdate
			if(toDate<fromDate){
				showMessage(currentLanguageText.fromDateAfterToDateError);
				return false;			
			}
			//Check that the dates arent in the future
			if(toDate>d || fromDate>d){
				showMessage(currentLanguageText.dateCannotBeInFuture);
				return false;			
			}
			//If the dates are ok, and are after the minimum search date, see how far apart the dates are
			//If they are a long way apart (big search range) switch to return the data as csv
			if(isAfterMinDate){	
				var difference = dateDiff(fromDate,toDate);
				if(difference>=(maxYearsSelectionNumber*366)){
					$("input[name*='view']").val("multipleHistoricPricesCsv");
				}
				else{
					$("input[name*='view']").val("multipleHistoricPrices");
				}
				return true;
			}
		}	
	}
	catch(e){
		alert("Error with dates"); return false;
	}
}

function parseDate(str) {
    var ddmmyyyy = str.split('/')
    return new Date(ddmmyyyy[2], ddmmyyyy[1]-1, ddmmyyyy[0]);
}

function dateDiff(first, second) {
    return Math.floor( (second-first)/(1000*60*60*24) );
}

$(document).ready(function(){	

	$("body #selectDateRange").hide();
	$("body #prices-table-container table tr.sub").hide();
	$("input:checkbox").removeAttr('disabled');
	
	//Set the form target to post to getPrices.do and open a new window 
	$("input[name*='view']").val("multipleHistoricPrices");
	$("#priceForm").attr("action","/products/prices/getPrices.do");
	$("#priceForm").attr("method","POST");
	$("#priceForm").attr("target","_blank");
	
	//Onclick event for the Fund rows
	$(".fund").click(function (event) {
		var target = ""+event.target.nodeName;
		if(target && target!="INPUT"){
			$(this).toggleClass("open");
			
			//$("." + $(this).attr("id")).toggle();
			var classname = "." + $(this).attr("id");
			var elem = $(classname)[0];
			if(elem.style.display == 'none')
			     $(classname).show();
			else 
     			     $(classname).hide();                       
		}
	}); 
	
	//Validation to make sure the user picks a share class to download to csv
	$("tr.fund td input.toggleSubCheckBoxes").click(function(event){	
			//event.preventDefault();
			var rowID = $(this).parent().parent().attr("id");
			$("tr.sub."+rowID).show();
			
			if($(this).hasClass("checkedOn")){			
				$("tr.sub."+rowID+" input:checkbox").attr('checked', false);	
				$(this).removeClass("checkedOn");
				$(this).attr('checked', false);
			}
			else{
				$("tr.sub."+rowID+" input:checkbox").attr('checked', true);
				$(this).addClass("checkedOn");
				$(this).attr('checked', true);
			}
	}); 		

	//Onclick even for expand all and collapse all the funds (show and hide share class rows)
	$("body #prices-table-container li.expandall a").click(function(event){
			event.preventDefault();			
			var expandText = "EXPAND ALL";
			var collaspeText = "COLLAPSE ALL";
			if(expandlink && expandlink!=null){
				expandText=expandlink;
			}
			if(collapselink && collapselink!=null){
				collaspeText=collapselink;
			}			
			
			if($(this).text() == expandText){
				$(this).text(collaspeText);
				$(this).parent("li").addClass("closeall");
				$("body #prices-table-container .fund").addClass("open");
				$("body #prices-table-container table tr.sub").show();
			} else {
				$(this).text(expandText);
				$(this).parent("li").removeClass("closeall");
				$("body #prices-table-container .fund").removeClass("open");
				$("body #prices-table-container table tr.sub").hide();
			}

	}); 
	
	//Add the date picker (choose dates for historic prices)
	$(".datepicker").datepicker({ 
	    dateFormat: 'dd/mm/yy',
	    beforeShow: function(input, inst)
	    {
	        inst.dpDiv.css({marginTop: -input.offsetHeight + 'px', marginLeft: input.offsetWidth + 'px'});
	    }
	});
	$(".datepicker").datepicker('option', 'dayNamesMin', dayStrings);	
	$(".datepicker").datepicker('option', 'monthNames', monthStrings);
	$(".datepicker").datepicker('option', 'closeText', 'X');
	$(".datepicker").datepicker('option', 'showAnim', 'fold');
	$(".datepicker").datepicker('option', 'maxDate', '+0d');
	
	//##### TODO 
	$("#toDate").keyup(function(event){
			$(".datepicker").datepicker('hide');			
	}); 	
	$("#fromDate").keyup(function(event){
			$(".datepicker").datepicker('hide');
			
	}); 
	//##########
	
	//Validation to make sure the user picks the correct number of share classes
	$("body #prices-table-container li.historicalprices a").click(function(event){	
			var selectedCount = $("input[name*='isin']:checked").size();
			if (selectedCount==0){
				showMessage(currentLanguageText.alertselectashareclass);
			}
			else if (selectedCount>maxShareClassSelectionNumber){
				showMessage(currentLanguageText.alertmaximumselection);
			}			
			else{				
				event.preventDefault();
				$("p[class='alert']").hide();
				$("body #selectDateRange").show();	
				$("input:checkbox").attr('disabled', true);
			}
			return false;
	}); 
	//Validation to make sure the user picks a share class to download to csv
	$("body #prices-table-container li.exporttoexcel #csvSelected").click(function(event){	
			var selectedCount = $("input[name*='isin']:checked").size();
			if (selectedCount==0){
				showMessage(currentLanguageText.alertselectashareclass);
			}			
			else{				
				event.preventDefault();
				$('#prices-table').table2CSV();
			} return false;
	}); 		
	
	//Action for the cancel link
	$("body #selectDateRange #cancelHistory").click(function(event){
			event.preventDefault();
			$(".datepicker").datepicker('hide');
			$("body #selectDateRange").hide();
			$("input:checkbox").removeAttr('disabled');
			return false;
	}); 		
	
	//Action for the submission of the price form
	//Do an ajax call or just open a new window if a large date range csv (if date range large)
       $('#priceForm').submit(function() {
       	   $(".datepicker").datepicker('hide');
       	   var validationPassed = validateDateRange();
       	   if(validationPassed){
		   var viewName = $("input[name*='view']").val();
		   if(viewName!=null && viewName=="multipleHistoricPricesCsv"){
			var args = getParameters("priceForm");
			var uri = $("#priceForm").attr("action");
			if(confirm(currentLanguageText.maxDateRangeMessage1+" "+currentLanguageText.maxDateRangeMessage2)){
				historicCsvWindow = window.open(uri+args,'','width=350, height=200' );
				$("input:checkbox").removeAttr('disabled');
				$("body #selectDateRange").hide();
			}
			$("input[name*='view']").val("multipleHistoricPrices");
		   }
		   else{
			   $("input:checkbox").removeAttr('disabled');   
			   $("#maxDateMsg").hide();
			   $(".loader").show();
			   $("#paramsTable").hide();
			   doAjaxRequest();
		   }  
	   }
	   return false;
       });

	
	$('#fromCalImg').click(
		function(event) {
			event.preventDefault();
			$("#fromDate").datepicker('show');
			return false;
		}
	);
	
	$('#toCalImg').click(
		function(event) {
			event.preventDefault();
			$("#toDate").datepicker('show');
			return false;
		}
	);			
		
        $("img.ui-datepicker-trigger").attr("alt","dd/mm/yyyy");
        $("img.ui-datepicker-trigger").attr("title","dd/mm/yyyy");
        
        
	//A fix for funds that have the registered trademark symbol in the name
	//Without this the rows will not expand and contract correctly
	$("tr[id*='\u00ae']").each(function(){
		var thisId = $(this).attr('id');
		var newId = thisId.replace('\u00ae','');
		$(this).attr('id',newId );
	     }
	);
	$("tr[class*='\u00ae']").each(function(){
		var thisClass = $(this).attr('class');
		var newClass = thisClass.replace('\u00ae','');
		$(this).addClass(newClass);
	     }
	);    
	
	
        
});

function doAjaxRequest(){
	   var http = getHTTPObject(); 
	   var args = getParameters("priceForm");
	   var uri = $("#priceForm").attr("action");
	   http.open("GET", uri+args, true);    
	   http.onreadystatechange = function() { 
	   		if (http.readyState == 4) { displayResponse(http.responseText); } 
	   		} 
	   http.send("");
}

function displayResponse(responseText){
	$("body #pleaseWait").hide();
	$("#prices-table-container").html(responseText);
	var tabberArgs = {};
	tabberAutomatic(tabberArgs);
	//Fix for moving nav div
        var navDiv = $("div#site-nav");
        if(navDiv!=null){
        	var pos = navDiv.position();
        	if(pos!=null) { 
        		navDiv.css({ position: "absolute",marginLeft: 0, marginTop: 0,top: pos.top, left: pos.left });		
        	} 
        }
	$("#backLink").attr("href","javascript:location.reload(true)");
	try{
	document.getElementById('backLink').href="javascript:location.reload(true)";
	} catch(e){}	
}

function getParameters(formname){
	var queryString="?";
	for(i=0; i<document.forms[formname].elements.length; i++)
	{
		var addParam=true;
		if(document.forms[formname].elements[i].type=="checkbox" && document.forms[formname].elements[i].checked!=true)
		{
			addParam=false;
		}
		if(document.forms[formname].elements[i].type=="radio" && document.forms[formname].elements[i].checked!=true)
		{
			addParam=false;
		}		
		if(document.forms[formname].elements[i].type=="submit"){addParam=false;}		
		if(addParam && document.forms[formname].elements[i].name!=null){
			queryString=queryString+(document.forms[formname].elements[i].name + "=" + document.forms[formname].elements[i].value);
			queryString=queryString+"&";
		}
	}
	if(queryString.endsWith("&")){
		queryString=queryString.substring(0, queryString.length-1);
	}
	if(queryString=="?"){ queryString="";}
	return queryString;
}


var dtCh= "/";
var minYear=1900;
var maxYear=2100;

function isInteger(s){
	var i;
    for (i = 0; i < s.length; i++){   
        // Check that current character is number.
        var c = s.charAt(i);
        if (((c < "0") || (c > "9"))) return false;
    }
    // All characters are numbers.
    return true;
}

function stripCharsInBag(s, bag){
	var i;
    var returnString = "";
    // Search through string's characters one by one.
    // If character is not in bag, append to returnString.
    for (i = 0; i < s.length; i++){   
        var c = s.charAt(i);
        if (bag.indexOf(c) == -1) returnString += c;
    }
    return returnString;
}

function daysInFebruary (year){
	// February has 29 days in any year evenly divisible by four,
    // EXCEPT for centurial years which are not also divisible by 400.
    return (((year % 4 == 0) && ( (!(year % 100 == 0)) || (year % 400 == 0))) ? 29 : 28 );
}
function DaysArray(n) {
	for (var i = 1; i <= n; i++) {
		this[i] = 31
		if (i==4 || i==6 || i==9 || i==11) {this[i] = 30}
		if (i==2) {this[i] = 29}
   } 
   return this
}

function isDate(dtStr){
	var daysInMonth = DaysArray(12)
	var pos1=dtStr.indexOf(dtCh)
	var pos2=dtStr.indexOf(dtCh,pos1+1)
	var strDay=dtStr.substring(0,pos1)
	var strMonth=dtStr.substring(pos1+1,pos2)
	var strYear=dtStr.substring(pos2+1)
	strYr=strYear
	if (strDay.charAt(0)=="0" && strDay.length>1) strDay=strDay.substring(1)
	if (strMonth.charAt(0)=="0" && strMonth.length>1) strMonth=strMonth.substring(1)
	for (var i = 1; i <= 3; i++) {
		if (strYr.charAt(0)=="0" && strYr.length>1) strYr=strYr.substring(1)
	}
	month=parseInt(strMonth)
	day=parseInt(strDay)
	year=parseInt(strYr)
	if (pos1==-1 || pos2==-1){
		showMessage(currentLanguageText.dateFormatMessage); //"The date format should be : dd/mm/yyyy"
		return false
	}
	if (strMonth.length<1 || month<1 || month>12){
		showMessage(currentLanguageText.invalidDate); //"Please enter a valid month")
		return false
	}
	if (strDay.length<1 || day<1 || day>31 || (month==2 && day>daysInFebruary(year)) || day > daysInMonth[month]){
		showMessage(currentLanguageText.invalidDate); //"Please enter a valid day")
		return false
	}
	if (strYear.length != 4 || year==0 || year<minYear || year>maxYear){
		showMessage(currentLanguageText.invalidDate); //"Please enter a valid 4 digit year between "+minYear+" and "+maxYear)
		return false
	}
	if (dtStr.indexOf(dtCh,pos2+1)!=-1 || isInteger(stripCharsInBag(dtStr, dtCh))==false){
		showMessage(currentLanguageText.invalidDate)
		return false
	}
return true
}



function getHTTPObject() {
  var xmlhttp = false;
  /*@cc_on
  @if (@_jscript_version >= 5)
    try {
      xmlhttp = new ActiveXObject("Msxml2.XMLHTTP");
    } catch (e) {
      try {
        xmlhttp = new ActiveXObject("Microsoft.XMLHTTP");
      } catch (e) { xmlhttp = false; }
    }
  @end @*/

  if (!xmlhttp) {
    try {
       xmlhttp = new XMLHttpRequest();      
    } catch (e) {
      try {
        xmlhttp = window.createRequest();
      } catch (e) { xmlhttp = false; }
    }
  }
  return xmlhttp;
}