﻿function initCalcuator()
{
    showLoader();
    jQuery.ajax({
        type: "GET",
        url: "/reiknivel/xml/verdlisti.xml",
        dataType: "xml",
        error: function(XMLHttpRequest, textStatus, errorThrown) {
            // typically only one of textStatus or errorThrown 
            // will have info			
            showErrorMessage('Villa kom upp við að sækja verðskrá');
        },
        success: function(xml) {


            globalXml = xml;

            var minDate = Date.parse("today");

            globalDefaultLocation = 'IS';

            globalNextTravelDateItterationCount = 0;

            BuildPeriodData();

            // Datepicker	
            jQuery.datepicker.regional['is'] = {
                closeText: 'Loka',
                prevText: '&#x3c; Fyrri',
                nextText: 'N&aelig;sti &#x3e;',
                currentText: '&Iacute; dag',
                monthNames: ['Jan&uacute;ar', 'Febr&uacute;ar', 'Mars', 'Apr&iacute;l', 'Ma&iacute', 'J&uacute;n&iacute;',
				'J&uacute;l&iacute;', '&Aacute;g&uacute;st', 'September', 'Okt&oacute;ber', 'N&oacute;vember', 'Desember'],
                monthNamesShort: ['Jan', 'Feb', 'Mar', 'Apr', 'Ma&iacute;', 'J&uacute;n',
				'J&uacute;l', '&Aacute;g&uacute;', 'Sep', 'Okt', 'N&oacute;v', 'Des'],
                dayNames: ['Sunnudagur', 'M&aacute;nudagur', '&THORN;ri&eth;judagur', 'Mi&eth;vikudagur', 'Fimmtudagur', 'F&ouml;studagur', 'Laugardagur'],
                dayNamesShort: ['Sun', 'M&aacute;n', '&THORN;ri', 'Mi&eth;', 'Fim', 'F&ouml;s', 'Lau'],
                dayNamesMin: ['Su', 'M&aacute;', '&THORN;r', 'Mi', 'Fi', 'F&ouml;', 'La'],
                dateFormat: 'dd/mm', firstDay: 0,
                isRTL: false,
                inline: true,
                minDate: minDate,
                maxDate: Date.parse('31.12')
            };

            jQuery.datepicker.setDefaults(jQuery.datepicker.regional['is']);

            jQuery('#datepickerfrom').datepicker({ onSelect: function(dateText) {               
                var currentDayFrom = jQuery('#datepickerfrom').datepicker('getDate');
                var currentDayTo = jQuery('#datepickerto').datepicker('getDate');
                if (currentDayTo < currentDayFrom)
                    refreshCalendarTo();

                calcuatePrice();
                currentDayTo = jQuery('#datepickerto').datepicker('getDate');
            },
                beforeShowDay: function(date) {
                    var fromLocation = (jQuery('#locationfrom :selected').attr('calendar') != null) ? jQuery('#locationfrom :selected').attr('calendar') : globalDefaultLocation;
                    var period = getPeriod(date, fromLocation);
                    return [period.length > 0, period];
                },
                onChangeMonthYear: function(year, month, inst) {

                }
            });

            jQuery('#datepickerto').datepicker({ onSelect: function(dateText) {
                jQuery('input#twoway').attr('checked', 'checked');
                calcuatePrice();
            },
                beforeShowDay: function(date) {
                    var toLocation = (jQuery('#locationto :selected').attr('calendar') != null) ? jQuery('#locationto :selected').attr('calendar') : globalDefaultLocation;
                    var period = getPeriod(date, toLocation);
                    return [period.length > 0, period];
                }
            });

            //hover states on the static widgets
            jQuery('#dialog_link, ul#icons li').hover(
				function() { jQuery(this).addClass('ui-state-hover'); },
				function() { jQuery(this).removeClass('ui-state-hover'); }
			);


            //Bind Events
            jQuery('#adults, #children, #infants').change(function() { loadPersons(); });
            jQuery('#locationfrom').change(function() { loadLocationsTo(); });
            jQuery('#locationto').change(function() { refreshCalendarTo(); });
            jQuery('#calcuator select').change(function() { calcuatePrice(); });
            jQuery('#calcuator  :radio').click(function() { calcuatePrice(); });
            jQuery('#bookingbutton').click(function() { displayBooking(); });
            jQuery('#buttonreikna').click(function() { displayCalcuator(); });
            jQuery('#iscar').click(function() { jQuery("#ishusbill").attr('checked', false); jQuery("#ismotorhjol").attr('checked', false); displayCar(); });
            jQuery('#isvagn').click(function() { loadLengths(); loadCars(); });
            jQuery('#ishusbill').click(function() { jQuery("#iscar").attr('checked', false); jQuery("#isvagn").attr('checked', false); jQuery("#ismotorhjol").attr('checked', false); displayCar(); });
            jQuery('#ismotorhjol').click(function() { jQuery("#iscar").attr('checked', false); jQuery("#isvagn").attr('checked', false); jQuery("#ishusbill").attr('checked', false); displayCar(); });
            jQuery('#carlength').change(function() { loadCars(); calcuatePrice(); });
            jQuery('#car').change(function() { showMoreHeight(); });
            jQuery('#carmoreheight').change(function() { calcuatePrice(); });
            jQuery('#forfallartrygging').click(function() { calcuatePrice(); });
	    jQuery('.datefrombutton').click(function() { jQuery('#datepickerfrom').datepicker( "show" ); return false; });
	    jQuery('.datetobutton').click(function() { jQuery('#datepickerto').datepicker( "show" ); return false; });


            jQuery('a.frontpagesearch').click(function() {
            
                if (jQuery('#twoway').attr('checked') == true)
                    jQuery.cookie('twoway', '1')
                else
                    jQuery.cookie('twoway', '0')

		setDateFromCookie();
                setDateToCookie();

           
                //var url = '/?option=com_content&view=article&id=108&Itemid=74';
                //var url = 'http://smyril-line.is/Reiknivel/reiknivel.htm';
                var url = '/index.php?option=com_wrapper&view=wrapper&Itemid=27';
                /*
                var twoWay = jQuery("input#twoway:checked").length > 0;
                if (twoWay)
                url = url + '?twoway=1';
                else
                url = url + '?twoway=0';

                url = url + '&locationfrom=' + jQuery('#locationfrom :selected').text();
                url = url + '&locationto=' + jQuery('#locationto :selected').text();
                url = url + '&datefrom=' + jQuery('#datepickerfrom').val();
                url = url + '&dateto=' + jQuery('#datepickerto').val();
                url = url + '&adults=' + jQuery('#adults').val();
                url = url + '&children=' + jQuery('#children').val();
                url = url + '&infants=' + jQuery('#infants').val();
                */
                document.location = url;
            });

            //Load defaults
            loadLocations();

            //Load from QueryString
            //loadValuesFromQueryString();

            remember('#calcuator input, #calcuator select');

            loadPersons();

            calcuatePrice();

            hideLoader();
			
        }
    });


}

	
	jQuery('#bookingform').bind('submit', function() {
		jQuery(this).ajaxSubmit({
		    target: '#formoutputpanel',
            error: function() { jQuery('#formoutputpanel').html('Ekki tókst að senda pöntun.<br/>Vinsamlega reynið aftur<br/>eða hafið samband við sölufulltrúa okkar símleiðis.<br/><br/><a href="#" onclick="displayBooking();">Til baka</a>'); } 
		});
		return false;
	});
	
	function IslDateToTicks(islDate) {
	
		//Regex match isl date format 31.12.1999
		var rx = new RegExp("([1-9]|[12][0-9]|3[01])[\.]([1-9]|1[012])[\.](19\\d\\d|20\\d\\d)");
		var ticks = new Date(0).getTime(); //Default: 01.01.1970
		var dateParts = rx.exec(islDate);
		if (dateParts != null) {
			if (dateParts.length == 4) {
				engFormatDate = dateParts[2] + '/' + dateParts[1] + '/' + dateParts[3];
				ticks = Date.parse(engFormatDate).getTime()
			}
		}
		
		return ticks;
	}


	function setDateFromCookie() {
	
		if (jQuery('#calcuator.front').length > 0) {
			var date = jQuery('#datepickerfrom').datepicker('getDate');
			var dateStr = date.getDate() + '.' + parseInt(date.getMonth() + 1) + '.' + date.getFullYear();
			jQuery.cookie('datepickerfrom', dateStr , { path: '/', expires: 365 });
		}
		
	}

	function setDateToCookie() {
	
		if (jQuery('#calcuator.front').length > 0) {
			var date = jQuery('#datepickerto').datepicker('getDate');
			var dateStr = date.getDate() + '.' + parseInt(date.getMonth() + 1) + '.' + date.getFullYear();        
			jQuery.cookie('datepickerto', dateStr, { path: '/', expires: 365 });
		}
		
	}

	function saveSelectCookie(obj){
	
		if (obj.length > 0)
		{
			var name = jQuery(obj).attr('id');
			if (jQuery('#calcuator.front').length > 0)
				jQuery.cookie(name, jQuery(obj).find(':selected').text(), { path: '/', expires: 365 });	
		}
		
	}

	function remember( selector ){
	
		jQuery(selector).each(
			function() {

				//if this item has been cookied, restore it
				var name = jQuery(this).attr('id');

				if (jQuery(this).is('select')) {

					if (jQuery('#calcuator.front').length == 0) {
						if (jQuery.cookie(name)) {
							jQuery(this).find("option[selected]").removeAttr("selected");
							jQuery(this).find("option").each(function() {
								if (jQuery(this).text() == jQuery.cookie(name))
									jQuery(this).attr('selected', 'selected');
							});
						}
					}
				else
				{
					saveSelectCookie(this);
				}
					//assign a change function to the item to cookie it
					jQuery(this).change(function() {
					saveSelectCookie(this);	
					});
				}
			}
		);


		if (jQuery('#calcuator.front').length == 0)
		{
			var qdFrom = jQuery.cookie('datepickerfrom');
			var qdTo = jQuery.cookie('datepickerto');
						
			if (qdFrom != null)
				jQuery("#datepickerfrom").datepicker("setDate", new Date(IslDateToTicks(qdFrom)));
			if (qdTo != null)
				jQuery("#datepickerto").datepicker("setDate", new Date(IslDateToTicks(qdTo)));

			if (jQuery.cookie('twoway') == '1')
				jQuery('#twoway').attr('checked', 'checked');
		}
		
	}


	function loadValuesFromQueryString() {
	
		jQuery('#adults').val(getUrlVars()["adults"]);
		jQuery('#children').val(getUrlVars()["children"]);
		jQuery('#infants').val(getUrlVars()["infants"]);
			
		var twoWay = (getUrlVars()["twoway"]==1);
		if (twoWay)
			jQuery('#twoway').attr('checked', true);

		jQuery('#locationfrom').val();


		jQuery("#locationfrom option[selected]").removeAttr("selected");
		jQuery("#locationfrom option").each(function() {
			if (encodeURIComponent(jQuery(this).text()) == getUrlVars()["locationfrom"])
				jQuery(this).attr('selected', 'selected');
		});    

		jQuery("#locationto option[selected]").removeAttr("selected");
		jQuery("#locationto option").each(function() {
			if (encodeURIComponent(jQuery(this).text()) == getUrlVars()["locationto"])
				jQuery(this).attr('selected', 'selected');
		});

		
		var qdFrom = getUrlVars()["datefrom"];
		var qdTo = getUrlVars()["dateto"];
				
		if (qdFrom != undefined)
			jQuery("#datepickerfrom").datepicker("setDate", Date.parse(qdFrom));
		if (qdTo != undefined)
			jQuery("#datepickerto").datepicker("setDate", Date.parse(qdTo));
			  
		
	}

	function getUrlVars() {
	
		var vars = [], hash;
		var hashes = window.location.href.slice(window.location.href.indexOf('?') + 1).split('&');
		for (var i = 0; i < hashes.length; i++) {
			hash = hashes[i].split('=');
			vars.push(hash[0]);
			vars[hash[0]] = hash[1];
		}
		
		return vars;
	}

	function showLoader() {
	
		jQuery('#loadercontainer').show();
		
	}

	function hideLoader() {
	
		jQuery('#loadercontainer').hide();
		
	}

	function clearErrorMessage(){
	
		jQuery('.totalprice').removeClass('error');
		
	}

	function showErrorMessage(text){
	
		jQuery('.totalprice').addClass('error');
		jQuery('.totalprice').html(text);	
		calcuatorFinnishedWithErrors = true;
		jQuery("#calcuator :input").removeAttr("disabled");
		
	}

	function BuildPeriodData() {
	
		jQuery("timabil timi", globalXml).each(function()
		{
			var $this = jQuery(this),
			timidateFrom = Date.parse($this.attr('datefrom')),
			timidateTo = Date.parse($this.attr('dateto')),
			period = $this.attr('name'),
			location = $this.attr('stadur');
			
			for(var currentdate = timidateFrom; currentdate <= timidateTo; currentdate = currentdate.next().day())
			{
				jQuery("#calcuator").data(location + currentdate.getDate() + '.' + currentdate.getMonth(), { period: period });
			}
		});
		
	}

	function getPeriod(traveldate, location){
		var dateKey = location + traveldate.getDate() + '.' + traveldate.getMonth();
		var periodData = jQuery("#calcuator").data(dateKey);			
		if (periodData==undefined)
		{				
			return '';
		}		
		return periodData.period;		
	}

	function calcuatePrice(){
	
		jQuery("#calcuator :input").attr("disabled","disabled");

		//if (typeof console != 'undefined')
		//	console.log('Reikna');
				
		calcuatorFinnishedWithErrors = false;
		jQuery('.pricesummary').html('');	
		var totalprice = 0;
		jQuery('.totalprice').removeClass('error');
		
		var twoWay = jQuery("input#twoway:checked").length>0;
			
		/*
		if (!twoWay)
			jQuery('#datepickerto').hide();
		else
			jQuery('#datepickerto').show();
		*/
									
		var dateFrom = jQuery('#datepickerfrom').datepicker( 'getDate' );
		var dateTo = jQuery('#datepickerto').datepicker( 'getDate' )
		
		jQuery('input#ut').val('');
		jQuery('input#heim').val('');	
		jQuery('input#dagsut').val('');
		jQuery('input#dagsheim').val('');
		jQuery('input#verd').val('');
		jQuery('#bokunklefar').html('');
					
		jQuery('#heildarlengd').val('');
		jQuery('#heildarlengd').val(jQuery('#carlength :selected').val());
		
		jQuery("#bilpakki").val('');	
		jQuery("#bilpakki").val(jQuery("#car :selected").val());
		
		if (jQuery('#carmoreheight:checked').length > 0)
		{
			//sýni meiri hæð í bílpakka
			var carPackValue = jQuery('#car :selected').val() + ' ATH! bíll er hærri';
			jQuery("#bilpakki").val(carPackValue);        
		}
		
		var hiddenKlefar = '<textarea class="hide">';
		jQuery("div.cabinets input:checkbox:checked, div.beds input:checkbox:checked").each(function ()
		{		
			jQuery("#bokunklefar").append('<div class="fieldrow">'+jQuery(this).val()+'</div>');
			hiddenKlefar += jQuery(this).val()+"\n\r";
		});
		hiddenKlefar += '</textarea>';
		//jQuery("#bokunklefar").append(hiddenKlefar);
		
		var numPersons = getNumPersons();
		jQuery('#persontable tbody').children().remove();
		for(var i=1;i<numPersons;i++)
		{
			jQuery('#persontable tbody').append('<tr><td><input id="nafn'+i+'" name="Nafn'+i+'" type="text"/></span></td><td><input id="kennitala'+i+'" name="Kennitala'+i+'" type="text"/></td></tr>');
		}	
		if (numPersons==1)
			jQuery('#persontable').hide();
		else
			jQuery('#persontable').show();
		

						
		jQuery('input#ut').val(jQuery('#locationfrom :selected').text());
		jQuery('input#dagsut').val(dateFrom.toString('dd.MM.yyyy'))
		if (twoWay)
		{
			jQuery('input#heim').val(jQuery('#locationto :selected').text());
			jQuery('input#dagsheim').val(dateTo.toString('dd.MM.yyyy'))		
		}
								
		var periodFrom = getPeriod(dateFrom, jQuery('#locationfrom :selected').attr('calendar'));	
		var periodTo = getPeriod(dateTo, jQuery('#locationto :selected').attr('calendar'));
		
		if (periodFrom=='')	
		{
			showErrorMessage('Fann ekki tímabil frá: ' + dateFrom.toString('dd.MM.yyyy'));
			return;
		}					
		jQuery('div.period span.colorfrom').html(periodFrom);
		
		
		if (twoWay)
		{
			if (periodTo=='')
			{
				showErrorMessage('Fann ekki tímabil til: ' + dateTo.toString('dd.MM.yyyy'));				
				return;
			}	
			jQuery('div.period span.colorto').html(periodTo);	
		}
		
		
		if (calcuatorFinnishedWithErrors)
			return;
				
				
		var summaryContainerFrom = jQuery('.pricesummaryfrom');
		var summaryContainerTo = jQuery('.pricesummaryto');
		summaryContainerFrom.html('');
		summaryContainerTo.html('');
		
		summaryContainerFrom.append('<div class="arrival"><span class="arrivalfrom">Brottför:</span><span class="arrivalfrom">' + dateFrom.toString('dd.MM.yyyy') + '</span></div>');
		
		
			
		totalprice = calcuateOneWay(periodFrom, summaryContainerFrom, jQuery('#locationfrom').val(), false);	
		if (twoWay)
		{		
			summaryContainerTo.append('<div class="arrival"><span class="arrivalto">Heimferð</span><span class="arrivalto">' + dateTo.toString('dd.MM.yyyy') + '</span></div>');
			totalprice += calcuateOneWay(periodTo, summaryContainerTo, jQuery('#locationto').val(), true);
		}
		
		//Sýni niðurstöður	
		if (!calcuatorFinnishedWithErrors)	
		{
			var printprice = number_format(totalprice, 0, ',', '.');
			jQuery('div.prices .totalprice').html(printprice);
			jQuery('input#verd').val(printprice);
		}
			
		jQuery("#calcuator :input").removeAttr("disabled");
		//jQuery('#locationto').attr('disabled', 'disabled');	
		
	}

	function calcuateOneWay(period, outputcontainer, location, isSecondWay){
	
		var totalprice = 0;
		
		//Sæki farþegar
		var passengers = getPassengers();
		
		//Bíll, húsbíll eða mótorhjól valið
		var isCar = jQuery("#iscar").attr('checked') || jQuery("#ishusbill").attr('checked') || jQuery("#ismotorhjol").attr('checked');

		//Bílapakki			
		var carPack = jQuery("bilar bill", globalXml).filter(function()
		{
			return jQuery('name', this).text() == jQuery('#car').val();
		}).each(function()
		{
			if (isCar)
			{
				totalprice += addPrice(outputcontainer, this, period, location);	
			}
		});	
		
		//Fjöld farþegar innifalinn í bílapakka			
		var carPackPassengerCount = 0
		
		if (isCar)	
			carPackPassengerCount =carPack.attr('passengercount');	
			
		if (carPackPassengerCount == undefined)
			showErrorMessage('ATH það vantar farþegarfjölda í xml gögn (passengercount) fyrir bílpakka: ' + jQuery('#car').val());
		
		
		//Einstaklings verð reiknast fyrir hvern og einn, sem er ekki innifalinn í bílapakka	 
		var numPassengersNotCharged = getNumPersons() - carPackPassengerCount;		
		var numAdultsNotCharged = 0;
		var numChildrenNotCharged = 0;
		var numInfantsNotCharged = 0;	
			
		//Athuga um leið hvort rukku eigi fyrir farið, í þessari röð						
		
		for(var i=0;i<passengers.infants;i++)
		{								
			//Athuga hvort rukka eigi fyrir far												
			if (numPassengersNotCharged > 0)
			{
				numInfantsNotCharged++;				
				numPassengersNotCharged--;
			}
		}			
		for(var i=0;i<passengers.children;i++)
		{						
			//Athuga hvort rukka eigi fyrir far												
			if (numPassengersNotCharged > 0)
			{
				numChildrenNotCharged++;				
				numPassengersNotCharged--;
			}								
		}	
		for(var i=0;i<passengers.adults;i++)
		{						
			//Athuga hvort rukka eigi fyrir far												
			if (numPassengersNotCharged > 0)
			{
				numAdultsNotCharged++;				
				numPassengersNotCharged--;
			}				
		}					
												
		//Fargjöld fyrir þá sem er ekki eru innifaldir í bílapakka	
		for(var i=0;i<numAdultsNotCharged;i++)
		{
			totalprice += addPrice(outputcontainer, jQuery("passengers passenger[type='adults']", globalXml), period, location);		
		}
		for(var i=0;i<numChildrenNotCharged;i++)
		{
			totalprice += addPrice(outputcontainer, jQuery("passengers passenger[type='children']", globalXml), period, location);
		}	
		for(var i=0;i<numInfantsNotCharged;i++)
		{
			totalprice += addPrice(outputcontainer, jQuery("passengers passenger[type='infants']", globalXml), period, location);
		}
		
		//Klefar		
		jQuery("div.cabinets span.cabinet input:checkbox:checked").each(function()
		{				
			var currentCabinet = this;
			var cabinet = jQuery("klefar klefi", globalXml).filter(function()
			{
				return jQuery('name', this).text() == jQuery(currentCabinet).val();
			}).each(function()
			{
				totalprice += addPrice(outputcontainer, this, period, location);	
			});


		});

		//Rúm
		jQuery("div.beds span.bed input:checkbox:checked").each(function () {
			var currentBed = this;
			var cabinet = jQuery("rum rum", globalXml).filter(function () {
				return jQuery('name', this).text() == jQuery(currentBed).val();
			}).each(function () {                        
					totalprice += addMultiplePrices(outputcontainer, this, period, location, passengers.adults + passengers.children + passengers.infants, jQuery(this).text());                            
			});


		});     
		
		
				
		//Tryggingargjöld Fullorðin/Börn/Ungabörn	
		
		//Ekki reikna bókunargjald báðar leiðir
			if (!isSecondWay)
				totalprice += addMultiplePrices(outputcontainer, jQuery("tryggingargjold tryggingargjald[type='adults'] name", globalXml).filter(function (index) { return jQuery(this).text() == 'Bókunar og alferðargjald'; }).parent(), period, location, passengers.adults + passengers.children + passengers.infants, 'bókunargjald');
			//Ekki reikna forfallargjald báðar leiðir og aðeins þegar það er valið

			
			


			if (!isSecondWay && jQuery('#forfallartrygging:checked').length > 0) {
				totalprice += addMultiplePrices(outputcontainer, jQuery("tryggingargjold tryggingargjald[type='adults'] name", globalXml).filter(function (index) { return jQuery(this).text() == 'Forfallatrygging'; }).parent(), period, location, passengers.adults, 'forfallartrygging');

				if (passengers.children > 0)
					totalprice += addMultiplePrices(outputcontainer, jQuery("tryggingargjold tryggingargjald[type='children'] name", globalXml).filter(function (index) { return jQuery(this).text() == 'Forfallatrygging'; }).parent(), period, location, passengers.children, 'forfallartrygging börn');
				if (passengers.infants > 0)
					totalprice += addMultiplePrices(outputcontainer, jQuery("tryggingargjold tryggingargjald[type='infants'] name", globalXml).filter(function (index) { return jQuery(this).text() == 'Forfallatrygging'; }).parent(), period, location, passengers.infants, 'forfallartrygging ungabörn');
				
			}
		
		
		/*
		for(var i=0;i<passengers.adults;i++)
		{
			totalprice += addPrice(outputcontainer, jQuery("tryggingargjold tryggingargjald[type='adults']", globalXml), period, location);
		}
		
		//Tryggingargjöld Börn
		for(var i=0;i<passengers.children;i++)
		{
			totalprice += addPrice(outputcontainer, jQuery("tryggingargjold tryggingargjald[type='children']", globalXml), period, location);
		}

		//Tryggingargjöld Ungabörn
		for(var i=0;i<passengers.infants;i++)
		{
			totalprice += addPrice(jQuery(outputcontainer, "tryggingargjold tryggingargjald[type='infants']", globalXml), period, location);
		}
		*/
		
		outputcontainer.append('<hr class="sep"/>');
		
															
		return totalprice;
	}

	function addMultiplePrices(outputcontainer, context, period, location, count, productName){
	
		var verd = jQuery("verd[timi='"+period+"'][stadur='"+location+"']", context);
		var productName = count + ' x ' + productName;
		
		//Trimma productnafnið athuga hvort það sé verið að sækja verð fyrir nóðu sem er ekki til, eða inniheldur ekki verð
		//Sýni þá xml selector í staðinn
		if (productName.replace(/^\s\s*/, '').replace(/\s\s*$/, '')=='')
			productName = context;
		
		if (verd.length==0)					
			showErrorMessage('Fann ekki verð fyrir ' + productName + ', Tími: '+period + ', Staður: '+location);
		else {
			var totalprice = 0;
			verd.each(function () {
				var price = parseInt(verd.attr('verd')) * count;
				totalprice += price;
				var printprice = number_format(price, 0, ',', '.');
				if (printprice == '0')
					printprice = '';
				outputcontainer.append('<div><span class="pricetext">' + productName + '</span><span class="pricevalue">' + printprice + '</span></div>');
			});

		
			return totalprice;
		}
		
		return 0;		
	}

	function addPrice(outputcontainer, context, period, location){		
	
		var verd = jQuery("verd[timi='"+period+"'][stadur='"+location+"']", context);		
		//var productName = jQuery('name', context).text() + ' ' + jQuery('description', context).text();
		var productName = jQuery('name', context).text();
		
		//Trimma productnafnið athuga hvort það sé verið að sækja verð fyrir nóðu sem er ekki til, eða inniheldur ekki verð
		//Sýni þá xml selector í staðinn
		if (productName.replace(/^\s\s*/, '').replace(/\s\s*$/, '')=='')
			productName = context;
						
		if (verd.length==0)					
			showErrorMessage('Fann ekki verð fyrir ' + productName + ', Tími: '+period + ', Staður: '+location);
		else
		{
				
			var price = parseInt(verd.attr('verd'));
			var printprice = number_format(price, 0, ',', '.');	
			if (printprice=='0')
				printprice = '';
			outputcontainer.append('<div><span class="pricetext">'+productName+'</span><span class="pricevalue">'+printprice+'</span></div>');
		
			return price;
		}
		
		return 0;
	}

	function refreshCalendarTo(){
	
		showLoader();      	
		globalNextTravelDateItterationCount	= 0;

		var timeRange = jQuery("timabil timi", globalXml).filter(function() {
			return jQuery(this).attr('stadur') === jQuery('#locationto :selected').attr('calendar');
		});
		
		if (timeRange.length > 0)
		{	
			var minDate = getNextTravelDateByDate(timeRange, jQuery('#datepickerfrom').datepicker('getDate'));					
			jQuery("#datepickerto").datepicker("setDate",minDate);
		}				
		else
		{
			//alert('1Fann ekki næsta tímabil: ' + jQuery('#locationto :selected').attr('calendar'));
		}
		hideLoader();
		
	}

	function refreshCalendarFrom(){
	
		showLoader();
		globalNextTravelDateItterationCount	= 0;
		var selectedLocationFrom = jQuery('#locationfrom :selected').attr('calendar');
		var timeRange = jQuery("timabil timi", globalXml).filter(function() {
			return jQuery(this).attr('stadur') === selectedLocationFrom;
		});
		
		if (timeRange.length > 0)
		{
			var minDate = getNextTravelDate(timeRange, new Date().getFullYear());		
			jQuery("#datepickerfrom").datepicker("setDate",minDate);
		}
		else
		{
			//alert('Fann ekki næsta tímabil: ' + jQuery('#locationfrom :selected').attr('calendar'));
		
			return;
			}
		hideLoader();		
		
	}

	function getNextTravelDate(timeRange, currentYear){
	
		var currentDate = new Date();
		if (currentDate.getFullYear() != currentYear)
			currentDate = Date.parse('01.01.'+currentYear);
		
		return getNextTravelDateByDate(timeRange, currentDate);
	}

	function getNextTravelDateByDate(timeRange, currentDate){	
	
		globalNextTravelDateItterationCount++;
		if (globalNextTravelDateItterationCount > 3)
		{		
			//console.log('Fann ekki næsta tímabil');
			return new Date();
		}
		var travelDate = new Date();
		var foundDate = false;
		var currentYear = currentDate.getFullYear();
		timeRange.each(function()
		{
			if (foundDate===false)
			{						
				//var currentDate = new Date();
				//if (currentDate.getFullYear() != currentYear)
					//currentDate = Date.parse('01.01.'+currentYear);
				var datefrom = Date.parse(jQuery(this).attr('datefrom')+'.'+currentYear),
				dateto = Date.parse(jQuery(this).attr('dateto')+'.'+currentYear);
				//console.log('datefrom: ' + datefrom + ' dateto: ' + dateto + ' currentdate: ' + currentDate);
				if (datefrom >= currentDate || dateto >= currentDate)
				{
					//alert('fann timabil: ' + jQuery(this).attr('name') + dateto);
					travelDate = datefrom;
					foundDate = true;					
					return false;
				}		
			}
		});
		
		//Ekkert fannst finna ferð á næsta ári
		if (foundDate===false)
		{	    
			travelDate = getNextTravelDate(timeRange, currentYear+1);
		}
					
		return travelDate;	
		
	}

	function loadLocations()
	{
	
		//console.log('load locations');
		loadLocationsFrom();
		loadLocationsTo();	
		
	}

	function loadLocationsFrom(){
	
		var locationfrom = jQuery('#locationfrom');
		locationfrom.html('');	
		var defaultLocation = jQuery("stadir stadur:eq(0)", globalXml);
				
		jQuery('stadir stadur', globalXml).each(function()
		{
			if (jQuery(this).attr('name') !== defaultLocation.attr('name'))
				jQuery("<option value="+jQuery(this).attr('name')+" calendar="+defaultLocation.attr('name')+">").text(defaultLocation.attr('value') + ' - ' + jQuery(this).attr('value')).appendTo(locationfrom);
		});
		
		jQuery('stadir stadur', globalXml).each(function()
		{
			if (jQuery(this).attr('name') !== defaultLocation.attr('name'))
				jQuery("<option value="+jQuery(this).attr('name')+ " calendar="+jQuery(this).attr('name')+">").text(jQuery(this).attr('value') + ' - ' + defaultLocation.attr('value')).appendTo(locationfrom);
		});
		refreshCalendarFrom();
		
	}

	function loadLocationsTo(){
	
		var locationto = jQuery('#locationto');
		locationto.html('');
		var defaultLocation = jQuery("stadir stadur:eq(0)", globalXml);
		jQuery('stadir stadur', globalXml).each(function()
		{
			//Skip specified location at destination						
			//if (jQuery('#locationfrom').val() != jQuery(this).attr('name'))
			if (jQuery(this).attr('name') != defaultLocation.attr('name'))
				jQuery("<option value="+jQuery(this).attr('name')+" calendar="+jQuery(this).attr('name')+">").text(jQuery(this).attr('value') + ' - ' + defaultLocation.attr('value')).appendTo(locationto);
		});
		
		jQuery('stadir stadur', globalXml).each(function()
		{
			//Skip specified location at destination						
			//if (jQuery('#locationfrom').val() != jQuery(this).attr('name'))
			if (jQuery(this).attr('name') != defaultLocation.attr('name'))
				jQuery("<option value="+jQuery(this).attr('name')+ " calendar="+defaultLocation.attr('name')+">").text(defaultLocation.attr('value') + ' - ' + jQuery(this).attr('value')).appendTo(locationto);
		});	
		
		//Velja sjálfkrafa þann stað sem
		//locationto.val(jQuery('#locationfrom').val());	
		//alert( jQuery('#locationfrom')[0].selectedIndex );
		jQuery('#locationto')[0].selectedIndex = jQuery('#locationfrom')[0].selectedIndex;
		saveSelectCookie(jQuery('#locationto'));

		refreshCalendarFrom()
		refreshCalendarTo();
		
	}

	function getPassengers(){
	
		person = new Object();
		person.adults = parseInt(jQuery('#adults').val());
		person.infants = parseInt(jQuery('#infants').val());
		person.children = parseInt(jQuery('#children').val())-person.infants;	
		
		return person;
	}

	function getNumPersons()
	{
		
		var numPersons = parseInt(jQuery('#adults').val())+parseInt(jQuery('#children').val());
		
		return numPersons;
	}

	function getNumPersonsWithoutInfants()
	{
	
		var numAdults = parseInt(jQuery('#adults').val());
		var numInfants  = parseInt(jQuery('#infants').val());
		var numChildren = parseInt(jQuery('#children').val());
		
		//Ath viðmótið býður upp á að velja fleiri infants en children
		if (numInfants > numChildren)
			numInfants = numChildren;    
			
		var numPersons = numAdults+numChildren-numInfants;
		
		return numPersons;        
	}

	function loadPersons()
	{
	
		loadCabinets();
		loadBeds(); 
		loadCars();
		
	}

	function loadCabinets()
	{	
		
		var numPersons = getNumPersons();
		//Athuga hvaða hvort það sé hakað í einhverja klefa nú þegar
		var selectedCabinets = [];	
		var currentCabinets = jQuery("div.cabinets span.cabinet input:checkbox:checked");
		if (currentCabinets.length > 0)
		{	
			jQuery("div.cabinets span.cabinet input:checkbox:checked").each(function()
			{
				selectedCabinets[selectedCabinets.length] = jQuery(this).val();
			});	
		}
			
		var cabinets = jQuery('div.cabinets');
		cabinets.html('');
		jQuery('klefar klefi', globalXml).filter(function() {
			return attributeDefault(this, 'min', 1) <= parseInt(numPersons) && attributeDefault(this, 'max', 999) >= parseInt(numPersons);		
		}).each(function(index)
		{		
			jQuery("<span title='"+jQuery('description', this).text()+"' class='cabinet'><input type='checkbox' onclick='calcuatePrice();' name='Klefi"+index+"' value='"+jQuery('name', this).text()+"'/></span><span class='cabintext'>"+jQuery('name', this).text()+"</span><br/>").appendTo(cabinets);
		});
		
		//Haka í þá sem voru valdir
		for(var i=0;i<selectedCabinets.length;i++)
		{		
			jQuery("div.cabinets span.cabinet input:checkbox").each(function()
			{
				if (jQuery(this).val() == selectedCabinets[i])
					jQuery(this).attr('checked', 'checked');
			});
		}
		
	}

	function loadBeds() {
	
		var numPersons = getNumPersons();
		//Athuga hvaða hvort það sé hakað í einhverja klefa nú þegar
		var selectedbeds = [];
		var currentbeds = jQuery("div.beds span.bed input:checkbox:checked");
		if (currentbeds.length > 0) {
			jQuery("div.beds span.bed input:checkbox:checked").each(function () {
				selectedbeds[selectedbeds.length] = jQuery(this).val();
			});
		}

		var beds = jQuery('div.beds');
		beds.html('');
		jQuery('rum rum', globalXml).filter(function () {
			return attributeDefault(this, 'min', 1) <= parseInt(numPersons) && attributeDefault(this, 'max', 999) >= parseInt(numPersons);
		}).each(function (index) {
			jQuery("<span title='" + jQuery('description', this).text() + "' class='bed'><input type='checkbox' onclick='calcuatePrice();' name='Klefi" + index + "' value='" + jQuery('name', this).text() + "'/></span><span class='cabintext'>" + jQuery('name', this).text() + "</span><br/>").appendTo(beds);
		});

		//Haka í þá sem voru valdir
		for (var i = 0; i < selectedbeds.length; i++) {
			jQuery("div.beds span.bed input:checkbox").each(function () {
				if (jQuery(this).val() == selectedbeds[i])
					jQuery(this).attr('checked', 'checked');
			});
		}
		
	}
		
	function loadLengths()
	{
	
		var numPersons = getNumPersons();
		var isCar = jQuery("#iscar").attr('checked');
		var isVagn = jQuery("#isvagn").attr('checked');
		var isHusbill = jQuery("#ishusbill").attr('checked');
		var isMotorhjol = jQuery("#ismotorhjol").attr('checked');
			
		var carLength = jQuery('#carlength');
		carLength.html('');
		
		if (isCar || isHusbill || isMotorhjol)
		{		
			jQuery('bilar bill', globalXml).filter(function() {		
				return	attributeDefault(this, 'min', 1) <= parseInt(numPersons)
						&& attributeDefault(this, 'max', 999) >= parseInt(numPersons)
						&& (attributeDefault(this, 'vagn', '').length > 0 == isVagn || isVagn && isCar)
						&& (attributeDefault(this, 'husbill', '').length > 0 == isHusbill || isHusbill && isCar)
						&& (attributeDefault(this, 'motorhjol', '').length > 0 == isMotorhjol || isMotorhjol && isCar)
				}).each(function()
				{	
					var desc = jQuery('description', this).text();
					if (desc != '' && jQuery(":contains('"+desc+"')", carLength).length==0)		
					jQuery("<option value='"+desc+"'>").text(desc).appendTo(carLength);						
			});	
		}	
		if (jQuery('#carlength option').length==0)
		{
			jQuery('span.carlength').hide();
			jQuery('#carlength').hide();
		}
		else
		{
			jQuery('span.carlength').show();
			jQuery('#carlength').show();
		}
		
	}	
		
	function loadCars()
	{	
	
		jQuery('#moreheight').hide();
		var numPersons = getNumPersonsWithoutInfants();
		var isCar = jQuery("#iscar").attr('checked');
		var isVagn = jQuery("#isvagn").attr('checked');
		var isHusbill = jQuery("#ishusbill").attr('checked');
		var isMotorhjol = jQuery("#ismotorhjol").attr('checked');
		
		if (isVagn)
			jQuery('span.carlength').html('Lengd á bíl og aftanívagni'); 	    
		else if (isHusbill)
			jQuery('span.carlength').html('Lengd húsbíls'); 	    
		else
			jQuery('span.carlength').html('Lengd á bíl');               
				   
		
		if (isCar || isHusbill || isMotorhjol)
		{	
			var car = jQuery('#car');
			car.html('');
			jQuery('bilar bill', globalXml).filter(function() {		
				return	attributeDefault(this, 'min', 1) <= parseInt(numPersons)
						&& attributeDefault(this, 'max', 999) >= parseInt(numPersons)
						&& (attributeDefault(this, 'vagn', '').length > 0 == isVagn || isVagn && isCar)
						&& (attributeDefault(this, 'husbill', '').length > 0 == isHusbill || isHusbill && isCar)
						&& (attributeDefault(this, 'motorhjol', '').length > 0 == isMotorhjol || isMotorhjol && isCar)
						&& (jQuery('description', this).text() == jQuery('#carlength').val() || (isMotorhjol && jQuery('description', this).text() == ''));
			}).each(function()
			{
				jQuery("<option value='"+jQuery('name', this).text()+"'>").text(jQuery('name', this).text()).appendTo(car);
			});	
		}
		
	}

	function attributeDefault(obj, attrname, defaultValue)
	{
		return (jQuery(obj).attr(attrname)==undefined || jQuery(obj).attr(attrname)== '') ? defaultValue : jQuery(obj).attr(attrname);	
	}

	function displayCar()
	{	
	
		loadLengths();
		loadCars();

		if (jQuery("#iscar").attr('checked')==true || jQuery("#ishusbill").attr('checked')==true || jQuery("#ismotorhjol").attr('checked')==true)
		{						
			jQuery('.cars').show();
		}
		else
		{		
			jQuery('#car').html('');
			jQuery('#carlength').html('');
			//jQuery('.cars').hide();				
		}
		
		if (jQuery("#iscar").attr('checked')==true)
		{
			jQuery('.isvagn').show();
		}
		else
		{	
			jQuery("#isvagn").attr('checked', false);
			jQuery('.isvagn').hide();
		}	
		
		if (jQuery("#iscar").attr('checked')==false && jQuery("#ishusbill").attr('checked')==false && jQuery("#ismotorhjol").attr('checked')==false)
		{
			jQuery('.cars').hide();
		}
					
		calcuatePrice();
		
	}

	function showMoreHeight()
	{
	
		jQuery('#moreheight').hide();    
		var currentCarValue = jQuery('#car').val();
		var lastCarValue = jQuery('#car option:last').val();
		if (currentCarValue==lastCarValue)
		{
			var regexValue = /\d*\ *m\ *og\ *allt\ *að ([\d\,]*)m/;
			var re = new RegExp(regexValue);
			var m = re.exec(jQuery('#car').val());
			if (m != null)
			{
				if (m.length > 0)
				{
					jQuery('#moreheighttext').html(m[1]);                
					jQuery('#moreheight').show();                                
				}
			}                        
		}
		else
		{
			jQuery('#carmoreheight:checked').attr('checked', '');
		}    
		
	}



	function validateCalcuator()
	{
	
		jQuery('#validationsummary').html('');
		var validationmessage = '';
		var isValid = true;
		if (jQuery('.orderlocation input:radio').is(':checked')==false)
		{
			validationmessage += ' veldu söluaðila';
			isValid = false;
		}
		jQuery('#validationsummary').html(validationmessage)
		
		return isValid;
	}

	function displayBooking()
	{
	
		if (validateCalcuator())
		{
			jQuery('#booking').show();
			jQuery('#sendpanel').show();
		
			jQuery('#calcuator').hide();
			jQuery('#bookingbutton').hide();
			jQuery('#confirmpanel').hide();	
			jQuery('#thankyoupanel').hide();
		}
		
	}

	function displayCalcuator()
	{
	
		jQuery('#booking').hide();
		jQuery('#sendpanel').hide();
		jQuery('#confirmpanel').hide();	
		jQuery('#thankyoupanel').hide();
		
		jQuery('#calcuator').show();
		jQuery('#bookingbutton').show();
		
	}

	function displayThankyou()
	{
	
		jQuery('#calcuator').hide();
		jQuery('#bookingbutton').hide();
		jQuery('#booking').hide();
		jQuery('#sendpanel').hide();		
		
		jQuery('#thankyoupanel').show();
		
	}





