﻿// PageMethods.js

var displayElement;
var calFromObjPackage;
var calToObjPackage;
var calFromObjFlyAndDrive;
var calToObjFlyAndDrive;
var divGal = "";
var NoPlacesCtrId;
var ContinueCtrId; 

var lastCalToEnableDates = "";
var lastCalFromEnableDates = "";

///gets the object in the custom CalendarsIDs property of calendar (sender). the CalendarsIDs property
///holds all the control ids relevant to the calendar and that are affected by his date change.
///sender could also be a picker. This property is set by client script.
function InitCalendarObjects(sender) {

    CalendarObjects =
            {
                objPickerFrom: eval(sender.GetProperty('CalendarsIDs').strPickerFromID),
                objCalendarFrom: eval(sender.GetProperty('CalendarsIDs').strCalendarFromID),
                objPickerTo: eval(sender.GetProperty('CalendarsIDs').strPickerToID),
                objCalendarTo: eval(sender.GetProperty('CalendarsIDs').strCalendarToID),

                objPickerToV2: eval(sender.GetProperty('CalendarsIDs').strPickerToIDV2),
                objCalendarToV2: eval(sender.GetProperty('CalendarsIDs').strCalendarToIDV2),
                
                objPickerSingle: eval(sender.GetProperty('CalendarsIDs').strPickerSingleID),
                objCalendarSingle: eval(sender.GetProperty('CalendarsIDs').strCalendarSingleID),
                objPickerFlight4: eval(sender.GetProperty('CalendarsIDs').strPickerFlight4ID),
                objCalendarFlight4: eval(sender.GetProperty('CalendarsIDs').strCalendarFlight4ID),
                ///the ids of the calendar drop downs
                strDdlMonthFromID: sender.GetProperty('CalendarsIDs').strDdlMonthFromID,
                strDdlMonthTorID: sender.GetProperty('CalendarsIDs').strDdlMonthToID,
                IsdoubleCalendar: (IsTypeDefined(sender.GetProperty('CalendarsIDs').IsdoubleCalendar)) ? sender.GetProperty('CalendarsIDs').IsdoubleCalendar : false,
                ///the cars hours combos. innerHTML is needed for ff instead of innerText
                objDdlHoursFrom: (IsTypeDefined(sender.GetProperty('CalendarsIDs').strLblDdlHoursFromClientID)) ? $get($get(sender.GetProperty('CalendarsIDs').strLblDdlHoursFromClientID).innerHTML) : null,
                objDdlHoursTo: (IsTypeDefined(sender.GetProperty('CalendarsIDs').strLblDdlHoursToClientID)) ? $get($get(sender.GetProperty('CalendarsIDs').strLblDdlHoursToClientID).innerHTML) : null
            };
            //alert(CalendarObjects.objDdlHoursFrom.value)
    return CalendarObjects;
}

function InitCalendarObjectsV2(sender)
{



    CalendarObjects =
            {
                objPickerFrom: eval(sender.GetProperty('CalendarsIDs').strPickerFromID),
                objCalendarFrom: eval(sender.GetProperty('CalendarsIDs').strCalendarFromID),
                objPickerTo: eval(sender.GetProperty('CalendarsIDs').strPickerToID),
                objCalendarTo: eval(sender.GetProperty('CalendarsIDs').strCalendarToID),
                ///the ids of the calendar drop downs
                strDdlMonthFromID: sender.GetProperty('CalendarsIDs').strDdlMonthFromID,
                strDdlMonthTorID: sender.GetProperty('CalendarsIDs').strDdlMonthToID,
                IsdoubleCalendar: (IsTypeDefined(sender.GetProperty('CalendarsIDs').IsdoubleCalendar)) ? sender.GetProperty('CalendarsIDs').IsdoubleCalendar : false,
                ///the cars hours combos. innerHTML is needed for ff instead of innerText
                objDdlHoursFrom: (IsTypeDefined(sender.GetProperty('CalendarsIDs').strLblDdlHoursFromClientID)) ? $get($get(sender.GetProperty('CalendarsIDs').strLblDdlHoursFromClientID).innerHTML) : null,
                objDdlHoursTo: (IsTypeDefined(sender.GetProperty('CalendarsIDs').strLblDdlHoursToClientID)) ? $get($get(sender.GetProperty('CalendarsIDs').strLblDdlHoursToClientID).innerHTML) : null
            };
    //alert(CalendarObjects.objDdlHoursFrom.value)
    return CalendarObjects;
}


