﻿

//sets the first item in a listbox as selected
function SetFirstItemAsSelected(listbox)
{
    if (listbox.options.length > 0)
    {
        listbox.options[0].selected = true;
    }
}

//moves selected items between listboxes
function MoveItems(from, to)
{

    for (var i = 0; i < from.options.length; )
    {
        if (from.options[i].selected)
        {
            to.options[to.options.length] = new Option(from.options[i].text, from.options[i].value);
            from.options[i] = null;
        }
        else
        {
            i++;
        }
    }

    SortItems(to);
    SetFirstItemAsSelected(from);
    SetFirstItemAsSelected(to);
}

//moves all items between listboxes
function MoveAllItems(from, to)
{
    var num = from.options.length;

    for (i = 0; i < num; i++)
    {
        to.options[to.options.length] = new Option(from.options[0].text, from.options[0].value);
        from.options[0] = null;
    }

    SortItems(to);
    SetFirstItemAsSelected(from);
    SetFirstItemAsSelected(to);
}

//populates a hidden field (container) from a listbox
function PopulateContainerValuesFromList(listbox, container)
{

    container.value = "";
    for (var i = 0; i < listbox.options.length; i++)
    {
        if (i != 0)
        {
            container.value += "|";
        }
        container.value += listbox.options[i].value + "^" + listbox.options[i].text;
    }

}

//populates a hidden fields from a dropdownlist
function PopulateContainerValuesFromDropdownList(ddl, availableValuesContainer, selectedValueContainer)
{
    availableValuesContainer.value = "";
    selectedValueContainer.value = "";

    for (var i = 0; i < ddl.options.length; i++)
    {
        if (i != 0)
        {
            availableValuesContainer.value += "|";
        }
        availableValuesContainer.value += ddl.options[i].value + "^" + ddl.options[i].text;

        if (ddl.options[i].selected)
        {
            selectedValueContainer.value += ddl.options[i].value;
        }
    }

}

//sorts items in a listbox
function SortItems(listbox)
{
    var content = new Array();
    var opt;

    //Store all options as an array of strings like "option_text^option_value" and remove all options from 
    //the listbox (we assume that neither texts nor values contain "^" symbol).
    for (var i = 0; i < listbox.options.length; i++)
    {
        content[i] = listbox.options[i].text + "^" + listbox.options[i].value;
    }

    //Sort array
    content.sort();

    //Populate listbox by adding texts and values from sorted array
    for (var i = 0; i < listbox.options.length; i++)
    {
        opt = content[i].split("^");
        listbox.options[i].text = opt[0];
        listbox.options[i].value = opt[1];
    }

}

//refreshes items in the building available and selected listboxes
function RefreshBuildings(neighborhoodsSelected, condosAvailable, condosSelected, neighborhoodsLookup, buildingsLookup)
{
    
    var condo_name = "";
    var condo_value = "";
    var buildings = null;
    var neighborhoodId = null;
    var selectedBuildingsLookup = new Array();
    var selectedNeighborhoodsLookup = new Array();

    condosAvailable.selectedIndex = -1;
    condosAvailable.options.length = 0;

    //first, lets create an associative array of selected buildings
    for (var i = 0; i < condosSelected.length; i++)
    {
        selectedBuildingsLookup[condosSelected.options[i].value] = true;
    }


    //now, create an associative array of selected neighborhoods
    for (var i = 0; i < neighborhoodsSelected.length; i++)
    {
        selectedNeighborhoodsLookup[neighborhoodsSelected.options[i].value] = true;
    }


    // for each selected neighborhood, add associated buildings to the available buildings listbox
    // if the associated buildings are not in the selected buildings listbox
    for (var i = 0; i < neighborhoodsSelected.length; i++)
    {

        buildings = neighborhoodsLookup[neighborhoodsSelected.options[i].value];

        if (buildings)
        {
            
            for (var j = 0; j < buildings.c_ids.length; j++)
            {
                //add it to available buildings listbox if it is not in the selected buildings listbox
                if (!selectedBuildingsLookup[buildings.c_ids[j]])
                {
                    condosAvailable.options[condosAvailable.options.length] = new Option(buildings.c_names[j], buildings.c_ids[j]);
                }

            }
        }
    }


    //remove items from selected buildings listbox if their neighborhood is not in the selected neighborhoods listbox
    for (var i = 0; i < condosSelected.length; )
    {
        //get the neighborhood id for this building
        neighborhoodId = buildingsLookup[condosSelected.options[i].value];

        if (selectedNeighborhoodsLookup[neighborhoodId])
        {
            i++;
        }
        else
        {
            condosSelected.options[i] = null;
        }
    }


    SortItems(condosAvailable);
    SetFirstItemAsSelected(condosAvailable);
    SetFirstItemAsSelected(condosSelected);
}

