﻿/*
 *  Create the namespace
 */
ninemsn.mylocal.search = function(){};
var search = ninemsn.mylocal.search;

ninemsn.mylocal.search.defaultWhere   = "Suburb and state or postcode";
ninemsn.mylocal.search.defaultWhat    = "Category, product or service";

/*
 * handleSearchClick
 * @param {element} whatID    : dom element 'what' field
 * @param {element} whereID   : dom element 'where' field
 * @param {element} typeID    : dom element 'type' field
 * description:
 * This is the default function called when a user clicks a search button somewhere
 * Parse info contained within the search fields, call our basic search function
 * with the extracted info. 
 */
ninemsn.mylocal.search.handleSearchClick = function(whatID, whereID, typeID)
{
    whatID = utl.IsNullOrEmpty(whatID) ? window.g_whatID : whatID;
    whereID = utl.IsNullOrEmpty(whereID) ? window.g_whereID : whereID;
    typeID = utl.IsNullOrEmpty(typeID) ? window.g_businessTypeID : typeID;
    
    var elWhat      = document.getElementById(whatID);
    var elWhere     = document.getElementById(whereID);
    var elType      = document.getElementById(typeID);
            
    if (!elWhat || elWhat.value == ninemsn.mylocal.search.defaultWhat 
        || !elWhere || elWhere.value == ninemsn.mylocal.search.defaultWhere
        || !elType)
        return false;               

//    var what = elWhat.value.trimPunc().trimDSpace();
//    var where = elWhere.value.trimPunc().trimDSpace();
    var what = escape(elWhat.value.trim());
    var where = elWhere.value.trim();
                
    if (!what || !what)
        return false;
        
    /*
     *  Proxy through getBusinessListings until we know whether
     *  we want to continue using asp.net controls
     */        
    var type = elType.checked ? 0 : 1;
    ninemsn.mylocal.search.getBusinessListings(what,where,type);
    
    return false;
};

/*
 * getBusinessListings
 * @param {element} what    : 'what' term search parameter
 * @param {element} where   : 'where' term search parameter
 * @param {element} type    : 'type' term search parameter
 * description:
 * Accepts what where and type paramters, performs the most basic of searches
 * Basic enough that onclick functions, and ninemsn.mylocal.search.handleSearchClick, can wire straight into it.
 */
ninemsn.mylocal.search.getBusinessListings = function(what, where, type)
{
    /*  Static defaults for fresh searches  */
    var page    = "1";
    var servicing   = "true";
    var surrounding = "true";
    
    /*
     *  Initialise omniture
     */
    ninemsn.mylocal.omniture.initialise(ninemsn.mylocal.omniture.EVENTSEARCH);
    
    /*
     *  Post back with search results
     */
    ninemsn.mylocal.search.initiate("Search.aspx", what, where, type, page, servicing, surrounding, null, null, null, null, null, null, null);
                    
    return false;
};

/*
 * bindFilters
 * @param {string} servicingID      : id of the current servicing the area check box
 * @param {string} surroundingID    : id of the current include surrounding suburbs in the check box
 * description:
 * Binds the current search filters to the event handles we require.
 * Store references to the handles so we can clean them up when the client leaves.
 */
ninemsn.mylocal.search.bindFilters = function(servicingID, surroundingID, relevanceID, nameID, distanceID)
{
    var elServicing = document.getElementById(servicingID);
    var elSurrounding = document.getElementById(surroundingID);
    var elRelevance = document.getElementById(relevanceID);
    var elName = document.getElementById(nameID);
    var elDistance = document.getElementById(distanceID);
    
    if (!elServicing || !elSurrounding || !elRelevance || !elName || !elDistance)
        return false;
    
    utl.attachEventCallback(elServicing,"onclick",ninemsn.mylocal.search.filterClick,elServicing,elServicing,elSurrounding,elRelevance,elName,elDistance);
    utl.attachEventCallback(elSurrounding,"onclick",ninemsn.mylocal.search.filterClick,elSurrounding,elServicing,elSurrounding,elRelevance,elName,elDistance);
    utl.attachEventCallback(elRelevance,"onclick",ninemsn.mylocal.search.filterClick,elRelevance,elServicing,elSurrounding,elRelevance,elName,elDistance);
    utl.attachEventCallback(elName,"onclick",ninemsn.mylocal.search.filterClick,elName,elServicing,elSurrounding,elRelevance,elName,elDistance);
    utl.attachEventCallback(elDistance,"onclick",ninemsn.mylocal.search.filterClick,elDistance,elServicing,elSurrounding,elRelevance,elName,elDistance);
    
    return false;
};