// Gets the session state value.
function GetSessionValue(key) 
{
    PageMethods.GetSessionValue(key, 
        OnSucceeded, OnFailed);
}

//Sets the session state value.
function SetSessionValue(key, value) 
{
    PageMethods.SetSessionValue(key, value, 
        OnSucceeded, OnFailed);
}

function CheckIfValid(ProviderDealCode, lnkContinueCtrId, txtNoPlacesCtrId) {
    if (ProviderDealCode != "") {
        NoPlacesCtrId = txtNoPlacesCtrId;
        ContinueCtrId = lnkContinueCtrId
        setTimeout(function() {
            PageMethods.CheckIfValid(ProviderDealCode, lnkContinueCtrId, txtNoPlacesCtrId,
    OnSucceeded, OnFailed, "CheckIfValid")
        }, 1000);
    }
}

function FillGalleryItems(HotelLocalId, HotelProviderCode) 
{
    PageMethods.FillGalleryItems(HotelLocalId, HotelProviderCode,
        OnSucceeded, OnFailed, "FillGalleryItems");
}

function GetFlightSeats() 
{
    PageMethods.GetFlightSeats(OnSucceeded, OnFailed, "GetFlightSeats");
}

//function GetFlightCitiesByCountryID(countryID)
//{
//    ClientService.GetFlightCitiesByCountryID(cityID, OnSucceeded, OnFailed, "FromCommonDestinations");
//}

function SetFromDatesForCityPackage(cityID) 
{
    //PageMethods.SetFromDatesForCityPackage(cityID, OnSucceeded, OnFailed, "FromPackage");
    current_CityID = cityID;
    ClientService.SetFromDatesForCityPackage(cityID, OnSucceeded, OnFailed, "FromPackage");
}

function SetFromDatesForCityFlyAndDrive(cityID) {
    //alert('SetFromDatesForCity' + cityID)
    ClientService.SetFromDatesForCityFlyAndDrive(cityID,
        OnSucceeded, OnFailed,"FromFlyAndDrive");
}

//Sets the session state value.
function SetPackageEndDatesPackage(FromDate, cityID) {
    var fromDateYear = FromDate.getYear().toString();

    ///ff adds 1 to the getYear() method i.e. instead of 09 returns 109 - need to remove it
    if (window.addEventListener) {
        //var ss = FromDate.getYear().toString();
        //alert(ss.substr(1, 2));
        fromDateYear = fromDateYear.substr(1, 2);
    }

    FromDate = FromDate.getDate() + "/" + (FromDate.getMonth() + 1) + "/" + fromDateYear; //FromDate.getYear();

    ClientService.SetPackageEndDatesPackage(FromDate,OnSucceeded, OnFailed,"ToPackage");

    //PageMethods.SetPackageEndDatesPackage(FromDate,
    //    OnSucceeded, OnFailed,"ToPackage");


}

//Sets the session state value for Terms of flights from sabre
function SetTermsAsynchronously()
{
    ClientService.SetTermsAsynchronously(OnSucceeded, OnFailed, "SetTermsAsynchronously");
}


function SetCampignDetailsToAgentSystem(NameTextBox, PhoneTextBox, EmailTextBox, SubjectTextBox, SelectedPageName)
{
    ClientService.SetCampignDetailsToAgentSystem(NameTextBox,
                                                PhoneTextBox,
                                                EmailTextBox,
                                                SubjectTextBox,
                                                SelectedPageName,
                                                OnSucceeded, OnFailed, "SetCampignDetailsToAgentSystem");

}


//Sets the session state value.
function SetPackageEndDatesFlyAndDrive(FromDate, cityID) {


    var fromDateYear = FromDate.getYear().toString();

    ///ff adds 1 to the getYear() method i.e. instead of 09 returns 109 - need to remove it
    if (window.addEventListener) {
        //var ss = FromDate.getYear().toString();
        //alert(ss.substr(1, 2));
        fromDateYear = fromDateYear.substr(1, 2);
    }

    FromDate = FromDate.getDate() + "/" + (FromDate.getMonth() + 1) + "/" + fromDateYear; //FromDate.getYear();

    ClientService.SetPackageEndDatesFlyAndDrive(FromDate,
        OnSucceeded, OnFailed,"ToFlyAndDrive");
}

