/*CALENDARIO*/
var global = new Object();
global.calendar = new Object();
var nbsp = String.fromCharCode(160);
var calendar = new Object();
var overPopup = false;
function createCalendar(departureFieldName, arrivalFieldName, pais){ calendar.contents = initCalendar(departureFieldName, arrivalFieldName, pais); }
function popupCalendar(pais, me, halign, valign, popFrame, pDepartureFieldName, pArrivalFieldName, pAnticipationDays) {
    departureFieldName = pDepartureFieldName;
    arrivalFieldName = pArrivalFieldName;
    anticipationDays = pAnticipationDays;
    var bla = document.getElementById("dapopup");
    if (bla.firstChild)
        bla.removeChild(bla.firstChild);
    me.select();
    if (calendar.contents == undefined)
        createCalendar(pDepartureFieldName, pArrivalFieldName, pais);
    bla.appendChild(calendar.contents);
    currentDateField = me;
    displayDates();
    bla.halign = halign ? halign : 0;
    bla.valign = valign ? valign : 0;
    bla.fixed = false;
    bla.popFrame = popFrame;
    bla.calledby = me;
    if (bla.className.indexOf("calendar") == -1) {
        bla.className = "popup " + "calendar";
    }
    positionpopup(bla);
    setPopupCover();
}

function positionpopup(p)
{	var bla = p?p:document.getElementById("dapopup");
    bla.style.visibility = "hidden";
    bla.style.position = "absolute";
    bla.style.display = "block";
    if (bla.calledby) {
        var cx = findPosX(bla.calledby);
        var cy = findPosY(bla.calledby);
        var x = align(bla.halign, cx, bla.calledby.offsetWidth, bla.offsetWidth);
        var y = align(bla.valign, cy, bla.calledby.offsetHeight, bla.offsetHeight);
        if (!bla.fixed) {
            var r;
            if (p.popFrame && p.popFrame != '' && document.getElementById(p.popFrame))
                r = elementRect(document.getElementById(p.popFrame));
            else
                r = clientRect();
            var c = contained({ 'l': x, 't': y, 'r': x + bla.offsetWidth, 'b': y + bla.offsetHeight }, r);
            if (c.axis == 'y') {
                if (bla.halign == 0 || bla.halign == 3)
                    y = align(c.diff > 0 ? 1 : 2, cy, bla.calledby.offsetHeight, bla.offsetHeight);
                else y += c.diff;
            }
            else if (c.axis == 'x') {
                if (bla.valign == 0 || bla.valign == 3)//flip to side
                    x = align(c.diff > 0 ? 1 : 2, cx, bla.calledby.offsetWidth, bla.offsetWidth);
                else x += c.diff;
            }
        }

        //Fix para el pop up de Nueva búsqueda en IE
        if (navigator.appName == "Microsoft Internet Explorer" && bla.parentNode.className == "nuevaBusqueda") {
            x += 19;
            y += 19;
        }
        bla.style.left = x + "px";
        bla.style.top = y + "px";
    }
    bla.style.visibility = "visible";
}
function setPopupCover() {
    if (navigator.appName != "Microsoft Internet Explorer")
        return;
    var bla = document.getElementById("dapopup");
    var cov = document.getElementById("dapopupcover");
    cov.style.display = "block";
    cov.style.left = bla.style.left;
    cov.style.top = bla.style.top;
    cov.style.width = bla.offsetWidth;
    cov.style.height = bla.offsetHeight;
    cov.style.visibility = "visible";
}
function overpopup() { overPopup = true; }
function leavepopup() { overPopup = false; }
function clickpopup() { var bla = document.getElementById("dapopup"); }
function popdown(force) {
    if (force || !overPopup) {
        var bla = document.getElementById("dapopup");
        bla.style.display = "none";
        bla.className = "popup";
        bla.style.height = "";
        if (bla.firstChild) { bla.removeChild(bla.firstChild); }
        bla.calledby = null;
        currentLocator = null;
        currentDateField = null;
        currentProgress = null;
        var cov = document.getElementById("dapopupcover");
        cov.style.visibility = "hidden";
        cov.style.display = "none";
    }
}
function align(t, p, whc, whp) {
    if (t) {
        if (t == 1)
            return p + whc;
        if (t == 2)
            return p - whp;
        if (t == 3)
            return p + whc - whp;
        if (t == 4)
            return Math.round(p + whc / 2);
    }
    return p;
}
function elementRect(el) {
    var l = findPosX(el);
    var t = findPosY(el);
    return { 'l': l, 't': t, 'r': l + el.offsetWidth, 'b': t + el.offsetHeight };
}
function clientRect()
{	var d = getInnerDimension();
    return { 'l': d.l, 't': d.t, 'r': d.l + d.w, 'b': d.t + d.h };
}
function getInnerDimension()
{	var d = {'w':0, 'h':0, 'l':0, 't':0};
    if (window.innerWidth) {
        d.w = window.innerWidth;
        d.h = window.innerHeight;
        d.l = window.scrollX;
        d.t = window.scrollY;
    }
    else if (document.documentElement && document.documentElement.clientWidth) {
        d.w = document.documentElement.clientWidth;
        d.h = document.documentElement.clientHeight;
        d.l = document.documentElement.scrollLeft;
        d.t = document.documentElement.scrollTop;
    }
    else if (document.body) {
        d.w = document.body.clientWidth;
        d.h = document.body.clientHeight;
        d.l = document.body.scrollLeft;
        d.t = document.body.scrollTop;
    }
    return d;
}
/***********************************/
function mouseOverCtrl(el) { if (el && el.id) { gMouseOverEl = el.id; } }
function mouseOutCtrl(el) { gMouseOverEl = ''; }
function getMouseOverCtrl() { return gMouseOverEl; }
function findPosX(obj) {
    var curleft = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent && !obj.className.toLowerCase().match("popup")) {
            curleft += obj.offsetLeft;
            obj = obj.offsetParent;
        }
    }
    else if (obj.x) { curleft += obj.x; }
    return curleft;
}
function findPosY(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent && !obj.className.toLowerCase().match("popup")) {
            curtop += obj.offsetTop;
            obj = obj.offsetParent;
        }
    }
    else if (obj.y) { curtop += obj.y; }
    return curtop;
}
function contained(p, r) {
    var axis = '';
    var diff = 0;
    if (p.l >= r.l && p.r <= r.r) {
        if (p.t < r.t || p.b > r.b) {
            axis = 'y';
            if (p.t < r.t) diff = r.t - p.t;
            else diff = r.b - p.b;
        }
    }
   else if(p.t>=r.t && p.b<=r.b)
   {
        axis = 'x';
        if (p.l < r.l) diff = r.l - p.l;
        else diff = r.r - p.r;
    }
    return { 'axis': axis, 'diff': diff };
}

function AtributosPorPais(pais) {
    if (pais == 10) {
        this.weekdays = ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'];
        this.monthlong = ['Janeiro ', 'Fevereiro', 'Março', 'Abril', 'Maio', 'Junho', 'Julho', 'Agosto', 'Setembro', 'Outubro', 'Novembro', 'Dezembro'];
        this.monthshort = ['Jan', 'Fev', 'Mar', 'Abr', 'Mai', 'Jun', 'Jul', 'Ago', 'Set', 'Out', 'Nov', 'Dez'];
        this.weekdaysI = ['Do', 'Se', 'Te', 'Qu', 'Qi', 'Se', 'Sa'];
        this.dayAccronym = "d";
        this.hourAccronym = "h";
        this.minuteAccronym = "m";
        this.close = "Fechar";
    }
    else {
        this.weekdays = ['Dom', 'Lun', 'Mar', 'Mié', 'Jue', 'Vie', 'Sáb'];
        this.monthlong = ['Enero', ' Febrero', 'Marzo', 'Abril', 'Mayo', 'Junio', 'Julio', 'Agosto', 'Septiembre', 'Octubre', 'Noviembre', 'Diciembre'];
        this.monthshort = ['Ene', 'Feb', 'Mar', 'Abr', 'May', 'Jun', 'Jul', 'Ago', 'Sep', 'Oct', 'Nov', 'Dic'];
        this.weekdaysI = ['Do', 'Lu', 'Ma', 'Mi', 'Ju', 'Vi', 'Sá'];
        this.dayAccronym = "d";
        this.hourAccronym = "h";
        this.minuteAccronym = "m";
        this.close = "Cerrar";
    }
}

var rm;
global.calendar.dateValue = global.calendar.dateValue ? global.calendar.dateValue : new Object();
var gCalToday = new Date();
var calendarLimit = 353;
var daysLimit;
var dateFormat;
dateFormat = "DD/MM/AAAA";
var shownDate;
var c1cells = new Array(43);
var c2cells = new Array(43);
var monthlong;
var monthshort;
var departureField;
var arrivalField;
var currentDateField = null;
var isEndReached = false;
var isAtBeginning = true;
var digits = "0123456789";
var departureFieldName = "";
var arrivalFieldName = "";
var anticipationDays = 0;
var monthsToShow = 2;

function monthselect1() { selectDate(this, 0); }
function monthselect2() { selectDate(this, 1); }
function incmonth() { changeMonth(1); };
function decmonth() { changeMonth(-1); };
function hovering() { this.oldName = this.className; this.className = this.className + "_hov"; };
function leaving() { this.className = this.oldName; };