//Load regions and clears neighborhood and building listboxes.  neighborhood and building parameters are optional
function LoadRegions(ddlIslands, ddlRegions, islandsLookup, hidIslandChangedFlag, lbAvailableNeighborhoods, lbSelectedNeighborhoods, lbAvailableCondos, lbSelectedCondos, noRegionSelectionValue, initialNoRegionSelectionText, noRegionSelectionText, imgMap, noIslandSelectionValue, regionsLookup) {
    var val = ddlIslands.options[ddlIslands.selectedIndex].value;
    var regions = islandsLookup[val];
  //To display openhouse control only for Oahu island
//    if (val == 1) {
//        openHouseControlForOahu.css("display", "block")
//       
//    }
//    else {
//        openHouseControlForOahu.css("display", "none")
//    }
//    //To display water front control for maui, lanai & molokai island
//    if ((val == 2) || (val == 5) || (val == 6)) {
//        waterFrontControl.css("display", "block")
//    }
//    else {
//        waterFrontControl.css("display", "none")
//    }
    ddlRegions.selectedIndex = -1;
    ddlRegions.options.length = 0;

    if (lbAvailableNeighborhoods)
    {
        lbAvailableNeighborhoods.selectedIndex = -1;
        lbAvailableNeighborhoods.options.length = 0;
    }

    if (lbSelectedNeighborhoods)
    {
        lbSelectedNeighborhoods.selectedIndex = -1;
        lbSelectedNeighborhoods.options.length = 0;
    }

    if (lbAvailableCondos)
    {
        lbAvailableCondos.selectedIndex = -1;
        lbAvailableCondos.options.length = 0;
    }

    if (lbSelectedCondos)
    {
        lbSelectedCondos.selectedIndex = -1;
        lbSelectedCondos.options.length = 0;
    }

    if (regions)
    {
        if (regions.ids.length > 0) {

            if (regions.ids.length > 1) {
                ddlRegions.options[0] = new Option(noRegionSelectionText, noRegionSelectionValue);
            }

            for (var i = 0; i < regions.ids.length; i++)
            {
                ddlRegions.options[ddlRegions.length] = new Option(regions.names[i], regions.ids[i]);
            }
        
            if (regions.ids.length == 1) {
                FireOnChangeEvent(ddlRegions);
            }
        }
    }
    else
    {
        ddlRegions.options[0] = new Option(initialNoRegionSelectionText, noRegionSelectionValue);
    }

    hidIslandChangedFlag.value = "true";

    
    //set map image
    //SetMapImage(ddlIslands, ddlRegions, imgMap, noIslandSelectionValue, noRegionSelectionValue, regionsLookup, islandsLookup) 

}

//validates that a dropdownlist min is greater than a max
function ValidateDropdownListRange(errorMsg, ddlMin, ddlMax, noSelectionValue)
{
    var isValid = true;

    if (ddlMin.options[ddlMin.selectedIndex].value != noSelectionValue && ddlMax.options[ddlMax.selectedIndex].value != noSelectionValue && parseFloat(ddlMin.options[ddlMin.selectedIndex].value) > parseFloat(ddlMax.options[ddlMax.selectedIndex].value))
    {
        isValid = false;
    }

    if (!isValid)
    {
        alert(errorMsg);
    }

    return isValid;
}

//displays an alert and returns false if all specified checkboxes are not checked
//this function accepts a variable number of arguments
//the first argument is the message to be returned on error
//all arguments after that are checkboxes to be validated
function ValidateCheckboxGroup(errorMsg, cb1)
{
    var isValid = false;

    for (var i = 1; i < arguments.length; i++)
    {
        if (arguments[i].checked)
        {
            isValid = true;
        }
    }

    if (!isValid)
    {
        alert(errorMsg);
    }

    return isValid;
}

//Displays the specified errorMsg and returns false if the specified dropdownlist is set to the noSelectionValue
//i.e. if no real valid is made, the errorMsg is shown and false is returned.
function ValidateDropdownList(errorMsg, noSelectionValue, ddl)
{
    var isValid = true;

    if (ddl.options[ddl.selectedIndex].value == noSelectionValue)
    {
        isValid = false;
    }

    if (!isValid)
    {
        alert(errorMsg);
    }

    return isValid;
}

//Displays the specified message and returns false if the specified listbox is empty
function ValidateListbox(errorMsg, lb)
{
    var isValid = false;

    if (lb.length > 0)
    {
        isValid = true;
    }

    if (!isValid)
    {
        alert(errorMsg);
    }

    return isValid;
}

//moves selected neighborhoods between listboxes
function MoveNeighborhoods(from, to)
{
    MoveItems(from, to);
}