// Callback function invoked on successful 
// completion of the page method.
function OnSucceeded(result, userContext, methodName) {
    
    var coFrom = null;
    var coTo = null;
    //


//    if (methodName == "FromCommonDestinations")
//    {
//        if (result != "True")
//        {
//            alert("Efi Succeeded !");
//        }
//    }

    
    if (methodName == "CheckIfValid") {
        if (result != "True")
        {
            document.getElementById(NoPlacesCtrId).style.display = ''
            document.getElementById(ContinueCtrId).style.display = 'none'
        }
    }
    if (methodName == "SetFromDatesForCityPackage" || methodName == "SetPackageEndDatesPackage") {
        coFrom = InitCalendarObjects(calFromObjPackage);
        coTo = InitCalendarObjects(calToObjPackage);

        calFromObj = calFromObjPackage;
        calToObj = calToObjPackage;
    }

    if (methodName == "SetFromDatesForCityFlyAndDrive" || methodName == "SetPackageEndDatesFlyAndDrive") {
        coFrom = InitCalendarObjects(calFromObjFlyAndDrive);
        coTo = InitCalendarObjects(calToObjFlyAndDrive);

        calFromObj = calFromObjFlyAndDrive;
        calToObj = calToObjFlyAndDrive;
    }
    
    //
    //alert('OnSucceeded_Pack')
    if (methodName == "GetSessionValue")
    {
        alert(result);
    }
    else if (methodName.toString().indexOf("FillGalleryItems") > -1)
    {
        divGal.innerHTML = result;
    }
    else if (methodName.toString().indexOf("SetFromDatesForCity") > -1) 
    {

        //
        //alert('SetFromDatesForCity')
        var dis = calFromObj.get_disabledDates();

        if (result != "") 
        {
            var dates = result.split(";");
            var firstdate = new Date(dates[0]);
            
            //PickerFromPackage.goDate(firstdate);
            coFrom.objPickerFrom.goDate(firstdate);
            eval(coFrom.strDdlMonthFromID + 'Selected = ' + firstdate.getMonth()); 
      
            // clear calendar from last enabled dates,  insert to local array first, it's faster
            // clear calendar - disable 4 months dates
            var minDate = new Date();
            var maxDate = new Date();
            minDate.setDate(minDate.getDate() + 1);
            maxDate.setDate(maxDate.getDate() + 150);

            dis.addRange(minDate, maxDate);
            dis.remove.needsUpdate = false;
            // update new dates - insert to local array first, it's faster
            var arrDates = new Array();
            //
            dis.remove.needsUpdate = false;
 
            for (i = 0; i < dates.length; i++) {
                var date = new Date(dates[i]);
                dis.remove(date);
            }
            
            //dis.remove(arrDates);
            calFromObj.Render();

            //alert('befor_change')
            // because the first enabled day is selected, we can't choose it and load it's end dates ==> we are doing it manually:
            PickerFrom_OnDateChange(coFrom.objPickerFrom, new Object());
            CalendarFrom_OnChange(coFrom.objCalendarFrom, new Object());
            //coFrom.objPickerFrom.set_enabled(false);

            lastCalFromEnableDates = dates;
          }
          else {
           //coFrom.objPickerFrom.set_enabled(false);
            alert("אין תאריכים ליעד המבוקש");
            // clear calendar from last enabled dates,  insert to local array first, it's faster
            var arrDis = new Array();
            dis.remove.needsUpdate = false;

            for (i = 0; i < lastCalFromEnableDates.length; i++) {
                var date = new Date(lastCalFromEnableDates[i]);
                dis.add(date);
            }
            
            //dis.add(arrDis);
            lastCalFromEnableDates = "";
            calFromObj.Render();
        }
    }
    else if (methodName.toString().indexOf("SetPackageEndDates") > -1)
    {
        //alert(result);
        if (result != "") 
        {
            var dates = result.split(";");
            var firstdate = new Date(dates[0]);

            calToObj.goDate(firstdate);
            calToObj.clearSelectedDate();
            coTo.objPickerTo.setSelectedDate(firstdate);
            setCalendarMonth(coTo.objPickerTo, userContext);


            // clear calendar - disable 4 months dates
            var dis = calToObj.get_disabledDates();
            var minDate = new Date();
            var maxDate = new Date();
            minDate.setDate(minDate.getDate() + 1);
            maxDate.setDate(maxDate.getDate() + 150);

            dis.addRange(minDate, maxDate);
            dis.remove.needsUpdate = false;

            dis.remove.needsUpdate = false;

            for (i = 0; i < dates.length; i++) {
                var date = new Date(dates[i]);
                dis.remove(date);
            }
            //dis.remove(arrDates, false);
            calToObj.Render();

            lastCalToEnableDates = dates;
            var fromDate = coTo.objPickerFrom.getSelectedDate();
            var toDate = coTo.objPickerTo.getSelectedDate();
            var calToName = (coTo.objPickerTo.GlobalAlias.substring(6));
            //alert(userContext);
            //coTo.objPickerTo.set_enabled(false);

            SetPackageNightsCount(fromDate, toDate);
        }
        else 
        {
            //coTo.objPickerTo.set_enabled(false);
            alert("אין תאריכים ליעד המבוקש");
        }
    }
}