/*
 * filterClick
 * @param {element} elServicing      : current servicing the area check box
 * @param {element} elSurrounding    : current include surrounding suburbs in the check box
 * description:
 * Retrieves boolean checked values from the checkboxes, initiates a search
 */
ninemsn.mylocal.search.filterClick = function(me, elServicing, elSurrounding, elRelevance, elName, elDistance)
{
    try
    {
        /*
         *  Uncheck any of mutually exclusive filters
         */
        switch (me)
        {
            case elRelevance:
                elDistance.checked = false;
                elName.checked = false;
                break;
            case elName:
                elRelevance.checked = false;
                elDistance.checked = false;
                break;
            case elDistance:
                elName.checked = false;
                elRelevance.checked = false;
                break;
            default:
                break;
        }
        
        /*
         *  Get search values from 
         */
        var what    = utl.getQueryParam('what');
        var where   = utl.getQueryParam('where');
        var type    = utl.getQueryParam('type');
        var page    = "1";
        var servicing   = elServicing.checked;
        var surrounding = elSurrounding.checked;
        var relevance = elRelevance.checked;
        var name = elName.checked;
        var distance = elDistance.checked;
        var categoryName = utl.getQueryParam('category');
        var categoryID = utl.getQueryParam('categoryid');
        
        /*
         *  Set Omniture parameters
         */
        ninemsn.mylocal.omniture.customActionHandler(ninemsn.mylocal.omniture.COOKIEINDEXREFINE);
        
        /*
         *  Begin redirect
         */
        ninemsn.mylocal.search.initiate("Search.aspx", what, where, type, page, servicing, surrounding, relevance, name, distance, categoryName, categoryID);
    }
    catch (ex)
    {
        /*
         *  Write out excetions to debug panel
         */
        utl.debout("** EXCEPTION ** ninemsn.mylocal.search.filterClick : {0}".format(ex.description));
    }      
};

/*
 * navigateToPage
 * @param {string} page     : Number of the page to navigate to
 * description:
 * Set form fields and post the details to the server 
 */
ninemsn.mylocal.search.navigateToPage = function(target, page, companyID, tabIndex, categoryID, where)
{    
    try
    {
        /*
         *  param_what, param_where, param_type, param_page element id's, Injected into the page by asp.net (search.aspx.cs)
         *  Represent the values used in the last search, therefore are only available on the index page.
         *  Primarily used for pagination
         */        
        var what            = utl.getQueryParam('what');        
        var type            = utl.getQueryParam('type');
        var servicing       = utl.getQueryParam('servicing');
        var surrounding     = utl.getQueryParam('surrounding');
        var relevance       = utl.getQueryParam('relevance');
        var name            = utl.getQueryParam('name');
        var distance        = utl.getQueryParam('distance');
        var categoryName    = utl.getQueryParam('category');
        
        /*
         *  This Method is often used as an event handler (eg this.renderDataBoundList in ninemsn.mylocal.controls.js)
         *  Test if parameter is an object, if so ignore it as it is the element that fired the event
         *  not the parameter value we're looking for.
         */
        where       = utl.isObject(where) || utl.IsNullOrEmpty(where) ? utl.getQueryParam('where') : where;
        categoryID  = utl.isObject(categoryID) || utl.IsNullOrEmpty(categoryID) ? utl.getQueryParam('categoryid') : categoryID;
        page        = utl.isObject(page) || utl.IsNullOrEmpty(page) ? utl.getQueryParam('page') : page;
        companyID   = utl.isObject(companyID) || utl.IsNullOrEmpty(companyID) ? utl.getQueryParam('companyid') : companyID;
        tabIndex    = utl.isObject(tabIndex) || utl.IsNullOrEmpty(tabIndex) ? utl.getQueryParam('tabIndex') : tabIndex;      
        target      = target == 0 ? "Details.aspx" : target;
         
        ninemsn.mylocal.search.initiate(target, what, where, type, page, servicing, surrounding, relevance, name, distance, categoryName, categoryID, companyID, tabIndex);
    }
    catch (ex)
    {
        /*
         *  Write out excetions to debug panel
         */
         utl.debout("** EXCEPTION ** ninemsn.mylocal.search.navigateToPage : {0}".format(ex.description));
    }  
    return false; 
};