//moves all selected neighborhoods between listboxes
function MoveAllNeighborhoods(from, to)
{
    MoveAllItems(from, to);
}

//moves selected buildings between listboxes
function MoveBuildings(from, to)
{
    MoveItems(from, to);
}

//moves all selected neighborhoods between listboxes
function MoveAllBuildings(from, to)
{
    MoveAllItems(from, to);
}

function ClearBuildings(ddlBuildingsAvailable, ddlBuildingsSelected) {
    if (ddlBuildingsAvailable) {
        ddlBuildingsAvailable.selectedIndex = -1;
        ddlBuildingsAvailable.options.length = 0;
    }

    if (ddlBuildingsSelected) {
        ddlBuildingsSelected.selectedIndex = -1;
        ddlBuildingsSelected.options.length = 0;
    }
}

function ZoomOut(ddlIslands, ddlRegions, noIslandSelectionValue, noRegionSelectionValue) {

    var regionVal = ddlRegions.options[ddlRegions.selectedIndex].value;
    var islandVal = ddlIslands.options[ddlIslands.selectedIndex].value;

    //set to island view if region is selected
    if (regionVal == noRegionSelectionValue) 
    {
        SetIsland(ddlIslands, noIslandSelectionValue);
    }
    else //set to default view
    {
        SetIsland(ddlIslands, islandVal);
    }
}

function SetIsland(ddlIsland, selectedIsland) {

    SelectByVal(ddlIsland, selectedIsland);
    FireOnChangeEvent(ddlIsland);
}

function SetRegion(ddlRegion, selectedRegion) {

    SelectByVal(ddlRegion, selectedRegion);
    //fire ajax postback
    FireOnChangeEvent(ddlRegion);
}

function SelectByVal(ddl, val) 
{
    var len = ddl.options.length;
    for (var i = 0; i < len; i++) 
    {
        if (ddl.options[i].value == val) 
        {
            ddl.selectedIndex = i;
        }
    }
}

function SetMapImageOahu(ddlIslands, ddlRegions, imgMap, breadCrumbsMap, noIslandSelectionValue, noRegionSelectionValue, regionsLookup, islandsLookup) {


    var islandVal = ddlIslands.options[ddlIslands.selectedIndex].value;
    var regionVal = ddlRegions.options[ddlRegions.selectedIndex].value;
    
    //if no island is selected, show all islands map
    if (islandVal == noIslandSelectionValue)
    {
        imgMap.useMap = "#I0";
        imgMap.src = "/maps/all_islands.jpg";
    }
    //if no region is selected, show island maps
    else if (regionVal == noRegionSelectionValue) 
    {
        
        var islandVal = ddlIslands.options[ddlIslands.selectedIndex].value;
        //the map id is I<selected_val> except for lanai and molokai, which don't have usemaps
        if (islandVal == "5" || islandVal == "6") {
            imgMap.useMap = "";
        }
        else {
        
            imgMap.useMap = "#I" + islandVal;
        }
        
        imgMap.src = islandsLookup[islandVal].imageUrl;

    }
    //region is selected, use region map without use map
    else 
    {
        var regionVal = ddlRegions.options[ddlRegions.selectedIndex].value;
        
        //if kaneohe is selected, set appropriate region map
        if (regionVal == "4") {
            if (imgMap.useMap == "#R0") {
                imgMap.src = "maps/oahu/kaneohe_town.jpg";
                imgMap.useMap = "#R1";
            }
            else {
                imgMap.src = "maps/oahu/kaneohe_full.jpg";
                imgMap.useMap = "#R0";
            }
        }
        else
        {
            imgMap.useMap = "";
            imgMap.src = regionsLookup[regionVal];
        }
    }

    imgMap.blur();

    SetMapBreadCrumbs(breadCrumbsMap, imgMap, ddlIslands, ddlRegions, noIslandSelectionValue, noRegionSelectionValue, false);
    
}

function ZoomOut(ddlIslands, ddlRegions, noIslandSelectionValue, noRegionSelectionValue) {

    var regionVal = ddlRegions.options[ddlRegions.selectedIndex].value;
    var islandVal = ddlIslands.options[ddlIslands.selectedIndex].value;

    //set to island view if region is selected
    if (regionVal == noRegionSelectionValue) {
        SetIsland(ddlIslands, noIslandSelectionValue);
    }
    else //set to default view
    {
        SetRegion(ddlRegions, noRegionSelectionValue);
    }
}