// Callback function invoked on failure 
// of the page method.
function OnFailed(error, userContext, methodName) {
    if(error !== null) {
        alert(error.get_message());

    }
}

/*
/// Start Flights
*/

///makes a post back usign a hidden button
function fnDoPostBack(btnfilter2UniqueID)
{
    __doPostBack(btnfilter2UniqueID,'4444');
    //$get('ctl00_ContentHolder_btnfilter2').click();
    //PageMethods.BindDataAsync( 'FromDate', OnFlightSucceeded, OnFlightFailed);
}

///gets the return flight legs of a charter flight with only one outbound flight as a string of rendered leg controls
function GetReturnFlights(p_iFlightID,
                          FlightAdditionalFlightsLinkClientID,
                          FlightContinueOrderButtonClientID, 
                          FlightContinueOrderLinkClientID)
{
    if (p_iFlightID)
        PageMethods.PMGetReturnFlightsAsRenderedControls(p_iFlightID,
                                                         FlightContinueOrderButtonClientID,
                                                         FlightContinueOrderLinkClientID,
                                                         OnFlightSucceeded, 
                                                         OnFlightFailed);
        //PageMethods.PMGetReturnFlightsAsObjects(p_iFlightID, OnFlightSucceeded, OnFlightFailed);
        
}



// Callback function invoked on successful 
// completion of the page method.
function OnFlightSucceeded(result, userContext, methodName) 
{
    ///put additional flights controls html in search results
    if (result.toString().indexOf('!!') > -1) 
    { 
        ///take the flightid from a comment in the controls html
        var flightId = result.toString().substr(result.toString().indexOf('!!') + 2, 4).replace("!!", " ").replace("!","").replace(" ","");
        //
        if (flightId.length > 0) 
        {
            var objDivAdditionalFlights = $get("divAdditionalFlights" + flightId);
            //alert(RsltElem)

            if (objDivAdditionalFlights)
                objDivAdditionalFlights.innerHTML = result;
        }
    }
    
}

// Callback function invoked on failure 
// of the page method.
function OnFlightFailed(error, userContext, methodName) 
{
    if(error !== null) 
    {
        alert(error.get_message());
        //displayElement.innerHTML = "An error occurred: " + 
        //    error.get_message();
    }
}

//// End flights

function FilterHotelResultsDataSet(hotelResultsDetailsID, strHotelInfoPageURL) {
    var objRequestRbtn = $get(hotelResultsDetailsID);
    var requestRbtnValue = '';

    if (objRequestRbtn) {
        requestRbtnValue = objRequestRbtn.value
    }
    
    PageMethods.PMFilterHotelResultsDataSet(hotelResultsDetailsID, strHotelInfoPageURL, requestRbtnValue,  
        OnFilterHotelResultsDataSetSucceeded, OnFilterHotelResultsDataSetFailed, "");
}

function FilterIsrealHotelResultsDataSet(hotelResultsDetailsID, strHotelInfoPageURL, strSelectedRoomID) {
    //alert();
    PageMethods.PMFilterIsrealHotelResultsDataSet(hotelResultsDetailsID, strHotelInfoPageURL, strSelectedRoomID, 
        OnFilterIsrealHotelResultsDataSetSucceeded, OnFilterIsrealHotelResultsDataSetFailed, "");
}

function OnFilterHotelResultsDataSetSucceeded(result, userContext, methodName) {
    //var tt = eval(result);
    //alert(result);
    if (result != '') {
        location.href = result;
    }

}