function initCalendar(departure, arrival, pais) {

    var i, j;
    rm = new AtributosPorPais(pais);
    monthlong = rm.monthlong;
    monthshort = rm.monthshort;

    departureFieldName = departure;
    arrivalFieldName = arrival;
    configCalendar();
    //Create the bastard
    var dacal = document.createElement("TABLE");
    dacal.cellSpacing = 0;
    dacal.cellPadding = 0;
    dacal.className = 'tablanfondov';

    var tbody = dacal.appendChild(document.createElement("TBODY"));

    //TOP ROW
    var tr = tbody.appendChild(document.createElement("TR"));
    tr.className = "calheader";
    var td = tr.appendChild(document.createElement("TD"));
    td.id = "caltitle1";
    td.className = "caltitle";
    if (monthsToShow == 1)
        td.colSpan = 6;
    else
        td.colSpan = 7;
    td.align = "center";
    if (monthsToShow == 2) {
        td = tr.appendChild(document.createElement("TD"));
        td.className = "calspacer1";
        td.appendChild(document.createTextNode(nbsp));
        td = tr.appendChild(document.createElement("TD"));
        td.className = "calspacer2";
        td.appendChild(document.createTextNode(nbsp));
        td = tr.appendChild(document.createElement("TD"));
        td.id = "caltitle2";
        td.className = "caltitle";
        td.colSpan = 6;
        td.align = "center";
    }
    td = tr.appendChild(document.createElement("TD"));
    td.align = "right";


    //SECOND ROW
    tr = tbody.appendChild(document.createElement("TR"));
    tr.className = "calheader";
    td = tr.appendChild(document.createElement("TD"));
    td.appendChild(document.createTextNode(nbsp));
    td.onclick = decmonth;
    td.id = "calprev";
    td.className = "calprev";
    td.onmouseover = hovering;
    td.onmouseout = leaving;
    td.colSpan = 2;

    td = tr.appendChild(document.createElement("TD"));
    td.id = "caltitle1";
    td.className = "caltitle";
    td.colSpan = 3 + (monthsToShow - 1);
    if (monthsToShow == 2) {
        td = tr.appendChild(document.createElement("TD"));
        td.appendChild(document.createTextNode(""));
        td.className = "caltitle";
        td = tr.appendChild(document.createElement("TD"));
        td.className = "calspacer1";
        td.rowSpan = 10;
        td.appendChild(document.createTextNode(nbsp));
        td = tr.appendChild(document.createElement("TD"));
        td.className = "calspacer2";
        td.rowSpan = 10;
        td.appendChild(document.createTextNode(nbsp));
        tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(""));
        td = tr.appendChild(document.createElement("TD"));
        td.id = "caltitle2";
        td.className = "caltitle";
        td.colSpan = 4;
    }
    td = tr.appendChild(document.createElement("TD"));
    td.appendChild(document.createTextNode(nbsp));
    td.onclick = incmonth;
    td.id = "calnext";
    td.className = "calnext";
    td.onmouseover = hovering;
    td.onmouseout = leaving;
    td.colSpan = 2;
    //H-BORDER
    tr = tbody.appendChild(document.createElement("TR"));
    tr.className = "calhborder";
    td = tr.appendChild(document.createElement("TD"));
    td.colSpan = "7";
    td.appendChild(document.createTextNode(""));
    if (monthsToShow == 2) {
        td = tr.appendChild(document.createElement("TD"));
        td.colSpan = "7";
        td.appendChild(document.createTextNode(""));
    }
    //WEEKDAYS
    tr = tbody.appendChild(document.createElement("TR"));
    tr.className = "calweekdays";
   for(i = 0; i < monthsToShow; i++)
   {
        tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[1]));
        tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[2]));
        tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[3]));
        tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[4]));
        tr.appendChild(document.createElement("TD")).appendChild(document.createTextNode(rm.weekdaysI[5]));
        td = tr.appendChild(document.createElement("TD"));
        td.appendChild(document.createTextNode(rm.weekdaysI[6]));
        td.className = "calweekend";
        td = tr.appendChild(document.createElement("TD"));
        td.appendChild(document.createTextNode(rm.weekdaysI[0]));
        td.className = "calweekend";
    }
    var x;
    for (i = 1; i < 7; i++) {
        tr = tbody.appendChild(document.createElement("TR"));
        tr.className = "caldays";
        for (x = 0; x < monthsToShow; x++) {
            for (j = 1; j < 8; j++) {
                td = tr.appendChild(document.createElement("TD"));
                td.onmouseover = hovering;
                td.onmouseout = leaving;
                switch (x + 1) {
                    case 1:
                        td.onclick = monthselect1;
                        c1cells[((i - 1) * 7) + j] = td;
                        break;
                    case 2:
                        td.onclick = monthselect2;
                        c2cells[((i - 1) * 7) + j] = td;
                        break;
                }
            }
        }
    }
    //F-BORDER
    tr = tbody.appendChild(document.createElement("TR"));
    tr.className = "calfborder";
    td = tr.appendChild(document.createElement("TD"));
    td.colSpan = 7 + (9 * (monthsToShow - 1));
    td.appendChild(document.createTextNode(""));
    // FOOTER
    tr = tbody.appendChild(document.createElement("TR"));
    tr.className = "calfooter";
    td = tr.appendChild(document.createElement("TD"));
    td.colSpan = 7 + (9 * (monthsToShow - 1));
    var closeLink = td.appendChild(document.createElement("A"));
    closeLink.appendChild(document.createTextNode("cerrar"));
    closeLink.onclick = function() { popdown(true); };

    departureField = document.getElementById(departure);
    arrivalField = document.getElementById(arrival);

    // NECCESSARY?
    currentDateField = departureField;
    //dateChange(departureField);
    currentDateField = arrivalField;
    //dateChange(arrivalField);
    currentDateField = null;
    return dacal;

}


function configCalendar() {
    daysLimit = calendarLimit;
    shownDate = new Date(gCalToday.getFullYear(), gCalToday.getMonth(), 1);
}


function setInputToLastCorrectDate() {
    if (global.calendar.dateValue[currentDateField.id] != null)
        currentDateField.value = formatDate(global.calendar.dateValue[currentDateField.id], dateFormat);
    else
        currentDateField.value = dateFormat.toLowerCase();
    return;
}


function dateChange(o) {
    if (o.value.length == 0)
        o.value = dateFormat.toLowerCase();
    //o.className = "";

    if (o.value == dateFormat) {
        setInputToLastCorrectDate();
        return;
    }

    var theDate = parseDate(o.value);

    if (theDate == null || isDateBeforeTodayAndAnticipation(theDate) || isDateTooFar(theDate, 1) || theDate.toDateString() == gCalToday.toDateString()) {
        setInputToLastCorrectDate();
        return;
    }

    doAdjustDates(theDate);
}


function changeMonth(i) {
    shownDate.setMonth(shownDate.getMonth() + i);
    displayDates();
    currentDateField.focus();
}

function selectDate(o, monthOffset) {
    if (o.className.match(/today/) || o.className.match(/past/) || o.className.match(/weekendpast/) || !Number(o.innerHTML) > 0) {
        currentDateField.focus();
        return;
    }
    var newDate = new Date(shownDate.getFullYear(), shownDate.getMonth() + monthOffset, o.innerHTML);
    doAdjustDates(newDate);

    // advance shown-month if user choices the later month when choosing depart-date
    if (monthOffset == 1 && currentDateField.id == departureFieldName)
        shownDate.setMonth(shownDate.getMonth() + 1);

    if (document.getElementById("AgesAt") != null) {
        changeLabelAge();
    }

    popdown(true);
}

function doAdjustDates(newDate) {
    global.calendar.dateValue[currentDateField.id] = newDate;
    currentDateField.value = formatDate(newDate, dateFormat);
    // currentDateField.className = "";

    // Change one of the dates if departure is later than arrival.
    var depDate = global.calendar.dateValue[departureField.id];
    var arrDate = global.calendar.dateValue[arrivalField.id];
}

function displayDates() {
    var nextMonthDate = new Date(shownDate.getFullYear(), shownDate.getMonth() + 1, 1);

    // Display calendar titles
    document.getElementById("caltitle1").innerHTML = ""; // First set to empty string, required for IE 5 Mac
    document.getElementById("caltitle1").innerHTML = monthlong[shownDate.getMonth()] + " " + shownDate.getFullYear();
    if (monthsToShow == 2) {
        document.getElementById("caltitle2").innerHTML = ""; // First set to empty string, required for IE 5 Mac
        document.getElementById("caltitle2").innerHTML = monthlong[nextMonthDate.getMonth()] + " " + nextMonthDate.getFullYear();
    }

    isEndReached = false;
    isAtBeginning = false;

    displayMonth(c1cells, shownDate);
    if (monthsToShow == 2)
        displayMonth(c2cells, nextMonthDate);

    // disable if we are going too far
    var prev = document.getElementById("calprev");
    // see http://www.alanwood.net/demos/wgl4.html for special char codes
    prev.style.fontFamily = 'Arial';
    prev.innerHTML = ""; prev.innerHTML = "&#9668;";
   if (isAtBeginning)
   {
        prev.onclick = null;
        prev.className = "calprev_old";
        // must set the old classname because the event order is: hovering, onclick (current event), leaving
        prev.oldName = "calprev_old";
    }
   else
   {
        prev.onclick = decmonth;
        prev.className = "calprev";
    }
    var next = document.getElementById("calnext");
    next.style.fontFamily = 'Arial';
    next.innerHTML = ""; next.innerHTML = "&#9658;";
    next.onclick = (isEndReached) ? null : incmonth;
    next.className = "calnext";

}

var msInDay = 24 * 60 * 60 * 1000;

function displayMonth(cells, monthDate) {
    var selectedDeparture = parseDate(document.getElementById(departureFieldName).value);
    var selectedArrival = parseDate(document.getElementById(arrivalFieldName).value);
    var lastDate = getMonthDays(monthDate);
    var offset = getCalendarOffset(monthDate);
    var cell = null;
    var dw;

    // Wipe first and last rows.
    for (var i = 1; i <= offset; i++) {
        cell = cells[i];
        cell.innerHTML = ""; // First set to empty string, required for IE 5 Mac
        cell.innerHTML = "&nbsp;";
        dw = i % 7;
        if (dw == 6 || dw == 0)
            cell.className = "weekend_none";
        else
            cell.className = "weekday_none";
    }
    for (i = offset + lastDate; i <= 42; i++) {
        cell = cells[i];
        cell.innerHTML = ""; // First set to empty string, required for IE 5 Mac
        cell.innerHTML = "&nbsp;";
        dw = i % 7;
        if (dw == 6 || dw == 0)
            cell.className = "weekend_none";
        else
            cell.className = "weekday_none";
    }

    // Display dates.
    var isTodayMonth = isSameMonth(monthDate, gCalToday);
    var isSelectedMonth = isSameMonth(monthDate, global.calendar.dateValue[currentDateField.id]);
    var isDate1Month = isSameMonth(monthDate, selectedDeparture);
    var isDate2Month = isSameMonth(monthDate, selectedArrival);

    for (i = 1; i <= lastDate; i++) {
        // Display day of month.
        cell = cells[i + offset];
        cell.innerHTML = ""; // First set to empty string, required for IE 5 Mac
        cell.innerHTML = i;

        if (monthDate.getTime() <= gCalToday.getTime()) {
            isAtBeginning = true;
        }

        var normalClass = "weekday";
        var pastClass = "past";
        dw = ((i + offset) % 7);
        var isWeekEnd = ((dw == 6) || (dw == 0));
        if (isWeekEnd) {
            normalClass = "weekend";
            pastClass = "weekendpast";
        }

        // Select display class.
        var currDate = new Date(monthDate.getFullYear(), monthDate.getMonth(), i, 0, 0, 0, 0);
        if (currDate.toDateString() == gCalToday.toDateString()) {
            cell.className = "today";
        }
        else if (isDateBeforeTodayAndAnticipation(currDate)) {
            cell.className = pastClass;
            isAtBeginning = true;
        }
        else if (isSelectedMonth && global.calendar.dateValue[currentDateField.id].getDate() == i) {
            // This is the currently selected date.
            cell.className = "current";
        }
        else if (isDate1Month && selectedDeparture && selectedDeparture.getDate() == i) {
            cell.className = "selected";
        }
        else if (isDate2Month && selectedArrival && selectedArrival.getDate() == i) {
            cell.className = "selected";
        }
        else if (isDateTooFar(monthDate, i)) {
            cell.className = pastClass;
            isEndReached = true;
        }
        else {
            cell.className = normalClass;
        }
    }
}

/****************************************
*    HELPERS
****************************************/
function isDateBeforeToday(theDate) {
    if (theDate.getFullYear() != gCalToday.getFullYear())
        return theDate.getFullYear() < gCalToday.getFullYear();
    if (theDate.getMonth() != gCalToday.getMonth())
        return theDate.getMonth() < gCalToday.getMonth();
    return theDate.getDate() < gCalToday.getDate();
}