/*
 * navigateToPage
 * @param {string} page     : Number of the page to navigate to
 * description:
 * Set form fields and post the details to the server 
 */
ninemsn.mylocal.search.initiate = function(target, what, where, type, page, servicing, surrounding, relevance, name, distance, categoryName, categoryID, companyID, tabIndex)
{    
    try
    {
        var queryBuilder = [];
        
        /*
         *  Build our url to redirect to
         */
        queryBuilder.push(target + "?");  
        if (!utl.IsNullOrEmpty(companyID)) queryBuilder.push("&companyid={0}".format(companyID));      
        if (!utl.IsNullOrEmpty(tabIndex)) queryBuilder.push("&tab={0}".format(tabIndex));  
        if (!utl.IsNullOrEmpty(what)) queryBuilder.push("&what={0}".format(what));         
        if (!utl.IsNullOrEmpty(where)) queryBuilder.push("&where={0}".format(where));         
        if (!utl.IsNullOrEmpty(type)) queryBuilder.push("&type={0}".format(type));         
        if (!utl.IsNullOrEmpty(page)) queryBuilder.push("&page={0}".format(page));         
        if (!utl.IsNullOrEmpty(servicing)) queryBuilder.push("&servicing={0}".format(servicing));         
        if (!utl.IsNullOrEmpty(surrounding)) queryBuilder.push("&surrounding={0}".format(surrounding));         
        if (!utl.IsNullOrEmpty(relevance)) queryBuilder.push("&relevance={0}".format(relevance));         
        if (!utl.IsNullOrEmpty(name)) queryBuilder.push("&name={0}".format(name));         
        if (!utl.IsNullOrEmpty(distance)) queryBuilder.push("&distance={0}".format(distance));                                                 
        if (!utl.IsNullOrEmpty(categoryName)) queryBuilder.push("&category={0}".format(categoryName)); 
        if (!utl.IsNullOrEmpty(categoryID)) queryBuilder.push("&categoryid={0}".format(categoryID)); 
        
        var queryURL = queryBuilder.join('');
        window.location.href = queryURL;                
    }
    catch (ex)
    {
        /*
         *  Write out excetions to debug panel
         */
         utl.debout("** EXCEPTION ** ninemsn.mylocal.search.initiate : {0}".format(ex.description));
    }   
    return false;
};

/*
 * handleMouseOverListing
 * @param {string} shapeIndex   : Index of the VEShape object to display / hide
 * @param {string} hide         : 1 = hide the VEShape object requested
 * description:
 * display or hide the requsted VEShape element
 */
ninemsn.mylocal.search.handleMouseOverListing = function(shapeIndex, hide)
{
    try
    {
        if (hide)
        {
            g_shapeArray[shapeIndex].shape.Hide();
            g_shapeArray[shapeIndex].highlightedshape.Show();
        }
        else
        {
            g_shapeArray[shapeIndex].shape.Show();
            g_shapeArray[shapeIndex].highlightedshape.Hide();
        }
    }
    catch(ex)
    {
        /*
         *  Write out excetions to debug panel
         */
         utl.debout("** EXCEPTION ** ninemsn.mylocal.search.handleMouseOverListing : {0}".format(ex.description));
    }
    
    return false;
}