///Redirect to dp order details using client side
///collects all the dp data from hiddens
function LinkDPContinueOrder_Click(commandArgument, rptDynamicPackagesClientID, strDPdetailsPageURL) {
    //var objRequestRbtn = $get(hotelResultsDetailsID);
    //var requestRbtnValue = '';

    //if (objRequestRbtn) {
    //    requestRbtnValue = objRequestRbtn.value
    //}

    //
    var hdnSelectedFlight = '';
    var hdnSelectedHotel = '';
    var hdnSelectedCar = '';
    ///room type of the hotel
    var RequestRbtnValue = '';
    var rdoFlightLegValue = '';
    var hdnTotalPriceValue = '';
    var hdnTotalPriceReservationValue = '';
    var hdnTotalPriceAfterMurkupValue = '';

    var hdnGrossPriceValue = '';
    var hdnNetPriceValue = '';
    
    var hdnDPItemReductionValue = '';
    var hdnTotalPriceFlightValue = '';
    var hdnTotalPriceHotelValue = '';
    var hdnTotalPriceCarValue = '';
    var hdnCurrencyIDValue = '';
    var hdnCurrencySymbolValue = '';
    
    ///get hiddens from search results page
    var hdnSelectedFlightObj = document.getElementsByName('hdnFlight' + commandArgument);
    var hdnSelectedHotelObj = document.getElementsByName('hdnHotel' + commandArgument);
    var hdnSelectedCarObj = document.getElementsByName('hdnCar' + commandArgument);
    var RequestRbtnObj = null;
    var rdoFlightLeg = document.getElementsByName("ctl01$rdoFlightLeg" + hdnSelectedFlight);

    var tmpCommandArgument = commandArgument;

    if (parseInt(tmpCommandArgument) < 10)
        tmpCommandArgument = '0' + tmpCommandArgument;
        
    ///prices hiddens
    var hdnTotalPriceObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnTotalPrice');
    var hdnTotalPriceReservationObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnTotalPriceReservation');
    var hdnTotalPriceAfterMurkupObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnTotalPriceAfterMurkup');

    var hdnGrossPriceObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnGrossPrice');
    var hdnNetPriceObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnNetPrice');
    
    var hdnDPItemReductionObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnDPItemReduction');
    var hdnTotalPriceFlightObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnTotalPriceFlight');
    var hdnTotalPriceHotelObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnTotalPriceHotel');
    var hdnTotalPriceCarObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnTotalPriceCar');
    var hdnCurrencyIDObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnCurrencyID');
    var hdnCurrencySymbolObj = $get(rptDynamicPackagesClientID + '_ctl' + tmpCommandArgument + '_hdnCurrencySymbol');

    //
    //alert(hdnTotalPriceObj.value)
    
    ///get hiddens values
    if (rdoFlightLeg.length > 0) {
        rdoFlightLegValue = rdoFlightLeg[0].value;
    }

    if (hdnSelectedFlightObj.length > 0) { 
        hdnSelectedFlight = hdnSelectedFlightObj[0].value;
    }

    if (hdnSelectedHotelObj.length > 0) {
        hdnSelectedHotel = hdnSelectedHotelObj[0].value;
        RequestRbtnObj = document.getElementsByName(commandArgument + hdnSelectedHotel);

        if (RequestRbtnObj.length > 0) {
            RequestRbtnValue = RequestRbtnObj[0].value;
        }
    }

    if (hdnSelectedCarObj.length > 0) { 
        hdnSelectedCar = hdnSelectedCarObj[0].value;
    }

    ///prices
    if (hdnTotalPriceObj) {//.length > 0) {
        hdnTotalPriceValue = hdnTotalPriceObj.value;
    }

    if (hdnTotalPriceReservationObj) {//.length > 0) {
        hdnTotalPriceReservationValue = hdnTotalPriceReservationObj.value;
    }

    if (hdnTotalPriceAfterMurkupObj) {//.length > 0) {
        hdnTotalPriceAfterMurkupValue = hdnTotalPriceAfterMurkupObj.value;
    }

    if (hdnGrossPriceObj) {//.length > 0) {
        hdnGrossPriceValue = hdnGrossPriceObj.value;
    }

    if (hdnNetPriceObj) {//.length > 0) {
        hdnNetPriceValue = hdnNetPriceObj.value;
    }

    if (hdnDPItemReductionObj) {//.length > 0) {
        hdnDPItemReductionValue = hdnDPItemReductionObj.value;
    }

    if (hdnTotalPriceFlightObj) {//.length > 0) {
        hdnTotalPriceFlightValue = hdnTotalPriceFlightObj.value;
    }

    if (hdnTotalPriceHotelObj) {//.length > 0) {
        hdnTotalPriceHotelValue = hdnTotalPriceHotelObj.value;
    }

    if (hdnTotalPriceCarObj) {//.length > 0) {
        hdnTotalPriceCarValue = hdnTotalPriceCarObj.value; //hdnTotalPriceCarObj[0].value;
    }

    if (hdnCurrencyIDObj) {//.length > 0) {
        hdnCurrencyIDValue = hdnCurrencyIDObj.value;
    }

    if (hdnCurrencySymbolObj) {//.length > 0) {
        hdnCurrencySymbolValue = hdnCurrencySymbolObj.value;
    }

    //ClientService.PMLinkDPContinueOrder_Click(commandArgument, strDPdetailsPageURL,
    PageMethods.PMLinkDPContinueOrder_Click(commandArgument,
                                            hdnSelectedFlight, hdnSelectedHotel, hdnSelectedCar, RequestRbtnValue,
                                            hdnTotalPriceValue, hdnTotalPriceReservationValue, hdnTotalPriceAfterMurkupValue, hdnGrossPriceValue, hdnNetPriceValue, hdnDPItemReductionValue, hdnTotalPriceFlightValue, hdnTotalPriceHotelValue, hdnTotalPriceCarValue, hdnCurrencyIDValue, hdnCurrencySymbolValue,
                                            rdoFlightLegValue, strDPdetailsPageURL,
                                            OnLinkDPContinueOrder_ClickSucceeded, OnFilterIsrealHotelResultsDataSetFailed, "");
}