function isDateBeforeTodayAndAnticipation(theDate) {
     if (dateDiff('d', gCalToday, theDate) <= anticipationDays &&  theDate > gCalToday)
     {
        return true;
    }
    return dateDiff('d', gCalToday, theDate) < anticipationDays;
}

function isDate(p_Expression) {
    return !isNaN(new Date(p_Expression)); // <<--- this needs checking
}

// REQUIRES: isDate()
// NOT SUPPORTED: firstdayofweek and firstweekofyear (defaults for both)
function dateDiff(p_Interval, p_Date1, p_Date2, p_firstdayofweek, p_firstweekofyear) {
    if (!isDate(p_Date1)) { return "invalid date: '" + p_Date1 + "'"; }
    if (!isDate(p_Date2)) { return "invalid date: '" + p_Date2 + "'"; }
    var dt1 = new Date(p_Date1);
    var dt2 = new Date(p_Date2);

    // get ms between dates (UTC) and make into "difference" date
    var iDiffMS = dt2.valueOf() - dt1.valueOf();
    var dtDiff = new Date(iDiffMS);

    // calc various diffs
    var nYears = dt2.getUTCFullYear() - dt1.getUTCFullYear();
    var nMonths = dt2.getUTCMonth() - dt1.getUTCMonth() + (nYears != 0 ? nYears * 12 : 0);
    var nQuarters = parseInt(nMonths / 3); //<<-- different than VBScript, which watches rollover not completion

    var nMilliseconds = iDiffMS;
    var nSeconds = parseInt(iDiffMS / 1000);
    var nMinutes = parseInt(nSeconds / 60);
    var nHours = parseInt(nMinutes / 60);
    var nDays = parseInt(nHours / 24);
    var nWeeks = parseInt(nDays / 7);


    // return requested difference
    var iDiff = 0;
    switch (p_Interval.toLowerCase()) {
        case "yyyy": return nYears;
        case "q": return nQuarters;
        case "m": return nMonths;
        case "y": // day of year
        case "d": return nDays;
        case "w": return nDays;
        case "ww": return nWeeks; // week of year// <-- inaccurate, WW should count calendar weeks (# of sundays) between
        case "h": return nHours;
        case "n": return nMinutes;
        case "s": return nSeconds;
        case "ms": return nMilliseconds; // millisecond// <-- extension for JS, NOT available in VBScript
        default: return "invalid interval: '" + p_Interval + "'";
    }
}

function isDateTooFar(theDate, offset) {
    var days = Math.ceil((theDate.getTime() - gCalToday.getTime()) / msInDay) + offset - 1;
    return days > daysLimit;
}

function getMonthDays(theDate) {
    var lastDate = new Date(theDate.getFullYear(), theDate.getMonth() + 1, 0);
    return lastDate.getDate();
}


function getCalendarOffset(theDate) {
    var firstDay = new Date(theDate.getFullYear(), theDate.getMonth(), 1);
    return (firstDay.getDay() + 6) % 7;
}

function isSameMonth(firstDate, secondDate) {
    if (firstDate == null || secondDate == null)
        return false;
    return firstDate.getFullYear() == secondDate.getFullYear() &&
           firstDate.getMonth() == secondDate.getMonth();
}


// format:
//   yyyy -> year long, ie. 2005
//  yy   -> year short, ie. 05
//   mm   -> month number, ie. 12
//   mmm  -> month short, ie. Dec
//   mmmm -> month long, ie. December
//   dd   -> day number, ie. 24
//   ww   -> weekday short, ie. Mon
function formatDate(theDate, format) {
    var result = format.toLowerCase();
    result = result.replace(/aaaa/, theDate.getFullYear());
    result = result.replace(/aa/, formatToTwoDigits(theDate.getFullYear() % 100));
    result = result.replace(/mmmm/, monthlong[theDate.getMonth()]);
    result = result.replace(/mmm/, monthshort[theDate.getMonth()]);
    result = result.replace(/mm/, theDate.getMonth() + 1);
    result = result.replace(/dd/, theDate.getDate());
    result = result.replace(/ww/, rm.weekdays[theDate.getDay()]);
    return result;
}