function SetMapImageHome(ddlIslands, ddlRegions, imgMap, breadCrumbsMap, noIslandSelectionValue, noRegionSelectionValue, regionsLookup, islandsLookup, isIslandSelection) {

    var islandVal = ddlIslands.options[ddlIslands.selectedIndex].value;
    var regionVal = ddlRegions.options[ddlRegions.selectedIndex].value;

    //if no island is selected, show all islands map
    if (ddlIslands.value == noIslandSelectionValue) {
        imgMap.useMap = "#I0";
        imgMap.src = "/homemaps/all_islands.jpg";
    }
    //if this an island change or if no region is selected, show island maps
    else if (isIslandSelection || ddlRegions.value == noRegionSelectionValue) {

        imgMap.src = islandsLookup[islandVal].imageUrl;
    
        //the map id is I<selected_val> except for lanai and molokai, which don't have usemaps
        if (islandVal == "5" || islandVal == "6") {
            imgMap.useMap = "";
        }
        else 
        {
            imgMap.useMap = "#I" + islandVal;
        }
    }
    //region is selected, use region map without use map
    else 
    {
        imgMap.src = regionsLookup[regionVal];
        imgMap.useMap = "#I" + islandVal;
    }

    imgMap.blur();

    SetMapBreadCrumbs(breadCrumbsMap, imgMap, ddlIslands, ddlRegions, noIslandSelectionValue, noRegionSelectionValue, true, isIslandSelection);
    
}

function SetMapBreadCrumbs(breadCrumbsMap, imgMap, ddlIslands, ddlRegions, noIslandSelectionValue, noRegionSelectionValue, includeAllIslandsCrumb, isIslandSelection) {
    //breadcrumbs
    var islandVal = ddlIslands.options[ddlIslands.selectedIndex].value;
    var islandText = ddlIslands.options[ddlIslands.selectedIndex].text;
    var regionVal = ddlRegions.options[ddlRegions.selectedIndex].value;
    var regionText = ddlRegions.options[ddlRegions.selectedIndex].text;

    var breadcrumb = "";
    //if no selection is made, just show all islands
    if (islandVal == noIslandSelectionValue && (regionVal == noRegionSelectionValue || isIslandSelection)) {
        breadcrumb += "All Islands";
    }
    //flag to force All islands link to display
    else if (includeAllIslandsCrumb) {
        breadcrumb += "<a href=\"javascript:SetIsland($('#" + ddlIslands.id + "').get(0), " + noIslandSelectionValue + ");\">All Islands</a>";
    }
    
    //if an island and no region is selected or if this is an island selection (which resets regions), show island text
    if (islandVal != noIslandSelectionValue && (regionVal == noRegionSelectionValue || isIslandSelection)) {

        if (includeAllIslandsCrumb) {
            breadcrumb += " > ";
        }

        breadcrumb += islandText
    }
    //else if an island and region is selected, show the entire string
    else if (islandVal != noIslandSelectionValue && regionVal != noRegionSelectionValue) {
        if (includeAllIslandsCrumb) {
            breadcrumb += " > ";
        }
        breadcrumb += "<a href=\"javascript:SetRegion($('#" + ddlRegions.id + "').get(0), " + noRegionSelectionValue + ");\">";
        breadcrumb += islandText;
        breadcrumb += "</a>";
        
        if (regionVal == "4" && imgMap.useMap == "#R1") {
            breadcrumb += " > " + "Kaneohe Town";
        }
        else {
            breadcrumb += " > " + regionText;
        }
        
    }

    breadCrumbsMap.innerHTML = breadcrumb;
}

function ZoomOutHome(ddlIslands, ddlRegions, noIslandSelectionValue, noRegionSelectionValue) {

    var regionVal = ddlRegions.options[ddlRegions.selectedIndex].value;
    var islandVal = ddlIslands.options[ddlIslands.selectedIndex].value;

    //set to all islands view if region is not selected
    if (regionVal == noRegionSelectionValue) 
    {
        SetIsland(ddlIslands, noIslandSelectionValue);
    }
    else //set to island view
    {
        //the map id is I<selected_val> except for lanai and molokai, which don't have usemaps
        if (islandVal == "5" || islandVal == "6") 
        {
            SetIsland(ddlIslands, noIslandSelectionValue);
        }
        else 
        {
            SetRegion(ddlRegions, noRegionSelectionValue);
        }
    }
}

function FireOnChangeEvent(elem) {
    FireEvent(elem, 'change');
}


function FireOnClickEvent(elem) {
    FireEvent(elem, 'click');
}

//eventName should be the event without preceding "on" such as click or change
function FireEvent(elem, eventName) {
    //On IE
    if (elem.fireEvent) {
        elem.fireEvent('on' + eventName);
    }
    //On Gecko based browsers
    else if (document.createEvent) {
        var evt = document.createEvent('HTMLEvents');
        if (evt.initEvent) {
            evt.initEvent(eventName, true, true);
        }
        if (elem.dispatchEvent) {
            elem.dispatchEvent(evt);
        }
    }
}

function Hide(elem) {
    elem.style.display = "none";
}