function OnLinkDPContinueOrder_ClickSucceeded(result, userContext, methodName) {
    //var tt = eval(result);
    //alert(result);
    if (result != '') {
        location.href = result;
    }

}


function OnFilterHotelResultsDataSetFailed(error, userContext, methodName) {
    if (error !== null) {
        alert(error.get_message());
        //displayElement.innerHTML = "An error occurred: " + 
        //    error.get_message();
    }
}

function OnFilterIsrealHotelResultsDataSetSucceeded(result, userContext, methodName) {
    //var tt = eval(result);
    //alert(result);
    //alert(6)
    if (result != '') {
        location.href = result;
    }

}

function OnFilterIsrealHotelResultsDataSetFailed(error, userContext, methodName) {
    if (error !== null) {
        alert(error.get_message());
        //displayElement.innerHTML = "An error occurred: " + 
        //    error.get_message();
    }
}


function FlagGoToPagerFirstPage() {
    goToPagerFirstPage = true;
}



if (typeof(Sys) !== "undefined") Sys.Application.notifyScriptLoaded();

function DateAdd(objDate, strInterval, intIncrement) {
    if (typeof (objDate) == "string") {
        objDate = new Date(objDate);

        if (isNaN(objDate)) {
            throw ("DateAdd: Date is not a valid date");
        }
    }
    else if (typeof (objDate) != "object" || objDate.constructor.toString().indexOf("Date()") == -1) {
        throw ("DateAdd: First parameter must be a date object");
    }

    if (
        strInterval != "M"
        && strInterval != "D"
        && strInterval != "Y"
        && strInterval != "h"
        && strInterval != "m"
        && strInterval != "uM"
        && strInterval != "uD"
        && strInterval != "uY"
        && strInterval != "uh"
        && strInterval != "um"
        && strInterval != "us"
        ) {
        throw ("DateAdd: Second parameter must be M, D, Y, h, m, uM, uD, uY, uh, um or us");
    }

    if (typeof (intIncrement) != "number") {
        throw ("DateAdd: Third parameter must be a number");
    }

    switch (strInterval) {
        case "M":
            objDate.setMonth(parseInt(objDate.getMonth()) + parseInt(intIncrement));
            break;

        case "D":
            objDate.setDate(parseInt(objDate.getDate()) + parseInt(intIncrement));
            break;

        case "Y":
            objDate.setYear(parseInt(objDate.getYear()) + parseInt(intIncrement));
            break;

        case "h":
            objDate.setHours(parseInt(objDate.getHours()) + parseInt(intIncrement));
            break;

        case "m":
            objDate.setMinutes(parseInt(objDate.getMinutes()) + parseInt(intIncrement));
            break;

        case "s":
            objDate.setSeconds(parseInt(objDate.getSeconds()) + parseInt(intIncrement));
            break;

        case "uM":
            objDate.setUTCMonth(parseInt(objDate.getUTCMonth()) + parseInt(intIncrement));
            break;

        case "uD":
            objDate.setUTCDate(parseInt(objDate.getUTCDate()) + parseInt(intIncrement));
            break;

        case "uY":
            objDate.setUTCFullYear(parseInt(objDate.getUTCFullYear()) + parseInt(intIncrement));
            break;

        case "uh":
            objDate.setUTCHours(parseInt(objDate.getUTCHours()) + parseInt(intIncrement));
            break;

        case "um":
            objDate.setUTCMinutes(parseInt(objDate.getUTCMinutes()) + parseInt(intIncrement));
            break;

        case "us":
            objDate.setUTCSeconds(parseInt(objDate.getUTCSeconds()) + parseInt(intIncrement));
            break;
    }

    return objDate;
}