function formatToTwoDigits(n) {
    if (n >= 0 && n < 10)
        return "0" + n;
    else
        return n;
}
function parseDateFormat(txt,format)
{
    var reg = format.toLowerCase();
    var ya = reg.match(/^(y+|m+|d+)[^`ymd]?(y+|m+|d+)[^ymd]?(y+|m+|d+)$/);
   if(ya)
   {
        var y, m, d, t, b;
        var pos = 0;
      for(var i = 1; i < ya.length && pos < txt.length;i++)
      {
            b = txt.substring(pos, pos + ya[i].length).replace(/^0/, '');
            t = parseInt(b);
            pos += ya[i].length;
            if (ya[i].charAt(0) == 'y')
                y = ya[i].length == 2 ? 2000 + t : t;
            else if (ya[i].charAt(0) == 'm')
                m = t;
            else if (ya[i].charAt(0) == 'd')
                d = t;
            while (digits.indexOf(txt.charAt(pos)) == -1) pos++;
        }
        if (y && m && d)
            return new Date(y, m - 1, d);

    }
    return null;

}
// also called by flights.js
function parseDate(text) {
    var parts = text.split(/[-\/\.]/);
    var origPartsLenght = parts.length;
    // Validate.
    if (parts.length < 2 || parts.length > 3)
        return null;
    if (parts.length == 2)
        parts[2] = String((new Date()).getFullYear());
    else if (parts[2].length <= 2)
        parts[2] = String(2000 + Number(parts[2]));
    if (parts[0].length < 1 || parts[0].length > 2 || !parts[0].match(/[0-9]+/))
        return null;
    if (parts[1].length < 1 || parts[1].length > 2 || !parts[1].match(/[0-9]+/))
        return null;

    if (parts[2].length == 0 || parts[2].length == 3 ||
        parts[2].length > 4 || !parts[2].match(/[0-9]+/))
        return null;
    var newDate = new Date(parts[2], Number(parts[1]) - 1, parts[0]);

    if (Number(parts[0]) != newDate.getDate())
        return null;

    if (origPartsLenght == 2 && newDate.getTime() < gCalToday.getTime()) {
        var dateYearAdjusted = new Date(newDate.getTime());
        dateYearAdjusted.setFullYear(dateYearAdjusted.getFullYear() + 1);
        if (!isDateTooFar(dateYearAdjusted, 1))
            newDate = dateYearAdjusted;
    }

    // for birth dates
    if (newDate.getFullYear() > gCalToday.getFullYear() + 5)
        newDate.setFullYear(newDate.getFullYear() - 100);

    return newDate;
}

function leaveCalendar(calEl, departureFieldName, arrivalFieldName, pais) {
    if (calendar.contents == undefined)
        createCalendar(departureFieldName, arrivalFieldName, pais);
    currentDateField = calEl;
    dateChange(calEl);
}

function prepareInput(pais, inputId, halign, valign, popFrame, departureFieldName, arrivalFieldName, pAnticipationDays) {

    var objInput = document.getElementById(inputId);
    objInput.onfocus = function(event) {
        if (noEvents(objInput))
            popupCalendar(pais, this, halign, valign, popFrame, departureFieldName, arrivalFieldName, pAnticipationDays);
    };
    objInput.onblur = function(event) {
        popdown();
        leaveCalendar(this, departureFieldName, arrivalFieldName, pais);
    };
    objInput.onkeydown = function(event) {
        popdown(true);
    };
    objInput.onmouseover = function(event) {
        mouseOverCtrl(this);
    };
    objInput.onmouseout = function(event) {
        mouseOutCtrl(this);
    };
}

function prepareButton(pais, buttonId, inputId, halign, valign, popFrame, departureFieldName, arrivalFieldName, pAnticipationDays) {

    var objInput = document.getElementById(buttonId);
    objInput.onclick = function(event) {
        if (noEvents(objInput))
            popupCalendar(pais, document.getElementById(inputId), halign, valign, popFrame, departureFieldName, arrivalFieldName, pAnticipationDays);
    };

    objInput.onkeydown = function(event) {
        popdown(true);
    };

    objInput.style.cursor = 'pointer';
    objInput.style.cursor = 'hand';
}

function noEvents(obj) {
    return obj.className.indexOf("noEvents") < 0;
}

function initCalendarEventsTrier() {
    if (initTries > 0) {
        try {
            initCalendarEvents();
        } catch (e) {
            window.setTimeout(initCalendarEventsTrier, 500);
        } finally {
            initTries--;
        }
    }/* else {
        alert('Ocurrio un error al cargar la pagina\nPor favor, vuelva a intentarlo.\nGracias.');
    }*/
}

function setToday(pdToday) {
    gCalToday = parseDate(pdToday);
    //   gCalToday.setHours(12); // Esto esta porque sino anda mal isDateBeforeTodayAndAnticipation(datediff), le da 1 dia menos de diferencia
}

function setMonthsToShow(piMonths) {
    monthsToShow = piMonths;
}

function setTodayDesdeHome(pdToday) {
    // Esto es porque en la home se incluye /paginas/be2/bejs/becalendario.js que redefine setToday()
    gCalToday = parseDate(pdToday);
    //   gCalToday.setHours(12); // Esto esta porque sino anda mal isDateBeforeTodayAndAnticipation(datediff), le da 1 dia menos de diferencia
}

var initTries = 120;

initCalendarEventsTrier();

/*FIN CALENDARIO*/

/* ****************** */
/* Variables Globales */
/* ****************** */
var gDespegarAutCompLastLocatorId = null;
var gDespegarAutCompCompleterResults = {};
var gDespegarAutCompCompleterPreCache = {};
var gDespegarAutCompCompleterObjs = {};

var domainPath = "http://www.despegar.com";

var overPopupAC = false;
var locator = new Object();
var paq = 1;

var globalac = new Object();

//Estas dos variables (globalac.Origen y globalac.OrigenDesc) se estan usando para paquetes,
//y se cambian a nivel global en la funcion changeOriginLocation(), lo cual esta mal. Por este motivo,
//agrego un parametro opcional al constructor, que es el id del del select que contiene
//dicho valor, pero para poder mantener compatibilidad hacia atras con este desastre, 
//tengo que dejar estas dos variables globales, e ignorarlas cuando se define el parametro nuevo
//Gabriel Jurgens
globalac.Origen = "";
globalac.OrigenDesc = "";

//seteo el idioma por default en español (portuges = 'pt')
globalac.language = "es";

//configuraciones para el trigger de busqueda de resultado
globalac.initialWaitingTime = 1000;
globalac.minWaitingTime = 250;
globalac.minInputLength = 3;

globalac.flights = new Object();

/* *********** */
/* SERVER URLs */
/* *********** */

globalac.serverURLs = new Array();
globalac.serverURLs["paq"] = "/paginas/autoComplete/completerpaq.aspx?"; 
globalac.serverURLs["pre"] = "/paginas/autoComplete/completerPreviaje.aspx?TipoVenta=2&";
globalac.serverURLs["vue"] = "/Autocomplete/AutoComplete.svc/";
globalac.serverURLs["hot"] = globalac.serverURLs["vue"];
//globalac.serverURLs["vue"] = "/paginas/autoComplete/completer.aspx?TipoVenta=2&";
globalac.serverURLs["aer"] = "/paginas/autoComplete/completeraerolineas.aspx?TipoVenta=2&";


/* ****** */
/* Textos */
/* ****** */
var texts = new Array("es", "pt");

texts["es"] = new Array()
texts["pt"] = new Array();

texts["es"]["vue"] = new Object();
texts["es"]["hot"] = new Object();
texts["es"]["paq"] = new Object();
texts["es"]["pre"] = new Object();
texts["es"]["aer"] = new Object();
texts["pt"]["vue"] = new Object();
texts["pt"]["paq"] = new Object();
texts["pt"]["pre"] = new Object();
texts["pt"]["aer"] = new Object();

//textos en español de ciudades
texts["es"]["vue"].nowSearching = "Buscando ciudades...<br>(Siga escribiendo, o aguarde ver las opciones)";
texts["es"]["vue"].moreCharsNeeded1 = "Ingrese al menos las ";
texts["es"]["vue"].moreCharsNeeded2 = " primeras letras de la ciudad,<br>y aguarde a ver los resultados.";
texts["es"]["vue"].noResults = "No se encontraron ciudades<br>que contengan ";
texts["es"]["vue"].noResults2 = "";
texts["es"]["vue"].inputDefaultText = "Ingrese la ciudad";
texts["es"]["vue"].viewMore = "Ver más resultados..."; 

//textos en portugues de ciudades
texts["pt"]["vue"].nowSearching = "Procurando cidades...<br>(Continue escrevendo, ou aguarde as opções)";
texts["pt"]["vue"].moreCharsNeeded1 = "Digite pelo menos as ";
texts["pt"]["vue"].moreCharsNeeded2 = " primeiras letras da cidade<br>e aguarde para ver os resultados.";
texts["pt"]["vue"].noResults = "Não foram encontradas cidades que contenham ";
texts["pt"]["vue"].noResults2 = "";
texts["pt"]["vue"].inputDefaultText = "Digite a cidade";
texts["pt"]["vue"].viewMore = "Ver mais resultados..."; 

//textos hoteles (iguales a vuelos)
texts["es"]["hot"] = texts["es"]["vue"];
texts["pt"]["hot"] = texts["pt"]["vue"];

//textos previaje (iguales a vuelos)
texts["es"]["pre"] = texts["es"]["vue"];
texts["pt"]["pre"] = texts["pt"]["vue"];

//textos en español de paquetes
texts["es"]["paq"].nowSearching = "Buscando destinos...<br>(Siga escribiendo, o aguarde ver las opciones)";
texts["es"]["paq"].moreCharsNeeded1 = "Ingrese al menos las ";
texts["es"]["paq"].moreCharsNeeded2 = " primeras letras del destino,<br>y aguarde a ver los resultados.";
texts["es"]["paq"].noResults = "No hay paquetes ";
texts["es"]["paq"].noResults2 = "Elija otro origen o destino.";
texts["es"]["paq"].inputDefaultText = "Escriba región, país o ciudad";

//textos en portugues de paquetes
texts["pt"]["paq"].nowSearching = "Procurando destinos...<br>(Continue escrevendo, ou aguarde as opções)";
texts["pt"]["paq"].moreCharsNeeded1 = "Digite pelo menos as ";
texts["pt"]["paq"].moreCharsNeeded2 = " primeiras letras do destino<br>e aguarde para ver os resultados.";
texts["pt"]["paq"].noResults = "Não foram encontrados pacotes ";
texts["pt"]["paq"].noResults2 = "Escolha outra origem ou destino.";
texts["pt"]["paq"].inputDefaultText = "Digite região, país ou cidade";


//textos en español de Aerolineas
texts["es"]["aer"].nowSearching = "Buscando Aerolineas...<br>(Siga escribiendo, o aguarde ver las opciones)";
texts["es"]["aer"].moreCharsNeeded1 = "Ingrese al menos las ";
texts["es"]["aer"].moreCharsNeeded2 = " primeras letras del nombre de la aerolinea,<br>y aguarde a ver los resultados.";
texts["es"]["aer"].noResults = "No se encontraron aerolineas ";
texts["es"]["aer"].noResults2 = "Elija otra aerolinea.";
texts["es"]["aer"].inputDefaultText = "Escriba una aerolinea";

//textos en portugues de Aerolineas
texts["pt"]["aer"].nowSearching = "Buscando Aerolineas...<br>(Siga escribiendo, o aguarde ver las opciones)";
texts["pt"]["aer"].moreCharsNeeded1 = "Ingrese al menos las ";
texts["pt"]["aer"].moreCharsNeeded2 = " primeras letras del nombre de la aerolinea,<br>y aguarde a ver los resultados.";
texts["pt"]["aer"].noResults = "No se encontraron aerolineas ";
texts["pt"]["aer"].noResults2 = "Elija otra aerolinea.";
texts["pt"]["aer"].inputDefaultText = "Escriba una aerolinea";


/* **************************************** */
/* Mapeo para Backward compatibility con la */
/* interfaz vieja del objeto autocomplete   */
/* **************************************** */
function DespegarAutCompCompleter(inputId, popupFunc, popdownFunc, popupid,
                          tabToId, callback, hiddenId, defaultText,
                          defaultValue, DestTypeHiddenId, MultipleHiddenId, Producto) {

    var searchType = "vue";
    switch (Producto) {
        case 1:
            searchType = "paq";
            break;
        case 5:
            searchType = "pre";
            break;
        case 6:
            searchType = "aer";
            break;
        case 2:
        default:
            searchType = "vue";
            break;
    }
    this.oParams = {
        "textInput": inputId,
        "valueInput": hiddenId,
        "tabToInput": tabToId,
        "callBackFunction": callback,
        "defaultText": defaultText,
        "defaultValue": defaultValue,
        "searchType": searchType,
        "popupFunc": popupFunc,
        "popdownFunc": popdownFunc,
        "popupid": popupid,
        "destTypeInput": DestTypeHiddenId,
        "destMultipleInput": MultipleHiddenId,
        "origenSelect": "",
        "urlType": ""
    };

    return new AutoComplete(this.oParams);
}

/* ************************************ */
/* Objeto DespegarAutCompleter (inicio) */
/* ************************************ */
function AutoComplete(oParams) {

    // internal vars
    if (oParams.searchType)
        this.searchType = oParams.searchType;
    else
        this.searchType = "vue";


    this.inputId = oParams.textInput;
    this.hiddenId = oParams.valueInput;
    this.DestTypeHiddenId = oParams.destTypeInput;
    this.MultipleHiddenId = oParams.destMultipleInput;
    this.defaultText = oParams.defaultText;
    this.defaultValue = oParams.defaultValue;
    this.currentLocator = null;
    this.completerTimeout = 0;
    this.currentOption = -1;
    this.nrOfOptions = 0;
    this.urlType = oParams.urlType;

    if (oParams.popupFunc)
        this.popupFunc = oParams.popupFunc;
    else
        this.popupFunc = completerPopupWrapAC;

    if (oParams.popdownFunc)
        this.popdownFunc = oParams.popdownFunc;
    else
        this.popdownFunc = completerPopdownWrapAC;

    if (oParams.popupid)
        this.popupid = oParams.popupid;
    else
        this.popupid = "dapopupac";

    this.tabToId = oParams.tabToInput;
    this.callback = oParams.callBackFunction;
    this.locked = false;
    this.lockedtext = '';


    //para mantener compatibilidad hacia atras.
    this.Origen = globalac.Origen;
    this.OrigenDesc = globalac.OrigenDesc;

    //Si se pasa el select con el origen del paquete por parametro, lo uso
    this.origenSelect = oParams.origenSelect;
    this.oOrigenSelect = document.getElementById(this.origenSelect);
    if (this.oOrigenSelect) {
        this.Origen = this.oOrigenSelect.options[this.oOrigenSelect.selectedIndex].value;
        this.OrigenDesc = this.oOrigenSelect.options[this.oOrigenSelect.selectedIndex].text;
    }

    // constantes
    this.MAXOPTIONS = 15;
    this.OPTION_FILLER = "&nbsp;&nbsp;";

    this.locCode = null;
    this.locDesc = null;

    this.LOCATORID = "despegarautcomplocator";

    gDespegarAutCompCompleterObjs[this.inputId] = this;

    //pongo en blanco los campos, para prevenir F5 con datos basura
    //document.getElementById(this.inputId).value = "";
    //document.getElementById(this.hiddenId).value = "";
    //document.getElementById(this.DestTypeHiddenId).value = "";
    //document.getElementById(this.MultipleHiddenId).value = "";

    this.setCode = function(code) {
        this.locCode = code;
    };

    this.setDesc = function(desc) {
        var inp = document.getElementById(this.inputId);
        inp.value = desc;
        this.locDesc = new Object();
        this.locDesc.y = desc;
        this.locDesc.c = '';
        this.locDesc.cc = '';
    };

    this.setLockedText = function(text) {
        this.lockedtext = text;
    };

    this.removeOptionFiller = function(option) {
        return option.replace(RegExp("^\&nbsp;\&nbsp;(.*)", "ig"), "$1");
    };

    this.selectLocatorOption = function(nr, locator) {
        if (locator == null)
            locator = document.getElementById(this.LOCATORID);

        var inp = document.getElementById(this.inputId);

        this.selectOption(locator.childNodes[nr].option, inp);
    };

    this.selectOption = function(option, inp) {
        if (option.m == "+++") {
            viewMore(inp, option);
		}
        else {
            inp.value = option ? option.n : '';
            this.locCode = this.removeOptionFiller(option ? option.m : '');
            this.locDesc = option;

            if (this.searchType == "paq") {
                if (this.callback)
                    this.callback(inp, option, this.hiddenId, this.DestTypeHiddenId, this.MultipleHiddenId);
            }
            else {
                if (this.callback)
                    this.callback(inp, option, this.hiddenId);
            }
        }
    };


    this.lowlight = function() {
        var bla = document.getElementById(this.LOCATORID);
        if (this.currentOption >= 0 && bla.childNodes[this.currentOption] != "undefined")
            bla.childNodes[this.currentOption].className = "locatoroption";
    };
    this.highlight = function(dir, update, scrollIntoView) {
        var bla = document.getElementById(this.LOCATORID);
        if(bla) {
            if (this.currentOption >= 0 && this.nrOfOptions > 0)
                bla.childNodes[this.currentOption].className = "locatoroption";
            this.currentOption = this.currentOption + dir;
            if (this.currentOption < 0)
                this.currentOption = 0;
            else if (this.currentOption >= bla.childNodes.length)
                this.currentOption = bla.childNodes.length - 1;
            bla.childNodes[this.currentOption].className = "locatoroptionmo";
            if (scrollIntoView) {
                if (scrollIntoView == 1) // down
                    bla.childNodes[this.currentOption].scrollIntoView(false);
                else if (scrollIntoView == -1) // up
                //le paso false, para que no salte toda la pagina
                //bla.childNodes[this.currentOption].scrollIntoView(true);
                    bla.childNodes[this.currentOption].scrollIntoView(false);
            }
            if (update && this.nrOfOptions > 0) {
                this.selectLocatorOption(this.currentOption, bla);
            }
        }
    };

    this.adjustLocatorHeight = function(locator, extra) {
        // check the locator height
        var nr = (this.nrOfOptions) ? this.nrOfOptions + (extra ? extra : 0) : 1;
        nr = (nr > this.MAXOPTIONS) ? this.MAXOPTIONS : nr;
        var h = locator.firstChild.offsetHeight;

        var ieExtraSpace = 3;

        var pop = document.getElementById(this.popupid);
        pop.style.height = h * nr + 3 + "px";

        horzPosPopupAC();
        setPopupCoverAC();
    };

    this.selectDefaultAirport = function(locator, shouldTab) {
        var tabToEl = null;
        if (this.nrOfOptions && locator.childNodes.length > 0) {
            if (this.currentOption != -1) {
                this.selectLocatorOption(this.currentOption, locator);
            }
            else {
                this.selectLocatorOption(0, locator);
            }

            if (this.tabToId && shouldTab) {
                gDespegarAutCompLastLocatorId = null;
                tabToEl = document.getElementById(this.tabToId);
            }
        } else {
            if (document.getElementById(this.hiddenId).value.length != 3 && this.searchType != "paq" && (this.searchType != "vue" || !flowRevancha['v'])) {
                document.getElementById(this.inputId).value = texts[globalac.language][this.searchType].inputDefaultText;
                document.getElementById(this.inputId).title = texts[globalac.language][this.searchType].inputDefaultText;
            }
        }

        this.removeAllOptions();
        this.popdownFunc();
        if (tabToEl && tabToEl.select && getMouseOverCtrl() == '')
            tabToEl.select();
    };

    // =============================
    // Events handlers for the input

    this.locatorkd = function(me, ev) {
        var locator = null;
        var bla = document.getElementById(this.popupid);
        if (bla.calledby != me) {
            ev = ev || event || null;
            if (ev) {
                var cc = ev.charCode || ev.keyCode || ev.which;
                //Busco sólo en caso de ser un caracter
                if (cc != 9 && cc != 13 && (cc < 16 || cc > 20)
                    && cc != 27 && (cc < 33 || cc > 40) && cc != 45
                    && (cc < 91 || cc > 93) && (cc < 112 || cc > 123)
                    && cc != 144 && cc != 145) //tab, enter, ctrl, etc
                {
                    //mientras busco, vacio el codigo IATA.
                    this.popupFunc(me);
                    locator = document.getElementById(this.LOCATORID);
                    if (locator.firstChild == null) {
                        nothing = document.createElement('DIV');
                        locator.appendChild(nothing);
                        nothing.innerHTML = "<span class=\"noresults\">" + texts[globalac.language][this.searchType].nowSearching + "</span>";
                        document.getElementById(this.hiddenId).value = '';
                    }

                    this.adjustLocatorHeight(locator);
                }
            }
        }
        //catch tab dispense the rest to locator
        ev = ev || event || null;
        if (ev) {
            var cc = ev.charCode || ev.keyCode || ev.which;

            if (cc == 9 || cc == 13) //tab, enter
            {
                if (locator == null)
                    locator = document.getElementById(this.LOCATORID);

                this.selectDefaultAirport(locator, false);
                return false;
            }
            else if (cc == 38 || cc == 57385) //tecla hacia arriba
            {
                this.highlight(-1, true, -1);
                return false;
            }
            else if (cc == 40 || cc == 57386) //tecla hacia habajo
            {
                this.highlight(1, true, 1);
                return false;
            }
        }

        return true;
    };

    this.locatorkp = function(me, ev) {
        ev = ev || event || null;
        if (ev) {
            var cc = ev.charCode || ev.keyCode || ev.which;
            if (cc == 38 || cc == 57385 || cc == 40 || cc == 57386) return false; //up or down

            if (cc == 13 && this.currentOption > -1) {
                this.selectLocatorOption(this.currentOption);
                this.lowlight();
                this.removeAllOptions();
                popdownac(true);
            }
        }
        return true;
    };
    this.locatorku = function(me, ev) {
        var bla = document.getElementById(this.popupid);
        if (bla.calledby == me) {
            ev = ev || event || null;
            if (ev) {
                var cc = ev.charCode || ev.keyCode || ev.which;
                if (cc == 38 || cc == 40 || cc == 57385 || cc == 57386 || cc == 13 || cc == 27)
                    return false;

                //si no tengo la cantidad minima de caracteres necesarios, salgo de la funcion
                if (document.getElementById(this.inputId).value.length < globalac.minInputLength) {
                    var locator = document.getElementById(this.LOCATORID);

                    if (locator.firstChild == null) {
                        nothing = document.createElement('DIV');
                        locator.appendChild(nothing);
                        nothing.innerHTML = "<span class=\"noresults\">" + texts[globalac.language][this.searchType].moreCharsNeeded1 + globalac.minInputLength + texts[globalac.language][this.searchType].moreCharsNeeded2 + "</span>";
                    }
                    else {
                        nothing = document.createElement('DIV');
                        this.removeAllOptions();
                        locator.appendChild(nothing);
                        nothing.innerHTML = "<span class=\"noresults\">" + texts[globalac.language][this.searchType].moreCharsNeeded1 + globalac.minInputLength + texts[globalac.language][this.searchType].moreCharsNeeded2 + "</span>";
                        this.adjustLocatorHeight(locator);
                    }
                    return false;
                } else {
                    var locator = document.getElementById(this.LOCATORID);
                    if (this.nrOfOptions < 1) {
                        if (locator.firstChild == null) {
                     nothing =  document.createElement('DIV');
                     locator.appendChild(nothing);
                        nothing.innerHTML = "<span class=\"noresults\">" + texts[globalac.language][this.searchType].nowSearching + "</span>";
                  }
                    else {
                     nothing =  document.createElement('DIV');
                     this.removeAllOptions();
                     locator.appendChild(nothing);
                        nothing.innerHTML = "<span class=\"noresults\">" + texts[globalac.language][this.searchType].nowSearching + "</span>";
                     this.adjustLocatorHeight(locator);
                  }
             }
                }

                gDespegarAutCompLastLocatorId = me.id;
                /*
                window.clearTimeout(this.completerTimeout);
                if (cc != 8) //el backspace
                {
                //seteo el tiempo de espera inicial en globalac.initialWaitingTime.
                //este tiempo se va a ir dividiendo por la cantidad de letreas ingresadas
                //hasta llegar al minWaitingTime. Es decir que nunca esperara menos de minWaitingTime seg.
                var inputLength = document.getElementById(this.inputId).value.length + 1
                if (inputLength == 0) inputLength = 1;

                    var waitingTime = globalac.initialWaitingTime / inputLength;

                    if (waitingTime < globalac.minWaitingTime) waitingTime = globalac.minWaitingTime;
                //waitingTime = 0;
                }
                else {
                waitingTime = globalac.minWaitingTime;
                }
                //alert(waitingTime);
                //Set a new one
                this.completerTimeout = window.setTimeout("despegarautcompCompleterGo()", waitingTime);
                */
                despegarautcompCompleterGo(false);
            }
            this.highlight(0);
        }

        return true;
    };

    this.locatormc = function(me, ev) {
        //Si tiene el texto por default, lo limpio.
        if(me.value == this.defaultText) {
            me.value = '';
            document.getElementById(this.hiddenId).value = '';
        }
        //Si tiene otro texto, lo selecciono.
        else {
            me.select();
        }
    };

    this.locatorblur = function(me) {
        if (me.id != this.inputId)
            return;
        var locator = document.getElementById(this.LOCATORID);
        if (cleanInput(me.value) == "") {
            me.value = this.defaultText;
            document.getElementById(this.hiddenId).value = this.defaultValue;
            return;
        }
        else if (locator == null) {
            return;
        }

        if (this.currentOption != -1) {
            option = locator.childNodes[this.currentOption].option;
            if (option && option.m == "+++") {
                viewMore(document.getElementById(this.inputId), option);
                return;
            }
        }


        //para Internet Explorer, detecto los click en la barra de scroll en
        //forma manual
        if (navigator.appName == "Microsoft Internet Explorer") {
            //detecto si hizo click en la barra de scroll
            var isScroll = false;
            if (locator.childNodes.length > this.MAXOPTIONS) {
                var locatorDiv = document.getElementById(this.popupid);
                var mouseX = window.event.clientX;
                var mouseY = window.event.clientY;
                /*var scrollBarWidth = 18;
                var scrollBarRight = locatorDiv.clientLeft + locatorDiv.offsetLeft + locatorDiv.clientWidth;
                var scrollBarLeft = scrollBarRight + scrollBarWidth;
                var scrollBarTop = locatorDiv.clientTop + locatorDiv.offsetTop - document.body.scrollTop;
                var scrollBarBottom = scrollBarTop + locatorDiv.clientHeight;

                if (mouseX > scrollBarRight && mouseX < scrollBarLeft
                && mouseY > scrollBarTop && mouseY < scrollBarBottom) {
                isScroll = true;
                }
                else {
                isScroll = false;
                }*/
                isScroll = document.elementFromPoint(mouseX, mouseY).id == locatorDiv.id;
            }
            if (!isScroll)
                this.selectDefaultAirport(locator, true);
            else
                document.getElementById(this.inputId).focus();
        }
        else {
            //browser distinto de IExplorer
            this.selectDefaultAirport(locator, true);
        }
    };


    this.despegarautcompoptionmc = function(me, ev) {
    };
    
    this.despegarautcompoptionmout = function() {
        this.lowlight();
        this.className = "locatoroption";
        this.currentOption = -1;
    };

    this.despegarautcompoptionmover = function(option) {
        this.lowlight();
        this.currentOption = option.index;
        this.highlight(0);
    };

    this.despegarautcompoptionmwheel = function(ev) {
        return true;
    };



    this.removeAllOptions = function() {
        var bla = document.getElementById(this.LOCATORID);
        if (bla && bla.childNodes) {
            while (bla.childNodes.length) {
                bla.removeChild(bla.firstChild);
            }
        }

        this.nrOfOptions = 0;
        this.currentOption = -1;
    };
    this.loadLocked = function(txt) {
        var matches = [];
        var one;
        var utxt = txt.toUpperCase();
        for (var i = 0; i < this.locked.length - 1; i++) {
            one = this.locked[i];
            if (one.m.toUpperCase().indexOf(utxt) == 0 || one.y.toUpperCase().indexOf(utxt) == 0)
                matches[matches.length] = one;
        }
        if (matches.length > 0)
            despegarautcompShowOptions(this.searchType + '_' + txt, matches, this.inputId, false);
        else {
            despegarautcompShowOptions(this.searchType + '_' + txt, this.locked, this.inputId, false);
            var input = document.getElementById(this.inputId);
            input.value = this.lockedtext;
            input.select();

        }
    };


    this.prepareInput = function(inputId, hiddenId) {
        var objInput = document.getElementById(inputId);
        var objHidden = document.getElementById(hiddenId);

        //seteo los eventos
        objInput.onclick = function(event) {
            despegarautcomplocatormc(this, event);
        };

        objInput.onkeydown = function(event) {
            despegarautcomplocatorkd(this, event);
        };

        objInput.onkeyup = function(event) {
            despegarautcomplocatorku(this, event);
        };

        objInput.onkeypress = function(event) {
            despegarautcomplocatorkp(this, event);
        };

        objInput.onblur = function(event) {
            despegarautcomplocatorblur(this); popdownac();
        };

        //seto el texto del input
        if (this.defaultText != undefined && this.defaultValue != undefined
         && this.defaultText != '' && this.defaultValue != '') {
            objInput.value = this.defaultText;
            objInput.title = this.defaultText;
            //document.getElementById(this.hiddenId).value = this.defaultValue;
            objHidden.value = this.defaultValue;

        }
        else {
            if (objInput.value == "")
                objInput.value = texts[globalac.language][this.searchType].inputDefaultText;
        }

        //seto el texto del input
        if (this.defaultText != undefined && this.defaultValue != undefined
         && this.defaultText != '' && this.defaultValue != '') {
            objInput.value = this.defaultText;
            objInput.title = this.defaultText;
            //document.getElementById(this.hiddenId).value = this.defaultValue;
            objHidden.value = this.defaultValue;

        }
        else {
            //si solo mando un texto por default, lo seteo
            if (this.defaultText != undefined && this.defaultText != '') {
                objInput.value = this.defaultText;
            }
            else {
                if (objInput.value == "")
                    objInput.value = texts[globalac.language][this.searchType].inputDefaultText;
            }
        }
    };

    /* agrego el iFrame y Div auxiliar */
    //createAuxiliarIframeAndDiv();

    /* Seteo los eventos para el input */
    this.prepareInput(this.inputId, this.hiddenId);

    /*Miembros para retener el estado de la búsqueda*/
    this.matches = [];
    this.lastTrigram = "";
    this.isSearching = false;
}
/* ********************************* */
/* Objeto DespegarAutCompleter (fin) */
/* ********************************* */


/* **************************************************** */
/* Funcion que prepara el imput para regular expresions */
/* **************************************************** */

function prepareInputForRegExp(input) {

    return input.replace(/[aA\u00e0\u00c0\u00e1\u00c1\u00e2\u00c2\u00e3\u00c3]/g, "[aA\u00e0\u00c0\u00e1\u00c1\u00e2\u00c2\u00e3\u00c3]")
        .replace(/[eE\u00e8\u00c8\u00e9\u00c9\u00eA\u00cA\u00eB\u00cB]/g, "[eE\u00e8\u00c8\u00e9\u00c9\u00eA\u00cA\u00eB\u00cB]")
        .replace(/[iI\u00eC\u00cC\u00eD\u00cD\u00eE\u00cE\u00eF\u00cF]/g, "[iI\u00eC\u00cC\u00eD\u00cD\u00eE\u00cE\u00eF\u00cF]")
        .replace(/[oO\u00f2\u00d2\u00f3\u00d3\u00f4\u00d4\u00f5\u00d5\u00f6\u00d6]/g, "[oO\u00f2\u00d2\u00f3\u00d3\u00f4\u00d4\u00f5\u00d5\u00f6\u00d6]")
        .replace(/[uU\u00f9\u00d9\u00fA\u00dA\u00fB\u00dB\u00fC\u00dC]/g, "[uU\u00f9\u00d9\u00fA\u00dA\u00fB\u00dB\u00fC\u00dC]")
        .replace(/[cC\u00e7\u00c7]/g, "[cC\u00e7\u00c7]")
        .replace(/[nN\u00f1\u00d1]/g, "[nN\u00f1\u00d1]")
        .replace(/[\(\)]/g, "[\\(\\)]")
        .replace(/\^/g, "\\^")
        .replace(/\$/g, "\\$")
        .replace(/\^/g, "\\^")
        .replace(/\./g, "\\.")
        .replace(/\?/g, "\\?")
        .replace(/\*/g, "\\*")
        .replace(/\+/g, "\\+")
        .replace(/\|/g, "\\|");
}


function cleanInput(input) {
    return input.replace(/\s+/g, " ")
        .replace(/[^\w\s\u00f1\u00d1\u00e7\u00c7\u00e0\u00c0\u00e1\u00c1\u00e2\u00c2\u00e3\u00c3\u00e8\u00c8\u00e9\u00c9\u00eA\u00cA\u00eB\u00cBiI\u00eC\u00cC\u00eD\u00cD\u00eE\u00cE\u00eF\u00cF\u00f2\u00d2\u00f3\u00d3\u00f4\u00d4\u00f5\u00d5\u00f6\u00d6\u00f9\u00d9\u00fA\u00dA\u00fB\u00dB\u00fC\u00dC]/g, "")
        .replace(/^\s+|\s+$/g, '')
        .replace(/\bde\b/g, "")
        .replace(/\ba\b/g, "")
        .replace(/\bdel\b/g, "")
        .replace(/\bdo\b/g, "")
        .replace(/\bdos\b/g, "");
}

/* **************************** */
/* Funcion de llamada del timer */
/* **************************** */
function despegarautcompCompleterGo(viewMore) {
    var obj = gDespegarAutCompCompleterObjs[gDespegarAutCompLastLocatorId];
    var bla = document.getElementById(gDespegarAutCompLastLocatorId);
    if (bla) {
        var txt = cleanInput(bla.value);
        //if(txt.length > 0)
        if (txt.length >= globalac.minInputLength) {
            if (obj.locked)
                obj.loadLocked(obj.searchType + '_' + txt);
            else {
                var cached = gDespegarAutCompCompleterResults[obj.searchType + '_' + txt];
                if (cached && obj.searchType != "paq") {
                    despegarautcompShowOptions(obj.searchType + '_' + txt, cached, gDespegarAutCompLastLocatorId, false);
                }
                else {
                    //si la la busqueda textual no se hizo, me fijo si no se hizo ya
                    //una busqueda mas amplia que contenga a la actual
                    for (var i = txt.length - 1; i >= globalac.minInputLength && !cached; i--) {
                        cached = gDespegarAutCompCompleterResults[obj.searchType + '_' + txt.substr(0, i)];
                    }
                    if (cached && obj.searchType != "paq") {
                        //encontro una busqueda mas amplia, filtro el cache para mandar solo
                        //las conincidencias
                        var filteredCache = new Array();
                        
                        var tmpInput = prepareInputForRegExp(txt);
                        var inputWords = tmpInput.split(" ");

                        var matchedByN;
                        var matchedByM;
                        var matchedByA;

                        var regularExpressions = [];
                        for (var i = 0; i < inputWords.length; i++) {
                            //Creo la RegExp AccentInsensitive
                            regularExpressions.push(new RegExp("^(" + inputWords[i] + ")|([(, ]" + inputWords[i] + ")", "ig")); //busca al principio del string o en el comienzo de la palabra
                        }

                        for (var x = 0; x < cached.length; x++) {
                            matchedByN = true;
                            matchedByM = true;
                            matchedByA = true;
                            for (var i = 0; i < regularExpressions.length; i++) {
                                matchedByM = matchedByM && !(cached[x].m.match(regularExpressions[i]) == null);
                                matchedByN = matchedByN && !(cached[x].n.match(regularExpressions[i]) == null);
                                matchedByA = matchedByA && !(cached[x].a.match(regularExpressions[i]) == null);
                            }
                            if (matchedByM || matchedByN || matchedByA) {
                                filteredCache.push(cached[x]);
                            }
                        }
                        gDespegarAutCompCompleterResults[obj.searchType + '_' + txt] = filteredCache;
                        despegarautcompShowOptions(obj.searchType + '_' + txt, filteredCache, gDespegarAutCompLastLocatorId, false);
                    }
                    else {
                        //Reviso los resultados ya resueltos por la precache
                        var filteredPreCache = new Array();
                        if ((obj.searchType == "vue" || obj.searchType == "hot") && !viewMore && obj.lastTrigram != "" && obj.lastTrigram == txt.substr(0, globalac.minInputLength).toUpperCase()) {
                            var tmpInput = prepareInputForRegExp(txt);
                            var inputWords = tmpInput.split(" ");

                            var matchedByN;
                            var matchedByM;
                            var matchedByA;
                            
                            var regularExpressions = [];
                            for (var i = 0; i < inputWords.length; i++) {
                                //Creo la RegExp AccentInsensitive
                                regularExpressions.push(new RegExp("^(" + inputWords[i] + ")|([(, ]" + inputWords[i] + ")", "ig")); //busca al principio del string o en el comienzo de la palabra
                            }

                            for (var x = 0; x < obj.matches.length; x++) {
                                matchedByN = true;
                                matchedByM = true;
                                matchedByA = true;
                                for (var i = 0; i < regularExpressions.length; i++) {
                                    matchedByM = matchedByM && !(obj.matches[x].m.match(regularExpressions[i]) == null);
                                    matchedByN = matchedByN && !(obj.matches[x].n.match(regularExpressions[i]) == null);
                                    matchedByA = matchedByA && !(obj.matches[x].a.match(regularExpressions[i]) == null);
                                }

                                if (matchedByM || matchedByN || matchedByA) {
                                    filteredPreCache.push(obj.matches[x]);
                                }
                            }
                        }
                        else {
                            //Reviso la precache
                            var preCached = TC;
                            if (preCached && (obj.searchType == "vue" || obj.searchType == "hot") && !viewMore) {

                                obj.lastTrigram = txt.substr(0, globalac.minInputLength).toUpperCase();

                                var filteredPreCachedByN = [];
                                var filteredPreCachedByM = [];
                                var filteredPreCachedByA = [];

                                var matchedByN;
                                var matchedByM;
                                var matchedByA;

                                var tmpInput = prepareInputForRegExp(txt);
                                var inputWords = tmpInput.split(" ");
                                var regularExpressions = [];
                                for (var i = 0; i < inputWords.length; i++) {
                                    //Creo la RegExp AccentInsensitive
                                    regularExpressions.push(new RegExp("^(" + inputWords[i] + ")|([(, ]" + inputWords[i] + ")", "ig")); //busca al principio del string o en el comienzo de la palabra
                                }

                                for (var x = 0; x < preCached.length; x++) {
                                    matchedByN = true;
                                    matchedByM = true;
                                    matchedByA = true;
                                    for (var i = 0; i < regularExpressions.length; i++) {
                                        matchedByM = matchedByM && !(preCached[x].m.match(regularExpressions[i]) == null);
                                        matchedByN = matchedByN && !(preCached[x].n.match(regularExpressions[i]) == null);
                                        matchedByA = matchedByA && !(preCached[x].a.match(regularExpressions[i]) == null);
                                    }
                                    if (matchedByM) {
                                        filteredPreCachedByM.push(preCached[x]);
                                    }
                                    else if (matchedByN) {
                                        filteredPreCachedByN.push(preCached[x]);
                                    }
                                    else if (matchedByA) {
                                        filteredPreCachedByA.push(preCached[x]);
                                    }
                                }
                                filteredPreCache = filteredPreCachedByM.concat(filteredPreCachedByN).concat(filteredPreCachedByA);
                                obj.matches = filteredPreCache;
                            }
                        }
                        if (!viewMore && filteredPreCache.length > 0) {
                            despegarautcompShowOptions(obj.searchType + '_' + txt, filteredPreCache, gDespegarAutCompLastLocatorId, true);
                        }
                        else {
                            //Para mantener compatibilidad hacia atras
                            if (obj.oOrigenSelect)
                                obj.Origen = obj.oOrigenSelect.options[obj.oOrigenSelect.selectedIndex].value;
                            else
                                obj.Origen = globalac.Origen
                            if (obj.urlType == "rest") {
                                if (new RegExp("\\w\\w\\w|\\w\\s\\w|\\w\\w\\s").test(txt.substr(0, globalac.minInputLength)) && !obj.isSearching) {
                                    obj.isSearching = true;
                                    getJSON(globalac.serverURLs[obj.searchType] + globalac.language + "/" + txt.replace(/ /g, "_").substr(0, globalac.minInputLength), txt);
                                }
                                else
                                    despegarautcompShowOptions(obj.searchType + '_' + txt, new Array(), gDespegarAutCompLastLocatorId, true);
                            }
                            else
                                loadContentAC(domainPath + globalac.serverURLs[obj.searchType]+ "lang=" + globalac.language + "&locator=" + gDespegarAutCompLastLocatorId + "&input=" + txt + '&codOrigen=' + obj.Origen);
                        }
                    }
                }
            }
        }
    }
}

/* ******************* */
/* Handlers de eventos */
/* ******************* */
function despegarautcomplocatorkd(me,ev)
{
    var obj = gDespegarAutCompCompleterObjs[me.id];
    obj.locatorkd(me, ev);
}

function despegarautcomplocatorkp(me, ev)
{
    var obj = gDespegarAutCompCompleterObjs[me.id];
    obj.locatorkp(me, ev);
}

function despegarautcomplocatorku(me, ev)
{
    var obj = gDespegarAutCompCompleterObjs[me.id];
    obj.locatorku(me, ev);
}

function despegarautcomplocatormc(me, ev)
{
    var obj = gDespegarAutCompCompleterObjs[me.id];
    obj.locatormc(me, ev);
}

function despegarautcomplocatorblur(me)
{
    var obj = gDespegarAutCompCompleterObjs[me.id];
    obj.locatorblur(me);
}

function despegarautcompoptionmc(ev)
{
    //alert(despegarautcompoptionmc);
}

function despegarautcompoptionmout(ev)
{
    ev = ev || window.event || null;
    var targ = getEvTargetAC(ev);
    var option = (targ.inputId) ? targ : targ.parentNode;
    var obj = gDespegarAutCompCompleterObjs[option.inputId];
    obj.despegarautcompoptionmout();
}

function despegarautcompoptionmover(ev)
{
    ev = ev || window.event || null;
    var targ = getEvTargetAC(ev);
    var option = (targ.inputId) ? targ : targ.parentNode;
    var obj = gDespegarAutCompCompleterObjs[option.inputId];
    obj.despegarautcompoptionmover(option);
}

function despegarautcompoptionmwheel(ev)
{
    ev = ev || window.event || null;
    var targ = getEvTargetAC(ev);
    var option = (targ.inputId) ? targ : targ.parentNode;
    var obj = gDespegarAutCompCompleterObjs[option.inputId];
    obj.despegarautcompoptionmwheel(ev);
}

/* *********************** */
/* Constructor de Opciones */
/* *********************** */
function despegarautcompShowOptions(input, matches, inputId, preCached) {
    var obj = gDespegarAutCompCompleterObjs[inputId];

    input = cleanInput(input.substr(4, input.length));
    // remove older results
    obj.removeAllOptions();
    var bla = document.getElementById(obj.LOCATORID);
    var option, match, name;

    if (bla) {
        if (matches.length > 0) {
            //Hago que la RegExp sea AccentInsensitive
            //gabriel jurgens
            //var r1 = new RegExp("([(, ]" + input + ")","ig"); //busca en el comienzo de la palabra
            //var r2 = new RegExp("^(" + input + ")","i"); //busca en el principio del string

            var tmpInput = prepareInputForRegExp(input);
            var inputWords = tmpInput.split(" ");

            var regularExpressions = [];
            for (var i = 0; i < inputWords.length; i++) {
                //Creo la RegExp AccentInsensitive
                regularExpressions.push(new RegExp("([(, ]" + inputWords[i] + ")", "ig")); //busca en el comienzo de la palabra
                regularExpressions.push(new RegExp("^(" + inputWords[i]  + ")", "i")); //busca en el principio del string
            }

            for (var i = 0; i < matches.length; i++) {
                match = matches[i];
                option = document.createElement('DIV');
                bla.appendChild(option);
                option.onmouseover = despegarautcompoptionmover;
                option.onmouseout = despegarautcompoptionmout;
                option.onmousewheel = despegarautcompoptionmwheel;
                option.onclick = despegarautcompoptionmc;
                option.className = "locatoroption";
                option.index = i;
                option.inputId = inputId;
                name = match.n;
                for (var j = 0; j < regularExpressions.length; j++) {
                    name = name.replace(regularExpressions[j], "<b>$1</b>");
                }
                option.innerHTML = obj.OPTION_FILLER + name;
                option.option = match;
            }

            obj.nrOfOptions = matches.length;

            if (preCached) {
                option = document.createElement('DIV');
                bla.appendChild(option);
                option.onmouseover = despegarautcompoptionmover;
                option.onmouseout = despegarautcompoptionmout;
                option.onmousewheel = despegarautcompoptionmwheel;
                option.onclick = despegarautcompoptionmc;
                option.className = "locatoroption";
                option.index = i;
                option.inputId = inputId;
                option.option = { n: texts[globalac.language][obj.searchType].viewMore, m: "+++", a: input };
                option.innerHTML = obj.OPTION_FILLER + option.option.n;
                obj.nrOfOptions++;
            }
        }
        else //no results or default results
        {
            nothing = document.createElement('DIV');
            bla.appendChild(nothing);
            //Para mantener compatibilidad hacia atras
            if (obj.oOrigenSelect)
                obj.OrigenDesc = obj.oOrigenSelect.options[obj.oOrigenSelect.selectedIndex].text;
            else
                obj.OrigenDesc = globalac.OrigenDesc;

            nothing.innerHTML = "<span class=\"noresults\">" + texts[globalac.language][obj.searchType].noResults + '"' + stripHTML(input) + '"' + "<br>" + texts[globalac.language][obj.searchType].noResults2 + "</span>";

            obj.nrOfOptions = 0;
        }
        obj.adjustLocatorHeight(bla);
    }
    else {
        //Possible that the user has tabbed out... If we have one match or the input was a three digit code
        //with a matching option then we can enter it
        if (gDespegarAutCompLastLocatorId) {
            var locinp = document.getElementById(gDespegarAutCompLastLocatorId);
            if (locinp) {
                if (matches.length == 1) {
                    return obj.selectOption(matches[0], locinp);
                }
                else if (matches.length > 1) {
                    var ui = input.toUpperCase();
                    for (var i = 0; i < matches.length; i++) {
                        if (matches[i].m.toUpperCase() == ui)
                            return obj.selectOption(matches[i], locinp);
                    }
                }
                //if we are here then make sure the user know nothing is selected:
                obj.selectOption(null, locinp);
            }
        }
    }
    document.getElementById(inputId).focus();
    return '';
}

function despegarautcompFilterMatches(input, matches, inputId, success) {
    var filteredMatches = new Array();
    var filteredMatchesByN = [];
    var filteredMatchesByM = [];
    var filteredMatchesByA = [];
    var matchedByN;
    var matchedByM;
    var matchedByA;

    var tmpInput = prepareInputForRegExp(cleanInput(input));
    var inputWords = tmpInput.split(" ");
    var regularExpressions = [];
    for (var i = 0; i < inputWords.length; i++) {
        //Creo la RegExp AccentInsensitive
        regularExpressions.push(new RegExp("^(" + inputWords[i] + ")|([(, ]" + inputWords[i] + ")", "ig")); //busca al principio del string o en el comienzo de la palabra
    }

    for (var x = 0; x < matches.length; x++) {
        matchedByN = true;
        matchedByM = true;
        matchedByA = true;
        for (var i = 0; i < regularExpressions.length; i++) {
            matchedByM = matchedByM && !(matches[x].m.match(regularExpressions[i]) == null);
            matchedByN = matchedByN && !(matches[x].n.match(regularExpressions[i]) == null);
            matchedByA = matchedByA && !(matches[x].a.match(regularExpressions[i]) == null);
        }
        if (matchedByM) {
            filteredMatchesByM.push(matches[x]);
        }
        else if (matchedByN) {
        filteredMatchesByN.push(matches[x]);
        }
        else if (matchedByA) {
        filteredMatchesByA.push(matches[x]);
        }
    }
    filteredMatches = filteredMatchesByM.concat(filteredMatchesByN).concat(filteredMatchesByA);

    despegarautcompBuildOptions(input, filteredMatches, inputId, success);
}

function despegarautcompBuildOptions(input, matches, inputId, success) {
    var obj = gDespegarAutCompCompleterObjs[gDespegarAutCompLastLocatorId];
    if (success) {
        gDespegarAutCompCompleterResults[obj.searchType + '_' + input] = matches;
    }

    //verifico el resultado sea valido todavia
    if (input == document.getElementById(inputId).value)
        despegarautcompShowOptions(obj.searchType + '_' + input, matches, inputId, false);
}


function despegarautcompPreCache(searchType, input, matches) {
    gDespegarAutCompCompleterPreCache[searchType + '_' + input] = matches;
}


/* ****************** */
/* Funciones de PopUps */
/* ****************** */

function completerPopupWrapAC(inputEl) {
    popupac(inputEl, "locator", 0, 1);

}
function completerPopdownWrapAC() {
    popdownac(true);
}

function popdownac(force) {
    if (force || !overPopupAC) {
        var bla = document.getElementById("dapopupac");
        bla.className = "popup";
        bla.style.height = "";
        if (bla.firstChild)
            bla.removeChild(bla.firstChild);
        bla.calledby = null;
        currentLocator = null;
        currentDateField = null;
        currentProgress = null;

        var cov = document.getElementById("dapopupcoverac");
        cov.style.visibility = "hidden";
        cov.style.display = "none";
    }
}

function overpopupac() {
    overPopupAC = true;
}
function leavepopupac() {
    overPopupAC = false;
}
function clickpopupac() {
    var bla = document.getElementById("dapopupac");
}

function horzPosPopupAC() {
    var bla = document.getElementById("dapopupac");
    var cx = findPosXAC(bla.calledby);
    var x = alignac(bla.halign, cx, bla.calledby.offsetWidth, bla.offsetWidth);

    if (!bla.fixed) {
        var r = clientRect();
        var y = 0;
        var c = contained({ 'l': x, 't': y, 'r': x + bla.offsetWidth, 'b': y + bla.offsetHeight }, r);

        if (c.axis == 'x') {
            //flip or nudge
            if (bla.valign == 0 || bla.valign == 3)//flip to side
                x = alignac(c.diff > 0 ? 1 : 2, cx, bla.calledby.offsetWidth, bla.offsetWidth);
            else x += c.diff;
        }
    }

    //Fix para el pop up de Nueva búsqueda en IE
    if (navigator.appName == "Microsoft Internet Explorer" && bla.parentNode.className == "nuevaBusqueda") {
        x += 19;
    }

    bla.style.left = x + "px";
}

function positionpopupac(p) {
    var bla = p ? p : document.getElementById("dapopupac");
    bla.style.visibility = "hidden";
    bla.style.position = "absolute";
    bla.style.display = "block";
    if (bla.calledby) {
        var cx = findPosXAC(bla.calledby);
        var cy = findPosYAC(bla.calledby);
        var x = alignac(bla.halign, cx, bla.calledby.offsetWidth, bla.offsetWidth);
        var y = alignac(bla.valign, cy, bla.calledby.offsetHeight, bla.offsetHeight);

        /*
        alert(cx + ':' + cy);
        alert(x + ':' + y);
        */

        //alert(bla.calledby.tagName);

        //y = cy + 30

        if (!bla.fixed) {
            if (p.popFrame && p.popFrame != '' && document.getElementById(p.popFrame))
            var r = elementRect(document.getElementById(p.popFrame));
            else
            var r = clientRect();

            var c = contained({ 'l': x, 't': y, 'r': x + bla.offsetWidth, 'b': y + bla.offsetHeight }, r);

            if (c.axis == 'y') //x okay
            {
                //flip or nudge
                if (bla.halign == 0 || bla.halign == 3)//flip up/down
                    y = alignac(c.diff > 0 ? 1 : 2, cy, bla.calledby.offsetHeight, bla.offsetHeight);
                else y += c.diff;
            }
            else if (c.axis == 'x') //y okay
            {
                //flip or nudge
                if (bla.valign == 0 || bla.valign == 3)//flip to side
                    x = alignac(c.diff > 0 ? 1 : 2, cx, bla.calledby.offsetWidth, bla.offsetWidth);
                else x += c.diff;
            }
        }

        //Fix para el pop up de Nueva búsqueda en IE
        if (navigator.appName == "Microsoft Internet Explorer" && bla.parentNode.className == "nuevaBusqueda") {
            y += 19;
        }
        bla.style.left = x + "px";
        bla.style.top = y + "px";
    }

    bla.style.visibility = "visible";
}


function setPopupCoverAC() {
    if (navigator.appName != "Microsoft Internet Explorer")
        return;

    var bla = document.getElementById("dapopupac");
    var cov = document.getElementById("dapopupcoverac");
    cov.style.display = "block";
    cov.style.left = bla.style.left;
    cov.style.top = bla.style.top;
    cov.style.width = bla.offsetWidth;
    cov.style.height = bla.offsetHeight;
    cov.style.visibility = "visible";
}


function popupac(me, c, halign, valign, popFrame) {
    //p=popup, c=calledby
    //halign: null|0-> p.left = c.left , 1-> p.left = c.right, 2->p.right = c.left, 3->p.right =c.right, 4-> p.left = c.middle,
    //valign: null|0-> p.top = c.top, 1-> p.top = c.bottom, 2-> p.bottom = c.top, 3-> p.bottom = c.bottom, 4-> p.top = c.bottom

    var bla = document.getElementById("dapopupac");
    bla.noWrap = true;
    if (bla.firstChild)
        bla.removeChild(bla.firstChild);
    if (c == "locator") {
        bla.appendChild(locator.contents);
        currentLocator = me;
    }

    bla.halign = halign ? halign : 0;
    bla.valign = valign ? valign : 0;
    bla.fixed = (c == "locator" ? true : false);
    bla.popFrame = popFrame;
    bla.calledby = me;
    if (bla.className.indexOf(c) == -1) {
        bla.className = "popup " + c;
    }
    positionpopupac(bla);
    setPopupCoverAC();

}


function findPosXAC(obj) {
    var curleft = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent && !obj.className.toLowerCase().match("popup")) {
            curleft += obj.offsetLeft;
            obj = obj.offsetParent;
        }
    }
    else if (obj.x)
        curleft += obj.x;
    return curleft;
}

function findPosYAC(obj) {
    var curtop = 0;
    if (obj.offsetParent) {
        while (obj.offsetParent && !obj.className.toLowerCase().match("popup")) {
            curtop += obj.offsetTop;
            obj = obj.offsetParent;
        }
    }
    else if (obj.y)
        curtop += obj.y;
    return curtop;
}

function alignac(t, p, whc, whp) {
    //window.status = "t:"+ t + " p:" + p + " whc:" + whc + " whp:" + whp
    if (t) {
        if (t == 0)
            return p + 400;
        if (t == 1)
            return p + whc;
        if (t == 2)
            return p - whp;
        if (t == 3)
            return p + whc - whp;
        if (t == 4)
            return Math.round(p + whc / 2);
    }
    return p;
}





function createLocatorAC() {
    locator.contents = document.createElement("DIV");
    locator.contents.id = "despegarautcomplocator";
}

function loadContentAC(file, suffix) {

    var head = document.getElementsByTagName('head').item(0);
    var scriptId = 'loadScript' + (suffix ? suffix : '');
    var scriptTag = document.getElementById(scriptId);

    //if(scriptTag) head.removeChild(scriptTag);
    var script = document.createElement('script');

    script.src = file;
    script.name = "contentloader";
    script.type = 'text/javascript';
    script.id = scriptId;

    head.appendChild(script);
    return "";
}

function getEvTargetAC(ee) {
    var targ;
    var e = ee;
    if (!e) e = window.event;
    if (e.target) targ = e.target;
    else if (e.srcElement) targ = e.srcElement;
    if (targ.nodeType == 3) // defeat Safari bug
        targ = targ.parentNode;
    return targ;
}

function getJSON(url, txt) {
    var http_request;
    if (!window.XMLHttpRequest)
        http_request = new ActiveXObject('Microsoft.XMLHTTP');
    else
        http_request = new XMLHttpRequest();

    // Descarga los datos JSON del servidor.
    http_request.onreadystatechange = handle_json;
    http_request.open("GET", url, true);
    http_request.send(null);


    function handle_json() {
        if (http_request.readyState == 4) {
            var obj = gDespegarAutCompCompleterObjs[gDespegarAutCompLastLocatorId];
            if (http_request.status == 200) {
                var data = eval('(' + http_request.responseText + ')');
                gDespegarAutCompCompleterResults[obj.searchType + '_' + txt.substr(0, globalac.minInputLength)] = data;
                despegarautcompFilterMatches(txt, data, gDespegarAutCompLastLocatorId, true);
            }
            else
                despegarautcompFilterMatches(txt, [], gDespegarAutCompLastLocatorId, false);

            obj.isSearching = false;
        }
    }
}

function viewMore(input, option) {
    var obj = gDespegarAutCompCompleterObjs[gDespegarAutCompLastLocatorId];
    gDespegarAutCompCompleterResults[obj.searchType + '_' + option.a] = "";
    input.value = option.a;
    despegarautcompCompleterGo(true);
}

/* ******************** */
/* Fuciones de CallBack */
/* ******************** */
function airportSelected(objInput, option, hiddenId) {
    var obj = gDespegarAutCompCompleterObjs[gDespegarAutCompLastLocatorId];
    if (option != null && option.m && document.getElementById(hiddenId)) {
        document.getElementById(hiddenId).value = option.m.toUpperCase();
        objInput.title = option.n;
    }
    else {
        if (document.getElementById(hiddenId)) {
            document.getElementById(hiddenId).value = '';
            objInput.value = texts[globalac.language][obj.searchType].inputDefaultText;
            objInput.title = texts[globalac.language][obj.searchType].inputDefaultText;
        }
    }
}


function DestinySelected(objInput, option, hiddenId, DestTypeHiddenId, MultipleHiddenId) {
    var obj = gDespegarAutCompCompleterObjs[gDespegarAutCompLastLocatorId];
    if (option != null && option.m && document.getElementById(hiddenId)) {
        document.getElementById(hiddenId).value = option.m.toUpperCase();
        document.getElementById(DestTypeHiddenId).value = option.t;
        document.getElementById(MultipleHiddenId).value = option.u;
        objInput.title = option.n;
        if (document.getElementById('sBusqFiltro').value == 'Y') {
            updateFiltros2();
        }
    }
    else
        if (document.getElementById(hiddenId)) {
        document.getElementById(hiddenId).value = '';
        document.getElementById(DestTypeHiddenId).value = '';
        document.getElementById(MultipleHiddenId).value = '';

        objInput.value = texts[globalac.language][obj.searchType].inputDefaultText;
        objInput.title = texts[globalac.language][obj.searchType].inputDefaultText;
    }
}

function DestinySelectedHome(objInput, option, hiddenId, DestTypeHiddenId, MultipleHiddenId) {
    var obj = gDespegarAutCompCompleterObjs[gDespegarAutCompLastLocatorId];
    if (option != null && option.m && document.getElementById(hiddenId)) {
        document.getElementById(hiddenId).value = option.m.toUpperCase();
        document.getElementById(DestTypeHiddenId).value = option.t;
        document.getElementById(MultipleHiddenId).value = option.u;
        objInput.title = option.n;
    }
    else
        if (document.getElementById(hiddenId)) {
        document.getElementById(hiddenId).value = '';
        document.getElementById(DestTypeHiddenId).value = '';
        document.getElementById(MultipleHiddenId).value = '';

        objInput.value = texts[globalac.language][obj.searchType].inputDefaultText;
        objInput.title = texts[globalac.language][obj.searchType].inputDefaultText;
    }
}

/*
una vez que tengo el script cargado, llamo a la funcion de inicializacion
definida en el HTML. Si todavia no se cargo esa seccion del HTML, intento
initTries veces cada 500 milisegundos, hasta que se cargue.
*/

function initAutoComplete() {
    if (initTries > 0) {

        try {
            loadAutoComplete();
        } catch (e) {
            window.setTimeout(initAutoComplete, 500);
        } finally {
            initTries--;
        }
    } /*else {
        alert('Ocurrio un error al cargar la pagina\nPor favor, vuelva a intentarlo.\nGracias.');
    }*/
}

function createAuxiliarIframeAndDiv()
{
   if(!document.getElementById('dapopupcoverac'))
   {
        //creo el siguiente iframe en forma dinamica
        //<iframe class="popupcover" id="dapopupcoverac" frameBorder="0" scrolling="no" style="display:none;"></iframe>
        var objIframe = document.createElement('iframe');
        objIframe.id = "dapopupcoverac";
        objIframe.className = "popupcover";
        objIframe.frameBorder = "0";
        objIframe.scrolling = "no";
        objIframe.style.display = "none";

        document.body.appendChild(objIframe);
    }

   if(!document.getElementById('dapopupac'))
   {
        //creo el siguiente div en forma dinamica
        //<div class="popup" id="dapopupac" onmouseover="overpopupac();" onmouseout="leavepopupac();" onclick="clickpopupac();" onscroll="clickpopupac();"></div>
        var objDiv = document.createElement('div');
        objDiv.id = "dapopupac";
        objDiv.className = "popup";

        //seteo los eventos
      objDiv.onmouseover = function(event)
      {
            overpopupac();
        };
        objDiv.onmouseout = function(event) {
            leavepopupac();
        };
        objDiv.onclick = function(event) {
            clickpopupac();
        };
        objDiv.onscroll = function(event) {
            clickpopupac();
        };

        document.body.appendChild(objDiv);
    }
}

var initTries = 1200;
initAutoComplete();