/*
 * jQuery Form Plugin
 * version: 2.36 (07-NOV-2009)
 * @requires jQuery v1.2.6 or later
 *
 * Examples and documentation at: http://malsup.com/jquery/form/
 * Dual licensed under the MIT and GPL licenses:
 *   http://www.opensource.org/licenses/mit-license.php
 *   http://www.gnu.org/licenses/gpl.html
 */
;(function(jQuery) {

/*
	Usage Note:
	-----------
	Do not use both ajaxSubmit and ajaxForm on the same form.  These
	functions are intended to be exclusive.  Use ajaxSubmit if you want
	to bind your own submit handler to the form.  For example,

	jQuery(document).ready(function() {
		jQuery('#myForm').bind('submit', function() {
			jQuery(this).ajaxSubmit({
				target: '#output'
			});
			return false; // <-- important!
		});
	});

	Use ajaxForm when you want the plugin to manage all the event binding
	for you.  For example,

	jQuery(document).ready(function() {
		jQuery('#myForm').ajaxForm({
			target: '#output'
		});
	});

	When using ajaxForm, the ajaxSubmit function will be invoked for you
	at the appropriate time.
*/

/**
 * ajaxSubmit() provides a mechanism for immediately submitting
 * an HTML form using AJAX.
 */
jQuery.fn.ajaxSubmit = function(options) {
	// fast fail if nothing selected (http://dev.jquery.com/ticket/2752)
	if (!this.length) {
		log('ajaxSubmit: skipping submit process - no element selected');
		return this;
	}

	if (typeof options == 'function')
		options = { success: options };

	var url = jQuery.trim(this.attr('action'));
	if (url) {
		// clean url (don't include hash vaue)
		url = (url.match(/^([^#]+)/)||[])[1];
   	}
   	url = url || window.location.href || '';

	options = jQuery.extend({
		url:  url,
		type: this.attr('method') || 'GET',
		iframeSrc: /^https/i.test(window.location.href || '') ? 'javascript:false' : 'about:blank'
	}, options || {});

	// hook for manipulating the form data before it is extracted;
	// convenient for use with rich editors like tinyMCE or FCKEditor
	var veto = {};
	this.trigger('form-pre-serialize', [this, options, veto]);
	if (veto.veto) {
		log('ajaxSubmit: submit vetoed via form-pre-serialize trigger');
		return this;
	}

	// provide opportunity to alter form data before it is serialized
	if (options.beforeSerialize && options.beforeSerialize(this, options) === false) {
		log('ajaxSubmit: submit aborted via beforeSerialize callback');
		return this;
	}

	var a = this.formToArray(options.semantic);
	if (options.data) {
		options.extraData = options.data;
		for (var n in options.data) {
		  if(options.data[n] instanceof Array) {
			for (var k in options.data[n])
			  a.push( { name: n, value: options.data[n][k] } );
		  }
		  else
			 a.push( { name: n, value: options.data[n] } );
		}
	}

	// give pre-submit callback an opportunity to abort the submit
	if (options.beforeSubmit && options.beforeSubmit(a, this, options) === false) {
		log('ajaxSubmit: submit aborted via beforeSubmit callback');
		return this;
	}

	// fire vetoable 'validate' event
	this.trigger('form-submit-validate', [a, this, options, veto]);
	if (veto.veto) {
		log('ajaxSubmit: submit vetoed via form-submit-validate trigger');
		return this;
	}

	var q = jQuery.param(a);

	if (options.type.toUpperCase() == 'GET') {
		options.url += (options.url.indexOf('?') >= 0 ? '&' : '?') + q;
		options.data = null;  // data is null for 'get'
	}
	else
		options.data = q; // data is the query string for 'post'

	var $form = this, callbacks = [];
	if (options.resetForm) callbacks.push(function() { $form.resetForm(); });
	if (options.clearForm) callbacks.push(function() { $form.clearForm(); });

	// perform a load on the target only if dataType is not provided
	if (!options.dataType && options.target) {
		var oldSuccess = options.success || function(){};
		callbacks.push(function(data) {
			jQuery(options.target).html(data).each(oldSuccess, arguments);
		});
	}
	else if (options.success)
		callbacks.push(options.success);

	options.success = function(data, status) {
		for (var i=0, max=callbacks.length; i < max; i++)
			callbacks[i].apply(options, [data, status, $form]);
	};

	// are there files to upload?
	var files = jQuery('input:file', this).fieldValue();
	var found = false;
	for (var j=0; j < files.length; j++)
		if (files[j])
			found = true;

	var multipart = false;
//	var mp = 'multipart/form-data';
//	multipart = ($form.attr('enctype') == mp || $form.attr('encoding') == mp);

	// options.iframe allows user to force iframe mode
	// 06-NOV-09: now defaulting to iframe mode if file input is detected
   if ((files.length && options.iframe !== false) || options.iframe || found || multipart) {
	   // hack to fix Safari hang (thanks to Tim Molendijk for this)
	   // see:  http://groups.google.com/group/jquery-dev/browse_thread/thread/36395b7ab510dd5d
	   if (options.closeKeepAlive)
		   jQuery.get(options.closeKeepAlive, fileUpload);
	   else
		   fileUpload();
	   }
   else
	   jQuery.ajax(options);

	// fire 'notify' event
	this.trigger('form-submit-notify', [this, options]);
	return this;


	// private function for handling file uploads (hat tip to YAHOO!)
	function fileUpload() {
		var form = $form[0];

		if (jQuery(':input[name=submit]', form).length) {
			alert('Error: Form elements must not be named "submit".');
			return;
		}

		var opts = jQuery.extend({}, jQuery.ajaxSettings, options);
		var s = jQuery.extend(true, {}, jQuery.extend(true, {}, jQuery.ajaxSettings), opts);

		var id = 'jqFormIO' + (new Date().getTime());
		var $io = jQuery('<iframe id="' + id + '" name="' + id + '" src="'+ opts.iframeSrc +'" />');
		var io = $io[0];

		$io.css({ position: 'absolute', top: '-1000px', left: '-1000px' });

		var xhr = { // mock object
			aborted: 0,
			responseText: null,
			responseXML: null,
			status: 0,
			statusText: 'n/a',
			getAllResponseHeaders: function() {},
			getResponseHeader: function() {},
			setRequestHeader: function() {},
			abort: function() {
				this.aborted = 1;
				$io.attr('src', opts.iframeSrc); // abort op in progress
			}
		};

		var g = opts.global;
		// trigger ajax global events so that activity/block indicators work like normal
		if (g && ! jQuery.active++) jQuery.event.trigger("ajaxStart");
		if (g) jQuery.event.trigger("ajaxSend", [xhr, opts]);

		if (s.beforeSend && s.beforeSend(xhr, s) === false) {
			s.global && jQuery.active--;
			return;
		}
		if (xhr.aborted)
			return;

		var cbInvoked = 0;
		var timedOut = 0;

		// add submitting element to data if we know it
		var sub = form.clk;
		if (sub) {
			var n = sub.name;
			if (n && !sub.disabled) {
				options.extraData = options.extraData || {};
				options.extraData[n] = sub.value;
				if (sub.type == "image") {
					options.extraData[name+'.x'] = form.clk_x;
					options.extraData[name+'.y'] = form.clk_y;
				}
			}
		}

		// take a breath so that pending repaints get some cpu time before the upload starts
		setTimeout(function() {
			// make sure form attrs are set
			var t = $form.attr('target'), a = $form.attr('action');

			// update form attrs in IE friendly way
			form.setAttribute('target',id);
			if (form.getAttribute('method') != 'POST')
				form.setAttribute('method', 'POST');
			if (form.getAttribute('action') != opts.url)
				form.setAttribute('action', opts.url);

			// ie borks in some cases when setting encoding
			if (! options.skipEncodingOverride) {
				$form.attr({
					encoding: 'multipart/form-data',
					enctype:  'multipart/form-data'
				});
			}

			// support timout
			if (opts.timeout)
				setTimeout(function() { timedOut = true; cb(); }, opts.timeout);

			// add "extra" data to form if provided in options
			var extraInputs = [];
			try {
				if (options.extraData)
					for (var n in options.extraData)
						extraInputs.push(
							jQuery('<input type="hidden" name="'+n+'" value="'+options.extraData[n]+'" />')
								.appendTo(form)[0]);

				// add iframe to doc and submit the form
				$io.appendTo('body');
				io.attachEvent ? io.attachEvent('onload', cb) : io.addEventListener('load', cb, false);
				form.submit();
			}
			finally {
				// reset attrs and remove "extra" input elements
				form.setAttribute('action',a);
				t ? form.setAttribute('target', t) : $form.removeAttr('target');
				jQuery(extraInputs).remove();
			}
		}, 10);

		var domCheckCount = 50;

		function cb() {
			if (cbInvoked++) return;

			io.detachEvent ? io.detachEvent('onload', cb) : io.removeEventListener('load', cb, false);

			var ok = true;
			try {
				if (timedOut) throw 'timeout';
				// extract the server response from the iframe
				var data, doc;

				doc = io.contentWindow ? io.contentWindow.document : io.contentDocument ? io.contentDocument : io.document;
				
				var isXml = opts.dataType == 'xml' || doc.XMLDocument || jQuery.isXMLDoc(doc);
				log('isXml='+isXml);
				if (!isXml && (doc.body == null || doc.body.innerHTML == '')) {
				 	if (--domCheckCount) {
						// in some browsers (Opera) the iframe DOM is not always traversable when
						// the onload callback fires, so we loop a bit to accommodate
						cbInvoked = 0;
						setTimeout(cb, 100);
						return;
					}
					log('Could not access iframe DOM after 50 tries.');
					return;
				}

				xhr.responseText = doc.body ? doc.body.innerHTML : null;
				xhr.responseXML = doc.XMLDocument ? doc.XMLDocument : doc;
				xhr.getResponseHeader = function(header){
					var headers = {'content-type': opts.dataType};
					return headers[header];
				};

				if (opts.dataType == 'json' || opts.dataType == 'script') {
					// see if user embedded response in textarea
					var ta = doc.getElementsByTagName('textarea')[0];
					if (ta)
						xhr.responseText = ta.value;
					else {
						// account for browsers injecting pre around json response
						var pre = doc.getElementsByTagName('pre')[0];
						if (pre)
							xhr.responseText = pre.innerHTML;
					}			  
				}
				else if (opts.dataType == 'xml' && !xhr.responseXML && xhr.responseText != null) {
					xhr.responseXML = toXml(xhr.responseText);
				}
				data = jQuery.httpData(xhr, opts.dataType);
			}
			catch(e){
				ok = false;
				jQuery.handleError(opts, xhr, 'error', e);
			}

			// ordering of these callbacks/triggers is odd, but that's how jQuery.ajax does it
			if (ok) {
				opts.success(data, 'success');
				if (g) jQuery.event.trigger("ajaxSuccess", [xhr, opts]);
			}
			if (g) jQuery.event.trigger("ajaxComplete", [xhr, opts]);
			if (g && ! --jQuery.active) jQuery.event.trigger("ajaxStop");
			if (opts.complete) opts.complete(xhr, ok ? 'success' : 'error');

			// clean up
			setTimeout(function() {
				$io.remove();
				xhr.responseXML = null;
			}, 100);
		};

		function toXml(s, doc) {
			if (window.ActiveXObject) {
				doc = new ActiveXObject('Microsoft.XMLDOM');
				doc.async = 'false';
				doc.loadXML(s);
			}
			else
				doc = (new DOMParser()).parseFromString(s, 'text/xml');
			return (doc && doc.documentElement && doc.documentElement.tagName != 'parsererror') ? doc : null;
		};
	};
};

/**
 * ajaxForm() provides a mechanism for fully automating form submission.
 *
 * The advantages of using this method instead of ajaxSubmit() are:
 *
 * 1: This method will include coordinates for <input type="image" /> elements (if the element
 *	is used to submit the form).
 * 2. This method will include the submit element's name/value data (for the element that was
 *	used to submit the form).
 * 3. This method binds the submit() method to the form for you.
 *
 * The options argument for ajaxForm works exactly as it does for ajaxSubmit.  ajaxForm merely
 * passes the options argument along after properly binding events for submit elements and
 * the form itself.
 */
jQuery.fn.ajaxForm = function(options) {
	return this.ajaxFormUnbind().bind('submit.form-plugin', function() {
		jQuery(this).ajaxSubmit(options);
		return false;
	}).bind('click.form-plugin', function(e) {
		var target = e.target;
		var $el = jQuery(target);
		if (!($el.is(":submit,input:image"))) {
			// is this a child element of the submit el?  (ex: a span within a button)
			var t = $el.closest(':submit');
			if (t.length == 0)
				return;
			target = t[0];
		}
		var form = this;
		form.clk = target;
		if (target.type == 'image') {
			if (e.offsetX != undefined) {
				form.clk_x = e.offsetX;
				form.clk_y = e.offsetY;
			} else if (typeof jQuery.fn.offset == 'function') { // try to use dimensions plugin
				var offset = $el.offset();
				form.clk_x = e.pageX - offset.left;
				form.clk_y = e.pageY - offset.top;
			} else {
				form.clk_x = e.pageX - target.offsetLeft;
				form.clk_y = e.pageY - target.offsetTop;
			}
		}
		// clear form vars
		setTimeout(function() { form.clk = form.clk_x = form.clk_y = null; }, 100);
	});
};

// ajaxFormUnbind unbinds the event handlers that were bound by ajaxForm
jQuery.fn.ajaxFormUnbind = function() {
	return this.unbind('submit.form-plugin click.form-plugin');
};

/**
 * formToArray() gathers form element data into an array of objects that can
 * be passed to any of the following ajax functions: jQuery.get, jQuery.post, or load.
 * Each object in the array has both a 'name' and 'value' property.  An example of
 * an array for a simple login form might be:
 *
 * [ { name: 'username', value: 'jresig' }, { name: 'password', value: 'secret' } ]
 *
 * It is this array that is passed to pre-submit callback functions provided to the
 * ajaxSubmit() and ajaxForm() methods.
 */
jQuery.fn.formToArray = function(semantic) {
	var a = [];
	if (this.length == 0) return a;

	var form = this[0];
	var els = semantic ? form.getElementsByTagName('*') : form.elements;
	if (!els) return a;
	for(var i=0, max=els.length; i < max; i++) {
		var el = els[i];
		var n = el.name;
		if (!n) continue;

		if (semantic && form.clk && el.type == "image") {
			// handle image inputs on the fly when semantic == true
			if(!el.disabled && form.clk == el) {
				a.push({name: n, value: jQuery(el).val()});
				a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
			}
			continue;
		}

		var v = jQuery.fieldValue(el, true);
		if (v && v.constructor == Array) {
			for(var j=0, jmax=v.length; j < jmax; j++)
				a.push({name: n, value: v[j]});
		}
		else if (v !== null && typeof v != 'undefined')
			a.push({name: n, value: v});
	}

	if (!semantic && form.clk) {
		// input type=='image' are not found in elements array! handle it here
		var $input = jQuery(form.clk), input = $input[0], n = input.name;
		if (n && !input.disabled && input.type == 'image') {
			a.push({name: n, value: $input.val()});
			a.push({name: n+'.x', value: form.clk_x}, {name: n+'.y', value: form.clk_y});
		}
	}
	return a;
};

/**
 * Serializes form data into a 'submittable' string. This method will return a string
 * in the format: name1=value1&amp;name2=value2
 */
jQuery.fn.formSerialize = function(semantic) {
	//hand off to jQuery.param for proper encoding
	return jQuery.param(this.formToArray(semantic));
};

/**
 * Serializes all field elements in the jQuery object into a query string.
 * This method will return a string in the format: name1=value1&amp;name2=value2
 */
jQuery.fn.fieldSerialize = function(successful) {
	var a = [];
	this.each(function() {
		var n = this.name;
		if (!n) return;
		var v = jQuery.fieldValue(this, successful);
		if (v && v.constructor == Array) {
			for (var i=0,max=v.length; i < max; i++)
				a.push({name: n, value: v[i]});
		}
		else if (v !== null && typeof v != 'undefined')
			a.push({name: this.name, value: v});
	});
	//hand off to jQuery.param for proper encoding
	return jQuery.param(a);
};

/**
 * Returns the value(s) of the element in the matched set.  For example, consider the following form:
 *
 *  <form><fieldset>
 *	  <input name="A" type="text" />
 *	  <input name="A" type="text" />
 *	  <input name="B" type="checkbox" value="B1" />
 *	  <input name="B" type="checkbox" value="B2"/>
 *	  <input name="C" type="radio" value="C1" />
 *	  <input name="C" type="radio" value="C2" />
 *  </fieldset></form>
 *
 *  var v = jQuery(':text').fieldValue();
 *  // if no values are entered into the text inputs
 *  v == ['','']
 *  // if values entered into the text inputs are 'foo' and 'bar'
 *  v == ['foo','bar']
 *
 *  var v = jQuery(':checkbox').fieldValue();
 *  // if neither checkbox is checked
 *  v === undefined
 *  // if both checkboxes are checked
 *  v == ['B1', 'B2']
 *
 *  var v = jQuery(':radio').fieldValue();
 *  // if neither radio is checked
 *  v === undefined
 *  // if first radio is checked
 *  v == ['C1']
 *
 * The successful argument controls whether or not the field element must be 'successful'
 * (per http://www.w3.org/TR/html4/interact/forms.html#successful-controls).
 * The default value of the successful argument is true.  If this value is false the value(s)
 * for each element is returned.
 *
 * Note: This method *always* returns an array.  If no valid value can be determined the
 *	   array will be empty, otherwise it will contain one or more values.
 */
jQuery.fn.fieldValue = function(successful) {
	for (var val=[], i=0, max=this.length; i < max; i++) {
		var el = this[i];
		var v = jQuery.fieldValue(el, successful);
		if (v === null || typeof v == 'undefined' || (v.constructor == Array && !v.length))
			continue;
		v.constructor == Array ? jQuery.merge(val, v) : val.push(v);
	}
	return val;
};

/**
 * Returns the value of the field element.
 */
jQuery.fieldValue = function(el, successful) {
	var n = el.name, t = el.type, tag = el.tagName.toLowerCase();
	if (typeof successful == 'undefined') successful = true;

	if (successful && (!n || el.disabled || t == 'reset' || t == 'button' ||
		(t == 'checkbox' || t == 'radio') && !el.checked ||
		(t == 'submit' || t == 'image') && el.form && el.form.clk != el ||
		tag == 'select' && el.selectedIndex == -1))
			return null;

	if (tag == 'select') {
		var index = el.selectedIndex;
		if (index < 0) return null;
		var a = [], ops = el.options;
		var one = (t == 'select-one');
		var max = (one ? index+1 : ops.length);
		for(var i=(one ? index : 0); i < max; i++) {
			var op = ops[i];
			if (op.selected) {
				var v = op.value;
				if (!v) // extra pain for IE...
					v = (op.attributes && op.attributes['value'] && !(op.attributes['value'].specified)) ? op.text : op.value;
				if (one) return v;
				a.push(v);
			}
		}
		return a;
	}
	return el.value;
};

/**
 * Clears the form data.  Takes the following actions on the form's input fields:
 *  - input text fields will have their 'value' property set to the empty string
 *  - select elements will have their 'selectedIndex' property set to -1
 *  - checkbox and radio inputs will have their 'checked' property set to false
 *  - inputs of type submit, button, reset, and hidden will *not* be effected
 *  - button elements will *not* be effected
 */
jQuery.fn.clearForm = function() {
	return this.each(function() {
		jQuery('input,select,textarea', this).clearFields();
	});
};

/**
 * Clears the selected form elements.
 */
jQuery.fn.clearFields = jQuery.fn.clearInputs = function() {
	return this.each(function() {
		var t = this.type, tag = this.tagName.toLowerCase();
		if (t == 'text' || t == 'password' || tag == 'textarea')
			this.value = '';
		else if (t == 'checkbox' || t == 'radio')
			this.checked = false;
		else if (tag == 'select')
			this.selectedIndex = -1;
	});
};

/**
 * Resets the form data.  Causes all form elements to be reset to their original value.
 */
jQuery.fn.resetForm = function() {
	return this.each(function() {
		// guard against an input with the name of 'reset'
		// note that IE reports the reset function as an 'object'
		if (typeof this.reset == 'function' || (typeof this.reset == 'object' && !this.reset.nodeType))
			this.reset();
	});
};

/**
 * Enables or disables any matching elements.
 */
jQuery.fn.enable = function(b) {
	if (b == undefined) b = true;
	return this.each(function() {
		this.disabled = !b;
	});
};

/**
 * Checks/unchecks any matching checkboxes or radio buttons and
 * selects/deselects and matching option elements.
 */
jQuery.fn.selected = function(select) {
	if (select == undefined) select = true;
	return this.each(function() {
		var t = this.type;
		if (t == 'checkbox' || t == 'radio')
			this.checked = select;
		else if (this.tagName.toLowerCase() == 'option') {
			var $sel = jQuery(this).parent('select');
			if (select && $sel[0] && $sel[0].type == 'select-one') {
				// deselect all other options
				$sel.find('option').selected(false);
			}
			this.selected = select;
		}
	});
};

// helper fn for console logging
// set jQuery.fn.ajaxSubmit.debug to true to enable debug logging
function log() {
	if (jQuery.fn.ajaxSubmit.debug && window.console && window.console.log)
		window.console.log('[jquery.form] ' + Array.prototype.join.call(arguments,''));
};

})(jQuery);


/*
 * jQuery UI Datepicker 1.7
 *
 * Copyright (c) 2009 AUTHORS.txt (http://jqueryui.com/about)
 * Dual licensed under the MIT (MIT-LICENSE.txt)
 * and GPL (GPL-LICENSE.txt) licenses.
 *
 * http://docs.jquery.com/UI/Datepicker
 *
 * Depends:
 *	ui.core.js
 */(function(jQuery){jQuery.extend(jQuery.ui,{datepicker:{version:"1.7"}});var PROP_NAME="datepicker";function Datepicker(){this.debug=false;this._curInst=null;this._keyEvent=false;this._disabledInputs=[];this._datepickerShowing=false;this._inDialog=false;this._mainDivId="ui-datepicker-div";this._inlineClass="ui-datepicker-inline";this._appendClass="ui-datepicker-append";this._triggerClass="ui-datepicker-trigger";this._dialogClass="ui-datepicker-dialog";this._disableClass="ui-datepicker-disabled";this._unselectableClass="ui-datepicker-unselectable";this._currentClass="ui-datepicker-current-day";this._dayOverClass="ui-datepicker-days-cell-over";this.regional=[];this.regional[""]={closeText:"Done",prevText:"Prev",nextText:"Next",currentText:"Today",monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],monthNamesShort:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],dayNamesShort:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],dayNamesMin:["Su","Mo","Tu","We","Th","Fr","Sa"],dateFormat:"mm/dd/yy",firstDay:0,isRTL:false};this._defaults={showOn:"focus",showAnim:"show",showOptions:{},defaultDate:null,appendText:"",buttonText:"...",buttonImage:"",buttonImageOnly:false,hideIfNoPrevNext:false,navigationAsDateFormat:false,gotoCurrent:false,changeMonth:false,changeYear:false,showMonthAfterYear:false,yearRange:"-10:+10",showOtherMonths:false,calculateWeek:this.iso8601Week,shortYearCutoff:"+10",minDate:null,maxDate:null,duration:"normal",beforeShowDay:null,beforeShow:null,onSelect:null,onChangeMonthYear:null,onClose:null,numberOfMonths:1,showCurrentAtPos:0,stepMonths:1,stepBigMonths:12,altField:"",altFormat:"",constrainInput:true,showButtonPanel:false};jQuery.extend(this._defaults,this.regional[""]);this.dpDiv=jQuery('<div id="'+this._mainDivId+'" class="ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all ui-helper-hidden-accessible"></div>')}jQuery.extend(Datepicker.prototype,{markerClassName:"hasDatepicker",log:function(){if(this.debug){console.log.apply("",arguments)}},setDefaults:function(settings){extendRemove(this._defaults,settings||{});return this},_attachDatepicker:function(target,settings){var inlineSettings=null;for(var attrName in this._defaults){var attrValue=target.getAttribute("date:"+attrName);if(attrValue){inlineSettings=inlineSettings||{};try{inlineSettings[attrName]=eval(attrValue)}catch(err){inlineSettings[attrName]=attrValue}}}var nodeName=target.nodeName.toLowerCase();var inline=(nodeName=="div"||nodeName=="span");if(!target.id){target.id="dp"+(++this.uuid)}var inst=this._newInst(jQuery(target),inline);inst.settings=jQuery.extend({},settings||{},inlineSettings||{});if(nodeName=="input"){this._connectDatepicker(target,inst)}else{if(inline){this._inlineDatepicker(target,inst)}}},_newInst:function(target,inline){var id=target[0].id.replace(/([:\[\]\.])/g,"\\\\$1");return{id:id,input:target,selectedDay:0,selectedMonth:0,selectedYear:0,drawMonth:0,drawYear:0,inline:inline,dpDiv:(!inline?this.dpDiv:jQuery('<div class="'+this._inlineClass+' ui-datepicker ui-widget ui-widget-content ui-helper-clearfix ui-corner-all"></div>'))}},_connectDatepicker:function(target,inst){var input=jQuery(target);if(input.hasClass(this.markerClassName)){return}var appendText=this._get(inst,"appendText");var isRTL=this._get(inst,"isRTL");if(appendText){input[isRTL?"before":"after"]('<span class="'+this._appendClass+'">'+appendText+"</span>")}var showOn=this._get(inst,"showOn");if(showOn=="focus"||showOn=="both"){input.focus(this._showDatepicker)}if(showOn=="button"||showOn=="both"){var buttonText=this._get(inst,"buttonText");var buttonImage=this._get(inst,"buttonImage");var trigger=jQuery(this._get(inst,"buttonImageOnly")?jQuery("<img/>").addClass(this._triggerClass).attr({src:buttonImage,alt:buttonText,title:buttonText}):jQuery('<button type="button"></button>').addClass(this._triggerClass).html(buttonImage==""?buttonText:jQuery("<img/>").attr({src:buttonImage,alt:buttonText,title:buttonText})));input[isRTL?"before":"after"](trigger);trigger.click(function(){if(jQuery.datepicker._datepickerShowing&&jQuery.datepicker._lastInput==target){jQuery.datepicker._hideDatepicker()}else{jQuery.datepicker._showDatepicker(target)}return false})}input.addClass(this.markerClassName).keydown(this._doKeyDown).keypress(this._doKeyPress).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});jQuery.data(target,PROP_NAME,inst)},_inlineDatepicker:function(target,inst){var divSpan=jQuery(target);if(divSpan.hasClass(this.markerClassName)){return}divSpan.addClass(this.markerClassName).append(inst.dpDiv).bind("setData.datepicker",function(event,key,value){inst.settings[key]=value}).bind("getData.datepicker",function(event,key){return this._get(inst,key)});jQuery.data(target,PROP_NAME,inst);this._setDate(inst,this._getDefaultDate(inst));this._updateDatepicker(inst);this._updateAlternate(inst)},_dialogDatepicker:function(input,dateText,onSelect,settings,pos){var inst=this._dialogInst;if(!inst){var id="dp"+(++this.uuid);this._dialogInput=jQuery('<input type="text" id="'+id+'" size="1" style="position: absolute; top: -100px;"/>');this._dialogInput.keydown(this._doKeyDown);jQuery("body").append(this._dialogInput);inst=this._dialogInst=this._newInst(this._dialogInput,false);inst.settings={};jQuery.data(this._dialogInput[0],PROP_NAME,inst)}extendRemove(inst.settings,settings||{});this._dialogInput.val(dateText);this._pos=(pos?(pos.length?pos:[pos.pageX,pos.pageY]):null);if(!this._pos){var browserWidth=window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth;var browserHeight=window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight;var scrollX=document.documentElement.scrollLeft||document.body.scrollLeft;var scrollY=document.documentElement.scrollTop||document.body.scrollTop;this._pos=[(browserWidth/2)-100+scrollX,(browserHeight/2)-150+scrollY]}this._dialogInput.css("left",this._pos[0]+"px").css("top",this._pos[1]+"px");inst.settings.onSelect=onSelect;this._inDialog=true;this.dpDiv.addClass(this._dialogClass);this._showDatepicker(this._dialogInput[0]);if(jQuery.blockUI){jQuery.blockUI(this.dpDiv)}jQuery.data(this._dialogInput[0],PROP_NAME,inst);return this},_destroyDatepicker:function(target){var $target=jQuery(target);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();jQuery.removeData(target,PROP_NAME);if(nodeName=="input"){$target.siblings("."+this._appendClass).remove().end().siblings("."+this._triggerClass).remove().end().removeClass(this.markerClassName).unbind("focus",this._showDatepicker).unbind("keydown",this._doKeyDown).unbind("keypress",this._doKeyPress)}else{if(nodeName=="div"||nodeName=="span"){$target.removeClass(this.markerClassName).empty()}}},_enableDatepicker:function(target){var $target=jQuery(target);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=false;$target.siblings("button."+this._triggerClass).each(function(){this.disabled=false}).end().siblings("img."+this._triggerClass).css({opacity:"1.0",cursor:""})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().removeClass("ui-state-disabled")}}this._disabledInputs=jQuery.map(this._disabledInputs,function(value){return(value==target?null:value)})},_disableDatepicker:function(target){var $target=jQuery(target);if(!$target.hasClass(this.markerClassName)){return}var nodeName=target.nodeName.toLowerCase();if(nodeName=="input"){target.disabled=true;$target.siblings("button."+this._triggerClass).each(function(){this.disabled=true}).end().siblings("img."+this._triggerClass).css({opacity:"0.5",cursor:"default"})}else{if(nodeName=="div"||nodeName=="span"){var inline=$target.children("."+this._inlineClass);inline.children().addClass("ui-state-disabled")}}this._disabledInputs=jQuery.map(this._disabledInputs,function(value){return(value==target?null:value)});this._disabledInputs[this._disabledInputs.length]=target},_isDisabledDatepicker:function(target){if(!target){return false}for(var i=0;i<this._disabledInputs.length;i++){if(this._disabledInputs[i]==target){return true}}return false},_getInst:function(target){try{return jQuery.data(target,PROP_NAME)}catch(err){throw"Missing instance data for this datepicker"}},_optionDatepicker:function(target,name,value){var settings=name||{};if(typeof name=="string"){settings={};settings[name]=value}var inst=this._getInst(target);if(inst){if(this._curInst==inst){this._hideDatepicker(null)}extendRemove(inst.settings,settings);var date=new Date();extendRemove(inst,{rangeStart:null,endDay:null,endMonth:null,endYear:null,selectedDay:date.getDate(),selectedMonth:date.getMonth(),selectedYear:date.getFullYear(),currentDay:date.getDate(),currentMonth:date.getMonth(),currentYear:date.getFullYear(),drawMonth:date.getMonth(),drawYear:date.getFullYear()});this._updateDatepicker(inst)}},_changeDatepicker:function(target,name,value){this._optionDatepicker(target,name,value)},_refreshDatepicker:function(target){var inst=this._getInst(target);if(inst){this._updateDatepicker(inst)}},_setDateDatepicker:function(target,date,endDate){var inst=this._getInst(target);if(inst){this._setDate(inst,date,endDate);this._updateDatepicker(inst);this._updateAlternate(inst)}},_getDateDatepicker:function(target){var inst=this._getInst(target);if(inst&&!inst.inline){this._setDateFromField(inst)}return(inst?this._getDate(inst):null)},_doKeyDown:function(event){var inst=jQuery.datepicker._getInst(event.target);var handled=true;var isRTL=inst.dpDiv.is(".ui-datepicker-rtl");inst._keyEvent=true;if(jQuery.datepicker._datepickerShowing){switch(event.keyCode){case 9:jQuery.datepicker._hideDatepicker(null,"");break;case 13:var sel=jQuery("td."+jQuery.datepicker._dayOverClass+", td."+jQuery.datepicker._currentClass,inst.dpDiv);if(sel[0]){jQuery.datepicker._selectDay(event.target,inst.selectedMonth,inst.selectedYear,sel[0])}else{jQuery.datepicker._hideDatepicker(null,jQuery.datepicker._get(inst,"duration"))}return false;break;case 27:jQuery.datepicker._hideDatepicker(null,jQuery.datepicker._get(inst,"duration"));break;case 33:jQuery.datepicker._adjustDate(event.target,(event.ctrlKey?-jQuery.datepicker._get(inst,"stepBigMonths"):-jQuery.datepicker._get(inst,"stepMonths")),"M");break;case 34:jQuery.datepicker._adjustDate(event.target,(event.ctrlKey?+jQuery.datepicker._get(inst,"stepBigMonths"):+jQuery.datepicker._get(inst,"stepMonths")),"M");break;case 35:if(event.ctrlKey||event.metaKey){jQuery.datepicker._clearDate(event.target)}handled=event.ctrlKey||event.metaKey;break;case 36:if(event.ctrlKey||event.metaKey){jQuery.datepicker._gotoToday(event.target)}handled=event.ctrlKey||event.metaKey;break;case 37:if(event.ctrlKey||event.metaKey){jQuery.datepicker._adjustDate(event.target,(isRTL?+1:-1),"D")}handled=event.ctrlKey||event.metaKey;if(event.originalEvent.altKey){jQuery.datepicker._adjustDate(event.target,(event.ctrlKey?-jQuery.datepicker._get(inst,"stepBigMonths"):-jQuery.datepicker._get(inst,"stepMonths")),"M")}break;case 38:if(event.ctrlKey||event.metaKey){jQuery.datepicker._adjustDate(event.target,-7,"D")}handled=event.ctrlKey||event.metaKey;break;case 39:if(event.ctrlKey||event.metaKey){jQuery.datepicker._adjustDate(event.target,(isRTL?-1:+1),"D")}handled=event.ctrlKey||event.metaKey;if(event.originalEvent.altKey){jQuery.datepicker._adjustDate(event.target,(event.ctrlKey?+jQuery.datepicker._get(inst,"stepBigMonths"):+jQuery.datepicker._get(inst,"stepMonths")),"M")}break;case 40:if(event.ctrlKey||event.metaKey){jQuery.datepicker._adjustDate(event.target,+7,"D")}handled=event.ctrlKey||event.metaKey;break;default:handled=false}}else{if(event.keyCode==36&&event.ctrlKey){jQuery.datepicker._showDatepicker(this)}else{handled=false}}if(handled){event.preventDefault();event.stopPropagation()}},_doKeyPress:function(event){var inst=jQuery.datepicker._getInst(event.target);if(jQuery.datepicker._get(inst,"constrainInput")){var chars=jQuery.datepicker._possibleChars(jQuery.datepicker._get(inst,"dateFormat"));var chr=String.fromCharCode(event.charCode==undefined?event.keyCode:event.charCode);return event.ctrlKey||(chr<" "||!chars||chars.indexOf(chr)>-1)}},_showDatepicker:function(input){input=input.target||input;if(input.nodeName.toLowerCase()!="input"){input=jQuery("input",input.parentNode)[0]}if(jQuery.datepicker._isDisabledDatepicker(input)||jQuery.datepicker._lastInput==input){return}var inst=jQuery.datepicker._getInst(input);var beforeShow=jQuery.datepicker._get(inst,"beforeShow");extendRemove(inst.settings,(beforeShow?beforeShow.apply(input,[input,inst]):{}));jQuery.datepicker._hideDatepicker(null,"");jQuery.datepicker._lastInput=input;jQuery.datepicker._setDateFromField(inst);if(jQuery.datepicker._inDialog){input.value=""}if(!jQuery.datepicker._pos){jQuery.datepicker._pos=jQuery.datepicker._findPos(input);jQuery.datepicker._pos[1]+=input.offsetHeight}var isFixed=false;jQuery(input).parents().each(function(){isFixed|=jQuery(this).css("position")=="fixed";return !isFixed});if(isFixed&&jQuery.browser.opera){jQuery.datepicker._pos[0]-=document.documentElement.scrollLeft;jQuery.datepicker._pos[1]-=document.documentElement.scrollTop}var offset={left:jQuery.datepicker._pos[0],top:jQuery.datepicker._pos[1]};jQuery.datepicker._pos=null;inst.rangeStart=null;inst.dpDiv.css({position:"absolute",display:"block",top:"-1000px"});jQuery.datepicker._updateDatepicker(inst);offset=jQuery.datepicker._checkOffset(inst,offset,isFixed);inst.dpDiv.css({position:(jQuery.datepicker._inDialog&&jQuery.blockUI?"static":(isFixed?"fixed":"absolute")),display:"none",left:offset.left+"px",top:offset.top+"px"});if(!inst.inline){var showAnim=jQuery.datepicker._get(inst,"showAnim")||"show";var duration=jQuery.datepicker._get(inst,"duration");var postProcess=function(){jQuery.datepicker._datepickerShowing=true;if(jQuery.browser.msie&&parseInt(jQuery.browser.version,10)<7){jQuery("iframe.ui-datepicker-cover").css({width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4})}};if(jQuery.effects&&jQuery.effects[showAnim]){inst.dpDiv.show(showAnim,jQuery.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[showAnim](duration,postProcess)}if(duration==""){postProcess()}if(inst.input[0].type!="hidden"){inst.input[0].focus()}jQuery.datepicker._curInst=inst}},_updateDatepicker:function(inst){var dims={width:inst.dpDiv.width()+4,height:inst.dpDiv.height()+4};var self=this;inst.dpDiv.empty().append(this._generateHTML(inst)).find("iframe.ui-datepicker-cover").css({width:dims.width,height:dims.height}).end().find("button, .ui-datepicker-prev, .ui-datepicker-next, .ui-datepicker-calendar td a").bind("mouseout",function(){jQuery(this).removeClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){jQuery(this).removeClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){jQuery(this).removeClass("ui-datepicker-next-hover")}}).bind("mouseover",function(){if(!self._isDisabledDatepicker(inst.inline?inst.dpDiv.parent()[0]:inst.input[0])){jQuery(this).parents(".ui-datepicker-calendar").find("a").removeClass("ui-state-hover");jQuery(this).addClass("ui-state-hover");if(this.className.indexOf("ui-datepicker-prev")!=-1){jQuery(this).addClass("ui-datepicker-prev-hover")}if(this.className.indexOf("ui-datepicker-next")!=-1){jQuery(this).addClass("ui-datepicker-next-hover")}}}).end().find("."+this._dayOverClass+" a").trigger("mouseover").end();var numMonths=this._getNumberOfMonths(inst);var cols=numMonths[1];var width=17;if(cols>1){inst.dpDiv.addClass("ui-datepicker-multi-"+cols).css("width",(width*cols)+"em")}else{inst.dpDiv.removeClass("ui-datepicker-multi-2 ui-datepicker-multi-3 ui-datepicker-multi-4").width("")}inst.dpDiv[(numMonths[0]!=1||numMonths[1]!=1?"add":"remove")+"Class"]("ui-datepicker-multi");inst.dpDiv[(this._get(inst,"isRTL")?"add":"remove")+"Class"]("ui-datepicker-rtl");if(inst.input&&inst.input[0].type!="hidden"&&inst==jQuery.datepicker._curInst){jQuery(inst.input[0]).focus()}},_checkOffset:function(inst,offset,isFixed){var dpWidth=inst.dpDiv.outerWidth();var dpHeight=inst.dpDiv.outerHeight();var inputWidth=inst.input?inst.input.outerWidth():0;var inputHeight=inst.input?inst.input.outerHeight():0;var viewWidth=(window.innerWidth||document.documentElement.clientWidth||document.body.clientWidth)+jQuery(document).scrollLeft();var viewHeight=(window.innerHeight||document.documentElement.clientHeight||document.body.clientHeight)+jQuery(document).scrollTop();offset.left-=(this._get(inst,"isRTL")?(dpWidth-inputWidth):0);offset.left-=(isFixed&&offset.left==inst.input.offset().left)?jQuery(document).scrollLeft():0;offset.top-=(isFixed&&offset.top==(inst.input.offset().top+inputHeight))?jQuery(document).scrollTop():0;offset.left-=(offset.left+dpWidth>viewWidth&&viewWidth>dpWidth)?Math.abs(offset.left+dpWidth-viewWidth):0;offset.top-=(offset.top+dpHeight>viewHeight&&viewHeight>dpHeight)?Math.abs(offset.top+dpHeight+inputHeight*2-viewHeight):0;return offset},_findPos:function(obj){while(obj&&(obj.type=="hidden"||obj.nodeType!=1)){obj=obj.nextSibling}var position=jQuery(obj).offset();return[position.left,position.top]},_hideDatepicker:function(input,duration){var inst=this._curInst;if(!inst||(input&&inst!=jQuery.data(input,PROP_NAME))){return}if(inst.stayOpen){this._selectDate("#"+inst.id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear))}inst.stayOpen=false;if(this._datepickerShowing){duration=(duration!=null?duration:this._get(inst,"duration"));var showAnim=this._get(inst,"showAnim");var postProcess=function(){jQuery.datepicker._tidyDialog(inst)};if(duration!=""&&jQuery.effects&&jQuery.effects[showAnim]){inst.dpDiv.hide(showAnim,jQuery.datepicker._get(inst,"showOptions"),duration,postProcess)}else{inst.dpDiv[(duration==""?"hide":(showAnim=="slideDown"?"slideUp":(showAnim=="fadeIn"?"fadeOut":"hide")))](duration,postProcess)}if(duration==""){this._tidyDialog(inst)}var onClose=this._get(inst,"onClose");if(onClose){onClose.apply((inst.input?inst.input[0]:null),[(inst.input?inst.input.val():""),inst])}this._datepickerShowing=false;this._lastInput=null;if(this._inDialog){this._dialogInput.css({position:"absolute",left:"0",top:"-100px"});if(jQuery.blockUI){jQuery.unblockUI();jQuery("body").append(this.dpDiv)}}this._inDialog=false}this._curInst=null},_tidyDialog:function(inst){inst.dpDiv.removeClass(this._dialogClass).unbind(".ui-datepicker-calendar")},_checkExternalClick:function(event){if(!jQuery.datepicker._curInst){return}var $target=jQuery(event.target);if(($target.parents("#"+jQuery.datepicker._mainDivId).length==0)&&!$target.hasClass(jQuery.datepicker.markerClassName)&&!$target.hasClass(jQuery.datepicker._triggerClass)&&jQuery.datepicker._datepickerShowing&&!(jQuery.datepicker._inDialog&&jQuery.blockUI)){jQuery.datepicker._hideDatepicker(null,"")}},_adjustDate:function(id,offset,period){var target=jQuery(id);var inst=this._getInst(target[0]);if(this._isDisabledDatepicker(target[0])){return}this._adjustInstDate(inst,offset+(period=="M"?this._get(inst,"showCurrentAtPos"):0),period);this._updateDatepicker(inst)},_gotoToday:function(id){var target=jQuery(id);var inst=this._getInst(target[0]);if(this._get(inst,"gotoCurrent")&&inst.currentDay){inst.selectedDay=inst.currentDay;inst.drawMonth=inst.selectedMonth=inst.currentMonth;inst.drawYear=inst.selectedYear=inst.currentYear}else{var date=new Date();inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear()}this._notifyChange(inst);this._adjustDate(target)},_selectMonthYear:function(id,select,period){var target=jQuery(id);var inst=this._getInst(target[0]);inst._selectingMonthYear=false;inst["selected"+(period=="M"?"Month":"Year")]=inst["draw"+(period=="M"?"Month":"Year")]=parseInt(select.options[select.selectedIndex].value,10);this._notifyChange(inst);this._adjustDate(target)},_clickMonthYear:function(id){var target=jQuery(id);var inst=this._getInst(target[0]);if(inst.input&&inst._selectingMonthYear&&!jQuery.browser.msie){inst.input[0].focus()}inst._selectingMonthYear=!inst._selectingMonthYear},_selectDay:function(id,month,year,td){var target=jQuery(id);if(jQuery(td).hasClass(this._unselectableClass)||this._isDisabledDatepicker(target[0])){return}var inst=this._getInst(target[0]);inst.selectedDay=inst.currentDay=jQuery("a",td).html();inst.selectedMonth=inst.currentMonth=month;inst.selectedYear=inst.currentYear=year;if(inst.stayOpen){inst.endDay=inst.endMonth=inst.endYear=null}this._selectDate(id,this._formatDate(inst,inst.currentDay,inst.currentMonth,inst.currentYear));if(inst.stayOpen){inst.rangeStart=this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay));this._updateDatepicker(inst)}},_clearDate:function(id){var target=jQuery(id);var inst=this._getInst(target[0]);inst.stayOpen=false;inst.endDay=inst.endMonth=inst.endYear=inst.rangeStart=null;this._selectDate(target,"")},_selectDate:function(id,dateStr){var target=jQuery(id);var inst=this._getInst(target[0]);dateStr=(dateStr!=null?dateStr:this._formatDate(inst));if(inst.input){inst.input.val(dateStr)}this._updateAlternate(inst);var onSelect=this._get(inst,"onSelect");if(onSelect){onSelect.apply((inst.input?inst.input[0]:null),[dateStr,inst])}else{if(inst.input){inst.input.trigger("change")}}if(inst.inline){this._updateDatepicker(inst)}else{if(!inst.stayOpen){this._hideDatepicker(null,this._get(inst,"duration"));this._lastInput=inst.input[0];if(typeof(inst.input[0])!="object"){inst.input[0].focus()}this._lastInput=null}}},_updateAlternate:function(inst){var altField=this._get(inst,"altField");if(altField){var altFormat=this._get(inst,"altFormat")||this._get(inst,"dateFormat");var date=this._getDate(inst);dateStr=this.formatDate(altFormat,date,this._getFormatConfig(inst));jQuery(altField).each(function(){jQuery(this).val(dateStr)})}},noWeekends:function(date){var day=date.getDay();return[(day>0&&day<6),""]},iso8601Week:function(date){var checkDate=new Date(date.getFullYear(),date.getMonth(),date.getDate());var firstMon=new Date(checkDate.getFullYear(),1-1,4);var firstDay=firstMon.getDay()||7;firstMon.setDate(firstMon.getDate()+1-firstDay);if(firstDay<4&&checkDate<firstMon){checkDate.setDate(checkDate.getDate()-3);return jQuery.datepicker.iso8601Week(checkDate)}else{if(checkDate>new Date(checkDate.getFullYear(),12-1,28)){firstDay=new Date(checkDate.getFullYear()+1,1-1,4).getDay()||7;if(firstDay>4&&(checkDate.getDay()||7)<firstDay-3){return 1}}}return Math.floor(((checkDate-firstMon)/86400000)/7)+1},parseDate:function(format,value,settings){if(format==null||value==null){throw"Invalid arguments"}value=(typeof value=="object"?value.toString():value+"");if(value==""){return null}var shortYearCutoff=(settings?settings.shortYearCutoff:null)||this._defaults.shortYearCutoff;var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var year=-1;var month=-1;var day=-1;var doy=-1;var literal=false;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var getNumber=function(match){lookAhead(match);var origSize=(match=="@"?14:(match=="y"?4:(match=="o"?3:2)));var size=origSize;var num=0;while(size>0&&iValue<value.length&&value.charAt(iValue)>="0"&&value.charAt(iValue)<="9"){num=num*10+parseInt(value.charAt(iValue++),10);size--}if(size==origSize){throw"Missing number at position "+iValue}return num};var getName=function(match,shortNames,longNames){var names=(lookAhead(match)?longNames:shortNames);var size=0;for(var j=0;j<names.length;j++){size=Math.max(size,names[j].length)}var name="";var iInit=iValue;while(size>0&&iValue<value.length){name+=value.charAt(iValue++);for(var i=0;i<names.length;i++){if(name==names[i]){return i+1}}size--}throw"Unknown name at position "+iInit};var checkLiteral=function(){if(value.charAt(iValue)!=format.charAt(iFormat)){throw"Unexpected literal at position "+iValue}iValue++};var iValue=0;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{checkLiteral()}}else{switch(format.charAt(iFormat)){case"d":day=getNumber("d");break;case"D":getName("D",dayNamesShort,dayNames);break;case"o":doy=getNumber("o");break;case"m":month=getNumber("m");break;case"M":month=getName("M",monthNamesShort,monthNames);break;case"y":year=getNumber("y");break;case"@":var date=new Date(getNumber("@"));year=date.getFullYear();month=date.getMonth()+1;day=date.getDate();break;case"'":if(lookAhead("'")){checkLiteral()}else{literal=true}break;default:checkLiteral()}}}if(year==-1){year=new Date().getFullYear()}else{if(year<100){year+=new Date().getFullYear()-new Date().getFullYear()%100+(year<=shortYearCutoff?0:-100)}}if(doy>-1){month=1;day=doy;do{var dim=this._getDaysInMonth(year,month-1);if(day<=dim){break}month++;day-=dim}while(true)}var date=this._daylightSavingAdjust(new Date(year,month-1,day));if(date.getFullYear()!=year||date.getMonth()+1!=month||date.getDate()!=day){throw"Invalid date"}return date},ATOM:"yy-mm-dd",COOKIE:"D, dd M yy",ISO_8601:"yy-mm-dd",RFC_822:"D, d M y",RFC_850:"DD, dd-M-y",RFC_1036:"D, d M y",RFC_1123:"D, d M yy",RFC_2822:"D, d M yy",RSS:"D, d M y",TIMESTAMP:"@",W3C:"yy-mm-dd",formatDate:function(format,date,settings){if(!date){return""}var dayNamesShort=(settings?settings.dayNamesShort:null)||this._defaults.dayNamesShort;var dayNames=(settings?settings.dayNames:null)||this._defaults.dayNames;var monthNamesShort=(settings?settings.monthNamesShort:null)||this._defaults.monthNamesShort;var monthNames=(settings?settings.monthNames:null)||this._defaults.monthNames;var lookAhead=function(match){var matches=(iFormat+1<format.length&&format.charAt(iFormat+1)==match);if(matches){iFormat++}return matches};var formatNumber=function(match,value,len){var num=""+value;if(lookAhead(match)){while(num.length<len){num="0"+num}}return num};var formatName=function(match,value,shortNames,longNames){return(lookAhead(match)?longNames[value]:shortNames[value])};var output="";var literal=false;if(date){for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{output+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":output+=formatNumber("d",date.getDate(),2);break;case"D":output+=formatName("D",date.getDay(),dayNamesShort,dayNames);break;case"o":var doy=date.getDate();for(var m=date.getMonth()-1;m>=0;m--){doy+=this._getDaysInMonth(date.getFullYear(),m)}output+=formatNumber("o",doy,3);break;case"m":output+=formatNumber("m",date.getMonth()+1,2);break;case"M":output+=formatName("M",date.getMonth(),monthNamesShort,monthNames);break;case"y":output+=(lookAhead("y")?date.getFullYear():(date.getYear()%100<10?"0":"")+date.getYear()%100);break;case"@":output+=date.getTime();break;case"'":if(lookAhead("'")){output+="'"}else{literal=true}break;default:output+=format.charAt(iFormat)}}}}return output},_possibleChars:function(format){var chars="";var literal=false;for(var iFormat=0;iFormat<format.length;iFormat++){if(literal){if(format.charAt(iFormat)=="'"&&!lookAhead("'")){literal=false}else{chars+=format.charAt(iFormat)}}else{switch(format.charAt(iFormat)){case"d":case"m":case"y":case"@":chars+="0123456789";break;case"D":case"M":return null;case"'":if(lookAhead("'")){chars+="'"}else{literal=true}break;default:chars+=format.charAt(iFormat)}}}return chars},_get:function(inst,name){return inst.settings[name]!==undefined?inst.settings[name]:this._defaults[name]},_setDateFromField:function(inst){var dateFormat=this._get(inst,"dateFormat");var dates=inst.input?inst.input.val():null;inst.endDay=inst.endMonth=inst.endYear=null;var date=defaultDate=this._getDefaultDate(inst);var settings=this._getFormatConfig(inst);try{date=this.parseDate(dateFormat,dates,settings)||defaultDate}catch(event){this.log(event);date=defaultDate}inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();inst.currentDay=(dates?date.getDate():0);inst.currentMonth=(dates?date.getMonth():0);inst.currentYear=(dates?date.getFullYear():0);this._adjustInstDate(inst)},_getDefaultDate:function(inst){var date=this._determineDate(this._get(inst,"defaultDate"),new Date());var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);return date},_determineDate:function(date,defaultDate){var offsetNumeric=function(offset){var date=new Date();date.setDate(date.getDate()+offset);return date};var offsetString=function(offset,getDaysInMonth){var date=new Date();var year=date.getFullYear();var month=date.getMonth();var day=date.getDate();var pattern=/([+-]?[0-9]+)\s*(d|D|w|W|m|M|y|Y)?/g;var matches=pattern.exec(offset);while(matches){switch(matches[2]||"d"){case"d":case"D":day+=parseInt(matches[1],10);break;case"w":case"W":day+=parseInt(matches[1],10)*7;break;case"m":case"M":month+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break;case"y":case"Y":year+=parseInt(matches[1],10);day=Math.min(day,getDaysInMonth(year,month));break}matches=pattern.exec(offset)}return new Date(year,month,day)};date=(date==null?defaultDate:(typeof date=="string"?offsetString(date,this._getDaysInMonth):(typeof date=="number"?(isNaN(date)?defaultDate:offsetNumeric(date)):date)));date=(date&&date.toString()=="Invalid Date"?defaultDate:date);if(date){date.setHours(0);date.setMinutes(0);date.setSeconds(0);date.setMilliseconds(0)}return this._daylightSavingAdjust(date)},_daylightSavingAdjust:function(date){if(!date){return null}date.setHours(date.getHours()>12?date.getHours()+2:0);return date},_setDate:function(inst,date,endDate){var clear=!(date);var origMonth=inst.selectedMonth;var origYear=inst.selectedYear;date=this._determineDate(date,new Date());inst.selectedDay=inst.currentDay=date.getDate();inst.drawMonth=inst.selectedMonth=inst.currentMonth=date.getMonth();inst.drawYear=inst.selectedYear=inst.currentYear=date.getFullYear();if(origMonth!=inst.selectedMonth||origYear!=inst.selectedYear){this._notifyChange(inst)}this._adjustInstDate(inst);if(inst.input){inst.input.val(clear?"":this._formatDate(inst))}},_getDate:function(inst){var startDate=(!inst.currentYear||(inst.input&&inst.input.val()=="")?null:this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return startDate},_generateHTML:function(inst){var today=new Date();today=this._daylightSavingAdjust(new Date(today.getFullYear(),today.getMonth(),today.getDate()));var isRTL=this._get(inst,"isRTL");var showButtonPanel=this._get(inst,"showButtonPanel");var hideIfNoPrevNext=this._get(inst,"hideIfNoPrevNext");var navigationAsDateFormat=this._get(inst,"navigationAsDateFormat");var numMonths=this._getNumberOfMonths(inst);var showCurrentAtPos=this._get(inst,"showCurrentAtPos");var stepMonths=this._get(inst,"stepMonths");var stepBigMonths=this._get(inst,"stepBigMonths");var isMultiMonth=(numMonths[0]!=1||numMonths[1]!=1);var currentDate=this._daylightSavingAdjust((!inst.currentDay?new Date(9999,9,9):new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");var drawMonth=inst.drawMonth-showCurrentAtPos;var drawYear=inst.drawYear;if(drawMonth<0){drawMonth+=12;drawYear--}if(maxDate){var maxDraw=this._daylightSavingAdjust(new Date(maxDate.getFullYear(),maxDate.getMonth()-numMonths[1]+1,maxDate.getDate()));maxDraw=(minDate&&maxDraw<minDate?minDate:maxDraw);while(this._daylightSavingAdjust(new Date(drawYear,drawMonth,1))>maxDraw){drawMonth--;if(drawMonth<0){drawMonth=11;drawYear--}}}inst.drawMonth=drawMonth;inst.drawYear=drawYear;var prevText=this._get(inst,"prevText");prevText=(!navigationAsDateFormat?prevText:this.formatDate(prevText,this._daylightSavingAdjust(new Date(drawYear,drawMonth-stepMonths,1)),this._getFormatConfig(inst)));var prev=(this._canAdjustMonth(inst,-1,drawYear,drawMonth)?'<a class="ui-datepicker-prev ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#'+inst.id+"', -"+stepMonths+", 'M');\" title=\""+prevText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"e":"w")+'">'+prevText+"</span></a>":(hideIfNoPrevNext?"":'<a class="ui-datepicker-prev ui-corner-all ui-state-disabled" title="'+prevText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"e":"w")+'">'+prevText+"</span></a>"));var nextText=this._get(inst,"nextText");nextText=(!navigationAsDateFormat?nextText:this.formatDate(nextText,this._daylightSavingAdjust(new Date(drawYear,drawMonth+stepMonths,1)),this._getFormatConfig(inst)));var next=(this._canAdjustMonth(inst,+1,drawYear,drawMonth)?'<a class="ui-datepicker-next ui-corner-all" onclick="DP_jQuery.datepicker._adjustDate(\'#'+inst.id+"', +"+stepMonths+", 'M');\" title=\""+nextText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"w":"e")+'">'+nextText+"</span></a>":(hideIfNoPrevNext?"":'<a class="ui-datepicker-next ui-corner-all ui-state-disabled" title="'+nextText+'"><span class="ui-icon ui-icon-circle-triangle-'+(isRTL?"w":"e")+'">'+nextText+"</span></a>"));var currentText=this._get(inst,"currentText");var gotoDate=(this._get(inst,"gotoCurrent")&&inst.currentDay?currentDate:today);currentText=(!navigationAsDateFormat?currentText:this.formatDate(currentText,gotoDate,this._getFormatConfig(inst)));var controls=(!inst.inline?'<button type="button" class="ui-datepicker-close ui-state-default ui-priority-primary ui-corner-all" onclick="DP_jQuery.datepicker._hideDatepicker();">'+this._get(inst,"closeText")+"</button>":"");var buttonPanel=(showButtonPanel)?'<div class="ui-datepicker-buttonpane ui-widget-content">'+(isRTL?controls:"")+(this._isInRange(inst,gotoDate)?'<button type="button" class="ui-datepicker-current ui-state-default ui-priority-secondary ui-corner-all" onclick="DP_jQuery.datepicker._gotoToday(\'#'+inst.id+"');\">"+currentText+"</button>":"")+(isRTL?"":controls)+"</div>":"";var firstDay=parseInt(this._get(inst,"firstDay"),10);firstDay=(isNaN(firstDay)?0:firstDay);var dayNames=this._get(inst,"dayNames");var dayNamesShort=this._get(inst,"dayNamesShort");var dayNamesMin=this._get(inst,"dayNamesMin");var monthNames=this._get(inst,"monthNames");var monthNamesShort=this._get(inst,"monthNamesShort");var beforeShowDay=this._get(inst,"beforeShowDay");var showOtherMonths=this._get(inst,"showOtherMonths");var calculateWeek=this._get(inst,"calculateWeek")||this.iso8601Week;var endDate=inst.endDay?this._daylightSavingAdjust(new Date(inst.endYear,inst.endMonth,inst.endDay)):currentDate;var defaultDate=this._getDefaultDate(inst);var html="";for(var row=0;row<numMonths[0];row++){var group="";for(var col=0;col<numMonths[1];col++){var selectedDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,inst.selectedDay));var cornerClass=" ui-corner-all";var calender="";if(isMultiMonth){calender+='<div class="ui-datepicker-group ui-datepicker-group-';switch(col){case 0:calender+="first";cornerClass=" ui-corner-"+(isRTL?"right":"left");break;case numMonths[1]-1:calender+="last";cornerClass=" ui-corner-"+(isRTL?"left":"right");break;default:calender+="middle";cornerClass="";break}calender+='">'}calender+='<div class="ui-datepicker-header ui-widget-header ui-helper-clearfix'+cornerClass+'">'+(/all|left/.test(cornerClass)&&row==0?(isRTL?next:prev):"")+(/all|right/.test(cornerClass)&&row==0?(isRTL?prev:next):"")+this._generateMonthYearHeader(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,row>0||col>0,monthNames,monthNamesShort)+'</div><table class="ui-datepicker-calendar"><thead><tr>';var thead="";for(var dow=0;dow<7;dow++){var day=(dow+firstDay)%7;thead+="<th"+((dow+firstDay+6)%7>=5?' class="ui-datepicker-week-end"':"")+'><span title="'+dayNames[day]+'">'+dayNamesMin[day]+"</span></th>"}calender+=thead+"</tr></thead><tbody>";var daysInMonth=this._getDaysInMonth(drawYear,drawMonth);if(drawYear==inst.selectedYear&&drawMonth==inst.selectedMonth){inst.selectedDay=Math.min(inst.selectedDay,daysInMonth)}var leadDays=(this._getFirstDayOfMonth(drawYear,drawMonth)-firstDay+7)%7;var numRows=(isMultiMonth?6:Math.ceil((leadDays+daysInMonth)/7));var printDate=this._daylightSavingAdjust(new Date(drawYear,drawMonth,1-leadDays));for(var dRow=0;dRow<numRows;dRow++){calender+="<tr>";var tbody="";for(var dow=0;dow<7;dow++){var daySettings=(beforeShowDay?beforeShowDay.apply((inst.input?inst.input[0]:null),[printDate]):[true,""]);var otherMonth=(printDate.getMonth()!=drawMonth);var unselectable=otherMonth||!daySettings[0]||(minDate&&printDate<minDate)||(maxDate&&printDate>maxDate);tbody+='<td class="'+((dow+firstDay+6)%7>=5?" ui-datepicker-week-end":"")+(otherMonth?" ui-datepicker-other-month":"")+((printDate.getTime()==selectedDate.getTime()&&drawMonth==inst.selectedMonth&&inst._keyEvent)||(defaultDate.getTime()==printDate.getTime()&&defaultDate.getTime()==selectedDate.getTime())?" "+this._dayOverClass:"")+(unselectable?" "+this._unselectableClass+" ui-state-disabled":"")+(otherMonth&&!showOtherMonths?"":" "+daySettings[1]+(printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" "+this._currentClass:"")+(printDate.getTime()==today.getTime()?" ui-datepicker-today":""))+'"'+((!otherMonth||showOtherMonths)&&daySettings[2]?' title="'+daySettings[2]+'"':"")+(unselectable?"":" onclick=\"DP_jQuery.datepicker._selectDay('#"+inst.id+"',"+drawMonth+","+drawYear+', this);return false;"')+">"+(otherMonth?(showOtherMonths?printDate.getDate():"&#xa0;"):(unselectable?'<span class="ui-state-default">'+printDate.getDate()+"</span>":'<a class="ui-state-default'+(printDate.getTime()==today.getTime()?" ui-state-highlight":"")+(printDate.getTime()>=currentDate.getTime()&&printDate.getTime()<=endDate.getTime()?" ui-state-active":"")+'" href="#">'+printDate.getDate()+"</a>"))+"</td>";printDate.setDate(printDate.getDate()+1);printDate=this._daylightSavingAdjust(printDate)}calender+=tbody+"</tr>"}drawMonth++;if(drawMonth>11){drawMonth=0;drawYear++}calender+="</tbody></table>"+(isMultiMonth?"</div>"+((numMonths[0]>0&&col==numMonths[1]-1)?'<div class="ui-datepicker-row-break"></div>':""):"");group+=calender}html+=group}html+=buttonPanel+(jQuery.browser.msie&&parseInt(jQuery.browser.version,10)<7&&!inst.inline?'<iframe src="javascript:false;" class="ui-datepicker-cover" frameborder="0"></iframe>':"");inst._keyEvent=false;return html},_generateMonthYearHeader:function(inst,drawMonth,drawYear,minDate,maxDate,selectedDate,secondary,monthNames,monthNamesShort){minDate=(inst.rangeStart&&minDate&&selectedDate<minDate?selectedDate:minDate);var changeMonth=this._get(inst,"changeMonth");var changeYear=this._get(inst,"changeYear");var showMonthAfterYear=this._get(inst,"showMonthAfterYear");var html='<div class="ui-datepicker-title">';var monthHtml="";if(secondary||!changeMonth){monthHtml+='<span class="ui-datepicker-month">'+monthNames[drawMonth]+"</span> "}else{var inMinYear=(minDate&&minDate.getFullYear()==drawYear);var inMaxYear=(maxDate&&maxDate.getFullYear()==drawYear);monthHtml+='<select class="ui-datepicker-month" onchange="DP_jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'M');\" onclick=\"DP_jQuery.datepicker._clickMonthYear('#"+inst.id+"');\">";for(var month=0;month<12;month++){if((!inMinYear||month>=minDate.getMonth())&&(!inMaxYear||month<=maxDate.getMonth())){monthHtml+='<option value="'+month+'"'+(month==drawMonth?' selected="selected"':"")+">"+monthNamesShort[month]+"</option>"}}monthHtml+="</select>"}if(!showMonthAfterYear){html+=monthHtml+((secondary||changeMonth||changeYear)&&(!(changeMonth&&changeYear))?"&#xa0;":"")}if(secondary||!changeYear){html+='<span class="ui-datepicker-year">'+drawYear+"</span>"}else{var years=this._get(inst,"yearRange").split(":");var year=0;var endYear=0;if(years.length!=2){year=drawYear-10;endYear=drawYear+10}else{if(years[0].charAt(0)=="+"||years[0].charAt(0)=="-"){year=drawYear+parseInt(years[0],10);endYear=drawYear+parseInt(years[1],10)}else{year=parseInt(years[0],10);endYear=parseInt(years[1],10)}}year=(minDate?Math.max(year,minDate.getFullYear()):year);endYear=(maxDate?Math.min(endYear,maxDate.getFullYear()):endYear);html+='<select class="ui-datepicker-year" onchange="DP_jQuery.datepicker._selectMonthYear(\'#'+inst.id+"', this, 'Y');\" onclick=\"DP_jQuery.datepicker._clickMonthYear('#"+inst.id+"');\">";for(;year<=endYear;year++){html+='<option value="'+year+'"'+(year==drawYear?' selected="selected"':"")+">"+year+"</option>"}html+="</select>"}if(showMonthAfterYear){html+=(secondary||changeMonth||changeYear?"&#xa0;":"")+monthHtml}html+="</div>";return html},_adjustInstDate:function(inst,offset,period){var year=inst.drawYear+(period=="Y"?offset:0);var month=inst.drawMonth+(period=="M"?offset:0);var day=Math.min(inst.selectedDay,this._getDaysInMonth(year,month))+(period=="D"?offset:0);var date=this._daylightSavingAdjust(new Date(year,month,day));var minDate=this._getMinMaxDate(inst,"min",true);var maxDate=this._getMinMaxDate(inst,"max");date=(minDate&&date<minDate?minDate:date);date=(maxDate&&date>maxDate?maxDate:date);inst.selectedDay=date.getDate();inst.drawMonth=inst.selectedMonth=date.getMonth();inst.drawYear=inst.selectedYear=date.getFullYear();if(period=="M"||period=="Y"){this._notifyChange(inst)}},_notifyChange:function(inst){var onChange=this._get(inst,"onChangeMonthYear");if(onChange){onChange.apply((inst.input?inst.input[0]:null),[inst.selectedYear,inst.selectedMonth+1,inst])}},_getNumberOfMonths:function(inst){var numMonths=this._get(inst,"numberOfMonths");return(numMonths==null?[1,1]:(typeof numMonths=="number"?[1,numMonths]:numMonths))},_getMinMaxDate:function(inst,minMax,checkRange){var date=this._determineDate(this._get(inst,minMax+"Date"),null);return(!checkRange||!inst.rangeStart?date:(!date||inst.rangeStart>date?inst.rangeStart:date))},_getDaysInMonth:function(year,month){return 32-new Date(year,month,32).getDate()},_getFirstDayOfMonth:function(year,month){return new Date(year,month,1).getDay()},_canAdjustMonth:function(inst,offset,curYear,curMonth){var numMonths=this._getNumberOfMonths(inst);var date=this._daylightSavingAdjust(new Date(curYear,curMonth+(offset<0?offset:numMonths[1]),1));if(offset<0){date.setDate(this._getDaysInMonth(date.getFullYear(),date.getMonth()))}return this._isInRange(inst,date)},_isInRange:function(inst,date){var newMinDate=(!inst.rangeStart?null:this._daylightSavingAdjust(new Date(inst.selectedYear,inst.selectedMonth,inst.selectedDay)));newMinDate=(newMinDate&&inst.rangeStart<newMinDate?inst.rangeStart:newMinDate);var minDate=newMinDate||this._getMinMaxDate(inst,"min");var maxDate=this._getMinMaxDate(inst,"max");return((!minDate||date>=minDate)&&(!maxDate||date<=maxDate))},_getFormatConfig:function(inst){var shortYearCutoff=this._get(inst,"shortYearCutoff");shortYearCutoff=(typeof shortYearCutoff!="string"?shortYearCutoff:new Date().getFullYear()%100+parseInt(shortYearCutoff,10));return{shortYearCutoff:shortYearCutoff,dayNamesShort:this._get(inst,"dayNamesShort"),dayNames:this._get(inst,"dayNames"),monthNamesShort:this._get(inst,"monthNamesShort"),monthNames:this._get(inst,"monthNames")}},_formatDate:function(inst,day,month,year){if(!day){inst.currentDay=inst.selectedDay;inst.currentMonth=inst.selectedMonth;inst.currentYear=inst.selectedYear}var date=(day?(typeof day=="object"?day:this._daylightSavingAdjust(new Date(year,month,day))):this._daylightSavingAdjust(new Date(inst.currentYear,inst.currentMonth,inst.currentDay)));return this.formatDate(this._get(inst,"dateFormat"),date,this._getFormatConfig(inst))}});function extendRemove(target,props){jQuery.extend(target,props);for(var name in props){if(props[name]==null||props[name]==undefined){target[name]=props[name]}}return target}function isArray(a){return(a&&((jQuery.browser.safari&&typeof a=="object"&&a.length)||(a.constructor&&a.constructor.toString().match(/\Array\(\)/))))}jQuery.fn.datepicker=function(options){if(!jQuery.datepicker.initialized){jQuery(document).mousedown(jQuery.datepicker._checkExternalClick).find("body").append(jQuery.datepicker.dpDiv);jQuery.datepicker.initialized=true}var otherArgs=Array.prototype.slice.call(arguments,1);if(typeof options=="string"&&(options=="isDisabled"||options=="getDate")){return jQuery.datepicker["_"+options+"Datepicker"].apply(jQuery.datepicker,[this[0]].concat(otherArgs))}return this.each(function(){typeof options=="string"?jQuery.datepicker["_"+options+"Datepicker"].apply(jQuery.datepicker,[this].concat(otherArgs)):jQuery.datepicker._attachDatepicker(this,options)})};jQuery.datepicker=new Datepicker();jQuery.datepicker.initialized=false;jQuery.datepicker.uuid=new Date().getTime();jQuery.datepicker.version="1.7";window.DP_jQuery=$})(jQuery);;/**
 * Version: 1.0 Alpha-1 
 * Build Date: 13-Nov-2007
 * Copyright (c) 2006-2007, Coolite Inc. (http://www.coolite.com/). All rights reserved.
 * License: Licensed under The MIT License. See license.txt and http://www.datejs.com/license/. 
 * Website: http://www.datejs.com/ or http://www.coolite.com/datejs/
 */
Date.CultureInfo={name:"en-US",englishName:"English (United States)",nativeName:"English (United States)",dayNames:["Sunday","Monday","Tuesday","Wednesday","Thursday","Friday","Saturday"],abbreviatedDayNames:["Sun","Mon","Tue","Wed","Thu","Fri","Sat"],shortestDayNames:["Su","Mo","Tu","We","Th","Fr","Sa"],firstLetterDayNames:["S","M","T","W","T","F","S"],monthNames:["January","February","March","April","May","June","July","August","September","October","November","December"],abbreviatedMonthNames:["Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec"],amDesignator:"AM",pmDesignator:"PM",firstDayOfWeek:0,twoDigitYearMax:2029,dateElementOrder:"mdy",formatPatterns:{shortDate:"M/d/yyyy",longDate:"dddd, MMMM dd, yyyy",shortTime:"h:mm tt",longTime:"h:mm:ss tt",fullDateTime:"dddd, MMMM dd, yyyy h:mm:ss tt",sortableDateTime:"yyyy-MM-ddTHH:mm:ss",universalSortableDateTime:"yyyy-MM-dd HH:mm:ssZ",rfc1123:"ddd, dd MMM yyyy HH:mm:ss GMT",monthDay:"MMMM dd",yearMonth:"MMMM, yyyy"},regexPatterns:{jan:/^jan(uary)?/i,feb:/^feb(ruary)?/i,mar:/^mar(ch)?/i,apr:/^apr(il)?/i,may:/^may/i,jun:/^jun(e)?/i,jul:/^jul(y)?/i,aug:/^aug(ust)?/i,sep:/^sep(t(ember)?)?/i,oct:/^oct(ober)?/i,nov:/^nov(ember)?/i,dec:/^dec(ember)?/i,sun:/^su(n(day)?)?/i,mon:/^mo(n(day)?)?/i,tue:/^tu(e(s(day)?)?)?/i,wed:/^we(d(nesday)?)?/i,thu:/^th(u(r(s(day)?)?)?)?/i,fri:/^fr(i(day)?)?/i,sat:/^sa(t(urday)?)?/i,future:/^next/i,past:/^last|past|prev(ious)?/i,add:/^(\+|after|from)/i,subtract:/^(\-|before|ago)/i,yesterday:/^yesterday/i,today:/^t(oday)?/i,tomorrow:/^tomorrow/i,now:/^n(ow)?/i,millisecond:/^ms|milli(second)?s?/i,second:/^sec(ond)?s?/i,minute:/^min(ute)?s?/i,hour:/^h(ou)?rs?/i,week:/^w(ee)?k/i,month:/^m(o(nth)?s?)?/i,day:/^d(ays?)?/i,year:/^y((ea)?rs?)?/i,shortMeridian:/^(a|p)/i,longMeridian:/^(a\.?m?\.?|p\.?m?\.?)/i,timezone:/^((e(s|d)t|c(s|d)t|m(s|d)t|p(s|d)t)|((gmt)?\s*(\+|\-)\s*\d\d\d\d?)|gmt)/i,ordinalSuffix:/^\s*(st|nd|rd|th)/i,timeContext:/^\s*(\:|a|p)/i},abbreviatedTimeZoneStandard:{GMT:"-000",EST:"-0400",CST:"-0500",MST:"-0600",PST:"-0700"},abbreviatedTimeZoneDST:{GMT:"-000",EDT:"-0500",CDT:"-0600",MDT:"-0700",PDT:"-0800"}};
Date.getMonthNumberFromName=function(name){var n=Date.CultureInfo.monthNames,m=Date.CultureInfo.abbreviatedMonthNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s){return i;}}
return-1;};Date.getDayNumberFromName=function(name){var n=Date.CultureInfo.dayNames,m=Date.CultureInfo.abbreviatedDayNames,o=Date.CultureInfo.shortestDayNames,s=name.toLowerCase();for(var i=0;i<n.length;i++){if(n[i].toLowerCase()==s||m[i].toLowerCase()==s){return i;}}
return-1;};Date.isLeapYear=function(year){return(((year%4===0)&&(year%100!==0))||(year%400===0));};Date.getDaysInMonth=function(year,month){return[31,(Date.isLeapYear(year)?29:28),31,30,31,30,31,31,30,31,30,31][month];};Date.getTimezoneOffset=function(s,dst){return(dst||false)?Date.CultureInfo.abbreviatedTimeZoneDST[s.toUpperCase()]:Date.CultureInfo.abbreviatedTimeZoneStandard[s.toUpperCase()];};Date.getTimezoneAbbreviation=function(offset,dst){var n=(dst||false)?Date.CultureInfo.abbreviatedTimeZoneDST:Date.CultureInfo.abbreviatedTimeZoneStandard,p;for(p in n){if(n[p]===offset){return p;}}
return null;};Date.prototype.clone=function(){return new Date(this.getTime());};Date.prototype.compareTo=function(date){if(isNaN(this)){throw new Error(this);}
if(date instanceof Date&&!isNaN(date)){return(this>date)?1:(this<date)?-1:0;}else{throw new TypeError(date);}};Date.prototype.equals=function(date){return(this.compareTo(date)===0);};Date.prototype.between=function(start,end){var t=this.getTime();return t>=start.getTime()&&t<=end.getTime();};Date.prototype.addMilliseconds=function(value){this.setMilliseconds(this.getMilliseconds()+value);return this;};Date.prototype.addSeconds=function(value){return this.addMilliseconds(value*1000);};Date.prototype.addMinutes=function(value){return this.addMilliseconds(value*60000);};Date.prototype.addHours=function(value){return this.addMilliseconds(value*3600000);};Date.prototype.addDays=function(value){return this.addMilliseconds(value*86400000);};Date.prototype.addWeeks=function(value){return this.addMilliseconds(value*604800000);};Date.prototype.addMonths=function(value){var n=this.getDate();this.setDate(1);this.setMonth(this.getMonth()+value);this.setDate(Math.min(n,this.getDaysInMonth()));return this;};Date.prototype.addYears=function(value){return this.addMonths(value*12);};Date.prototype.add=function(config){if(typeof config=="number"){this._orient=config;return this;}
var x=config;if(x.millisecond||x.milliseconds){this.addMilliseconds(x.millisecond||x.milliseconds);}
if(x.second||x.seconds){this.addSeconds(x.second||x.seconds);}
if(x.minute||x.minutes){this.addMinutes(x.minute||x.minutes);}
if(x.hour||x.hours){this.addHours(x.hour||x.hours);}
if(x.month||x.months){this.addMonths(x.month||x.months);}
if(x.year||x.years){this.addYears(x.year||x.years);}
if(x.day||x.days){this.addDays(x.day||x.days);}
return this;};Date._validate=function(value,min,max,name){if(typeof value!="number"){throw new TypeError(value+" is not a Number.");}else if(value<min||value>max){throw new RangeError(value+" is not a valid value for "+name+".");}
return true;};Date.validateMillisecond=function(n){return Date._validate(n,0,999,"milliseconds");};Date.validateSecond=function(n){return Date._validate(n,0,59,"seconds");};Date.validateMinute=function(n){return Date._validate(n,0,59,"minutes");};Date.validateHour=function(n){return Date._validate(n,0,23,"hours");};Date.validateDay=function(n,year,month){return Date._validate(n,1,Date.getDaysInMonth(year,month),"days");};Date.validateMonth=function(n){return Date._validate(n,0,11,"months");};Date.validateYear=function(n){return Date._validate(n,1,9999,"seconds");};Date.prototype.set=function(config){var x=config;if(!x.millisecond&&x.millisecond!==0){x.millisecond=-1;}
if(!x.second&&x.second!==0){x.second=-1;}
if(!x.minute&&x.minute!==0){x.minute=-1;}
if(!x.hour&&x.hour!==0){x.hour=-1;}
if(!x.day&&x.day!==0){x.day=-1;}
if(!x.month&&x.month!==0){x.month=-1;}
if(!x.year&&x.year!==0){x.year=-1;}
if(x.millisecond!=-1&&Date.validateMillisecond(x.millisecond)){this.addMilliseconds(x.millisecond-this.getMilliseconds());}
if(x.second!=-1&&Date.validateSecond(x.second)){this.addSeconds(x.second-this.getSeconds());}
if(x.minute!=-1&&Date.validateMinute(x.minute)){this.addMinutes(x.minute-this.getMinutes());}
if(x.hour!=-1&&Date.validateHour(x.hour)){this.addHours(x.hour-this.getHours());}
if(x.month!==-1&&Date.validateMonth(x.month)){this.addMonths(x.month-this.getMonth());}
if(x.year!=-1&&Date.validateYear(x.year)){this.addYears(x.year-this.getFullYear());}
if(x.day!=-1&&Date.validateDay(x.day,this.getFullYear(),this.getMonth())){this.addDays(x.day-this.getDate());}
if(x.timezone){this.setTimezone(x.timezone);}
if(x.timezoneOffset){this.setTimezoneOffset(x.timezoneOffset);}
return this;};Date.prototype.clearTime=function(){this.setHours(0);this.setMinutes(0);this.setSeconds(0);this.setMilliseconds(0);return this;};Date.prototype.isLeapYear=function(){var y=this.getFullYear();return(((y%4===0)&&(y%100!==0))||(y%400===0));};Date.prototype.isWeekday=function(){return!(this.is().sat()||this.is().sun());};Date.prototype.getDaysInMonth=function(){return Date.getDaysInMonth(this.getFullYear(),this.getMonth());};Date.prototype.moveToFirstDayOfMonth=function(){return this.set({day:1});};Date.prototype.moveToLastDayOfMonth=function(){return this.set({day:this.getDaysInMonth()});};Date.prototype.moveToDayOfWeek=function(day,orient){var diff=(day-this.getDay()+7*(orient||+1))%7;return this.addDays((diff===0)?diff+=7*(orient||+1):diff);};Date.prototype.moveToMonth=function(month,orient){var diff=(month-this.getMonth()+12*(orient||+1))%12;return this.addMonths((diff===0)?diff+=12*(orient||+1):diff);};Date.prototype.getDayOfYear=function(){return Math.floor((this-new Date(this.getFullYear(),0,1))/86400000);};Date.prototype.getWeekOfYear=function(firstDayOfWeek){var y=this.getFullYear(),m=this.getMonth(),d=this.getDate();var dow=firstDayOfWeek||Date.CultureInfo.firstDayOfWeek;var offset=7+1-new Date(y,0,1).getDay();if(offset==8){offset=1;}
var daynum=((Date.UTC(y,m,d,0,0,0)-Date.UTC(y,0,1,0,0,0))/86400000)+1;var w=Math.floor((daynum-offset+7)/7);if(w===dow){y--;var prevOffset=7+1-new Date(y,0,1).getDay();if(prevOffset==2||prevOffset==8){w=53;}else{w=52;}}
return w;};Date.prototype.isDST=function(){console.log('isDST');return this.toString().match(/(E|C|M|P)(S|D)T/)[2]=="D";};Date.prototype.getTimezone=function(){return Date.getTimezoneAbbreviation(this.getUTCOffset,this.isDST());};Date.prototype.setTimezoneOffset=function(s){var here=this.getTimezoneOffset(),there=Number(s)*-6/10;this.addMinutes(there-here);return this;};Date.prototype.setTimezone=function(s){return this.setTimezoneOffset(Date.getTimezoneOffset(s));};Date.prototype.getUTCOffset=function(){var n=this.getTimezoneOffset()*-10/6,r;if(n<0){r=(n-10000).toString();return r[0]+r.substr(2);}else{r=(n+10000).toString();return"+"+r.substr(1);}};Date.prototype.getDayName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedDayNames[this.getDay()]:Date.CultureInfo.dayNames[this.getDay()];};Date.prototype.getMonthName=function(abbrev){return abbrev?Date.CultureInfo.abbreviatedMonthNames[this.getMonth()]:Date.CultureInfo.monthNames[this.getMonth()];};Date.prototype._toString=Date.prototype.toString;Date.prototype.toString=function(format){var self=this;var p=function p(s){return(s.toString().length==1)?"0"+s:s;};return format?format.replace(/dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?/g,function(format){switch(format){case"hh":return p(self.getHours()<13?self.getHours():(self.getHours()-12));case"h":return self.getHours()<13?self.getHours():(self.getHours()-12);case"HH":return p(self.getHours());case"H":return self.getHours();case"mm":return p(self.getMinutes());case"m":return self.getMinutes();case"ss":return p(self.getSeconds());case"s":return self.getSeconds();case"yyyy":return self.getFullYear();case"yy":return self.getFullYear().toString().substring(2,4);case"dddd":return self.getDayName();case"ddd":return self.getDayName(true);case"dd":return p(self.getDate());case"d":return self.getDate().toString();case"MMMM":return self.getMonthName();case"MMM":return self.getMonthName(true);case"MM":return p((self.getMonth()+1));case"M":return self.getMonth()+1;case"t":return self.getHours()<12?Date.CultureInfo.amDesignator.substring(0,1):Date.CultureInfo.pmDesignator.substring(0,1);case"tt":return self.getHours()<12?Date.CultureInfo.amDesignator:Date.CultureInfo.pmDesignator;case"zzz":case"zz":case"z":return"";}}):this._toString();};
Date.now=function(){return new Date();};Date.today=function(){return Date.now().clearTime();};Date.prototype._orient=+1;Date.prototype.next=function(){this._orient=+1;return this;};Date.prototype.last=Date.prototype.prev=Date.prototype.previous=function(){this._orient=-1;return this;};Date.prototype._is=false;Date.prototype.is=function(){this._is=true;return this;};Number.prototype._dateElement="day";Number.prototype.fromNow=function(){var c={};c[this._dateElement]=this;return Date.now().add(c);};Number.prototype.ago=function(){var c={};c[this._dateElement]=this*-1;return Date.now().add(c);};(function(){var $D=Date.prototype,$N=Number.prototype;var dx=("sunday monday tuesday wednesday thursday friday saturday").split(/\s/),mx=("january february march april may june july august september october november december").split(/\s/),px=("Millisecond Second Minute Hour Day Week Month Year").split(/\s/),de;var df=function(n){return function(){if(this._is){this._is=false;return this.getDay()==n;}
return this.moveToDayOfWeek(n,this._orient);};};for(var i=0;i<dx.length;i++){$D[dx[i]]=$D[dx[i].substring(0,3)]=df(i);}
var mf=function(n){return function(){if(this._is){this._is=false;return this.getMonth()===n;}
return this.moveToMonth(n,this._orient);};};for(var j=0;j<mx.length;j++){$D[mx[j]]=$D[mx[j].substring(0,3)]=mf(j);}
var ef=function(j){return function(){if(j.substring(j.length-1)!="s"){j+="s";}
return this["add"+j](this._orient);};};var nf=function(n){return function(){this._dateElement=n;return this;};};for(var k=0;k<px.length;k++){de=px[k].toLowerCase();$D[de]=$D[de+"s"]=ef(px[k]);$N[de]=$N[de+"s"]=nf(de);}}());Date.prototype.toJSONString=function(){return this.toString("yyyy-MM-ddThh:mm:ssZ");};Date.prototype.toShortDateString=function(){return this.toString(Date.CultureInfo.formatPatterns.shortDatePattern);};Date.prototype.toLongDateString=function(){return this.toString(Date.CultureInfo.formatPatterns.longDatePattern);};Date.prototype.toShortTimeString=function(){return this.toString(Date.CultureInfo.formatPatterns.shortTimePattern);};Date.prototype.toLongTimeString=function(){return this.toString(Date.CultureInfo.formatPatterns.longTimePattern);};Date.prototype.getOrdinal=function(){switch(this.getDate()){case 1:case 21:case 31:return"st";case 2:case 22:return"nd";case 3:case 23:return"rd";default:return"th";}};
(function(){Date.Parsing={Exception:function(s){this.message="Parse error at '"+s.substring(0,10)+" ...'";}};var $P=Date.Parsing;var _=$P.Operators={rtoken:function(r){return function(s){var mx=s.match(r);if(mx){return([mx[0],s.substring(mx[0].length)]);}else{throw new $P.Exception(s);}};},token:function(s){return function(s){return _.rtoken(new RegExp("^\s*"+s+"\s*"))(s);};},stoken:function(s){return _.rtoken(new RegExp("^"+s));},until:function(p){return function(s){var qx=[],rx=null;while(s.length){try{rx=p.call(this,s);}catch(e){qx.push(rx[0]);s=rx[1];continue;}
break;}
return[qx,s];};},many:function(p){return function(s){var rx=[],r=null;while(s.length){try{r=p.call(this,s);}catch(e){return[rx,s];}
rx.push(r[0]);s=r[1];}
return[rx,s];};},optional:function(p){return function(s){var r=null;try{r=p.call(this,s);}catch(e){return[null,s];}
return[r[0],r[1]];};},not:function(p){return function(s){try{p.call(this,s);}catch(e){return[null,s];}
throw new $P.Exception(s);};},ignore:function(p){return p?function(s){var r=null;r=p.call(this,s);return[null,r[1]];}:null;},product:function(){var px=arguments[0],qx=Array.prototype.slice.call(arguments,1),rx=[];for(var i=0;i<px.length;i++){rx.push(_.each(px[i],qx));}
return rx;},cache:function(rule){var cache={},r=null;return function(s){try{r=cache[s]=(cache[s]||rule.call(this,s));}catch(e){r=cache[s]=e;}
if(r instanceof $P.Exception){throw r;}else{return r;}};},any:function(){var px=arguments;return function(s){var r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
try{r=(px[i].call(this,s));}catch(e){r=null;}
if(r){return r;}}
throw new $P.Exception(s);};},each:function(){var px=arguments;return function(s){var rx=[],r=null;for(var i=0;i<px.length;i++){if(px[i]==null){continue;}
try{r=(px[i].call(this,s));}catch(e){throw new $P.Exception(s);}
rx.push(r[0]);s=r[1];}
return[rx,s];};},all:function(){var px=arguments,_=_;return _.each(_.optional(px));},sequence:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;if(px.length==1){return px[0];}
return function(s){var r=null,q=null;var rx=[];for(var i=0;i<px.length;i++){try{r=px[i].call(this,s);}catch(e){break;}
rx.push(r[0]);try{q=d.call(this,r[1]);}catch(ex){q=null;break;}
s=q[1];}
if(!r){throw new $P.Exception(s);}
if(q){throw new $P.Exception(q[1]);}
if(c){try{r=c.call(this,r[1]);}catch(ey){throw new $P.Exception(r[1]);}}
return[rx,(r?r[1]:s)];};},between:function(d1,p,d2){d2=d2||d1;var _fn=_.each(_.ignore(d1),p,_.ignore(d2));return function(s){var rx=_fn.call(this,s);return[[rx[0][0],r[0][2]],rx[1]];};},list:function(p,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return(p instanceof Array?_.each(_.product(p.slice(0,-1),_.ignore(d)),p.slice(-1),_.ignore(c)):_.each(_.many(_.each(p,_.ignore(d))),px,_.ignore(c)));},set:function(px,d,c){d=d||_.rtoken(/^\s*/);c=c||null;return function(s){var r=null,p=null,q=null,rx=null,best=[[],s],last=false;for(var i=0;i<px.length;i++){q=null;p=null;r=null;last=(px.length==1);try{r=px[i].call(this,s);}catch(e){continue;}
rx=[[r[0]],r[1]];if(r[1].length>0&&!last){try{q=d.call(this,r[1]);}catch(ex){last=true;}}else{last=true;}
if(!last&&q[1].length===0){last=true;}
if(!last){var qx=[];for(var j=0;j<px.length;j++){if(i!=j){qx.push(px[j]);}}
p=_.set(qx,d).call(this,q[1]);if(p[0].length>0){rx[0]=rx[0].concat(p[0]);rx[1]=p[1];}}
if(rx[1].length<best[1].length){best=rx;}
if(best[1].length===0){break;}}
if(best[0].length===0){return best;}
if(c){try{q=c.call(this,best[1]);}catch(ey){throw new $P.Exception(best[1]);}
best[1]=q[1];}
return best;};},forward:function(gr,fname){return function(s){return gr[fname].call(this,s);};},replace:function(rule,repl){return function(s){var r=rule.call(this,s);return[repl,r[1]];};},process:function(rule,fn){return function(s){var r=rule.call(this,s);return[fn.call(this,r[0]),r[1]];};},min:function(min,rule){return function(s){var rx=rule.call(this,s);if(rx[0].length<min){throw new $P.Exception(s);}
return rx;};}};var _generator=function(op){return function(){var args=null,rx=[];if(arguments.length>1){args=Array.prototype.slice.call(arguments);}else if(arguments[0]instanceof Array){args=arguments[0];}
if(args){for(var i=0,px=args.shift();i<px.length;i++){args.unshift(px[i]);rx.push(op.apply(null,args));args.shift();return rx;}}else{return op.apply(null,arguments);}};};var gx="optional not ignore cache".split(/\s/);for(var i=0;i<gx.length;i++){_[gx[i]]=_generator(_[gx[i]]);}
var _vector=function(op){return function(){if(arguments[0]instanceof Array){return op.apply(null,arguments[0]);}else{return op.apply(null,arguments);}};};var vx="each any all".split(/\s/);for(var j=0;j<vx.length;j++){_[vx[j]]=_vector(_[vx[j]]);}}());(function(){var flattenAndCompact=function(ax){var rx=[];for(var i=0;i<ax.length;i++){if(ax[i]instanceof Array){rx=rx.concat(flattenAndCompact(ax[i]));}else{if(ax[i]){rx.push(ax[i]);}}}
return rx;};Date.Grammar={};Date.Translator={hour:function(s){return function(){this.hour=Number(s);};},minute:function(s){return function(){this.minute=Number(s);};},second:function(s){return function(){this.second=Number(s);};},meridian:function(s){return function(){this.meridian=s.slice(0,1).toLowerCase();};},timezone:function(s){return function(){var n=s.replace(/[^\d\+\-]/g,"");if(n.length){this.timezoneOffset=Number(n);}else{this.timezone=s.toLowerCase();}};},day:function(x){var s=x[0];return function(){this.day=Number(s.match(/\d+/)[0]);};},month:function(s){return function(){this.month=((s.length==3)?Date.getMonthNumberFromName(s):(Number(s)-1));};},year:function(s){return function(){var n=Number(s);this.year=((s.length>2)?n:(n+(((n+2000)<Date.CultureInfo.twoDigitYearMax)?2000:1900)));};},rday:function(s){return function(){switch(s){case"yesterday":this.days=-1;break;case"tomorrow":this.days=1;break;case"today":this.days=0;break;case"now":this.days=0;this.now=true;break;}};},finishExact:function(x){x=(x instanceof Array)?x:[x];var now=new Date();this.year=now.getFullYear();this.month=now.getMonth();this.day=1;this.hour=0;this.minute=0;this.second=0;for(var i=0;i<x.length;i++){if(x[i]){x[i].call(this);}}
this.hour=(this.meridian=="p"&&this.hour<13)?this.hour+12:this.hour;if(this.day>Date.getDaysInMonth(this.year,this.month)){throw new RangeError(this.day+" is not a valid value for days.");}
var r=new Date(this.year,this.month,this.day,this.hour,this.minute,this.second);if(this.timezone){r.set({timezone:this.timezone});}else if(this.timezoneOffset){r.set({timezoneOffset:this.timezoneOffset});}
return r;},finish:function(x){x=(x instanceof Array)?flattenAndCompact(x):[x];if(x.length===0){return null;}
for(var i=0;i<x.length;i++){if(typeof x[i]=="function"){x[i].call(this);}}
if(this.now){return new Date();}
var today=Date.today();var method=null;var expression=!!(this.days!=null||this.orient||this.operator);if(expression){var gap,mod,orient;orient=((this.orient=="past"||this.operator=="subtract")?-1:1);if(this.weekday){this.unit="day";gap=(Date.getDayNumberFromName(this.weekday)-today.getDay());mod=7;this.days=gap?((gap+(orient*mod))%mod):(orient*mod);}
if(this.month){this.unit="month";gap=(this.month-today.getMonth());mod=12;this.months=gap?((gap+(orient*mod))%mod):(orient*mod);this.month=null;}
if(!this.unit){this.unit="day";}
if(this[this.unit+"s"]==null||this.operator!=null){if(!this.value){this.value=1;}
if(this.unit=="week"){this.unit="day";this.value=this.value*7;}
this[this.unit+"s"]=this.value*orient;}
return today.add(this);}else{if(this.meridian&&this.hour){this.hour=(this.hour<13&&this.meridian=="p")?this.hour+12:this.hour;}
if(this.weekday&&!this.day){this.day=(today.addDays((Date.getDayNumberFromName(this.weekday)-today.getDay()))).getDate();}
if(this.month&&!this.day){this.day=1;}
return today.set(this);}}};var _=Date.Parsing.Operators,g=Date.Grammar,t=Date.Translator,_fn;g.datePartDelimiter=_.rtoken(/^([\s\-\.\,\/\x27]+)/);g.timePartDelimiter=_.stoken(":");g.whiteSpace=_.rtoken(/^\s*/);g.generalDelimiter=_.rtoken(/^(([\s\,]|at|on)+)/);var _C={};g.ctoken=function(keys){var fn=_C[keys];if(!fn){var c=Date.CultureInfo.regexPatterns;var kx=keys.split(/\s+/),px=[];for(var i=0;i<kx.length;i++){px.push(_.replace(_.rtoken(c[kx[i]]),kx[i]));}
fn=_C[keys]=_.any.apply(null,px);}
return fn;};g.ctoken2=function(key){return _.rtoken(Date.CultureInfo.regexPatterns[key]);};g.h=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2]|[1-9])/),t.hour));g.hh=_.cache(_.process(_.rtoken(/^(0[0-9]|1[0-2])/),t.hour));g.H=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3]|[0-9])/),t.hour));g.HH=_.cache(_.process(_.rtoken(/^([0-1][0-9]|2[0-3])/),t.hour));g.m=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.minute));g.mm=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.minute));g.s=_.cache(_.process(_.rtoken(/^([0-5][0-9]|[0-9])/),t.second));g.ss=_.cache(_.process(_.rtoken(/^[0-5][0-9]/),t.second));g.hms=_.cache(_.sequence([g.H,g.mm,g.ss],g.timePartDelimiter));g.t=_.cache(_.process(g.ctoken2("shortMeridian"),t.meridian));g.tt=_.cache(_.process(g.ctoken2("longMeridian"),t.meridian));g.z=_.cache(_.process(_.rtoken(/^(\+|\-)?\s*\d\d\d\d?/),t.timezone));g.zz=_.cache(_.process(_.rtoken(/^(\+|\-)\s*\d\d\d\d/),t.timezone));g.zzz=_.cache(_.process(g.ctoken2("timezone"),t.timezone));g.timeSuffix=_.each(_.ignore(g.whiteSpace),_.set([g.tt,g.zzz]));g.time=_.each(_.optional(_.ignore(_.stoken("T"))),g.hms,g.timeSuffix);g.d=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1]|\d)/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.dd=_.cache(_.process(_.each(_.rtoken(/^([0-2]\d|3[0-1])/),_.optional(g.ctoken2("ordinalSuffix"))),t.day));g.ddd=g.dddd=_.cache(_.process(g.ctoken("sun mon tue wed thu fri sat"),function(s){return function(){this.weekday=s;};}));g.M=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d|\d)/),t.month));g.MM=_.cache(_.process(_.rtoken(/^(1[0-2]|0\d)/),t.month));g.MMM=g.MMMM=_.cache(_.process(g.ctoken("jan feb mar apr may jun jul aug sep oct nov dec"),t.month));g.y=_.cache(_.process(_.rtoken(/^(\d\d?)/),t.year));g.yy=_.cache(_.process(_.rtoken(/^(\d\d)/),t.year));g.yyy=_.cache(_.process(_.rtoken(/^(\d\d?\d?\d?)/),t.year));g.yyyy=_.cache(_.process(_.rtoken(/^(\d\d\d\d)/),t.year));_fn=function(){return _.each(_.any.apply(null,arguments),_.not(g.ctoken2("timeContext")));};g.day=_fn(g.d,g.dd);g.month=_fn(g.M,g.MMM);g.year=_fn(g.yyyy,g.yy);g.orientation=_.process(g.ctoken("past future"),function(s){return function(){this.orient=s;};});g.operator=_.process(g.ctoken("add subtract"),function(s){return function(){this.operator=s;};});g.rday=_.process(g.ctoken("yesterday tomorrow today now"),t.rday);g.unit=_.process(g.ctoken("minute hour day week month year"),function(s){return function(){this.unit=s;};});g.value=_.process(_.rtoken(/^\d\d?(st|nd|rd|th)?/),function(s){return function(){this.value=s.replace(/\D/g,"");};});g.expression=_.set([g.rday,g.operator,g.value,g.unit,g.orientation,g.ddd,g.MMM]);_fn=function(){return _.set(arguments,g.datePartDelimiter);};g.mdy=_fn(g.ddd,g.month,g.day,g.year);g.ymd=_fn(g.ddd,g.year,g.month,g.day);g.dmy=_fn(g.ddd,g.day,g.month,g.year);g.date=function(s){return((g[Date.CultureInfo.dateElementOrder]||g.mdy).call(this,s));};g.format=_.process(_.many(_.any(_.process(_.rtoken(/^(dd?d?d?|MM?M?M?|yy?y?y?|hh?|HH?|mm?|ss?|tt?|zz?z?)/),function(fmt){if(g[fmt]){return g[fmt];}else{throw Date.Parsing.Exception(fmt);}}),_.process(_.rtoken(/^[^dMyhHmstz]+/),function(s){return _.ignore(_.stoken(s));}))),function(rules){return _.process(_.each.apply(null,rules),t.finishExact);});var _F={};var _get=function(f){return _F[f]=(_F[f]||g.format(f)[0]);};g.formats=function(fx){if(fx instanceof Array){var rx=[];for(var i=0;i<fx.length;i++){rx.push(_get(fx[i]));}
return _.any.apply(null,rx);}else{return _get(fx);}};g._formats=g.formats(["yyyy-MM-ddTHH:mm:ss","ddd, MMM dd, yyyy H:mm:ss tt","ddd MMM d yyyy HH:mm:ss zzz","d"]);g._start=_.process(_.set([g.date,g.time,g.expression],g.generalDelimiter,g.whiteSpace),t.finish);g.start=function(s){try{var r=g._formats.call({},s);if(r[1].length===0){return r;}}catch(e){}
return g._start.call({},s);};}());Date._parse=Date.parse;Date.parse=function(s){var r=null;if(!s){return null;}
try{r=Date.Grammar.start.call({},s);}catch(e){return null;}
return((r[1].length===0)?r[0]:null);};Date.getParseFunction=function(fx){var fn=Date.Grammar.formats(fx);return function(s){var r=null;try{r=fn.call({},s);}catch(e){return null;}
return((r[1].length===0)?r[0]:null);};};Date.parseExact=function(s,fx){return Date.getParseFunction(fx)(s);};