///date object prototype
Date.prototype.Add = function(strInterval, intIncrement) {
    if (
        strInterval != "M"
        && strInterval != "D"
        && strInterval != "Y"
        && strInterval != "h"
        && strInterval != "m"
        && strInterval != "uM"
        && strInterval != "uD"
        && strInterval != "uY"
        && strInterval != "uh"
        && strInterval != "um"
        && strInterval != "us"
        ) {
        throw ("DateAdd: Second parameter must be M, D, Y, h, m, uM, uD, uY, uh, um or us");
    }

    if (typeof (intIncrement) != "number") {
        throw ("DateAdd: Third parameter must be a number");
    }

    switch (strInterval) {
        case "M":
            this.setMonth(parseInt(this.getMonth()) + parseInt(intIncrement));
            break;

        case "D":
            this.setDate(parseInt(this.getDate()) + parseInt(intIncrement));
            break;

        case "Y":
            this.setYear(parseInt(this.getYear()) + parseInt(intIncrement));
            break;

        case "h":
            this.setHours(parseInt(this.getHours()) + parseInt(intIncrement));
            break;

        case "m":
            this.setMinutes(parseInt(this.getMinutes()) + parseInt(intIncrement));
            break;

        case "s":
            this.setSeconds(parseInt(this.getSeconds()) + parseInt(intIncrement));
            break;

        case "uM":
            this.setUTCMonth(parseInt(this.getUTCMonth()) + parseInt(intIncrement));
            break;

        case "uD":
            this.setUTCDate(parseInt(this.getUTCDate()) + parseInt(intIncrement));
            break;

        case "uY":
            this.setUTCFullYear(parseInt(this.getUTCFullYear()) + parseInt(intIncrement));
            break;

        case "uh":
            this.setUTCHours(parseInt(this.getUTCHours()) + parseInt(intIncrement));
            break;

        case "um":
            this.setUTCMinutes(parseInt(this.getUTCMinutes()) + parseInt(intIncrement));
            break;

        case "us":
            this.setUTCSeconds(parseInt(this.getUTCSeconds()) + parseInt(intIncrement));
            break;
    }
    return this;
}

//    var mydate = new Date('6/20/2008');
//    alert(mydate.Add("D", 10));

///returns the datediff as integer
function DateDiff(fromDate, toDate) {
    var datDiff = Math.floor((toDate - fromDate) / (24 * 60 * 60 * 1000));

    return datDiff;
}

///returns the datediff as decimal number including hour differences
function DateDiffDecimal(fromDate, toDate) {
    var datDiff = ((toDate - fromDate) / (24 * 60 * 60 * 1000));

    return datDiff;
}


/*
* Date Format 1.2.2
* (c) 2007-2008 Steven Levithan <stevenlevithan.com>
* MIT license
* Includes enhancements by Scott Trenda <scott.trenda.net> and Kris Kowal <cixar.com/~kris.kowal/>
*
* Accepts a date, a mask, or a date and a mask.
* Returns a formatted version of the given date.
* The date defaults to the current date/time.
* The mask defaults to dateFormat.masks.default.
*/