/* Made by Mathias Bynens <http://mathiasbynens.be/> */
function number_format(a, b, c, d) {
 a = Math.round(a * Math.pow(10, b)) / Math.pow(10, b);
 e = a + '';
 f = e.split('.');
 if (!f[0]) {
  f[0] = '0';
 }
 if (!f[1]) {
  f[1] = '';
 }
 if (f[1].length < b) {
  g = f[1];
  for (var i=f[1].length + 1; i <= b; i++) {
   g += '0';
  }
  f[1] = g;
 }
 if(d != '' && f[0].length > 3) {
  h = f[0];
  f[0] = '';
  for(var j = 3; j < h.length; j+=3) {
   i = h.slice(h.length - j, h.length - j + 3);
   f[0] = d + i +  f[0] + '';
  }
  j = h.substr(0, (h.length % 3 == 0) ? 3 : (h.length % 3));
  f[0] = j + f[0];
 }
 c = (b <= 0) ? '' : c;
 return f[0] + c + f[1];
}

jQuery.cookie = function(name, value, options) {
    if (typeof value != 'undefined') { // name and value given, set cookie
        options = options || {};
        if (value === null) {
            value = '';
            options.expires = -1;
        }
        var expires = '';
        if (options.expires && (typeof options.expires == 'number' || options.expires.toUTCString)) {
            var date;
            if (typeof options.expires == 'number') {
                date = new Date();
                date.setTime(date.getTime() + (options.expires * 24 * 60 * 60 * 1000));
            } else {
                date = options.expires;
            }
            expires = '; expires=' + date.toUTCString(); // use expires attribute, max-age is not supported by IE
        }
        // CAUTION: Needed to parenthesize options.path and options.domain
        // in the following expressions, otherwise they evaluate to undefined
        // in the packed version for some reason...
        var path = options.path ? '; path=' + (options.path) : '';
        var domain = options.domain ? '; domain=' + (options.domain) : '';
        var secure = options.secure ? '; secure' : '';
        document.cookie = [name, '=', encodeURIComponent(value), expires, path, domain, secure].join('');
    } else { // only name given, get cookie
        var cookieValue = null;
        if (document.cookie && document.cookie != '') {
            var cookies = document.cookie.split(';');
            for (var i = 0; i < cookies.length; i++) {
                var cookie = jQuery.trim(cookies[i]);
                // Does this cookie string begin with the name we want?
                if (cookie.substring(0, name.length + 1) == (name + '=')) {
                    cookieValue = decodeURIComponent(cookie.substring(name.length + 1));
                    break;
                }
            }
        }
        return cookieValue;
    }
};