var dateFormat = function() {
    var token = /d{1,4}|m{1,4}|yy(?:yy)?|([HhMsTt])\1?|[LloSZ]|"[^"]*"|'[^']*'/g,
		timezone = /\b(?:[PMCEA][SDP]T|(?:Pacific|Mountain|Central|Eastern|Atlantic) (?:Standard|Daylight|Prevailing) Time|(?:GMT|UTC)(?:[-+]\d{4})?)\b/g,
		timezoneClip = /[^-+\dA-Z]/g,
		pad = function(val, len) {
		    val = String(val);
		    len = len || 2;
		    while (val.length < len) val = "0" + val;
		    return val;
		};

    // Regexes and supporting functions are cached through closure
    return function(date, mask, utc) {
        var dF = dateFormat;

        // You can't provide utc if you skip other args (use the "UTC:" mask prefix)
        if (arguments.length == 1 && (typeof date == "string" || date instanceof String) && !/\d/.test(date)) {
            mask = date;
            date = undefined;
        }

        // Passing date through Date applies Date.parse, if necessary
        date = date ? new Date(date) : new Date();
        if (isNaN(date)) throw new SyntaxError("invalid date");

        mask = String(dF.masks[mask] || mask || dF.masks["default"]);

        // Allow setting the utc argument via the mask
        if (mask.slice(0, 4) == "UTC:") {
            mask = mask.slice(4);
            utc = true;
        }

        var _ = utc ? "getUTC" : "get",
			d = date[_ + "Date"](),
			D = date[_ + "Day"](),
			m = date[_ + "Month"](),
			y = date[_ + "FullYear"](),
			H = date[_ + "Hours"](),
			M = date[_ + "Minutes"](),
			s = date[_ + "Seconds"](),
			L = date[_ + "Milliseconds"](),
			o = utc ? 0 : date.getTimezoneOffset(),
			flags = {
			    d: d,
			    dd: pad(d),
			    ddd: dF.i18n.dayNames[D],
			    dddd: dF.i18n.dayNames[D + 7],
			    m: m + 1,
			    mm: pad(m + 1),
			    mmm: dF.i18n.monthNames[m],
			    mmmm: dF.i18n.monthNames[m + 12],
			    yy: String(y).slice(2),
			    yyyy: y,
			    h: H % 12 || 12,
			    hh: pad(H % 12 || 12),
			    H: H,
			    HH: pad(H),
			    M: M,
			    MM: pad(M),
			    s: s,
			    ss: pad(s),
			    l: pad(L, 3),
			    L: pad(L > 99 ? Math.round(L / 10) : L),
			    t: H < 12 ? "a" : "p",
			    tt: H < 12 ? "am" : "pm",
			    T: H < 12 ? "A" : "P",
			    TT: H < 12 ? "AM" : "PM",
			    Z: utc ? "UTC" : (String(date).match(timezone) || [""]).pop().replace(timezoneClip, ""),
			    o: (o > 0 ? "-" : "+") + pad(Math.floor(Math.abs(o) / 60) * 100 + Math.abs(o) % 60, 4),
			    S: ["th", "st", "nd", "rd"][d % 10 > 3 ? 0 : (d % 100 - d % 10 != 10) * d % 10]
			};

        return mask.replace(token, function($0) {
            return $0 in flags ? flags[$0] : $0.slice(1, $0.length - 1);
        });
    };
} ();

// Some common format strings
dateFormat.masks = {
    "default": "ddd mmm dd yyyy HH:MM:ss",
    shortDate: "m/d/yy",
    mediumDate: "mmm d, yyyy",
    longDate: "mmmm d, yyyy",
    fullDate: "dddd, mmmm d, yyyy",
    shortTime: "h:MM TT",
    mediumTime: "h:MM:ss TT",
    longTime: "h:MM:ss TT Z",
    isoDate: "yyyy-mm-dd",
    isoTime: "HH:MM:ss",
    isoDateTime: "yyyy-mm-dd'T'HH:MM:ss",
    isoUtcDateTime: "UTC:yyyy-mm-dd'T'HH:MM:ss'Z'"
};

// Internationalization strings
dateFormat.i18n = {
    dayNames: [
		"Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat",
		"Sunday", "Monday", "Tuesday", "Wednesday", "Thursday", "Friday", "Saturday"
	],
    monthNames: [
		"Jan", "Feb", "Mar", "Apr", "May", "Jun", "Jul", "Aug", "Sep", "Oct", "Nov", "Dec",
		"January", "February", "March", "April", "May", "June", "July", "August", "September", "October", "November", "December"
	]
};

// For convenience...
Date.prototype.format = function(mask, utc) {
    return dateFormat(this, mask, utc);
};

///converts a string to date according
function ToDate(strDate) {
    //
    var dt = null;

    if (typeof (strDate) == 'string') {
        if (strDate && strDate != '') {
            //if (strFormat == "dd/MM/yyyy")
            var dtY = strDate.substring(6, 10);
            var dtD = strDate.substring(0, 2);
            var dtM = strDate.substring(3, 5);

            dt = new Date(dtM + '/' + dtD + '/' + dtY);
        }
    }
    else {
        dt = strDate;
    }

    return dt;
}

